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
if (!d->m_cut.isNull())
00862 updateShortcut( static_cast<QPopupMenu*>(w),
id );
00863 }
00864
else if ( w->inherits(
"QMenuBar" ) )
00865 static_cast<QMenuBar*>(w)->changeItem( itemId( i ), d->text() );
00866
else if ( w->inherits(
"KToolBar" ) )
00867 {
00868
QWidget *button = static_cast<KToolBar *>(w)->getWidget( itemId( i ) );
00869
if ( button->inherits(
"KToolBarButton" ) )
00870 static_cast<KToolBarButton *>(button)->setText( d->plainText() );
00871 }
00872 }
00873
00874
QString KAction::text()
const
00875
{
00876
return d->text();
00877 }
00878
00879
QString KAction::plainText()
const
00880
{
00881
return d->plainText( );
00882 }
00883
00884
void KAction::setIcon(
const QString &icon )
00885 {
00886 d->setIconName( icon );
00887
00888
00889
int len = containerCount();
00890
for (
int i = 0; i < len; ++i )
00891 updateIcon( i );
00892 }
00893
00894
void KAction::updateIcon(
int id )
00895 {
00896
QWidget* w = container(
id );
00897
00898
if ( w->inherits(
"QPopupMenu" ) ) {
00899
int itemId_ = itemId(
id );
00900 static_cast<QPopupMenu*>(w)->changeItem( itemId_, d->iconSet( KIcon::Small ), d->text() );
00901
if (!d->m_cut.isNull())
00902 updateShortcut( static_cast<QPopupMenu*>(w), itemId_ );
00903 }
00904
else if ( w->inherits(
"QMenuBar" ) )
00905 static_cast<QMenuBar*>(w)->changeItem( itemId(
id ), d->iconSet( KIcon::Small ), d->text() );
00906
else if ( w->inherits(
"KToolBar" ) )
00907 static_cast<KToolBar *>(w)->setButtonIcon( itemId(
id ), d->iconName() );
00908 }
00909
00910
QString KAction::icon()
const
00911
{
00912
return d->iconName( );
00913 }
00914
00915 void KAction::setIconSet(
const QIconSet &iconset )
00916 {
00917 d->setIconSet( iconset );
00918
00919
int len = containerCount();
00920
for(
int i = 0; i < len; ++i )
00921 updateIconSet( i );
00922 }
00923
00924
00925
void KAction::updateIconSet(
int id )
00926 {
00927
QWidget *w = container(
id );
00928
00929
if ( w->inherits(
"QPopupMenu" ) )
00930 {
00931
int itemId_ = itemId(
id );
00932 static_cast<QPopupMenu*>(w)->changeItem( itemId_, d->iconSet(), d->text() );
00933
if (!d->m_cut.isNull())
00934 updateShortcut( static_cast<QPopupMenu*>(w), itemId_ );
00935 }
00936
else if ( w->inherits(
"QMenuBar" ) )
00937 static_cast<QMenuBar*>(w)->changeItem( itemId(
id ), d->iconSet(), d->text() );
00938
else if ( w->inherits(
"KToolBar" ) )
00939 {
00940
if ( icon().
isEmpty() && d->hasIconSet() )
00941 static_cast<KToolBar *>(w)->setButtonIconSet( itemId(
id ), d->iconSet() );
00942
else
00943 static_cast<KToolBar *>(w)->setButtonIconSet( itemId(
id ), d->iconSet( KIcon::Small ) );
00944 }
00945 }
00946
00947 QIconSet KAction::iconSet( KIcon::Group group,
int size )
const
00948
{
00949
return d->iconSet( group, size );
00950 }
00951
00952
bool KAction::hasIcon()
const
00953
{
00954
return d->hasIcon();
00955 }
00956
00957 void KAction::setWhatsThis(
const QString& text )
00958 {
00959 d->setWhatsThis( text );
00960
00961
int len = containerCount();
00962
for(
int i = 0; i < len; ++i )
00963 updateWhatsThis( i );
00964 }
00965
00966
void KAction::updateWhatsThis(
int i )
00967 {
00968
QPopupMenu* pm = popupMenu( i );
00969
if ( pm )
00970 {
00971 pm->
setWhatsThis( itemId( i ), d->whatsThis() );
00972
return;
00973 }
00974
00975
KToolBar *tb = toolBar( i );
00976
if ( tb )
00977 {
00978
QWidget *w = tb->
getButton( itemId( i ) );
00979
QWhatsThis::remove( w );
00980
QWhatsThis::add( w, d->whatsThis() );
00981
return;
00982 }
00983 }
00984
00985
QString KAction::whatsThis()
const
00986
{
00987
return d->whatsThis();
00988 }
00989
00990
QString KAction::whatsThisWithIcon()
const
00991
{
00992
QString text =
whatsThis();
00993
if (!d->iconName().isEmpty())
00994
return QString::fromLatin1(
"<img source=\"small|%1\"> %2").arg(d->iconName() ).arg(text);
00995
return text;
00996 }
00997
00998
QWidget* KAction::container(
int index )
const
00999
{
01000 assert( index < containerCount() );
01001
return d->m_containers[ index ].m_container;
01002 }
01003
01004
KToolBar* KAction::toolBar(
int index )
const
01005
{
01006
return dynamic_cast<KToolBar *>( d->m_containers[ index ].m_container );
01007 }
01008
01009
QPopupMenu* KAction::popupMenu(
int index )
const
01010
{
01011
return dynamic_cast<QPopupMenu *>( d->m_containers[ index ].m_container );
01012 }
01013
01014
QWidget* KAction::representative(
int index )
const
01015
{
01016
return d->m_containers[ index ].m_representative;
01017 }
01018
01019
int KAction::itemId(
int index )
const
01020
{
01021
return d->m_containers[ index ].m_id;
01022 }
01023
01024
int KAction::containerCount()
const
01025
{
01026
return d->m_containers.count();
01027 }
01028
01029 uint
KAction::kaccelCount()
const
01030
{
01031
return d->m_kaccelList.count();
01032 }
01033
01034
void KAction::addContainer(
QWidget* c,
int id )
01035 {
01036 KActionPrivate::Container p;
01037 p.m_container = c;
01038 p.m_id =
id;
01039 d->m_containers.append( p );
01040 }
01041
01042
void KAction::addContainer(
QWidget* c,
QWidget* w )
01043 {
01044 KActionPrivate::Container p;
01045 p.m_container = c;
01046 p.m_representative = w;
01047 d->m_containers.append( p );
01048 }
01049
01050 void KAction::activate()
01051 {
01052 slotActivated();
01053 }
01054
01055
void KAction::slotActivated()
01056 {
01057 emit activated();
01058 }
01059
01060
void KAction::slotDestroyed()
01061 {
01062
kdDebug(129) <<
"KAction::slotDestroyed(): this = " <<
this <<
", name = \"" <<
name() <<
"\", sender = " <<
sender() <<
endl;
01063
const QObject* o =
sender();
01064
01065
01066
if ( o == d->m_kaccel )
01067 {
01068 d->m_kaccel = 0;
01069
return;
01070 }
01071
01072
01073
for( uint i = 0; i < d->m_kaccelList.count(); i++ )
01074 {
01075
if ( o == d->m_kaccelList[i] )
01076 {
01077
disconnect( d->m_kaccelList[i], SIGNAL(
destroyed()),
this, SLOT(slotDestroyed()) );
01078 d->m_kaccelList.remove( d->m_kaccelList.at( i ) );
01079
return;
01080 }
01081 }
01082
01083
int i;
01084
do
01085 {
01086 i = findContainer( static_cast<const QWidget*>( o ) );
01087
if ( i != -1 )
01088 removeContainer( i );
01089 }
while ( i != -1 );
01090 }
01091
01092
int KAction::findContainer(
const QWidget* widget )
const
01093
{
01094
int pos = 0;
01095
QValueList<KActionPrivate::Container>::ConstIterator it = d->m_containers.begin();
01096
while( it != d->m_containers.end() )
01097 {
01098
if ( (*it).m_representative == widget || (*it).m_container == widget )
01099
return pos;
01100 ++it;
01101 ++pos;
01102 }
01103
01104
return -1;
01105 }
01106
01107
void KAction::removeContainer(
int index )
01108 {
01109
int i = 0;
01110
QValueList<KActionPrivate::Container>::Iterator it = d->m_containers.begin();
01111
while( it != d->m_containers.end() )
01112 {
01113
if ( i == index )
01114 {
01115 d->m_containers.remove( it );
01116
return;
01117 }
01118 ++it;
01119 ++i;
01120 }
01121 }
01122
01123
01124
void KAction::slotKeycodeChanged()
01125 {
01126
kdDebug(129) <<
"KAction::slotKeycodeChanged()" <<
endl;
01127 KAccelAction* pAction = d->m_kaccel->actions().actionPtr(
name());
01128
if( pAction )
01129
setShortcut(pAction->shortcut());
01130 }
01131
01132
KActionCollection *KAction::parentCollection()
const
01133
{
01134
return m_parentCollection;
01135 }
01136
01137
void KAction::unplugAll()
01138 {
01139
while ( containerCount() != 0 )
01140
unplug( container( 0 ) );
01141 }
01142
01143
void KAction::virtual_hook(
int,
void* )
01144 { }
01145
01146
01147
01148
01149
#include "kaction.moc"