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.
379 lines
11 KiB
379 lines
11 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 _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 TQString& name_P,
|
|
const TQString& 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 )
|
|
{
|
|
TQString 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 ));
|
|
TQString 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 )
|
|
{
|
|
TQString 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 )
|
|
{
|
|
TQString 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 );
|
|
TQString 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 TQString& name_P, const TQString& comment_P,
|
|
const KShortcut& shortcut_P, const TQString& 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 TQString& name_P, const TQString& comment_P,
|
|
const KShortcut& shortcut_P, const TQString& 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
|