kdeui Library API Documentation

kactioncollection.cpp

00001 /* This file is part of the KDE libraries 00002 Copyright (C) 1999 Reginald Stadlbauer <reggie@kde.org> 00003 (C) 1999 Simon Hausmann <hausmann@kde.org> 00004 (C) 2000 Nicolas Hadacek <haadcek@kde.org> 00005 (C) 2000 Kurt Granroth <granroth@kde.org> 00006 (C) 2000 Michael Koch <koch@kde.org> 00007 (C) 2001 Holger Freyther <freyther@kde.org> 00008 (C) 2002 Ellis Whitehead <ellis@kde.org> 00009 (C) 2002 Joseph Wenninger <jowenn@kde.org> 00010 00011 This library is free software; you can redistribute it and/or 00012 modify it under the terms of the GNU Library General Public 00013 License version 2 as published by the Free Software Foundation. 00014 00015 This library is distributed in the hope that it will be useful, 00016 but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00018 Library General Public License for more details. 00019 00020 You should have received a copy of the GNU Library General Public License 00021 along with this library; see the file COPYING.LIB. If not, write to 00022 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00023 Boston, MA 02111-1307, USA. 00024 */ 00025 00026 #include "kactioncollection.h" 00027 #include "kactionshortcutlist.h" 00028 00029 #include <qptrdict.h> 00030 #include <qvariant.h> 00031 00032 #include <kaccel.h> 00033 #include <kaccelbase.h> 00034 #include <kapplication.h> 00035 #include <kdebug.h> 00036 #include <kxmlguifactory.h> 00037 00038 class KActionCollection::KActionCollectionPrivate 00039 { 00040 public: 00041 KActionCollectionPrivate() 00042 { 00043 m_instance = 0; 00044 //m_bOneKAccelOnly = false; 00045 //m_iWidgetCurrent = 0; 00046 m_bAutoConnectShortcuts = true; 00047 m_widget = 0; 00048 m_kaccel = m_builderKAccel = 0; 00049 m_dctHighlightContainers.setAutoDelete( true ); 00050 m_highlight = false; 00051 m_currentHighlightAction = 0; 00052 m_statusCleared = true; 00053 } 00054 00055 KInstance *m_instance; 00056 QString m_sXMLFile; 00057 bool m_bAutoConnectShortcuts; 00058 //bool m_bOneKAccelOnly; 00059 //int m_iWidgetCurrent; 00060 //QValueList<QWidget*> m_widgetList; 00061 //QValueList<KAccel*> m_kaccelList; 00062 QValueList<KActionCollection*> m_docList; 00063 QWidget *m_widget; 00064 KAccel *m_kaccel; 00065 KAccel *m_builderKAccel; 00066 00067 QAsciiDict<KAction> m_actionDict; 00068 QPtrDict< QPtrList<KAction> > m_dctHighlightContainers; 00069 bool m_highlight; 00070 KAction *m_currentHighlightAction; 00071 bool m_statusCleared; 00072 }; 00073 00074 KActionCollection::KActionCollection( QWidget *parent, const char *name, 00075 KInstance *instance ) 00076 : QObject( parent, name ) 00077 { 00078 kdDebug(129) << "KActionCollection::KActionCollection( " << parent << ", " << name << " ): this = " << this << endl; // ellis 00079 d = new KActionCollectionPrivate; 00080 if( parent ) 00081 setWidget( parent ); 00082 //d->m_bOneKAccelOnly = (d->m_kaccelList.count() > 0); 00083 setInstance( instance ); 00084 } 00085 00086 00087 KActionCollection::KActionCollection( QWidget *watch, QObject* parent, const char *name, 00088 KInstance *instance ) 00089 : QObject( parent, name ) 00090 { 00091 kdDebug(129) << "KActionCollection::KActionCollection( " << watch << ", " << parent << ", " << name << " ): this = " << this << endl; //ellis 00092 d = new KActionCollectionPrivate; 00093 if( watch ) 00094 setWidget( watch ); 00095 //d->m_bOneKAccelOnly = (d->m_kaccelList.count() > 0); 00096 setInstance( instance ); 00097 } 00098 00099 // KDE 4: remove 00100 KActionCollection::KActionCollection( QObject *parent, const char *name, 00101 KInstance *instance ) 00102 : QObject( parent, name ) 00103 { 00104 kdWarning(129) << "KActionCollection::KActionCollection( QObject *parent, const char *name, KInstance *instance )" << endl; //ellis 00105 kdDebug(129) << kdBacktrace() << endl; 00106 d = new KActionCollectionPrivate; 00107 QWidget* w = dynamic_cast<QWidget*>( parent ); 00108 if( w ) 00109 setWidget( w ); 00110 //d->m_bOneKAccelOnly = (d->m_kaccelList.count() > 0); 00111 setInstance( instance ); 00112 } 00113 00114 KActionCollection::KActionCollection( const KActionCollection &copy ) 00115 : QObject() 00116 { 00117 kdWarning(129) << "KActionCollection::KActionCollection( const KActionCollection & ): function is severely deprecated." << endl; 00118 d = new KActionCollectionPrivate; 00119 *this = copy; 00120 } 00121 // KDE 4: remove end 00122 00123 KActionCollection::~KActionCollection() 00124 { 00125 kdDebug(129) << "KActionCollection::~KActionCollection(): this = " << this << endl; 00126 for ( QAsciiDictIterator<KAction> it( d->m_actionDict ); it.current(); ++it ) { 00127 KAction* pAction = it.current(); 00128 if ( pAction->m_parentCollection == this ) 00129 pAction->m_parentCollection = 0L; 00130 } 00131 00132 delete d->m_kaccel; 00133 delete d->m_builderKAccel; 00134 delete d; d = 0; 00135 } 00136 00137 void KActionCollection::setWidget( QWidget* w ) 00138 { 00139 //if ( d->m_actionDict.count() > 0 ) { 00140 // kdError(129) << "KActionCollection::setWidget(): must be called before any actions are added to collection!" << endl; 00141 // kdDebug(129) << kdBacktrace() << endl; 00142 //} 00143 //else 00144 if ( !d->m_widget ) { 00145 d->m_widget = w; 00146 d->m_kaccel = new KAccel( w, this, "KActionCollection-KAccel" ); 00147 } 00148 else if ( d->m_widget != w ) 00149 kdWarning(129) << "KActionCollection::setWidget(): tried to change widget from " << d->m_widget << " to " << w << endl; 00150 } 00151 00152 void KActionCollection::setAutoConnectShortcuts( bool b ) 00153 { 00154 d->m_bAutoConnectShortcuts = b; 00155 } 00156 00157 bool KActionCollection::isAutoConnectShortcuts() 00158 { 00159 return d->m_bAutoConnectShortcuts; 00160 } 00161 00162 bool KActionCollection::addDocCollection( KActionCollection* pDoc ) 00163 { 00164 d->m_docList.append( pDoc ); 00165 return true; 00166 } 00167 00168 void KActionCollection::beginXMLPlug( QWidget *widget ) 00169 { 00170 kdDebug(129) << "KActionCollection::beginXMLPlug( buildWidget = " << widget << " ): this = " << this << " d->m_builderKAccel = " << d->m_builderKAccel << endl; 00171 00172 if( widget && !d->m_builderKAccel ) { 00173 d->m_builderKAccel = new KAccel( widget, this, "KActionCollection-BuilderKAccel" ); 00174 } 00175 } 00176 00177 void KActionCollection::endXMLPlug() 00178 { 00179 kdDebug(129) << "KActionCollection::endXMLPlug(): this = " << this << endl; 00180 //s_kaccelXML = 0; 00181 } 00182 00183 void KActionCollection::prepareXMLUnplug() 00184 { 00185 kdDebug(129) << "KActionCollection::prepareXMLUnplug(): this = " << this << endl; 00186 unplugShortcuts( d->m_kaccel ); 00187 00188 if( d->m_builderKAccel ) { 00189 unplugShortcuts( d->m_builderKAccel ); 00190 delete d->m_builderKAccel; 00191 d->m_builderKAccel = 0; 00192 } 00193 } 00194 00195 void KActionCollection::unplugShortcuts( KAccel* kaccel ) 00196 { 00197 for ( QAsciiDictIterator<KAction> it( d->m_actionDict ); it.current(); ++it ) { 00198 KAction* pAction = it.current(); 00199 pAction->removeKAccel( kaccel ); 00200 } 00201 00202 for( uint i = 0; i < d->m_docList.count(); i++ ) 00203 d->m_docList[i]->unplugShortcuts( kaccel ); 00204 } 00205 00206 /*void KActionCollection::addWidget( QWidget* w ) 00207 { 00208 if( !d->m_bOneKAccelOnly ) { 00209 kdDebug(129) << "KActionCollection::addWidget( " << w << " ): this = " << this << endl; 00210 for( uint i = 0; i < d->m_widgetList.count(); i++ ) { 00211 if( d->m_widgetList[i] == w ) { 00212 d->m_iWidgetCurrent = i; 00213 return; 00214 } 00215 } 00216 d->m_iWidgetCurrent = d->m_widgetList.count(); 00217 d->m_widgetList.append( w ); 00218 d->m_kaccelList.append( new KAccel( w, this, "KActionCollection-KAccel" ) ); 00219 } 00220 } 00221 00222 void KActionCollection::removeWidget( QWidget* w ) 00223 { 00224 if( !d->m_bOneKAccelOnly ) { 00225 kdDebug(129) << "KActionCollection::removeWidget( " << w << " ): this = " << this << endl; 00226 for( uint i = 0; i < d->m_widgetList.count(); i++ ) { 00227 if( d->m_widgetList[i] == w ) { 00228 // Remove KAccel object from children. 00229 KAccel* pKAccel = d->m_kaccelList[i]; 00230 for ( QAsciiDictIterator<KAction> it( d->m_actionDict ); it.current(); ++it ) { 00231 KAction* pAction = it.current(); 00232 if ( pAction->m_parentCollection == this ) { 00233 pAction->removeKAccel( pKAccel ); 00234 } 00235 } 00236 delete pKAccel; 00237 00238 d->m_widgetList.remove( d->m_widgetList.at( i ) ); 00239 d->m_kaccelList.remove( d->m_kaccelList.at( i ) ); 00240 00241 if( d->m_iWidgetCurrent == (int)i ) 00242 d->m_iWidgetCurrent = -1; 00243 else if( d->m_iWidgetCurrent > (int)i ) 00244 d->m_iWidgetCurrent--; 00245 return; 00246 } 00247 } 00248 kdWarning(129) << "KActionCollection::removeWidget( " << w << " ): widget not in list." << endl; 00249 } 00250 } 00251 00252 bool KActionCollection::ownsKAccel() const 00253 { 00254 return d->m_bOneKAccelOnly; 00255 } 00256 00257 uint KActionCollection::widgetCount() const 00258 { 00259 return d->m_widgetList.count(); 00260 } 00261 00262 const KAccel* KActionCollection::widgetKAccel( uint i ) const 00263 { 00264 return d->m_kaccelList[i]; 00265 }*/ 00266 00267 KAccel* KActionCollection::kaccel() 00268 { 00269 //if( d->m_kaccelList.count() > 0 ) 00270 // return d->m_kaccelList[d->m_iWidgetCurrent]; 00271 //else 00272 // return 0; 00273 return d->m_kaccel; 00274 } 00275 00276 const KAccel* KActionCollection::kaccel() const 00277 { 00278 //if( d->m_kaccelList.count() > 0 ) 00279 // return d->m_kaccelList[d->m_iWidgetCurrent]; 00280 //else 00281 // return 0; 00282 return d->m_kaccel; 00283 } 00284 00285 /*void KActionCollection::findMainWindow( QWidget *w ) 00286 { 00287 // Note: topLevelWidget() stops too early, we can't use it. 00288 QWidget * tl = w; 00289 while ( tl->parentWidget() ) // lookup parent and store 00290 tl = tl->parentWidget(); 00291 00292 KMainWindow * mw = dynamic_cast<KMainWindow *>(tl); // try to see if it's a kmainwindow 00293 if (mw) 00294 d->m_mainwindow = mw; 00295 else 00296 kdDebug(129) << "KAction::plugMainWindowAccel: Toplevel widget isn't a KMainWindow, can't plug accel. " << tl << endl; 00297 }*/ 00298 00299 void KActionCollection::_insert( KAction* action ) 00300 { 00301 char unnamed_name[100]; 00302 const char *name = action->name(); 00303 if( qstrcmp( name, "unnamed" ) == 0 ) 00304 { 00305 sprintf(unnamed_name, "unnamed-%p", (void *)action); 00306 name = unnamed_name; 00307 } 00308 KAction *a = d->m_actionDict[ name ]; 00309 if ( a == action ) 00310 return; 00311 00312 d->m_actionDict.insert( name, action ); 00313 00314 emit inserted( action ); 00315 } 00316 00317 void KActionCollection::_remove( KAction* action ) 00318 { 00319 delete _take( action ); 00320 } 00321 00322 KAction* KActionCollection::_take( KAction* action ) 00323 { 00324 char unnamed_name[100]; 00325 const char *name = action->name(); 00326 if( qstrcmp( name, "unnamed" ) == 0 ) 00327 { 00328 sprintf(unnamed_name, "unnamed-%p", (void *) action); 00329 name = unnamed_name; 00330 } 00331 00332 KAction *a = d->m_actionDict.take( name ); 00333 if ( !a || a != action ) 00334 return 0; 00335 00336 if ( a->m_parentCollection == this ) 00337 a->m_parentCollection = 0; 00338 00339 emit removed( action ); 00340 return a; 00341 } 00342 00343 void KActionCollection::_clear() 00344 { 00345 QAsciiDictIterator<KAction> it( d->m_actionDict ); 00346 while ( it.current() ) 00347 _remove( it.current() ); 00348 } 00349 00350 void KActionCollection::insert( KAction* action ) { _insert( action ); } 00351 void KActionCollection::remove( KAction* action ) { _remove( action ); } 00352 KAction* KActionCollection::take( KAction* action ) { return _take( action ); } 00353 void KActionCollection::clear() { _clear(); } 00354 KAccel* KActionCollection::accel() { return kaccel(); } 00355 const KAccel* KActionCollection::accel() const { return kaccel(); } 00356 KAccel* KActionCollection::builderKAccel() const { return d->m_builderKAccel; } 00357 00358 KAction* KActionCollection::action( const char* name, const char* classname ) const 00359 { 00360 KAction* pAction = 0; 00361 00362 if ( !classname && name ) 00363 pAction = d->m_actionDict[ name ]; 00364 00365 else { 00366 QAsciiDictIterator<KAction> it( d->m_actionDict ); 00367 for( ; it.current(); ++it ) 00368 { 00369 if ( ( !name || strcmp( it.current()->name(), name ) == 0 ) && 00370 ( !classname || strcmp( it.current()->className(), classname ) == 0 ) ) { 00371 pAction = it.current(); 00372 break; 00373 } 00374 } 00375 } 00376 00377 if( !pAction ) { 00378 for( uint i = 0; i < d->m_docList.count() && !pAction; i++ ) 00379 pAction = d->m_docList[i]->action( name, classname ); 00380 } 00381 00382 return pAction; 00383 } 00384 00385 KAction* KActionCollection::action( int index ) const 00386 { 00387 QAsciiDictIterator<KAction> it( d->m_actionDict ); 00388 it += index; 00389 return it.current(); 00390 // return d->m_actions.at( index ); 00391 } 00392 00393 bool KActionCollection::readShortcutSettings( const QString& sConfigGroup, KConfigBase* pConfig ) 00394 { 00395 return KActionShortcutList(this).readSettings( sConfigGroup, pConfig ); 00396 } 00397 00398 bool KActionCollection::writeShortcutSettings( const QString& sConfigGroup, KConfigBase* pConfig ) const 00399 { 00400 return KActionShortcutList((KActionCollection*)this).writeSettings( sConfigGroup, pConfig ); 00401 } 00402 00403 uint KActionCollection::count() const 00404 { 00405 return d->m_actionDict.count(); 00406 } 00407 00408 QStringList KActionCollection::groups() const 00409 { 00410 QStringList lst; 00411 00412 QAsciiDictIterator<KAction> it( d->m_actionDict ); 00413 for( ; it.current(); ++it ) 00414 if ( !it.current()->group().isEmpty() && !lst.contains( it.current()->group() ) ) 00415 lst.append( it.current()->group() ); 00416 00417 return lst; 00418 } 00419 00420 KActionPtrList KActionCollection::actions( const QString& group ) const 00421 { 00422 KActionPtrList lst; 00423 00424 QAsciiDictIterator<KAction> it( d->m_actionDict ); 00425 for( ; it.current(); ++it ) 00426 if ( it.current()->group() == group ) 00427 lst.append( it.current() ); 00428 else if ( it.current()->group().isEmpty() && group.isEmpty() ) 00429 lst.append( it.current() ); 00430 00431 return lst; 00432 } 00433 00434 KActionPtrList KActionCollection::actions() const 00435 { 00436 KActionPtrList lst; 00437 00438 QAsciiDictIterator<KAction> it( d->m_actionDict ); 00439 for( ; it.current(); ++it ) 00440 lst.append( it.current() ); 00441 00442 return lst; 00443 } 00444 00445 void KActionCollection::setInstance( KInstance *instance ) 00446 { 00447 if ( instance ) 00448 d->m_instance = instance; 00449 else 00450 d->m_instance = KGlobal::instance(); 00451 } 00452 00453 KInstance *KActionCollection::instance() const 00454 { 00455 return d->m_instance; 00456 } 00457 00458 void KActionCollection::setXMLFile( const QString& sXMLFile ) 00459 { 00460 d->m_sXMLFile = sXMLFile; 00461 } 00462 00463 const QString& KActionCollection::xmlFile() const 00464 { 00465 return d->m_sXMLFile; 00466 } 00467 00468 void KActionCollection::setHighlightingEnabled( bool enable ) 00469 { 00470 d->m_highlight = enable; 00471 } 00472 00473 bool KActionCollection::highlightingEnabled() const 00474 { 00475 return d->m_highlight; 00476 } 00477 00478 void KActionCollection::connectHighlight( QWidget *container, KAction *action ) 00479 { 00480 if ( !d->m_highlight ) 00481 return; 00482 00483 QPtrList<KAction> *actionList = d->m_dctHighlightContainers[ container ]; 00484 00485 if ( !actionList ) 00486 { 00487 actionList = new QPtrList<KAction>; 00488 00489 if ( container->inherits( "QPopupMenu" ) ) 00490 { 00491 connect( container, SIGNAL( highlighted( int ) ), 00492 this, SLOT( slotMenuItemHighlighted( int ) ) ); 00493 connect( container, SIGNAL( aboutToHide() ), 00494 this, SLOT( slotMenuAboutToHide() ) ); 00495 } 00496 else if ( container->inherits( "KToolBar" ) ) 00497 { 00498 connect( container, SIGNAL( highlighted( int, bool ) ), 00499 this, SLOT( slotToolBarButtonHighlighted( int, bool ) ) ); 00500 } 00501 00502 connect( container, SIGNAL( destroyed() ), 00503 this, SLOT( slotDestroyed() ) ); 00504 00505 d->m_dctHighlightContainers.insert( container, actionList ); 00506 } 00507 00508 actionList->append( action ); 00509 } 00510 00511 void KActionCollection::disconnectHighlight( QWidget *container, KAction *action ) 00512 { 00513 if ( !d->m_highlight ) 00514 return; 00515 00516 QPtrList<KAction> *actionList = d->m_dctHighlightContainers[ container ]; 00517 00518 if ( !actionList ) 00519 return; 00520 00521 actionList->removeRef( action ); 00522 00523 if ( actionList->count() == 0 ) 00524 d->m_dctHighlightContainers.remove( container ); 00525 } 00526 00527 void KActionCollection::slotMenuItemHighlighted( int id ) 00528 { 00529 if ( !d->m_highlight ) 00530 return; 00531 00532 if ( d->m_currentHighlightAction ) 00533 emit actionHighlighted( d->m_currentHighlightAction, false ); 00534 00535 QWidget *container = static_cast<QWidget *>( const_cast<QObject *>( sender() ) ); 00536 00537 d->m_currentHighlightAction = findAction( container, id ); 00538 00539 if ( !d->m_currentHighlightAction ) 00540 { 00541 if ( !d->m_statusCleared ) 00542 emit clearStatusText(); 00543 d->m_statusCleared = true; 00544 return; 00545 } 00546 00547 d->m_statusCleared = false; 00548 emit actionHighlighted( d->m_currentHighlightAction ); 00549 emit actionHighlighted( d->m_currentHighlightAction, true ); 00550 emit actionStatusText( d->m_currentHighlightAction->toolTip() ); 00551 } 00552 00553 void KActionCollection::slotMenuAboutToHide() 00554 { 00555 if ( d->m_currentHighlightAction ) 00556 emit actionHighlighted( d->m_currentHighlightAction, false ); 00557 d->m_currentHighlightAction = 0; 00558 00559 if ( !d->m_statusCleared ) 00560 emit clearStatusText(); 00561 d->m_statusCleared = true; 00562 } 00563 00564 void KActionCollection::slotToolBarButtonHighlighted( int id, bool highlight ) 00565 { 00566 if ( !d->m_highlight ) 00567 return; 00568 00569 QWidget *container = static_cast<QWidget *>( const_cast<QObject *>( sender() ) ); 00570 00571 KAction *action = findAction( container, id ); 00572 00573 if ( !action ) 00574 { 00575 d->m_currentHighlightAction = 0; 00576 // use tooltip groups for toolbar status text stuff instead (Simon) 00577 // emit clearStatusText(); 00578 return; 00579 } 00580 00581 emit actionHighlighted( action, highlight ); 00582 00583 if ( highlight ) 00584 d->m_currentHighlightAction = action; 00585 else 00586 { 00587 d->m_currentHighlightAction = 0; 00588 // emit clearStatusText(); 00589 } 00590 } 00591 00592 void KActionCollection::slotDestroyed() 00593 { 00594 d->m_dctHighlightContainers.remove( reinterpret_cast<void *>( const_cast<QObject *>(sender()) ) ); 00595 } 00596 00597 KAction *KActionCollection::findAction( QWidget *container, int id ) 00598 { 00599 QPtrList<KAction> *actionList = d->m_dctHighlightContainers[ reinterpret_cast<void *>( container ) ]; 00600 00601 if ( !actionList ) 00602 return 0; 00603 00604 QPtrListIterator<KAction> it( *actionList ); 00605 for (; it.current(); ++it ) 00606 if ( it.current()->isPlugged( container, id ) ) 00607 return it.current(); 00608 00609 return 0; 00610 } 00611 00612 // KDE 4: remove 00613 KActionCollection KActionCollection::operator+(const KActionCollection &c ) const 00614 { 00615 kdWarning(129) << "KActionCollection::operator+(): function is severely deprecated." << endl; 00616 KActionCollection ret( *this ); 00617 00618 QValueList<KAction *> actions = c.actions(); 00619 QValueList<KAction *>::ConstIterator it = actions.begin(); 00620 QValueList<KAction *>::ConstIterator end = actions.end(); 00621 for (; it != end; ++it ) 00622 ret.insert( *it ); 00623 00624 return ret; 00625 } 00626 00627 KActionCollection &KActionCollection::operator=( const KActionCollection &copy ) 00628 { 00629 kdWarning(129) << "KActionCollection::operator=(): function is severely deprecated." << endl; 00630 //d->m_bOneKAccelOnly = copy.d->m_bOneKAccelOnly; 00631 //d->m_iWidgetCurrent = copy.d->m_iWidgetCurrent; 00632 //d->m_widgetList = copy.d->m_widgetList; 00633 //d->m_kaccelList = copy.d->m_kaccelList; 00634 d->m_widget = copy.d->m_widget; 00635 d->m_kaccel = copy.d->m_kaccel; 00636 d->m_actionDict = copy.d->m_actionDict; 00637 setInstance( copy.instance() ); 00638 return *this; 00639 } 00640 00641 KActionCollection &KActionCollection::operator+=( const KActionCollection &c ) 00642 { 00643 kdWarning(129) << "KActionCollection::operator+=(): function is severely deprecated." << endl; 00644 QAsciiDictIterator<KAction> it(c.d->m_actionDict); 00645 for ( ; it.current(); ++it ) 00646 insert( it.current() ); 00647 00648 return *this; 00649 } 00650 // KDE 4: remove end 00651 00652 //--------------------------------------------------------------------- 00653 // KActionShortcutList 00654 //--------------------------------------------------------------------- 00655 00656 KActionShortcutList::KActionShortcutList( KActionCollection* pColl ) 00657 : m_actions( *pColl ) 00658 { } 00659 KActionShortcutList::~KActionShortcutList() 00660 { } 00661 uint KActionShortcutList::count() const 00662 { return m_actions.count(); } 00663 QString KActionShortcutList::name( uint i ) const 00664 { return m_actions.action(i)->name(); } 00665 QString KActionShortcutList::label( uint i ) const 00666 { return m_actions.action(i)->text(); } 00667 QString KActionShortcutList::whatsThis( uint i ) const 00668 { return m_actions.action(i)->whatsThis(); } 00669 const KShortcut& KActionShortcutList::shortcut( uint i ) const 00670 { return m_actions.action(i)->shortcut(); } 00671 const KShortcut& KActionShortcutList::shortcutDefault( uint i ) const 00672 { return m_actions.action(i)->shortcutDefault(); } 00673 bool KActionShortcutList::isConfigurable( uint i ) const 00674 { return m_actions.action(i)->isShortcutConfigurable(); } 00675 bool KActionShortcutList::setShortcut( uint i, const KShortcut& cut ) 00676 { return m_actions.action(i)->setShortcut( cut ); } 00677 const KInstance* KActionShortcutList::instance() const 00678 { return m_actions.instance(); } 00679 QVariant KActionShortcutList::getOther( Other, uint ) const 00680 { return QVariant(); } 00681 bool KActionShortcutList::setOther( Other, uint, QVariant ) 00682 { return false; } 00683 00684 bool KActionShortcutList::save() const 00685 { 00686 kdDebug(129) << "KActionShortcutList::save(): xmlFile = " << m_actions.xmlFile() << endl; 00687 00688 if( m_actions.xmlFile().isEmpty() ) 00689 return writeSettings(); 00690 00691 QString tagActionProp = QString::fromLatin1("ActionProperties"); 00692 QString tagAction = QString::fromLatin1("Action"); 00693 QString attrName = QString::fromLatin1("name"); 00694 QString attrShortcut = QString::fromLatin1("shortcut"); 00695 QString attrAccel = QString::fromLatin1("accel"); // Depricated attribute 00696 00697 // Read XML file 00698 QString sXml( KXMLGUIFactory::readConfigFile( m_actions.xmlFile(), false, instance() ) ); 00699 QDomDocument doc; 00700 doc.setContent( sXml ); 00701 00702 // Process XML data 00703 00704 // first, lets see if we have existing properties 00705 QDomElement elem; 00706 QDomNode it = doc.documentElement().firstChild(); 00707 for( ; !it.isNull(); it = it.nextSibling() ) { 00708 QDomElement e = it.toElement(); 00709 if( e.tagName() == tagActionProp ) { 00710 elem = e; 00711 break; 00712 } 00713 } 00714 00715 // if there was none, create one 00716 if( elem.isNull() ) { 00717 elem = doc.createElement( tagActionProp ); 00718 doc.documentElement().appendChild( elem ); 00719 } 00720 00721 // now, iterate through our actions 00722 uint nSize = count(); 00723 for( uint i = 0; i < nSize; i++ ) { 00724 const QString& sName = name(i); 00725 00726 bool bSameAsDefault = (shortcut(i) == shortcutDefault(i)); 00727 //kdDebug(129) << "name = " << sName << " shortcut = " << shortcut(i).toStringInternal() << " def = " << shortcutDefault(i).toStringInternal() << endl; 00728 00729 // now see if this element already exists 00730 QDomElement act_elem; 00731 for( it = elem.firstChild(); !it.isNull(); it = it.nextSibling() ) { 00732 QDomElement e = it.toElement(); 00733 if( e.attribute( attrName ) == sName ) { 00734 act_elem = e; 00735 break; 00736 } 00737 } 00738 00739 // nope, create a new one 00740 if( act_elem.isNull() ) { 00741 if( bSameAsDefault ) 00742 continue; 00743 //kdDebug(129) << "\tnode doesn't exist." << endl; 00744 act_elem = doc.createElement( tagAction ); 00745 act_elem.setAttribute( attrName, sName ); 00746 } 00747 00748 act_elem.removeAttribute( attrAccel ); 00749 if( bSameAsDefault ) { 00750 act_elem.removeAttribute( attrShortcut ); 00751 //kdDebug(129) << "act_elem.attributes().count() = " << act_elem.attributes().count() << endl; 00752 if( act_elem.attributes().count() == 1 ) 00753 elem.removeChild( act_elem ); 00754 } else { 00755 act_elem.setAttribute( attrShortcut, shortcut(i).toStringInternal() ); 00756 elem.appendChild( act_elem ); 00757 } 00758 } 00759 00760 // Write back to XML file 00761 return KXMLGUIFactory::saveConfigFile( doc, m_actions.xmlFile(), instance() ); 00762 } 00763 00764 //--------------------------------------------------------------------- 00765 // KActionPtrShortcutList 00766 //--------------------------------------------------------------------- 00767 00768 KActionPtrShortcutList::KActionPtrShortcutList( KActionPtrList& list ) 00769 : m_actions( list ) 00770 { } 00771 KActionPtrShortcutList::~KActionPtrShortcutList() 00772 { } 00773 uint KActionPtrShortcutList::count() const 00774 { return m_actions.count(); } 00775 QString KActionPtrShortcutList::name( uint i ) const 00776 { return m_actions[i]->name(); } 00777 QString KActionPtrShortcutList::label( uint i ) const 00778 { return m_actions[i]->text(); } 00779 QString KActionPtrShortcutList::whatsThis( uint i ) const 00780 { return m_actions[i]->whatsThis(); } 00781 const KShortcut& KActionPtrShortcutList::shortcut( uint i ) const 00782 { return m_actions[i]->shortcut(); } 00783 const KShortcut& KActionPtrShortcutList::shortcutDefault( uint i ) const 00784 { return m_actions[i]->shortcutDefault(); } 00785 bool KActionPtrShortcutList::isConfigurable( uint i ) const 00786 { return m_actions[i]->isShortcutConfigurable(); } 00787 bool KActionPtrShortcutList::setShortcut( uint i, const KShortcut& cut ) 00788 { return m_actions[i]->setShortcut( cut ); } 00789 QVariant KActionPtrShortcutList::getOther( Other, uint ) const 00790 { return QVariant(); } 00791 bool KActionPtrShortcutList::setOther( Other, uint, QVariant ) 00792 { return false; } 00793 bool KActionPtrShortcutList::save() const 00794 { return false; } 00795 00796 void KActionShortcutList::virtual_hook( int id, void* data ) 00797 { KShortcutList::virtual_hook( id, data ); } 00798 00799 void KActionPtrShortcutList::virtual_hook( int id, void* data ) 00800 { KShortcutList::virtual_hook( id, data ); } 00801 00802 void KActionCollection::virtual_hook( int, void* ) 00803 { /*BASE::virtual_hook( id, data );*/ } 00804 00805 /* vim: et sw=2 ts=2 00806 */ 00807 00808 #include "kactioncollection.moc"
KDE Logo
This file is part of the documentation for kdeui Library Version 3.2.3.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat Jun 12 15:08:14 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003