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"