00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 #include "kaction.h"
00027 
00028 #include <assert.h>
00029 
00030 #include <qtooltip.h>
00031 #include <qwhatsthis.h>
00032 
00033 #include <kaccel.h>
00034 #include <kaccelbase.h>
00035 #include <kapplication.h>
00036 #include <kdebug.h>
00037 #include <kguiitem.h>
00038 #include <kmainwindow.h>
00039 #include <kmenubar.h>
00040 #include <kpopupmenu.h>
00041 #include <ktoolbar.h>
00042 #include <ktoolbarbutton.h>
00043 
00065 int KAction::getToolButtonID()
00066 {
00067     static int toolbutton_no = -2;
00068     return toolbutton_no--;
00069 }
00070 
00071 
00072 
00073 
00074 
00075 class KAction::KActionPrivate : public KGuiItem
00076 {
00077 public:
00078   KActionPrivate() : KGuiItem()
00079   {
00080     m_kaccel = 0;
00081     m_configurable = true;
00082   }
00083 
00084   KAccel *m_kaccel;
00085   QValueList<KAccel*> m_kaccelList;
00086 
00087   QString m_groupText;
00088   QString m_group;
00089 
00090   KShortcut m_cut;
00091   KShortcut m_cutDefault;
00092 
00093   bool m_configurable;
00094 
00095   struct Container
00096   {
00097     Container() { m_container = 0; m_representative = 0; m_id = 0; }
00098     Container( const Container& s ) { m_container = s.m_container;
00099                                       m_id = s.m_id; m_representative = s.m_representative; }
00100     QWidget* m_container;
00101     int m_id;
00102     QWidget* m_representative;
00103   };
00104 
00105   QValueList<Container> m_containers;
00106 };
00107 
00108 
00109 
00110 
00111 
00112 KAction::KAction( const QString& text, const KShortcut& cut,
00113              const QObject* receiver, const char* slot,
00114              KActionCollection* parent, const char* name )
00115 : QObject( parent, name )
00116 {
00117     initPrivate( text, cut, receiver, slot );
00118 }
00119 
00120 KAction::KAction( const QString& text, const QString& sIconName, const KShortcut& cut,
00121     const QObject* receiver, const char* slot,
00122     KActionCollection* parent, const char* name )
00123 : QObject( parent, name )
00124 {
00125     initPrivate( text, cut, receiver, slot );
00126     d->setIconName( sIconName );
00127 }
00128 
00129 KAction::KAction( const QString& text, const QIconSet& pix, const KShortcut& cut,
00130     const QObject* receiver, const char* slot,
00131     KActionCollection* parent, const char* name )
00132 : QObject( parent, name )
00133 {
00134     initPrivate( text, cut, receiver, slot );
00135     d->setIconSet( pix );
00136 }
00137 
00138 KAction::KAction( const KGuiItem& item, const KShortcut& cut,
00139     const QObject* receiver, const char* slot,
00140     KActionCollection* parent, const char* name )
00141 : QObject( parent, name )
00142 {
00143     initPrivate( item.text(), cut, receiver, slot );
00144     if( item.hasIconSet() )
00145         setIcon( item.iconName() );
00146     setToolTip( item.toolTip() );
00147     setWhatsThis( item.whatsThis() );
00148 }
00149 
00150 
00151 KAction::KAction( const QString& text, const KShortcut& cut,
00152                   QObject* parent, const char* name )
00153  : QObject( parent, name )
00154 {
00155     initPrivate( text, cut, 0, 0 );
00156 }
00157 
00158 KAction::KAction( const QString& text, const KShortcut& cut,
00159                   const QObject* receiver,
00160                   const char* slot, QObject* parent, const char* name )
00161  : QObject( parent, name )
00162 {
00163     initPrivate( text, cut, receiver, slot );
00164 }
00165 
00166 KAction::KAction( const QString& text, const QIconSet& pix,
00167                   const KShortcut& cut,
00168                   QObject* parent, const char* name )
00169  : QObject( parent, name )
00170 {
00171     initPrivate( text, cut, 0, 0 );
00172     setIconSet( pix );
00173 }
00174 
00175 KAction::KAction( const QString& text, const QString& pix,
00176                   const KShortcut& cut,
00177                   QObject* parent, const char* name )
00178 : QObject( parent, name )
00179 {
00180     initPrivate( text, cut, 0, 0 );
00181     d->setIconName( pix );
00182 }
00183 
00184 KAction::KAction( const QString& text, const QIconSet& pix,
00185                   const KShortcut& cut,
00186                   const QObject* receiver, const char* slot, QObject* parent,
00187                   const char* name )
00188  : QObject( parent, name )
00189 {
00190     initPrivate( text, cut, receiver, slot );
00191     setIconSet( pix );
00192 }
00193 
00194 KAction::KAction( const QString& text, const QString& pix,
00195                   const KShortcut& cut,
00196                   const QObject* receiver, const char* slot, QObject* parent,
00197                   const char* name )
00198   : QObject( parent, name )
00199 {
00200     initPrivate( text, cut, receiver, slot );
00201     d->setIconName(pix);
00202 }
00203 
00204 KAction::KAction( QObject* parent, const char* name )
00205  : QObject( parent, name )
00206 {
00207     initPrivate( QString::null, KShortcut(), 0, 0 );
00208 }
00209 
00210 
00211 KAction::~KAction()
00212 {
00213     kdDebug(129) << "KAction::~KAction( this = \"" << name() << "\" )" << endl; 
00214 #ifndef KDE_NO_COMPAT
00215      if (d->m_kaccel)
00216        unplugAccel();
00217 #endif
00218 
00219     
00220     if ( m_parentCollection ) {
00221         m_parentCollection->take( this );
00222         for( uint i = 0; i < d->m_kaccelList.count(); i++ )
00223             d->m_kaccelList[i]->remove( name() );
00224     }
00225 
00226     
00227     
00228     
00229     
00230     
00231     
00232 
00233     delete d; d = 0;
00234 }
00235 
00236 void KAction::initPrivate( const QString& text, const KShortcut& cut,
00237                   const QObject* receiver, const char* slot )
00238 {
00239     d = new KActionPrivate;
00240 
00241     d->m_cutDefault = cut;
00242 
00243     m_parentCollection = dynamic_cast<KActionCollection *>( parent() );
00244     kdDebug(129) << "KAction::initPrivate(): this = " << this << " name = \"" << name() << "\" cut = " << cut.toStringInternal() << " m_parentCollection = " << m_parentCollection << endl;
00245     if ( m_parentCollection )
00246         m_parentCollection->insert( this );
00247 
00248     if ( receiver && slot )
00249         connect( this, SIGNAL( activated() ), receiver, slot );
00250 
00251     if( !cut.isNull() && qstrcmp( name(), "unnamed" ) == 0 )
00252         kdWarning(129) << "KAction::initPrivate(): trying to assign a shortcut (" << cut.toStringInternal() << ") to an unnamed action." << endl;
00253     d->setText( text );
00254     initShortcut( cut );
00255 }
00256 
00257 bool KAction::isPlugged() const
00258 {
00259   return (containerCount() > 0) || d->m_kaccel;
00260 }
00261 
00262 bool KAction::isPlugged( const QWidget *container ) const
00263 {
00264   return findContainer( container ) > -1;
00265 }
00266 
00267 bool KAction::isPlugged( const QWidget *container, int id ) const
00268 {
00269   int i = findContainer( container );
00270   return ( i > -1 && itemId( i ) == id );
00271 }
00272 
00273 bool KAction::isPlugged( const QWidget *container, const QWidget *_representative ) const
00274 {
00275   int i = findContainer( container );
00276   return ( i > -1 && representative( i ) == _representative );
00277 }
00278 
00279 
00280 
00281 
00282 
00283 
00284 
00285 
00286 
00287 
00288 
00289 
00290 
00291 
00292 
00293 
00294 
00295 
00296 
00297 
00298 
00299 
00300 
00301 
00302 
00303 
00304 
00305 
00306 
00307 
00308 
00309 
00310 
00311 
00312 
00313 
00314 
00315 
00316 
00317 
00318 
00319 
00320 
00321 
00322 
00323 
00324 
00325 
00326 
00327 
00328 
00329 
00330 
00331 
00332 
00333 
00334 
00335 
00336 
00337 
00338 
00339 
00340 
00341 
00342 
00343 
00344 
00345 
00346 
00347 
00348 
00349 
00350 KAccel* KAction::kaccelCurrent()
00351 {
00352   if( m_parentCollection && m_parentCollection->builderKAccel() )
00353     return m_parentCollection->builderKAccel();
00354   else if( m_parentCollection && m_parentCollection->kaccel() )
00355     return m_parentCollection->kaccel();
00356   else
00357     return 0L;
00358 }
00359 
00360 
00361 bool KAction::initShortcut( const KShortcut& cut )
00362 {
00363     d->m_cut = cut;
00364 
00365     
00366     if( qstrcmp( name(), "unnamed" ) != 0 &&
00367         m_parentCollection &&
00368         m_parentCollection->isAutoConnectShortcuts() &&
00369         m_parentCollection->kaccel() )
00370     {
00371         insertKAccel( m_parentCollection->kaccel() );
00372         return true;
00373     }
00374     return false;
00375  }
00376 
00377 
00378 void KAction::plugShortcut()
00379 {
00380   KAccel* kaccel = kaccelCurrent();
00381 
00382   
00383   if( kaccel && qstrcmp( name(), "unnamed" ) != 0 ) {
00384     
00385     for( uint i = 0; i < d->m_kaccelList.count(); i++ ) {
00386       if( d->m_kaccelList[i] == kaccel )
00387         return;
00388     }
00389 
00390     insertKAccel( kaccel );
00391   }
00392 }
00393 
00394 bool KAction::setShortcut( const KShortcut& cut )
00395 {
00396   bool bChanged = (d->m_cut != cut);
00397   d->m_cut = cut;
00398 
00399   KAccel* kaccel = kaccelCurrent();
00400   bool bInsertRequired = true;
00401   
00402   for( uint i = 0; i < d->m_kaccelList.count(); i++ ) {
00403     
00404     
00405     if( d->m_kaccelList[i] == kaccel )
00406       bInsertRequired = false;
00407     if( bChanged )
00408       updateKAccelShortcut( d->m_kaccelList[i] );
00409   }
00410 
00411   
00412   if( kaccel && bInsertRequired && qstrcmp( name(), "unnamed" ) )
00413     insertKAccel( kaccel );
00414 
00415   if( bChanged ) {
00416     
00417     if ( d->m_kaccel )
00418       d->m_kaccel->setShortcut( name(), cut );
00419     
00420       int len = containerCount();
00421       for( int i = 0; i < len; ++i )
00422           updateShortcut( i );
00423   }
00424   return true;
00425 }
00426 
00427 bool KAction::updateKAccelShortcut( KAccel* kaccel )
00428 {
00429   
00430   if (kapp && !kapp->authorizeKAction(name()))
00431     return false;
00432 
00433   bool b = true;
00434 
00435   if ( !kaccel->actions().actionPtr( name() ) ) {
00436     if(!d->m_cut.isNull() ) {
00437       kdDebug(129) << "Inserting " << name() << ", " << d->text() << ", " << d->plainText() << endl;
00438       b = kaccel->insert( name(), d->plainText(), QString::null,
00439           d->m_cut,
00440           this, SLOT(slotActivated()),
00441           isShortcutConfigurable(), isEnabled() );
00442     }
00443   }
00444   else
00445     b = kaccel->setShortcut( name(), d->m_cut );
00446 
00447   return b;
00448 }
00449 
00450 void KAction::insertKAccel( KAccel* kaccel )
00451 {
00452   
00453   if ( !kaccel->actions().actionPtr( name() ) ) {
00454     if( updateKAccelShortcut( kaccel ) ) {
00455       d->m_kaccelList.append( kaccel );
00456       connect( kaccel, SIGNAL(destroyed()), this, SLOT(slotDestroyed()) );
00457     }
00458   }
00459   else
00460     kdWarning(129) << "KAction::insertKAccel( kaccel = " << kaccel << " ): KAccel object already contains an action name \"" << name() << "\"" << endl; 
00461 }
00462 
00463 void KAction::removeKAccel( KAccel* kaccel )
00464 {
00465   
00466   for( uint i = 0; i < d->m_kaccelList.count(); i++ ) {
00467     if( d->m_kaccelList[i] == kaccel ) {
00468       kaccel->remove( name() );
00469       d->m_kaccelList.remove( d->m_kaccelList.at( i ) );
00470       disconnect( kaccel, SIGNAL(destroyed()), this, SLOT(slotDestroyed()) );
00471       break;
00472     }
00473   }
00474 }
00475 
00476 
00477 void KAction::setAccel( int keyQt )
00478 {
00479   setShortcut( KShortcut(keyQt) );
00480 }
00481 
00482 
00483 void KAction::updateShortcut( int i )
00484 {
00485   int id = itemId( i );
00486 
00487   QWidget* w = container( i );
00488   if ( w->inherits( "QPopupMenu" ) ) {
00489     QPopupMenu* menu = static_cast<QPopupMenu*>(w);
00490     updateShortcut( menu, id );
00491   }
00492   else if ( w->inherits( "QMenuBar" ) )
00493     static_cast<QMenuBar*>(w)->setAccel( d->m_cut.keyCodeQt(), id );
00494 }
00495 
00496 void KAction::updateShortcut( QPopupMenu* menu, int id )
00497 {
00498   
00499   
00500   
00501   if ( d->m_kaccel || d->m_kaccelList.count() ) {
00502     QString s = menu->text( id );
00503     int i = s.find( '\t' );
00504     if ( i >= 0 )
00505       s.replace( i+1, s.length()-i, d->m_cut.seq(0).toString() );
00506     else
00507       s += "\t" + d->m_cut.seq(0).toString();
00508 
00509     menu->changeItem( id, s );
00510   }
00511   
00512   else {
00513     
00514     
00515     menu->setAccel( d->m_cut.keyCodeQt(), id );
00516     kdWarning(129) << "KAction::updateShortcut(): name = \"" << name() << "\", cut = " << d->m_cut.toStringInternal() << "; No KAccel, probably missing a parent collection." << endl;
00517   }
00518 }
00519 
00520 const KShortcut& KAction::shortcut() const
00521 {
00522   return d->m_cut;
00523 }
00524 
00525 const KShortcut& KAction::shortcutDefault() const
00526 {
00527   return d->m_cutDefault;
00528 }
00529 
00530 QString KAction::shortcutText() const
00531 {
00532   return d->m_cut.toStringInternal();
00533 }
00534 
00535 void KAction::setShortcutText( const QString& s )
00536 {
00537   setShortcut( KShortcut(s) );
00538 }
00539 
00540 int KAction::accel() const
00541 {
00542   return d->m_cut.keyCodeQt();
00543 }
00544 
00545 void KAction::setGroup( const QString& grp )
00546 {
00547   d->m_group = grp;
00548 
00549   int len = containerCount();
00550   for( int i = 0; i < len; ++i )
00551     updateGroup( i );
00552 }
00553 
00554 void KAction::updateGroup( int )
00555 {
00556   
00557 }
00558 
00559 QString KAction::group() const
00560 {
00561   return d->m_group;
00562 }
00563 
00564 bool KAction::isEnabled() const
00565 {
00566   return d->isEnabled();
00567 }
00568 
00569 bool KAction::isShortcutConfigurable() const
00570 {
00571   return d->m_configurable;
00572 }
00573 
00574 void KAction::setToolTip( const QString& tt )
00575 {
00576   d->setToolTip( tt );
00577 
00578   int len = containerCount();
00579   for( int i = 0; i < len; ++i )
00580     updateToolTip( i );
00581 }
00582 
00583 void KAction::updateToolTip( int i )
00584 {
00585   QWidget *w = container( i );
00586 
00587   if ( w->inherits( "KToolBar" ) )
00588     QToolTip::add( static_cast<KToolBar*>(w)->getWidget( itemId( i ) ), d->toolTip() );
00589 }
00590 
00591 QString KAction::toolTip() const
00592 {
00593   return d->toolTip();
00594 }
00595 
00596 int KAction::plug( QWidget *w, int index )
00597 {
00598   
00599   if (w == 0) {
00600     kdWarning(129) << "KAction::plug called with 0 argument\n";
00601     return -1;
00602   }
00603 
00604 #ifndef NDEBUG
00605   KAccel* kaccel = kaccelCurrent();
00606   
00607   if( !d->m_cut.isNull() && kaccel == 0 ) {
00608     kdWarning(129) << "KAction::plug(): has no KAccel object; this = " << this << " name = " << name() << " parentCollection = " << m_parentCollection << endl; 
00609     kdDebug(129) << kdBacktrace() << endl;
00610   }
00611 #endif
00612 
00613   
00614   if (kapp && !kapp->authorizeKAction(name()))
00615     return -1;
00616 
00617   plugShortcut();
00618 
00619   if ( w->inherits("QPopupMenu") )
00620   {
00621     QPopupMenu* menu = static_cast<QPopupMenu*>( w );
00622     int id;
00623     
00624     int keyQt = (d->m_kaccelList.count() || d->m_kaccel) ? 0 : d->m_cut.keyCodeQt();
00625 
00626     if ( d->hasIcon() )
00627     {
00628         KInstance *instance;
00629         if ( m_parentCollection )
00630           instance = m_parentCollection->instance();
00631         else
00632           instance = KGlobal::instance();
00633         id = menu->insertItem( d->iconSet( KIcon::Small, 0, instance ), d->text(), this,
00634                                  SLOT( slotActivated() ), keyQt,
00635                                  -1, index );
00636     }
00637     else
00638         id = menu->insertItem( d->text(), this,
00639                                SLOT( slotActivated() ),  
00640                                keyQt, -1, index );
00641 
00642     
00643     
00644     if ( d->m_kaccelList.count() || d->m_kaccel )
00645         updateShortcut( menu, id );
00646 
00647     
00648     
00649     if ( !d->isEnabled() )
00650         menu->setItemEnabled( id, false );
00651 
00652     if ( !d->whatsThis().isEmpty() )
00653         menu->setWhatsThis( id, whatsThisWithIcon() );
00654 
00655     addContainer( menu, id );
00656     connect( menu, SIGNAL( destroyed() ), this, SLOT( slotDestroyed() ) );
00657 
00658     if ( m_parentCollection )
00659       m_parentCollection->connectHighlight( menu, this );
00660 
00661     return d->m_containers.count() - 1;
00662   }
00663   else if ( w->inherits( "KToolBar" ) )
00664   {
00665     KToolBar *bar = static_cast<KToolBar *>( w );
00666 
00667     int id_ = getToolButtonID();
00668     KInstance *instance;
00669     if ( m_parentCollection )
00670       instance = m_parentCollection->instance();
00671     else
00672       instance = KGlobal::instance();
00673 
00674     if ( icon().isEmpty() && !iconSet().pixmap().isNull() ) 
00675     {
00676         bar->insertButton( iconSet().pixmap(), id_, SIGNAL( clicked() ), this,
00677                            SLOT( slotActivated() ),
00678                            d->isEnabled(), d->plainText(), index );
00679     }
00680     else
00681     {
00682         QString icon = d->iconName();
00683         if ( icon.isEmpty() )
00684             icon = "unknown";
00685         bar->insertButton( icon, id_, SIGNAL( clicked() ), this,
00686                            SLOT( slotActivated() ),
00687                            d->isEnabled(), d->plainText(), index, instance );
00688     }
00689     bar->getButton( id_ )->setName( QCString("toolbutton_")+name() );
00690 
00691     if ( !d->whatsThis().isEmpty() )
00692         QWhatsThis::add( bar->getButton(id_), whatsThisWithIcon() );
00693 
00694     if ( !d->toolTip().isEmpty() )
00695       QToolTip::add( bar->getButton(id_), d->toolTip() );
00696 
00697     addContainer( bar, id_ );
00698 
00699     connect( bar, SIGNAL( destroyed() ), this, SLOT( slotDestroyed() ) );
00700 
00701     if ( m_parentCollection )
00702       m_parentCollection->connectHighlight( bar, this );
00703 
00704     return containerCount() - 1;
00705   }
00706 
00707   return -1;
00708 }
00709 
00710 void KAction::unplug( QWidget *w )
00711 {
00712   int i = findContainer( w );
00713   if ( i == -1 )
00714     return;
00715   int id = itemId( i );
00716 
00717   if ( w->inherits( "QPopupMenu" ) )
00718   {
00719     QPopupMenu *menu = static_cast<QPopupMenu *>( w );
00720     menu->removeItem( id );
00721   }
00722   else if ( w->inherits( "KToolBar" ) )
00723   {
00724     KToolBar *bar = static_cast<KToolBar *>( w );
00725     bar->removeItemDelayed( id );
00726   }
00727   else if ( w->inherits( "QMenuBar" ) )
00728   {
00729     QMenuBar *bar = static_cast<QMenuBar *>( w );
00730     bar->removeItem( id );
00731   }
00732 
00733   removeContainer( i );
00734   if ( m_parentCollection )
00735     m_parentCollection->disconnectHighlight( w, this );
00736 }
00737 
00738 void KAction::plugAccel(KAccel *kacc, bool configurable)
00739 {
00740   kdWarning(129) << "KAction::plugAccel(): call to deprecated action." << endl;
00741   kdDebug(129) << kdBacktrace() << endl;
00742   
00743   if ( d->m_kaccel )
00744     unplugAccel();
00745 
00746   
00747   
00748   
00749 
00750   
00751   
00752   if ( !kacc->actions().actionPtr(name()) )
00753   {
00754     d->m_kaccel = kacc;
00755     d->m_kaccel->insert(name(), d->plainText(), QString::null,
00756         KShortcut(d->m_cut),
00757         this, SLOT(slotActivated()),
00758         configurable, isEnabled());
00759     connect(d->m_kaccel, SIGNAL(destroyed()), this, SLOT(slotDestroyed()));
00760     
00761   }
00762   else
00763     kdWarning(129) << "KAction::plugAccel( kacc = " << kacc << " ): KAccel object already contains an action name \"" << name() << "\"" << endl; 
00764 }
00765 
00766 void KAction::unplugAccel()
00767 {
00768   
00769   if ( d->m_kaccel )
00770   {
00771     d->m_kaccel->remove(name());
00772     d->m_kaccel = 0;
00773   }
00774 }
00775 
00776 void KAction::plugMainWindowAccel( QWidget *w )
00777 {
00778   
00779   QWidget * tl = w;
00780   QWidget * n;
00781   while ( !tl->isDialog() && ( n = tl->parentWidget() ) ) 
00782     tl = n;
00783 
00784   KMainWindow * mw = dynamic_cast<KMainWindow *>(tl); 
00785   if (mw)
00786     plugAccel( mw->accel() );
00787   else
00788     kdDebug(129) << "KAction::plugMainWindowAccel: Toplevel widget isn't a KMainWindow, can't plug accel. " << tl << endl;
00789 }
00790 
00791 void KAction::setEnabled(bool enable)
00792 {
00793   
00794   if ( enable == d->isEnabled() )
00795     return;
00796 
00797   
00798   if (d->m_kaccel)
00799     d->m_kaccel->setEnabled(name(), enable);
00800   
00801 
00802   for ( uint i = 0; i < d->m_kaccelList.count(); i++ )
00803     d->m_kaccelList[i]->setEnabled( name(), enable );
00804 
00805   d->setEnabled( enable );
00806 
00807   int len = containerCount();
00808   for( int i = 0; i < len; ++i )
00809     updateEnabled( i );
00810 
00811   emit enabled( d->isEnabled() );
00812 }
00813 
00814 void KAction::updateEnabled( int i )
00815 {
00816     QWidget *w = container( i );
00817 
00818     if ( w->inherits("QPopupMenu") )
00819       static_cast<QPopupMenu*>(w)->setItemEnabled( itemId( i ), d->isEnabled() );
00820     else if ( w->inherits("QMenuBar") )
00821       static_cast<QMenuBar*>(w)->setItemEnabled( itemId( i ), d->isEnabled() );
00822     else if ( w->inherits( "KToolBar" ) )
00823       static_cast<KToolBar*>(w)->setItemEnabled( itemId( i ), d->isEnabled() );
00824 }
00825 
00826 void KAction::setShortcutConfigurable( bool b )
00827 {
00828     d->m_configurable = b;
00829 }
00830 
00831 void KAction::setText( const QString& text )
00832 {
00833   
00834   if (d->m_kaccel) {
00835     KAccelAction* pAction = d->m_kaccel->actions().actionPtr(name());
00836     if (pAction)
00837       pAction->setLabel( text );
00838   }
00839   
00840 
00841   for( uint i = 0; i < d->m_kaccelList.count(); i++ ) {
00842     KAccelAction* pAction = d->m_kaccelList[i]->actions().actionPtr(name());
00843     if (pAction)
00844       pAction->setLabel( text );
00845   }
00846 
00847   d->setText( text );
00848 
00849   int len = containerCount();
00850   for( int i = 0; i < len; ++i )
00851     updateText( i );
00852 }
00853 
00854 void KAction::updateText( int i )
00855 {
00856   QWidget *w = container( i );
00857 
00858   if ( w->inherits( "QPopupMenu" ) ) {
00859     int id = itemId( i );
00860     static_cast<QPopupMenu*>(w)->changeItem( id, d->text() );
00861     updateShortcut( static_cast<QPopupMenu*>(w), id );
00862   }
00863   else if ( w->inherits( "QMenuBar" ) )
00864     static_cast<QMenuBar*>(w)->changeItem( itemId( i ), d->text() );
00865   else if ( w->inherits( "KToolBar" ) )
00866   {
00867     QWidget *button = static_cast<KToolBar *>(w)->getWidget( itemId( i ) );
00868     if ( button->inherits( "KToolBarButton" ) )
00869       static_cast<KToolBarButton *>(button)->setText( d->plainText() );
00870   }
00871 }
00872 
00873 QString KAction::text() const
00874 {
00875   return d->text();
00876 }
00877 
00878 QString KAction::plainText() const
00879 {
00880   return d->plainText( );
00881 }
00882 
00883 void KAction::setIcon( const QString &icon )
00884 {
00885   d->setIconName( icon );
00886 
00887   
00888   int len = containerCount();
00889   for ( int i = 0; i < len; ++i )
00890     updateIcon( i );
00891 }
00892 
00893 void KAction::updateIcon( int id )
00894 {
00895   QWidget* w = container( id );
00896 
00897   if ( w->inherits( "QPopupMenu" ) ) {
00898     int itemId_ = itemId( id );
00899     static_cast<QPopupMenu*>(w)->changeItem( itemId_, d->iconSet( KIcon::Small ), d->text() );
00900     updateShortcut( static_cast<QPopupMenu*>(w), itemId_ );
00901   }
00902   else if ( w->inherits( "QMenuBar" ) )
00903     static_cast<QMenuBar*>(w)->changeItem( itemId( id ), d->iconSet( KIcon::Small ), d->text() );
00904   else if ( w->inherits( "KToolBar" ) )
00905     static_cast<KToolBar *>(w)->setButtonIcon( itemId( id ), d->iconName() );
00906 }
00907 
00908 QString KAction::icon() const
00909 {
00910   return d->iconName( );
00911 }
00912 
00913 void KAction::setIconSet( const QIconSet &iconset )
00914 {
00915   d->setIconSet( iconset );
00916 
00917   int len = containerCount();
00918   for( int i = 0; i < len; ++i )
00919     updateIconSet( i );
00920 }
00921 
00922 
00923 void KAction::updateIconSet( int id )
00924 {
00925   QWidget *w = container( id );
00926 
00927   if ( w->inherits( "QPopupMenu" ) )
00928   {
00929     int itemId_ = itemId( id );
00930     static_cast<QPopupMenu*>(w)->changeItem( itemId_, d->iconSet(), d->text() );
00931     updateShortcut( static_cast<QPopupMenu*>(w), itemId_ );
00932   }
00933   else if ( w->inherits( "QMenuBar" ) )
00934     static_cast<QMenuBar*>(w)->changeItem( itemId( id ), d->iconSet(), d->text() );
00935   else if ( w->inherits( "KToolBar" ) )
00936   {
00937     if ( icon().isEmpty() && d->hasIconSet() ) 
00938       static_cast<KToolBar *>(w)->setButtonIconSet( itemId( id ), d->iconSet() );
00939     else
00940       static_cast<KToolBar *>(w)->setButtonIconSet( itemId( id ), d->iconSet( KIcon::Small ) );
00941   }
00942 }
00943 
00944 QIconSet KAction::iconSet( KIcon::Group group, int size ) const
00945 {
00946     return d->iconSet( group, size );
00947 }
00948 
00949 bool KAction::hasIcon() const
00950 {
00951   return d->hasIcon();
00952 }
00953 
00954 void KAction::setWhatsThis( const QString& text )
00955 {
00956   d->setWhatsThis(  text );
00957 
00958   int len = containerCount();
00959   for( int i = 0; i < len; ++i )
00960     updateWhatsThis( i );
00961 }
00962 
00963 void KAction::updateWhatsThis( int i )
00964 {
00965   QPopupMenu* pm = popupMenu( i );
00966   if ( pm )
00967   {
00968     pm->setWhatsThis( itemId( i ), d->whatsThis() );
00969     return;
00970   }
00971 
00972   KToolBar *tb = toolBar( i );
00973   if ( tb )
00974   {
00975     QWidget *w = tb->getButton( itemId( i ) );
00976     QWhatsThis::remove( w );
00977     QWhatsThis::add( w, d->whatsThis() );
00978     return;
00979   }
00980 }
00981 
00982 QString KAction::whatsThis() const
00983 {
00984   return d->whatsThis();
00985 }
00986 
00987 QString KAction::whatsThisWithIcon() const
00988 {
00989     QString text = whatsThis();
00990     if (!d->iconName().isEmpty())
00991       return QString::fromLatin1("<img source=\"small|%1\"> %2").arg(d->iconName() ).arg(text);
00992     return text;
00993 }
00994 
00995 QWidget* KAction::container( int index ) const
00996 {
00997   assert( index < containerCount() );
00998   return d->m_containers[ index ].m_container;
00999 }
01000 
01001 KToolBar* KAction::toolBar( int index ) const
01002 {
01003     return dynamic_cast<KToolBar *>( d->m_containers[ index ].m_container );
01004 }
01005 
01006 QPopupMenu* KAction::popupMenu( int index ) const
01007 {
01008     return dynamic_cast<QPopupMenu *>( d->m_containers[ index ].m_container );
01009 }
01010 
01011 QWidget* KAction::representative( int index ) const
01012 {
01013   return d->m_containers[ index ].m_representative;
01014 }
01015 
01016 int KAction::itemId( int index ) const
01017 {
01018   return d->m_containers[ index ].m_id;
01019 }
01020 
01021 int KAction::containerCount() const
01022 {
01023   return d->m_containers.count();
01024 }
01025 
01026 uint KAction::kaccelCount() const
01027 {
01028   return d->m_kaccelList.count();
01029 }
01030 
01031 void KAction::addContainer( QWidget* c, int id )
01032 {
01033   KActionPrivate::Container p;
01034   p.m_container = c;
01035   p.m_id = id;
01036   d->m_containers.append( p );
01037 }
01038 
01039 void KAction::addContainer( QWidget* c, QWidget* w )
01040 {
01041   KActionPrivate::Container p;
01042   p.m_container = c;
01043   p.m_representative = w;
01044   d->m_containers.append( p );
01045 }
01046 
01047 void KAction::activate()
01048 {
01049   slotActivated();
01050 }
01051 
01052 void KAction::slotActivated()
01053 {
01054   emit activated();
01055 }
01056 
01057 void KAction::slotDestroyed()
01058 {
01059   kdDebug(129) << "KAction::slotDestroyed(): this = " << this << ", name = \"" << name() << "\", sender = " << sender() << endl;
01060   const QObject* o = sender();
01061 
01062   
01063   if ( o == d->m_kaccel )
01064   {
01065     d->m_kaccel = 0;
01066     return;
01067   }
01068   
01069 
01070   for( uint i = 0; i < d->m_kaccelList.count(); i++ )
01071   {
01072     if ( o == d->m_kaccelList[i] )
01073     {
01074       disconnect( d->m_kaccelList[i], SIGNAL(destroyed()), this, SLOT(slotDestroyed()) );
01075       d->m_kaccelList.remove( d->m_kaccelList.at( i ) );
01076       return;
01077     }
01078   }
01079 
01080   int i;
01081   do
01082   {
01083     i = findContainer( static_cast<const QWidget*>( o ) );
01084     if ( i != -1 )
01085       removeContainer( i );
01086   } while ( i != -1 );
01087 }
01088 
01089 int KAction::findContainer( const QWidget* widget ) const
01090 {
01091   int pos = 0;
01092   QValueList<KActionPrivate::Container>::ConstIterator it = d->m_containers.begin();
01093   while( it != d->m_containers.end() )
01094   {
01095     if ( (*it).m_representative == widget || (*it).m_container == widget )
01096       return pos;
01097     ++it;
01098     ++pos;
01099   }
01100 
01101   return -1;
01102 }
01103 
01104 void KAction::removeContainer( int index )
01105 {
01106   int i = 0;
01107   QValueList<KActionPrivate::Container>::Iterator it = d->m_containers.begin();
01108   while( it != d->m_containers.end() )
01109   {
01110     if ( i == index )
01111     {
01112       d->m_containers.remove( it );
01113       return;
01114     }
01115     ++it;
01116     ++i;
01117   }
01118 }
01119 
01120 
01121 void KAction::slotKeycodeChanged()
01122 {
01123   kdDebug(129) << "KAction::slotKeycodeChanged()" << endl; 
01124   KAccelAction* pAction = d->m_kaccel->actions().actionPtr(name());
01125   if( pAction )
01126     setShortcut(pAction->shortcut());
01127 }
01128 
01129 KActionCollection *KAction::parentCollection() const
01130 {
01131     return m_parentCollection;
01132 }
01133 
01134 void KAction::unplugAll()
01135 {
01136   while ( containerCount() != 0 )
01137     unplug( container( 0 ) );
01138 }
01139 
01140 void KAction::virtual_hook( int, void* )
01141 {  }
01142 
01143 
01144 
01145 
01146 #include "kaction.moc"