kdecore Library API Documentation

kshortcutmenu.cpp

00001 /*
00002     Copyright (c) 2002 Ellis Whitehead <ellis@kde.org>
00003 
00004     This library is free software; you can redistribute it and/or
00005     modify it under the terms of the GNU Library General Public
00006     License as published by the Free Software Foundation; either
00007     version 2 of the License, or (at your option) any later version.
00008 
00009     This library is distributed in the hope that it will be useful,
00010     but WITHOUT ANY WARRANTY; without even the implied warranty of
00011     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012     Library General Public License for more details.
00013 
00014     You should have received a copy of the GNU Library General Public License
00015     along with this library; see the file COPYING.LIB.  If not, write to
00016     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00017     Boston, MA 02111-1307, USA.
00018 */
00019 
00020 #include <qkeysequence.h>
00021 #include <qlabel.h>
00022 #include <qpopupmenu.h>
00023 
00024 #include "kaccelaction.h"
00025 #include <kdebug.h>
00026 #include <kglobalsettings.h>
00027 #include "kshortcutmenu.h"
00028 //#include <kkeynative.h>
00029 
00030 KShortcutMenu::KShortcutMenu( QWidget* pParent, KAccelActions* pActions, KKeySequence seq )
00031 :       QPopupMenu( pParent ),
00032         m_pActions( pActions ),
00033         m_seq( seq )
00034 {
00035         kdDebug() << seq.toStringInternal() << endl;
00036         
00037         QFont fontTitle = KGlobalSettings::menuFont();
00038         fontTitle.setBold( true );
00039         
00040         pTitle = new QLabel( "", (QWidget*)0 );
00041         pTitle->setFont( fontTitle );
00042         pTitle->setFrameShape( QFrame::Panel ); 
00043         
00044         insertItem( pTitle );
00045 }
00046 
00047 bool KShortcutMenu::insertAction( uint iAction, KKeySequence seq )
00048 {
00049         KAccelAction* pAction = m_pActions->actionPtr( iAction );
00050         
00051         if( pAction ) {
00052                 insertItem( "", iAction );
00053                 m_seqs[indexOf(iAction)] = seq;
00054                 return true;
00055         } else
00056                 return false;
00057 }
00058 
00059 
00060 void KShortcutMenu::updateShortcuts()
00061 {
00062         pTitle->setText( m_seq.toString() + ",..." );
00063         
00064         for( uint iItem = 1; iItem < count(); iItem++ ) {
00065                 int iAction = idAt( iItem );
00066                 if( iAction >= 0 ) {
00067                         KAccelAction* pAction = m_pActions->actionPtr( iAction );
00068                         if( pAction ) {
00069                                 KKeySequence seq = m_seqs[iItem];
00070                                 QString sSeq = seq.key(m_seq.count()).toString();
00071                                 for( uint iKey = m_seq.count() + 1; iKey < seq.count(); iKey++ )
00072                                         sSeq += QString(",") + seq.key(iKey).toString();
00073 
00074                                 kdDebug(125) << "seq = " << seq.toStringInternal() << " sSeq = " << sSeq << endl;
00075                                 changeItem( iAction, pAction->label() + "\t" + sSeq );
00076                         }
00077                 }
00078         }
00079 }
00080 
00081 void KShortcutMenu::keyPressEvent( QKeyEvent* pEvent )
00082 {
00083         kdDebug() << "keypress; " << pEvent->key() << endl;
00084         KKey key( pEvent );
00085         
00086         switch( pEvent->key() ) {
00087          case Key_Shift:
00088          case Key_Control:
00089          case Key_Alt:
00090          case Key_Meta:
00091          case Key_Super_L:
00092          case Key_Super_R:
00093          case Key_Hyper_L:
00094          case Key_Hyper_R:
00095                 break;
00096          default:
00097                 int iItem = searchForKey( key );
00098                 // If key not found, look for unmodified version.
00099                 if( iItem == -1 ) {
00100                         key = pEvent->key();
00101                         iItem = searchForKey( key );
00102                 }
00103                         
00104                 if( iItem == -1 ) {
00105                         // Let Up and Down keys navigate menu,
00106                         // And permit Enter, Return to select the item.
00107                         if( pEvent->key() == Qt::Key_Up    || pEvent->key() == Qt::Key_Down ||
00108                             pEvent->key() == Qt::Key_Enter || pEvent->key() == Qt::Key_Return )
00109                                 QPopupMenu::keyPressEvent( pEvent );
00110                         else
00111                                 close();
00112                 }
00113                 else if( iItem == 0 )
00114                         keepItemsMatching( key );
00115                 else
00116                         activateItemAt( iItem );
00117         }
00118 }
00119 
00120 int KShortcutMenu::searchForKey( KKey key )
00121 {
00122         int iItemFound = -1; // -1 indicates no match
00123         uint iKey = m_seq.count();
00124         
00125         for( uint iItem = 1; iItem < count(); iItem++ ) {
00126                 if( m_seqs.contains( iItem ) ) {
00127                         KKey keyItem = m_seqs[iItem].key( iKey );
00128                         //kdDebug(125) << "iItem = " << iItem << " key = " << key.toStringInternal() << " keyItem = " << keyItem.toStringInternal() << endl;
00129                         if( key == keyItem ) {
00130                                 if( iItemFound == -1 )
00131                                         iItemFound = iItem;
00132                                 else
00133                                         return 0; // 0 indicates duplicate matches
00134                         }
00135                 }
00136         }
00137         
00138         return iItemFound;
00139 }
00140 
00141 void KShortcutMenu::keepItemsMatching( KKey key )
00142 {
00143         kdDebug(125) << "MyAccel::keepItemsMatching( " << key.toStringInternal() << " )" << endl;
00144         
00145         uint iKey = m_seq.count();
00146         m_seq.setKey( iKey, key );
00147         
00148         for( uint iItem = 1; iItem < count(); iItem++ ) {
00149                 if( m_seqs.contains( iItem ) ) {
00150                         KKey keyItem = m_seqs[iItem].key( iKey );
00151                         if( key != keyItem ) {
00152                                 m_seqs.remove( iItem );
00153                                 removeItemAt( iItem-- );
00154                         }
00155                 }
00156         }
00157         
00158         updateShortcuts();
00159 }
00160 
00161 #include "kshortcutmenu.moc"
KDE Logo
This file is part of the documentation for kdelibs Version 3.1.5.
Documentation copyright © 1996-2002 the KDE developers.
Generated on Wed Jan 28 12:46:53 2004 by doxygen 1.3.4 written by Dimitri van Heesch, © 1997-2001