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