1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_vcl.hxx" 26 27 #include <salinst.hxx> 28 #include <salframe.hxx> 29 #include <svdata.hxx> 30 31 #include <vcl/window.hxx> 32 #include <vcl/keycod.hxx> 33 34 #include <tools/rc.h> 35 36 37 // ======================================================================= 38 static sal_uInt16 aImplKeyFuncTab[(KEYFUNC_FRONT+1)*4] = 39 { 40 0, 0, 0, 0, // KEYFUNC_DONTKNOW 41 KEY_N | KEY_MOD1, 0, 0, 0, // KEYFUNC_NEW 42 KEY_O | KEY_MOD1, KEY_OPEN, 0, 0, // KEYFUNC_OPEN 43 KEY_S | KEY_MOD1, 0, 0, 0, // KEYFUNC_SAVE 44 0, 0, 0, 0, // KEYFUNC_SAVEAS 45 KEY_P | KEY_MOD1, 0, 0, 0, // KEYFUNC_PRINT 46 KEY_W | KEY_MOD1, KEY_F4 | KEY_MOD1, 0, 0, // KEYFUNC_CLOSE 47 KEY_Q | KEY_MOD1, KEY_F4 | KEY_MOD2, 0, 0, // KEYFUNC_QUIT 48 KEY_X | KEY_MOD1, KEY_DELETE | KEY_SHIFT, KEY_CUT, 0, // KEYFUNC_CUT 49 KEY_C | KEY_MOD1, KEY_INSERT | KEY_MOD1, KEY_COPY, 0, // KEYFUNC_COPY 50 KEY_V | KEY_MOD1, KEY_INSERT | KEY_SHIFT, KEY_PASTE, 0, // KEYFUNC_PASTE 51 KEY_Z | KEY_MOD1, KEY_BACKSPACE | KEY_MOD2, KEY_UNDO, 0, // KEYFUNC_UNDO 52 0, 0, 0, 0, // KEYFUNC_REDO 53 KEY_DELETE, 0, 0, 0, // KEYFUNC_DELETE 54 KEY_REPEAT, 0, 0, 0, // KEYFUNC_REPEAT 55 KEY_F | KEY_MOD1, KEY_FIND, 0, 0, // KEYFUNC_FIND 56 KEY_F | KEY_SHIFT | KEY_MOD1, KEY_SHIFT | KEY_FIND, 0, 0, // KEYFUNC_FINDBACKWARD 57 KEY_RETURN | KEY_MOD2, 0, 0, 0, // KEYFUNC_PROPERTIES 58 0, 0, 0, 0 // KEYFUNC_FRONT 59 }; 60 61 // ----------------------------------------------------------------------- 62 63 void ImplGetKeyCode( KeyFuncType eFunc, sal_uInt16& rCode1, sal_uInt16& rCode2, sal_uInt16& rCode3, sal_uInt16& rCode4 ) 64 { 65 sal_uInt16 nIndex = (sal_uInt16)eFunc; 66 nIndex *= 4; 67 rCode1 = aImplKeyFuncTab[nIndex]; 68 rCode2 = aImplKeyFuncTab[nIndex+1]; 69 rCode3 = aImplKeyFuncTab[nIndex+2]; 70 rCode4 = aImplKeyFuncTab[nIndex+3]; 71 } 72 73 // ======================================================================= 74 75 KeyCode::KeyCode( KeyFuncType eFunction ) 76 { 77 sal_uInt16 nDummy; 78 ImplGetKeyCode( eFunction, nCode, nDummy, nDummy, nDummy ); 79 eFunc = eFunction; 80 } 81 82 // ----------------------------------------------------------------------- 83 84 KeyCode::KeyCode( const ResId& rResId ) 85 { 86 rResId.SetRT( RSC_KEYCODE ); 87 88 ResMgr* pResMgr = rResId.GetResMgr(); 89 if ( pResMgr && pResMgr->GetResource( rResId ) ) 90 { 91 pResMgr->Increment( sizeof( RSHEADER_TYPE ) ); 92 93 sal_uLong nKeyCode = pResMgr->ReadLong(); 94 sal_uLong nModifier = pResMgr->ReadLong(); 95 sal_uLong nKeyFunc = pResMgr->ReadLong(); 96 97 eFunc = (KeyFuncType)nKeyFunc; 98 if ( eFunc != KEYFUNC_DONTKNOW ) 99 { 100 sal_uInt16 nDummy; 101 ImplGetKeyCode( eFunc, nCode, nDummy, nDummy, nDummy ); 102 } 103 else 104 nCode = sal::static_int_cast<sal_uInt16>(nKeyCode | nModifier); 105 } 106 } 107 108 // ----------------------------------------------------------------------- 109 110 XubString KeyCode::GetName( Window* pWindow ) const 111 { 112 if ( !pWindow ) 113 pWindow = ImplGetDefaultWindow(); 114 return pWindow ? pWindow->ImplGetFrame()->GetKeyName( GetFullCode() ) : XubString(); 115 } 116 117 // ----------------------------------------------------------------------- 118 119 XubString KeyCode::GetSymbolName( const XubString& rFontName, Window* pWindow ) const 120 { 121 if ( !pWindow ) 122 pWindow = ImplGetDefaultWindow(); 123 return pWindow ? pWindow->ImplGetFrame()->GetSymbolKeyName( rFontName, GetFullCode() ) : XubString(); 124 } 125 126 // ----------------------------------------------------------------------- 127 128 KeyFuncType KeyCode::GetFunction() const 129 { 130 if ( eFunc != KEYFUNC_DONTKNOW ) 131 return eFunc; 132 133 sal_uInt16 nCompCode = GetModifier() | GetCode(); 134 if ( nCompCode ) 135 { 136 for ( sal_uInt16 i = (sal_uInt16)KEYFUNC_NEW; i < (sal_uInt16)KEYFUNC_FRONT; i++ ) 137 { 138 sal_uInt16 nKeyCode1; 139 sal_uInt16 nKeyCode2; 140 sal_uInt16 nKeyCode3; 141 sal_uInt16 nKeyCode4; 142 ImplGetKeyCode( (KeyFuncType)i, nKeyCode1, nKeyCode2, nKeyCode3, nKeyCode4 ); 143 if ( (nCompCode == nKeyCode1) || (nCompCode == nKeyCode2) || (nCompCode == nKeyCode3) || (nCompCode == nKeyCode4) ) 144 return (KeyFuncType)i; 145 } 146 } 147 148 return KEYFUNC_DONTKNOW; 149 } 150