/**************************************************************************** KHotKeys Copyright (C) 1999-2001 Lubos Lunak Distributed under the terms of the GNU General Public License version 2. ****************************************************************************/ #define _TAB_WIDGET_CPP_ #ifdef HAVE_CONFIG_H #include #endif #include "tab_widget.h" #include #include #include #include #include #include "general_tab.h" #include "action_group_tab.h" #include "windowdef_list_widget.h" #include "menuentry_widget.h" #include "command_url_widget.h" #include "dcop_widget.h" #include "triggers_tab.h" #include "info_tab.h" #include "action_list_widget.h" #include "keyboard_input_widget.h" #include "kcmkhotkeys.h" #include "condition_list_widget.h" #include "gesture_triggers_tab.h" #include "gestures_settings_tab.h" #include "general_settings_tab.h" #include "voice_settings_tab.h" // CHECKME //nejak lip ty typeid //asi spis udelat funkci, ktera vrati enum a pak tam mit switche, tak se zajisti, ze se nikde //nezapomene // CHECKME mozna nejak lepe to poradi tabu, takhle je to podle jejich poradi v enum namespace KHotKeys { Tab_widget::Tab_widget( TQWidget* parent_P, const char* name_P ) : TQTabWidget( parent_P, name_P ) { pages[ TAB_INFO ] = new Info_tab; pages[ TAB_GENERAL_SETTINGS ] = new General_settings_tab; pages[ TAB_GESTURES_SETTINGS ] = new Gestures_settings_tab; General_tab* general_tab; pages[ TAB_GENERAL ] = general_tab = new General_tab; connect( general_tab, TQT_SIGNAL( action_type_changed( int )), TQT_SLOT( set_action_type_slot( int ))); pages[ TAB_GROUP_GENERAL ] = new Action_group_tab; pages[ TAB_CONDITIONS ] = new Condition_list_tab; pages[ TAB_ACTIONS ] = new Action_list_tab; pages[ TAB_TRIGGERS ] = new Triggers_tab; pages[ TAB_SHORTCUT_TRIGGER ] = new Shortcut_trigger_tab; pages[ TAB_GESTURE_TRIGGER ] = new Gesture_triggers_tab; pages[ TAB_COMMAND_URL ] = new Command_url_tab; pages[ TAB_MENUENTRY ] = new Menuentry_tab; pages[ TAB_DCOP ] = new Dcop_tab; pages[ TAB_KEYBOARD_INPUT ] = new Keyboard_input_tab; pages[ TAB_WINDOW ] = new Windowdef_list_tab; pages[ TAB_VOICE_SETTINGS ] = new Voice_settings_tab; for( tab_pos_t i = TAB_FIRST; i < TAB_END; ++i ) connect( this, TQT_SIGNAL( clear_pages_signal()), pages[ i ], TQT_SLOT( clear_data())); #ifdef HAVE_ARTS if( haveArts()) show_pages(( TAB_INFO, TAB_GENERAL_SETTINGS, TAB_GESTURES_SETTINGS, TAB_VOICE_SETTINGS )); else #endif show_pages(( TAB_INFO, TAB_GENERAL_SETTINGS, TAB_GESTURES_SETTINGS )); current_type = NONE; current_data_type = TYPE_GENERIC; } Tab_widget::~Tab_widget() { for( tab_pos_t i = TAB_FIRST; i < TAB_END; ++i ) { removePage( pages[ i ] ); delete pages[ i ]; } } void Tab_widget::save_current_action_changes() { if( current_type == NONE ) // info, global settings { static_cast< Gestures_settings_tab* >( pages[ TAB_GESTURES_SETTINGS ] )->write_data(); // saves static_cast< General_settings_tab* >( pages[ TAB_GENERAL_SETTINGS ] )->write_data(); // saves static_cast< Voice_settings_tab* >( pages[ TAB_VOICE_SETTINGS ] )->write_data(); // saves } else if( current_type == GROUP ) { Action_data_group* old = static_cast< Action_data_group* >( module->current_action_data()); Action_data_group* item = static_cast< Action_group_tab* >( pages[ TAB_GROUP_GENERAL ] )->get_data( module->current_action_data()->parent(), NULL ); item->set_conditions( static_cast< Condition_list_tab* >( pages[ TAB_CONDITIONS ] ) ->get_data( item )); for( Action_data_group::Iterator it = old->first_child(); it; ) { Action_data_base* tmp = ( *it ); ++it; // the items will be removed from the list, so better be carefull tmp->reparent( item ); } module->set_current_action_data( item ); } else if( current_type == DATA ) { TQString name, comment; bool enabled; static_cast< General_tab* >( pages[ TAB_GENERAL ] )->get_data( name, comment, enabled ); switch( current_data_type ) { case TYPE_GENERIC: { Generic_action_data* tmp = new Generic_action_data( module->current_action_data()->parent(), name, comment, NULL, NULL, NULL, enabled ); tmp->set_triggers( static_cast< Triggers_tab* >( pages[ TAB_TRIGGERS ] )->get_data( tmp )); tmp->set_conditions( static_cast< Condition_list_tab* > ( pages[ TAB_CONDITIONS ] )->get_data( tmp )); tmp->set_actions( static_cast< Action_list_tab* >( pages[ TAB_ACTIONS ] )->get_data( tmp )); module->set_current_action_data( tmp ); break; } case TYPE_COMMAND_URL_SHORTCUT: { Command_url_shortcut_action_data* tmp = new Command_url_shortcut_action_data( module->current_action_data()->parent(), name, comment, enabled ); tmp->set_trigger( static_cast< Shortcut_trigger_tab* >( pages[ TAB_SHORTCUT_TRIGGER ] ) ->get_data( tmp )); tmp->set_action( static_cast< Command_url_tab* >( pages[ TAB_COMMAND_URL ] )->get_data( tmp )); module->set_current_action_data( tmp ); break; } case TYPE_MENUENTRY_SHORTCUT: { Menuentry_shortcut_action_data* tmp = new Menuentry_shortcut_action_data( module->current_action_data()->parent(), name, comment, enabled ); tmp->set_trigger( static_cast< Shortcut_trigger_tab* >( pages[ TAB_SHORTCUT_TRIGGER ] ) ->get_data( tmp )); tmp->set_action( static_cast< Menuentry_tab* >( pages[ TAB_MENUENTRY ] )->get_data( tmp )); module->set_current_action_data( tmp ); break; } case TYPE_DCOP_SHORTCUT: { Dcop_shortcut_action_data* tmp = new Dcop_shortcut_action_data( module->current_action_data()->parent(), name, comment, enabled ); tmp->set_trigger( static_cast< Shortcut_trigger_tab* >( pages[ TAB_SHORTCUT_TRIGGER ] ) ->get_data( tmp )); tmp->set_action( static_cast< Dcop_tab* >( pages[ TAB_DCOP ] )->get_data( tmp )); module->set_current_action_data( tmp ); break; } case TYPE_KEYBOARD_INPUT_SHORTCUT: { Keyboard_input_shortcut_action_data* tmp = new Keyboard_input_shortcut_action_data( module->current_action_data()->parent(), name, comment, enabled ); tmp->set_trigger( static_cast< Shortcut_trigger_tab* >( pages[ TAB_SHORTCUT_TRIGGER ] ) ->get_data( tmp )); tmp->set_action( static_cast< Keyboard_input_tab* > ( pages[ TAB_KEYBOARD_INPUT ] )->get_data( tmp )); module->set_current_action_data( tmp ); break; } case TYPE_KEYBOARD_INPUT_GESTURE: { Keyboard_input_gesture_action_data* tmp = new Keyboard_input_gesture_action_data( module->current_action_data()->parent(), name, comment, enabled ); tmp->set_triggers( static_cast< Gesture_triggers_tab* >( pages[ TAB_GESTURE_TRIGGER ] ) ->get_data( tmp )); tmp->set_action( static_cast< Keyboard_input_tab* > ( pages[ TAB_KEYBOARD_INPUT ] )->get_data( tmp )); module->set_current_action_data( tmp ); break; } case TYPE_ACTIVATE_WINDOW_SHORTCUT: { Activate_window_shortcut_action_data* tmp = new Activate_window_shortcut_action_data( module->current_action_data()->parent(), name, comment, enabled ); tmp->set_trigger( static_cast< Shortcut_trigger_tab* >( pages[ TAB_SHORTCUT_TRIGGER ] ) ->get_data( tmp )); tmp->set_action( new Activate_window_action( tmp, static_cast< Windowdef_list_tab* > ( pages[ TAB_WINDOW ] )->get_data())); module->set_current_action_data( tmp ); break; } case TYPE_END: assert( false ); } } } void Tab_widget::load_current_action() { check_action_type(); if( current_type == NONE ) // info, global settings { static_cast< Gestures_settings_tab* >( pages[ TAB_GESTURES_SETTINGS ] )->read_data(); // loads static_cast< Voice_settings_tab* >( pages[ TAB_VOICE_SETTINGS ] )->read_data(); // loads static_cast< General_settings_tab* >( pages[ TAB_GENERAL_SETTINGS ] )->read_data(); // loads } else if( current_type == GROUP ) { static_cast< Action_group_tab* >( pages[ TAB_GROUP_GENERAL ] )->set_data( static_cast< Action_data_group* >( module->current_action_data())); static_cast< Condition_list_tab* >( pages[ TAB_CONDITIONS ] ) ->set_data( module->current_action_data()->conditions()); } else if( current_type == DATA ) { Action_data* tmp = static_cast< Action_data* >( module->current_action_data()); switch( current_data_type ) { case TYPE_GENERIC: kdDebug( 1217 ) << "loading unknown" << endl; static_cast< General_tab* >( pages[ TAB_GENERAL ] )->set_data( tmp ); static_cast< Condition_list_tab* >( pages[ TAB_CONDITIONS ] ) ->set_data( tmp->conditions()); static_cast< Triggers_tab* >( pages[ TAB_TRIGGERS ] )->set_data( tmp->triggers()); static_cast< Action_list_tab* >( pages[ TAB_ACTIONS ] )->set_data( tmp->actions()); break; case TYPE_COMMAND_URL_SHORTCUT: { kdDebug( 1217 ) << "loading command_url_shortcut" << endl; Command_url_shortcut_action_data* item = static_cast< Command_url_shortcut_action_data* >( tmp ); static_cast< General_tab* >( pages[ TAB_GENERAL ] )->set_data( item ); static_cast< Shortcut_trigger_tab* >( pages[ TAB_SHORTCUT_TRIGGER ] ) ->set_data( item->trigger()); static_cast< Command_url_tab* >( pages[ TAB_COMMAND_URL ] )->set_data( item->action()); break; } case TYPE_MENUENTRY_SHORTCUT: { kdDebug( 1217 ) << "loading menuentry_shortcut" << endl; Menuentry_shortcut_action_data* item = static_cast< Menuentry_shortcut_action_data* >( tmp ); static_cast< General_tab* >( pages[ TAB_GENERAL ] )->set_data( item ); static_cast< Shortcut_trigger_tab* >( pages[ TAB_SHORTCUT_TRIGGER ] ) ->set_data( item->trigger()); static_cast< Menuentry_tab* >( pages[ TAB_MENUENTRY ] )->set_data( item->action()); break; } case TYPE_DCOP_SHORTCUT: { kdDebug( 1217 ) << "loading dcop_shortcut" << endl; Dcop_shortcut_action_data* item = static_cast< Dcop_shortcut_action_data* >( tmp ); static_cast< General_tab* >( pages[ TAB_GENERAL ] )->set_data( item ); static_cast< Shortcut_trigger_tab* >( pages[ TAB_SHORTCUT_TRIGGER ] ) ->set_data( item->trigger()); static_cast< Dcop_tab* >( pages[ TAB_DCOP ] )->set_data( item->action()); break; } case TYPE_KEYBOARD_INPUT_SHORTCUT: { kdDebug( 1217 ) << "loading keyboard_input_shortcut" << endl; Keyboard_input_shortcut_action_data* item = static_cast< Keyboard_input_shortcut_action_data* >( tmp ); static_cast< General_tab* >( pages[ TAB_GENERAL ] )->set_data( item ); static_cast< Shortcut_trigger_tab* >( pages[ TAB_SHORTCUT_TRIGGER ] ) ->set_data( item->trigger()); static_cast< Keyboard_input_tab* >( pages[ TAB_KEYBOARD_INPUT ] )->set_data( item->action()); break; } case TYPE_KEYBOARD_INPUT_GESTURE: { kdDebug( 1217 ) << "loading keyboard_input_gesture" << endl; Keyboard_input_gesture_action_data* item = static_cast< Keyboard_input_gesture_action_data* >( tmp ); static_cast< General_tab* >( pages[ TAB_GENERAL ] )->set_data( item ); static_cast< Gesture_triggers_tab* >( pages[ TAB_GESTURE_TRIGGER ] ) ->set_data( item->triggers()); static_cast< Keyboard_input_tab* >( pages[ TAB_KEYBOARD_INPUT ] )->set_data( item->action()); break; } case TYPE_ACTIVATE_WINDOW_SHORTCUT: { kdDebug( 1217 ) << "loading activate_window_shortcut" << endl; Activate_window_shortcut_action_data* item = static_cast< Activate_window_shortcut_action_data* >( tmp ); static_cast< General_tab* >( pages[ TAB_GENERAL ] )->set_data( item ); static_cast< Shortcut_trigger_tab* >( pages[ TAB_SHORTCUT_TRIGGER ] ) ->set_data( item->trigger()); static_cast< Windowdef_list_tab* >( pages[ TAB_WINDOW ] )->set_data( item->action()->window()); break; } case TYPE_END: assert( false ); } } } void Tab_widget::check_action_type() { if( module->current_action_data() == NULL ) { kdDebug( 1217 ) << "setting none" << endl; if( current_type == NONE ) return; #ifdef HAVE_ARTS if( haveArts()) show_pages(( TAB_INFO, TAB_GENERAL_SETTINGS, TAB_GESTURES_SETTINGS, TAB_VOICE_SETTINGS )); else #endif show_pages(( TAB_INFO, TAB_GENERAL_SETTINGS, TAB_GESTURES_SETTINGS )); current_type = NONE; return; } if( dynamic_cast< Action_data_group* >( module->current_action_data()) != NULL ) { // Action_data_group kdDebug( 1217 ) << "setting group" << endl; if( current_type == GROUP ) return; show_pages(( TAB_GROUP_GENERAL, TAB_CONDITIONS )); current_type = GROUP; return; } else // standard action { action_type_t is_type = type( static_cast< Action_data* >( module->current_action_data())); kdDebug( 1217 ) << "setting data " << is_type << endl; if( current_type == DATA && is_type == current_data_type ) return; current_type = DATA; set_action_type( is_type, true ); return; } } void Tab_widget::set_action_type( action_type_t type_P, bool force_P ) { assert( current_type == DATA ); if( current_data_type == type_P && !force_P ) return; current_data_type = type_P; switch( type_P ) { case TYPE_GENERIC: show_pages(( TAB_GENERAL, TAB_TRIGGERS, TAB_ACTIONS, TAB_CONDITIONS )); break; case TYPE_COMMAND_URL_SHORTCUT: show_pages(( TAB_GENERAL, TAB_SHORTCUT_TRIGGER, TAB_COMMAND_URL )); break; case TYPE_MENUENTRY_SHORTCUT: show_pages(( TAB_GENERAL, TAB_SHORTCUT_TRIGGER, TAB_MENUENTRY )); break; case TYPE_DCOP_SHORTCUT: show_pages(( TAB_GENERAL, TAB_SHORTCUT_TRIGGER, TAB_DCOP )); break; case TYPE_KEYBOARD_INPUT_SHORTCUT: show_pages(( TAB_GENERAL, TAB_SHORTCUT_TRIGGER, TAB_KEYBOARD_INPUT )); break; case TYPE_KEYBOARD_INPUT_GESTURE: show_pages(( TAB_GENERAL, TAB_GESTURE_TRIGGER, TAB_KEYBOARD_INPUT )); break; case TYPE_ACTIVATE_WINDOW_SHORTCUT: show_pages(( TAB_GENERAL, TAB_SHORTCUT_TRIGGER, TAB_WINDOW )); break; case TYPE_END: assert( false ); } } void Tab_widget::set_action_type_slot( int type_P ) { set_action_type( static_cast< action_type_t >( type_P )); } const char* const Tab_widget::tab_labels[ Tab_widget::TAB_END ] = { I18N_NOOP( "Info" ), // TAB_INFO I18N_NOOP( "General Settings" ), // TAB_GENERAL_SETTINGS I18N_NOOP( "Gestures Settings" ), // TAB_GESTURES_SETTINGS I18N_NOOP( "General" ), // TAB_GENERAL I18N_NOOP( "General" ), // TAB_GROUP_GENERAL I18N_NOOP( "Triggers" ), // TAB_TRIGGERS I18N_NOOP( "Keyboard Shortcut" ), // TAB_SHORTCUT_TRIGGER I18N_NOOP( "Gestures" ), // TAB_GESTURE_TRIGGER I18N_NOOP( "Actions" ), // TAB_ACTIONS I18N_NOOP( "Command/URL Settings" ), // TAB_COMMAND_URL I18N_NOOP( "Menu Entry Settings" ), // TAB_MENUENTRY I18N_NOOP( "DCOP Call Settings" ), // TAB_DCOP I18N_NOOP( "Keyboard Input Settings" ), // TAB_KEYBOARD_INPUT I18N_NOOP( "Window" ), // TAB_WINDOW I18N_NOOP( "Conditions" ), // TAB_CONDITIONS I18N_NOOP( "Voices Settings" ) // TAB_VOICE_SETTINGS }; void Tab_widget::show_pages( const Pages_set& pages_P ) { hide(); // this seems to be necessary, otherwise it's not tqrepainter properly for( tab_pos_t i = TAB_FIRST; i < TAB_END; ++i ) { removePage( pages[ i ] ); if( pages_P.is_set( i )) // don't clear page contents if it stays visible disconnect( this, TQT_SIGNAL( clear_pages_signal()), pages[ i ], TQT_SLOT( clear_data())); } clear_pages(); // reconnect all pages to this signal disconnect( this, TQT_SIGNAL( clear_pages_signal()), NULL, NULL ); for( tab_pos_t i = TAB_FIRST; i < TAB_END; ++i ) { if( pages_P.is_set( i )) addTab( pages[ i ], i18n( tab_labels[ i ] )); connect( this, TQT_SIGNAL( clear_pages_signal()), pages[ i ], TQT_SLOT( clear_data())); } show(); } Tab_widget::action_type_t Tab_widget::type( const Action_data* data_P ) { Tab_widget::action_type_t ret = Tab_widget::TYPE_GENERIC; if( typeid( *data_P ) == typeid( Generic_action_data )) ret = Tab_widget::TYPE_GENERIC; else if( typeid( *data_P ) == typeid( Command_url_shortcut_action_data )) ret = Tab_widget::TYPE_COMMAND_URL_SHORTCUT; else if( typeid( *data_P ) == typeid( Menuentry_shortcut_action_data )) ret = Tab_widget::TYPE_MENUENTRY_SHORTCUT; else if( typeid( *data_P ) == typeid( Dcop_shortcut_action_data )) ret = Tab_widget::TYPE_DCOP_SHORTCUT; else if( typeid( *data_P ) == typeid( Keyboard_input_shortcut_action_data )) ret = Tab_widget::TYPE_KEYBOARD_INPUT_SHORTCUT; else if( typeid( *data_P ) == typeid( Keyboard_input_gesture_action_data )) ret = Tab_widget::TYPE_KEYBOARD_INPUT_GESTURE; else if( typeid( *data_P ) == typeid( Activate_window_shortcut_action_data )) ret = Tab_widget::TYPE_ACTIVATE_WINDOW_SHORTCUT; else assert( false ); return ret; } } // namespace KHotKeys #include "tab_widget.moc"