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