Make a branch to make krunner Good Enough For Aaron™.
[kdebase/uwolfer.git] / workspace / khotkeys / kcontrol / condition_list_widget.cpp
blob2f1534fa651fb4a8a543daa34b08243b7b642573
1 /****************************************************************************
3 KHotKeys
5 Copyright (C) 1999-2001 Lubos Lunak <l.lunak@kde.org>
7 Distributed under the terms of the GNU General Public License version 2.
9 ****************************************************************************/
11 #define _CONDITIONS_LIST_WIDGET_CPP_
15 #include "condition_list_widget.h"
17 #include <assert.h>
18 #include <QPushButton>
19 #include <Qt3Support/Q3Header>
20 #include <QLineEdit>
21 #include <QMenu>
23 #include <kdebug.h>
24 #include <klocale.h>
25 #include <kmessagebox.h>
27 #include <khlistview.h>
29 #include <conditions.h>
31 #include "windowdef_list_widget.h"
33 #include "kcmkhotkeys.h"
35 namespace KHotKeys
38 // Condition_list_widget
40 Condition_list_widget::Condition_list_widget( QWidget* parent_P, const char* name_P )
41 : Condition_list_widget_ui( parent_P ), selected_item( NULL )
43 setObjectName(name_P);
44 conditions.setAutoDelete( true );
45 QMenu* popup = new QMenu; // CHECKME looks like setting parent doesn't work
46 QAction *action = popup->addAction( i18n( "Active Window..." ) );
47 action->setData( TYPE_ACTIVE_WINDOW );
48 action = popup->addAction( i18n( "Existing Window..." ) );
49 action->setData( TYPE_EXISTING_WINDOW );
50 action = popup->addAction( i18nc( "Not_condition", "Not" ) );
51 action->setData( TYPE_NOT );
52 action = popup->addAction( i18nc( "And_condition", "And" ) );
53 action->setData( TYPE_AND );
54 action = popup->addAction( i18nc( "Or_condition", "Or" ) );
55 action->setData( TYPE_OR );
56 connect( conditions_listview, SIGNAL( doubleClicked ( Q3ListViewItem *, const QPoint &, int ) ),
57 this, SLOT( modify_pressed() ) );
58 connect(copy_button,SIGNAL(clicked()), this,SLOT(copy_pressed()));
59 connect(modify_button,SIGNAL(clicked()), this,SLOT(modify_pressed()));
60 connect(delete_button,SIGNAL(clicked()), this,SLOT(delete_pressed()));
61 connect(conditions_listview,SIGNAL(current_changed(Q3ListViewItem*)),this,SLOT(current_changed(Q3ListViewItem*)));
63 connect( popup, SIGNAL( triggered( QAction* )), SLOT( new_selected( QAction* )));
64 new_button->setMenu( popup );
65 conditions_listview->header()->hide();
66 conditions_listview->addColumn( "" );
67 conditions_listview->setSorting( -1 );
68 conditions_listview->setRootIsDecorated( true ); // CHECKME
69 conditions_listview->setForceSelect( true );
70 copy_button->setEnabled( false );
71 modify_button->setEnabled( false );
72 delete_button->setEnabled( false );
73 clear_data();
74 // KHotKeys::Module::changed()
75 connect( new_button, SIGNAL( clicked()),
76 module, SLOT( changed()));
77 connect( copy_button, SIGNAL( clicked()),
78 module, SLOT( changed()));
79 connect( modify_button, SIGNAL( clicked()),
80 module, SLOT( changed()));
81 connect( delete_button, SIGNAL( clicked()),
82 module, SLOT( changed()));
83 connect( comment_lineedit, SIGNAL( textChanged( const QString& )),
84 module, SLOT( changed()));
87 Condition_list_widget::~Condition_list_widget()
89 delete new_button->menu();
92 void Condition_list_widget::clear_data()
94 comment_lineedit->clear();
95 conditions.clear();
96 conditions_listview->clear();
99 void Condition_list_widget::set_data( const Condition_list* data_P )
101 if( data_P == NULL )
103 clear_data();
104 return;
106 comment_lineedit->setText( data_P->comment());
107 conditions.clear();
108 conditions_listview->clear();
109 insert_listview_items( data_P, conditions_listview, NULL );
110 #ifdef KHOTKEYS_DEBUG
111 kDebug( 1217 ) << "Condition_list_widget::set_data():";
112 Condition::debug_list( conditions );
113 #endif
116 void Condition_list_widget::insert_listview_items( const Condition_list_base* parent_P,
117 Q3ListView* parent1_P, Condition_list_item* parent2_P )
119 Condition_list_item* prev = NULL;
120 for( Condition_list_base::Iterator it( *parent_P );
121 *it;
122 ++it )
124 prev = create_listview_item( *it, parent1_P, parent2_P, prev, true );
125 if( Condition_list_base* group = dynamic_cast< Condition_list_base* >( *it ))
126 insert_listview_items( group, NULL, prev );
130 Condition_list* Condition_list_widget::get_data( Action_data_base* data_P ) const
132 #ifdef KHOTKEYS_DEBUG
133 kDebug( 1217 ) << "Condition_list_widget::get_data():";
134 Condition::debug_list( conditions );
135 #endif
136 // CHECKME TODO hmm, tady to bude chtit asi i children :(
137 Condition_list* list = new Condition_list( comment_lineedit->text(), data_P );
138 get_listview_items( list, conditions_listview->firstChild());
139 return list;
142 void Condition_list_widget::get_listview_items( Condition_list_base* list_P,
143 Q3ListViewItem* first_item_P ) const
145 list_P->clear();
146 for( Q3ListViewItem* pos = first_item_P;
147 pos != NULL;
148 pos = pos->nextSibling())
150 Condition* cond = static_cast< Condition_list_item* >( pos )->condition()->copy( list_P );
151 if( Condition_list_base* group = dynamic_cast< Condition_list_base* >( cond ))
152 get_listview_items( group, pos->firstChild());
156 void Condition_list_widget::new_selected( QAction *action )
158 Condition_list_item* parent = NULL;
159 Condition_list_item* after = NULL;
160 if( selected_item && selected_item->condition())
162 Condition_list_base* tmp = dynamic_cast< Condition_list_base* >
163 ( selected_item->condition());
164 if( tmp && tmp->accepts_children())
166 int ret = KMessageBox::questionYesNoCancel( NULL,
167 i18n( "A group is selected.\nAdd the new condition in this selected group?" ), QString(), KGuiItem(i18n("Add in Group")), KGuiItem(i18n("Ignore Group")));
168 if( ret == KMessageBox::Cancel )
169 return;
170 else if( ret == KMessageBox::Yes )
171 parent = selected_item;
172 else
173 parent = NULL;
176 if( parent == NULL && selected_item != NULL && selected_item->parent() != NULL )
178 parent = static_cast< Condition_list_item* >( selected_item->parent());
179 after = selected_item;
181 Condition_list_base* parent_cond = parent
182 ? static_cast< Condition_list_base* >( parent->condition()) : NULL;
183 assert( !parent || dynamic_cast< Condition_list_base* >( parent->condition()));
184 Condition_dialog* dlg = NULL;
185 Condition* condition = NULL;
187 int type_P = action->data().toInt();
188 switch( type_P )
190 case TYPE_ACTIVE_WINDOW: // Active_window_condition
191 dlg = new Active_window_condition_dialog(
192 new Active_window_condition( new Windowdef_list( "" ), parent_cond )); // CHECKME NULL
193 break;
194 case TYPE_EXISTING_WINDOW: // Existing_window_condition
195 dlg = new Existing_window_condition_dialog(
196 new Existing_window_condition( new Windowdef_list( "" ), parent_cond )); // CHECKME NULL
197 break;
198 case TYPE_NOT: // Not_condition
199 condition = new Not_condition( parent_cond );
200 break;
201 case TYPE_AND: // And_condition
202 condition = new And_condition( parent_cond );
203 break;
204 case TYPE_OR: // Or_condition
205 condition = new Or_condition( parent_cond );
206 break;
208 if( dlg != NULL )
210 condition = dlg->edit_condition();
211 delete dlg;
213 if( condition != NULL )
215 if( parent != NULL )
216 conditions_listview->setSelected( create_listview_item( condition,
217 NULL, parent, after, false ), true );
218 else
219 conditions_listview->setSelected( create_listview_item( condition,
220 conditions_listview, NULL, selected_item, false ), true );
224 void Condition_list_widget::copy_pressed()
226 conditions_listview->setSelected( create_listview_item(
227 selected_item->condition()->copy( selected_item->condition()->parent()),
228 selected_item->parent() ? NULL : conditions_listview,
229 static_cast< Condition_list_item* >( selected_item->parent()),
230 selected_item, true ), true );
233 void Condition_list_widget::delete_pressed()
235 conditions.remove( selected_item->condition()); // we own it
236 delete selected_item; // CHECKME snad vyvola signaly pro enable()
239 void Condition_list_widget::modify_pressed()
241 edit_listview_item( selected_item );
244 void Condition_list_widget::current_changed( Q3ListViewItem* item_P )
246 // if( item_P == selected_item )
247 // return;
248 selected_item = static_cast< Condition_list_item* >( item_P );
249 // conditions_listview->setSelected( selected_item, true );
250 copy_button->setEnabled( selected_item != NULL );
251 delete_button->setEnabled( selected_item != NULL );
252 if( selected_item != NULL )
253 { // not,and,or can't be modified
254 if( dynamic_cast< Not_condition* >( selected_item->condition()) == NULL
255 && dynamic_cast< And_condition* >( selected_item->condition()) == NULL
256 && dynamic_cast< Or_condition* >( selected_item->condition()) == NULL )
258 modify_button->setEnabled( true );
260 else
261 modify_button->setEnabled( false );
263 else
264 modify_button->setEnabled( false );
267 Condition_list_item* Condition_list_widget::create_listview_item( Condition* condition_P,
268 Q3ListView* parent1_P, Condition_list_item* parent2_P, Q3ListViewItem* after_P, bool copy_P )
270 #ifdef KHOTKEYS_DEBUG
271 kDebug( 1217 ) << "Condition_list_widget::create_listview_item():";
272 Condition::debug_list( conditions );
273 kDebug( 1217 ) << kBacktrace();
274 #endif
275 Condition* new_cond = copy_P ? condition_P->copy( parent2_P
276 ? static_cast< Condition_list_base* >( parent2_P->condition()) : NULL ) : condition_P;
277 assert( !copy_P || !parent2_P || dynamic_cast< Condition_list_base* >( parent2_P->condition()));
278 // CHECKME uz by nemelo byt treba
279 /* if( after_P == NULL )
281 if( parent1_P == NULL )
282 return new Condition_list_item( parent2_P, new_win );
283 else
284 return new Condition_list_item( parent1_P, new_win );
286 else*/
288 if( parent1_P == NULL )
290 parent2_P->setOpen( true );
291 if( new_cond->parent() == NULL ) // own only toplevels, they own the rest
292 conditions.append( new_cond ); // we own it, not the listview
293 return new Condition_list_item( parent2_P, after_P, new_cond );
295 else
297 if( new_cond->parent() == NULL )
298 conditions.append( new_cond ); // we own it, not the listview
299 return new Condition_list_item( parent1_P, after_P, new_cond );
304 void Condition_list_widget::edit_listview_item( Condition_list_item* item_P )
306 Condition_dialog* dlg = NULL;
307 if( Active_window_condition* condition
308 = dynamic_cast< Active_window_condition* >( item_P->condition()))
309 dlg = new Active_window_condition_dialog( condition );
310 else if( Existing_window_condition* condition
311 = dynamic_cast< Existing_window_condition* >( item_P->condition()))
312 dlg = new Existing_window_condition_dialog( condition );
313 else if( dynamic_cast< Not_condition* >( item_P->condition()) != NULL )
314 return;
315 else if( dynamic_cast< And_condition* >( item_P->condition()) != NULL )
316 return;
317 else if( dynamic_cast< Or_condition* >( item_P->condition()) != NULL )
318 return;
319 else // CHECKME TODO pridat dalsi
320 assert( false );
321 Condition* new_condition = dlg->edit_condition();
322 if( new_condition != NULL )
324 Condition* old_cond = item_P->condition();
325 item_P->set_condition( new_condition );
326 int pos = conditions.find( old_cond );
327 if( pos >= 0 )
329 conditions.remove( pos ); // we own it
330 conditions.insert( pos, new_condition );
332 item_P->widthChanged( 0 );
333 conditions_listview->repaintItem( item_P );
335 #ifdef KHOTKEYS_DEBUG
336 kDebug( 1217 ) << "Condition_list_widget::edit_listview_item():";
337 Condition::debug_list( conditions );
338 #endif
339 delete dlg;
342 // Condition_list_item
344 QString Condition_list_item::text( int column_P ) const
346 return column_P == 0 ? condition()->description() : QString();
349 // Active_window_condition_dialog
351 Active_window_condition_dialog::Active_window_condition_dialog(
352 Active_window_condition* condition_P )
353 : KDialog( 0 ), condition( NULL )
355 setModal( true );
356 setCaption( i18n( "Window Details" ) );
357 setButtons( Ok | Cancel );
358 widget = new Windowdef_list_widget( this );
359 widget->set_data( condition_P->window());
360 setMainWidget( widget );
363 Condition* Active_window_condition_dialog::edit_condition()
365 exec();
366 return condition;
369 void Active_window_condition_dialog::accept()
371 KDialog::accept();
372 condition = new Active_window_condition( widget->get_data(), NULL ); // CHECKME NULL ?
375 // Existing_window_condition_dialog
377 Existing_window_condition_dialog::Existing_window_condition_dialog(
378 Existing_window_condition* condition_P )
379 : KDialog( 0 ), condition( NULL )
381 setModal( true );
382 setCaption( i18n( "Window Details" ) );
383 setButtons( Ok | Cancel );
384 widget = new Windowdef_list_widget( this );
385 widget->set_data( condition_P->window());
386 setMainWidget( widget );
389 Condition* Existing_window_condition_dialog::edit_condition()
391 exec();
392 return condition;
395 void Existing_window_condition_dialog::accept()
397 KDialog::accept();
398 condition = new Existing_window_condition( widget->get_data(), NULL ); // CHECKME NULL ?
401 } // namespace KHotKeys
403 #include "condition_list_widget.moc"