summaryrefslogtreecommitdiffstats
path: root/khotkeys/shared/action_data.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'khotkeys/shared/action_data.cpp')
-rw-r--r--khotkeys/shared/action_data.cpp378
1 files changed, 378 insertions, 0 deletions
diff --git a/khotkeys/shared/action_data.cpp b/khotkeys/shared/action_data.cpp
new file mode 100644
index 000000000..96e3e5559
--- /dev/null
+++ b/khotkeys/shared/action_data.cpp
@@ -0,0 +1,378 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _ACTION_DATA_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "action_data.h"
+
+#include <kconfig.h>
+
+#include "actions.h"
+
+namespace KHotKeys
+{
+
+// Action_data_base
+
+Action_data_base::Action_data_base( Action_data_group* parent_P, const QString& name_P,
+ const QString& comment_P, Condition_list* conditions_P, bool enabled_P )
+ : _parent( parent_P ), _conditions( conditions_P ), _name( name_P ), _comment( comment_P ),
+ _enabled( enabled_P )
+ {
+ if( parent())
+ parent()->add_child( this );
+ if( _conditions != NULL )
+ _conditions->set_data( this );
+ }
+
+Action_data_base::Action_data_base( KConfig& cfg_P, Action_data_group* parent_P )
+ : _parent( parent_P )
+ {
+ QString save_cfg_group = cfg_P.group();
+ _name = cfg_P.readEntry( "Name" );
+ _comment = cfg_P.readEntry( "Comment" );
+ _enabled = cfg_P.readBoolEntry( "Enabled", true );
+ cfg_P.setGroup( save_cfg_group + "Conditions" );
+ _conditions = new Condition_list( cfg_P, this );
+ cfg_P.setGroup( save_cfg_group );
+ if( parent())
+ parent()->add_child( this );
+ }
+
+Action_data_base::~Action_data_base()
+ {
+// kdDebug( 1217 ) << "~Action_data_base() :" << this << endl;
+ if( parent())
+ parent()->remove_child( this );
+ delete _conditions;
+ }
+
+void Action_data_base::cfg_write( KConfig& cfg_P ) const
+ {
+ cfg_P.writeEntry( "Type", "ERROR" ); // derived classes should call with their type
+ cfg_P.writeEntry( "Name", name());
+ cfg_P.writeEntry( "Comment", comment());
+ cfg_P.writeEntry( "Enabled", enabled( true ));
+ QString save_cfg_group = cfg_P.group();
+ cfg_P.setGroup( save_cfg_group + "Conditions" );
+ assert( conditions() != NULL );
+ conditions()->cfg_write( cfg_P );
+ cfg_P.setGroup( save_cfg_group );
+ }
+
+
+Action_data_base* Action_data_base::create_cfg_read( KConfig& cfg_P, Action_data_group* parent_P )
+ {
+ QString type = cfg_P.readEntry( "Type" );
+ if( type == "ACTION_DATA_GROUP" )
+ {
+ if( cfg_P.readBoolEntry( "AllowMerge", false ))
+ {
+ for( Action_data_group::Iterator it = parent_P->first_child();
+ it;
+ ++it )
+ {
+ if( Action_data_group* existing = dynamic_cast< Action_data_group* >( *it ))
+ {
+ if( cfg_P.readEntry( "Name" ) == existing->name())
+ return existing;
+ }
+ }
+ }
+ return new Action_data_group( cfg_P, parent_P );
+ }
+ if( type == "GENERIC_ACTION_DATA" )
+ return new Generic_action_data( cfg_P, parent_P );
+ if( type == "COMMAND_URL_SHORTCUT_ACTION_DATA" )
+ return new Command_url_shortcut_action_data( cfg_P, parent_P );
+ if( type == "MENUENTRY_SHORTCUT_ACTION_DATA" )
+ return new Menuentry_shortcut_action_data( cfg_P, parent_P );
+ if( type == "DCOP_SHORTCUT_ACTION_DATA" )
+ return new Dcop_shortcut_action_data( cfg_P, parent_P );
+ if( type == "KEYBOARD_INPUT_SHORTCUT_ACTION_DATA" )
+ return new Keyboard_input_shortcut_action_data( cfg_P, parent_P );
+ if( type == "KEYBOARD_INPUT_GESTURE_ACTION_DATA" )
+ return new Keyboard_input_gesture_action_data( cfg_P, parent_P );
+ if( type == "ACTIVATE_WINDOW_SHORTCUT_ACTION_DATA" )
+ return new Activate_window_shortcut_action_data( cfg_P, parent_P );
+ kdWarning( 1217 ) << "Unknown Action_data_base type read from cfg file\n";
+ return NULL;
+ }
+
+bool Action_data_base::cfg_is_enabled( KConfig& cfg_P )
+ {
+ return cfg_P.readBoolEntry( "Enabled", true );
+ }
+
+void Action_data_base::reparent( Action_data_group* new_parent_P )
+ {
+ if( parent())
+ parent()->remove_child( this );
+ _parent = new_parent_P;
+ if( parent())
+ parent()->add_child( this );
+ }
+
+bool Action_data_base::enabled( bool ignore_group_P ) const
+ {
+ if( ignore_group_P )
+ return _enabled;
+ else
+ return _enabled && ( parent() == NULL || parent()->enabled( false ));
+ }
+
+bool Action_data_base::conditions_match() const
+ {
+ return ( conditions() ? conditions()->match() : true )
+ && ( parent() ? parent()->conditions_match() : true );
+ }
+
+// Action_data_group
+
+Action_data_group::Action_data_group( KConfig& cfg_P, Action_data_group* parent_P )
+ : Action_data_base( cfg_P, parent_P )
+ {
+ unsigned int system_group_tmp = cfg_P.readUnsignedNumEntry( "SystemGroup", 0 );
+ if( system_group_tmp >= SYSTEM_MAX )
+ system_group_tmp = 0;
+ _system_group = static_cast< system_group_t >( system_group_tmp );
+ }
+
+void Action_data_group::cfg_write( KConfig& cfg_P ) const
+ {
+ Action_data_base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "SystemGroup", system_group());
+ cfg_P.writeEntry( "Type", "ACTION_DATA_GROUP" );
+ }
+
+void Action_data_group::update_triggers()
+ {
+ for( Action_data_group::Iterator it = first_child();
+ it;
+ ++it )
+ ( *it )->update_triggers();
+ }
+
+// Action_data
+
+Action_data::Action_data( KConfig& cfg_P, Action_data_group* parent_P )
+ : Action_data_base( cfg_P, parent_P )
+ {
+ QString save_cfg_group = cfg_P.group();
+ cfg_P.setGroup( save_cfg_group + "Triggers" );
+ _triggers = new Trigger_list( cfg_P, this );
+ cfg_P.setGroup( save_cfg_group + "Actions" );
+ _actions = new Action_list( cfg_P, this );
+ cfg_P.setGroup( save_cfg_group );
+ }
+
+Action_data::~Action_data()
+ {
+// kdDebug( 1217 ) << "~Action_data" << this << endl;
+ delete _triggers;
+ delete _actions;
+ // CHECKME jeste remove z parenta ?
+ }
+
+void Action_data::cfg_write( KConfig& cfg_P ) const
+ {
+ Action_data_base::cfg_write( cfg_P );
+ QString save_cfg_group = cfg_P.group();
+ cfg_P.setGroup( save_cfg_group + "Triggers" );
+ triggers()->cfg_write( cfg_P );
+ cfg_P.setGroup( save_cfg_group + "Actions" );
+ actions()->cfg_write( cfg_P );
+ cfg_P.setGroup( save_cfg_group );
+ }
+
+void Action_data::execute()
+ {
+ for( Action_list::Iterator it( *_actions );
+ it;
+ ++it )
+ it.current()->execute();
+// CHECKME nebo nejak zpozdeni ?
+ }
+
+void Action_data::add_trigger( Trigger* trigger_P )
+ {
+ _triggers->append( trigger_P );
+ }
+
+void Action_data::add_triggers( Trigger_list* triggers_P )
+ {
+ for( Trigger_list::Iterator it = *triggers_P;
+ it;
+ ++it )
+ _triggers->append( *it );
+ triggers_P->setAutoDelete( false );
+ delete triggers_P;
+ }
+
+void Action_data::set_triggers( Trigger_list* triggers_P )
+ {
+ assert( _triggers == NULL );
+ _triggers = triggers_P;
+ }
+
+void Action_data::add_action( Action* action_P, Action* after_P )
+ {
+ int index = 0;
+ for( Action_list::Iterator it = *_actions;
+ it;
+ ++it )
+ {
+ ++index;
+ if( *it == after_P )
+ break;
+ }
+ _actions->insert( index, action_P );
+ }
+
+void Action_data::add_actions( Action_list* actions_P, Action* after_P )
+ {
+ int index = 0;
+ for( Action_list::Iterator it = *_actions;
+ it;
+ ++it )
+ {
+ ++index;
+ if( *it == after_P )
+ break;
+ }
+ for( Action_list::Iterator it = *actions_P;
+ it;
+ ++it )
+ _actions->insert( index++, *it );
+ actions_P->setAutoDelete( false );
+ delete actions_P;
+ }
+
+void Action_data::set_actions( Action_list* actions_P )
+ {
+ assert( _actions == NULL );
+ _actions = actions_P;
+ }
+
+void Action_data::update_triggers()
+ {
+ bool activate = conditions_match() && enabled( false );
+ kdDebug( 1217 ) << "Update triggers: " << name() << ":" << activate << endl;
+ for( Trigger_list::Iterator it = ( *triggers());
+ it;
+ ++it )
+ ( *it )->activate( activate );
+ }
+
+// Generic_action_data
+
+void Generic_action_data::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Type", "GENERIC_ACTION_DATA" );
+ }
+
+// Command_url_shortcut_action_data
+
+Command_url_shortcut_action_data::Command_url_shortcut_action_data( Action_data_group* parent_P,
+ const QString& name_P, const QString& comment_P,
+ const KShortcut& shortcut_P, const QString& command_url_P, bool enabled_P )
+ : Simple_action_data< Shortcut_trigger, Command_url_action >( parent_P, name_P,
+ comment_P, enabled_P )
+ {
+ set_action( new Command_url_action( this, command_url_P ));
+ set_trigger( new Shortcut_trigger( this, shortcut_P ));
+ }
+
+template<> KDE_EXPORT
+void Simple_action_data< Shortcut_trigger, Command_url_action >
+ ::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Type", "COMMAND_URL_SHORTCUT_ACTION_DATA" );
+ }
+
+// Menuentry_shortcut_action_data
+
+Menuentry_shortcut_action_data::Menuentry_shortcut_action_data( Action_data_group* parent_P,
+ const QString& name_P, const QString& comment_P,
+ const KShortcut& shortcut_P, const QString& menuentry_P, bool enabled_P )
+ : Simple_action_data< Shortcut_trigger, Menuentry_action >( parent_P, name_P,
+ comment_P, enabled_P )
+ {
+ set_action( new Menuentry_action( this, menuentry_P ));
+ set_trigger( new Shortcut_trigger( this, shortcut_P ));
+ }
+
+template<> KDE_EXPORT
+void Simple_action_data< Shortcut_trigger, Menuentry_action >
+ ::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Type", "MENUENTRY_SHORTCUT_ACTION_DATA" );
+ }
+
+// Dcop_shortcut_action_data
+
+template<> KDE_EXPORT
+void Simple_action_data< Shortcut_trigger, Dcop_action >
+ ::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Type", "DCOP_SHORTCUT_ACTION_DATA" );
+ }
+
+// Keyboard_input_shortcut_action_data
+
+template<> KDE_EXPORT
+void Simple_action_data< Shortcut_trigger, Keyboard_input_action >
+ ::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Type", "KEYBOARD_INPUT_SHORTCUT_ACTION_DATA" );
+ }
+
+// Activate_window_shortcut_action_data
+
+template<> KDE_EXPORT
+void Simple_action_data< Shortcut_trigger, Activate_window_action >
+ ::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Type", "ACTIVATE_WINDOW_SHORTCUT_ACTION_DATA" );
+ }
+
+// Keyboard_input_gesture_action_data
+
+void Keyboard_input_gesture_action_data::set_action( Keyboard_input_action* action_P )
+ {
+ Action_list* tmp = new Action_list( "Keyboard_input_gesture_action_data" );
+ tmp->append( action_P );
+ set_actions( tmp );
+ }
+
+const Keyboard_input_action* Keyboard_input_gesture_action_data::action() const
+ {
+ if( actions() == NULL ) // CHECKME tohle poradne zkontrolovat
+ return NULL;
+ return static_cast< Keyboard_input_action* >( const_cast< Action_list* >( actions())->first());
+ }
+
+void Keyboard_input_gesture_action_data::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Type", "KEYBOARD_INPUT_GESTURE_ACTION_DATA" );
+ }
+
+} // namespace KHotKeys