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., 51 Franklin Street, Fifth Floor, 00017 Boston, MA 02110-1301, USA. 00018 */ 00019 00020 #include <tqkeysequence.h> 00021 #include <tqlabel.h> 00022 #include <tqpopupmenu.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( TQWidget* pParent, KAccelActions* pActions, KKeySequence seq ) 00031 : TQPopupMenu( pParent ), 00032 m_pActions( pActions ), 00033 m_seq( seq ) 00034 { 00035 kdDebug() << seq.toStringInternal() << endl; 00036 00037 TQFont fontTitle = KGlobalSettings::menuFont(); 00038 fontTitle.setBold( true ); 00039 00040 pTitle = new TQLabel( "", (TQWidget*)0 ); 00041 pTitle->setFont( fontTitle ); 00042 pTitle->setFrameShape( TQFrame::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 TQString sSeq = seq.key(m_seq.count()).toString(); 00071 for( uint iKey = m_seq.count() + 1; iKey < seq.count(); iKey++ ) 00072 sSeq += TQString(",") + 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( TQKeyEvent* pEvent ) 00082 { 00083 kdDebug() << "keypress; " << pEvent->key() << endl; 00084 KKey key( pEvent ); 00085 00086 switch( pEvent->key() ) { 00087 case TQ_Key_Shift: 00088 case TQ_Key_Control: 00089 case TQ_Key_Alt: 00090 case TQ_Key_Meta: 00091 case TQ_Key_Super_L: 00092 case TQ_Key_Super_R: 00093 case TQ_Key_Hyper_L: 00094 case TQ_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 TQPopupMenu::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"