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
ImplGetKeyCode(KeyFuncType eFunc,sal_uInt16 & rCode1,sal_uInt16 & rCode2,sal_uInt16 & rCode3,sal_uInt16 & rCode4)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
KeyCode(KeyFuncType eFunction)75 KeyCode::KeyCode( KeyFuncType eFunction )
76 {
77 sal_uInt16 nDummy;
78 ImplGetKeyCode( eFunction, nCode, nDummy, nDummy, nDummy );
79 eFunc = eFunction;
80 }
81
82 // -----------------------------------------------------------------------
83
KeyCode(const ResId & rResId)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
GetName(Window * pWindow) const110 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
GetSymbolName(const XubString & rFontName,Window * pWindow) const119 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
GetFunction() const128 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