author | zautrix <zautrix> | 2004-06-26 19:01:18 (UTC) |
---|---|---|
committer | zautrix <zautrix> | 2004-06-26 19:01:18 (UTC) |
commit | b9aad1f15dc600e4dbe4c62d3fcced6363188ba3 (patch) (side-by-side diff) | |
tree | 2c3d4004fb21c72cba65793859f9bcd8ffd3a49c /microkde/kdeui/kactioncollection.cpp | |
download | kdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.zip kdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.tar.gz kdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.tar.bz2 |
Initial revision
Diffstat (limited to 'microkde/kdeui/kactioncollection.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | microkde/kdeui/kactioncollection.cpp | 839 |
1 files changed, 839 insertions, 0 deletions
diff --git a/microkde/kdeui/kactioncollection.cpp b/microkde/kdeui/kactioncollection.cpp new file mode 100644 index 0000000..b819e76 --- a/dev/null +++ b/microkde/kdeui/kactioncollection.cpp @@ -0,0 +1,839 @@ +/* This file is part of the KDE libraries + Copyright (C) 1999 Reginald Stadlbauer <reggie@kde.org> + (C) 1999 Simon Hausmann <hausmann@kde.org> + (C) 2000 Nicolas Hadacek <haadcek@kde.org> + (C) 2000 Kurt Granroth <granroth@kde.org> + (C) 2000 Michael Koch <koch@kde.org> + (C) 2001 Holger Freyther <freyther@kde.org> + (C) 2002 Ellis Whitehead <ellis@kde.org> + (C) 2002 Joseph Wenninger <jowenn@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include "kactioncollection.h" +//US#include "kactionshortcutlist.h" + +#include <qptrdict.h> +//US#include <qvariant.h> + +//US#include <kaccel.h> +//US#include <kaccelbase.h> +//US#include <kapplication.h> +#include <kdebug.h> +//US#include <kxmlguifactory.h> + +//US I included the following files +#include <qasciidict.h> +#include <qptrlist.h> +#include "kaction.h" +#include <kglobal.h> +#include <qobject.h> +#include <qwidget.h> + +class KActionCollection::KActionCollectionPrivate +{ +public: + KActionCollectionPrivate() + { +//US m_instance = 0; + //m_bOneKAccelOnly = false; + //m_iWidgetCurrent = 0; + m_bAutoConnectShortcuts = true; + m_widget = 0; + m_kaccel = m_builderKAccel = 0; + m_dctHighlightContainers.setAutoDelete( true ); + m_highlight = false; + m_currentHighlightAction = 0; + m_statusCleared = true; + } + +//US KInstance *m_instance; +//US QString m_sXMLFile; + bool m_bAutoConnectShortcuts; + //bool m_bOneKAccelOnly; + //int m_iWidgetCurrent; + //QValueList<QWidget*> m_widgetList; + //QValueList<KAccel*> m_kaccelList; + QValueList<KActionCollection*> m_docList; + QWidget *m_widget; + KAccel *m_kaccel; + KAccel *m_builderKAccel; + + QAsciiDict<KAction> m_actionDict; + QPtrDict< QPtrList<KAction> > m_dctHighlightContainers; + bool m_highlight; + KAction *m_currentHighlightAction; + bool m_statusCleared; +}; + +KActionCollection::KActionCollection( QWidget *parent, const char *name /*US, + KInstance *instance */) + : QObject( (QObject*)parent, name ) +{ + kdDebug(129) << "KActionCollection::KActionCollection( " << parent << ", " << name << " ): this = " << this << endl; // ellis + d = new KActionCollectionPrivate; + if( parent ) + setWidget( parent ); + //d->m_bOneKAccelOnly = (d->m_kaccelList.count() > 0); +//US setInstance( instance ); +} + + +KActionCollection::KActionCollection( QWidget *watch, QObject* parent, const char *name /*US, + KInstance *instance */) + : QObject( parent, name ) +{ + kdDebug(129) << "KActionCollection::KActionCollection( " << watch << ", " << parent << ", " << name << " ): this = " << this << endl; //ellis + d = new KActionCollectionPrivate; + if( watch ) + setWidget( watch ); + //d->m_bOneKAccelOnly = (d->m_kaccelList.count() > 0); +//US setInstance( instance ); +} + +// KDE 4: remove +KActionCollection::KActionCollection( QObject *parent, const char *name /*US, + KInstance *instance */) + : QObject( parent, name ) +{ + kdWarning(129) << "KActionCollection::KActionCollection( QObject *parent, const char *name, KInstance *instance )" << endl; //ellis +//US kdBacktrace not available +//US kdDebug(129) << kdBacktrace() << endl; + d = new KActionCollectionPrivate; +//US QWidget* w = dynamic_cast<QWidget*>( parent ); + QWidget* w = (QWidget*)( parent ); + if( w ) + setWidget( w ); + //d->m_bOneKAccelOnly = (d->m_kaccelList.count() > 0); +//US setInstance( instance ); +} + +KActionCollection::KActionCollection( const KActionCollection © ) + : QObject() +{ + kdWarning(129) << "KActionCollection::KActionCollection( const KActionCollection & ): function is severely deprecated." << endl; + d = new KActionCollectionPrivate; + *this = copy; +} +// KDE 4: remove end + +KActionCollection::~KActionCollection() +{ + kdDebug(129) << "KActionCollection::~KActionCollection(): this = " << this << endl; + for ( QAsciiDictIterator<KAction> it( d->m_actionDict ); it.current(); ++it ) { + KAction* pAction = it.current(); + if ( pAction->m_parentCollection == this ) + pAction->m_parentCollection = 0L; + } + +//US delete d->m_kaccel; +//US delete d->m_builderKAccel; + delete d; d = 0; +} + +void KActionCollection::setWidget( QWidget* w ) +{ + //if ( d->m_actionDict.count() > 0 ) { + // kdError(129) << "KActionCollection::setWidget(): must be called before any actions are added to collection!" << endl; + // kdDebug(129) << kdBacktrace() << endl; + //} + //else + if ( !d->m_widget ) { + d->m_widget = w; + qDebug("KActionCollection::setWidget: warning: KAccel is never used in microkde"); +//US d->m_kaccel = new KAccel( w, this, "KActionCollection-KAccel" ); + } + else if ( d->m_widget != w ) + kdWarning(129) << "KActionCollection::setWidget(): tried to change widget from " << d->m_widget << " to " << w << endl; +} + +void KActionCollection::setAutoConnectShortcuts( bool b ) +{ + d->m_bAutoConnectShortcuts = b; +} + +bool KActionCollection::isAutoConnectShortcuts() +{ + return d->m_bAutoConnectShortcuts; +} + +bool KActionCollection::addDocCollection( KActionCollection* pDoc ) +{ + d->m_docList.append( pDoc ); + return true; +} + +void KActionCollection::beginXMLPlug( QWidget *widget ) +{ + qDebug("KActionCollection::beginXMLPlug has to be fixed"); +/*US + kdDebug(129) << "KActionCollection::beginXMLPlug( buildWidget = " << widget << " ): this = " << this << " d->m_builderKAccel = " << d->m_builderKAccel << endl; + + if( widget && !d->m_builderKAccel ) { + d->m_builderKAccel = new KAccel( widget, this, "KActionCollection-BuilderKAccel" ); + } +*/ +} + +void KActionCollection::endXMLPlug() +{ + kdDebug(129) << "KActionCollection::endXMLPlug(): this = " << this << endl; + //s_kaccelXML = 0; +} + +void KActionCollection::prepareXMLUnplug() +{ + qDebug("KActionCollection::prepareXMLUnplug has to be fixed"); +/*US + kdDebug(129) << "KActionCollection::prepareXMLUnplug(): this = " << this << endl; + unplugShortcuts( d->m_kaccel ); + + if( d->m_builderKAccel ) { + unplugShortcuts( d->m_builderKAccel ); + delete d->m_builderKAccel; + d->m_builderKAccel = 0; + } +*/ +} + +void KActionCollection::unplugShortcuts( KAccel* kaccel ) +{ + qDebug("KActionCollection::unplugShortcuts has to be fixed"); +/*US + for ( QAsciiDictIterator<KAction> it( d->m_actionDict ); it.current(); ++it ) { + KAction* pAction = it.current(); + pAction->removeKAccel( kaccel ); + } + + for( uint i = 0; i < d->m_docList.count(); i++ ) + d->m_docList[i]->unplugShortcuts( kaccel ); +*/ + +} + +/*void KActionCollection::addWidget( QWidget* w ) +{ + if( !d->m_bOneKAccelOnly ) { + kdDebug(129) << "KActionCollection::addWidget( " << w << " ): this = " << this << endl; + for( uint i = 0; i < d->m_widgetList.count(); i++ ) { + if( d->m_widgetList[i] == w ) { + d->m_iWidgetCurrent = i; + return; + } + } + d->m_iWidgetCurrent = d->m_widgetList.count(); + d->m_widgetList.append( w ); + d->m_kaccelList.append( new KAccel( w, this, "KActionCollection-KAccel" ) ); + } +} + +void KActionCollection::removeWidget( QWidget* w ) +{ + if( !d->m_bOneKAccelOnly ) { + kdDebug(129) << "KActionCollection::removeWidget( " << w << " ): this = " << this << endl; + for( uint i = 0; i < d->m_widgetList.count(); i++ ) { + if( d->m_widgetList[i] == w ) { + // Remove KAccel object from children. + KAccel* pKAccel = d->m_kaccelList[i]; + for ( QAsciiDictIterator<KAction> it( d->m_actionDict ); it.current(); ++it ) { + KAction* pAction = it.current(); + if ( pAction->m_parentCollection == this ) { + pAction->removeKAccel( pKAccel ); + } + } + delete pKAccel; + + d->m_widgetList.remove( d->m_widgetList.at( i ) ); + d->m_kaccelList.remove( d->m_kaccelList.at( i ) ); + + if( d->m_iWidgetCurrent == (int)i ) + d->m_iWidgetCurrent = -1; + else if( d->m_iWidgetCurrent > (int)i ) + d->m_iWidgetCurrent--; + return; + } + } + kdWarning(129) << "KActionCollection::removeWidget( " << w << " ): widget not in list." << endl; + } +} + +bool KActionCollection::ownsKAccel() const +{ + return d->m_bOneKAccelOnly; +} + +uint KActionCollection::widgetCount() const +{ + return d->m_widgetList.count(); +} + +const KAccel* KActionCollection::widgetKAccel( uint i ) const +{ + return d->m_kaccelList[i]; +}*/ + +//US we are using no accelerators so far. So just setup an empty implementation. +KAccel* KActionCollection::kaccel() +{ + //if( d->m_kaccelList.count() > 0 ) + // return d->m_kaccelList[d->m_iWidgetCurrent]; + //else + // return 0; +//US return d->m_kaccel; + return 0; +} + +//US we are using no accelerators so far. So just setup an empty implementation. +const KAccel* KActionCollection::kaccel() const +{ + //if( d->m_kaccelList.count() > 0 ) + // return d->m_kaccelList[d->m_iWidgetCurrent]; + //else + // return 0; + //USreturn d->m_kaccel; + return 0; +} + +/*void KActionCollection::findMainWindow( QWidget *w ) +{ + // Note: topLevelWidget() stops too early, we can't use it. + QWidget * tl = w; + while ( tl->parentWidget() ) // lookup parent and store + tl = tl->parentWidget(); + + KMainWindow * mw = dynamic_cast<KMainWindow *>(tl); // try to see if it's a kmainwindow + if (mw) + d->m_mainwindow = mw; + else + kdDebug(129) << "KAction::plugMainWindowAccel: Toplevel widget isn't a KMainWindow, can't plug accel. " << tl << endl; +}*/ + +void KActionCollection::_insert( KAction* action ) +{ + char unnamed_name[100]; + const char *name = action->name(); + if( qstrcmp( name, "unnamed" ) == 0 ) + { + sprintf(unnamed_name, "unnamed-%p", (void *)action); + name = unnamed_name; + } + KAction *a = d->m_actionDict[ name ]; + if ( a == action ) + return; + + d->m_actionDict.insert( name, action ); + + emit inserted( action ); +} + +void KActionCollection::_remove( KAction* action ) +{ + delete _take( action ); +} + +KAction* KActionCollection::_take( KAction* action ) +{ + char unnamed_name[100]; + const char *name = action->name(); + if( qstrcmp( name, "unnamed" ) == 0 ) + { + sprintf(unnamed_name, "unnamed-%p", (void *) action); + name = unnamed_name; + } + + KAction *a = d->m_actionDict.take( name ); + if ( !a || a != action ) + return 0; + + emit removed( action ); + return a; +} + +void KActionCollection::_clear() +{ + QAsciiDictIterator<KAction> it( d->m_actionDict ); + while ( it.current() ) + _remove( it.current() ); +} + +void KActionCollection::insert( KAction* action ) { _insert( action ); } +void KActionCollection::remove( KAction* action ) { _remove( action ); } +KAction* KActionCollection::take( KAction* action ) { return _take( action ); } +void KActionCollection::clear() { _clear(); } +KAccel* KActionCollection::accel() { return kaccel(); } +const KAccel* KActionCollection::accel() const { return kaccel(); } +KAccel* KActionCollection::builderKAccel() const { return d->m_builderKAccel; } + +KAction* KActionCollection::action( const char* name, const char* classname ) const +{ + KAction* pAction = 0; + + if ( !classname && name ) + pAction = d->m_actionDict[ name ]; + + else { + QAsciiDictIterator<KAction> it( d->m_actionDict ); + for( ; it.current(); ++it ) + { + if ( ( !name || strcmp( it.current()->name(), name ) == 0 ) && + ( !classname || strcmp( it.current()->className(), classname ) == 0 ) ) { + pAction = it.current(); + break; + } + } + } + + if( !pAction ) { + for( uint i = 0; i < d->m_docList.count() && !pAction; i++ ) + pAction = d->m_docList[i]->action( name, classname ); + } + + return pAction; +} + +KAction* KActionCollection::action( int index ) const +{ + QAsciiDictIterator<KAction> it( d->m_actionDict ); + it += index; + return it.current(); +// return d->m_actions.at( index ); +} +/*US +bool KActionCollection::readShortcutSettings( const QString& sConfigGroup, KConfigBase* pConfig ) +{ + return KActionShortcutList(this).readSettings( sConfigGroup, pConfig ); +} + +bool KActionCollection::writeShortcutSettings( const QString& sConfigGroup, KConfigBase* pConfig ) const +{ + return KActionShortcutList((KActionCollection*)this).writeSettings( sConfigGroup, pConfig ); +} +*/ +uint KActionCollection::count() const +{ + return d->m_actionDict.count(); +} + +QStringList KActionCollection::groups() const +{ + QStringList lst; + + QAsciiDictIterator<KAction> it( d->m_actionDict ); + for( ; it.current(); ++it ) + if ( !it.current()->group().isEmpty() && !lst.contains( it.current()->group() ) ) + lst.append( it.current()->group() ); + + return lst; +} + +KActionPtrList KActionCollection::actions( const QString& group ) const +{ + KActionPtrList lst; + + QAsciiDictIterator<KAction> it( d->m_actionDict ); + for( ; it.current(); ++it ) + if ( it.current()->group() == group ) + lst.append( it.current() ); + else if ( it.current()->group().isEmpty() && group.isEmpty() ) + lst.append( it.current() ); + + return lst; +} + +KActionPtrList KActionCollection::actions() const +{ + KActionPtrList lst; + + QAsciiDictIterator<KAction> it( d->m_actionDict ); + for( ; it.current(); ++it ) + lst.append( it.current() ); + + return lst; +} + +/*US we have no instance object. Use KGlobal instead +void KActionCollection::setInstance( KInstance *instance ) +{ + if ( instance ) + d->m_instance = instance; +qDebug("KActionCollection::setInstance has to be fixed"); + else + d->m_instance = KGlobal::instance(); +} + +KInstance *KActionCollection::instance() const +{ + return d->m_instance; +} +*/ + +/*US we have no XML facility in microkde +void KActionCollection::setXMLFile( const QString& sXMLFile ) +{ + d->m_sXMLFile = sXMLFile; +} + +const QString& KActionCollection::xmlFile() const +{ + return d->m_sXMLFile; +} +*/ + +void KActionCollection::setHighlightingEnabled( bool enable ) +{ + d->m_highlight = enable; +} + +bool KActionCollection::highlightingEnabled() const +{ + return d->m_highlight; +} + +void KActionCollection::connectHighlight( QWidget *container, KAction *action ) +{ + if ( !d->m_highlight ) + return; + + QPtrList<KAction> *actionList = d->m_dctHighlightContainers[ container ]; + + if ( !actionList ) + { + actionList = new QPtrList<KAction>; + + if ( container->inherits( "QPopupMenu" ) ) + { + connect( container, SIGNAL( highlighted( int ) ), + this, SLOT( slotMenuItemHighlighted( int ) ) ); + connect( container, SIGNAL( aboutToHide() ), + this, SLOT( slotMenuAboutToHide() ) ); + } +//US else if ( container->inherits( "KToolBar" ) ) + else if ( container->inherits( "QToolBar" ) ) + { + connect( container, SIGNAL( highlighted( int, bool ) ), + this, SLOT( slotToolBarButtonHighlighted( int, bool ) ) ); + } + + connect( container, SIGNAL( destroyed() ), + this, SLOT( slotDestroyed() ) ); + + d->m_dctHighlightContainers.insert( container, actionList ); + } + + actionList->append( action ); +} + +void KActionCollection::disconnectHighlight( QWidget *container, KAction *action ) +{ + if ( !d->m_highlight ) + return; + + QPtrList<KAction> *actionList = d->m_dctHighlightContainers[ container ]; + + if ( !actionList ) + return; + + actionList->removeRef( action ); + + if ( actionList->count() == 0 ) + d->m_dctHighlightContainers.remove( container ); +} + +void KActionCollection::slotMenuItemHighlighted( int id ) +{ + if ( !d->m_highlight ) + return; + + if ( d->m_currentHighlightAction ) + emit actionHighlighted( d->m_currentHighlightAction, false ); + + QWidget *container = static_cast<QWidget *>( const_cast<QObject *>( sender() ) ); + + d->m_currentHighlightAction = findAction( container, id ); + + if ( !d->m_currentHighlightAction ) + { + if ( !d->m_statusCleared ) + emit clearStatusText(); + d->m_statusCleared = true; + return; + } + + d->m_statusCleared = false; + emit actionHighlighted( d->m_currentHighlightAction ); + emit actionHighlighted( d->m_currentHighlightAction, true ); + emit actionStatusText( d->m_currentHighlightAction->toolTip() ); +} + +void KActionCollection::slotMenuAboutToHide() +{ + if ( d->m_currentHighlightAction ) + emit actionHighlighted( d->m_currentHighlightAction, false ); + d->m_currentHighlightAction = 0; + + if ( !d->m_statusCleared ) + emit clearStatusText(); + d->m_statusCleared = true; +} + +void KActionCollection::slotToolBarButtonHighlighted( int id, bool highlight ) +{ + if ( !d->m_highlight ) + return; + + QWidget *container = static_cast<QWidget *>( const_cast<QObject *>( sender() ) ); + + KAction *action = findAction( container, id ); + + if ( !action ) + { + d->m_currentHighlightAction = 0; + // use tooltip groups for toolbar status text stuff instead (Simon) +// emit clearStatusText(); + return; + } + + emit actionHighlighted( action, highlight ); + + if ( highlight ) + d->m_currentHighlightAction = action; + else + { + d->m_currentHighlightAction = 0; +// emit clearStatusText(); + } +} + +void KActionCollection::slotDestroyed() +{ + d->m_dctHighlightContainers.remove( reinterpret_cast<void *>( const_cast<QObject *>(sender()) ) ); +} + +KAction *KActionCollection::findAction( QWidget *container, int id ) +{ + QPtrList<KAction> *actionList = d->m_dctHighlightContainers[ reinterpret_cast<void *>( container ) ]; + + if ( !actionList ) + return 0; + + QPtrListIterator<KAction> it( *actionList ); + for (; it.current(); ++it ) + if ( it.current()->isPlugged( container, id ) ) + return it.current(); + + return 0; +} + +// KDE 4: remove +KActionCollection KActionCollection::operator+(const KActionCollection &c ) const +{ + kdWarning(129) << "KActionCollection::operator+(): function is severely deprecated." << endl; + KActionCollection ret( *this ); + + QValueList<KAction *> actions = c.actions(); + QValueList<KAction *>::ConstIterator it = actions.begin(); + QValueList<KAction *>::ConstIterator end = actions.end(); + for (; it != end; ++it ) + ret.insert( *it ); + + return ret; +} + +KActionCollection &KActionCollection::operator=( const KActionCollection © ) +{ + kdWarning(129) << "KActionCollection::operator=(): function is severely deprecated." << endl; + //d->m_bOneKAccelOnly = copy.d->m_bOneKAccelOnly; + //d->m_iWidgetCurrent = copy.d->m_iWidgetCurrent; + //d->m_widgetList = copy.d->m_widgetList; + //d->m_kaccelList = copy.d->m_kaccelList; + d->m_widget = copy.d->m_widget; + d->m_kaccel = copy.d->m_kaccel; + d->m_actionDict = copy.d->m_actionDict; +//US setInstance( copy.instance() ); + return *this; +} + +KActionCollection &KActionCollection::operator+=( const KActionCollection &c ) +{ + kdWarning(129) << "KActionCollection::operator+=(): function is severely deprecated." << endl; + QAsciiDictIterator<KAction> it(c.d->m_actionDict); + for ( ; it.current(); ++it ) + insert( it.current() ); + + return *this; +} +// KDE 4: remove end + +//--------------------------------------------------------------------- +// KActionShortcutList +//--------------------------------------------------------------------- +/*US +KActionShortcutList::KActionShortcutList( KActionCollection* pColl ) +: m_actions( *pColl ) + { } +KActionShortcutList::~KActionShortcutList() + { } +uint KActionShortcutList::count() const + { return m_actions.count(); } +QString KActionShortcutList::name( uint i ) const + { return m_actions.action(i)->name(); } +QString KActionShortcutList::label( uint i ) const + { return m_actions.action(i)->text(); } +QString KActionShortcutList::whatsThis( uint i ) const + { return m_actions.action(i)->whatsThis(); } +const KShortcut& KActionShortcutList::shortcut( uint i ) const + { return m_actions.action(i)->shortcut(); } +const KShortcut& KActionShortcutList::shortcutDefault( uint i ) const + { return m_actions.action(i)->shortcutDefault(); } +bool KActionShortcutList::isConfigurable( uint i ) const + { return m_actions.action(i)->isShortcutConfigurable(); } +bool KActionShortcutList::setShortcut( uint i, const KShortcut& cut ) + { return m_actions.action(i)->setShortcut( cut ); } +const KInstance* KActionShortcutList::instance() const + { return m_actions.instance(); } +QVariant KActionShortcutList::getOther( Other, uint ) const + { return QVariant(); } +bool KActionShortcutList::setOther( Other, uint, QVariant ) + { return false; } + +bool KActionShortcutList::save() const +{ + kdDebug(129) << "KActionShortcutList::save(): xmlFile = " << m_actions.xmlFile() << endl; + + if( m_actions.xmlFile().isEmpty() ) + return writeSettings(); + + QString tagActionProp = QString::fromLatin1("ActionProperties"); + QString tagAction = QString::fromLatin1("Action"); + QString attrName = QString::fromLatin1("name"); + QString attrShortcut = QString::fromLatin1("shortcut"); + QString attrAccel = QString::fromLatin1("accel"); // Depricated attribute + + // Read XML file + QString sXml( KXMLGUIFactory::readConfigFile( m_actions.xmlFile(), false, instance() ) ); + QDomDocument doc; + doc.setContent( sXml ); + + // Process XML data + + // first, lets see if we have existing properties + QDomElement elem; + QDomElement it = doc.documentElement(); + // KXMLGUIFactory::removeDOMComments( it ); <-- What was this for? --ellis + it = it.firstChild().toElement(); + for( ; !it.isNull(); it = it.nextSibling().toElement() ) { + if( it.tagName() == tagActionProp ) { + elem = it; + break; + } + } + + // if there was none, create one + if( elem.isNull() ) { + elem = doc.createElement( tagActionProp ); + doc.documentElement().appendChild( elem ); + } + + // now, iterate through our actions + uint nSize = count(); + for( uint i = 0; i < nSize; i++ ) { + const QString& sName = name(i); + + bool bSameAsDefault = (shortcut(i) == shortcutDefault(i)); + //kdDebug(129) << "name = " << sName << " shortcut = " << shortcut(i).toStringInternal() << " def = " << shortcutDefault(i).toStringInternal() << endl; + + // now see if this element already exists + QDomElement act_elem; + for( it = elem.firstChild().toElement(); !it.isNull(); it = it.nextSibling().toElement() ) { + if( it.attribute( attrName ) == sName ) { + act_elem = it; + break; + } + } + + // nope, create a new one + if( act_elem.isNull() ) { + if( bSameAsDefault ) + continue; + //kdDebug(129) << "\tnode doesn't exist." << endl; + act_elem = doc.createElement( tagAction ); + act_elem.setAttribute( attrName, sName ); + } + + act_elem.removeAttribute( attrAccel ); + if( bSameAsDefault ) { + act_elem.removeAttribute( attrShortcut ); + //kdDebug(129) << "act_elem.attributes().count() = " << act_elem.attributes().count() << endl; + if( act_elem.attributes().count() == 1 ) + elem.removeChild( act_elem ); + } else { + act_elem.setAttribute( attrShortcut, shortcut(i).toStringInternal() ); + elem.appendChild( act_elem ); + } + } + + // Write back to XML file + return KXMLGUIFactory::saveConfigFile( doc, m_actions.xmlFile(), instance() ); +} + +//--------------------------------------------------------------------- +// KActionPtrShortcutList +//--------------------------------------------------------------------- + +KActionPtrShortcutList::KActionPtrShortcutList( KActionPtrList& list ) +: m_actions( list ) + { } +KActionPtrShortcutList::~KActionPtrShortcutList() + { } +uint KActionPtrShortcutList::count() const + { return m_actions.count(); } +QString KActionPtrShortcutList::name( uint i ) const + { return m_actions[i]->name(); } +QString KActionPtrShortcutList::label( uint i ) const + { return m_actions[i]->text(); } +QString KActionPtrShortcutList::whatsThis( uint i ) const + { return m_actions[i]->whatsThis(); } +const KShortcut& KActionPtrShortcutList::shortcut( uint i ) const + { return m_actions[i]->shortcut(); } +const KShortcut& KActionPtrShortcutList::shortcutDefault( uint i ) const + { return m_actions[i]->shortcutDefault(); } +bool KActionPtrShortcutList::isConfigurable( uint i ) const + { return m_actions[i]->isShortcutConfigurable(); } +bool KActionPtrShortcutList::setShortcut( uint i, const KShortcut& cut ) + { return m_actions[i]->setShortcut( cut ); } +QVariant KActionPtrShortcutList::getOther( Other, uint ) const + { return QVariant(); } +bool KActionPtrShortcutList::setOther( Other, uint, QVariant ) + { return false; } +bool KActionPtrShortcutList::save() const + { return false; } + +void KActionShortcutList::virtual_hook( int id, void* data ) +{ KShortcutList::virtual_hook( id, data ); } + +void KActionPtrShortcutList::virtual_hook( int id, void* data ) +{ KShortcutList::virtual_hook( id, data ); } +*/ + +void KActionCollection::virtual_hook( int, void* ) +{ /*BASE::virtual_hook( id, data );*/ } + +/* vim: et sw=2 ts=2 + */ + +/*US +#include "kactioncollection.moc" +*/ |