| # kdeui Library API Documentation
Overview | Class Hierarchy | Classes | Classes (annotated) | Members | Namespaces | Source Files

# kkeydialog.cpp

    00001 /* This file is part of the KDE libraries
    00002     Copyright (C) 1998 Mark Donohoe <donohoe@kde.org>
    00003     Copyright (C) 1997 Nicolas Hadacek <hadacek@kde.org>
    00004     Copyright (C) 1998 Matthias Ettrich <ettrich@kde.org>
    00005     Copyright (C) 2001 Ellis Whitehead <ellis@kde.org>
    00006
    00007     This library is free software; you can redistribute it and/or
    00008     modify it under the terms of the GNU Library General Public
    00009     License as published by the Free Software Foundation; either
    00010     version 2 of the License, or (at your option) any later version.
    00011
    00012     This library is distributed in the hope that it will be useful,
    00013     but WITHOUT ANY WARRANTY; without even the implied warranty of
    00014     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    00015     Library General Public License for more details.
    00016
    00017     You should have received a copy of the GNU Library General Public License
    00018     along with this library; see the file COPYING.LIB.  If not, write to
    00019     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    00020     Boston, MA 02111-1307, USA.
    00021 */
    00022
    00023 #include "kkeydialog.h"
    00024 #include "kkeybutton.h"
    00025
    00026 #include <string.h>
    00027
    00028 #include <qbuttongroup.h>
    00029 #include <qlabel.h>
    00030 #include <qlayout.h>
    00031 #include <qdrawutil.h>
    00032 #include <qpainter.h>
    00033 #include <qradiobutton.h>
    00034 #include <qregexp.h>
    00035 #include <qtoolbutton.h>
    00036 #include <qwhatsthis.h>
    00037
    00038 #include <kaccel.h>
    00039 #include <kaction.h>
    00040 #include <kaccelaction.h>
    00041 #include <kactionshortcutlist.h>
    00042 #include <kapplication.h>
    00043 #include <kconfig.h>
    00044 #include <kdebug.h>
    00045 #include <kglobal.h>
    00046 #include <kglobalaccel.h>
    00047 #include <kiconloader.h>
    00048 #include <klistviewsearchline.h>
    00049 #include <klocale.h>
    00050 #include <kmessagebox.h>
    00051 #include <kshortcut.h>
    00052 #include <kshortcutlist.h>
    00053 #include <kxmlguifactory.h>
    00054 #include <kaboutdata.h>
    00055 #include <kstaticdeleter.h>
    00056
    00057 #ifdef Q_WS_X11
    00058 #define XK_XKB_KEYS
    00059 #define XK_MISCELLANY
    00060 #include <X11/Xlib.h>   // For x11Event()
    00061 #include <X11/keysymdef.h> // For XK_...
    00062 #include <qwhatsthis.h>
    00063
    00064 #ifdef KeyPress
    00065 const int XFocusOut = FocusOut;
    00066 const int XFocusIn = FocusIn;
    00067 const int XKeyPress = KeyPress;
    00068 const int XKeyRelease = KeyRelease;
    00069 #undef KeyRelease
    00070 #undef KeyPress
    00071 #undef FocusOut
    00072 #undef FocusIn
    00073 #endif // KEYPRESS
    00074 #endif // Q_WX_X11
    00075
    00076 //---------------------------------------------------------------------
    00077 // KKeyChooserItem
    00078 //---------------------------------------------------------------------
    00079
    00080 class KKeyChooserItem : public KListViewItem
    00081 {
    00082  public:
    00083     KKeyChooserItem( KListView* parent, QListViewItem* after, KShortcutList* pList, uint iAction );
    00084     KKeyChooserItem( QListViewItem* parent, QListViewItem* after, KShortcutList* pList, uint iAction );
    00085
    00086     QString actionName() const;
    00087     const KShortcut& shortcut() const;
    00088     bool isConfigurable() const
    00089         { return m_pList->isConfigurable( m_iAction ); }
    00090     const KShortcut& shortcutDefault() const
    00091         { return m_pList->shortcutDefault( m_iAction ); }
    00092         QString whatsThis() const
    00093         { return m_pList->whatsThis( m_iAction ); }
    00094
    00095     void setShortcut( const KShortcut& cut );
    00096     void commitChanges();
    00097
    00098     virtual QString text( int iCol ) const;
    00099     virtual int compare( QListViewItem*, int iCol, bool bAscending ) const;
    00100
    00101  protected:
    00102     KShortcutList* m_pList;
    00103     uint m_iAction;
    00104     bool m_bModified;
    00105     KShortcut m_cut;
    00106 };
    00107
    00108 // WhatsThis on KKeyChooserItems
    00109 class KKeyChooserWhatsThis : public QWhatsThis
    00110 {
    00111 public:
    00112     KKeyChooserWhatsThis( QListView* listview )
    00113         : QWhatsThis( listview->viewport() ), m_listView( listview ) {}
    00114
    00115 protected:
    00116     virtual QString text( const QPoint& p );
    00117
    00118 private:
    00119     QListView* m_listView;
    00120 };
    00121
    00122 //---------------------------------------------------------------------
    00123 // KKeyChooserPrivate
    00124 //---------------------------------------------------------------------
    00125
    00126 class KKeyChooserPrivate
    00127 {
    00128  public:
    00129     QValueList<KShortcutList*> rgpLists;
    00130     QValueList<KShortcutList*> rgpListsAllocated;
    00131
    00132     KListView *pList;
    00133     QLabel *lInfo;
    00134     KKeyButton *pbtnShortcut;
    00135     QGroupBox *fCArea;
    00136     QButtonGroup *kbGroup;
    00137
    00138     QMap<QString, KShortcut> mapGlobals;
    00139
    00140     // If this is set, then shortcuts require a modifier:
    00141     //  so 'A' would not be valid, whereas 'Ctrl+A' would be.
    00142     // Note, however, that this only applies to printable characters.
    00143     //  'F1', 'Insert', etc., could still be used.
    00144     bool bAllowLetterShortcuts;
    00145     // When set, pressing the 'Default' button will select the aDefaultKeycode4,
    00146     //  otherwise aDefaultKeycode.
    00147     bool bPreferFourModifierKeys;
    00148 };
    00149
    00150 //---------------------------------------------------------------------
    00151 // KKeyChooser
    00152 //---------------------------------------------------------------------
    00153
    00154 KKeyChooser::KKeyChooser( QWidget* parent, ActionType type, bool bAllowLetterShortcuts )
    00155 : QWidget( parent )
    00156 {
    00157     initGUI( type, bAllowLetterShortcuts );
    00158 }
    00159
    00160 KKeyChooser::KKeyChooser( KActionCollection* coll, QWidget* parent, bool bAllowLetterShortcuts )
    00161 : QWidget( parent )
    00162 {
    00163     initGUI( Application, bAllowLetterShortcuts );
    00164     insert( coll );
    00165 }
    00166
    00167 KKeyChooser::KKeyChooser( KAccel* pAccel, QWidget* parent, bool bAllowLetterShortcuts )
    00168 : QWidget( parent )
    00169 {
    00170     initGUI( Application, bAllowLetterShortcuts );
    00171     insert( pAccel );
    00172 }
    00173
    00174 KKeyChooser::KKeyChooser( KGlobalAccel* pAccel, QWidget* parent )
    00175 : QWidget( parent )
    00176 {
    00177     initGUI( ApplicationGlobal, false );
    00178     insert( pAccel );
    00179 }
    00180
    00181 KKeyChooser::KKeyChooser( KShortcutList* pList, QWidget* parent, ActionType type, bool bAllowLetterShortcuts )
    00182 : QWidget( parent )
    00183 {
    00184     initGUI( type, bAllowLetterShortcuts );
    00185     insert( pList );
    00186 }
    00187
    00188 KKeyChooser::KKeyChooser( KAccel* actions, QWidget* parent,
    00189             bool bCheckAgainstStdKeys,
    00190             bool bAllowLetterShortcuts,
    00191             bool bAllowWinKey )
    00192 : QWidget( parent )
    00193 {
    00194     ActionType type;
    00195     if( bAllowWinKey )
    00196         type = (bCheckAgainstStdKeys) ? ApplicationGlobal : Global;
    00197     else
    00198         type = Application;
    00199
    00200     initGUI( type, bAllowLetterShortcuts );
    00201     insert( actions );
    00202 }
    00203
    00204 KKeyChooser::KKeyChooser( KGlobalAccel* actions, QWidget* parent,
    00205             bool bCheckAgainstStdKeys,
    00206             bool bAllowLetterShortcuts,
    00207             bool /*bAllowWinKey*/ )
    00208 : QWidget( parent )
    00209 {
    00210     ActionType type = (bCheckAgainstStdKeys) ? ApplicationGlobal : Global;
    00211
    00212     initGUI( type, bAllowLetterShortcuts );
    00213     insert( actions );
    00214 }
    00215
    00216 // list of all existing KKeyChooser's
    00217 // Used when checking global shortcut for a possible conflict
    00218 // (just checking against kdeglobals isn't enough, the shortcuts
    00219 // might have changed in KKeyChooser and not being saved yet).
    00220 // Also used when reassigning a shortcut from one chooser to another.
    00221 static QValueList< KKeyChooser* >* allChoosers = NULL;
    00222 static KStaticDeleter< QValueList< KKeyChooser* > > allChoosersDeleter;
    00223
    00224 KKeyChooser::~KKeyChooser()
    00225 {
    00226         allChoosers->remove( this );
    00227     // Delete allocated KShortcutLists
    00228     for( uint i = 0; i < d->rgpListsAllocated.count(); i++ )
    00229         delete d->rgpListsAllocated[i];
    00230     delete d;
    00231 }
    00232
    00233 bool KKeyChooser::insert( KActionCollection *pColl)
    00234 {
    00235     return insert(pColl, QString::null);
    00236 }
    00237
    00238 bool KKeyChooser::insert( KActionCollection* pColl, const QString &title )
    00239 {
    00240     QString str = title;
    00241     if ( title.isEmpty() && pColl->instance()
    00242         && pColl->instance()->aboutData() )
    00243         str = pColl->instance()->aboutData()->programName();
    00244
    00245     KShortcutList* pList = new KActionShortcutList( pColl );
    00246     d->rgpListsAllocated.append( pList );
    00247     d->rgpLists.append( pList );
    00248     buildListView(d->rgpLists.count() - 1, str);
    00249     return true;
    00250 }
    00251
    00252 bool KKeyChooser::insert( KAccel* pAccel )
    00253 {
    00254     KShortcutList* pList = new KAccelShortcutList( pAccel );
    00255     d->rgpListsAllocated.append( pList );
    00256     return insert( pList );
    00257 }
    00258
    00259 bool KKeyChooser::insert( KGlobalAccel* pAccel )
    00260 {
    00261     KShortcutList* pList = new KAccelShortcutList( pAccel );
    00262     d->rgpListsAllocated.append( pList );
    00263     return insert( pList );
    00264 }
    00265
    00266 bool KKeyChooser::insert( KShortcutList* pList )
    00267 {
    00268     d->rgpLists.append( pList );
    00269     buildListView( d->rgpLists.count() - 1, QString::null );
    00270     return true;
    00271 }
    00272
    00273 void KKeyChooser::commitChanges()
    00274 {
    00275     kdDebug(125) << "KKeyChooser::commitChanges()" << endl;
    00276
    00277     QListViewItemIterator it( d->pList );
    00278     for( ; it.current(); ++it ) {
    00279         KKeyChooserItem* pItem = dynamic_cast<KKeyChooserItem*>(it.current());
    00280         if( pItem )
    00281             pItem->commitChanges();
    00282     }
    00283 }
    00284
    00285 void KKeyChooser::save()
    00286 {
    00287     commitChanges();
    00288     for( uint i = 0; i < d->rgpLists.count(); i++ )
    00289         d->rgpLists[i]->save();
    00290 }
    00291
    00292 void KKeyChooser::initGUI( ActionType type, bool bAllowLetterShortcuts )
    00293 {
    00294   d = new KKeyChooserPrivate();
    00295
    00296   m_type = type;
    00297   d->bAllowLetterShortcuts = bAllowLetterShortcuts;
    00298
    00299   d->bPreferFourModifierKeys = KGlobalAccel::useFourModifierKeys();
    00300
    00301   //
    00302   // TOP LAYOUT MANAGER
    00303   //
    00304   // The following layout is used for the dialog
    00305   //            LIST LABELS LAYOUT
    00306   //            SPLIT LIST BOX WIDGET
    00307   //            CHOOSE KEY GROUP BOX WIDGET
    00308   //            BUTTONS LAYOUT
    00309   // Items are added to topLayout as they are created.
    00310   //
    00311
    00312   QBoxLayout *topLayout = new QVBoxLayout( this, 0, KDialog::spacingHint() );
    00313
    00314   //
    00315   // ADD SEARCHLINE
    00316   //
    00317   QHBoxLayout* searchLayout = new QHBoxLayout(0, 0, KDialog::spacingHint());
    00318   topLayout->addLayout(searchLayout, 10);
    00319
    00320   QToolButton *clearSearch = new QToolButton(this);
    00321   clearSearch->setTextLabel(i18n("Clear Search"), true);
    00322   clearSearch->setIconSet(SmallIconSet(QApplication::reverseLayout() ? "clear_left" : "locationbar_erase"));
    00323   searchLayout->addWidget(clearSearch);
    00324   QLabel* slbl = new QLabel(i18n("&Search:"), this);
    00325   searchLayout->addWidget(slbl);
    00326   KListViewSearchLine* listViewSearch = new KListViewSearchLine(this);
    00327   searchLayout->addWidget(listViewSearch);
    00328   slbl->setBuddy(listViewSearch);
    00329   connect(clearSearch, SIGNAL(pressed()), listViewSearch, SLOT(clear()));
    00330
    00331   QString wtstr = i18n("Search interactively for shortcut names (e.g. Copy) "
    00332                        "or combination of keys (e.g. Ctrl+C) by typing them here.");
    00333
    00334   QWhatsThis::add(slbl, wtstr);
    00335   QWhatsThis::add(listViewSearch, wtstr);
    00336
    00337   //
    00338   // CREATE SPLIT LIST BOX
    00339   //
    00340   // fill up the split list box with the action/key pairs.
    00341   //
    00342   QGridLayout *stackLayout = new QGridLayout(2, 2, 2);
    00343   topLayout->addLayout( stackLayout, 10 );
    00344   stackLayout->setRowStretch( 1, 10 ); // Only list will stretch
    00345
    00346   d->pList = new KListView( this );
    00347   d->pList->setFocus();
    00348   listViewSearch->setListView(d->pList); // Plug into search line
    00349   QValueList<int> columns;
    00350   columns.append(0);
    00351   listViewSearch->setSearchColumns(columns);
    00352
    00353   stackLayout->addMultiCellWidget( d->pList, 1, 1, 0, 1 );
    00354
    00355   wtstr = i18n("Here you can see a list of key bindings, "
    00356                        "i.e. associations between actions (e.g. 'Copy') "
    00357                        "shown in the left column and keys or combination "
    00358                        "of keys (e.g. Ctrl+V) shown in the right column.");
    00359
    00360   QWhatsThis::add( d->pList, wtstr );
    00361   new KKeyChooserWhatsThis( d->pList );
    00362
    00363   d->pList->setAllColumnsShowFocus( true );
    00364   d->pList->addColumn(i18n("Action"));
    00365   d->pList->addColumn(i18n("Shortcut"));
    00366   d->pList->addColumn(i18n("Alternate"));
    00367
    00368   connect( d->pList, SIGNAL(currentChanged(QListViewItem*)),
    00369            SLOT(slotListItemSelected(QListViewItem*)) );
    00370
    00371   // handle double clicking an item
    00372   connect ( d->pList, SIGNAL ( doubleClicked ( QListViewItem *, const QPoint &, int ) ),
    00373                        SLOT ( captureCurrentItem()) );
    00374   connect ( d->pList, SIGNAL ( spacePressed( QListViewItem* )), SLOT( captureCurrentItem()));
    00375   //
    00376   // CREATE CHOOSE KEY GROUP
    00377   //
    00378   d->fCArea = new QGroupBox( this );
    00379   topLayout->addWidget( d->fCArea, 1 );
    00380
    00381   d->fCArea->setTitle( i18n("Shortcut for Selected Action") );
    00382   d->fCArea->setFrameStyle( QFrame::GroupBoxPanel | QFrame::Plain );
    00383
    00384   //
    00385   // CHOOSE KEY GROUP LAYOUT MANAGER
    00386   //
    00387   QGridLayout *grid = new QGridLayout( d->fCArea, 3, 4, KDialog::spacingHint() );
    00388   grid->addRowSpacing( 0, fontMetrics().lineSpacing() );
    00389
    00390   d->kbGroup = new QButtonGroup( d->fCArea );
    00391   d->kbGroup->hide();
    00392   d->kbGroup->setExclusive( true );
    00393
    00394   m_prbNone = new QRadioButton( i18n("no key", "&None"), d->fCArea );
    00395   d->kbGroup->insert( m_prbNone, NoKey );
    00396   m_prbNone->setEnabled( false );
    00397   //grid->addMultiCellWidget( rb, 1, 1, 1, 2 );
    00398   grid->addWidget( m_prbNone, 1, 0 );
    00399   QWhatsThis::add( m_prbNone, i18n("The selected action will not be associated with any key.") );
    00400   connect( m_prbNone, SIGNAL(clicked()), SLOT(slotNoKey()) );
    00401
    00402   m_prbDef = new QRadioButton( i18n("default key", "De&fault"), d->fCArea );
    00403   d->kbGroup->insert( m_prbDef, DefaultKey );
    00404   m_prbDef->setEnabled( false );
    00405   //grid->addMultiCellWidget( rb, 2, 2, 1, 2 );
    00406   grid->addWidget( m_prbDef, 1, 1 );
    00407   QWhatsThis::add( m_prbDef, i18n("This will bind the default key to the selected action. Usually a reasonable choice.") );
    00408   connect( m_prbDef, SIGNAL(clicked()), SLOT(slotDefaultKey()) );
    00409
    00410   m_prbCustom = new QRadioButton( i18n("C&ustom"), d->fCArea );
    00411   d->kbGroup->insert( m_prbCustom, CustomKey );
    00412   m_prbCustom->setEnabled( false );
    00413   //grid->addMultiCellWidget( rb, 3, 3, 1, 2 );
    00414   grid->addWidget( m_prbCustom, 1, 2 );
    00415   QWhatsThis::add( m_prbCustom, i18n("If this option is selected you can create a customized key binding for the"
    00416     " selected action using the buttons below.") );
    00417   connect( m_prbCustom, SIGNAL(clicked()), SLOT(slotCustomKey()) );
    00418
    00419   //connect( d->kbGroup, SIGNAL( clicked( int ) ), SLOT( keyMode( int ) ) );
    00420
    00421   QBoxLayout *pushLayout = new QHBoxLayout( KDialog::spacingHint() );
    00422   grid->addLayout( pushLayout, 1, 3 );
    00423
    00424   d->pbtnShortcut = new KKeyButton(d->fCArea, "key");
    00425   d->pbtnShortcut->setEnabled( false );
    00426   connect( d->pbtnShortcut, SIGNAL(capturedShortcut(const KShortcut&)), SLOT(capturedShortcut(const KShortcut&)) );
    00427   grid->addRowSpacing( 1, d->pbtnShortcut->sizeHint().height() + 5 );
    00428
    00429   wtstr = i18n("Use this button to choose a new shortcut key. Once you click it, "
    00430         "you can press the key-combination which you would like to be assigned "
    00431         "to the currently selected action.");
    00432   QWhatsThis::add( d->pbtnShortcut, wtstr );
    00433
    00434   //
    00435   // Add widgets to the geometry manager
    00436   //
    00437   pushLayout->addSpacing( KDialog::spacingHint()*2 );
    00438   pushLayout->addWidget( d->pbtnShortcut );
    00439   pushLayout->addStretch( 10 );
    00440
    00441   d->lInfo = new QLabel(d->fCArea);
    00442   //resize(0,0);
    00443   //d->lInfo->setAlignment( AlignCenter );
    00444   //d->lInfo->setEnabled( false );
    00445   //d->lInfo->hide();
    00446   grid->addMultiCellWidget( d->lInfo, 2, 2, 0, 3 );
    00447
    00448   //d->globalDict = new QDict<int> ( 100, false );
    00449   //d->globalDict->setAutoDelete( true );
    00450   readGlobalKeys();
    00451   //d->stdDict = new QDict<int> ( 100, false );
    00452   //d->stdDict->setAutoDelete( true );
    00453   //if (type == Application || type == ApplicationGlobal)
    00454   //  readStdKeys();
    00455   connect( kapp, SIGNAL( settingsChanged( int )), SLOT( slotSettingsChanged( int )));
    00456   if( allChoosers == NULL )
    00457         allChoosers = allChoosersDeleter.setObject( allChoosers, new QValueList< KKeyChooser* > );
    00458   allChoosers->append( this );
    00459 }
    00460
    00461 // Add all shortcuts to the list
    00462 void KKeyChooser::buildListView( uint iList, const QString &title )
    00463 {
    00464     KShortcutList* pList = d->rgpLists[iList];
    00465     KActionShortcutList *pAList = dynamic_cast<KActionShortcutList*>(pList);
    00466
    00467         if( m_type == Global || m_type == ApplicationGlobal )
    00468         d->pList->setSorting( -1 );
    00469     KListViewItem *pProgramItem, *pGroupItem = 0, *pParentItem, *pItem;
    00470
    00471     QString str = (title.isEmpty() ? i18n("Shortcuts") : title);
    00472     pParentItem = pProgramItem = pItem = new KListViewItem( d->pList, str );
    00473     pParentItem->setExpandable( true );
    00474     pParentItem->setOpen( true );
    00475     pParentItem->setSelectable( false );
    00476     uint nSize = pList->count();
    00477     for( uint iAction = 0; iAction < nSize; iAction++ ) {
    00478         QString sName = pList->name(iAction);
    00479         kdDebug(125) << "Key: " << sName << endl;
    00480         if( sName.startsWith( "Program:" ) ) {
    00481             pItem = new KListViewItem( d->pList, pProgramItem, pList->label(iAction) );
    00482             pItem->setSelectable( false );
    00483             pItem->setExpandable( true );
    00484             pItem->setOpen( true );
    00485             if( !pProgramItem->firstChild() )
    00486                 delete pProgramItem;
    00487             pProgramItem = pParentItem = pItem;
    00488         } else if( sName.startsWith( "Group:" ) ) {
    00489             pItem = new KListViewItem( pProgramItem, pParentItem, pList->label(iAction) );
    00490             pItem->setSelectable( false );
    00491             pItem->setExpandable( true );
    00492             pItem->setOpen( true );
    00493             if( pGroupItem && !pGroupItem->firstChild() )
    00494                 delete pGroupItem;
    00495             pGroupItem = pParentItem = pItem;
    00496         } else if( !sName.isEmpty() && pList->isConfigurable(iAction) ) {
    00497             pItem = new KKeyChooserItem( pParentItem, pItem, pList, iAction );
    00498             if(pAList)
    00499                 pItem->setPixmap(0,pAList->action(iAction)->iconSet().pixmap(QIconSet::Small,QIconSet::Normal));
    00500         }
    00501     }
    00502     if( !pProgramItem->firstChild() )
    00503         delete pProgramItem;
    00504     if( pGroupItem && !pGroupItem->firstChild() )
    00505         delete pGroupItem;
    00506 }
    00507
    00508
    00509 void KKeyChooser::updateButtons()
    00510 {
    00511     // Hack: Do this incase we still have changeKey() running.
    00512     //  Better would be to capture the mouse pointer so that we can't click
    00513     //   around while we're supposed to be entering a key.
    00514     //  Better yet would be a modal dialog for changeKey()!
    00515     releaseKeyboard();
    00516     KKeyChooserItem* pItem = dynamic_cast<KKeyChooserItem*>( d->pList->currentItem() );
    00517
    00518     if ( !pItem ) {
    00519         // if nothing is selected -> disable radio boxes
    00520         m_prbNone->setEnabled( false );
    00521         m_prbDef->setEnabled( false );
    00522         m_prbCustom->setEnabled( false );
    00523         d->pbtnShortcut->setEnabled( false );
    00524         d->pbtnShortcut->setShortcut( KShortcut(), false );
    00525     } else {
    00526         bool bConfigurable = pItem->isConfigurable();
    00527         bool bQtShortcut = (m_type == Application || m_type == Standard);
    00528         const KShortcut& cutDef = pItem->shortcutDefault();
    00529
    00530         // Set key strings
    00531         QString keyStrCfg = pItem->shortcut().toString();
    00532         QString keyStrDef = cutDef.toString();
    00533
    00534         d->pbtnShortcut->setShortcut( pItem->shortcut(), bQtShortcut );
    00535         //item->setText( 1, keyStrCfg );
    00536         pItem->repaint();
    00537         d->lInfo->setText( i18n("Default key:") + QString(" %1").arg(keyStrDef.isEmpty() ? i18n("None") : keyStrDef) );
    00538
    00539         // Select the appropriate radio button.
    00540         int index = (pItem->shortcut().isNull()) ? NoKey
    00541                 : (pItem->shortcut() == cutDef) ? DefaultKey
    00542                 : CustomKey;
    00543         m_prbNone->setChecked( index == NoKey );
    00544         m_prbDef->setChecked( index == DefaultKey );
    00545         m_prbCustom->setChecked( index == CustomKey );
    00546
    00547         // Enable buttons if this key is configurable.
    00548         // The 'Default Key' button must also have a default key.
    00549         m_prbNone->setEnabled( bConfigurable );
    00550         m_prbDef->setEnabled( bConfigurable && cutDef.count() != 0 );
    00551         m_prbCustom->setEnabled( bConfigurable );
    00552         d->pbtnShortcut->setEnabled( bConfigurable );
    00553     }
    00554 }
    00555
    00556 void KKeyChooser::slotNoKey()
    00557 {
    00558     // return if no key is selected
    00559     KKeyChooserItem* pItem = dynamic_cast<KKeyChooserItem*>( d->pList->currentItem() );
    00560     if( pItem ) {
    00561         //kdDebug(125) << "no Key" << d->pList->currentItem()->text(0) << endl;
    00562         pItem->setShortcut( KShortcut() );
    00563         updateButtons();
    00564         emit keyChange();
    00565     }
    00566 }
    00567
    00568 void KKeyChooser::slotDefaultKey()
    00569 {
    00570     // return if no key is selected
    00571     KKeyChooserItem* pItem = dynamic_cast<KKeyChooserItem*>( d->pList->currentItem() );
    00572     if( pItem ) // don't set it directly, check for conflicts
    00573         setShortcut( pItem->shortcutDefault() );
    00574 }
    00575
    00576 void KKeyChooser::slotCustomKey()
    00577 {
    00578     d->pbtnShortcut->captureShortcut();
    00579 }
    00580
    00581 void KKeyChooser::readGlobalKeys()
    00582 {
    00583         d->mapGlobals.clear();
    00584         if( m_type == Global )
    00585             return; // they will be checked normally, because we're configuring them
    00586         readGlobalKeys( d->mapGlobals );
    00587 }
    00588
    00589 void KKeyChooser::readGlobalKeys( QMap< QString, KShortcut >& map )
    00590 {
    00591     QMap<QString, QString> mapEntry = KGlobal::config()->entryMap( "Global Shortcuts" );
    00592     QMap<QString, QString>::Iterator it( mapEntry.begin() );
    00593     for( uint i = 0; it != mapEntry.end(); ++it, i++ )
    00594         map[it.key()] = KShortcut(*it);
    00595 }
    00596
    00597 void KKeyChooser::slotSettingsChanged( int category )
    00598 {
    00599     if( category == KApplication::SETTINGS_SHORTCUTS )
    00600         readGlobalKeys(); // reread
    00601 }
    00602
    00603 void KKeyChooser::fontChange( const QFont & )
    00604 {
    00605         d->fCArea->setMinimumHeight( 4*d->pbtnShortcut->sizeHint().height() );
    00606
    00607         int widget_width = 0;
    00608
    00609         setMinimumWidth( 20+5*(widget_width+10) );
    00610 }
    00611
    00612 // KDE4 IMHO this shouldn't be here at all - it cannot check whether the default
    00613 // shortcut don't conflict with some already changed ones (e.g. global shortcuts).
    00614 // Also, I personally find reseting all shortcuts to default (i.e. hardcoded in the app)
    00615 // ones after pressing the 'Default' button rather a misfeature.
    00616 void KKeyChooser::allDefault()
    00617 {
    00618     kdDebug(125) << "KKeyChooser::allDefault()" << endl;
    00619
    00620     QListViewItemIterator it( d->pList );
    00621     for( ; it.current(); ++it ) {
    00622         KKeyChooserItem* pItem = dynamic_cast<KKeyChooserItem*>(it.current());
    00623         if( pItem )
    00624             pItem->setShortcut( pItem->shortcutDefault() );
    00625     }
    00626
    00627     updateButtons();
    00628     emit keyChange();
    00629 }
    00630
    00631 void KKeyChooser::slotListItemSelected( QListViewItem* )
    00632 {
    00633     updateButtons();
    00634 }
    00635
    00636 void KKeyChooser::slotListItemDoubleClicked ( QListViewItem *, const QPoint & , int )
    00637 { // KDE4 dump this
    00638   captureCurrentItem();
    00639 }
    00640
    00641 void KKeyChooser::captureCurrentItem()
    00642 {
    00643   KKeyChooserItem* pItem = dynamic_cast<KKeyChooserItem*>( d->pList->currentItem() );
    00644   if( pItem != NULL && pItem->isConfigurable())
    00645       d->pbtnShortcut->captureShortcut ( );
    00646 }
    00647
    00648 void KKeyChooser::setPreferFourModifierKeys( bool bPreferFourModifierKeys )
    00649 {
    00650     d->bPreferFourModifierKeys = bPreferFourModifierKeys;
    00651 }
    00652
    00653 void KKeyChooser::capturedShortcut( const KShortcut& cut )
    00654 {
    00655     if( cut.isNull() )
    00656         slotNoKey();
    00657     else
    00658         setShortcut( cut );
    00659 }
    00660
    00661 // FIXME: give this functionality again -- I don't think it's ever used, though. -- ellis
    00662 // TODO: Check lxr.kde.org to see if it's used anywhere
    00663 void KKeyChooser::listSync()
    00664 {
    00665 /*  kdDebug(125) << "KKeyChooser::listSync()" << endl;
    00666
    00667     if( d->pColl ) {
    00668         // TODO: This is very inefficient.  Come up with something better.
    00669         KAccelActions aa;
    00670         d->pColl->createKeyMap( aa );
    00671         d->actionsNew.updateShortcuts( aa );
    00672     } else if( d->pActionsOrig ) {
    00673         d->actionsNew.updateShortcuts( *d->pActionsOrig );
    00674         update();
    00675         updateButtons();
    00676     }*/
    00677 }
    00678
    00679 void KKeyChooser::syncToConfig( const QString& sConfigGroup, KConfigBase* pConfig, bool bClearUnset )
    00680 {
    00681     kdDebug(125) << "KKeyChooser::syncToConfig( \"" << sConfigGroup << "\", " << pConfig << " ) start" << endl;
    00682     if( !pConfig )
    00683         pConfig = KGlobal::config();
    00684     KConfigGroupSaver cgs( pConfig, sConfigGroup );
    00685
    00686     QListViewItemIterator it( d->pList );
    00687     for( ; it.current(); ++it ) {
    00688         KKeyChooserItem* pItem = dynamic_cast<KKeyChooserItem*>(it.current());
    00689         if( pItem ) {
    00690             QString sEntry = pConfig->readEntry( pItem->actionName() );
    00691             if( !sEntry.isNull() || bClearUnset ) {
    00692                 if( sEntry == "none" )
    00693                     sEntry = QString::null;
    00694                 pItem->setShortcut( sEntry );
    00695             }
    00696             kdDebug(125) << pItem->actionName() << " = " << pItem->shortcut().toStringInternal() << endl;
    00697         }
    00698     }
    00699     updateButtons();
    00700     kdDebug(125) << "KKeyChooser::syncToConfig() done" << endl;
    00701 }
    00702
    00703 void KKeyChooser::setShortcut( const KShortcut& cut )
    00704 {
    00705     kdDebug(125) << "KKeyChooser::setShortcut( " << cut.toString() << " )" << endl;
    00706     KKeyChooserItem* pItem = dynamic_cast<KKeyChooserItem*>(d->pList->currentItem());
    00707     if( !pItem )
    00708         return;
    00709
    00710     for( uint i = 0; i < cut.count(); i++ ) {
    00711         const KKeySequence& seq = cut.seq(i);
    00712         const KKey& key = seq.key(0);
    00713
    00714         if( !d->bAllowLetterShortcuts && key.modFlags() == 0
    00715             && key.sym() < 0x3000 && QChar(key.sym()).isLetterOrNumber() ) {
    00716             QString s = i18n(   "In order to use the '%1' key as a shortcut, "
    00717                         "it must be combined with the "
    00718                         "Win, Alt, Ctrl, and/or Shift keys." ).arg(QChar(key.sym()));
    00719             KMessageBox::sorry( this, s, i18n("Invalid Shortcut Key") );
    00720             return;
    00721         }
    00722     }
    00723
    00724     // If key isn't already in use,
    00725     if( !isKeyPresent( cut ) ) {
    00726         // Set new key code
    00727         pItem->setShortcut( cut );
    00728         // Update display
    00729         updateButtons();
    00730         emit keyChange();
    00731     }
    00732 }
    00733
    00734 // Returns iSeq index if cut2 has a sequence of equal or higher priority to a sequence in cut.
    00735 // else -1
    00736 static int keyConflict( const KShortcut& cut, const KShortcut& cut2 )
    00737 {
    00738     for( uint iSeq = 0; iSeq < cut.count(); iSeq++ ) {
    00739         for( uint iSeq2 = 0; iSeq2 < cut2.count(); iSeq2++ ) {
    00740             if( cut.seq(iSeq) == cut2.seq(iSeq2) )
    00741                 return iSeq;
    00742         }
    00743     }
    00744     return -1;
    00745 }
    00746
    00747 // Removes the sequences in cut2 from cut1
    00748 static void removeFromShortcut(  KShortcut & cut1, const KShortcut &cut2)
    00749 {
    00750     for( uint iSeq2 = 0; iSeq2 < cut2.count(); iSeq2++ )
    00751         cut1.remove(cut2.seq(iSeq2));
    00752 }
    00753
    00754 bool KKeyChooser::isKeyPresent( const KShortcut& cut, bool bWarnUser )
    00755 {
    00756     KKeyChooserItem* pItem = dynamic_cast<KKeyChooserItem*>(d->pList->currentItem());
    00757
    00758     if (!pItem) {
    00759         return false;
    00760     }
    00761
    00762         bool has_global_chooser = false;
    00763         bool has_standard_chooser = false;
    00764         for( QValueList< KKeyChooser* >::ConstIterator it = allChoosers->begin();
    00765              it != allChoosers->end();
    00766              ++it ) {
    00767             has_global_chooser |= ((*it)->m_type == Global);
    00768             has_standard_chooser |= ((*it)->m_type == Standard);
    00769         }
    00770
    00771     // If editing global shortcuts, check them for conflicts with the stdaccels.
    00772     if( m_type == ApplicationGlobal || m_type == Global ) {
    00773             if( !has_standard_chooser ) {
    00774                 if( checkStandardShortcutsConflict( cut, bWarnUser, this ))
    00775                     return true;
    00776             }
    00777     }
    00778
    00779         // only check the global keys if one of the keychoosers isn't global
    00780         if( !has_global_chooser ) {
    00781             if( checkGlobalShortcutsConflict( cut, bWarnUser, this, d->mapGlobals,
    00782                 m_type == Global ? pItem->actionName() : QString::null ))
    00783                 return true;
    00784         }
    00785
    00786         if( isKeyPresentLocally( cut, pItem, bWarnUser ))
    00787             return true;
    00788
    00789         // check also other KKeyChooser's
    00790         for( QValueList< KKeyChooser* >::ConstIterator it = allChoosers->begin();
    00791              it != allChoosers->end();
    00792              ++it ) {
    00793             if( (*it) != this && (*it)->isKeyPresentLocally( cut, NULL, bWarnUser ))
    00794                     return true;
    00795             }
    00796     return false;
    00797 }
    00798
    00799 // KDE4 remove
    00800 bool KKeyChooser::isKeyPresentLocally( const KShortcut& cut, KKeyChooserItem* ignoreItem, const QString& warnText )
    00801 {
    00802     return isKeyPresentLocally( cut, ignoreItem, !warnText.isNull());
    00803 }
    00804
    00805 bool KKeyChooser::isKeyPresentLocally( const KShortcut& cut, KKeyChooserItem* ignoreItem, bool bWarnUser )
    00806 {
    00807     if ( cut.toString().isEmpty())
    00808         return false;
    00809     // Search for shortcut conflicts with other actions in the
    00810     //  lists we're configuring.
    00811     for( QListViewItemIterator it( d->pList ); it.current(); ++it ) {
    00812         KKeyChooserItem* pItem2 = dynamic_cast<KKeyChooserItem*>(it.current());
    00813         if( pItem2 && pItem2 != ignoreItem ) {
    00814             int iSeq = keyConflict( cut, pItem2->shortcut() );
    00815             if( iSeq > -1 ) {
    00816                 if( bWarnUser ) {
    00817                                         if( !promptForReassign( cut.seq(iSeq), pItem2->text(0), Application, this ))
    00818                                 return true;
    00819                                         // else remove the shortcut from it
    00820                                         KShortcut cut2 = pItem2->shortcut();
    00821                                         removeFromShortcut(cut2, cut);
    00822                                         pItem2->setShortcut(cut2);
    00823                                         updateButtons();
    00824                                 emit keyChange();
    00825                                 }
    00826             }
    00827         }
    00828     }
    00829         return false;
    00830 }
    00831
    00832 bool KKeyChooser::checkStandardShortcutsConflict( const KShortcut& cut, bool bWarnUser, QWidget* parent )
    00833 {
    00834     // For each key sequence in the shortcut,
    00835     for( uint i = 0; i < cut.count(); i++ ) {
    00836     const KKeySequence& seq = cut.seq(i);
    00837     KStdAccel::StdAccel id = KStdAccel::findStdAccel( seq );
    00838     if( id != KStdAccel::AccelNone
    00839         && keyConflict( cut, KStdAccel::shortcut( id ) ) > -1 ) {
    00840         if( bWarnUser ) {
    00841             if( !promptForReassign( seq, KStdAccel::label(id), Standard, parent ))
    00842                                 return true;
    00843                         removeStandardShortcut( KStdAccel::label(id), dynamic_cast< KKeyChooser* > ( parent ), KStdAccel::shortcut( id ), cut);
    00844                 }
    00845     }
    00846     }
    00847     return false;
    00848 }
    00849
    00850 bool KKeyChooser::checkGlobalShortcutsConflict( const KShortcut& cut, bool bWarnUser, QWidget* parent )
    00851 {
    00852     QMap< QString, KShortcut > map;
    00853     readGlobalKeys( map );
    00854     return checkGlobalShortcutsConflict( cut, bWarnUser, parent, map, QString::null );
    00855 }
    00856
    00857 bool KKeyChooser::checkGlobalShortcutsConflict( const KShortcut& cut, bool bWarnUser, QWidget* parent,
    00858     const QMap< QString, KShortcut >& map, const QString& ignoreAction )
    00859 {
    00860     QMap<QString, KShortcut>::ConstIterator it;
    00861     for( it = map.begin(); it != map.end(); ++it ) {
    00862         int iSeq = keyConflict( cut, (*it) );
    00863         if( iSeq > -1 ) {
    00864             if( ignoreAction.isEmpty() || it.key() != ignoreAction ) {
    00865                     if( bWarnUser ) {
    00866             if( !promptForReassign( cut.seq(iSeq), it.key(), Global, parent ))
    00867                                     return true;
    00868                             removeGlobalShortcut( it.key(), dynamic_cast< KKeyChooser* >( parent ), (*it), cut);
    00869                     }
    00870         }
    00871     }
    00872     }
    00873     return false;
    00874 }
    00875
    00876 void KKeyChooser::removeStandardShortcut( const QString& name, KKeyChooser* chooser, const KShortcut &origCut, const KShortcut &cut )
    00877 {
    00878     bool was_in_choosers = false;
    00879     if( allChoosers != NULL ) {
    00880         for( QValueList< KKeyChooser* >::ConstIterator it = allChoosers->begin();
    00881              it != allChoosers->end();
    00882              ++it ) {
    00883             if( (*it) != chooser && (*it)->m_type == Standard ) {
    00884                 was_in_choosers |= ( (*it)->removeShortcut( name, cut ));
    00885             }
    00886         }
    00887     }
    00888     if( !was_in_choosers ) { // not edited, needs to be changed in config file
    00889         KStdAccel::ShortcutList std_list;
    00890         KShortcut newCut = origCut;
    00891         removeFromShortcut(newCut, cut);
    00892         std_list.setShortcut( std_list.index( name ), newCut);
    00893         std_list.save();
    00894     }
    00895 }
    00896
    00897 void KKeyChooser::removeGlobalShortcut( const QString& name, KKeyChooser* chooser, const KShortcut &origCut, const KShortcut &cut )
    00898 {
    00899     bool was_in_choosers = false;
    00900     if( allChoosers != NULL ) {
    00901         for( QValueList< KKeyChooser* >::ConstIterator it = allChoosers->begin();
    00902              it != allChoosers->end();
    00903              ++it ) {
    00904             if( (*it) != chooser && (*it)->m_type == Global ) {
    00905                 was_in_choosers |= ( (*it)->removeShortcut( name, cut ));
    00906             }
    00907         }
    00908     }
    00909     if( !was_in_choosers ) { // not edited, needs to be changed in config file
    00910         KAccelActions actions;
    00911         KShortcut newCut = origCut;
    00912         removeFromShortcut(newCut, cut);
    00913         actions.insert( name, "", "", newCut, newCut);
    00914     actions.writeActions( "Global Shortcuts", 0, true, true );
    00915     }
    00916 }
    00917
    00918 bool KKeyChooser::removeShortcut( const QString& name, const KShortcut &cut )
    00919 {
    00920     for( QListViewItemIterator it( d->pList ); it.current(); ++it ) {
    00921         KKeyChooserItem* pItem2 = dynamic_cast<KKeyChooserItem*>(it.current());
    00922                     if( pItem2 && pItem2->actionName() == name ) {
    00923                         // remove the shortcut from it
    00924                         KShortcut cut2 = pItem2->shortcut();
    00925                         removeFromShortcut(cut2, cut);
    00926                         pItem2->setShortcut(cut2);
    00927                         updateButtons();
    00928                 emit keyChange();
    00929                         return true;
    00930                     }
    00931         }
    00932         return false;
    00933 }
    00934
    00935 // KDE4 remove this
    00936 void KKeyChooser::_warning( const KKeySequence& cut, QString sAction, QString sTitle )
    00937 {
    00938     sAction = sAction.stripWhiteSpace();
    00939
    00940     QString s =
    00941         i18n("The '%1' key combination has already been allocated "
    00942         "to the \"%2\" action.\n"
    00943         "Please choose a unique key combination.").
    00944         arg(cut.toString()).arg(sAction);
    00945
    00946     KMessageBox::sorry( this, s, sTitle );
    00947 }
    00948
    00949 bool KKeyChooser::promptForReassign( const KKeySequence& cut, const QString& sAction, ActionType type, QWidget* parent )
    00950 {
    00951         if(cut.isNull())
    00952             return true;
    00953         QString sTitle;
    00954         QString s;
    00955         if( type == Standard ) {
    00956                 sTitle = i18n("Conflict with Standard Application Shortcut");
    00957         s = i18n("The '%1' key combination has already been allocated "
    00958         "to the standard action \"%2\".\n"
    00959         "Do you want to reassign it from that action to the current one?");
    00960         }
    00961         else if( type == Global ) {
    00962                 sTitle = i18n("Conflict with Global Shortcut");
    00963         s = i18n("The '%1' key combination has already been allocated "
    00964         "to the global action \"%2\".\n"
    00965         "Do you want to reassign it from that action to the current one?");
    00966         }
    00967         else {
    00968                 sTitle = i18n("Key Conflict");
    00969         s = i18n("The '%1' key combination has already been allocated "
    00970         "to the \"%2\" action.\n"
    00971         "Do you want to reassign it from that action to the current one?");
    00972         }
    00973     s = s.arg(cut.toString()).arg(sAction.stripWhiteSpace());
    00974
    00975     return KMessageBox::warningYesNo( parent, s, sTitle ) == KMessageBox::Yes;
    00976 }
    00977
    00978 //---------------------------------------------------
    00979 KKeyChooserItem::KKeyChooserItem( KListView* parent, QListViewItem* after, KShortcutList* pList, uint iAction )
    00980 :   KListViewItem( parent, after )
    00981 {
    00982     m_pList = pList;
    00983     m_iAction = iAction;
    00984     m_bModified = false;
    00985     m_cut = m_pList->shortcut(m_iAction);
    00986 }
    00987
    00988 KKeyChooserItem::KKeyChooserItem( QListViewItem* parent, QListViewItem* after, KShortcutList* pList, uint iAction )
    00989 :   KListViewItem( parent, after )
    00990 {
    00991     m_pList = pList;
    00992     m_iAction = iAction;
    00993     m_bModified = false;
    00994     m_cut = m_pList->shortcut(m_iAction);
    00995 }
    00996
    00997 QString KKeyChooserItem::actionName() const
    00998 {
    00999     return m_pList->name(m_iAction);
    01000 }
    01001
    01002 const KShortcut& KKeyChooserItem::shortcut() const
    01003 {
    01004     return m_cut;
    01005 }
    01006
    01007 void KKeyChooserItem::setShortcut( const KShortcut& cut )
    01008 {
    01009     m_cut = cut;
    01010     m_bModified = (m_cut != m_pList->shortcut(m_iAction));
    01011     listView()->repaintItem( this );
    01012 }
    01013
    01014 void KKeyChooserItem::commitChanges()
    01015 {
    01016     if( m_bModified )
    01017         m_pList->setShortcut( m_iAction, m_cut );
    01018 }
    01019
    01020 QString KKeyChooserItem::text( int iCol ) const
    01021 {
    01022     if( iCol == 0 ) {
    01023         // Quick HACK to get rid of '&'s.
    01024         QString s = m_pList->label(m_iAction);
    01025         QString s2;
    01026         for( uint i = 0; i < s.length(); i++ )
    01027             if( s[i] != '&' || ( i+1<s.length() && s[i+1] == '&' ) )
    01028                 s2 += s[i];
    01029         return s2;
    01030     }
    01031     else if( iCol <= (int) m_cut.count() )
    01032         return m_cut.seq(iCol-1).toString();
    01033     else
    01034         return QString::null;
    01035 }
    01036
    01037 int KKeyChooserItem::compare( QListViewItem* item, int iCol, bool bAscending ) const
    01038 {
    01039     KKeyChooserItem* pItem = dynamic_cast<KKeyChooserItem*>( item );
    01040     if( iCol == 0 && pItem ) {
    01041         QString psName1 = m_pList->name(m_iAction);
    01042         QString psName2 = pItem->m_pList->name(pItem->m_iAction);
    01043         QRegExp rxNumber1( " (\\d+)$" );
    01044         QRegExp rxNumber2( " (\\d+)$" );
    01045         int iNumber1 = rxNumber1.search( psName1 );
    01046         int iNumber2 = rxNumber2.search( psName2 );
    01047
    01048         // Check if the last word is one or more digits
    01049         if( iNumber1 >= 0 && iNumber1 == iNumber2 && psName1.startsWith( psName2.left( iNumber1+1 ) ) ) {
    01050             int n1 = rxNumber1.cap(1).toInt();
    01051             int n2 = rxNumber2.cap(1).toInt();
    01052             return (n1 < n2) ? -1 : (n1 > n2) ? 1 : 0;
    01053         }
    01054     }
    01055
    01056     return QListViewItem::compare( item, iCol, bAscending );
    01057 }
    01058
    01060
    01061 QString KKeyChooserWhatsThis::text( const QPoint& p ) {
    01062     if ( !m_listView )
    01063         return QString::null;
    01064
    01065     const QListViewItem* item = m_listView->itemAt( p );
    01066     const KKeyChooserItem* pItem = dynamic_cast<const KKeyChooserItem*>(item);
    01067     if ( !pItem )
    01068         return QWhatsThis::textFor( m_listView );
    01069
    01070     const QString itemWhatsThis = pItem->whatsThis();
    01071     if ( itemWhatsThis.isEmpty() )
    01072         return QWhatsThis::textFor( m_listView );
    01073
    01074     return itemWhatsThis;
    01075 }
    01076
    01077 /************************************************************************/
    01078 /* KKeyDialog                                                           */
    01079 /*                                                                      */
    01080 /* Originally by Nicolas Hadacek <hadacek@via.ecp.fr>                   */
    01081 /*                                                                      */
    01082 /* Substantially revised by Mark Donohoe <donohoe@kde.org>              */
    01083 /*                                                                      */
    01084 /* And by Espen Sand <espen@kde.org> 1999-10-19                         */
    01085 /* (by using KDialogBase there is almost no code left ;)                */
    01086 /*                                                                      */
    01087 /************************************************************************/
    01088 KKeyDialog::KKeyDialog( KKeyChooser::ActionType type, bool bAllowLetterShortcuts, QWidget *parent, const char* name )
    01089 : KDialogBase( parent, name, true, i18n("Configure Shortcuts"), Help|Default|Ok|Cancel, Ok )
    01090 {
    01091     m_pKeyChooser = new KKeyChooser( this, type, bAllowLetterShortcuts );
    01092     setMainWidget( m_pKeyChooser );
    01093     connect( this, SIGNAL(defaultClicked()), m_pKeyChooser, SLOT(allDefault()) );
    01094     enableButton( Help, false );
    01095
    01096     KConfigGroup group( KGlobal::config(), "KKeyDialog Settings" );
    01097     QSize sz = size();
    01098     resize( group.readSizeEntry( "Dialog Size", &sz ) );
    01099 }
    01100
    01101 KKeyDialog::KKeyDialog( bool bAllowLetterShortcuts, QWidget *parent, const char* name )
    01102 : KDialogBase( parent, name, true, i18n("Configure Shortcuts"), Help|Default|Ok|Cancel, Ok )
    01103 {
    01104     m_pKeyChooser = new KKeyChooser( this, KKeyChooser::Application, bAllowLetterShortcuts );
    01105     setMainWidget( m_pKeyChooser );
    01106     connect( this, SIGNAL(defaultClicked()), m_pKeyChooser, SLOT(allDefault()) );
    01107     enableButton( Help, false );
    01108
    01109     KConfigGroup group( KGlobal::config(), "KKeyDialog Settings" );
    01110     QSize sz = size();
    01111     resize( group.readSizeEntry( "Dialog Size", &sz ) );
    01112 }
    01113
    01114 KKeyDialog::~KKeyDialog()
    01115 {
    01116     KConfigGroup group( KGlobal::config(), "KKeyDialog Settings" );
    01117     group.writeEntry( "Dialog Size", size(), true, true );
    01118 }
    01119
    01120 bool KKeyDialog::insert( KActionCollection* pColl )
    01121 {
    01122     return m_pKeyChooser->insert( pColl );
    01123 }
    01124
    01125 bool KKeyDialog::insert(KActionCollection *pColl, const QString &title)
    01126 {
    01127     return m_pKeyChooser->insert(pColl, title);
    01128 }
    01129
    01130 bool KKeyDialog::configure( bool bSaveSettings )
    01131 {
    01132     int retcode = exec();
    01133     if( retcode == Accepted ) {
    01134         if( bSaveSettings )
    01135             m_pKeyChooser->save();
    01136         else
    01137             commitChanges();
    01138     }
    01139     return retcode;
    01140 }
    01141
    01142 void KKeyDialog::commitChanges()
    01143 {
    01144     m_pKeyChooser->commitChanges();
    01145 }
    01146
    01147 int KKeyDialog::configure( KActionCollection* coll, QWidget* parent, bool bSaveSettings )
    01148 {
    01149     return configure( coll, true, parent, bSaveSettings);
    01150 }
    01151
    01152 int KKeyDialog::configure( KAccel* keys, QWidget* parent, bool bSaveSettings )
    01153 {
    01154     return configure( keys, true, parent, bSaveSettings);
    01155 }
    01156
    01157 int KKeyDialog::configure( KGlobalAccel* keys, QWidget* parent, bool bSaveSettings )
    01158 {
    01159     return configure( keys, true, parent, bSaveSettings);
    01160 }
    01161
    01162 int KKeyDialog::configure( KAccel* keys, bool bAllowLetterShortcuts, QWidget *parent, bool bSaveSettings )
    01163 {
    01164     KKeyDialog dlg( bAllowLetterShortcuts, parent );
    01165     dlg.m_pKeyChooser->insert( keys );
    01166     bool b = dlg.configure( bSaveSettings );
    01167     if( b && bSaveSettings )
    01168         keys->updateConnections();
    01169     return b;
    01170 }
    01171
    01172 int KKeyDialog::configure( KGlobalAccel* keys, bool bAllowLetterShortcuts, QWidget *parent, bool bSaveSettings )
    01173 {
    01174     KKeyDialog dlg( KKeyChooser::ApplicationGlobal, bAllowLetterShortcuts, parent );
    01175     dlg.m_pKeyChooser->insert( keys );
    01176     bool b = dlg.configure( bSaveSettings );
    01177     if( b && bSaveSettings )
    01178         keys->updateConnections();
    01179     return b;
    01180 }
    01181
    01182 int KKeyDialog::configure( KActionCollection* coll, bool bAllowLetterShortcuts, QWidget *parent, bool bSaveSettings )
    01183 {
    01184     kdDebug(125) << "KKeyDialog::configureKeys( KActionCollection*, " << bSaveSettings << " )" << endl;
    01185     KKeyDialog dlg( bAllowLetterShortcuts, parent );
    01186     dlg.m_pKeyChooser->insert( coll );
    01187     return dlg.configure( bSaveSettings );
    01188 }
    01189
    01190 /*int KKeyDialog::configure( KActionPtrList* coll, const QString& file, QWidget *parent, bool bSaveSettings )
    01191 {
    01192     kdDebug(125) << "KKeyDialog::configureKeys( KActionCollection*, " << file << ", " << bSaveSettings << " )" << endl;
    01193     KAccelActions actions;
    01194     coll->createKeyMap( actions );
    01195
    01196     int retcode = configure( actions, file, parent, bSaveSettings );
    01197     if( retcode == Accepted )
    01198         coll->setKeyMap( actions );
    01199
    01200     return retcode;
    01201 }*/
    01202
    01203 void KKeyChooser::virtual_hook( int, void* )
    01204 { /*BASE::virtual_hook( id, data );*/ }
    01205
    01206 void KKeyDialog::virtual_hook( int id, void* data )
    01207 { KDialogBase::virtual_hook( id, data ); }
    01208
    01209 #include "kkeydialog.moc"

This file is part of the documentation for kdeui Library Version 3.4.1.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat Jun 11 20:20:18 2005 by doxygen 1.4.1 written by Dimitri van Heesch, © 1997-2003