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