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 "tdeaction.h"
00027
00028 #include <assert.h>
00029
00030 #include <tqtooltip.h>
00031 #include <tqwhatsthis.h>
00032
00033 #include <tdeaccel.h>
00034 #include <tdeaccelbase.h>
00035 #include <tdeaccelprivate.h>
00036 #include <tdeapplication.h>
00037 #include <kdebug.h>
00038 #include <kguiitem.h>
00039 #include <tdemainwindow.h>
00040 #include <tdemenubar.h>
00041 #include <tdepopupmenu.h>
00042 #include <tdetoolbar.h>
00043 #include <tdetoolbarbutton.h>
00044
00045 #include <ft2build.h>
00046 #include <X11/Xdefs.h>
00047 #include <X11/Xlib.h>
00048 #include <X11/Xatom.h>
00049 #include <X11/Intrinsic.h>
00050 #include <X11/StringDefs.h>
00051 #include <X11/Shell.h>
00052
00053 #include <X11/Xft/Xft.h>
00054
00076 int TDEAction::getToolButtonID()
00077 {
00078 static int toolbutton_no = -2;
00079 return toolbutton_no--;
00080 }
00081
00082
00083
00084
00085
00086 class TDEAction::TDEActionPrivate : public KGuiItem
00087 {
00088 public:
00089 TDEActionPrivate() : KGuiItem()
00090 {
00091 m_tdeaccel = 0;
00092 m_configurable = true;
00093 }
00094
00095 TDEAccel *m_tdeaccel;
00096 TQValueList<TDEAccel*> m_tdeaccelList;
00097
00098 TQString m_groupText;
00099 TQString m_group;
00100
00101 TDEShortcut m_cut;
00102 TDEShortcut m_cutDefault;
00103
00104 bool m_configurable;
00105
00106 struct Container
00107 {
00108 Container() { m_container = 0; m_representative = 0; m_id = 0; }
00109 Container( const Container& s ) { m_container = s.m_container;
00110 m_id = s.m_id; m_representative = s.m_representative; }
00111 TQWidget* m_container;
00112 int m_id;
00113 TQWidget* m_representative;
00114 };
00115
00116 TQValueList<Container> m_containers;
00117 };
00118
00119
00120
00121
00122
00123 TDEAction::TDEAction( const TQString& text, const TDEShortcut& cut,
00124 const TQObject* receiver, const char* slot,
00125 TDEActionCollection* parent, const char* name )
00126 : TQObject( parent, name ), d(new TDEActionPrivate)
00127 {
00128 initPrivate( text, cut, receiver, slot );
00129 }
00130
00131 TDEAction::TDEAction( const TQString& text, const TQString& sIconName, const TDEShortcut& cut,
00132 const TQObject* receiver, const char* slot,
00133 TDEActionCollection* parent, const char* name )
00134 : TQObject( parent, name ), d(new TDEActionPrivate)
00135 {
00136 initPrivate( text, cut, receiver, slot );
00137 d->setIconName( sIconName );
00138 }
00139
00140 TDEAction::TDEAction( const TQString& text, const TQIconSet& pix, const TDEShortcut& cut,
00141 const TQObject* receiver, const char* slot,
00142 TDEActionCollection* parent, const char* name )
00143 : TQObject( parent, name ), d(new TDEActionPrivate)
00144 {
00145 initPrivate( text, cut, receiver, slot );
00146 d->setIconSet( pix );
00147 }
00148
00149 TDEAction::TDEAction( const KGuiItem& item, const TDEShortcut& cut,
00150 const TQObject* receiver, const char* slot,
00151 TDEActionCollection* parent, const char* name )
00152 : TQObject( parent, name ), d(new TDEActionPrivate)
00153 {
00154 initPrivate( item.text(), cut, receiver, slot );
00155 if( item.hasIcon() )
00156 setIcon( item.iconName() );
00157 setToolTip( item.toolTip() );
00158 setWhatsThis( item.whatsThis() );
00159 }
00160
00161 #ifndef KDE_NO_COMPAT // KDE 4: remove
00162 TDEAction::TDEAction( const TQString& text, const TDEShortcut& cut,
00163 TQObject* parent, const char* name )
00164 : TQObject( parent, name ), d(new TDEActionPrivate)
00165 {
00166 initPrivate( text, cut, 0, 0 );
00167 }
00168
00169 TDEAction::TDEAction( const TQString& text, const TDEShortcut& cut,
00170 const TQObject* receiver,
00171 const char* slot, TQObject* parent, const char* name )
00172 : TQObject( parent, name ), d(new TDEActionPrivate)
00173 {
00174 initPrivate( text, cut, receiver, slot );
00175 }
00176
00177 TDEAction::TDEAction( const TQString& text, const TQIconSet& pix,
00178 const TDEShortcut& cut,
00179 TQObject* parent, const char* name )
00180 : TQObject( parent, name ), d(new TDEActionPrivate)
00181 {
00182 initPrivate( text, cut, 0, 0 );
00183 setIconSet( pix );
00184 }
00185
00186 TDEAction::TDEAction( const TQString& text, const TQString& pix,
00187 const TDEShortcut& cut,
00188 TQObject* parent, const char* name )
00189 : TQObject( parent, name ), d(new TDEActionPrivate)
00190 {
00191 initPrivate( text, cut, 0, 0 );
00192 d->setIconName( pix );
00193 }
00194
00195 TDEAction::TDEAction( const TQString& text, const TQIconSet& pix,
00196 const TDEShortcut& cut,
00197 const TQObject* receiver, const char* slot, TQObject* parent,
00198 const char* name )
00199 : TQObject( parent, name ), d(new TDEActionPrivate)
00200 {
00201 initPrivate( text, cut, receiver, slot );
00202 setIconSet( pix );
00203 }
00204
00205 TDEAction::TDEAction( const TQString& text, const TQString& pix,
00206 const TDEShortcut& cut,
00207 const TQObject* receiver, const char* slot, TQObject* parent,
00208 const char* name )
00209 : TQObject( parent, name ), d(new TDEActionPrivate)
00210 {
00211 initPrivate( text, cut, receiver, slot );
00212 d->setIconName(pix);
00213 }
00214
00215 TDEAction::TDEAction( TQObject* parent, const char* name )
00216 : TQObject( parent, name ), d(new TDEActionPrivate)
00217 {
00218 initPrivate( TQString::null, TDEShortcut(), 0, 0 );
00219 }
00220 #endif // KDE 4: remove end
00221
00222 TDEAction::~TDEAction()
00223 {
00224 kdDebug(129) << "TDEAction::~TDEAction( this = \"" << name() << "\" )" << endl;
00225 #ifndef KDE_NO_COMPAT
00226 if (d->m_tdeaccel)
00227 unplugAccel();
00228 #endif
00229
00230
00231 if ( m_parentCollection ) {
00232 m_parentCollection->take( this );
00233
00234 const TQValueList<TDEAccel*> & accelList = d->m_tdeaccelList;
00235 TQValueList<TDEAccel*>::const_iterator itr = accelList.constBegin();
00236 const TQValueList<TDEAccel*>::const_iterator itrEnd = accelList.constEnd();
00237
00238 const char * const namePtr = name();
00239 for (; itr != itrEnd; ++itr )
00240 (*itr)->remove(namePtr);
00241
00242 }
00243
00244
00245
00246
00247
00248
00249
00250
00251 delete d;
00252 }
00253
00254 void TDEAction::initPrivate( const TQString& text, const TDEShortcut& cut,
00255 const TQObject* receiver, const char* slot )
00256 {
00257 d->m_cutDefault = cut;
00258
00259 m_parentCollection = tqt_dynamic_cast<TDEActionCollection *>( parent() );
00260 kdDebug(129) << "TDEAction::initPrivate(): this = " << this << " name = \"" << name() << "\" cut = " << cut.toStringInternal() << " m_parentCollection = " << m_parentCollection << endl;
00261 if ( m_parentCollection )
00262 m_parentCollection->insert( this );
00263
00264 if ( receiver && slot )
00265 connect( this, TQT_SIGNAL( activated() ), receiver, slot );
00266
00267 if( !cut.isNull() && !qstrcmp( name(), "unnamed" ) )
00268 kdWarning(129) << "TDEAction::initPrivate(): trying to assign a shortcut (" << cut.toStringInternal() << ") to an unnamed action." << endl;
00269 d->setText( text );
00270 initShortcut( cut );
00271 }
00272
00273 bool TDEAction::isPlugged() const
00274 {
00275 return (!d->m_containers.empty()) || d->m_tdeaccel;
00276 }
00277
00278 bool TDEAction::isPlugged( const TQWidget *container ) const
00279 {
00280 return findContainer( container ) > -1;
00281 }
00282
00283 bool TDEAction::isPlugged( const TQWidget *container, int id ) const
00284 {
00285 int i = findContainer( container );
00286 return ( i > -1 && itemId( i ) == id );
00287 }
00288
00289 bool TDEAction::isPlugged( const TQWidget *container, const TQWidget *_representative ) const
00290 {
00291 int i = findContainer( container );
00292 return ( i > -1 && representative( i ) == _representative );
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
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366 TDEAccel* TDEAction::tdeaccelCurrent()
00367 {
00368 if( m_parentCollection && m_parentCollection->builderTDEAccel() )
00369 return m_parentCollection->builderTDEAccel();
00370 else if( m_parentCollection && m_parentCollection->tdeaccel() )
00371 return m_parentCollection->tdeaccel();
00372 else
00373 return 0L;
00374 }
00375
00376
00377 bool TDEAction::initShortcut( const TDEShortcut& cut )
00378 {
00379 d->m_cut = cut;
00380
00381
00382 if( qstrcmp( name(), "unnamed" ) &&
00383 m_parentCollection &&
00384 m_parentCollection->isAutoConnectShortcuts() &&
00385 m_parentCollection->tdeaccel() )
00386 {
00387 insertTDEAccel( m_parentCollection->tdeaccel() );
00388 return true;
00389 }
00390 return false;
00391 }
00392
00393
00394 void TDEAction::plugShortcut()
00395 {
00396 TDEAccel* const tdeaccel = tdeaccelCurrent();
00397
00398
00399 if( tdeaccel && qstrcmp( name(), "unnamed" ) ) {
00400
00401 const TQValueList<TDEAccel*> & accelList = d->m_tdeaccelList;
00402 TQValueList<TDEAccel*>::const_iterator itr = accelList.constBegin();
00403 const TQValueList<TDEAccel*>::const_iterator itrEnd = accelList.constEnd();
00404
00405 for( ; itr != itrEnd; ++itr) {
00406 if( (*itr) == tdeaccel )
00407 return;
00408 }
00409
00410 insertTDEAccel( tdeaccel );
00411 }
00412 }
00413
00414 bool TDEAction::setShortcut( const TDEShortcut& cut )
00415 {
00416 bool bChanged = (d->m_cut != cut);
00417 d->m_cut = cut;
00418
00419 TDEAccel* const tdeaccel = tdeaccelCurrent();
00420 bool bInsertRequired = true;
00421
00422
00423 const TQValueList<TDEAccel*> & accelList = d->m_tdeaccelList;
00424 TQValueList<TDEAccel*>::const_iterator itr = accelList.constBegin();
00425 const TQValueList<TDEAccel*>::const_iterator itrEnd = accelList.constEnd();
00426
00427 for( ; itr != itrEnd; ++itr) {
00428
00429
00430 if( (*itr) == tdeaccel )
00431 bInsertRequired = false;
00432 if( bChanged )
00433 updateTDEAccelShortcut( *itr );
00434 }
00435
00436
00437 if( tdeaccel && bInsertRequired && qstrcmp( name(), "unnamed" ) )
00438 insertTDEAccel( tdeaccel );
00439
00440 if( bChanged ) {
00441 #ifndef KDE_NO_COMPAT // KDE 4: remove
00442 if ( d->m_tdeaccel )
00443 d->m_tdeaccel->setShortcut( name(), cut );
00444 #endif // KDE 4: remove end
00445 int len = containerCount();
00446 for( int i = 0; i < len; ++i )
00447 updateShortcut( i );
00448 }
00449 return true;
00450 }
00451
00452 bool TDEAction::updateTDEAccelShortcut( TDEAccel* tdeaccel )
00453 {
00454
00455 if (kapp && !kapp->authorizeTDEAction(name()))
00456 return false;
00457
00458 bool b = true;
00459
00460 if ( !tdeaccel->actions().actionPtr( name() ) ) {
00461 if(!d->m_cut.isNull() ) {
00462 kdDebug(129) << "Inserting " << name() << ", " << d->text() << ", " << d->plainText() << endl;
00463 b = tdeaccel->insert( name(), d->plainText(), TQString::null,
00464 d->m_cut,
00465 this, TQT_SLOT(slotActivated()),
00466 isShortcutConfigurable(), isEnabled() );
00467 }
00468 }
00469 else
00470 b = tdeaccel->setShortcut( name(), d->m_cut );
00471
00472 return b;
00473 }
00474
00475 void TDEAction::insertTDEAccel( TDEAccel* tdeaccel )
00476 {
00477
00478 if ( !tdeaccel->actions().actionPtr( name() ) ) {
00479 if( updateTDEAccelShortcut( tdeaccel ) ) {
00480 d->m_tdeaccelList.append( tdeaccel );
00481 connect( tdeaccel, TQT_SIGNAL(destroyed()), this, TQT_SLOT(slotDestroyed()) );
00482 }
00483 }
00484 else
00485 kdWarning(129) << "TDEAction::insertTDEAccel( tdeaccel = " << tdeaccel << " ): TDEAccel object already contains an action name \"" << name() << "\"" << endl;
00486 }
00487
00488 void TDEAction::removeTDEAccel( TDEAccel* tdeaccel )
00489 {
00490
00491 TQValueList<TDEAccel*> & accelList = d->m_tdeaccelList;
00492 TQValueList<TDEAccel*>::iterator itr = accelList.begin();
00493 const TQValueList<TDEAccel*>::iterator itrEnd = accelList.end();
00494
00495 for( ; itr != itrEnd; ++itr) {
00496 if( (*itr) == tdeaccel ) {
00497 tdeaccel->remove( name() );
00498 accelList.remove( itr );
00499 disconnect( tdeaccel, TQT_SIGNAL(destroyed()), this, TQT_SLOT(slotDestroyed()) );
00500 break;
00501 }
00502 }
00503 }
00504
00505 #ifndef KDE_NO_COMPAT
00506
00507 void TDEAction::setAccel( int keyQt )
00508 {
00509 setShortcut( TDEShortcut(keyQt) );
00510 }
00511 #endif // KDE 4: remove end
00512
00513 void TDEAction::updateShortcut( int i )
00514 {
00515 int id = itemId( i );
00516
00517 TQWidget* w = container( i );
00518 if ( ::tqqt_cast<TQPopupMenu *>( w ) ) {
00519 TQPopupMenu* menu = static_cast<TQPopupMenu*>(w);
00520 updateShortcut( menu, id );
00521 }
00522 else if ( ::tqqt_cast<TQMenuBar *>( w ) )
00523 static_cast<TQMenuBar*>(w)->setAccel( d->m_cut.keyCodeQt(), id );
00524 }
00525
00526 void TDEAction::updateShortcut( TQPopupMenu* menu, int id )
00527 {
00528
00529
00530
00531 if ( d->m_tdeaccel || d->m_tdeaccelList.count() ) {
00532 TQString s = menu->text( id );
00533 int i = s.find( '\t' );
00534 if ( i >= 0 )
00535 s.replace( i+1, s.length()-i, d->m_cut.seq(0).toString() );
00536 else
00537 s += "\t" + d->m_cut.seq(0).toString();
00538
00539 menu->changeItem( id, s );
00540 }
00541
00542 else {
00543
00544
00545 menu->setAccel( d->m_cut.keyCodeQt(), id );
00546 kdDebug(129) << "TDEAction::updateShortcut(): name = \"" << name() << "\", cut = " << d->m_cut.toStringInternal() << "; No TDEAccel, probably missing a parent collection." << endl;
00547 }
00548 }
00549
00550 const TDEShortcut& TDEAction::shortcut() const
00551 {
00552 return d->m_cut;
00553 }
00554
00555 const TDEShortcut& TDEAction::shortcutDefault() const
00556 {
00557 return d->m_cutDefault;
00558 }
00559
00560 TQString TDEAction::shortcutText() const
00561 {
00562 return d->m_cut.toStringInternal();
00563 }
00564
00565 void TDEAction::setShortcutText( const TQString& s )
00566 {
00567 setShortcut( TDEShortcut(s) );
00568 }
00569
00570 #ifndef KDE_NO_COMPAT // Remove in KDE 4
00571 int TDEAction::accel() const
00572 {
00573 return d->m_cut.keyCodeQt();
00574 }
00575 #endif
00576
00577 void TDEAction::setGroup( const TQString& grp )
00578 {
00579 d->m_group = grp;
00580
00581 int len = containerCount();
00582 for( int i = 0; i < len; ++i )
00583 updateGroup( i );
00584 }
00585
00586 void TDEAction::updateGroup( int )
00587 {
00588
00589 }
00590
00591 TQString TDEAction::group() const
00592 {
00593 return d->m_group;
00594 }
00595
00596 bool TDEAction::isEnabled() const
00597 {
00598 return d->isEnabled();
00599 }
00600
00601 bool TDEAction::isShortcutConfigurable() const
00602 {
00603 return d->m_configurable;
00604 }
00605
00606 void TDEAction::setToolTip( const TQString& tt )
00607 {
00608 d->setToolTip( tt );
00609
00610 int len = containerCount();
00611 for( int i = 0; i < len; ++i )
00612 updateToolTip( i );
00613 }
00614
00615 void TDEAction::updateToolTip( int i )
00616 {
00617 TQWidget *w = container( i );
00618
00619 if ( ::tqqt_cast<TDEToolBar *>( w ) )
00620 TQToolTip::add( static_cast<TDEToolBar*>(w)->getWidget( itemId( i ) ), d->toolTip() );
00621 }
00622
00623 TQString TDEAction::toolTip() const
00624 {
00625 return d->toolTip();
00626 }
00627
00628 int TDEAction::plug( TQWidget *w, int index )
00629 {
00630
00631 if (!w ) {
00632 kdWarning(129) << "TDEAction::plug called with 0 argument\n";
00633 return -1;
00634 }
00635
00636
00637
00638
00639 #if 0 //ndef NDEBUG
00640 TDEAccel* tdeaccel = tdeaccelCurrent();
00641 if( !d->m_cut.isNull() && !tdeaccel ) {
00642 kdDebug(129) << "TDEAction::plug(): has no TDEAccel object; this = " << this << " name = " << name() << " parentCollection = " << m_parentCollection << endl;
00643 }
00644 #endif
00645
00646
00647 if (kapp && !kapp->authorizeTDEAction(name()))
00648 return -1;
00649
00650 plugShortcut();
00651
00652 if ( ::tqqt_cast<TQPopupMenu *>( w ) )
00653 {
00654 TQPopupMenu* menu = static_cast<TQPopupMenu*>( w );
00655 int id;
00656
00657 int keyQt = (d->m_tdeaccelList.count() || d->m_tdeaccel) ? 0 : d->m_cut.keyCodeQt();
00658
00659 if ( d->hasIcon() )
00660 {
00661 TDEInstance *instance;
00662 if ( m_parentCollection )
00663 instance = m_parentCollection->instance();
00664 else
00665 instance = TDEGlobal::instance();
00666 id = menu->insertItem( d->iconSet( TDEIcon::Small, 0, instance ), d->text(), this,
00667 TQT_SLOT( slotPopupActivated() ), keyQt,
00668 -1, index );
00669 }
00670 else
00671 id = menu->insertItem( d->text(), this,
00672 TQT_SLOT( slotPopupActivated() ),
00673 keyQt, -1, index );
00674
00675
00676
00677 if ( d->m_tdeaccelList.count() || d->m_tdeaccel )
00678 updateShortcut( menu, id );
00679
00680
00681
00682 if ( !d->isEnabled() )
00683 menu->setItemEnabled( id, false );
00684
00685 if ( !d->whatsThis().isEmpty() )
00686 menu->TQMenuData::setWhatsThis( id, whatsThisWithIcon() );
00687
00688 addContainer( menu, id );
00689 connect( menu, TQT_SIGNAL( destroyed() ), this, TQT_SLOT( slotDestroyed() ) );
00690
00691 if ( m_parentCollection )
00692 m_parentCollection->connectHighlight( menu, this );
00693
00694 return d->m_containers.count() - 1;
00695 }
00696 else if ( ::tqqt_cast<TDEToolBar *>( w ) )
00697 {
00698 TDEToolBar *bar = static_cast<TDEToolBar *>( w );
00699
00700 int id_ = getToolButtonID();
00701 TDEInstance *instance;
00702 if ( m_parentCollection )
00703 instance = m_parentCollection->instance();
00704 else
00705 instance = TDEGlobal::instance();
00706
00707 if ( icon().isEmpty() && !iconSet().pixmap().isNull() )
00708 {
00709 bar->insertButton( iconSet().pixmap(), id_, TQT_SIGNAL( buttonClicked(int, TQt::ButtonState) ), this,
00710 TQT_SLOT( slotButtonClicked(int, TQt::ButtonState) ),
00711 d->isEnabled(), d->plainText(), index );
00712 }
00713 else
00714 {
00715 TQString icon = d->iconName();
00716 if ( icon.isEmpty() )
00717 icon = "unknown";
00718 bar->insertButton( icon, id_, TQT_SIGNAL( buttonClicked(int, TQt::ButtonState) ), this,
00719 TQT_SLOT( slotButtonClicked(int, TQt::ButtonState) ),
00720 d->isEnabled(), d->plainText(), index, instance );
00721 }
00722
00723 TDEToolBarButton* ktb = bar->getButton(id_);
00724 ktb->setName( TQCString("toolbutton_")+name() );
00725
00726 if ( !d->whatsThis().isEmpty() )
00727 TQWhatsThis::add( bar->getButton(id_), whatsThisWithIcon() );
00728
00729 if ( !d->toolTip().isEmpty() )
00730 TQToolTip::add( bar->getButton(id_), d->toolTip() );
00731
00732 addContainer( bar, id_ );
00733
00734 connect( bar, TQT_SIGNAL( destroyed() ), this, TQT_SLOT( slotDestroyed() ) );
00735
00736 if ( m_parentCollection )
00737 m_parentCollection->connectHighlight( bar, this );
00738
00739 return containerCount() - 1;
00740 }
00741
00742 return -1;
00743 }
00744
00745 void TDEAction::unplug( TQWidget *w )
00746 {
00747 int i = findContainer( w );
00748 if ( i == -1 )
00749 return;
00750 int id = itemId( i );
00751
00752 if ( ::tqqt_cast<TQPopupMenu *>( w ) )
00753 {
00754 TQPopupMenu *menu = static_cast<TQPopupMenu *>( w );
00755 menu->removeItem( id );
00756 }
00757 else if ( ::tqqt_cast<TDEToolBar *>( w ) )
00758 {
00759 TDEToolBar *bar = static_cast<TDEToolBar *>( w );
00760 bar->removeItemDelayed( id );
00761 }
00762 else if ( ::tqqt_cast<TQMenuBar *>( w ) )
00763 {
00764 TQMenuBar *bar = static_cast<TQMenuBar *>( w );
00765 bar->removeItem( id );
00766 }
00767
00768 removeContainer( i );
00769 if ( m_parentCollection )
00770 m_parentCollection->disconnectHighlight( w, this );
00771 }
00772
00773 void TDEAction::plugAccel(TDEAccel *kacc, bool configurable)
00774 {
00775 #if 0 //ndef NDEBUG
00776 kdWarning(129) << "TDEAction::plugAccel(): call to deprecated action." << endl;
00777 kdDebug(129) << kdBacktrace() << endl;
00778
00779 #endif
00780 if ( d->m_tdeaccel )
00781 unplugAccel();
00782
00783
00784
00785
00786
00787
00788
00789 if ( !kacc->actions().actionPtr(name()) )
00790 {
00791 d->m_tdeaccel = kacc;
00792 d->m_tdeaccel->insert(name(), d->plainText(), TQString::null,
00793 TDEShortcut(d->m_cut),
00794 this, TQT_SLOT(slotActivated()),
00795 configurable, isEnabled());
00796 connect(d->m_tdeaccel, TQT_SIGNAL(destroyed()), this, TQT_SLOT(slotDestroyed()));
00797
00798 }
00799 else
00800 {
00801 #if 0 //ndef NDEBUG
00802 kdWarning(129) << "TDEAction::plugAccel( kacc = " << kacc << " ): TDEAccel object already contains an action name \"" << name() << "\"" << endl;
00803 #endif
00804 }
00805 }
00806
00807 void TDEAction::unplugAccel()
00808 {
00809
00810 if ( d->m_tdeaccel )
00811 {
00812 d->m_tdeaccel->remove(name());
00813 d->m_tdeaccel = 0;
00814 }
00815 }
00816
00817 void TDEAction::plugMainWindowAccel( TQWidget *w )
00818 {
00819
00820 TQWidget * tl = w;
00821 TQWidget * n;
00822 while ( !tl->isDialog() && ( n = tl->parentWidget() ) )
00823 tl = n;
00824
00825 TDEMainWindow * mw = tqt_dynamic_cast<TDEMainWindow *>(tl);
00826 if (mw)
00827 plugAccel( mw->accel() );
00828 else
00829 kdDebug(129) << "TDEAction::plugMainWindowAccel: Toplevel widget isn't a TDEMainWindow, can't plug accel. " << tl << endl;
00830 }
00831
00832 void TDEAction::setEnabled(bool enable)
00833 {
00834
00835 if ( enable == d->isEnabled() )
00836 return;
00837
00838 #ifndef KDE_NO_COMPAT
00839
00840 if (d->m_tdeaccel)
00841 d->m_tdeaccel->setEnabled(name(), enable);
00842 #endif // KDE 4: remove end
00843
00844 const TQValueList<TDEAccel*> & accelList = d->m_tdeaccelList;
00845 TQValueList<TDEAccel*>::const_iterator itr = accelList.constBegin();
00846 const TQValueList<TDEAccel*>::const_iterator itrEnd = accelList.constEnd();
00847
00848 const char * const namePtr = name();
00849
00850 for ( ; itr != itrEnd; ++itr )
00851 (*itr)->setEnabled( namePtr, enable );
00852
00853 d->setEnabled( enable );
00854
00855 int len = containerCount();
00856 for( int i = 0; i < len; ++i )
00857 updateEnabled( i );
00858
00859 emit enabled( d->isEnabled() );
00860 }
00861
00862 void TDEAction::updateEnabled( int i )
00863 {
00864 TQWidget *w = container( i );
00865
00866 if ( ::tqqt_cast<TQPopupMenu *>( w ) )
00867 static_cast<TQPopupMenu*>(w)->setItemEnabled( itemId( i ), d->isEnabled() );
00868 else if ( ::tqqt_cast<TQMenuBar *>( w ) )
00869 static_cast<TQMenuBar*>(w)->setItemEnabled( itemId( i ), d->isEnabled() );
00870 else if ( ::tqqt_cast<TDEToolBar *>( w ) )
00871 static_cast<TDEToolBar*>(w)->setItemEnabled( itemId( i ), d->isEnabled() );
00872 }
00873
00874 void TDEAction::setShortcutConfigurable( bool b )
00875 {
00876 d->m_configurable = b;
00877 }
00878
00879 void TDEAction::setText( const TQString& text )
00880 {
00881 #ifndef KDE_NO_COMPAT
00882
00883 if (d->m_tdeaccel) {
00884 TDEAccelAction* pAction = d->m_tdeaccel->actions().actionPtr(name());
00885 if (pAction)
00886 pAction->setLabel( text );
00887 }
00888 #endif // KDE 4: remove end
00889 const TQValueList<TDEAccel*> & accelList = d->m_tdeaccelList;
00890 TQValueList<TDEAccel*>::const_iterator itr = accelList.constBegin();
00891 const TQValueList<TDEAccel*>::const_iterator itrEnd = accelList.constEnd();
00892
00893 const char * const namePtr = name();
00894
00895 for( ; itr != itrEnd; ++itr ) {
00896 TDEAccelAction* const pAction = (*itr)->actions().actionPtr(namePtr);
00897 if (pAction)
00898 pAction->setLabel( text );
00899 }
00900
00901 d->setText( text );
00902
00903 int len = containerCount();
00904 for( int i = 0; i < len; ++i )
00905 updateText( i );
00906 }
00907
00908 void TDEAction::updateText( int i )
00909 {
00910 TQWidget *w = container( i );
00911
00912 if ( ::tqqt_cast<TQPopupMenu *>( w ) ) {
00913 int id = itemId( i );
00914 static_cast<TQPopupMenu*>(w)->changeItem( id, d->text() );
00915 if (!d->m_cut.isNull())
00916 updateShortcut( static_cast<TQPopupMenu*>(w), id );
00917 }
00918 else if ( ::tqqt_cast<TQMenuBar *>( w ) )
00919 static_cast<TQMenuBar*>(w)->changeItem( itemId( i ), d->text() );
00920 else if ( ::tqqt_cast<TDEToolBar *>( w ) )
00921 {
00922 TQWidget *button = static_cast<TDEToolBar *>(w)->getWidget( itemId( i ) );
00923 if ( ::tqqt_cast<TDEToolBarButton *>( button ) )
00924 static_cast<TDEToolBarButton *>(button)->setText( d->plainText() );
00925 }
00926 }
00927
00928 TQString TDEAction::text() const
00929 {
00930 return d->text();
00931 }
00932
00933 TQString TDEAction::plainText() const
00934 {
00935 return d->plainText( );
00936 }
00937
00938 void TDEAction::setIcon( const TQString &icon )
00939 {
00940 d->setIconName( icon );
00941
00942
00943 int len = containerCount();
00944 for ( int i = 0; i < len; ++i )
00945 updateIcon( i );
00946 }
00947
00948 void TDEAction::updateIcon( int id )
00949 {
00950 TQWidget* w = container( id );
00951
00952 if ( ::tqqt_cast<TQPopupMenu *>( w ) ) {
00953 int itemId_ = itemId( id );
00954 static_cast<TQPopupMenu*>(w)->changeItem( itemId_, d->iconSet( TDEIcon::Small ), d->text() );
00955 if (!d->m_cut.isNull())
00956 updateShortcut( static_cast<TQPopupMenu*>(w), itemId_ );
00957 }
00958 else if ( ::tqqt_cast<TQMenuBar *>( w ) )
00959 static_cast<TQMenuBar*>(w)->changeItem( itemId( id ), d->iconSet( TDEIcon::Small ), d->text() );
00960 else if ( ::tqqt_cast<TDEToolBar *>( w ) )
00961 static_cast<TDEToolBar *>(w)->setButtonIcon( itemId( id ), d->iconName() );
00962 }
00963
00964 TQString TDEAction::icon() const
00965 {
00966 return d->iconName( );
00967 }
00968
00969 void TDEAction::setIconSet( const TQIconSet &iconset )
00970 {
00971 d->setIconSet( iconset );
00972
00973 int len = containerCount();
00974 for( int i = 0; i < len; ++i )
00975 updateIconSet( i );
00976 }
00977
00978
00979 void TDEAction::updateIconSet( int id )
00980 {
00981 TQWidget *w = container( id );
00982
00983 if ( ::tqqt_cast<TQPopupMenu *>( w ) )
00984 {
00985 int itemId_ = itemId( id );
00986 static_cast<TQPopupMenu*>(w)->changeItem( itemId_, d->iconSet(), d->text() );
00987 if (!d->m_cut.isNull())
00988 updateShortcut( static_cast<TQPopupMenu*>(w), itemId_ );
00989 }
00990 else if ( ::tqqt_cast<TQMenuBar *>( w ) )
00991 static_cast<TQMenuBar*>(w)->changeItem( itemId( id ), d->iconSet(), d->text() );
00992 else if ( ::tqqt_cast<TDEToolBar *>( w ) )
00993 {
00994 if ( icon().isEmpty() && d->hasIcon() )
00995 static_cast<TDEToolBar *>(w)->setButtonIconSet( itemId( id ), d->iconSet() );
00996 else
00997 static_cast<TDEToolBar *>(w)->setButtonIconSet( itemId( id ), d->iconSet( TDEIcon::Small ) );
00998 }
00999 }
01000
01001 TQIconSet TDEAction::iconSet( TDEIcon::Group group, int size ) const
01002 {
01003 return d->iconSet( group, size );
01004 }
01005
01006 bool TDEAction::hasIcon() const
01007 {
01008 return d->hasIcon();
01009 }
01010
01011 void TDEAction::setWhatsThis( const TQString& text )
01012 {
01013 d->setWhatsThis( text );
01014
01015 int len = containerCount();
01016 for( int i = 0; i < len; ++i )
01017 updateWhatsThis( i );
01018 }
01019
01020 void TDEAction::updateWhatsThis( int i )
01021 {
01022 TQPopupMenu* pm = popupMenu( i );
01023 if ( pm )
01024 {
01025 pm->TQMenuData::setWhatsThis( itemId( i ), d->whatsThis() );
01026 return;
01027 }
01028
01029 TDEToolBar *tb = toolBar( i );
01030 if ( tb )
01031 {
01032 TQWidget *w = tb->getButton( itemId( i ) );
01033 TQWhatsThis::remove( w );
01034 TQWhatsThis::add( w, d->whatsThis() );
01035 return;
01036 }
01037 }
01038
01039 TQString TDEAction::whatsThis() const
01040 {
01041 return d->whatsThis();
01042 }
01043
01044 TQString TDEAction::whatsThisWithIcon() const
01045 {
01046 TQString text = whatsThis();
01047 if (!d->iconName().isEmpty())
01048 return TQString::fromLatin1("<img source=\"small|%1\"> %2").arg(d->iconName() ).arg(text);
01049 return text;
01050 }
01051
01052 TQWidget* TDEAction::container( int index ) const
01053 {
01054 assert( index < containerCount() );
01055 return d->m_containers[ index ].m_container;
01056 }
01057
01058 TDEToolBar* TDEAction::toolBar( int index ) const
01059 {
01060 return tqt_dynamic_cast<TDEToolBar *>( d->m_containers[ index ].m_container );
01061 }
01062
01063 TQPopupMenu* TDEAction::popupMenu( int index ) const
01064 {
01065 return tqt_dynamic_cast<TQPopupMenu *>( d->m_containers[ index ].m_container );
01066 }
01067
01068 TQWidget* TDEAction::representative( int index ) const
01069 {
01070 return d->m_containers[ index ].m_representative;
01071 }
01072
01073 int TDEAction::itemId( int index ) const
01074 {
01075 return d->m_containers[ index ].m_id;
01076 }
01077
01078 int TDEAction::containerCount() const
01079 {
01080 return d->m_containers.count();
01081 }
01082
01083 uint TDEAction::tdeaccelCount() const
01084 {
01085 return d->m_tdeaccelList.count();
01086 }
01087
01088 void TDEAction::addContainer( TQWidget* c, int id )
01089 {
01090 TDEActionPrivate::Container p;
01091 p.m_container = c;
01092 p.m_id = id;
01093 d->m_containers.append( p );
01094 }
01095
01096 void TDEAction::addContainer( TQWidget* c, TQWidget* w )
01097 {
01098 TDEActionPrivate::Container p;
01099 p.m_container = c;
01100 p.m_representative = w;
01101 d->m_containers.append( p );
01102 }
01103
01104 void TDEAction::activate()
01105 {
01106 emit activated( TDEAction::EmulatedActivation, Qt::NoButton );
01107 slotActivated();
01108 }
01109
01110 void TDEAction::slotActivated()
01111 {
01112 const TQObject *senderObj = TQT_TQOBJECT_CONST(sender());
01113 if ( senderObj )
01114 {
01115 if ( ::tqqt_cast<TDEAccelPrivate *>( senderObj ) )
01116 emit activated( TDEAction::AccelActivation, Qt::NoButton );
01117 }
01118 emit activated();
01119 }
01120
01121
01122
01123
01124
01125 void TDEAction::slotPopupActivated()
01126 {
01127 if( ::tqqt_cast<TQSignal *>(sender()))
01128 {
01129 int id = tqt_dynamic_cast<const TQSignal *>(sender())->value().toInt();
01130 int pos = findContainer(id);
01131 if(pos != -1)
01132 {
01133 TQPopupMenu* qpm = tqt_dynamic_cast<TQPopupMenu *>( container(pos) );
01134 if(qpm)
01135 {
01136 TDEPopupMenu* kpm = tqt_dynamic_cast<TDEPopupMenu *>( qpm );
01137 TQt::ButtonState state;
01138 if ( kpm )
01139 state = kpm->state();
01140 else {
01141 kdDebug(129) << "TDEAction::slotPopupActivated not a TDEPopupMenu -> using keyboardMouseState()" << endl;
01142 state = TDEApplication::keyboardMouseState();
01143 }
01144 emit activated( TDEAction::PopupMenuActivation, state );
01145 slotActivated();
01146 return;
01147 }
01148 }
01149 }
01150
01151 kdWarning(129)<<"Don't connect TDEAction::slotPopupActivated() to anything, expect into QPopupMenus which are in containers. Use slotActivated instead."<<endl;
01152 emit activated( TDEAction::PopupMenuActivation, Qt::NoButton );
01153 slotActivated();
01154 }
01155
01156 void TDEAction::slotButtonClicked( int, TQt::ButtonState state )
01157 {
01158 kdDebug(129) << "slotButtonClicked() state=" << state << endl;
01159 emit activated( TDEAction::ToolBarActivation, state );
01160
01161
01162 if ( ( state & Qt::LeftButton ) || ( state & Qt::MidButton ) )
01163 slotActivated();
01164 }
01165
01166
01167 void TDEAction::slotDestroyed()
01168 {
01169 kdDebug(129) << "TDEAction::slotDestroyed(): this = " << this << ", name = \"" << name() << "\", sender = " << sender() << endl;
01170 const TQObject* const o = TQT_TQOBJECT_CONST(sender());
01171
01172 #ifndef KDE_NO_COMPAT // KDE 4: remove
01173 if ( o == d->m_tdeaccel )
01174 {
01175 d->m_tdeaccel = 0;
01176 return;
01177 }
01178 #endif // KDE 4: remove end
01179 TQValueList<TDEAccel*> & accelList = d->m_tdeaccelList;
01180 TQValueList<TDEAccel*>::iterator itr = accelList.begin();
01181 const TQValueList<TDEAccel*>::iterator itrEnd = accelList.end();
01182
01183 for( ; itr != itrEnd; ++itr)
01184 {
01185 if ( o == *itr )
01186 {
01187 disconnect( *itr, TQT_SIGNAL(destroyed()), this, TQT_SLOT(slotDestroyed()) );
01188 accelList.remove(itr);
01189 return;
01190 }
01191 }
01192
01193 int i;
01194 do
01195 {
01196 i = findContainer( TQT_TQWIDGET_CONST( static_cast<const QObject*>(o) ) );
01197 if ( i != -1 )
01198 removeContainer( i );
01199 } while ( i != -1 );
01200 }
01201
01202 int TDEAction::findContainer( const TQWidget* widget ) const
01203 {
01204 int pos = 0;
01205
01206 const TQValueList<TDEActionPrivate::Container> & containers = d->m_containers;
01207
01208 TQValueList<TDEActionPrivate::Container>::ConstIterator it = containers.constBegin();
01209 const TQValueList<TDEActionPrivate::Container>::ConstIterator itEnd = containers.constEnd();
01210
01211 while( it != itEnd )
01212 {
01213 if ( (*it).m_representative == widget || (*it).m_container == widget )
01214 return pos;
01215 ++it;
01216 ++pos;
01217 }
01218
01219 return -1;
01220 }
01221
01222 int TDEAction::findContainer( const int id ) const
01223 {
01224 int pos = 0;
01225
01226 const TQValueList<TDEActionPrivate::Container> & containers = d->m_containers;
01227
01228 TQValueList<TDEActionPrivate::Container>::ConstIterator it = containers.constBegin();
01229 const TQValueList<TDEActionPrivate::Container>::ConstIterator itEnd = containers.constEnd();
01230
01231 while( it != itEnd )
01232 {
01233 if ( (*it).m_id == id )
01234 return pos;
01235 ++it;
01236 ++pos;
01237 }
01238
01239 return -1;
01240 }
01241
01242 void TDEAction::removeContainer( int index )
01243 {
01244 int i = 0;
01245
01246 TQValueList<TDEActionPrivate::Container> & containers = d->m_containers;
01247
01248 TQValueList<TDEActionPrivate::Container>::Iterator it = containers.begin();
01249 const TQValueList<TDEActionPrivate::Container>::Iterator itEnd = containers.end();
01250
01251 while( it != itEnd )
01252 {
01253 if ( i == index )
01254 {
01255 containers.remove( it );
01256 return;
01257 }
01258 ++it;
01259 ++i;
01260 }
01261 }
01262
01263
01264 void TDEAction::slotKeycodeChanged()
01265 {
01266 kdDebug(129) << "TDEAction::slotKeycodeChanged()" << endl;
01267 TDEAccelAction* pAction = d->m_tdeaccel->actions().actionPtr(name());
01268 if( pAction )
01269 setShortcut(pAction->shortcut());
01270 }
01271
01272 TDEActionCollection *TDEAction::parentCollection() const
01273 {
01274 return m_parentCollection;
01275 }
01276
01277 void TDEAction::unplugAll()
01278 {
01279 while ( containerCount() != 0 )
01280 unplug( container( 0 ) );
01281 }
01282
01283 const KGuiItem& TDEAction::guiItem() const
01284 {
01285 return *d;
01286 }
01287
01288 void TDEAction::virtual_hook( int, void* )
01289 { }
01290
01291
01292
01293
01294 #include "tdeaction.moc"