1 /****************************************************************************
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"
18 #include <QPushButton>
19 #include <Qt3Support/Q3Header>
25 #include <kmessagebox.h>
27 #include <khlistview.h>
29 #include <conditions.h>
31 #include "windowdef_list_widget.h"
33 #include "kcmkhotkeys.h"
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 );
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();
96 conditions_listview
->clear();
99 void Condition_list_widget::set_data( const Condition_list
* data_P
)
106 comment_lineedit
->setText( data_P
->comment());
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
);
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
);
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
);
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());
142 void Condition_list_widget::get_listview_items( Condition_list_base
* list_P
,
143 Q3ListViewItem
* first_item_P
) const
146 for( Q3ListViewItem
* pos
= first_item_P
;
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
)
170 else if( ret
== KMessageBox::Yes
)
171 parent
= selected_item
;
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();
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
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
198 case TYPE_NOT
: // Not_condition
199 condition
= new Not_condition( parent_cond
);
201 case TYPE_AND
: // And_condition
202 condition
= new And_condition( parent_cond
);
204 case TYPE_OR
: // Or_condition
205 condition
= new Or_condition( parent_cond
);
210 condition
= dlg
->edit_condition();
213 if( condition
!= NULL
)
216 conditions_listview
->setSelected( create_listview_item( condition
,
217 NULL
, parent
, after
, false ), true );
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 )
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 );
261 modify_button
->setEnabled( false );
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();
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 );
284 return new Condition_list_item( parent1_P, new_win );
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
);
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
)
315 else if( dynamic_cast< And_condition
* >( item_P
->condition()) != NULL
)
317 else if( dynamic_cast< Or_condition
* >( item_P
->condition()) != NULL
)
319 else // CHECKME TODO pridat dalsi
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
);
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
);
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
)
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()
369 void Active_window_condition_dialog::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
)
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()
395 void Existing_window_condition_dialog::accept()
398 condition
= new Existing_window_condition( widget
->get_data(), NULL
); // CHECKME NULL ?
401 } // namespace KHotKeys
403 #include "condition_list_widget.moc"