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