You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/khotkeys/kcontrol/condition_list_widget.cpp

396 lines
13 KiB

/****************************************************************************
KHotKeys
Copyright (C) 1999-2001 Lubos Lunak <l.lunak@kde.org>
Distributed under the terms of the GNU General Public License version 2.
****************************************************************************/
#define _CONDITIONS_LIST_WIDGET_CPP_
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "condition_list_widget.h"
#include <assert.h>
#include <tqpushbutton.h>
#include <tqheader.h>
#include <tqlineedit.h>
#include <tqpopupmenu.h>
#include <kdebug.h>
#include <klocale.h>
#include <kmessagebox.h>
#include <khlistview.h>
#include <conditions.h>
#include "windowdef_list_widget.h"
#include "kcmkhotkeys.h"
namespace KHotKeys
{
// Condition_list_widget
Condition_list_widget::Condition_list_widget( TQWidget* parent_P, const char* name_P )
: Condition_list_widget_ui( parent_P, name_P ), selected_item( NULL )
{
conditions.setAutoDelete( true );
TQPopupMenu* popup = new TQPopupMenu; // CHECKME looks like setting parent doesn't work
popup->insertItem( i18n( "Active Window..." ), TYPE_ACTIVE_WINDOW );
popup->insertItem( i18n( "Existing Window..." ), TYPE_EXISTING_WINDOW );
popup->insertItem( i18n( "Not_condition", "Not" ), TYPE_NOT );
popup->insertItem( i18n( "And_condition", "And" ), TYPE_AND );
popup->insertItem( i18n( "Or_condition", "Or" ), TYPE_OR );
connect( conditions_listview, TQT_SIGNAL( doubleClicked ( TQListViewItem *, const TQPoint &, int ) ),
this, TQT_SLOT( modify_pressed() ) );
connect( popup, TQT_SIGNAL( activated( int )), TQT_SLOT( new_selected( int )));
new_button->setPopup( popup );
conditions_listview->header()->hide();
conditions_listview->addColumn( "" );
conditions_listview->setSorting( -1 );
conditions_listview->setRootIsDecorated( true ); // CHECKME
conditions_listview->setForceSelect( true );
copy_button->setEnabled( false );
modify_button->setEnabled( false );
delete_button->setEnabled( false );
clear_data();
// KHotKeys::Module::changed()
connect( new_button, TQT_SIGNAL( clicked()),
module, TQT_SLOT( changed()));
connect( copy_button, TQT_SIGNAL( clicked()),
module, TQT_SLOT( changed()));
connect( modify_button, TQT_SIGNAL( clicked()),
module, TQT_SLOT( changed()));
connect( delete_button, TQT_SIGNAL( clicked()),
module, TQT_SLOT( changed()));
connect( comment_lineedit, TQT_SIGNAL( textChanged( const TQString& )),
module, TQT_SLOT( changed()));
}
Condition_list_widget::~Condition_list_widget()
{
delete new_button->popup();
}
void Condition_list_widget::clear_data()
{
comment_lineedit->clear();
conditions.clear();
conditions_listview->clear();
}
void Condition_list_widget::set_data( const Condition_list* data_P )
{
if( data_P == NULL )
{
clear_data();
return;
}
comment_lineedit->setText( data_P->comment());
conditions.clear();
conditions_listview->clear();
insert_listview_items( data_P, conditions_listview, NULL );
#ifdef KHOTKEYS_DEBUG
kdDebug( 1217 ) << "Condition_list_widget::set_data():" << endl;
Condition::debug_list( conditions );
#endif
}
void Condition_list_widget::insert_listview_items( const Condition_list_base* parent_P,
TQListView* parent1_P, Condition_list_item* parent2_P )
{
Condition_list_item* prev = NULL;
for( Condition_list_base::Iterator it( *parent_P );
*it;
++it )
{
prev = create_listview_item( *it, parent1_P, parent2_P, prev, true );
if( Condition_list_base* group = dynamic_cast< Condition_list_base* >( *it ))
insert_listview_items( group, NULL, prev );
}
}
Condition_list* Condition_list_widget::get_data( Action_data_base* data_P ) const
{
#ifdef KHOTKEYS_DEBUG
kdDebug( 1217 ) << "Condition_list_widget::get_data():" << endl;
Condition::debug_list( conditions );
#endif
// CHECKME TODO hmm, tady to bude chtit asi i children :(
Condition_list* list = new Condition_list( comment_lineedit->text(), data_P );
get_listview_items( list, conditions_listview->firstChild());
return list;
}
void Condition_list_widget::get_listview_items( Condition_list_base* list_P,
TQListViewItem* first_item_P ) const
{
list_P->clear();
for( TQListViewItem* pos = first_item_P;
pos != NULL;
pos = pos->nextSibling())
{
Condition* cond = static_cast< Condition_list_item* >( pos )->condition()->copy( list_P );
if( Condition_list_base* group = dynamic_cast< Condition_list_base* >( cond ))
get_listview_items( group, pos->firstChild());
}
}
void Condition_list_widget::new_selected( int type_P )
{
Condition_list_item* parent = NULL;
Condition_list_item* after = NULL;
if( selected_item && selected_item->condition())
{
Condition_list_base* tmp = dynamic_cast< Condition_list_base* >
( selected_item->condition());
if( tmp && tmp->accepts_children())
{
int ret = KMessageBox::questionYesNoCancel( NULL,
i18n( "A group is selected.\nAdd the new condition in this selected group?" ), TQString::null, i18n("Add in Group"), i18n("Ignore Group"));
if( ret == KMessageBox::Cancel )
return;
else if( ret == KMessageBox::Yes )
parent = selected_item;
else
parent = NULL;
}
}
if( parent == NULL && selected_item != NULL && selected_item->parent() != NULL )
{
parent = static_cast< Condition_list_item* >( selected_item->parent());
after = selected_item;
}
Condition_list_base* parent_cond = parent
? static_cast< Condition_list_base* >( parent->condition()) : NULL;
assert( !parent || dynamic_cast< Condition_list_base* >( parent->condition()));
Condition_dialog* dlg = NULL;
Condition* condition = NULL;
switch( type_P )
{
case TYPE_ACTIVE_WINDOW: // Active_window_condition
dlg = new Active_window_condition_dialog(
new Active_window_condition( new Windowdef_list( "" ), parent_cond )); // CHECKME NULL
break;
case TYPE_EXISTING_WINDOW: // Existing_window_condition
dlg = new Existing_window_condition_dialog(
new Existing_window_condition( new Windowdef_list( "" ), parent_cond )); // CHECKME NULL
break;
case TYPE_NOT: // Not_condition
condition = new Not_condition( parent_cond );
break;
case TYPE_AND: // And_condition
condition = new And_condition( parent_cond );
break;
case TYPE_OR: // Or_condition
condition = new Or_condition( parent_cond );
break;
}
if( dlg != NULL )
{
condition = dlg->edit_condition();
delete dlg;
}
if( condition != NULL )
{
if( parent != NULL )
conditions_listview->setSelected( create_listview_item( condition,
NULL, parent, after, false ), true );
else
conditions_listview->setSelected( create_listview_item( condition,
conditions_listview, NULL, selected_item, false ), true );
}
}
void Condition_list_widget::copy_pressed()
{
if ( !selected_item )
return;
conditions_listview->setSelected( create_listview_item(
selected_item->condition()->copy( selected_item->condition()->parent()),
selected_item->parent() ? NULL : conditions_listview,
static_cast< Condition_list_item* >( selected_item->parent()),
selected_item, true ), true );
}
void Condition_list_widget::delete_pressed()
{
if ( selected_item )
{
conditions.remove( selected_item->condition()); // we own it
delete selected_item; // CHECKME snad vyvola signaly pro enable()
selected_item = NULL;
}
}
void Condition_list_widget::modify_pressed()
{
if ( !selected_item )
return;
edit_listview_item( selected_item );
}
void Condition_list_widget::current_changed( TQListViewItem* item_P )
{
// if( item_P == selected_item )
// return;
selected_item = static_cast< Condition_list_item* >( item_P );
// conditions_listview->setSelected( selected_item, true );
copy_button->setEnabled( selected_item != NULL );
delete_button->setEnabled( selected_item != NULL );
if( selected_item != NULL )
{ // not,and,or can't be modified
if( dynamic_cast< Not_condition* >( selected_item->condition()) == NULL
&& dynamic_cast< And_condition* >( selected_item->condition()) == NULL
&& dynamic_cast< Or_condition* >( selected_item->condition()) == NULL )
{
modify_button->setEnabled( true );
}
else
modify_button->setEnabled( false );
}
else
modify_button->setEnabled( false );
}
Condition_list_item* Condition_list_widget::create_listview_item( Condition* condition_P,
TQListView* parent1_P, Condition_list_item* parent2_P, TQListViewItem* after_P, bool copy_P )
{
#ifdef KHOTKEYS_DEBUG
kdDebug( 1217 ) << "Condition_list_widget::create_listview_item():" << endl;
Condition::debug_list( conditions );
kdDebug( 1217 ) << kdBacktrace() << endl;
#endif
Condition* new_cond = copy_P ? condition_P->copy( parent2_P
? static_cast< Condition_list_base* >( parent2_P->condition()) : NULL ) : condition_P;
assert( !copy_P || !parent2_P || dynamic_cast< Condition_list_base* >( parent2_P->condition()));
// CHECKME uz by nemelo byt treba
/* if( after_P == NULL )
{
if( parent1_P == NULL )
return new Condition_list_item( parent2_P, new_win );
else
return new Condition_list_item( parent1_P, new_win );
}
else*/
{
if( parent1_P == NULL )
{
parent2_P->setOpen( true );
if( new_cond->parent() == NULL ) // own only toplevels, they own the rest
conditions.append( new_cond ); // we own it, not the listview
return new Condition_list_item( parent2_P, after_P, new_cond );
}
else
{
if( new_cond->parent() == NULL )
conditions.append( new_cond ); // we own it, not the listview
return new Condition_list_item( parent1_P, after_P, new_cond );
}
}
}
void Condition_list_widget::edit_listview_item( Condition_list_item* item_P )
{
Condition_dialog* dlg = NULL;
if( Active_window_condition* condition
= dynamic_cast< Active_window_condition* >( item_P->condition()))
dlg = new Active_window_condition_dialog( condition );
else if( Existing_window_condition* condition
= dynamic_cast< Existing_window_condition* >( item_P->condition()))
dlg = new Existing_window_condition_dialog( condition );
else if( dynamic_cast< Not_condition* >( item_P->condition()) != NULL )
return;
else if( dynamic_cast< And_condition* >( item_P->condition()) != NULL )
return;
else if( dynamic_cast< Or_condition* >( item_P->condition()) != NULL )
return;
else // CHECKME TODO pridat dalsi
assert( false );
Condition* new_condition = dlg->edit_condition();
if( new_condition != NULL )
{
Condition* old_cond = item_P->condition();
item_P->set_condition( new_condition );
int pos = conditions.find( old_cond );
if( pos >= 0 )
{
conditions.remove( pos ); // we own it
conditions.insert( pos, new_condition );
}
item_P->widthChanged( 0 );
conditions_listview->repaintItem( item_P );
}
#ifdef KHOTKEYS_DEBUG
kdDebug( 1217 ) << "Condition_list_widget::edit_listview_item():" << endl;
Condition::debug_list( conditions );
#endif
delete dlg;
}
// Condition_list_item
TQString Condition_list_item::text( int column_P ) const
{
return column_P == 0 ? condition()->description() : TQString::null;
}
// Active_window_condition_dialog
Active_window_condition_dialog::Active_window_condition_dialog(
Active_window_condition* condition_P )
: KDialogBase( NULL, NULL, true, i18n( "Window Details" ), Ok | Cancel ), condition( NULL )
{
widget = new Windowdef_list_widget( this );
widget->set_data( condition_P->window());
setMainWidget( widget );
}
Condition* Active_window_condition_dialog::edit_condition()
{
exec();
return condition;
}
void Active_window_condition_dialog::accept()
{
KDialogBase::accept();
condition = new Active_window_condition( widget->get_data(), NULL ); // CHECKME NULL ?
}
// Existing_window_condition_dialog
Existing_window_condition_dialog::Existing_window_condition_dialog(
Existing_window_condition* condition_P )
: KDialogBase( NULL, NULL, true, i18n( "Window Details" ), Ok | Cancel ), condition( NULL )
{
widget = new Windowdef_list_widget( this );
widget->set_data( condition_P->window());
setMainWidget( widget );
}
Condition* Existing_window_condition_dialog::edit_condition()
{
exec();
return condition;
}
void Existing_window_condition_dialog::accept()
{
KDialogBase::accept();
condition = new Existing_window_condition( widget->get_data(), NULL ); // CHECKME NULL ?
}
} // namespace KHotKeys
#include "condition_list_widget.moc"