# kdecore Library API Documentation

Overview | Class Hierarchy | Classes | Classes (annotated) | Members | Namespaces | Source Files

# 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"

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