kdecore Library API Documentation

kstdaccel.cpp

00001 /* This file is part of the KDE libraries 00002 Copyright (C) 1997 Stefan Taferner (taferner@alpin.or.at) 00003 Copyright (C) 2000 Nicolas Hadacek (haadcek@kde.org) 00004 Copyright (C) 2001,2002 Ellis Whitehead (ellis@kde.org) 00005 00006 This library is free software; you can redistribute it and/or 00007 modify it under the terms of the GNU Library General Public 00008 License version 2 as published by the Free Software Foundation. 00009 00010 This library is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 Library General Public License for more details. 00014 00015 You should have received a copy of the GNU Library General Public License 00016 along with this library; see the file COPYING.LIB. If not, write to 00017 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00018 Boston, MA 02111-1307, USA. 00019 */ 00020 #define __KSTDACCEL_CPP_ 1 00021 00022 #include "kstdaccel.h" 00023 00024 #include "kaccelaction.h" 00025 #include "kaccelbase.h" 00026 #include <kconfig.h> 00027 #include <kdebug.h> 00028 #include <kglobal.h> 00029 #include <klocale.h> 00030 #include <kshortcut.h> 00031 #include <kshortcutlist.h> 00032 00033 namespace KStdAccel 00034 { 00035 00036 struct KStdAccelInfo 00037 { 00038 StdAccel id; 00039 const char* psName; 00040 const char* psDesc; 00041 int cutDefault, cutDefault4, cutDefault3B, cutDefault4B; 00042 KShortcut cut; 00043 bool bInitialized; 00044 }; 00045 00046 static KStdAccelInfo g_infoStdAccel[] = 00047 { 00048 {AccelNone, "Group:File", I18N_NOOP("File"), 0, 0, 0, 0, KShortcut(), false }, 00049 { Open, I18N_NOOP("Open"), 0, Qt::CTRL+Qt::Key_O, 0, 0, 0, KShortcut(), false }, 00050 { New, I18N_NOOP("New"), 0, Qt::CTRL+Qt::Key_N, 0, 0, 0, KShortcut(), false }, 00051 { Close, I18N_NOOP("Close"), 0, Qt::CTRL+Qt::Key_W, Qt::CTRL+Qt::Key_Escape, 0, Qt::CTRL+Qt::Key_W, KShortcut(), false }, 00052 { Save, I18N_NOOP("Save"), 0, Qt::CTRL+Qt::Key_S, 0, 0, 0, KShortcut(), false }, 00053 { Print, I18N_NOOP("Print"), 0, Qt::CTRL+Qt::Key_P, 0, 0, 0, KShortcut(), false }, 00054 { Quit, I18N_NOOP("Quit"), 0, Qt::CTRL+Qt::Key_Q, 0, 0, 0, KShortcut(), false }, 00055 {AccelNone, "Group:Edit", I18N_NOOP("Edit"), 0, 0, 0, 0, KShortcut(), false }, 00056 { Undo, I18N_NOOP("Undo"), 0, Qt::CTRL+Qt::Key_Z, 0, 0, 0, KShortcut(), false }, 00057 { Redo, I18N_NOOP("Redo"), 0, Qt::CTRL+Qt::SHIFT+Qt::Key_Z, 0, 0, 0, KShortcut(), false }, 00058 { Cut, I18N_NOOP("Cut"), 0, Qt::CTRL+Qt::Key_X, 0, Qt::SHIFT+Qt::Key_Delete, 0, KShortcut(), false }, 00059 { Copy, I18N_NOOP("Copy"), 0, Qt::CTRL+Qt::Key_C, 0, Qt::CTRL+Qt::Key_Insert, 0, KShortcut(), false }, 00060 { Paste, I18N_NOOP("Paste"), 0, Qt::CTRL+Qt::Key_V, 0, Qt::SHIFT+Qt::Key_Insert, 0, KShortcut(), false }, 00061 { SelectAll, "SelectAll", I18N_NOOP("Select All"), Qt::CTRL+Qt::Key_A, 0, 0, 0, KShortcut(), false }, 00062 { Deselect, I18N_NOOP("Deselect"), 0, Qt::CTRL+Qt::SHIFT+Qt::Key_A, 0, 0, 0, KShortcut(), false }, 00063 { DeleteWordBack, "DeleteWordBack", I18N_NOOP("Delete Word Backwards"), Qt::CTRL+Qt::Key_Backspace, 0, 0, 0, KShortcut(), false }, 00064 { DeleteWordForward, "DeleteWordForward", I18N_NOOP("Delete Word Forward"), Qt::CTRL+Qt::Key_Delete, 0, 0, 0, KShortcut(), false }, 00065 { Find, I18N_NOOP("Find"), 0, Qt::CTRL+Qt::Key_F, 0, 0, 0, KShortcut(), false }, 00066 { FindNext, "FindNext", I18N_NOOP("Find Next"), Qt::Key_F3, 0, 0, 0, KShortcut(), false }, 00067 { FindPrev, "FindPrev", I18N_NOOP("Find Prev"), Qt::SHIFT+Qt::Key_F3, 0, 0, 0, KShortcut(), false }, 00068 { Replace, I18N_NOOP("Replace"), 0, Qt::CTRL+Qt::Key_R, 0, 0, 0, KShortcut(), false }, 00069 {AccelNone, "Group:Navigation", I18N_NOOP("Navigation"), 0, 0, 0, 0, KShortcut(), false }, 00070 { Home, I18N_NOOP("Home"), 0, Qt::CTRL+Qt::Key_Home, 0, 0, 0, KShortcut(), false }, 00071 { End, I18N_NOOP("End"), 0, Qt::CTRL+Qt::Key_End, 0, 0, 0, KShortcut(), false }, 00072 { Prior, I18N_NOOP("Prior"), 0, Qt::Key_Prior, 0, 0, 0, KShortcut(), false }, 00073 { Next, I18N_NOOP("Next"), 0, Qt::Key_Next, 0, 0, 0, KShortcut(), false }, 00074 { GotoLine, "GotoLine", I18N_NOOP("Go to Line"), Qt::CTRL+Qt::Key_G, 0, 0, 0, KShortcut(), false }, 00075 { AddBookmark, "AddBookmark", I18N_NOOP("Add Bookmark"), Qt::CTRL+Qt::Key_B, 0, 0, 0, KShortcut(), false }, 00076 { ZoomIn, "ZoomIn", I18N_NOOP("Zoom In"), Qt::CTRL+Qt::Key_Plus, 0, 0, 0, KShortcut(), false }, 00077 { ZoomOut, "ZoomOut", I18N_NOOP("Zoom Out"), Qt::CTRL+Qt::Key_Minus, 0, 0, 0, KShortcut(), false }, 00078 { Up, I18N_NOOP("Up"), 0, Qt::ALT+Qt::Key_Up, 0, 0, 0, KShortcut(), false }, 00079 { Back, I18N_NOOP("Back"), 0, Qt::ALT+Qt::Key_Left, 0, 0, 0, KShortcut(), false }, 00080 { Forward, I18N_NOOP("Forward"), 0, Qt::ALT+Qt::Key_Right, 0, 0, 0, KShortcut(), false }, 00081 { Reload, I18N_NOOP("Reload"), 0, Qt::Key_F5, 0, 0, 0, KShortcut(), false }, 00082 { PopupMenuContext, "PopupMenuContext", I18N_NOOP("Popup Menu Context"), Qt::Key_Menu, 0, 0, 0, KShortcut(), false }, 00083 { ShowMenubar, "ShowMenubar", I18N_NOOP("Show Menu Bar"), Qt::CTRL+Qt::Key_M, 0, 0, 0, KShortcut(), false }, 00084 { TabNext, I18N_NOOP("Activate Next Tab"), 0, Qt::CTRL+Qt::Key_Period, 0, Qt::CTRL+Qt::Key_BracketRight, 0, KShortcut(), false }, 00085 { TabPrev, I18N_NOOP("Activate Previous Tab"), 0, Qt::CTRL+Qt::Key_Comma, 0, Qt::CTRL+Qt::Key_BracketLeft, 0, KShortcut(), false }, 00086 { FullScreen, "FullScreen", I18N_NOOP("Full Screen Mode"), Qt::CTRL+Qt::SHIFT+Qt::Key_F, 0, 0, 0, KShortcut(), false }, 00087 {AccelNone, "Group:Help", I18N_NOOP("Help"), 0, 0, 0, 0, KShortcut(), false }, 00088 { Help, I18N_NOOP("Help"), 0, Qt::Key_F1, 0, 0, 0, KShortcut(), false }, 00089 { WhatsThis, "WhatsThis", I18N_NOOP("What's This"), Qt::SHIFT+Qt::Key_F1, 0, 0, 0, KShortcut(), false }, 00090 {AccelNone, "Group:TextCompletion", I18N_NOOP("Text Completion"), 0, 0, 0, 0, KShortcut(), false }, 00091 { TextCompletion, "TextCompletion", I18N_NOOP("Text Completion"), Qt::CTRL+Qt::Key_E, 0, 0, 0, KShortcut(), false }, 00092 { PrevCompletion, "PrevCompletion", I18N_NOOP("Previous Completion Match"), Qt::CTRL+Qt::Key_Up, 0, 0, 0, KShortcut(), false }, 00093 { NextCompletion, "NextCompletion", I18N_NOOP("Next Completion Match"), Qt::CTRL+Qt::Key_Down, 0, 0, 0, KShortcut(), false }, 00094 { SubstringCompletion, "SubstringCompletion", I18N_NOOP("Substring Completion"), Qt::CTRL+Qt::Key_T, 0, 0, 0, KShortcut(), false }, 00095 { RotateUp, "RotateUp", I18N_NOOP("Previous Item in List"), Qt::Key_Up, 0, 0, 0, KShortcut(), false }, 00096 { RotateDown, "RotateDown", I18N_NOOP("Next Item in List"), Qt::Key_Down, 0, 0, 0, KShortcut(), false }, 00097 { AccelNone, 0, 0, 0, 0, 0, 0, KShortcut(), false } 00098 }; 00099 00100 static KStdAccelInfo* infoPtr( StdAccel id ) 00101 { 00102 if( id != AccelNone ) { 00103 for( uint i = 0; g_infoStdAccel[i].psName != 0; i++ ) { 00104 if( g_infoStdAccel[i].id == id ) 00105 return &g_infoStdAccel[i]; 00106 } 00107 } 00108 return 0; 00109 } 00110 00111 static void initialize( StdAccel id ) 00112 { 00113 KConfigGroupSaver saver( KGlobal::config(), "Shortcuts" ); 00114 KStdAccelInfo* pInfo = infoPtr( id ); 00115 00116 if( !pInfo ) { 00117 kdWarning(125) << "KStdAccel: id not found!" << endl; // -- ellis 00118 return; 00119 } 00120 00121 if( saver.config()->hasKey( pInfo->psName ) ) { 00122 QString s = saver.config()->readEntry( pInfo->psName ); 00123 if( s != "none" ) 00124 pInfo->cut.init( s ); 00125 else 00126 pInfo->cut.clear(); 00127 } else 00128 pInfo->cut = shortcutDefault( id ); 00129 pInfo->bInitialized = true; 00130 } 00131 00132 QString name( StdAccel id ) 00133 { 00134 KStdAccelInfo* pInfo = infoPtr( id ); 00135 if( !pInfo ) 00136 return QString::null; 00137 return pInfo->psName; 00138 } 00139 00140 QString label( StdAccel id ) 00141 { 00142 KStdAccelInfo* pInfo = infoPtr( id ); 00143 if( !pInfo ) 00144 return QString::null; 00145 return i18n((pInfo->psDesc) ? pInfo->psDesc : pInfo->psName); 00146 } 00147 00148 // TODO: Add psWhatsThis entry to KStdAccelInfo 00149 QString whatsThis( StdAccel /*id*/ ) 00150 { 00151 // KStdAccelInfo* pInfo = infoPtr( id ); 00152 // if( pInfo && pInfo->psWhatsThis ) 00153 // return i18n(pInfo->psWhatsThis); 00154 // else 00155 return QString::null; 00156 } 00157 00158 const KShortcut& shortcut( StdAccel id ) 00159 { 00160 KStdAccelInfo* pInfo = infoPtr( id ); 00161 if( !pInfo ) 00162 return KShortcut::null(); 00163 00164 if( !pInfo->bInitialized ) 00165 initialize( id ); 00166 00167 return pInfo->cut; 00168 } 00169 00170 StdAccel findStdAccel( const KKeySequence& seq ) 00171 { 00172 if( !seq.isNull() ) { 00173 for( uint i = 0; g_infoStdAccel[i].psName != 0; i++ ) { 00174 StdAccel id = g_infoStdAccel[i].id; 00175 if( id != AccelNone ) { 00176 if( !g_infoStdAccel[i].bInitialized ) 00177 initialize( id ); 00178 if( g_infoStdAccel[i].cut.contains( seq ) ) 00179 return id; 00180 } 00181 } 00182 } 00183 return AccelNone; 00184 } 00185 00186 KShortcut shortcutDefault( StdAccel id ) 00187 { 00188 return (KAccelAction::useFourModifierKeys()) 00189 ? shortcutDefault4(id) : shortcutDefault3(id); 00190 } 00191 00192 KShortcut shortcutDefault3( StdAccel id ) 00193 { 00194 KShortcut cut; 00195 00196 KStdAccelInfo* pInfo = infoPtr( id ); 00197 if( pInfo ) { 00198 if( pInfo->cutDefault ) 00199 cut.init( pInfo->cutDefault ); 00200 // FIXME: if there is no cutDefault, then this we be made the primary 00201 // instead of alternate shortcut. 00202 if( pInfo->cutDefault3B ) 00203 cut.append( KKey(pInfo->cutDefault3B) ); 00204 } 00205 00206 return cut; 00207 } 00208 00209 KShortcut shortcutDefault4( StdAccel id ) 00210 { 00211 KShortcut cut; 00212 00213 KStdAccelInfo* pInfo = infoPtr( id ); 00214 if( pInfo ) { 00215 KStdAccelInfo& info = *pInfo; 00216 KKeySequence key2; 00217 00218 cut.init( (info.cutDefault4) ? 00219 QKeySequence(info.cutDefault) : QKeySequence(info.cutDefault4) ); 00220 00221 if( info.cutDefault4B ) 00222 key2.init( QKeySequence(info.cutDefault4B) ); 00223 else if( info.cutDefault3B ) 00224 key2.init( QKeySequence(info.cutDefault3B) ); 00225 00226 if( key2.count() ) 00227 cut.append( key2 ); 00228 } 00229 00230 return cut; 00231 } 00232 00233 void createAccelActions( KAccelActions& actions ) 00234 { 00235 actions.clear(); 00236 00237 for( uint i = 0; g_infoStdAccel[i].psName != 0; i++ ) { 00238 StdAccel id = g_infoStdAccel[i].id; 00239 KStdAccelInfo* pInfo = &g_infoStdAccel[i]; 00240 00241 if( id != AccelNone ) { 00242 actions.insert( pInfo->psName, 00243 i18n((pInfo->psDesc) ? pInfo->psDesc : pInfo->psName), 00244 QString::null, // pInfo->psWhatsThis, 00245 shortcutDefault3(id), 00246 shortcutDefault4(id) ); 00247 } else 00248 actions.insert( pInfo->psName, i18n(pInfo->psDesc) ); 00249 } 00250 } 00251 00252 const KShortcut& open() { return shortcut( Open ); } 00253 const KShortcut& openNew() { return shortcut( New ); } 00254 const KShortcut& close() { return shortcut( Close ); } 00255 const KShortcut& save() { return shortcut( Save ); } 00256 const KShortcut& print() { return shortcut( Print ); } 00257 const KShortcut& quit() { return shortcut( Quit ); } 00258 const KShortcut& cut() { return shortcut( Cut ); } 00259 const KShortcut& copy() { return shortcut( Copy ); } 00260 const KShortcut& paste() { return shortcut( Paste ); } 00261 const KShortcut& deleteWordBack() { return shortcut( DeleteWordBack ); } 00262 const KShortcut& deleteWordForward() { return shortcut( DeleteWordForward ); } 00263 const KShortcut& undo() { return shortcut( Undo ); } 00264 const KShortcut& redo() { return shortcut( Redo ); } 00265 const KShortcut& find() { return shortcut( Find ); } 00266 const KShortcut& findNext() { return shortcut( FindNext ); } 00267 const KShortcut& findPrev() { return shortcut( FindPrev ); } 00268 const KShortcut& replace() { return shortcut( Replace ); } 00269 const KShortcut& home() { return shortcut( Home ); } 00270 const KShortcut& end() { return shortcut( End ); } 00271 const KShortcut& prior() { return shortcut( Prior ); } 00272 const KShortcut& next() { return shortcut( Next ); } 00273 const KShortcut& gotoLine() { return shortcut( GotoLine ); } 00274 const KShortcut& addBookmark() { return shortcut( AddBookmark ); } 00275 const KShortcut& tabNext() { return shortcut( TabNext ); } 00276 const KShortcut& tabPrev() { return shortcut( TabPrev ); } 00277 const KShortcut& fullScreen() { return shortcut( FullScreen ); } 00278 const KShortcut& zoomIn() { return shortcut( ZoomIn ); } 00279 const KShortcut& zoomOut() { return shortcut( ZoomOut ); } 00280 const KShortcut& help() { return shortcut( Help ); } 00281 const KShortcut& completion() { return shortcut( TextCompletion ); } 00282 const KShortcut& prevCompletion() { return shortcut( PrevCompletion ); } 00283 const KShortcut& nextCompletion() { return shortcut( NextCompletion ); } 00284 const KShortcut& rotateUp() { return shortcut( RotateUp ); } 00285 const KShortcut& rotateDown() { return shortcut( RotateDown ); } 00286 const KShortcut& substringCompletion() { return shortcut( SubstringCompletion ); } 00287 const KShortcut& popupMenuContext() { return shortcut( PopupMenuContext ); } 00288 const KShortcut& whatsThis() { return shortcut( WhatsThis ); } 00289 const KShortcut& reload() { return shortcut( Reload ); } 00290 const KShortcut& selectAll() { return shortcut( SelectAll ); } 00291 const KShortcut& up() { return shortcut( Up ); } 00292 const KShortcut& back() { return shortcut( Back ); } 00293 const KShortcut& forward() { return shortcut( Forward ); } 00294 const KShortcut& showMenubar() { return shortcut( ShowMenubar ); } 00295 00296 //--------------------------------------------------------------------- 00297 // ShortcutList 00298 //--------------------------------------------------------------------- 00299 00300 ShortcutList::ShortcutList() 00301 { } 00302 00303 ShortcutList::~ShortcutList() 00304 { } 00305 00306 uint ShortcutList::count() const 00307 { 00308 static uint g_nAccels = 0; 00309 if( g_nAccels == 0 ) { 00310 for( ; g_infoStdAccel[g_nAccels].psName != 0; g_nAccels++ ) 00311 ; 00312 } 00313 return g_nAccels; 00314 } 00315 00316 QString ShortcutList::name( uint i ) const 00317 { return g_infoStdAccel[i].psName; } 00318 00319 QString ShortcutList::label( uint i ) const 00320 { return i18n((g_infoStdAccel[i].psDesc) ? g_infoStdAccel[i].psDesc : g_infoStdAccel[i].psName); } 00321 00322 QString ShortcutList::whatsThis( uint ) const 00323 { return QString::null; } 00324 00325 const KShortcut& ShortcutList::shortcut( uint i ) const 00326 { 00327 if( !g_infoStdAccel[i].bInitialized ) 00328 initialize( g_infoStdAccel[i].id ); 00329 return g_infoStdAccel[i].cut; 00330 } 00331 00332 const KShortcut& ShortcutList::shortcutDefault( uint i ) const 00333 { 00334 static KShortcut cut; 00335 cut = KStdAccel::shortcutDefault( g_infoStdAccel[i].id ); 00336 return cut; 00337 } 00338 00339 bool ShortcutList::isConfigurable( uint i ) const 00340 { return (g_infoStdAccel[i].id != AccelNone); } 00341 00342 bool ShortcutList::setShortcut( uint i, const KShortcut& cut ) 00343 { g_infoStdAccel[i].cut = cut; return true; } 00344 00345 QVariant ShortcutList::getOther( Other, uint ) const 00346 { return QVariant(); } 00347 00348 bool ShortcutList::setOther( Other, uint, QVariant ) 00349 { return false; } 00350 00351 bool ShortcutList::save() const 00352 { 00353 return writeSettings( QString::null, 0, false, true ); 00354 } 00355 00356 QString action(StdAccel id) 00357 { return name(id); } 00358 QString description(StdAccel id) 00359 { return label(id); } 00360 int key(StdAccel id) 00361 { return shortcut(id).keyCodeQt(); } 00362 int defaultKey(StdAccel id) 00363 { return shortcutDefault(id).keyCodeQt(); } 00364 00365 bool isEqual(const QKeyEvent* ev, int keyQt) 00366 { 00367 KKey key1( ev ), key2( keyQt ); 00368 return key1 == key2; 00369 } 00370 00371 } 00372 00373 #undef __KSTDACCEL_CPP_
KDE Logo
This file is part of the documentation for kdecore Library Version 3.2.3.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Oct 8 11:14:03 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003