kactionclasses.cpp
00001 /* This file is part of the KDE libraries 00002 Copyright (C) 1999 Reginald Stadlbauer <reggie@kde.org> 00003 (C) 1999 Simon Hausmann <hausmann@kde.org> 00004 (C) 2000 Nicolas Hadacek <haadcek@kde.org> 00005 (C) 2000 Kurt Granroth <granroth@kde.org> 00006 (C) 2000 Michael Koch <koch@kde.org> 00007 (C) 2001 Holger Freyther <freyther@kde.org> 00008 (C) 2002 Ellis Whitehead <ellis@kde.org> 00009 (C) 2002 Joseph Wenninger <jowenn@kde.org> 00010 (C) 2003 Andras Mantia <amantia@kde.org> 00011 00012 This library is free software; you can redistribute it and/or 00013 modify it under the terms of the GNU Library General Public 00014 License version 2 as published by the Free Software Foundation. 00015 00016 This library is distributed in the hope that it will be useful, 00017 but WITHOUT ANY WARRANTY; without even the implied warranty of 00018 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00019 Library General Public License for more details. 00020 00021 You should have received a copy of the GNU Library General Public License 00022 along with this library; see the file COPYING.LIB. If not, write to 00023 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 00024 Boston, MA 02110-1301, USA. 00025 */ 00026 00027 #include "kactionclasses.h" 00028 00029 #include <assert.h> 00030 00031 #include <qcursor.h> 00032 #include <qclipboard.h> 00033 #include <qfontdatabase.h> 00034 #include <qobjectlist.h> 00035 #include <qwhatsthis.h> 00036 #include <qtimer.h> 00037 #include <qfile.h> 00038 00039 #include <dcopclient.h> 00040 #include <dcopref.h> 00041 #include <kaccel.h> 00042 #include <kapplication.h> 00043 #include <kconfig.h> 00044 #include <kdebug.h> 00045 #include <kfontcombo.h> 00046 #include <kfontdialog.h> 00047 #include <klocale.h> 00048 #include <kmainwindow.h> 00049 #include <kmenubar.h> 00050 #include <kpopupmenu.h> 00051 #include <ktoolbar.h> 00052 #include <ktoolbarbutton.h> 00053 #include <kurl.h> 00054 #include <kstandarddirs.h> 00055 #include <kstringhandler.h> 00056 00057 class KToggleAction::KToggleActionPrivate 00058 { 00059 public: 00060 KToggleActionPrivate() 00061 { 00062 m_checked = false; 00063 m_checkedGuiItem = 0; 00064 } 00065 00066 bool m_checked; 00067 QString m_exclusiveGroup; 00068 KGuiItem* m_checkedGuiItem; 00069 }; 00070 00071 KToggleAction::KToggleAction( const QString& text, const KShortcut& cut, 00072 QObject* parent, 00073 const char* name ) 00074 : KAction( text, cut, parent, name ) 00075 { 00076 d = new KToggleActionPrivate; 00077 } 00078 00079 KToggleAction::KToggleAction( const QString& text, const KShortcut& cut, 00080 const QObject* receiver, const char* slot, 00081 QObject* parent, const char* name ) 00082 : KAction( text, cut, receiver, slot, parent, name ) 00083 { 00084 d = new KToggleActionPrivate; 00085 } 00086 00087 KToggleAction::KToggleAction( const QString& text, const QIconSet& pix, 00088 const KShortcut& cut, 00089 QObject* parent, const char* name ) 00090 : KAction( text, pix, cut, parent, name ) 00091 { 00092 d = new KToggleActionPrivate; 00093 } 00094 00095 KToggleAction::KToggleAction( const QString& text, const QString& pix, 00096 const KShortcut& cut, 00097 QObject* parent, const char* name ) 00098 : KAction( text, pix, cut, parent, name ) 00099 { 00100 d = new KToggleActionPrivate; 00101 } 00102 00103 KToggleAction::KToggleAction( const QString& text, const QIconSet& pix, 00104 const KShortcut& cut, 00105 const QObject* receiver, 00106 const char* slot, QObject* parent, 00107 const char* name ) 00108 : KAction( text, pix, cut, receiver, slot, parent, name ) 00109 { 00110 d = new KToggleActionPrivate; 00111 } 00112 00113 KToggleAction::KToggleAction( const QString& text, const QString& pix, 00114 const KShortcut& cut, 00115 const QObject* receiver, 00116 const char* slot, QObject* parent, 00117 const char* name ) 00118 : KAction( text, pix, cut, receiver, slot, parent, name ) 00119 { 00120 d = new KToggleActionPrivate; 00121 } 00122 00123 KToggleAction::KToggleAction( QObject* parent, const char* name ) 00124 : KAction( parent, name ) 00125 { 00126 d = new KToggleActionPrivate; 00127 } 00128 00129 KToggleAction::~KToggleAction() 00130 { 00131 delete d->m_checkedGuiItem; 00132 delete d; 00133 } 00134 00135 int KToggleAction::plug( QWidget* widget, int index ) 00136 { 00137 if ( !::qt_cast<QPopupMenu *>( widget ) && !::qt_cast<KToolBar *>( widget ) ) 00138 { 00139 kdWarning() << "Can not plug KToggleAction in " << widget->className() << endl; 00140 return -1; 00141 } 00142 if (kapp && !kapp->authorizeKAction(name())) 00143 return -1; 00144 00145 int _index = KAction::plug( widget, index ); 00146 if ( _index == -1 ) 00147 return _index; 00148 00149 if ( ::qt_cast<KToolBar *>( widget ) ) { 00150 KToolBar *bar = static_cast<KToolBar *>( widget ); 00151 00152 bar->setToggle( itemId( _index ), true ); 00153 bar->setButton( itemId( _index ), isChecked() ); 00154 } 00155 00156 if ( d->m_checked ) 00157 updateChecked( _index ); 00158 00159 return _index; 00160 } 00161 00162 void KToggleAction::setChecked( bool c ) 00163 { 00164 if ( c == d->m_checked ) 00165 return; 00166 //kdDebug(129) << "KToggleAction::setChecked(" << c << ") " << this << " " << name() << endl; 00167 00168 d->m_checked = c; 00169 00170 int len = containerCount(); 00171 00172 for( int i = 0; i < len; ++i ) 00173 updateChecked( i ); 00174 00175 if ( c && parent() && !exclusiveGroup().isEmpty() ) { 00176 const QObjectList *list = parent()->children(); 00177 if ( list ) { 00178 QObjectListIt it( *list ); 00179 for( ; it.current(); ++it ) { 00180 if ( ::qt_cast<KToggleAction *>( it.current() ) && it.current() != this && 00181 static_cast<KToggleAction*>(it.current())->exclusiveGroup() == exclusiveGroup() ) { 00182 KToggleAction *a = static_cast<KToggleAction*>(it.current()); 00183 if( a->isChecked() ) { 00184 a->setChecked( false ); 00185 emit a->toggled( false ); 00186 } 00187 } 00188 } 00189 } 00190 } 00191 } 00192 00193 void KToggleAction::updateChecked( int id ) 00194 { 00195 QWidget *w = container( id ); 00196 00197 if ( ::qt_cast<QPopupMenu *>( w ) ) { 00198 QPopupMenu* pm = static_cast<QPopupMenu*>(w); 00199 int itemId_ = itemId( id ); 00200 if ( !d->m_checkedGuiItem ) 00201 pm->setItemChecked( itemId_, d->m_checked ); 00202 else { 00203 const KGuiItem* gui = d->m_checked ? d->m_checkedGuiItem : &guiItem(); 00204 if ( d->m_checkedGuiItem->hasIcon() ) 00205 pm->changeItem( itemId_, gui->iconSet( KIcon::Small ), gui->text() ); 00206 else 00207 pm->changeItem( itemId_, gui->text() ); 00208 00209 // If the text doesn't change, then set the icon to be "pressed", otherwise 00210 // there is too little difference between checked and unchecked. 00211 if ( d->m_checkedGuiItem->text() == guiItem().text() ) 00212 pm->setItemChecked( itemId_, d->m_checked ); 00213 00214 if ( !d->m_checkedGuiItem->whatsThis().isEmpty() ) // if empty, we keep the initial one 00215 pm->setWhatsThis( itemId_, gui->whatsThis() ); 00216 updateShortcut( pm, itemId_ ); 00217 } 00218 } 00219 else if ( ::qt_cast<QMenuBar *>( w ) ) // not handled in plug... 00220 static_cast<QMenuBar*>(w)->setItemChecked( itemId( id ), d->m_checked ); 00221 else if ( ::qt_cast<KToolBar *>( w ) ) 00222 { 00223 QWidget* r = static_cast<KToolBar*>( w )->getButton( itemId( id ) ); 00224 if ( r && ::qt_cast<KToolBarButton *>( r ) ) { 00225 static_cast<KToolBar*>( w )->setButton( itemId( id ), d->m_checked ); 00226 if ( d->m_checkedGuiItem && d->m_checkedGuiItem->hasIcon() ) { 00227 const KGuiItem* gui = d->m_checked ? d->m_checkedGuiItem : &guiItem(); 00228 static_cast<KToolBar*>( w )->setButtonIconSet( itemId( id ), gui->iconSet( KIcon::Toolbar ) ); 00229 } 00230 } 00231 } 00232 } 00233 00234 void KToggleAction::slotActivated() 00235 { 00236 setChecked( !isChecked() ); 00237 KAction::slotActivated(); 00238 emit toggled( isChecked() ); 00239 } 00240 00241 bool KToggleAction::isChecked() const 00242 { 00243 return d->m_checked; 00244 } 00245 00246 void KToggleAction::setExclusiveGroup( const QString& name ) 00247 { 00248 d->m_exclusiveGroup = name; 00249 } 00250 00251 QString KToggleAction::exclusiveGroup() const 00252 { 00253 return d->m_exclusiveGroup; 00254 } 00255 00256 void KToggleAction::setCheckedState( const KGuiItem& checkedItem ) 00257 { 00258 delete d->m_checkedGuiItem; 00259 d->m_checkedGuiItem = new KGuiItem( checkedItem ); 00260 } 00261 00262 QString KToggleAction::toolTip() const 00263 { 00264 if ( d->m_checkedGuiItem && d->m_checked ) 00265 return d->m_checkedGuiItem->toolTip(); 00266 else 00267 return KAction::toolTip(); 00268 } 00269 00270 KRadioAction::KRadioAction( const QString& text, const KShortcut& cut, 00271 QObject* parent, const char* name ) 00272 : KToggleAction( text, cut, parent, name ) 00273 { 00274 } 00275 00276 KRadioAction::KRadioAction( const QString& text, const KShortcut& cut, 00277 const QObject* receiver, const char* slot, 00278 QObject* parent, const char* name ) 00279 : KToggleAction( text, cut, receiver, slot, parent, name ) 00280 { 00281 } 00282 00283 KRadioAction::KRadioAction( const QString& text, const QIconSet& pix, 00284 const KShortcut& cut, 00285 QObject* parent, const char* name ) 00286 : KToggleAction( text, pix, cut, parent, name ) 00287 { 00288 } 00289 00290 KRadioAction::KRadioAction( const QString& text, const QString& pix, 00291 const KShortcut& cut, 00292 QObject* parent, const char* name ) 00293 : KToggleAction( text, pix, cut, parent, name ) 00294 { 00295 } 00296 00297 KRadioAction::KRadioAction( const QString& text, const QIconSet& pix, 00298 const KShortcut& cut, 00299 const QObject* receiver, const char* slot, 00300 QObject* parent, const char* name ) 00301 : KToggleAction( text, pix, cut, receiver, slot, parent, name ) 00302 { 00303 } 00304 00305 KRadioAction::KRadioAction( const QString& text, const QString& pix, 00306 const KShortcut& cut, 00307 const QObject* receiver, const char* slot, 00308 QObject* parent, const char* name ) 00309 : KToggleAction( text, pix, cut, receiver, slot, parent, name ) 00310 { 00311 } 00312 00313 KRadioAction::KRadioAction( QObject* parent, const char* name ) 00314 : KToggleAction( parent, name ) 00315 { 00316 } 00317 00318 void KRadioAction::slotActivated() 00319 { 00320 if ( isChecked() ) 00321 { 00322 const QObject *senderObj = sender(); 00323 00324 if ( !senderObj || !::qt_cast<const KToolBarButton *>( senderObj ) ) 00325 return; 00326 00327 const_cast<KToolBarButton *>( static_cast<const KToolBarButton *>( senderObj ) )->on( true ); 00328 00329 return; 00330 } 00331 00332 KToggleAction::slotActivated(); 00333 } 00334 00335 class KSelectAction::KSelectActionPrivate 00336 { 00337 public: 00338 KSelectActionPrivate() 00339 { 00340 m_edit = false; 00341 m_menuAccelsEnabled = true; 00342 m_menu = 0; 00343 m_current = -1; 00344 m_comboWidth = -1; 00345 m_maxComboViewCount = -1; 00346 } 00347 bool m_edit; 00348 bool m_menuAccelsEnabled; 00349 QPopupMenu *m_menu; 00350 int m_current; 00351 int m_comboWidth; 00352 QStringList m_list; 00353 int m_maxComboViewCount; 00354 00355 QString makeMenuText( const QString &_text ) 00356 { 00357 if ( m_menuAccelsEnabled ) 00358 return _text; 00359 QString text = _text; 00360 uint i = 0; 00361 while ( i < text.length() ) { 00362 if ( text[ i ] == '&' ) { 00363 text.insert( i, '&' ); 00364 i += 2; 00365 } 00366 else 00367 ++i; 00368 } 00369 return text; 00370 } 00371 }; 00372 00373 KSelectAction::KSelectAction( const QString& text, const KShortcut& cut, 00374 QObject* parent, const char* name ) 00375 : KAction( text, cut, parent, name ) 00376 { 00377 d = new KSelectActionPrivate; 00378 } 00379 00380 KSelectAction::KSelectAction( const QString& text, const KShortcut& cut, 00381 const QObject* receiver, const char* slot, 00382 QObject* parent, const char* name ) 00383 : KAction( text, cut, receiver, slot, parent, name ) 00384 { 00385 d = new KSelectActionPrivate; 00386 } 00387 00388 KSelectAction::KSelectAction( const QString& text, const QIconSet& pix, 00389 const KShortcut& cut, 00390 QObject* parent, const char* name ) 00391 : KAction( text, pix, cut, parent, name ) 00392 { 00393 d = new KSelectActionPrivate; 00394 } 00395 00396 KSelectAction::KSelectAction( const QString& text, const QString& pix, 00397 const KShortcut& cut, 00398 QObject* parent, const char* name ) 00399 : KAction( text, pix, cut, parent, name ) 00400 { 00401 d = new KSelectActionPrivate; 00402 } 00403 00404 KSelectAction::KSelectAction( const QString& text, const QIconSet& pix, 00405 const KShortcut& cut, 00406 const QObject* receiver, 00407 const char* slot, QObject* parent, 00408 const char* name ) 00409 : KAction( text, pix, cut, receiver, slot, parent, name ) 00410 { 00411 d = new KSelectActionPrivate; 00412 } 00413 00414 KSelectAction::KSelectAction( const QString& text, const QString& pix, 00415 const KShortcut& cut, 00416 const QObject* receiver, 00417 const char* slot, QObject* parent, 00418 const char* name ) 00419 : KAction( text, pix, cut, receiver, slot, parent, name ) 00420 { 00421 d = new KSelectActionPrivate; 00422 } 00423 00424 KSelectAction::KSelectAction( QObject* parent, const char* name ) 00425 : KAction( parent, name ) 00426 { 00427 d = new KSelectActionPrivate; 00428 } 00429 00430 KSelectAction::~KSelectAction() 00431 { 00432 assert(d); 00433 delete d->m_menu; 00434 delete d; d = 0; 00435 } 00436 00437 void KSelectAction::setCurrentItem( int id ) 00438 { 00439 if ( id >= (int)d->m_list.count() ) { 00440 Q_ASSERT(id < (int)d->m_list.count()); 00441 return; 00442 } 00443 00444 if ( d->m_menu ) 00445 { 00446 if ( d->m_current >= 0 ) 00447 d->m_menu->setItemChecked( d->m_current, false ); 00448 if ( id >= 0 ) 00449 d->m_menu->setItemChecked( id, true ); 00450 } 00451 00452 d->m_current = id; 00453 00454 int len = containerCount(); 00455 00456 for( int i = 0; i < len; ++i ) 00457 updateCurrentItem( i ); 00458 00459 // emit KAction::activated(); 00460 // emit activated( currentItem() ); 00461 // emit activated( currentText() ); 00462 } 00463 00464 void KSelectAction::setComboWidth( int width ) 00465 { 00466 if ( width < 0 ) 00467 return; 00468 00469 d->m_comboWidth=width; 00470 00471 int len = containerCount(); 00472 00473 for( int i = 0; i < len; ++i ) 00474 updateComboWidth( i ); 00475 00476 } 00477 00478 void KSelectAction::setMaxComboViewCount( int n ) 00479 { 00480 d->m_maxComboViewCount = n; 00481 } 00482 00483 QPopupMenu* KSelectAction::popupMenu() const 00484 { 00485 kdDebug(129) << "KAction::popupMenu()" << endl; // remove -- ellis 00486 if ( !d->m_menu ) 00487 { 00488 d->m_menu = new KPopupMenu(0L, "KSelectAction::popupMenu()"); 00489 setupMenu(); 00490 if ( d->m_current >= 0 ) 00491 d->m_menu->setItemChecked( d->m_current, true ); 00492 } 00493 00494 return d->m_menu; 00495 } 00496 00497 void KSelectAction::setupMenu() const 00498 { 00499 if ( !d->m_menu ) 00500 return; 00501 d->m_menu->clear(); 00502 00503 QStringList::ConstIterator it = d->m_list.begin(); 00504 for( uint id = 0; it != d->m_list.end(); ++it, ++id ) { 00505 QString text = *it; 00506 if ( !text.isEmpty() ) 00507 d->m_menu->insertItem( d->makeMenuText( text ), this, SLOT( slotActivated( int ) ), 0, id ); 00508 else 00509 d->m_menu->insertSeparator(); 00510 } 00511 } 00512 00513 void KSelectAction::changeItem( int index, const QString& text ) 00514 { 00515 if ( index < 0 || index >= (int)d->m_list.count() ) 00516 { 00517 kdWarning() << "KSelectAction::changeItem Index out of scope" << endl; 00518 return; 00519 } 00520 00521 d->m_list[ index ] = text; 00522 00523 if ( d->m_menu ) 00524 d->m_menu->changeItem( index, d->makeMenuText( text ) ); 00525 00526 int len = containerCount(); 00527 for( int i = 0; i < len; ++i ) 00528 changeItem( i, index, text ); 00529 } 00530 00531 void KSelectAction::changeItem( int id, int index, const QString& text) 00532 { 00533 if ( index < 0 ) 00534 return; 00535 00536 QWidget* w = container( id ); 00537 if ( ::qt_cast<KToolBar *>( w ) ) 00538 { 00539 QWidget* r = (static_cast<KToolBar*>( w ))->getWidget( itemId( id ) ); 00540 if ( ::qt_cast<QComboBox *>( r ) ) 00541 { 00542 QComboBox *b = static_cast<QComboBox*>( r ); 00543 b->changeItem(text, index ); 00544 } 00545 } 00546 } 00547 00548 void KSelectAction::setItems( const QStringList &lst ) 00549 { 00550 d->m_list = lst; 00551 d->m_current = -1; 00552 00553 setupMenu(); 00554 00555 int len = containerCount(); 00556 for( int i = 0; i < len; ++i ) 00557 updateItems( i ); 00558 00559 // Disable if empty and not editable 00560 setEnabled ( lst.count() > 0 || d->m_edit ); 00561 } 00562 00563 QStringList KSelectAction::items() const 00564 { 00565 return d->m_list; 00566 } 00567 00568 QString KSelectAction::currentText() const 00569 { 00570 if ( currentItem() < 0 ) 00571 return QString::null; 00572 00573 return d->m_list[ currentItem() ]; 00574 } 00575 00576 int KSelectAction::currentItem() const 00577 { 00578 return d->m_current; 00579 } 00580 00581 void KSelectAction::updateCurrentItem( int id ) 00582 { 00583 if ( d->m_current < 0 ) 00584 return; 00585 00586 QWidget* w = container( id ); 00587 if ( ::qt_cast<KToolBar *>( w ) ) { 00588 QWidget* r = static_cast<KToolBar*>( w )->getWidget( itemId( id ) ); 00589 if ( ::qt_cast<QComboBox *>( r ) ) { 00590 QComboBox *b = static_cast<QComboBox*>( r ); 00591 b->setCurrentItem( d->m_current ); 00592 } 00593 } 00594 } 00595 00596 int KSelectAction::comboWidth() const 00597 { 00598 return d->m_comboWidth; 00599 } 00600 00601 void KSelectAction::updateComboWidth( int id ) 00602 { 00603 QWidget* w = container( id ); 00604 if ( ::qt_cast<KToolBar *>( w ) ) { 00605 QWidget* r = static_cast<KToolBar*>( w )->getWidget( itemId( id ) ); 00606 if ( ::qt_cast<QComboBox *>( r ) ) { 00607 QComboBox *cb = static_cast<QComboBox*>( r ); 00608 cb->setMinimumWidth( d->m_comboWidth ); 00609 cb->setMaximumWidth( d->m_comboWidth ); 00610 } 00611 } 00612 } 00613 00614 void KSelectAction::updateItems( int id ) 00615 { 00616 kdDebug(129) << "KAction::updateItems( " << id << ", lst )" << endl; // remove -- ellis 00617 QWidget* w = container( id ); 00618 if ( ::qt_cast<KToolBar *>( w ) ) { 00619 QWidget* r = static_cast<KToolBar*>( w )->getWidget( itemId( id ) ); 00620 if ( ::qt_cast<QComboBox *>( r ) ) { 00621 QComboBox *cb = static_cast<QComboBox*>( r ); 00622 cb->clear(); 00623 QStringList lst = comboItems(); 00624 QStringList::ConstIterator it = lst.begin(); 00625 for( ; it != lst.end(); ++it ) 00626 cb->insertItem( *it ); 00627 // qt caches and never recalculates the sizeHint() 00628 // qcombobox.cpp recommends calling setFont to invalidate the sizeHint 00629 // setFont sets own_font = True, so we're a bit mean and calll 00630 // unsetFont which calls setFont and then overwrites the own_font 00631 cb->unsetFont(); 00632 } 00633 } 00634 } 00635 00636 int KSelectAction::plug( QWidget *widget, int index ) 00637 { 00638 if (kapp && !kapp->authorizeKAction(name())) 00639 return -1; 00640 kdDebug(129) << "KSelectAction::plug( " << widget << ", " << index << " )" << endl; // remove -- ellis 00641 if ( ::qt_cast<QPopupMenu *>( widget) ) 00642 { 00643 // Create the PopupMenu and store it in m_menu 00644 (void)popupMenu(); 00645 00646 QPopupMenu* menu = static_cast<QPopupMenu*>( widget ); 00647 int id; 00648 if ( hasIcon() ) 00649 id = menu->insertItem( iconSet(), text(), d->m_menu, -1, index ); 00650 else 00651 id = menu->insertItem( text(), d->m_menu, -1, index ); 00652 00653 if ( !isEnabled() ) 00654 menu->setItemEnabled( id, false ); 00655 00656 QString wth = whatsThis(); 00657 if ( !wth.isEmpty() ) 00658 menu->setWhatsThis( id, wth ); 00659 00660 addContainer( menu, id ); 00661 connect( menu, SIGNAL( destroyed() ), this, SLOT( slotDestroyed() ) ); 00662 00663 return containerCount() - 1; 00664 } 00665 else if ( ::qt_cast<KToolBar *>( widget ) ) 00666 { 00667 KToolBar* bar = static_cast<KToolBar*>( widget ); 00668 int id_ = KAction::getToolButtonID(); 00669 bar->insertCombo( comboItems(), id_, isEditable(), 00670 SIGNAL( activated( const QString & ) ), this, 00671 SLOT( slotActivated( const QString & ) ), isEnabled(), 00672 toolTip(), -1, index ); 00673 00674 QComboBox *cb = bar->getCombo( id_ ); 00675 if ( cb ) 00676 { 00677 if (!isEditable()) cb->setFocusPolicy(QWidget::NoFocus); 00678 cb->setMinimumWidth( cb->sizeHint().width() ); 00679 if ( d->m_comboWidth > 0 ) 00680 { 00681 cb->setMinimumWidth( d->m_comboWidth ); 00682 cb->setMaximumWidth( d->m_comboWidth ); 00683 } 00684 cb->setInsertionPolicy( QComboBox::NoInsertion ); 00685 QWhatsThis::add( cb, whatsThis() ); 00686 if ( d->m_maxComboViewCount != -1 ) cb->setSizeLimit( d->m_maxComboViewCount ); 00687 } 00688 00689 addContainer( bar, id_ ); 00690 00691 connect( bar, SIGNAL( destroyed() ), this, SLOT( slotDestroyed() ) ); 00692 00693 updateCurrentItem( containerCount() - 1 ); 00694 00695 return containerCount() - 1; 00696 } 00697 else if ( ::qt_cast<QMenuBar *>( widget ) ) 00698 { 00699 // Create the PopupMenu and store it in m_menu 00700 (void)popupMenu(); 00701 00702 QMenuBar* menu = static_cast<QMenuBar*>( widget ); 00703 int id = menu->insertItem( text(), d->m_menu, -1, index ); 00704 00705 if ( !isEnabled() ) 00706 menu->setItemEnabled( id, false ); 00707 00708 QString wth = whatsThis(); 00709 if ( !wth.isEmpty() ) 00710 menu->setWhatsThis( id, wth ); 00711 00712 addContainer( menu, id ); 00713 connect( menu, SIGNAL( destroyed() ), this, SLOT( slotDestroyed() ) ); 00714 00715 return containerCount() - 1; 00716 } 00717 00718 kdWarning() << "Can not plug KAction in " << widget->className() << endl; 00719 return -1; 00720 } 00721 00722 QStringList KSelectAction::comboItems() const 00723 { 00724 if( d->m_menuAccelsEnabled ) { 00725 QStringList lst; 00726 QStringList::ConstIterator it = d->m_list.begin(); 00727 for( ; it != d->m_list.end(); ++it ) 00728 { 00729 QString item = *it; 00730 int i = item.find( '&' ); 00731 if ( i > -1 ) 00732 item = item.remove( i, 1 ); 00733 lst.append( item ); 00734 } 00735 return lst; 00736 } 00737 else 00738 return d->m_list; 00739 } 00740 00741 void KSelectAction::clear() 00742 { 00743 if ( d->m_menu ) 00744 d->m_menu->clear(); 00745 00746 int len = containerCount(); 00747 for( int i = 0; i < len; ++i ) 00748 updateClear( i ); 00749 } 00750 00751 void KSelectAction::updateClear( int id ) 00752 { 00753 QWidget* w = container( id ); 00754 if ( ::qt_cast<KToolBar *>( w ) ) { 00755 QWidget* r = static_cast<KToolBar*>( w )->getWidget( itemId( id ) ); 00756 if ( ::qt_cast<QComboBox *>( r ) ) { 00757 QComboBox *b = static_cast<QComboBox*>( r ); 00758 b->clear(); 00759 } 00760 } 00761 } 00762 00763 void KSelectAction::slotActivated( int id ) 00764 { 00765 if ( d->m_current == id ) 00766 return; 00767 00768 setCurrentItem( id ); 00769 // Delay this. Especially useful when the slot connected to activated() will re-create 00770 // the menu, e.g. in the recent files action. This prevents a crash. 00771 QTimer::singleShot( 0, this, SLOT( slotActivated() ) ); 00772 } 00773 00774 void KSelectAction::slotActivated( const QString &text ) 00775 { 00776 if ( isEditable() ) 00777 { 00778 QStringList lst = d->m_list; 00779 if(!lst.contains(text)) 00780 { 00781 lst.append( text ); 00782 setItems( lst ); 00783 } 00784 } 00785 00786 int i = d->m_list.findIndex( text ); 00787 if ( i > -1 ) 00788 setCurrentItem( i ); 00789 else 00790 setCurrentItem( comboItems().findIndex( text ) ); 00791 // Delay this. Especially useful when the slot connected to activated() will re-create 00792 // the menu, e.g. in the recent files action. This prevents a crash. 00793 QTimer::singleShot( 0, this, SLOT( slotActivated() ) ); 00794 } 00795 00796 void KSelectAction::slotActivated() 00797 { 00798 KAction::slotActivated(); 00799 kdDebug(129) << "KSelectAction::slotActivated currentItem=" << currentItem() << " currentText=" << currentText() << endl; 00800 emit activated( currentItem() ); 00801 emit activated( currentText() ); 00802 } 00803 00804 void KSelectAction::setEditable( bool edit ) 00805 { 00806 d->m_edit = edit; 00807 } 00808 00809 bool KSelectAction::isEditable() const 00810 { 00811 return d->m_edit; 00812 } 00813 00814 void KSelectAction::setRemoveAmpersandsInCombo( bool b ) 00815 { 00816 setMenuAccelsEnabled( b ); 00817 } 00818 00819 bool KSelectAction::removeAmpersandsInCombo() const 00820 { 00821 return menuAccelsEnabled( ); 00822 } 00823 00824 void KSelectAction::setMenuAccelsEnabled( bool b ) 00825 { 00826 d->m_menuAccelsEnabled = b; 00827 } 00828 00829 bool KSelectAction::menuAccelsEnabled() const 00830 { 00831 return d->m_menuAccelsEnabled; 00832 } 00833 00834 class KListAction::KListActionPrivate 00835 { 00836 public: 00837 KListActionPrivate() 00838 { 00839 m_current = 0; 00840 } 00841 int m_current; 00842 }; 00843 00844 KListAction::KListAction( const QString& text, const KShortcut& cut, 00845 QObject* parent, const char* name ) 00846 : KSelectAction( text, cut, parent, name ) 00847 { 00848 d = new KListActionPrivate; 00849 } 00850 00851 KListAction::KListAction( const QString& text, const KShortcut& cut, 00852 const QObject* receiver, const char* slot, 00853 QObject* parent, const char* name ) 00854 : KSelectAction( text, cut, parent, name ) 00855 { 00856 d = new KListActionPrivate; 00857 if ( receiver ) 00858 connect( this, SIGNAL( activated( int ) ), receiver, slot ); 00859 } 00860 00861 KListAction::KListAction( const QString& text, const QIconSet& pix, 00862 const KShortcut& cut, 00863 QObject* parent, const char* name ) 00864 : KSelectAction( text, pix, cut, parent, name ) 00865 { 00866 d = new KListActionPrivate; 00867 } 00868 00869 KListAction::KListAction( const QString& text, const QString& pix, 00870 const KShortcut& cut, 00871 QObject* parent, const char* name ) 00872 : KSelectAction( text, pix, cut, parent, name ) 00873 { 00874 d = new KListActionPrivate; 00875 } 00876 00877 KListAction::KListAction( const QString& text, const QIconSet& pix, 00878 const KShortcut& cut, const QObject* receiver, 00879 const char* slot, QObject* parent, 00880 const char* name ) 00881 : KSelectAction( text, pix, cut, parent, name ) 00882 { 00883 d = new KListActionPrivate; 00884 if ( receiver ) 00885 connect( this, SIGNAL( activated( int ) ), receiver, slot ); 00886 } 00887 00888 KListAction::KListAction( const QString& text, const QString& pix, 00889 const KShortcut& cut, const QObject* receiver, 00890 const char* slot, QObject* parent, 00891 const char* name ) 00892 : KSelectAction( text, pix, cut, parent, name ) 00893 { 00894 d = new KListActionPrivate; 00895 if ( receiver ) 00896 connect( this, SIGNAL( activated( int ) ), receiver, slot ); 00897 } 00898 00899 KListAction::KListAction( QObject* parent, const char* name ) 00900 : KSelectAction( parent, name ) 00901 { 00902 d = new KListActionPrivate; 00903 } 00904 00905 KListAction::~KListAction() 00906 { 00907 delete d; d = 0; 00908 } 00909 00910 void KListAction::setCurrentItem( int index ) 00911 { 00912 KSelectAction::setCurrentItem( index ); 00913 d->m_current = index; 00914 00915 // emit KAction::activated(); 00916 // emit activated( currentItem() ); 00917 // emit activated( currentText() ); 00918 } 00919 00920 QString KListAction::currentText() const 00921 { 00922 return KSelectAction::currentText(); 00923 } 00924 00925 int KListAction::currentItem() const 00926 { 00927 return d->m_current; 00928 } 00929 00930 class KRecentFilesAction::KRecentFilesActionPrivate 00931 { 00932 public: 00933 KRecentFilesActionPrivate() 00934 { 00935 m_maxItems = 0; 00936 m_popup = 0; 00937 } 00938 uint m_maxItems; 00939 KPopupMenu *m_popup; 00940 QMap<QString, QString> m_shortNames; 00941 QMap<QString, KURL> m_urls; 00942 }; 00943 00944 KRecentFilesAction::KRecentFilesAction( const QString& text, 00945 const KShortcut& cut, 00946 QObject* parent, const char* name, 00947 uint maxItems ) 00948 : KListAction( text, cut, parent, name) 00949 { 00950 d = new KRecentFilesActionPrivate; 00951 d->m_maxItems = maxItems; 00952 00953 init(); 00954 } 00955 00956 KRecentFilesAction::KRecentFilesAction( const QString& text, 00957 const KShortcut& cut, 00958 const QObject* receiver, 00959 const char* slot, 00960 QObject* parent, const char* name, 00961 uint maxItems ) 00962 : KListAction( text, cut, parent, name) 00963 { 00964 d = new KRecentFilesActionPrivate; 00965 d->m_maxItems = maxItems; 00966 00967 init(); 00968 00969 if ( receiver ) 00970 connect( this, SIGNAL(urlSelected(const KURL&)), 00971 receiver, slot ); 00972 } 00973 00974 KRecentFilesAction::KRecentFilesAction( const QString& text, 00975 const QIconSet& pix, 00976 const KShortcut& cut, 00977 QObject* parent, const char* name, 00978 uint maxItems ) 00979 : KListAction( text, pix, cut, parent, name) 00980 { 00981 d = new KRecentFilesActionPrivate; 00982 d->m_maxItems = maxItems; 00983 00984 init(); 00985 } 00986 00987 KRecentFilesAction::KRecentFilesAction( const QString& text, 00988 const QString& pix, 00989 const KShortcut& cut, 00990 QObject* parent, const char* name, 00991 uint maxItems ) 00992 : KListAction( text, pix, cut, parent, name) 00993 { 00994 d = new KRecentFilesActionPrivate; 00995 d->m_maxItems = maxItems; 00996 00997 init(); 00998 } 00999 01000 KRecentFilesAction::KRecentFilesAction( const QString& text, 01001 const QIconSet& pix, 01002 const KShortcut& cut, 01003 const QObject* receiver, 01004 const char* slot, 01005 QObject* parent, const char* name, 01006 uint maxItems ) 01007 : KListAction( text, pix, cut, parent, name) 01008 { 01009 d = new KRecentFilesActionPrivate; 01010 d->m_maxItems = maxItems; 01011 01012 init(); 01013 01014 if ( receiver ) 01015 connect( this, SIGNAL(urlSelected(const KURL&)), 01016 receiver, slot ); 01017 } 01018 01019 KRecentFilesAction::KRecentFilesAction( const QString& text, 01020 const QString& pix, 01021 const KShortcut& cut, 01022 const QObject* receiver, 01023 const char* slot, 01024 QObject* parent, const char* name, 01025 uint maxItems ) 01026 : KListAction( text, pix, cut, parent, name) 01027 { 01028 d = new KRecentFilesActionPrivate; 01029 d->m_maxItems = maxItems; 01030 01031 init(); 01032 01033 if ( receiver ) 01034 connect( this, SIGNAL(urlSelected(const KURL&)), 01035 receiver, slot ); 01036 } 01037 01038 KRecentFilesAction::KRecentFilesAction( QObject* parent, const char* name, 01039 uint maxItems ) 01040 : KListAction( parent, name ) 01041 { 01042 d = new KRecentFilesActionPrivate; 01043 d->m_maxItems = maxItems; 01044 01045 init(); 01046 } 01047 01048 void KRecentFilesAction::init() 01049 { 01050 KRecentFilesAction *that = const_cast<KRecentFilesAction*>(this); 01051 that->d->m_popup = new KPopupMenu; 01052 connect(d->m_popup, SIGNAL(aboutToShow()), this, SLOT(menuAboutToShow())); 01053 connect(d->m_popup, SIGNAL(activated(int)), this, SLOT(menuItemActivated(int))); 01054 connect( this, SIGNAL( activated( const QString& ) ), 01055 this, SLOT( itemSelected( const QString& ) ) ); 01056 01057 setMenuAccelsEnabled( false ); 01058 } 01059 01060 KRecentFilesAction::~KRecentFilesAction() 01061 { 01062 delete d->m_popup; 01063 delete d; d = 0; 01064 } 01065 01066 uint KRecentFilesAction::maxItems() const 01067 { 01068 return d->m_maxItems; 01069 } 01070 01071 void KRecentFilesAction::setMaxItems( uint maxItems ) 01072 { 01073 QStringList lst = KSelectAction::items(); 01074 uint oldCount = lst.count(); 01075 01076 // set new maxItems 01077 d->m_maxItems = maxItems; 01078 01079 // remove all items that are too much 01080 while( lst.count() > maxItems ) 01081 { 01082 // remove last item 01083 QString lastItem = lst.last(); 01084 d->m_shortNames.erase( lastItem ); 01085 d->m_urls.erase( lastItem ); 01086 lst.remove( lastItem ); 01087 } 01088 01089 // set new list if changed 01090 if( lst.count() != oldCount ) 01091 setItems( lst ); 01092 } 01093 01094 void KRecentFilesAction::addURL( const KURL& url ) 01095 { 01096 addURL( url, url.fileName() ); 01097 } 01098 01099 void KRecentFilesAction::addURL( const KURL& url, const QString& name ) 01100 { 01101 if ( url.isLocalFile() && !KGlobal::dirs()->relativeLocation("tmp", url.path()).startsWith("/")) 01102 return; 01103 const QString file = url.pathOrURL(); 01104 QStringList lst = KSelectAction::items(); 01105 01106 // remove file if already in list 01107 const QStringList::Iterator end = lst.end(); 01108 for ( QStringList::Iterator it = lst.begin(); it != end; ++it ) 01109 { 01110 QString title = (*it); 01111 if ( title.endsWith( file + "]" ) ) 01112 { 01113 lst.remove( it ); 01114 d->m_urls.erase( title ); 01115 d->m_shortNames.erase( title ); 01116 break; 01117 } 01118 } 01119 // remove last item if already maxitems in list 01120 if( lst.count() == d->m_maxItems ) 01121 { 01122 // remove last item 01123 const QString lastItem = lst.last(); 01124 d->m_shortNames.erase( lastItem ); 01125 d->m_urls.erase( lastItem ); 01126 lst.remove( lastItem ); 01127 } 01128 01129 // add file to list 01130 const QString title = name + " [" + file + "]"; 01131 d->m_shortNames.insert( title, name ); 01132 d->m_urls.insert( title, url ); 01133 lst.prepend( title ); 01134 setItems( lst ); 01135 } 01136 01137 void KRecentFilesAction::removeURL( const KURL& url ) 01138 { 01139 QStringList lst = KSelectAction::items(); 01140 QString file = url.pathOrURL(); 01141 01142 // remove url 01143 QStringList::Iterator end = lst.end(); 01144 for ( QStringList::Iterator it = lst.begin(); it != end; ++it ) 01145 { 01146 if ( (*it).endsWith( file + "]" )) 01147 { 01148 d->m_shortNames.erase( (*it) ); 01149 d->m_urls.erase( (*it) ); 01150 lst.remove( it ); 01151 setItems( lst ); 01152 break; 01153 } 01154 } 01155 } 01156 01157 void KRecentFilesAction::clearURLList() 01158 { 01159 clear(); 01160 d->m_shortNames.clear(); 01161 d->m_urls.clear(); 01162 } 01163 01164 void KRecentFilesAction::loadEntries( KConfig* config, QString groupname) 01165 { 01166 QString key; 01167 QString value; 01168 QString nameKey; 01169 QString nameValue; 01170 QString title; 01171 QString oldGroup; 01172 QStringList lst; 01173 KURL url; 01174 01175 oldGroup = config->group(); 01176 01177 if (groupname.isEmpty()) 01178 groupname = "RecentFiles"; 01179 config->setGroup( groupname ); 01180 01181 // read file list 01182 for( unsigned int i = 1 ; i <= d->m_maxItems ; i++ ) 01183 { 01184 key = QString( "File%1" ).arg( i ); 01185 value = config->readPathEntry( key ); 01186 url = KURL::fromPathOrURL( value ); 01187 01188 // Don't restore if file doesn't exist anymore 01189 if (url.isLocalFile() && !QFile::exists(url.path())) 01190 continue; 01191 01192 nameKey = QString( "Name%1" ).arg( i ); 01193 nameValue = config->readPathEntry( nameKey, url.fileName() ); 01194 title = nameValue + " [" + value + "]"; 01195 if (!value.isNull()) 01196 { 01197 lst.append( title ); 01198 d->m_shortNames.insert( title, nameValue ); 01199 d->m_urls.insert( title, url ); 01200 } 01201 } 01202 01203 // set file 01204 setItems( lst ); 01205 01206 config->setGroup( oldGroup ); 01207 } 01208 01209 void KRecentFilesAction::saveEntries( KConfig* config, QString groupname ) 01210 { 01211 QString key; 01212 QString value; 01213 QString oldGroup; 01214 QStringList lst = KSelectAction::items(); 01215 01216 oldGroup = config->group(); 01217 01218 if (groupname.isEmpty()) 01219 groupname = "RecentFiles"; 01220 config->deleteGroup( groupname, true ); 01221 config->setGroup( groupname ); 01222 01223 // write file list 01224 for( unsigned int i = 1 ; i <= lst.count() ; i++ ) 01225 { 01226 //kdDebug(129) << "Entry for " << lst[i-1] << d->m_urls[ lst[ i - 1 ] ] << endl; 01227 key = QString( "File%1" ).arg( i ); 01228 value = d->m_urls[ lst[ i - 1 ] ].pathOrURL(); 01229 config->writePathEntry( key, value ); 01230 key = QString( "Name%1" ).arg( i ); 01231 value = d->m_shortNames[ lst[ i - 1 ] ]; 01232 config->writePathEntry( key, value ); 01233 } 01234 01235 config->setGroup( oldGroup ); 01236 } 01237 01238 void KRecentFilesAction::itemSelected( const QString& text ) 01239 { 01240 //return a copy of the URL since the slot where it is connected might call 01241 //addURL or removeURL where the d->m_urls.erase( title ) could destroy the 01242 //d->m_urls[ text ] and the emitted URL will be invalid in the rest of the slot 01243 emit urlSelected( KURL(d->m_urls[ text ]) ); 01244 } 01245 01246 void KRecentFilesAction::menuItemActivated( int id ) 01247 { 01248 QString text = d->m_popup->text(id); 01249 //return a copy of the URL since the slot where it is connected might call 01250 //addURL or removeURL where the d->m_urls.erase( title ) could destroy the 01251 //d->m_urls[ text ] and the emitted URL will be invalid in the rest of the slot 01252 emit urlSelected( KURL(d->m_urls[ text ]) ); 01253 } 01254 01255 void KRecentFilesAction::menuAboutToShow() 01256 { 01257 KPopupMenu *menu = d->m_popup; 01258 menu->clear(); 01259 QStringList list = KSelectAction::items(); 01260 for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) 01261 { 01262 menu->insertItem(*it); 01263 } 01264 } 01265 01266 int KRecentFilesAction::plug( QWidget *widget, int index ) 01267 { 01268 if (kapp && !kapp->authorizeKAction(name())) 01269 return -1; 01270 // This is very related to KActionMenu::plug. 01271 // In fact this class could be an interesting base class for KActionMenu 01272 if ( ::qt_cast<KToolBar *>( widget ) ) 01273 { 01274 KToolBar *bar = (KToolBar *)widget; 01275 01276 int id_ = KAction::getToolButtonID(); 01277 01278 KInstance * instance; 01279 if ( m_parentCollection ) 01280 instance = m_parentCollection->instance(); 01281 else 01282 instance = KGlobal::instance(); 01283 01284 bar->insertButton( icon(), id_, SIGNAL( clicked() ), this, 01285 SLOT( slotClicked() ), isEnabled(), plainText(), 01286 index, instance ); 01287 01288 addContainer( bar, id_ ); 01289 01290 connect( bar, SIGNAL( destroyed() ), this, SLOT( slotDestroyed() ) ); 01291 01292 bar->setDelayedPopup( id_, d->m_popup, true); 01293 01294 if ( !whatsThis().isEmpty() ) 01295 QWhatsThis::add( bar->getButton( id_ ), whatsThisWithIcon() ); 01296 01297 return containerCount() - 1; 01298 } 01299 01300 return KListAction::plug( widget, index ); 01301 } 01302 01303 void KRecentFilesAction::slotClicked() 01304 { 01305 KAction::slotActivated(); 01306 } 01307 01308 void KRecentFilesAction::slotActivated(const QString& text) 01309 { 01310 KListAction::slotActivated(text); 01311 } 01312 01313 01314 void KRecentFilesAction::slotActivated(int id) 01315 { 01316 KListAction::slotActivated(id); 01317 } 01318 01319 01320 void KRecentFilesAction::slotActivated() 01321 { 01322 emit activated( currentItem() ); 01323 emit activated( currentText() ); 01324 } 01325 01326 //KDE4: rename to urls() and return a KURL::List 01327 QStringList KRecentFilesAction::items() const 01328 { 01329 QStringList lst = KSelectAction::items(); 01330 QStringList result; 01331 01332 for( unsigned int i = 1 ; i <= lst.count() ; i++ ) 01333 { 01334 result += d->m_urls[ lst[ i - 1 ] ].prettyURL(0, KURL::StripFileProtocol); 01335 } 01336 01337 return result; 01338 } 01339 01340 //KDE4: remove 01341 QStringList KRecentFilesAction::completeItems() const 01342 { 01343 return KSelectAction::items(); 01344 } 01345 01346 01347 class KFontAction::KFontActionPrivate 01348 { 01349 public: 01350 KFontActionPrivate() 01351 { 01352 } 01353 QStringList m_fonts; 01354 }; 01355 01356 KFontAction::KFontAction( const QString& text, 01357 const KShortcut& cut, QObject* parent, 01358 const char* name ) 01359 : KSelectAction( text, cut, parent, name ) 01360 { 01361 d = new KFontActionPrivate; 01362 KFontChooser::getFontList( d->m_fonts, 0 ); 01363 KSelectAction::setItems( d->m_fonts ); 01364 setEditable( true ); 01365 } 01366 01367 KFontAction::KFontAction( const QString& text, const KShortcut& cut, 01368 const QObject* receiver, const char* slot, 01369 QObject* parent, const char* name ) 01370 : KSelectAction( text, cut, receiver, slot, parent, name ) 01371 { 01372 d = new KFontActionPrivate; 01373 KFontChooser::getFontList( d->m_fonts, 0 ); 01374 KSelectAction::setItems( d->m_fonts ); 01375 setEditable( true ); 01376 } 01377 01378 KFontAction::KFontAction( const QString& text, const QIconSet& pix, 01379 const KShortcut& cut, 01380 QObject* parent, const char* name ) 01381 : KSelectAction( text, pix, cut, parent, name ) 01382 { 01383 d = new KFontActionPrivate; 01384 KFontChooser::getFontList( d->m_fonts, 0 ); 01385 KSelectAction::setItems( d->m_fonts ); 01386 setEditable( true ); 01387 } 01388 01389 KFontAction::KFontAction( const QString& text, const QString& pix, 01390 const KShortcut& cut, 01391 QObject* parent, const char* name ) 01392 : KSelectAction( text, pix, cut, parent, name ) 01393 { 01394 d = new KFontActionPrivate; 01395 KFontChooser::getFontList( d->m_fonts, 0 ); 01396 KSelectAction::setItems( d->m_fonts ); 01397 setEditable( true ); 01398 } 01399 01400 KFontAction::KFontAction( const QString& text, const QIconSet& pix, 01401 const KShortcut& cut, 01402 const QObject* receiver, const char* slot, 01403 QObject* parent, const char* name ) 01404 : KSelectAction( text, pix, cut, receiver, slot, parent, name ) 01405 { 01406 d = new KFontActionPrivate; 01407 KFontChooser::getFontList( d->m_fonts, 0 ); 01408 KSelectAction::setItems( d->m_fonts ); 01409 setEditable( true ); 01410 } 01411 01412 KFontAction::KFontAction( const QString& text, const QString& pix, 01413 const KShortcut& cut, 01414 const QObject* receiver, const char* slot, 01415 QObject* parent, const char* name ) 01416 : KSelectAction( text, pix, cut, receiver, slot, parent, name ) 01417 { 01418 d = new KFontActionPrivate; 01419 KFontChooser::getFontList( d->m_fonts, 0 ); 01420 KSelectAction::setItems( d->m_fonts ); 01421 setEditable( true ); 01422 } 01423 01424 KFontAction::KFontAction( uint fontListCriteria, const QString& text, 01425 const KShortcut& cut, QObject* parent, 01426 const char* name ) 01427 : KSelectAction( text, cut, parent, name ) 01428 { 01429 d = new KFontActionPrivate; 01430 KFontChooser::getFontList( d->m_fonts, fontListCriteria ); 01431 KSelectAction::setItems( d->m_fonts ); 01432 setEditable( true ); 01433 } 01434 01435 KFontAction::KFontAction( uint fontListCriteria, const QString& text, const QString& pix, 01436 const KShortcut& cut, 01437 QObject* parent, const char* name ) 01438 : KSelectAction( text, pix, cut, parent, name ) 01439 { 01440 d = new KFontActionPrivate; 01441 KFontChooser::getFontList( d->m_fonts, fontListCriteria ); 01442 KSelectAction::setItems( d->m_fonts ); 01443 setEditable( true ); 01444 } 01445 01446 KFontAction::KFontAction( QObject* parent, const char* name ) 01447 : KSelectAction( parent, name ) 01448 { 01449 d = new KFontActionPrivate; 01450 KFontChooser::getFontList( d->m_fonts, 0 ); 01451 KSelectAction::setItems( d->m_fonts ); 01452 setEditable( true ); 01453 } 01454 01455 KFontAction::~KFontAction() 01456 { 01457 delete d; 01458 d = 0; 01459 } 01460 01461 /* 01462 * Maintenance note: Keep in sync with KFontCombo::setCurrentFont() 01463 */ 01464 void KFontAction::setFont( const QString &family ) 01465 { 01466 QString lowerName = family.lower(); 01467 int i = 0; 01468 for ( QStringList::Iterator it = d->m_fonts.begin(); it != d->m_fonts.end(); ++it, ++i ) 01469 { 01470 if ((*it).lower() == lowerName) 01471 { 01472 setCurrentItem(i); 01473 return; 01474 } 01475 } 01476 i = lowerName.find(" ["); 01477 if (i>-1) 01478 { 01479 lowerName = lowerName.left(i); 01480 i = 0; 01481 for ( QStringList::Iterator it = d->m_fonts.begin(); it != d->m_fonts.end(); ++it, ++i ) 01482 { 01483 if ((*it).lower() == lowerName) 01484 { 01485 setCurrentItem(i); 01486 return; 01487 } 01488 } 01489 } 01490 01491 lowerName += " ["; 01492 i = 0; 01493 for ( QStringList::Iterator it = d->m_fonts.begin(); it != d->m_fonts.end(); ++it, ++i ) 01494 { 01495 if ((*it).lower().startsWith(lowerName)) 01496 { 01497 setCurrentItem(i); 01498 return; 01499 } 01500 } 01501 kdDebug(129) << "Font not found " << family.lower() << endl; 01502 } 01503 01504 int KFontAction::plug( QWidget *w, int index ) 01505 { 01506 if (kapp && !kapp->authorizeKAction(name())) 01507 return -1; 01508 if ( ::qt_cast<KToolBar *>( w ) ) 01509 { 01510 KToolBar* bar = static_cast<KToolBar*>( w ); 01511 int id_ = KAction::getToolButtonID(); 01512 KFontCombo *cb = new KFontCombo( items(), bar ); 01513 connect( cb, SIGNAL( activated( const QString & ) ), 01514 SLOT( slotActivated( const QString & ) ) ); 01515 cb->setEnabled( isEnabled() ); 01516 bar->insertWidget( id_, comboWidth(), cb, index ); 01517 cb->setMinimumWidth( cb->sizeHint().width() ); 01518 01519 addContainer( bar, id_ ); 01520 01521 connect( bar, SIGNAL( destroyed() ), this, SLOT( slotDestroyed() ) ); 01522 01523 updateCurrentItem( containerCount() - 1 ); 01524 01525 return containerCount() - 1; 01526 } 01527 else return KSelectAction::plug( w, index ); 01528 } 01529 01530 class KFontSizeAction::KFontSizeActionPrivate 01531 { 01532 public: 01533 KFontSizeActionPrivate() 01534 { 01535 } 01536 }; 01537 01538 KFontSizeAction::KFontSizeAction( const QString& text, 01539 const KShortcut& cut, 01540 QObject* parent, const char* name ) 01541 : KSelectAction( text, cut, parent, name ) 01542 { 01543 init(); 01544 } 01545 01546 KFontSizeAction::KFontSizeAction( const QString& text, 01547 const KShortcut& cut, 01548 const QObject* receiver, const char* slot, 01549 QObject* parent, const char* name ) 01550 : KSelectAction( text, cut, receiver, slot, parent, name ) 01551 { 01552 init(); 01553 } 01554 01555 KFontSizeAction::KFontSizeAction( const QString& text, const QIconSet& pix, 01556 const KShortcut& cut, 01557 QObject* parent, const char* name ) 01558 : KSelectAction( text, pix, cut, parent, name ) 01559 { 01560 init(); 01561 } 01562 01563 KFontSizeAction::KFontSizeAction( const QString& text, const QString& pix, 01564 const KShortcut& cut, 01565 QObject* parent, const char* name ) 01566 : KSelectAction( text, pix, cut, parent, name ) 01567 { 01568 init(); 01569 } 01570 01571 KFontSizeAction::KFontSizeAction( const QString& text, const QIconSet& pix, 01572 const KShortcut& cut, 01573 const QObject* receiver, 01574 const char* slot, QObject* parent, 01575 const char* name ) 01576 : KSelectAction( text, pix, cut, receiver, slot, parent, name ) 01577 { 01578 init(); 01579 } 01580 01581 KFontSizeAction::KFontSizeAction( const QString& text, const QString& pix, 01582 const KShortcut& cut, 01583 const QObject* receiver, 01584 const char* slot, QObject* parent, 01585 const char* name ) 01586 : KSelectAction( text, pix, cut, receiver, slot, parent, name ) 01587 { 01588 init(); 01589 } 01590 01591 KFontSizeAction::KFontSizeAction( QObject* parent, const char* name ) 01592 : KSelectAction( parent, name ) 01593 { 01594 init(); 01595 } 01596 01597 KFontSizeAction::~KFontSizeAction() 01598 { 01599 delete d; 01600 d = 0; 01601 } 01602 01603 void KFontSizeAction::init() 01604 { 01605 d = new KFontSizeActionPrivate; 01606 01607 setEditable( true ); 01608 QFontDatabase fontDB; 01609 QValueList<int> sizes = fontDB.standardSizes(); 01610 QStringList lst; 01611 for ( QValueList<int>::Iterator it = sizes.begin(); it != sizes.end(); ++it ) 01612 lst.append( QString::number( *it ) ); 01613 01614 setItems( lst ); 01615 } 01616 01617 void KFontSizeAction::setFontSize( int size ) 01618 { 01619 if ( size == fontSize() ) { 01620 setCurrentItem( items().findIndex( QString::number( size ) ) ); 01621 return; 01622 } 01623 01624 if ( size < 1 ) { 01625 kdWarning() << "KFontSizeAction: Size " << size << " is out of range" << endl; 01626 return; 01627 } 01628 01629 int index = items().findIndex( QString::number( size ) ); 01630 if ( index == -1 ) { 01631 // Insert at the correct position in the list (to keep sorting) 01632 QValueList<int> lst; 01633 // Convert to list of ints 01634 QStringList itemsList = items(); 01635 for (QStringList::Iterator it = itemsList.begin() ; it != itemsList.end() ; ++it) 01636 lst.append( (*it).toInt() ); 01637 // New size 01638 lst.append( size ); 01639 // Sort the list 01640 qHeapSort( lst ); 01641 // Convert back to string list 01642 QStringList strLst; 01643 for (QValueList<int>::Iterator it = lst.begin() ; it != lst.end() ; ++it) 01644 strLst.append( QString::number(*it) ); 01645 KSelectAction::setItems( strLst ); 01646 // Find new current item 01647 index = lst.findIndex( size ); 01648 setCurrentItem( index ); 01649 } 01650 else 01651 setCurrentItem( index ); 01652 01653 01654 //emit KAction::activated(); 01655 //emit activated( index ); 01656 //emit activated( QString::number( size ) ); 01657 //emit fontSizeChanged( size ); 01658 } 01659 01660 int KFontSizeAction::fontSize() const 01661 { 01662 return currentText().toInt(); 01663 } 01664 01665 void KFontSizeAction::slotActivated( int index ) 01666 { 01667 KSelectAction::slotActivated( index ); 01668 01669 emit fontSizeChanged( items()[ index ].toInt() ); 01670 } 01671 01672 void KFontSizeAction::slotActivated( const QString& size ) 01673 { 01674 setFontSize( size.toInt() ); // insert sorted first 01675 KSelectAction::slotActivated( size ); 01676 emit fontSizeChanged( size.toInt() ); 01677 } 01678 01679 class KActionMenu::KActionMenuPrivate 01680 { 01681 public: 01682 KActionMenuPrivate() 01683 { 01684 m_popup = new KPopupMenu(0L,"KActionMenu::KActionMenuPrivate"); 01685 m_delayed = true; 01686 m_stickyMenu = true; 01687 } 01688 ~KActionMenuPrivate() 01689 { 01690 delete m_popup; m_popup = 0; 01691 } 01692 KPopupMenu *m_popup; 01693 bool m_delayed; 01694 bool m_stickyMenu; 01695 }; 01696 01697 KActionMenu::KActionMenu( QObject* parent, const char* name ) 01698 : KAction( parent, name ) 01699 { 01700 d = new KActionMenuPrivate; 01701 setShortcutConfigurable( false ); 01702 } 01703 01704 KActionMenu::KActionMenu( const QString& text, QObject* parent, 01705 const char* name ) 01706 : KAction( text, 0, parent, name ) 01707 { 01708 d = new KActionMenuPrivate; 01709 setShortcutConfigurable( false ); 01710 } 01711 01712 KActionMenu::KActionMenu( const QString& text, const QIconSet& icon, 01713 QObject* parent, const char* name ) 01714 : KAction( text, icon, 0, parent, name ) 01715 { 01716 d = new KActionMenuPrivate; 01717 setShortcutConfigurable( false ); 01718 } 01719 01720 KActionMenu::KActionMenu( const QString& text, const QString& icon, 01721 QObject* parent, const char* name ) 01722 : KAction( text, icon, 0, parent, name ) 01723 { 01724 d = new KActionMenuPrivate; 01725 setShortcutConfigurable( false ); 01726 } 01727 01728 KActionMenu::~KActionMenu() 01729 { 01730 unplugAll(); 01731 kdDebug(129) << "KActionMenu::~KActionMenu()" << endl; // ellis 01732 delete d; d = 0; 01733 } 01734 01735 void KActionMenu::popup( const QPoint& global ) 01736 { 01737 popupMenu()->popup( global ); 01738 } 01739 01740 KPopupMenu* KActionMenu::popupMenu() const 01741 { 01742 return d->m_popup; 01743 } 01744 01745 void KActionMenu::insert( KAction* cmd, int index ) 01746 { 01747 if ( cmd ) 01748 cmd->plug( d->m_popup, index ); 01749 } 01750 01751 void KActionMenu::remove( KAction* cmd ) 01752 { 01753 if ( cmd ) 01754 cmd->unplug( d->m_popup ); 01755 } 01756 01757 bool KActionMenu::delayed() const { 01758 return d->m_delayed; 01759 } 01760 01761 void KActionMenu::setDelayed(bool _delayed) { 01762 d->m_delayed = _delayed; 01763 } 01764 01765 bool KActionMenu::stickyMenu() const { 01766 return d->m_stickyMenu; 01767 } 01768 01769 void KActionMenu::setStickyMenu(bool sticky) { 01770 d->m_stickyMenu = sticky; 01771 } 01772 01773 int KActionMenu::plug( QWidget* widget, int index ) 01774 { 01775 if (kapp && !kapp->authorizeKAction(name())) 01776 return -1; 01777 kdDebug(129) << "KActionMenu::plug( " << widget << ", " << index << " )" << endl; // remove -- ellis 01778 if ( ::qt_cast<QPopupMenu *>( widget ) ) 01779 { 01780 QPopupMenu* menu = static_cast<QPopupMenu*>( widget ); 01781 int id; 01782 if ( hasIcon() ) 01783 id = menu->insertItem( iconSet(), text(), d->m_popup, -1, index ); 01784 else 01785 id = menu->insertItem( text(), d->m_popup, -1, index ); 01786 01787 if ( !isEnabled() ) 01788 menu->setItemEnabled( id, false ); 01789 01790 addContainer( menu, id ); 01791 connect( menu, SIGNAL( destroyed() ), this, SLOT( slotDestroyed() ) ); 01792 01793 if ( m_parentCollection ) 01794 m_parentCollection->connectHighlight( menu, this ); 01795 01796 return containerCount() - 1; 01797 } 01798 else if ( ::qt_cast<KToolBar *>( widget ) ) 01799 { 01800 KToolBar *bar = static_cast<KToolBar *>( widget ); 01801 01802 int id_ = KAction::getToolButtonID(); 01803 01804 if ( icon().isEmpty() && !iconSet().isNull() ) 01805 bar->insertButton( iconSet().pixmap(), id_, SIGNAL( clicked() ), this, 01806 SLOT( slotActivated() ), isEnabled(), plainText(), 01807 index ); 01808 else 01809 { 01810 KInstance *instance; 01811 01812 if ( m_parentCollection ) 01813 instance = m_parentCollection->instance(); 01814 else 01815 instance = KGlobal::instance(); 01816 01817 bar->insertButton( icon(), id_, SIGNAL( clicked() ), this, 01818 SLOT( slotActivated() ), isEnabled(), plainText(), 01819 index, instance ); 01820 } 01821 01822 addContainer( bar, id_ ); 01823 01824 if (!whatsThis().isEmpty()) 01825 QWhatsThis::add( bar->getButton(id_), whatsThis() ); 01826 01827 connect( bar, SIGNAL( destroyed() ), this, SLOT( slotDestroyed() ) ); 01828 01829 if (delayed()) { 01830 bar->setDelayedPopup( id_, popupMenu(), stickyMenu() ); 01831 } else { 01832 bar->getButton(id_)->setPopup(popupMenu(), stickyMenu() ); 01833 } 01834 01835 if ( m_parentCollection ) 01836 m_parentCollection->connectHighlight( bar, this ); 01837 01838 return containerCount() - 1; 01839 } 01840 else if ( ::qt_cast<QMenuBar *>( widget ) ) 01841 { 01842 QMenuBar *bar = static_cast<QMenuBar *>( widget ); 01843 01844 int id; 01845 01846 id = bar->insertItem( text(), popupMenu(), -1, index ); 01847 01848 if ( !isEnabled() ) 01849 bar->setItemEnabled( id, false ); 01850 01851 addContainer( bar, id ); 01852 connect( bar, SIGNAL( destroyed() ), this, SLOT( slotDestroyed() ) ); 01853 01854 return containerCount() - 1; 01855 } 01856 01857 return -1; 01858 } 01859 01861 01862 KToolBarPopupAction::KToolBarPopupAction( const QString& text, 01863 const QString& icon, 01864 const KShortcut& cut, 01865 QObject* parent, const char* name ) 01866 : KAction( text, icon, cut, parent, name ) 01867 { 01868 m_popup = 0; 01869 m_delayed = true; 01870 m_stickyMenu = true; 01871 } 01872 01873 KToolBarPopupAction::KToolBarPopupAction( const QString& text, 01874 const QString& icon, 01875 const KShortcut& cut, 01876 const QObject* receiver, 01877 const char* slot, QObject* parent, 01878 const char* name ) 01879 : KAction( text, icon, cut, receiver, slot, parent, name ) 01880 { 01881 m_popup = 0; 01882 m_delayed = true; 01883 m_stickyMenu = true; 01884 } 01885 01886 KToolBarPopupAction::KToolBarPopupAction( const KGuiItem& item, 01887 const KShortcut& cut, 01888 const QObject* receiver, 01889 const char* slot, KActionCollection* parent, 01890 const char* name ) 01891 : KAction( item, cut, receiver, slot, parent, name ) 01892 { 01893 m_popup = 0; 01894 m_delayed = true; 01895 m_stickyMenu = true; 01896 } 01897 01898 KToolBarPopupAction::~KToolBarPopupAction() 01899 { 01900 delete m_popup; 01901 } 01902 01903 bool KToolBarPopupAction::delayed() const { 01904 return m_delayed; 01905 } 01906 01907 void KToolBarPopupAction::setDelayed(bool delayed) { 01908 m_delayed = delayed; 01909 } 01910 01911 bool KToolBarPopupAction::stickyMenu() const { 01912 return m_stickyMenu; 01913 } 01914 01915 void KToolBarPopupAction::setStickyMenu(bool sticky) { 01916 m_stickyMenu = sticky; 01917 } 01918 01919 int KToolBarPopupAction::plug( QWidget *widget, int index ) 01920 { 01921 if (kapp && !kapp->authorizeKAction(name())) 01922 return -1; 01923 // This is very related to KActionMenu::plug. 01924 // In fact this class could be an interesting base class for KActionMenu 01925 if ( ::qt_cast<KToolBar *>( widget ) ) 01926 { 01927 KToolBar *bar = (KToolBar *)widget; 01928 01929 int id_ = KAction::getToolButtonID(); 01930 01931 if ( icon().isEmpty() && !iconSet().isNull() ) { 01932 bar->insertButton( iconSet().pixmap(), id_, SIGNAL( buttonClicked(int, Qt::ButtonState) ), this, 01933 SLOT( slotButtonClicked(int, Qt::ButtonState) ), 01934 isEnabled(), plainText(), 01935 index ); 01936 } else { 01937 KInstance * instance; 01938 if ( m_parentCollection ) 01939 instance = m_parentCollection->instance(); 01940 else 01941 instance = KGlobal::instance(); 01942 01943 bar->insertButton( icon(), id_, SIGNAL( buttonClicked(int, Qt::ButtonState) ), this, 01944 SLOT( slotButtonClicked(int, Qt::ButtonState) ), 01945 isEnabled(), plainText(), 01946 index, instance ); 01947 } 01948 01949 addContainer( bar, id_ ); 01950 01951 connect( bar, SIGNAL( destroyed() ), this, SLOT( slotDestroyed() ) ); 01952 01953 if (delayed()) { 01954 bar->setDelayedPopup( id_, popupMenu(), stickyMenu() ); 01955 } else { 01956 bar->getButton(id_)->setPopup(popupMenu(), stickyMenu()); 01957 } 01958 01959 if ( !whatsThis().isEmpty() ) 01960 QWhatsThis::add( bar->getButton( id_ ), whatsThisWithIcon() ); 01961 01962 return containerCount() - 1; 01963 } 01964 01965 return KAction::plug( widget, index ); 01966 } 01967 01968 KPopupMenu *KToolBarPopupAction::popupMenu() const 01969 { 01970 if ( !m_popup ) { 01971 KToolBarPopupAction *that = const_cast<KToolBarPopupAction*>(this); 01972 that->m_popup = new KPopupMenu; 01973 } 01974 return m_popup; 01975 } 01976 01978 01979 KToggleToolBarAction::KToggleToolBarAction( const char* toolBarName, 01980 const QString& text, KActionCollection* parent, const char* name ) 01981 : KToggleAction( text, KShortcut(), parent, name ) 01982 , m_toolBarName( toolBarName ) 01983 , m_toolBar( 0L ) 01984 { 01985 } 01986 01987 KToggleToolBarAction::KToggleToolBarAction( KToolBar *toolBar, const QString &text, 01988 KActionCollection *parent, const char *name ) 01989 : KToggleAction( text, KShortcut(), parent, name ) 01990 , m_toolBarName( 0 ), m_toolBar( toolBar ) 01991 { 01992 } 01993 01994 KToggleToolBarAction::~KToggleToolBarAction() 01995 { 01996 } 01997 01998 int KToggleToolBarAction::plug( QWidget* w, int index ) 01999 { 02000 if (kapp && !kapp->authorizeKAction(name())) 02001 return -1; 02002 02003 if ( !m_toolBar ) { 02004 // Note: topLevelWidget() stops too early, we can't use it. 02005 QWidget * tl = w; 02006 QWidget * n; 02007 while ( !tl->isDialog() && ( n = tl->parentWidget() ) ) // lookup parent and store 02008 tl = n; 02009 02010 KMainWindow * mw = dynamic_cast<KMainWindow *>(tl); // try to see if it's a kmainwindow 02011 02012 if ( mw ) 02013 m_toolBar = mw->toolBar( m_toolBarName ); 02014 } 02015 02016 if( m_toolBar ) { 02017 setChecked( m_toolBar->isVisible() ); 02018 connect( m_toolBar, SIGNAL(visibilityChanged(bool)), this, SLOT(setChecked(bool)) ); 02019 // Also emit toggled when the toolbar's visibility changes (see comment in header) 02020 connect( m_toolBar, SIGNAL(visibilityChanged(bool)), this, SIGNAL(toggled(bool)) ); 02021 } else { 02022 setEnabled( false ); 02023 } 02024 02025 return KToggleAction::plug( w, index ); 02026 } 02027 02028 void KToggleToolBarAction::setChecked( bool c ) 02029 { 02030 if( m_toolBar && c != m_toolBar->isVisible() ) { 02031 if( c ) { 02032 m_toolBar->show(); 02033 } else { 02034 m_toolBar->hide(); 02035 } 02036 QMainWindow* mw = m_toolBar->mainWindow(); 02037 if ( mw && ::qt_cast<KMainWindow *>( mw ) ) 02038 static_cast<KMainWindow *>( mw )->setSettingsDirty(); 02039 } 02040 KToggleAction::setChecked( c ); 02041 } 02042 02044 02045 KToggleFullScreenAction::KToggleFullScreenAction( const KShortcut &cut, 02046 const QObject* receiver, const char* slot, 02047 QObject* parent, QWidget* window, 02048 const char* name ) 02049 : KToggleAction( QString::null, cut, receiver, slot, parent, name ), 02050 window( NULL ) 02051 { 02052 setWindow( window ); 02053 } 02054 02055 KToggleFullScreenAction::~KToggleFullScreenAction() 02056 { 02057 } 02058 02059 void KToggleFullScreenAction::setWindow( QWidget* w ) 02060 { 02061 if( window ) 02062 window->removeEventFilter( this ); 02063 window = w; 02064 if( window ) 02065 window->installEventFilter( this ); 02066 } 02067 02068 void KToggleFullScreenAction::setChecked( bool c ) 02069 { 02070 if (c) 02071 { 02072 setText(i18n("Exit F&ull Screen Mode")); 02073 setIcon("window_nofullscreen"); 02074 } 02075 else 02076 { 02077 setText(i18n("F&ull Screen Mode")); 02078 setIcon("window_fullscreen"); 02079 } 02080 KToggleAction::setChecked( c ); 02081 } 02082 02083 bool KToggleFullScreenAction::eventFilter( QObject* o, QEvent* e ) 02084 { 02085 if( o == window ) 02086 if( e->type() == QEvent::WindowStateChange ) 02087 { 02088 if( window->isFullScreen() != isChecked()) 02089 slotActivated(); // setChecked( window->isFullScreen()) wouldn't emit signals 02090 } 02091 return false; 02092 } 02093 02095 02096 KWidgetAction::KWidgetAction( QWidget* widget, 02097 const QString& text, const KShortcut& cut, 02098 const QObject* receiver, const char* slot, 02099 KActionCollection* parent, const char* name ) 02100 : KAction( text, cut, receiver, slot, parent, name ) 02101 , m_widget( widget ) 02102 , m_autoSized( false ) 02103 { 02104 connect( this, SIGNAL(enabled(bool)), widget, SLOT(setEnabled(bool)) ); 02105 } 02106 02107 KWidgetAction::~KWidgetAction() 02108 { 02109 } 02110 02111 void KWidgetAction::setAutoSized( bool autoSized ) 02112 { 02113 if( m_autoSized == autoSized ) 02114 return; 02115 02116 m_autoSized = autoSized; 02117 02118 if( !m_widget || !isPlugged() ) 02119 return; 02120 02121 KToolBar* toolBar = (KToolBar*)m_widget->parent(); 02122 int i = findContainer( toolBar ); 02123 if ( i == -1 ) 02124 return; 02125 int id = itemId( i ); 02126 02127 toolBar->setItemAutoSized( id, m_autoSized ); 02128 } 02129 02130 int KWidgetAction::plug( QWidget* w, int index ) 02131 { 02132 if (kapp && !kapp->authorizeKAction(name())) 02133 return -1; 02134 02135 if ( !::qt_cast<KToolBar *>( w ) ) { 02136 kdError() << "KWidgetAction::plug: KWidgetAction must be plugged into KToolBar." << endl; 02137 return -1; 02138 } 02139 if ( !m_widget ) { 02140 kdError() << "KWidgetAction::plug: Widget was deleted or null!" << endl; 02141 return -1; 02142 } 02143 02144 KToolBar* toolBar = static_cast<KToolBar*>( w ); 02145 02146 int id = KAction::getToolButtonID(); 02147 02148 m_widget->reparent( toolBar, QPoint() ); 02149 toolBar->insertWidget( id, 0, m_widget, index ); 02150 toolBar->setItemAutoSized( id, m_autoSized ); 02151 02152 QWhatsThis::add( m_widget, whatsThis() ); 02153 addContainer( toolBar, id ); 02154 02155 connect( toolBar, SIGNAL( toolbarDestroyed() ), this, SLOT( slotToolbarDestroyed() ) ); 02156 connect( toolBar, SIGNAL( destroyed() ), this, SLOT( slotDestroyed() ) ); 02157 02158 return containerCount() - 1; 02159 } 02160 02161 void KWidgetAction::unplug( QWidget *w ) 02162 { 02163 if( !m_widget || !isPlugged() ) 02164 return; 02165 02166 KToolBar* toolBar = (KToolBar*)m_widget->parent(); 02167 if ( toolBar == w ) 02168 { 02169 disconnect( toolBar, SIGNAL( toolbarDestroyed() ), this, SLOT( slotToolbarDestroyed() ) ); 02170 m_widget->reparent( 0L, QPoint(), false /*showIt*/ ); 02171 } 02172 KAction::unplug( w ); 02173 } 02174 02175 void KWidgetAction::slotToolbarDestroyed() 02176 { 02177 //Q_ASSERT( m_widget ); // When exiting the app the widget could be destroyed before the toolbar. 02178 Q_ASSERT( isPlugged() ); 02179 if( !m_widget || !isPlugged() ) 02180 return; 02181 02182 // Don't let a toolbar being destroyed, delete my widget. 02183 m_widget->reparent( 0L, QPoint(), false /*showIt*/ ); 02184 } 02185 02187 02188 KActionSeparator::KActionSeparator( QObject *parent, const char *name ) 02189 : KAction( parent, name ) 02190 { 02191 } 02192 02193 KActionSeparator::~KActionSeparator() 02194 { 02195 } 02196 02197 int KActionSeparator::plug( QWidget *widget, int index ) 02198 { 02199 if ( ::qt_cast<QPopupMenu *>( widget) ) 02200 { 02201 QPopupMenu* menu = static_cast<QPopupMenu*>( widget ); 02202 02203 int id = menu->insertSeparator( index ); 02204 02205 addContainer( menu, id ); 02206 connect( menu, SIGNAL( destroyed() ), this, SLOT( slotDestroyed() ) ); 02207 02208 return containerCount() - 1; 02209 } 02210 else if ( ::qt_cast<QMenuBar *>( widget ) ) 02211 { 02212 QMenuBar *menuBar = static_cast<QMenuBar *>( widget ); 02213 02214 int id = menuBar->insertSeparator( index ); 02215 02216 addContainer( menuBar, id ); 02217 02218 connect( menuBar, SIGNAL( destroyed() ), this, SLOT( slotDestroyed() ) ); 02219 02220 return containerCount() - 1; 02221 } 02222 else if ( ::qt_cast<KToolBar *>( widget ) ) 02223 { 02224 KToolBar *toolBar = static_cast<KToolBar *>( widget ); 02225 02226 int id = toolBar->insertSeparator( index ); 02227 02228 addContainer( toolBar, id ); 02229 02230 connect( toolBar, SIGNAL( destroyed() ), this, SLOT( slotDestroyed() ) ); 02231 02232 return containerCount() - 1; 02233 } 02234 02235 return -1; 02236 } 02237 02238 KPasteTextAction::KPasteTextAction( const QString& text, 02239 const QString& icon, 02240 const KShortcut& cut, 02241 const QObject* receiver, 02242 const char* slot, QObject* parent, 02243 const char* name) 02244 : KAction( text, icon, cut, receiver, slot, parent, name ) 02245 { 02246 m_popup = new KPopupMenu; 02247 connect(m_popup, SIGNAL(aboutToShow()), this, SLOT(menuAboutToShow())); 02248 connect(m_popup, SIGNAL(activated(int)), this, SLOT(menuItemActivated(int))); 02249 m_popup->setCheckable(true); 02250 m_mixedMode = true; 02251 } 02252 02253 KPasteTextAction::~KPasteTextAction() 02254 { 02255 delete m_popup; 02256 } 02257 02258 void KPasteTextAction::setMixedMode(bool mode) 02259 { 02260 m_mixedMode = mode; 02261 } 02262 02263 int KPasteTextAction::plug( QWidget *widget, int index ) 02264 { 02265 if (kapp && !kapp->authorizeKAction(name())) 02266 return -1; 02267 if ( ::qt_cast<KToolBar *>( widget ) ) 02268 { 02269 KToolBar *bar = (KToolBar *)widget; 02270 02271 int id_ = KAction::getToolButtonID(); 02272 02273 KInstance * instance; 02274 if ( m_parentCollection ) 02275 instance = m_parentCollection->instance(); 02276 else 02277 instance = KGlobal::instance(); 02278 02279 bar->insertButton( icon(), id_, SIGNAL( clicked() ), this, 02280 SLOT( slotActivated() ), isEnabled(), plainText(), 02281 index, instance ); 02282 02283 addContainer( bar, id_ ); 02284 02285 connect( bar, SIGNAL( destroyed() ), this, SLOT( slotDestroyed() ) ); 02286 02287 bar->setDelayedPopup( id_, m_popup, true ); 02288 02289 if ( !whatsThis().isEmpty() ) 02290 QWhatsThis::add( bar->getButton( id_ ), whatsThisWithIcon() ); 02291 02292 return containerCount() - 1; 02293 } 02294 02295 return KAction::plug( widget, index ); 02296 } 02297 02298 void KPasteTextAction::menuAboutToShow() 02299 { 02300 m_popup->clear(); 02301 QStringList list; 02302 DCOPClient *client = kapp->dcopClient(); 02303 if (client->isAttached() && client->isApplicationRegistered("klipper")) { 02304 DCOPRef klipper("klipper","klipper"); 02305 DCOPReply reply = klipper.call("getClipboardHistoryMenu"); 02306 if (reply.isValid()) 02307 list = reply; 02308 } 02309 QString clipboardText = qApp->clipboard()->text(QClipboard::Clipboard); 02310 if (list.isEmpty()) 02311 list << clipboardText; 02312 bool found = false; 02313 for ( QStringList::ConstIterator it = list.begin(); it != list.end(); ++it ) 02314 { 02315 QString text = KStringHandler::cEmSqueeze((*it).simplifyWhiteSpace(), m_popup->fontMetrics(), 20); 02316 text.replace("&", "&&"); 02317 int id = m_popup->insertItem(text); 02318 if (!found && *it == clipboardText) 02319 { 02320 m_popup->setItemChecked(id, true); 02321 found = true; 02322 } 02323 } 02324 } 02325 02326 void KPasteTextAction::menuItemActivated( int id) 02327 { 02328 DCOPClient *client = kapp->dcopClient(); 02329 if (client->isAttached() && client->isApplicationRegistered("klipper")) { 02330 DCOPRef klipper("klipper","klipper"); 02331 DCOPReply reply = klipper.call("getClipboardHistoryItem(int)", m_popup->indexOf(id)); 02332 if (!reply.isValid()) 02333 return; 02334 QString clipboardText = reply; 02335 reply = klipper.call("setClipboardContents(QString)", clipboardText); 02336 if (reply.isValid()) 02337 kdDebug(129) << "Clipboard: " << qApp->clipboard()->text(QClipboard::Clipboard) << endl; 02338 } 02339 QTimer::singleShot(20, this, SLOT(slotActivated())); 02340 } 02341 02342 void KPasteTextAction::slotActivated() 02343 { 02344 if (!m_mixedMode) { 02345 QWidget *w = qApp->widgetAt(QCursor::pos(), true); 02346 QMimeSource *data = QApplication::clipboard()->data(); 02347 if (!data->provides("text/plain") && w) { 02348 m_popup->popup(w->mapToGlobal(QPoint(0, w->height()))); 02349 } else 02350 KAction::slotActivated(); 02351 } else 02352 KAction::slotActivated(); 02353 } 02354 02355 02356 void KToggleAction::virtual_hook( int id, void* data ) 02357 { KAction::virtual_hook( id, data ); } 02358 02359 void KRadioAction::virtual_hook( int id, void* data ) 02360 { KToggleAction::virtual_hook( id, data ); } 02361 02362 void KSelectAction::virtual_hook( int id, void* data ) 02363 { KAction::virtual_hook( id, data ); } 02364 02365 void KListAction::virtual_hook( int id, void* data ) 02366 { KSelectAction::virtual_hook( id, data ); } 02367 02368 void KRecentFilesAction::virtual_hook( int id, void* data ) 02369 { KListAction::virtual_hook( id, data ); } 02370 02371 void KFontAction::virtual_hook( int id, void* data ) 02372 { KSelectAction::virtual_hook( id, data ); } 02373 02374 void KFontSizeAction::virtual_hook( int id, void* data ) 02375 { KSelectAction::virtual_hook( id, data ); } 02376 02377 void KActionMenu::virtual_hook( int id, void* data ) 02378 { KAction::virtual_hook( id, data ); } 02379 02380 void KToolBarPopupAction::virtual_hook( int id, void* data ) 02381 { KAction::virtual_hook( id, data ); } 02382 02383 void KToggleToolBarAction::virtual_hook( int id, void* data ) 02384 { KToggleAction::virtual_hook( id, data ); } 02385 02386 void KToggleFullScreenAction::virtual_hook( int id, void* data ) 02387 { KToggleAction::virtual_hook( id, data ); } 02388 02389 void KWidgetAction::virtual_hook( int id, void* data ) 02390 { KAction::virtual_hook( id, data ); } 02391 02392 void KActionSeparator::virtual_hook( int id, void* data ) 02393 { KAction::virtual_hook( id, data ); } 02394 02395 void KPasteTextAction::virtual_hook( int id, void* data ) 02396 { KAction::virtual_hook( id, data ); } 02397 02398 /* vim: et sw=2 ts=2 02399 */ 02400 02401 #include "kactionclasses.moc"