diff options
Diffstat (limited to 'khotkeys/shared/action_data.cpp')
| -rw-r--r-- | khotkeys/shared/action_data.cpp | 378 | 
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 <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 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 | 
