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