xref: /trunk/main/cui/source/customize/acccfg.cxx (revision cfd52e18)
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_cui.hxx"
26 
27 //-----------------------------------------------
28 // include own files
29 
30 #include "acccfg.hxx"
31 #include "cfgutil.hxx"
32 #include <dialmgr.hxx>
33 
34 #include <sfx2/msg.hxx>
35 #include <sfx2/app.hxx>
36 #include <sfx2/filedlghelper.hxx>
37 #include <sfx2/minfitem.hxx>
38 #include <sfx2/sfxresid.hxx>
39 #include <svl/stritem.hxx>
40 
41 #include "cuires.hrc"
42 #include "acccfg.hrc"
43 
44 #include <svx/svxids.hrc> // SID_CHARMAP, SID_ATTR_SPECIALCHAR
45 
46 //-----------------------------------------------
47 // include interface declarations
48 #include <com/sun/star/frame/XFramesSupplier.hpp>
49 #include <com/sun/star/frame/XFrame.hpp>
50 #include <com/sun/star/frame/XController.hpp>
51 #include <com/sun/star/frame/XModel.hpp>
52 #include <com/sun/star/form/XReset.hpp>
53 #include <com/sun/star/frame/XModuleManager.hpp>
54 #include <com/sun/star/ui/XModuleUIConfigurationManagerSupplier.hpp>
55 #include <com/sun/star/frame/XModuleManager.hpp>
56 
57 #ifndef _COM_SUN_STAR_UI_XUICONFIGURATIONMANAGERSUPLLIER_HPP_
58 #include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
59 #endif
60 #include <com/sun/star/ui/XUIConfigurationManager.hpp>
61 #include <com/sun/star/awt/KeyModifier.hpp>
62 #include <com/sun/star/embed/XTransactedObject.hpp>
63 #include <com/sun/star/embed/ElementModes.hpp>
64 
65 #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
66 
67 //-----------------------------------------------
68 // include other projects
69 #include <unotools/processfactory.hxx>
70 #include <svtools/acceleratorexecute.hxx>
71 #include <comphelper/processfactory.hxx>
72 #include <svtools/svlbitm.hxx>
73 #include <vcl/svapp.hxx>
74 #include <vcl/help.hxx>
75 #include <rtl/ustrbuf.hxx>
76 #include <comphelper/sequenceashashmap.hxx>
77 
78 //-----------------------------------------------
79 // namespaces
80 
81 #ifdef css
82     #error "ambigous praeprozessor directive for css ..."
83 #else
84     namespace css = ::com::sun::star;
85 #endif
86 
87 using namespace com::sun::star;
88 
89 //-----------------------------------------------
90 // definitions
91 
92 //-----------------------------------------------
93 static ::rtl::OUString SERVICE_STORAGEFACTORY           = ::rtl::OUString::createFromAscii("com.sun.star.embed.StorageFactory"                          );
94 static ::rtl::OUString SERVICE_UICONFIGMGR              = ::rtl::OUString::createFromAscii("com.sun.star.ui.UIConfigurationManager"              );
95 static ::rtl::OUString SERVICE_DESKTOP                  = ::rtl::OUString::createFromAscii("com.sun.star.frame.Desktop"                                 );
96 static ::rtl::OUString SERVICE_MODULEMANAGER            = ::rtl::OUString::createFromAscii("com.sun.star.frame.ModuleManager"                    );
97 static ::rtl::OUString SERVICE_GLOBALACCCFG             = ::rtl::OUString::createFromAscii("com.sun.star.ui.GlobalAcceleratorConfiguration"      );
98 static ::rtl::OUString SERVICE_MODULEUICONFIGSUPPLIER   = ::rtl::OUString::createFromAscii("com.sun.star.ui.ModuleUIConfigurationManagerSupplier");
99 static ::rtl::OUString SERVICE_UICMDDESCRIPTION         = ::rtl::OUString::createFromAscii("com.sun.star.frame.UICommandDescription"             );
100 
101 static ::rtl::OUString MODULEPROP_SHORTNAME             = ::rtl::OUString::createFromAscii("ooSetupFactoryShortName"                                    );
102 static ::rtl::OUString MODULEPROP_UINAME                = ::rtl::OUString::createFromAscii("ooSetupFactoryUIName"                                       );
103 static ::rtl::OUString CMDPROP_UINAME                   = ::rtl::OUString::createFromAscii("Name"                                                       );
104 
105 static ::rtl::OUString FOLDERNAME_UICONFIG              = ::rtl::OUString::createFromAscii("Configurations2"                                            );
106 
107 static ::rtl::OUString MEDIATYPE_PROPNAME               = ::rtl::OUString::createFromAscii("MediaType"                                                  );
108 static ::rtl::OUString MEDIATYPE_UICONFIG               = ::rtl::OUString::createFromAscii("application/vnd.sun.xml.ui.configuration"                   );
109 
110 //-----------------------------------------------
111 static sal_uInt16 __FAR_DATA KEYCODE_ARRAY[] =
112 {
113 	KEY_F1       ,
114 	KEY_F2       ,
115 	KEY_F3       ,
116 	KEY_F4       ,
117 	KEY_F5       ,
118 	KEY_F6       ,
119 	KEY_F7       ,
120 	KEY_F8       ,
121 	KEY_F9       ,
122 	KEY_F10      ,
123 	KEY_F11      ,
124 	KEY_F12      ,
125 
126 	KEY_DOWN     ,
127 	KEY_UP       ,
128 	KEY_LEFT     ,
129 	KEY_RIGHT    ,
130 	KEY_HOME     ,
131 	KEY_END      ,
132 	KEY_PAGEUP   ,
133 	KEY_PAGEDOWN ,
134 	KEY_RETURN   ,
135 	KEY_ESCAPE   ,
136 	KEY_BACKSPACE,
137 	KEY_INSERT   ,
138 	KEY_DELETE   ,
139 
140 	KEY_OPEN		,
141 	KEY_CUT			,
142 	KEY_COPY		,
143 	KEY_PASTE		,
144 	KEY_UNDO		,
145 	KEY_REPEAT		,
146 	KEY_FIND		,
147 	KEY_PROPERTIES	,
148 	KEY_FRONT		,
149 	KEY_CONTEXTMENU ,
150 	KEY_MENU		,
151 	KEY_HELP		,
152 
153 	KEY_F1        | KEY_SHIFT,
154 	KEY_F2        | KEY_SHIFT,
155 	KEY_F3        | KEY_SHIFT,
156 	KEY_F4        | KEY_SHIFT,
157 	KEY_F5        | KEY_SHIFT,
158 	KEY_F6        | KEY_SHIFT,
159 	KEY_F7        | KEY_SHIFT,
160 	KEY_F8        | KEY_SHIFT,
161 	KEY_F9        | KEY_SHIFT,
162 	KEY_F10       | KEY_SHIFT,
163 	KEY_F11       | KEY_SHIFT,
164 	KEY_F12       | KEY_SHIFT,
165 
166 	KEY_DOWN      | KEY_SHIFT,
167 	KEY_UP        | KEY_SHIFT,
168 	KEY_LEFT      | KEY_SHIFT,
169 	KEY_RIGHT     | KEY_SHIFT,
170 	KEY_HOME      | KEY_SHIFT,
171 	KEY_END       | KEY_SHIFT,
172 	KEY_PAGEUP    | KEY_SHIFT,
173 	KEY_PAGEDOWN  | KEY_SHIFT,
174 	KEY_RETURN    | KEY_SHIFT,
175 	KEY_SPACE     | KEY_SHIFT,
176 	KEY_ESCAPE    | KEY_SHIFT,
177 	KEY_BACKSPACE | KEY_SHIFT,
178 	KEY_INSERT    | KEY_SHIFT,
179 	KEY_DELETE    | KEY_SHIFT,
180 
181 	KEY_0         | KEY_MOD1 ,
182 	KEY_1         | KEY_MOD1 ,
183 	KEY_2         | KEY_MOD1 ,
184 	KEY_3         | KEY_MOD1 ,
185 	KEY_4         | KEY_MOD1 ,
186 	KEY_5         | KEY_MOD1 ,
187 	KEY_6         | KEY_MOD1 ,
188 	KEY_7         | KEY_MOD1 ,
189 	KEY_8         | KEY_MOD1 ,
190 	KEY_9         | KEY_MOD1 ,
191 	KEY_A         | KEY_MOD1 ,
192 	KEY_B         | KEY_MOD1 ,
193 	KEY_C         | KEY_MOD1 ,
194 	KEY_D         | KEY_MOD1 ,
195 	KEY_E         | KEY_MOD1 ,
196 	KEY_F         | KEY_MOD1 ,
197 	KEY_G         | KEY_MOD1 ,
198 	KEY_H         | KEY_MOD1 ,
199 	KEY_I         | KEY_MOD1 ,
200 	KEY_J         | KEY_MOD1 ,
201 	KEY_K         | KEY_MOD1 ,
202 	KEY_L         | KEY_MOD1 ,
203 	KEY_M         | KEY_MOD1 ,
204 	KEY_N         | KEY_MOD1 ,
205 	KEY_O         | KEY_MOD1 ,
206 	KEY_P         | KEY_MOD1 ,
207 	KEY_Q         | KEY_MOD1 ,
208 	KEY_R         | KEY_MOD1 ,
209 	KEY_S         | KEY_MOD1 ,
210 	KEY_T         | KEY_MOD1 ,
211 	KEY_U         | KEY_MOD1 ,
212 	KEY_V         | KEY_MOD1 ,
213 	KEY_W         | KEY_MOD1 ,
214 	KEY_X         | KEY_MOD1 ,
215 	KEY_Y         | KEY_MOD1 ,
216 	KEY_Z         | KEY_MOD1 ,
217 
218 	KEY_F1        | KEY_MOD1 ,
219 	KEY_F2        | KEY_MOD1 ,
220 	KEY_F3        | KEY_MOD1 ,
221 	KEY_F4        | KEY_MOD1 ,
222 	KEY_F5        | KEY_MOD1 ,
223 	KEY_F6        | KEY_MOD1 ,
224 	KEY_F7        | KEY_MOD1 ,
225 	KEY_F8        | KEY_MOD1 ,
226 	KEY_F9        | KEY_MOD1 ,
227 	KEY_F10       | KEY_MOD1 ,
228 	KEY_F11       | KEY_MOD1 ,
229 	KEY_F12       | KEY_MOD1 ,
230 
231 	KEY_DOWN      | KEY_MOD1 ,
232 	KEY_UP        | KEY_MOD1 ,
233 	KEY_LEFT      | KEY_MOD1 ,
234 	KEY_RIGHT     | KEY_MOD1 ,
235 	KEY_HOME      | KEY_MOD1 ,
236 	KEY_END       | KEY_MOD1 ,
237 	KEY_PAGEUP    | KEY_MOD1 ,
238 	KEY_PAGEDOWN  | KEY_MOD1 ,
239 	KEY_RETURN    | KEY_MOD1 ,
240 	KEY_SPACE     | KEY_MOD1 ,
241 	KEY_BACKSPACE | KEY_MOD1 ,
242 	KEY_INSERT    | KEY_MOD1 ,
243 	KEY_DELETE    | KEY_MOD1 ,
244 
245 	KEY_ADD       | KEY_MOD1 ,
246 	KEY_SUBTRACT  | KEY_MOD1 ,
247 	KEY_MULTIPLY  | KEY_MOD1 ,
248 	KEY_DIVIDE    | KEY_MOD1 ,
249 
250 	KEY_0         | KEY_SHIFT | KEY_MOD1,
251 	KEY_1         | KEY_SHIFT | KEY_MOD1,
252 	KEY_2         | KEY_SHIFT | KEY_MOD1,
253 	KEY_3         | KEY_SHIFT | KEY_MOD1,
254 	KEY_4         | KEY_SHIFT | KEY_MOD1,
255 	KEY_5         | KEY_SHIFT | KEY_MOD1,
256 	KEY_6         | KEY_SHIFT | KEY_MOD1,
257 	KEY_7         | KEY_SHIFT | KEY_MOD1,
258 	KEY_8         | KEY_SHIFT | KEY_MOD1,
259 	KEY_9         | KEY_SHIFT | KEY_MOD1,
260 	KEY_A         | KEY_SHIFT | KEY_MOD1,
261 	KEY_B         | KEY_SHIFT | KEY_MOD1,
262 	KEY_C         | KEY_SHIFT | KEY_MOD1,
263 	KEY_D         | KEY_SHIFT | KEY_MOD1,
264 	KEY_E         | KEY_SHIFT | KEY_MOD1,
265 	KEY_F         | KEY_SHIFT | KEY_MOD1,
266 	KEY_G         | KEY_SHIFT | KEY_MOD1,
267 	KEY_H         | KEY_SHIFT | KEY_MOD1,
268 	KEY_I         | KEY_SHIFT | KEY_MOD1,
269 	KEY_J         | KEY_SHIFT | KEY_MOD1,
270 	KEY_K         | KEY_SHIFT | KEY_MOD1,
271 	KEY_L         | KEY_SHIFT | KEY_MOD1,
272 	KEY_M         | KEY_SHIFT | KEY_MOD1,
273 	KEY_N         | KEY_SHIFT | KEY_MOD1,
274 	KEY_O         | KEY_SHIFT | KEY_MOD1,
275 	KEY_P         | KEY_SHIFT | KEY_MOD1,
276 	KEY_Q         | KEY_SHIFT | KEY_MOD1,
277 	KEY_R         | KEY_SHIFT | KEY_MOD1,
278 	KEY_S         | KEY_SHIFT | KEY_MOD1,
279 	KEY_T         | KEY_SHIFT | KEY_MOD1,
280 	KEY_U         | KEY_SHIFT | KEY_MOD1,
281 	KEY_V         | KEY_SHIFT | KEY_MOD1,
282 	KEY_W         | KEY_SHIFT | KEY_MOD1,
283 	KEY_X         | KEY_SHIFT | KEY_MOD1,
284 	KEY_Y         | KEY_SHIFT | KEY_MOD1,
285 	KEY_Z         | KEY_SHIFT | KEY_MOD1,
286 
287 	KEY_F1        | KEY_SHIFT | KEY_MOD1,
288 	KEY_F2        | KEY_SHIFT | KEY_MOD1,
289 	KEY_F3        | KEY_SHIFT | KEY_MOD1,
290 	KEY_F4        | KEY_SHIFT | KEY_MOD1,
291 	KEY_F5        | KEY_SHIFT | KEY_MOD1,
292 	KEY_F6        | KEY_SHIFT | KEY_MOD1,
293 	KEY_F7        | KEY_SHIFT | KEY_MOD1,
294 	KEY_F8        | KEY_SHIFT | KEY_MOD1,
295 	KEY_F9        | KEY_SHIFT | KEY_MOD1,
296 	KEY_F10       | KEY_SHIFT | KEY_MOD1,
297 	KEY_F11       | KEY_SHIFT | KEY_MOD1,
298 	KEY_F12       | KEY_SHIFT | KEY_MOD1,
299 
300 	KEY_DOWN      | KEY_SHIFT | KEY_MOD1,
301 	KEY_UP        | KEY_SHIFT | KEY_MOD1,
302 	KEY_LEFT      | KEY_SHIFT | KEY_MOD1,
303 	KEY_RIGHT     | KEY_SHIFT | KEY_MOD1,
304 	KEY_HOME      | KEY_SHIFT | KEY_MOD1,
305 	KEY_END       | KEY_SHIFT | KEY_MOD1,
306 	KEY_PAGEUP    | KEY_SHIFT | KEY_MOD1,
307 	KEY_PAGEDOWN  | KEY_SHIFT | KEY_MOD1,
308 	KEY_RETURN    | KEY_SHIFT | KEY_MOD1,
309 	KEY_SPACE     | KEY_SHIFT | KEY_MOD1,
310 	KEY_BACKSPACE | KEY_SHIFT | KEY_MOD1,
311 	KEY_INSERT    | KEY_SHIFT | KEY_MOD1,
312 	KEY_DELETE    | KEY_SHIFT | KEY_MOD1,
313 
314 	KEY_0         | KEY_MOD2 ,
315 	KEY_1         | KEY_MOD2 ,
316 	KEY_2         | KEY_MOD2 ,
317 	KEY_3         | KEY_MOD2 ,
318 	KEY_4         | KEY_MOD2 ,
319 	KEY_5         | KEY_MOD2 ,
320 	KEY_6         | KEY_MOD2 ,
321 	KEY_7         | KEY_MOD2 ,
322 	KEY_8         | KEY_MOD2 ,
323 	KEY_9         | KEY_MOD2 ,
324 	KEY_A         | KEY_MOD2 ,
325 	KEY_B         | KEY_MOD2 ,
326 	KEY_C         | KEY_MOD2 ,
327 	KEY_D         | KEY_MOD2 ,
328 	KEY_E         | KEY_MOD2 ,
329 	KEY_F         | KEY_MOD2 ,
330 	KEY_G         | KEY_MOD2 ,
331 	KEY_H         | KEY_MOD2 ,
332 	KEY_I         | KEY_MOD2 ,
333 	KEY_J         | KEY_MOD2 ,
334 	KEY_K         | KEY_MOD2 ,
335 	KEY_L         | KEY_MOD2 ,
336 	KEY_M         | KEY_MOD2 ,
337 	KEY_N         | KEY_MOD2 ,
338 	KEY_O         | KEY_MOD2 ,
339 	KEY_P         | KEY_MOD2 ,
340 	KEY_Q         | KEY_MOD2 ,
341 	KEY_R         | KEY_MOD2 ,
342 	KEY_S         | KEY_MOD2 ,
343 	KEY_T         | KEY_MOD2 ,
344 	KEY_U         | KEY_MOD2 ,
345 	KEY_V         | KEY_MOD2 ,
346 	KEY_W         | KEY_MOD2 ,
347 	KEY_X         | KEY_MOD2 ,
348 	KEY_Y         | KEY_MOD2 ,
349 	KEY_Z         | KEY_MOD2 ,
350 
351 	KEY_F1        | KEY_MOD2 ,
352 	KEY_F2        | KEY_MOD2 ,
353 	KEY_F3        | KEY_MOD2 ,
354 	KEY_F4        | KEY_MOD2 ,
355 	KEY_F5        | KEY_MOD2 ,
356 	KEY_F6        | KEY_MOD2 ,
357 	KEY_F7        | KEY_MOD2 ,
358 	KEY_F8        | KEY_MOD2 ,
359 	KEY_F9        | KEY_MOD2 ,
360 	KEY_F10       | KEY_MOD2 ,
361 	KEY_F11       | KEY_MOD2 ,
362 	KEY_F12       | KEY_MOD2 ,
363 
364 	KEY_DOWN      | KEY_MOD2 ,
365 	KEY_UP        | KEY_MOD2 ,
366 	KEY_LEFT      | KEY_MOD2 ,
367 	KEY_RIGHT     | KEY_MOD2 ,
368 	KEY_HOME      | KEY_MOD2 ,
369 	KEY_END       | KEY_MOD2 ,
370 	KEY_PAGEUP    | KEY_MOD2 ,
371 	KEY_PAGEDOWN  | KEY_MOD2 ,
372 	KEY_RETURN    | KEY_MOD2 ,
373 	KEY_SPACE     | KEY_MOD2 ,
374 	KEY_BACKSPACE | KEY_MOD2 ,
375 	KEY_INSERT    | KEY_MOD2 ,
376 	KEY_DELETE    | KEY_MOD2 ,
377 
378 	KEY_0         | KEY_SHIFT | KEY_MOD2,
379 	KEY_1         | KEY_SHIFT | KEY_MOD2,
380 	KEY_2         | KEY_SHIFT | KEY_MOD2,
381 	KEY_3         | KEY_SHIFT | KEY_MOD2,
382 	KEY_4         | KEY_SHIFT | KEY_MOD2,
383 	KEY_5         | KEY_SHIFT | KEY_MOD2,
384 	KEY_6         | KEY_SHIFT | KEY_MOD2,
385 	KEY_7         | KEY_SHIFT | KEY_MOD2,
386 	KEY_8         | KEY_SHIFT | KEY_MOD2,
387 	KEY_9         | KEY_SHIFT | KEY_MOD2,
388 	KEY_A         | KEY_SHIFT | KEY_MOD2,
389 	KEY_B         | KEY_SHIFT | KEY_MOD2,
390 	KEY_C         | KEY_SHIFT | KEY_MOD2,
391 	KEY_D         | KEY_SHIFT | KEY_MOD2,
392 	KEY_E         | KEY_SHIFT | KEY_MOD2,
393 	KEY_F         | KEY_SHIFT | KEY_MOD2,
394 	KEY_G         | KEY_SHIFT | KEY_MOD2,
395 	KEY_H         | KEY_SHIFT | KEY_MOD2,
396 	KEY_I         | KEY_SHIFT | KEY_MOD2,
397 	KEY_J         | KEY_SHIFT | KEY_MOD2,
398 	KEY_K         | KEY_SHIFT | KEY_MOD2,
399 	KEY_L         | KEY_SHIFT | KEY_MOD2,
400 	KEY_M         | KEY_SHIFT | KEY_MOD2,
401 	KEY_N         | KEY_SHIFT | KEY_MOD2,
402 	KEY_O         | KEY_SHIFT | KEY_MOD2,
403 	KEY_P         | KEY_SHIFT | KEY_MOD2,
404 	KEY_Q         | KEY_SHIFT | KEY_MOD2,
405 	KEY_R         | KEY_SHIFT | KEY_MOD2,
406 	KEY_S         | KEY_SHIFT | KEY_MOD2,
407 	KEY_T         | KEY_SHIFT | KEY_MOD2,
408 	KEY_U         | KEY_SHIFT | KEY_MOD2,
409 	KEY_V         | KEY_SHIFT | KEY_MOD2,
410 	KEY_W         | KEY_SHIFT | KEY_MOD2,
411 	KEY_X         | KEY_SHIFT | KEY_MOD2,
412 	KEY_Y         | KEY_SHIFT | KEY_MOD2,
413 	KEY_Z         | KEY_SHIFT | KEY_MOD2,
414 
415 	KEY_F1        | KEY_SHIFT | KEY_MOD2,
416 	KEY_F2        | KEY_SHIFT | KEY_MOD2,
417 	KEY_F3        | KEY_SHIFT | KEY_MOD2,
418 	KEY_F4        | KEY_SHIFT | KEY_MOD2,
419 	KEY_F5        | KEY_SHIFT | KEY_MOD2,
420 	KEY_F6        | KEY_SHIFT | KEY_MOD2,
421 	KEY_F7        | KEY_SHIFT | KEY_MOD2,
422 	KEY_F8        | KEY_SHIFT | KEY_MOD2,
423 	KEY_F9        | KEY_SHIFT | KEY_MOD2,
424 	KEY_F10       | KEY_SHIFT | KEY_MOD2,
425 	KEY_F11       | KEY_SHIFT | KEY_MOD2,
426 	KEY_F12       | KEY_SHIFT | KEY_MOD2,
427 
428 	KEY_DOWN      | KEY_SHIFT | KEY_MOD2,
429 	KEY_UP        | KEY_SHIFT | KEY_MOD2,
430 	KEY_LEFT      | KEY_SHIFT | KEY_MOD2,
431 	KEY_RIGHT     | KEY_SHIFT | KEY_MOD2,
432 	KEY_HOME      | KEY_SHIFT | KEY_MOD2,
433 	KEY_END       | KEY_SHIFT | KEY_MOD2,
434 	KEY_PAGEUP    | KEY_SHIFT | KEY_MOD2,
435 	KEY_PAGEDOWN  | KEY_SHIFT | KEY_MOD2,
436 	KEY_RETURN    | KEY_SHIFT | KEY_MOD2,
437 	KEY_SPACE     | KEY_SHIFT | KEY_MOD2,
438 	KEY_BACKSPACE | KEY_SHIFT | KEY_MOD2,
439 	KEY_INSERT    | KEY_SHIFT | KEY_MOD2,
440 	KEY_DELETE    | KEY_SHIFT | KEY_MOD2,
441 
442 	KEY_0         | KEY_MOD1 | KEY_MOD2 ,
443 	KEY_1         | KEY_MOD1 | KEY_MOD2 ,
444 	KEY_2         | KEY_MOD1 | KEY_MOD2 ,
445 	KEY_3         | KEY_MOD1 | KEY_MOD2 ,
446 	KEY_4         | KEY_MOD1 | KEY_MOD2 ,
447 	KEY_5         | KEY_MOD1 | KEY_MOD2 ,
448 	KEY_6         | KEY_MOD1 | KEY_MOD2 ,
449 	KEY_7         | KEY_MOD1 | KEY_MOD2 ,
450 	KEY_8         | KEY_MOD1 | KEY_MOD2 ,
451 	KEY_9         | KEY_MOD1 | KEY_MOD2 ,
452 	KEY_A         | KEY_MOD1 | KEY_MOD2 ,
453 	KEY_B         | KEY_MOD1 | KEY_MOD2 ,
454 	KEY_C         | KEY_MOD1 | KEY_MOD2 ,
455 	KEY_D         | KEY_MOD1 | KEY_MOD2 ,
456 	KEY_E         | KEY_MOD1 | KEY_MOD2 ,
457 	KEY_F         | KEY_MOD1 | KEY_MOD2 ,
458 	KEY_G         | KEY_MOD1 | KEY_MOD2 ,
459 	KEY_H         | KEY_MOD1 | KEY_MOD2 ,
460 	KEY_I         | KEY_MOD1 | KEY_MOD2 ,
461 	KEY_J         | KEY_MOD1 | KEY_MOD2 ,
462 	KEY_K         | KEY_MOD1 | KEY_MOD2 ,
463 	KEY_L         | KEY_MOD1 | KEY_MOD2 ,
464 	KEY_M         | KEY_MOD1 | KEY_MOD2 ,
465 	KEY_N         | KEY_MOD1 | KEY_MOD2 ,
466 	KEY_O         | KEY_MOD1 | KEY_MOD2 ,
467 	KEY_P         | KEY_MOD1 | KEY_MOD2 ,
468 	KEY_Q         | KEY_MOD1 | KEY_MOD2 ,
469 	KEY_R         | KEY_MOD1 | KEY_MOD2 ,
470 	KEY_S         | KEY_MOD1 | KEY_MOD2 ,
471 	KEY_T         | KEY_MOD1 | KEY_MOD2 ,
472 	KEY_U         | KEY_MOD1 | KEY_MOD2 ,
473 	KEY_V         | KEY_MOD1 | KEY_MOD2 ,
474 	KEY_W         | KEY_MOD1 | KEY_MOD2 ,
475 	KEY_X         | KEY_MOD1 | KEY_MOD2 ,
476 	KEY_Y         | KEY_MOD1 | KEY_MOD2 ,
477 	KEY_Z         | KEY_MOD1 | KEY_MOD2 ,
478 
479 	KEY_F1        | KEY_MOD1 | KEY_MOD2 ,
480 	KEY_F2        | KEY_MOD1 | KEY_MOD2 ,
481 	KEY_F3        | KEY_MOD1 | KEY_MOD2 ,
482 	KEY_F4        | KEY_MOD1 | KEY_MOD2 ,
483 	KEY_F5        | KEY_MOD1 | KEY_MOD2 ,
484 	KEY_F6        | KEY_MOD1 | KEY_MOD2 ,
485 	KEY_F7        | KEY_MOD1 | KEY_MOD2 ,
486 	KEY_F8        | KEY_MOD1 | KEY_MOD2 ,
487 	KEY_F9        | KEY_MOD1 | KEY_MOD2 ,
488 	KEY_F10       | KEY_MOD1 | KEY_MOD2 ,
489 	KEY_F11       | KEY_MOD1 | KEY_MOD2 ,
490 	KEY_F12       | KEY_MOD1 | KEY_MOD2 ,
491 
492 	KEY_DOWN      | KEY_MOD1 | KEY_MOD2 ,
493 	KEY_UP        | KEY_MOD1 | KEY_MOD2 ,
494 	KEY_LEFT      | KEY_MOD1 | KEY_MOD2 ,
495 	KEY_RIGHT     | KEY_MOD1 | KEY_MOD2 ,
496 	KEY_HOME      | KEY_MOD1 | KEY_MOD2 ,
497 	KEY_END       | KEY_MOD1 | KEY_MOD2 ,
498 	KEY_PAGEUP    | KEY_MOD1 | KEY_MOD2 ,
499 	KEY_PAGEDOWN  | KEY_MOD1 | KEY_MOD2 ,
500 	KEY_RETURN    | KEY_MOD1 | KEY_MOD2 ,
501 	KEY_SPACE     | KEY_MOD1 | KEY_MOD2 ,
502 	KEY_BACKSPACE | KEY_MOD1 | KEY_MOD2 ,
503 	KEY_INSERT    | KEY_MOD1 | KEY_MOD2 ,
504 	KEY_DELETE    | KEY_MOD1 | KEY_MOD2 ,
505 
506 	KEY_0         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
507 	KEY_1         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
508 	KEY_2         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
509 	KEY_3         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
510 	KEY_4         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
511 	KEY_5         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
512 	KEY_6         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
513 	KEY_7         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
514 	KEY_8         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
515 	KEY_9         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
516 	KEY_A         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
517 	KEY_B         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
518 	KEY_C         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
519 	KEY_D         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
520 	KEY_E         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
521 	KEY_F         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
522 	KEY_G         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
523 	KEY_H         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
524 	KEY_I         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
525 	KEY_J         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
526 	KEY_K         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
527 	KEY_L         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
528 	KEY_M         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
529 	KEY_N         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
530 	KEY_O         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
531 	KEY_P         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
532 	KEY_Q         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
533 	KEY_R         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
534 	KEY_S         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
535 	KEY_T         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
536 	KEY_U         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
537 	KEY_V         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
538 	KEY_W         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
539 	KEY_X         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
540 	KEY_Y         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
541 	KEY_Z         | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
542 
543 	KEY_F1        | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
544 	KEY_F2        | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
545 	KEY_F3        | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
546 	KEY_F4        | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
547 	KEY_F5        | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
548 	KEY_F6        | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
549 	KEY_F7        | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
550 	KEY_F8        | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
551 	KEY_F9        | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
552 	KEY_F10       | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
553 	KEY_F11       | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
554 	KEY_F12       | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
555 
556 	KEY_DOWN      | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
557 	KEY_UP        | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
558 	KEY_LEFT      | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
559 	KEY_RIGHT     | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
560 	KEY_HOME      | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
561 	KEY_END       | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
562 	KEY_PAGEUP    | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
563 	KEY_PAGEDOWN  | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
564 	KEY_RETURN    | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
565 	KEY_SPACE     | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
566 	KEY_BACKSPACE | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
567 	KEY_INSERT    | KEY_SHIFT | KEY_MOD1 | KEY_MOD2,
568 	KEY_DELETE    | KEY_SHIFT | KEY_MOD1 | KEY_MOD2
569 };
570 
571 static sal_uInt16 KEYCODE_ARRAY_SIZE = (sizeof(KEYCODE_ARRAY) / sizeof(KEYCODE_ARRAY[0]));
572 
573 //-----------------------------------------------
574 // seems to be needed to layout the list box, which shows all
575 // assignable shortcuts
576 static long AccCfgTabs[] =
577 {
578     2,  // Number of Tabs
579     0,
580     120 // Function
581 };
582 
583 //-----------------------------------------------
584 class SfxAccCfgLBoxString_Impl : public SvLBoxString
585 {
586     public:
587     SfxAccCfgLBoxString_Impl(      SvLBoxEntry* pEntry,
588                                    sal_uInt16       nFlags,
589                              const String&      sText );
590 
591 	virtual ~SfxAccCfgLBoxString_Impl();
592 
593 	virtual void Paint(const Point&       aPos   ,
594                              SvLBox&      rDevice,
595                              sal_uInt16       nFlags ,
596                              SvLBoxEntry* pEntry );
597 };
598 
599 //-----------------------------------------------
SfxAccCfgLBoxString_Impl(SvLBoxEntry * pEntry,sal_uInt16 nFlags,const String & sText)600 SfxAccCfgLBoxString_Impl::SfxAccCfgLBoxString_Impl(      SvLBoxEntry* pEntry,
601                                                          sal_uInt16       nFlags,
602                                                    const String&      sText )
603         : SvLBoxString(pEntry, nFlags, sText)
604 {
605 }
606 
607 //-----------------------------------------------
~SfxAccCfgLBoxString_Impl()608 SfxAccCfgLBoxString_Impl::~SfxAccCfgLBoxString_Impl()
609 {
610 }
611 
612 //-----------------------------------------------
Paint(const Point & aPos,SvLBox & rDevice,sal_uInt16,SvLBoxEntry * pEntry)613 void SfxAccCfgLBoxString_Impl::Paint(const Point&       aPos   ,
614                                            SvLBox&      rDevice,
615                                            sal_uInt16       /*nFlags*/,
616                                            SvLBoxEntry* pEntry )
617 {
618     /*/ ??? really needed !!!
619 	Font aOldFont(rDevice.GetFont());
620 	Font aNewFont(aOldFont         );
621 	rDevice.SetFont( aFont );
622     */
623 
624     if (!pEntry)
625         return;
626 
627     TAccInfo* pUserData = (TAccInfo*)pEntry->GetUserData();
628     if (!pUserData)
629         return;
630 
631 	if (pUserData->m_bIsConfigurable)
632 		rDevice.DrawText(aPos, GetText());
633 	else
634 		rDevice.DrawCtrlText(aPos, GetText(), 0, STRING_LEN, TEXT_DRAW_DISABLE);
635 
636 	//rDev.SetFont( aOldFont );
637 }
638 
639 //-----------------------------------------------
InitEntry(SvLBoxEntry * pEntry,const XubString & sText,const Image & aImage1,const Image & aImage2,SvLBoxButtonKind eButtonKind)640 void SfxAccCfgTabListBox_Impl::InitEntry(      SvLBoxEntry* pEntry ,
641                                          const XubString&   sText  ,
642                                          const Image&       aImage1,
643                                          const Image&       aImage2,
644                                                SvLBoxButtonKind eButtonKind)
645 {
646 	SvTabListBox::InitEntry(pEntry, sText, aImage1, aImage2, eButtonKind);
647 }
648 
649 //-----------------------------------------------
650 /** select the entry, which match the current key input ... excepting
651     keys, which are used for the dialog itself.
652   */
KeyInput(const KeyEvent & aKey)653 void SfxAccCfgTabListBox_Impl::KeyInput(const KeyEvent& aKey)
654 {
655     KeyCode aCode1 = aKey.GetKeyCode();
656     sal_uInt16  nCode1 = aCode1.GetCode();
657     sal_uInt16  nMod1  = aCode1.GetModifier();
658 
659     // is it related to our list box ?
660     if (
661         (nCode1 != KEY_DOWN    ) &&
662         (nCode1 != KEY_UP      ) &&
663         (nCode1 != KEY_LEFT    ) &&
664         (nCode1 != KEY_RIGHT   ) &&
665         (nCode1 != KEY_PAGEUP  ) &&
666         (nCode1 != KEY_PAGEDOWN)
667        )
668 	{
669 		SvLBoxEntry* pEntry = First();
670 		while (pEntry)
671 		{
672 			TAccInfo* pUserData = (TAccInfo*)pEntry->GetUserData();
673 			if (pUserData)
674 			{
675 				sal_uInt16 nCode2 = pUserData->m_aKey.GetCode();
676 				sal_uInt16 nMod2  = pUserData->m_aKey.GetModifier();
677 				if (
678 					(nCode1 == nCode2) &&
679 					(nMod1  == nMod2 )
680 				   )
681 				{
682 					Select     (pEntry);
683 					MakeVisible(pEntry);
684 					return;
685 				}
686 			}
687 			pEntry = Next(pEntry);
688 		}
689     }
690 
691     // no - handle it as normal dialog input
692 	SvTabListBox::KeyInput(aKey);
693 }
694 
695 //-----------------------------------------------
SfxAcceleratorConfigPage(Window * pParent,const SfxItemSet & aSet)696 SfxAcceleratorConfigPage::SfxAcceleratorConfigPage( Window* pParent, const SfxItemSet& aSet )
697     : SfxTabPage              (pParent, CUI_RES(RID_SVXPAGE_KEYBOARD), aSet)
698     , m_pMacroInfoItem        ()
699     , m_pStringItem        ()
700     , m_pFontItem        ()
701     , m_pFileDlg              (NULL)
702     , aEntriesBox             (this   , this, CUI_RES(BOX_ACC_ENTRIES   ))
703     , aKeyboardGroup          (this   , CUI_RES(GRP_ACC_KEYBOARD        ))
704     , aOfficeButton           (this   , CUI_RES(RB_OFFICE               ))
705     , aModuleButton           (this   , CUI_RES(RB_MODULE               ))
706     , aChangeButton           (this   , CUI_RES(BTN_ACC_CHANGE          ))
707     , aRemoveButton           (this   , CUI_RES(BTN_ACC_REMOVE          ))
708     , aGroupText              (this   , CUI_RES(TXT_ACC_GROUP           ))
709 	, pGroupLBox(new SfxConfigGroupListBox_Impl( this, CUI_RES(BOX_ACC_GROUP), SFX_SLOT_ACCELCONFIG ))
710     , aFunctionText           (this   , CUI_RES(TXT_ACC_FUNCTION        ))
711     , pFunctionBox(new SfxConfigFunctionListBox_Impl( this, CUI_RES( BOX_ACC_FUNCTION )))
712     , aKeyText                (this   , CUI_RES(TXT_ACC_KEY             ))
713     , aKeyBox                 (this   , CUI_RES(BOX_ACC_KEY             ))
714     , aFunctionsGroup         (this   , CUI_RES(GRP_ACC_FUNCTIONS       ))
715     , aLoadButton             (this   , CUI_RES(BTN_LOAD                ))
716     , aSaveButton 		      (this   , CUI_RES(BTN_SAVE                ))
717     , aResetButton		      (this   , CUI_RES(BTN_RESET               ))
718 	, aLoadAccelConfigStr			  ( CUI_RES( STR_LOADACCELCONFIG ) )
719 	, aSaveAccelConfigStr			  ( CUI_RES( STR_SAVEACCELCONFIG ) )
720 	, aFilterCfgStr					  ( CUI_RES( STR_FILTERNAME_CFG ) )
721     , m_bStylesInfoInitialized(sal_False)
722     , m_xGlobal               ()
723     , m_xModule               ()
724     , m_xAct                  ()
725 {
726     FreeResource();
727 
728 	aFilterAllStr = String( SfxResId( STR_SFX_FILTERNAME_ALL ) );
729 
730 // install handler functions
731     aChangeButton.SetClickHdl( LINK( this, SfxAcceleratorConfigPage, ChangeHdl ));
732     aRemoveButton.SetClickHdl( LINK( this, SfxAcceleratorConfigPage, RemoveHdl ));
733     aEntriesBox.SetSelectHdl ( LINK( this, SfxAcceleratorConfigPage, SelectHdl ));
734     pGroupLBox->SetSelectHdl  ( LINK( this, SfxAcceleratorConfigPage, SelectHdl ));
735     pFunctionBox->SetSelectHdl( LINK( this, SfxAcceleratorConfigPage, SelectHdl ));
736     aKeyBox.SetSelectHdl     ( LINK( this, SfxAcceleratorConfigPage, SelectHdl ));
737     aLoadButton.SetClickHdl  ( LINK( this, SfxAcceleratorConfigPage, Load      ));
738     aSaveButton.SetClickHdl  ( LINK( this, SfxAcceleratorConfigPage, Save      ));
739     aResetButton.SetClickHdl ( LINK( this, SfxAcceleratorConfigPage, Default   ));
740     aOfficeButton.SetClickHdl( LINK( this, SfxAcceleratorConfigPage, RadioHdl  ));
741     aModuleButton.SetClickHdl( LINK( this, SfxAcceleratorConfigPage, RadioHdl  ));
742 
743     // initialize Entriesbox
744     aEntriesBox.SetStyle(aEntriesBox.GetStyle()|WB_HSCROLL|WB_CLIPCHILDREN);
745     aEntriesBox.SetSelectionMode(SINGLE_SELECTION);
746     aEntriesBox.SetTabs(&AccCfgTabs[0], MAP_APPFONT);
747     aEntriesBox.Resize(); // OS: Hack for right selection
748     aEntriesBox.SetSpaceBetweenEntries(0);
749     aEntriesBox.SetDragDropMode(0);
750 
751     // detect max keyname width
752     long nMaxWidth  = 0;
753     for ( sal_uInt16 i = 0; i < KEYCODE_ARRAY_SIZE; ++i )
754     {
755         long nTmp = GetTextWidth( KeyCode( KEYCODE_ARRAY[i] ).GetName() );
756         if ( nTmp > nMaxWidth )
757             nMaxWidth = nTmp;
758     }
759     // recalc second tab
760     long nNewTab = PixelToLogic( Size( nMaxWidth, 0 ), MAP_APPFONT ).Width();
761     nNewTab = nNewTab + 5; // additional space
762     aEntriesBox.SetTab( 1, nNewTab );
763 
764     // initialize GroupBox
765     pGroupLBox->SetFunctionListBox(pFunctionBox);
766 
767     // initialize KeyBox
768 	aKeyBox.SetStyle(aKeyBox.GetStyle()|WB_CLIPCHILDREN|WB_HSCROLL|WB_SORT);
769 }
770 
771 //-----------------------------------------------
~SfxAcceleratorConfigPage()772 SfxAcceleratorConfigPage::~SfxAcceleratorConfigPage()
773 {
774     // free memory - remove all dynamic user data
775 	SvLBoxEntry* pEntry = aEntriesBox.First();
776     while (pEntry)
777     {
778         TAccInfo* pUserData = (TAccInfo*)pEntry->GetUserData();
779         if (pUserData)
780             delete pUserData;
781         pEntry = aEntriesBox.Next(pEntry);
782     }
783 
784 	pEntry = aKeyBox.First();
785     while (pEntry)
786     {
787         TAccInfo* pUserData = (TAccInfo*)pEntry->GetUserData();
788         if (pUserData)
789             delete pUserData;
790         pEntry = aKeyBox.Next(pEntry);
791     }
792 
793     aEntriesBox.Clear();
794     aKeyBox.Clear();
795 
796     delete m_pFileDlg;
797 	delete pGroupLBox;
798 	delete pFunctionBox;
799 }
800 
801 //-----------------------------------------------
InitAccCfg()802 void SfxAcceleratorConfigPage::InitAccCfg()
803 {
804     // already initialized ?
805     if (m_xSMGR.is())
806         return; // yes -> do nothing
807 
808     try
809     {
810         // no - initialize this instance
811         m_xSMGR = ::utl::getProcessServiceFactory();
812 
813         m_xUICmdDescription = css::uno::Reference< css::container::XNameAccess >(m_xSMGR->createInstance(SERVICE_UICMDDESCRIPTION), css::uno::UNO_QUERY_THROW);
814 
815         // get the current active frame, which should be our "parent"
816         // for this session
817         m_xFrame = GetFrame();
818         if ( !m_xFrame.is() )
819         {
820             css::uno::Reference< css::frame::XFramesSupplier > xDesktop(m_xSMGR->createInstance(SERVICE_DESKTOP), css::uno::UNO_QUERY_THROW);
821             m_xFrame = xDesktop->getActiveFrame();
822         }
823 
824         // identify module
825         css::uno::Reference< css::frame::XModuleManager > xModuleManager    (m_xSMGR->createInstance(SERVICE_MODULEMANAGER), css::uno::UNO_QUERY_THROW);
826         css::uno::Reference< css::container::XNameAccess > xModuleManagerCont(xModuleManager                                , css::uno::UNO_QUERY_THROW);
827         m_sModuleLongName = xModuleManager->identify(m_xFrame);
828         ::comphelper::SequenceAsHashMap lModuleProps(xModuleManagerCont->getByName(m_sModuleLongName));
829         m_sModuleShortName = lModuleProps.getUnpackedValueOrDefault(MODULEPROP_SHORTNAME, ::rtl::OUString());
830         m_sModuleUIName    = lModuleProps.getUnpackedValueOrDefault(MODULEPROP_UINAME   , ::rtl::OUString());
831 
832         // get global accelerator configuration
833         m_xGlobal = css::uno::Reference< css::ui::XAcceleratorConfiguration >(m_xSMGR->createInstance(SERVICE_GLOBALACCCFG), css::uno::UNO_QUERY_THROW);
834 
835         // get module accelerator configuration
836         css::uno::Reference< css::ui::XModuleUIConfigurationManagerSupplier > xModuleCfgSupplier(m_xSMGR->createInstance(SERVICE_MODULEUICONFIGSUPPLIER), css::uno::UNO_QUERY_THROW);
837         css::uno::Reference< css::ui::XUIConfigurationManager > xUICfgManager = xModuleCfgSupplier->getUIConfigurationManager(m_sModuleLongName);
838         m_xModule = css::uno::Reference< css::ui::XAcceleratorConfiguration >(xUICfgManager->getShortCutManager(), css::uno::UNO_QUERY_THROW);
839     }
840     catch(const css::uno::RuntimeException& exRun)
841         { throw exRun; }
842     catch(const css::uno::Exception&)
843         { m_xSMGR.clear(); }
844 }
845 
846 //-----------------------------------------------
847 /** Initialize text columns with own class to enable custom painting
848     This is needed as we have to paint disabled entries by ourself. No support for that in the
849     original SvTabListBox!
850   */
CreateCustomItems(SvLBoxEntry * pEntry,const String & sCol1,const String & sCol2)851 void SfxAcceleratorConfigPage::CreateCustomItems(      SvLBoxEntry* pEntry,
852                                                  const String&      sCol1 ,
853                                                  const String&      sCol2 )
854 {
855     SfxAccCfgLBoxString_Impl* pStringItem = new SfxAccCfgLBoxString_Impl(pEntry, 0, sCol1);
856     pEntry->ReplaceItem(pStringItem, 1);
857 
858     pStringItem = new SfxAccCfgLBoxString_Impl(pEntry, 0, sCol2);
859     pEntry->ReplaceItem(pStringItem, 2);
860 }
861 
862 //-----------------------------------------------
Init(const css::uno::Reference<css::ui::XAcceleratorConfiguration> & xAccMgr)863 void SfxAcceleratorConfigPage::Init(const css::uno::Reference< css::ui::XAcceleratorConfiguration >& xAccMgr)
864 {
865     if (!xAccMgr.is())
866         return;
867 
868     if (!m_bStylesInfoInitialized)
869     {
870         css::uno::Reference< css::frame::XController > xController;
871         css::uno::Reference< css::frame::XModel > xModel;
872         if (m_xFrame.is())
873             xController = m_xFrame->getController();
874         if (xController.is())
875             xModel = xController->getModel();
876 
877         m_aStylesInfo.setModel(xModel);
878         pFunctionBox->SetStylesInfo(&m_aStylesInfo);
879         pGroupLBox->SetStylesInfo(&m_aStylesInfo);
880         m_bStylesInfoInitialized = sal_True;
881     }
882 
883     // Insert all editable accelerators into list box. It is possible
884     // that some accelerators are not mapped on the current system/keyboard
885     // but we don't want to lose these mappings.
886     sal_uInt16 c1       = KEYCODE_ARRAY_SIZE;
887     sal_uInt16 i1       = 0;
888     sal_uInt16 nListPos = 0;
889     for (i1=0; i1<c1; ++i1)
890     {
891         KeyCode aKey = KEYCODE_ARRAY[i1];
892         String  sKey = aKey.GetName();
893         if (!sKey.Len())
894             continue;
895         TAccInfo*    pEntry   = new TAccInfo(i1, nListPos, aKey);
896         SvLBoxEntry* pLBEntry = aEntriesBox.InsertEntryToColumn(sKey, 0L, LIST_APPEND, 0xFFFF);
897         pLBEntry->SetUserData(pEntry);
898     }
899 
900     // Assign all commands to its shortcuts - reading the accelerator config.
901     css::uno::Sequence< css::awt::KeyEvent > lKeys = xAccMgr->getAllKeyEvents();
902     sal_Int32                                c2    = lKeys.getLength();
903     sal_Int32                                i2    = 0;
904     sal_uInt16                                   nCol  = aEntriesBox.TabCount()-1;
905 
906     for (i2=0; i2<c2; ++i2)
907     {
908         const css::awt::KeyEvent& aAWTKey  = lKeys[i2];
909               ::rtl::OUString     sCommand = xAccMgr->getCommandByKeyEvent(aAWTKey);
910               String              sLabel   = GetLabel4Command(sCommand);
911               KeyCode             aKeyCode = ::svt::AcceleratorExecute::st_AWTKey2VCLKey(aAWTKey);
912               sal_uInt16              nPos     = MapKeyCodeToPos(aKeyCode);
913 
914         if (nPos == LISTBOX_ENTRY_NOTFOUND)
915             continue;
916 
917         aEntriesBox.SetEntryText(sLabel, nPos, nCol);
918 
919         SvLBoxEntry* pLBEntry = aEntriesBox.GetEntry(0, nPos);
920         TAccInfo*    pEntry   = (TAccInfo*)pLBEntry->GetUserData();
921 
922         pEntry->m_bIsConfigurable = sal_True;
923         pEntry->m_sCommand        = sCommand;
924         CreateCustomItems(pLBEntry, aEntriesBox.GetEntryText(pLBEntry, 0), sLabel);
925     }
926 
927     // Map the VCL hardcoded key codes and mark them as not changeable
928     sal_uLong c3 = Application::GetReservedKeyCodeCount();
929     sal_uLong i3 = 0;
930     for (i3=0; i3<c3; ++i3)
931     {
932         const KeyCode* pKeyCode = Application::GetReservedKeyCode(i3);
933               sal_uInt16   nPos     = MapKeyCodeToPos(*pKeyCode);
934 
935         if (nPos == LISTBOX_ENTRY_NOTFOUND)
936             continue;
937 
938         // Hardcoded function mapped so no ID possible and mark entry as not changeable
939         SvLBoxEntry* pLBEntry = aEntriesBox.GetEntry(0, nPos);
940         TAccInfo*    pEntry   = (TAccInfo*)pLBEntry->GetUserData();
941 
942         pEntry->m_bIsConfigurable = sal_False;
943         CreateCustomItems(pLBEntry, aEntriesBox.GetEntryText(pLBEntry, 0), String());
944     }
945 }
946 
947 //-----------------------------------------------
Apply(const css::uno::Reference<css::ui::XAcceleratorConfiguration> & xAccMgr)948 void SfxAcceleratorConfigPage::Apply(const css::uno::Reference< css::ui::XAcceleratorConfiguration >& xAccMgr)
949 {
950     if (!xAccMgr.is())
951         return;
952 
953     // Go through the list from the bottom to the top ...
954     // because logical accelerator must be preferred instead of
955     // physical ones!
956 	SvLBoxEntry* pEntry = aEntriesBox.First();
957     while (pEntry)
958     {
959         TAccInfo*          pUserData = (TAccInfo*)pEntry->GetUserData();
960         ::rtl::OUString    sCommand  ;
961         css::awt::KeyEvent aAWTKey   ;
962 
963         if (pUserData)
964         {
965             sCommand = pUserData->m_sCommand;
966             aAWTKey  = ::svt::AcceleratorExecute::st_VCLKey2AWTKey(pUserData->m_aKey);
967         }
968 
969         try
970         {
971             if (sCommand.getLength())
972                 xAccMgr->setKeyEvent(aAWTKey, sCommand);
973             else
974                 xAccMgr->removeKeyEvent(aAWTKey);
975         }
976         catch(const css::uno::RuntimeException& exRun)
977             { throw exRun; }
978         catch(const css::uno::Exception&)
979             {}
980 
981         pEntry = aEntriesBox.Next(pEntry);
982     }
983 }
984 
985 //-----------------------------------------------
ResetConfig()986 void SfxAcceleratorConfigPage::ResetConfig()
987 {
988     aEntriesBox.Clear();
989 }
990 
991 //-----------------------------------------------
IMPL_LINK(SfxAcceleratorConfigPage,Load,Button *,EMPTYARG)992 IMPL_LINK( SfxAcceleratorConfigPage, Load, Button*, EMPTYARG )
993 {
994     // ask for filename, where we should load the new config data from
995     StartFileDialog( WB_OPEN | WB_STDMODAL | WB_3DLOOK, aLoadAccelConfigStr );
996     return 0;
997 }
998 
999 //-----------------------------------------------
IMPL_LINK(SfxAcceleratorConfigPage,Save,Button *,EMPTYARG)1000 IMPL_LINK( SfxAcceleratorConfigPage, Save, Button*, EMPTYARG )
1001 {
1002     StartFileDialog( WB_SAVEAS | WB_STDMODAL | WB_3DLOOK, aSaveAccelConfigStr );
1003     return 0;
1004 }
1005 
1006 //-----------------------------------------------
IMPL_LINK(SfxAcceleratorConfigPage,Default,PushButton *,EMPTYARG)1007 IMPL_LINK(SfxAcceleratorConfigPage, Default, PushButton*, EMPTYARG)
1008 {
1009     css::uno::Reference< css::form::XReset > xReset(m_xAct, css::uno::UNO_QUERY);
1010     if (xReset.is())
1011         xReset->reset();
1012 
1013 	aEntriesBox.SetUpdateMode(sal_False);
1014 	ResetConfig();
1015 	Init(m_xAct);
1016 	aEntriesBox.SetUpdateMode(sal_True);
1017 	aEntriesBox.Invalidate();
1018 	aEntriesBox.Select(aEntriesBox.GetEntry(0, 0));
1019 
1020 	return 0;
1021 }
1022 
1023 //-----------------------------------------------
IMPL_LINK(SfxAcceleratorConfigPage,ChangeHdl,Button *,EMPTYARG)1024 IMPL_LINK( SfxAcceleratorConfigPage, ChangeHdl, Button*, EMPTYARG )
1025 {
1026 	sal_uInt16    nPos        = (sal_uInt16) aEntriesBox.GetModel()->GetRelPos( aEntriesBox.FirstSelected() );
1027 	TAccInfo* pEntry      = (TAccInfo*)aEntriesBox.GetEntry(0, nPos)->GetUserData();
1028     String    sNewCommand = pFunctionBox->GetCurCommand();
1029     String    sLabel      = pFunctionBox->GetCurLabel();
1030     if (!sLabel.Len())
1031         sLabel = GetLabel4Command(sNewCommand);
1032 
1033 	pEntry->m_sCommand = sNewCommand;
1034 	sal_uInt16 nCol = aEntriesBox.TabCount() - 1;
1035 	aEntriesBox.SetEntryText(sLabel, nPos, nCol);
1036 
1037 	((Link &) pFunctionBox->GetSelectHdl()).Call( pFunctionBox );
1038 	return 0;
1039 }
1040 
1041 //-----------------------------------------------
IMPL_LINK(SfxAcceleratorConfigPage,RemoveHdl,Button *,EMPTYARG)1042 IMPL_LINK( SfxAcceleratorConfigPage, RemoveHdl, Button *, EMPTYARG )
1043 {
1044     // get selected entry
1045 	sal_uInt16    nPos   = (sal_uInt16) aEntriesBox.GetModel()->GetRelPos( aEntriesBox.FirstSelected() );
1046     TAccInfo* pEntry = (TAccInfo*)aEntriesBox.GetEntry(0, nPos)->GetUserData();
1047 
1048 	// remove function name from selected entry
1049 	sal_uInt16 nCol = aEntriesBox.TabCount() - 1;
1050 	aEntriesBox.SetEntryText( String(), nPos, nCol );
1051     pEntry->m_sCommand = ::rtl::OUString();
1052 
1053 	((Link &) pFunctionBox->GetSelectHdl()).Call( pFunctionBox );
1054 	return 0;
1055 }
1056 
1057 //-----------------------------------------------
IMPL_LINK(SfxAcceleratorConfigPage,SelectHdl,Control *,pListBox)1058 IMPL_LINK( SfxAcceleratorConfigPage, SelectHdl, Control*, pListBox )
1059 {
1060 	// disable help
1061 	Help::ShowBalloon( this, Point(), String() );
1062 	if ( pListBox == &aEntriesBox )
1063 	{
1064 		sal_uInt16          nPos                = (sal_uInt16) aEntriesBox.GetModel()->GetRelPos( aEntriesBox.FirstSelected() );
1065         TAccInfo*       pEntry              = (TAccInfo*)aEntriesBox.GetEntry(0, nPos)->GetUserData();
1066         ::rtl::OUString sPossibleNewCommand = pFunctionBox->GetCurCommand();
1067 
1068         aRemoveButton.Enable( sal_False );
1069         aChangeButton.Enable( sal_False );
1070 
1071         if (pEntry->m_bIsConfigurable)
1072         {
1073             if (pEntry->isConfigured())
1074                 aRemoveButton.Enable( sal_True );
1075 			aChangeButton.Enable( pEntry->m_sCommand != sPossibleNewCommand );
1076         }
1077 	}
1078     else if ( pListBox == pGroupLBox )
1079 	{
1080         pGroupLBox->GroupSelected();
1081 		if ( !pFunctionBox->FirstSelected() )
1082 			aChangeButton.Enable( sal_False );
1083 	}
1084 	else if ( pListBox == pFunctionBox )
1085 	{
1086         aRemoveButton.Enable( sal_False );
1087         aChangeButton.Enable( sal_False );
1088 
1089         // #i36994 First selected can return zero!
1090         SvLBoxEntry*    pLBEntry = aEntriesBox.FirstSelected();
1091         if ( pLBEntry != 0 )
1092         {
1093             sal_uInt16          nPos                = (sal_uInt16) aEntriesBox.GetModel()->GetRelPos( pLBEntry );
1094             TAccInfo*       pEntry              = (TAccInfo*)aEntriesBox.GetEntry(0, nPos)->GetUserData();
1095             ::rtl::OUString sPossibleNewCommand = pFunctionBox->GetCurCommand();
1096 
1097             if (pEntry->m_bIsConfigurable)
1098             {
1099                 if (pEntry->isConfigured())
1100                     aRemoveButton.Enable( sal_True );
1101 			    aChangeButton.Enable( pEntry->m_sCommand != sPossibleNewCommand );
1102             }
1103 
1104             // update key box
1105 		    aKeyBox.Clear();
1106             SvLBoxEntry* pIt = aEntriesBox.First();
1107             while ( pIt )
1108             {
1109                 TAccInfo* pUserData = (TAccInfo*)pIt->GetUserData();
1110                 if ( pUserData && pUserData->m_sCommand == sPossibleNewCommand )
1111                 {
1112                     TAccInfo*    pU1 = new TAccInfo(-1, -1, pUserData->m_aKey);
1113 				    SvLBoxEntry* pE1 = aKeyBox.InsertEntry( pUserData->m_aKey.GetName(), 0L, sal_True, LIST_APPEND );
1114                     pE1->SetUserData(pU1);
1115                     pE1->EnableChildsOnDemand( sal_False );
1116                 }
1117                 pIt = aEntriesBox.Next(pIt);
1118             }
1119         }
1120 	}
1121 	else
1122 	{
1123 		// goto selected "key" entry of the key box
1124 		SvLBoxEntry* pE2 = 0;
1125         TAccInfo*    pU2 = 0;
1126         sal_uInt16       nP2 = LISTBOX_ENTRY_NOTFOUND;
1127         SvLBoxEntry* pE3 = 0;
1128 
1129         pE2 = aKeyBox.FirstSelected();
1130         if (pE2)
1131             pU2 = (TAccInfo*)pE2->GetUserData();
1132         if (pU2)
1133             nP2 = MapKeyCodeToPos(pU2->m_aKey);
1134         if (nP2 != LISTBOX_ENTRY_NOTFOUND)
1135             pE3 = aEntriesBox.GetEntry( 0, nP2 );
1136         if (pE3)
1137         {
1138             aEntriesBox.Select( pE3 );
1139             aEntriesBox.MakeVisible( pE3 );
1140         }
1141 	}
1142 
1143 	return 0;
1144 }
1145 
1146 //-----------------------------------------------
IMPL_LINK(SfxAcceleratorConfigPage,RadioHdl,RadioButton *,EMPTYARG)1147 IMPL_LINK( SfxAcceleratorConfigPage, RadioHdl, RadioButton *, EMPTYARG )
1148 {
1149     css::uno::Reference< css::ui::XAcceleratorConfiguration > xOld = m_xAct;
1150 
1151 	if (aOfficeButton.IsChecked())
1152 		m_xAct = m_xGlobal;
1153     else if (aModuleButton.IsChecked())
1154 		m_xAct = m_xModule;
1155 
1156     // nothing changed? => do nothing!
1157     if ( m_xAct.is() && ( xOld == m_xAct ) )
1158         return 0;
1159 
1160 	aEntriesBox.SetUpdateMode( sal_False );
1161 	ResetConfig();
1162     Init(m_xAct);
1163 	aEntriesBox.SetUpdateMode( sal_True );
1164 	aEntriesBox.Invalidate();
1165 
1166  	pGroupLBox->Init(m_xSMGR, m_xFrame, m_sModuleLongName);
1167 
1168     // pb: #133213# do not select NULL entries
1169     SvLBoxEntry* pEntry = aEntriesBox.GetEntry( 0, 0 );
1170     if ( pEntry )
1171         aEntriesBox.Select( pEntry );
1172     pEntry = pGroupLBox->GetEntry( 0, 0 );
1173     if ( pEntry )
1174         pGroupLBox->Select( pEntry );
1175 
1176 	((Link &) pFunctionBox->GetSelectHdl()).Call( pFunctionBox );
1177 	return 1L;
1178 }
1179 
1180 //-----------------------------------------------
IMPL_LINK(SfxAcceleratorConfigPage,LoadHdl,sfx2::FileDialogHelper *,EMPTYARG)1181 IMPL_LINK( SfxAcceleratorConfigPage, LoadHdl, sfx2::FileDialogHelper*, EMPTYARG )
1182 {
1183     DBG_ASSERT( m_pFileDlg, "SfxInternetPage::DialogClosedHdl(): no file dialog" );
1184 
1185     ::rtl::OUString sCfgName;
1186     if ( ERRCODE_NONE == m_pFileDlg->GetError() )
1187         sCfgName = m_pFileDlg->GetPath();
1188 
1189     if ( !sCfgName.getLength() )
1190         return 0;
1191 
1192     GetTabDialog()->EnterWait();
1193 
1194     css::uno::Reference< css::frame::XModel >                xDoc        ;
1195     css::uno::Reference< css::ui::XUIConfigurationManager > xCfgMgr     ;
1196     css::uno::Reference< css::embed::XStorage >              xRootStorage; // we must hold the root storage alive, if xCfgMgr is used!
1197 
1198     try
1199     {
1200         // first check if URL points to a document already loaded
1201         xDoc = SearchForAlreadyLoadedDoc(sCfgName);
1202         if (xDoc.is())
1203         {
1204             // Get ui config manager. There should always be one at the model.
1205             css::uno::Reference< css::ui::XUIConfigurationManagerSupplier > xCfgSupplier(xDoc, css::uno::UNO_QUERY_THROW);
1206             xCfgMgr = xCfgSupplier->getUIConfigurationManager();
1207         }
1208         else
1209         {
1210             // URL doesn't point to a loaded document, try to access it as a single storage
1211             // don't forget to release the storage afterwards!
1212             css::uno::Reference< css::lang::XSingleServiceFactory > xStorageFactory(m_xSMGR->createInstance(SERVICE_STORAGEFACTORY), css::uno::UNO_QUERY_THROW);
1213             css::uno::Sequence< css::uno::Any >                     lArgs(2);
1214             lArgs[0] <<= sCfgName;
1215             lArgs[1] <<= css::embed::ElementModes::READ;
1216 
1217             xRootStorage = css::uno::Reference< css::embed::XStorage >(xStorageFactory->createInstanceWithArguments(lArgs), css::uno::UNO_QUERY_THROW);
1218             css::uno::Reference< css::embed::XStorage > xUIConfig = xRootStorage->openStorageElement(FOLDERNAME_UICONFIG, css::embed::ElementModes::READ);
1219             if (xUIConfig.is())
1220             {
1221                 xCfgMgr = css::uno::Reference< css::ui::XUIConfigurationManager >(m_xSMGR->createInstance(SERVICE_UICONFIGMGR), css::uno::UNO_QUERY_THROW);
1222                 css::uno::Reference< css::ui::XUIConfigurationStorage > xCfgMgrStore(xCfgMgr, css::uno::UNO_QUERY_THROW);
1223                 xCfgMgrStore->setStorage(xUIConfig);
1224             }
1225         }
1226 
1227         if (xCfgMgr.is())
1228         {
1229             // open the configuration and update our UI
1230             css::uno::Reference< css::ui::XAcceleratorConfiguration > xTempAccMgr(xCfgMgr->getShortCutManager(), css::uno::UNO_QUERY_THROW);
1231 
1232             aEntriesBox.SetUpdateMode(sal_False);
1233             ResetConfig();
1234             Init(xTempAccMgr);
1235             aEntriesBox.SetUpdateMode(sal_True);
1236             aEntriesBox.Invalidate();
1237             aEntriesBox.Select(aEntriesBox.GetEntry(0, 0));
1238 
1239         }
1240 
1241         // don't forget to close the new opened storage!
1242         // We are the owner of it.
1243         if (xRootStorage.is())
1244         {
1245             css::uno::Reference< css::lang::XComponent > xComponent;
1246             xComponent = css::uno::Reference< css::lang::XComponent >(xCfgMgr, css::uno::UNO_QUERY);
1247             if (xComponent.is())
1248                 xComponent->dispose();
1249             xComponent = css::uno::Reference< css::lang::XComponent >(xRootStorage, css::uno::UNO_QUERY);
1250             if (xComponent.is())
1251                 xComponent->dispose();
1252         }
1253     }
1254     catch(const css::uno::RuntimeException& exRun)
1255         { throw exRun; }
1256     catch(const css::uno::Exception&)
1257         {}
1258 
1259     GetTabDialog()->LeaveWait();
1260 
1261     return 0;
1262 }
1263 
1264 //-----------------------------------------------
IMPL_LINK(SfxAcceleratorConfigPage,SaveHdl,sfx2::FileDialogHelper *,EMPTYARG)1265 IMPL_LINK( SfxAcceleratorConfigPage, SaveHdl, sfx2::FileDialogHelper*, EMPTYARG )
1266 {
1267     DBG_ASSERT( m_pFileDlg, "SfxInternetPage::DialogClosedHdl(): no file dialog" );
1268 
1269     ::rtl::OUString sCfgName;
1270     if ( ERRCODE_NONE == m_pFileDlg->GetError() )
1271         sCfgName = m_pFileDlg->GetPath();
1272 
1273     if ( !sCfgName.getLength() )
1274         return 0;
1275 
1276     GetTabDialog()->EnterWait();
1277 
1278     css::uno::Reference< css::frame::XModel >                xDoc        ;
1279     css::uno::Reference< css::ui::XUIConfigurationManager > xCfgMgr     ;
1280     css::uno::Reference< css::embed::XStorage >              xRootStorage;
1281 
1282     try
1283     {
1284         // first check if URL points to a document already loaded
1285         xDoc = SearchForAlreadyLoadedDoc(sCfgName);
1286         if (xDoc.is())
1287         {
1288             // get config manager, force creation if there was none before
1289             css::uno::Reference< css::ui::XUIConfigurationManagerSupplier > xCfgSupplier(xDoc, css::uno::UNO_QUERY_THROW);
1290             xCfgMgr = xCfgSupplier->getUIConfigurationManager();
1291         }
1292         else
1293         {
1294             // URL doesn't point to a loaded document, try to access it as a single storage
1295             css::uno::Reference< css::lang::XSingleServiceFactory > xStorageFactory(m_xSMGR->createInstance(SERVICE_STORAGEFACTORY), css::uno::UNO_QUERY_THROW);
1296             css::uno::Sequence< css::uno::Any >                     lArgs(2);
1297             lArgs[0] <<= sCfgName;
1298             lArgs[1] <<= css::embed::ElementModes::WRITE;
1299 
1300             xRootStorage = css::uno::Reference< css::embed::XStorage >(
1301                                 xStorageFactory->createInstanceWithArguments(lArgs),
1302                                 css::uno::UNO_QUERY_THROW);
1303 
1304             css::uno::Reference< css::embed::XStorage > xUIConfig(
1305                                 xRootStorage->openStorageElement(FOLDERNAME_UICONFIG, css::embed::ElementModes::WRITE),
1306                                 css::uno::UNO_QUERY_THROW);
1307             css::uno::Reference< css::beans::XPropertySet > xUIConfigProps(
1308                                 xUIConfig,
1309                                 css::uno::UNO_QUERY_THROW);
1310 
1311             // set the correct media type if the storage was new created
1312             ::rtl::OUString sMediaType;
1313             xUIConfigProps->getPropertyValue(MEDIATYPE_PROPNAME) >>= sMediaType;
1314             if (!sMediaType.getLength())
1315                 xUIConfigProps->setPropertyValue(MEDIATYPE_PROPNAME, css::uno::makeAny(MEDIATYPE_UICONFIG));
1316 
1317             xCfgMgr = css::uno::Reference< css::ui::XUIConfigurationManager >(m_xSMGR->createInstance(SERVICE_UICONFIGMGR), css::uno::UNO_QUERY_THROW);
1318             css::uno::Reference< css::ui::XUIConfigurationStorage > xUICfgStore(xCfgMgr, css::uno::UNO_QUERY_THROW);
1319             xUICfgStore->setStorage(xUIConfig);
1320         }
1321 
1322         if (xCfgMgr.is())
1323         {
1324             // get the target configuration access and update with all shortcuts
1325             // which are set currently at the UI !
1326             // Dont copy the m_xAct content to it ... because m_xAct will be updated
1327             // from the UI on pressing the button "OK" only. And inbetween it's not up to date !
1328             css::uno::Reference< css::ui::XAcceleratorConfiguration > xTargetAccMgr(xCfgMgr->getShortCutManager(), css::uno::UNO_QUERY_THROW);
1329             Apply(xTargetAccMgr);
1330 
1331             // commit (order is important!)
1332             css::uno::Reference< css::ui::XUIConfigurationPersistence > xCommit1(xTargetAccMgr, css::uno::UNO_QUERY_THROW);
1333             css::uno::Reference< css::ui::XUIConfigurationPersistence > xCommit2(xCfgMgr      , css::uno::UNO_QUERY_THROW);
1334             xCommit1->store();
1335             xCommit2->store();
1336 
1337             if (xRootStorage.is())
1338             {
1339                 // Commit root storage
1340                 css::uno::Reference< css::embed::XTransactedObject > xCommit3(xRootStorage, css::uno::UNO_QUERY_THROW);
1341                 xCommit3->commit();
1342             }
1343         }
1344 
1345         if (xRootStorage.is())
1346         {
1347             css::uno::Reference< css::lang::XComponent > xComponent;
1348             xComponent = css::uno::Reference< css::lang::XComponent >(xCfgMgr, css::uno::UNO_QUERY);
1349             if (xComponent.is())
1350                 xComponent->dispose();
1351             xComponent = css::uno::Reference< css::lang::XComponent >(xRootStorage, css::uno::UNO_QUERY);
1352             if (xComponent.is())
1353                 xComponent->dispose();
1354         }
1355     }
1356     catch(const css::uno::RuntimeException& exRun)
1357         { throw exRun; }
1358     catch(const css::uno::Exception&)
1359         {}
1360 
1361     GetTabDialog()->LeaveWait();
1362 
1363     return 0;
1364 }
1365 
1366 //-----------------------------------------------
StartFileDialog(WinBits nBits,const String & rTitle)1367 void SfxAcceleratorConfigPage::StartFileDialog( WinBits nBits, const String& rTitle )
1368 {
1369     bool bSave = ( ( nBits & WB_SAVEAS ) == WB_SAVEAS );
1370     short nDialogType = bSave ? css::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION
1371                               : css::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE;
1372     if ( m_pFileDlg )
1373         delete m_pFileDlg;
1374     m_pFileDlg = new sfx2::FileDialogHelper( nDialogType, 0 );
1375 
1376     m_pFileDlg->SetTitle( rTitle );
1377     m_pFileDlg->AddFilter( aFilterAllStr, DEFINE_CONST_UNICODE( FILEDIALOG_FILTER_ALL ) );
1378     m_pFileDlg->AddFilter( aFilterCfgStr, DEFINE_CONST_UNICODE( "*.cfg" ) );
1379     m_pFileDlg->SetCurrentFilter( aFilterCfgStr );
1380 
1381     Link aDlgClosedLink = bSave ? LINK( this, SfxAcceleratorConfigPage, SaveHdl )
1382                                 : LINK( this, SfxAcceleratorConfigPage, LoadHdl );
1383     m_pFileDlg->StartExecuteModal( aDlgClosedLink );
1384 }
1385 
1386 //-----------------------------------------------
FillItemSet(SfxItemSet &)1387 sal_Bool SfxAcceleratorConfigPage::FillItemSet( SfxItemSet& )
1388 {
1389     Apply(m_xAct);
1390     try
1391     {
1392         m_xAct->store();
1393     }
1394     catch(const css::uno::RuntimeException& exRun)
1395         { throw exRun; }
1396     catch(const css::uno::Exception&)
1397         { return sal_False; }
1398 
1399     return sal_True;
1400 }
1401 
1402 //-----------------------------------------------
Reset(const SfxItemSet & rSet)1403 void SfxAcceleratorConfigPage::Reset( const SfxItemSet& rSet )
1404 {
1405     // open accelerator configs
1406     // Note: It initialize some other members too, which are needed here ...
1407     // e.g. m_sModuleUIName!
1408     InitAccCfg();
1409 
1410     // change te description of the radio button, which switch to the module
1411     // dependend accelerator configuration
1412     String sButtonText = aModuleButton.GetText();
1413     sButtonText.SearchAndReplace(String::CreateFromAscii("$(MODULE)"), m_sModuleUIName);
1414     aModuleButton.SetText(sButtonText);
1415 
1416     if (m_xModule.is())
1417         aModuleButton.Check();
1418     else
1419     {
1420         aModuleButton.Hide();
1421         aOfficeButton.Check();
1422     }
1423 
1424     RadioHdl(0);
1425 
1426 	const SfxPoolItem* pMacroItem=0;
1427 	if( SFX_ITEM_SET == rSet.GetItemState( SID_MACROINFO, sal_True, &pMacroItem ) )
1428 	{
1429 		m_pMacroInfoItem = PTR_CAST( SfxMacroInfoItem, pMacroItem );
1430 		pGroupLBox->SelectMacro( m_pMacroInfoItem );
1431 	}
1432 	else
1433 	{
1434 		const SfxPoolItem* pStringItem=0;
1435 		if( SFX_ITEM_SET == rSet.GetItemState( SID_CHARMAP, sal_True, &pStringItem ) )
1436 			m_pStringItem = PTR_CAST( SfxStringItem, pStringItem );
1437 
1438 		const SfxPoolItem* pFontItem=0;
1439 		if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_SPECIALCHAR, sal_True, &pFontItem ) )
1440 			m_pFontItem = PTR_CAST( SfxStringItem, pFontItem );
1441 	}
1442 }
1443 
1444 //-----------------------------------------------
MapKeyCodeToPos(const KeyCode & aKey) const1445 sal_uInt16 SfxAcceleratorConfigPage::MapKeyCodeToPos(const KeyCode& aKey) const
1446 {
1447     sal_uInt16       nCode1 = aKey.GetCode()+aKey.GetModifier();
1448 	SvLBoxEntry* pEntry = aEntriesBox.First();
1449     sal_uInt16       i      = 0;
1450 
1451     while (pEntry)
1452     {
1453         TAccInfo* pUserData = (TAccInfo*)pEntry->GetUserData();
1454         if (pUserData)
1455         {
1456             sal_uInt16 nCode2 = pUserData->m_aKey.GetCode()+pUserData->m_aKey.GetModifier();
1457             if (nCode1 == nCode2)
1458                 return i;
1459         }
1460         pEntry = aEntriesBox.Next(pEntry);
1461         ++i;
1462     }
1463 
1464     return LISTBOX_ENTRY_NOTFOUND;
1465 }
1466 
1467 //-----------------------------------------------
GetLabel4Command(const String & sCommand)1468 String SfxAcceleratorConfigPage::GetLabel4Command(const String& sCommand)
1469 {
1470     try
1471     {
1472         // check global command configuration first
1473         css::uno::Reference< css::container::XNameAccess > xModuleConf;
1474         m_xUICmdDescription->getByName(m_sModuleLongName) >>= xModuleConf;
1475         if (xModuleConf.is())
1476         {
1477             ::comphelper::SequenceAsHashMap lProps(xModuleConf->getByName(sCommand));
1478             String sLabel = String(lProps.getUnpackedValueOrDefault(CMDPROP_UINAME, ::rtl::OUString()));
1479             if (sLabel.Len())
1480                 return sLabel;
1481         }
1482     }
1483     catch(const css::uno::RuntimeException& exRun)
1484         { throw exRun; }
1485     catch(const css::uno::Exception&)
1486         {}
1487 
1488     // may be it's a style URL .. they must be handled special
1489     SfxStyleInfo_Impl aStyle;
1490     aStyle.sCommand = sCommand;
1491     if (m_aStylesInfo.parseStyleCommand(aStyle))
1492     {
1493         m_aStylesInfo.getLabel4Style(aStyle);
1494         return aStyle.sLabel;
1495     }
1496 	else
1497 	{
1498 		String aRet( String::CreateFromAscii("Symbols: ") );
1499 		xub_StrLen nPos = sCommand.SearchAscii(".uno:InsertSymbol?Symbols:string=");
1500 		if ( nPos == 0 )
1501 		{
1502 			aRet += String( sCommand, 34, sCommand.Len()-34 );
1503 			return aRet;
1504 		}
1505 	}
1506 
1507     return sCommand;
1508 }
1509 
Create(Window * pParent,const SfxItemSet & rAttrSet)1510 SfxTabPage* SfxAcceleratorConfigPage::Create( Window* pParent, const SfxItemSet& rAttrSet )
1511 {
1512 	return new SfxAcceleratorConfigPage( pParent, rAttrSet );
1513 }
1514 
1515 //-----------------------------------------------
SearchForAlreadyLoadedDoc(const String &)1516 css::uno::Reference< css::frame::XModel > SfxAcceleratorConfigPage::SearchForAlreadyLoadedDoc(const String& /*sName*/)
1517 {
1518     return css::uno::Reference< css::frame::XModel >();
1519 }
1520 
SvxShortcutAssignDlg(Window * pParent,const uno::Reference<frame::XFrame> & rxDocumentFrame,const SfxItemSet & rSet)1521 SvxShortcutAssignDlg::SvxShortcutAssignDlg( Window* pParent, const uno::Reference< frame::XFrame >& rxDocumentFrame, const SfxItemSet& rSet )
1522 	: SfxSingleTabDialog( pParent, rSet, 0 )
1523 {
1524     SfxTabPage* pPage = SfxAcceleratorConfigPage::Create( this, rSet );
1525     pPage->SetFrame( rxDocumentFrame );
1526 	SetTabPage( pPage );
1527 
1528 }
1529 
~SvxShortcutAssignDlg()1530 SvxShortcutAssignDlg::~SvxShortcutAssignDlg()
1531 {
1532 }
1533 
1534 
1535 // .uno:InsertSymbol?Symbols:string=bla
1536