LibreOffice Module cui (master)  1
acccfg.cxx
Go to the documentation of this file.
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/filedlghelper.hxx>
28 #include <sfx2/minfitem.hxx>
29 #include <sfx2/sfxresid.hxx>
30 
31 #include <sal/macros.h>
32 #include <vcl/event.hxx>
33 
34 #include <strings.hrc>
35 #include <sfx2/strings.hrc>
36 #include <svx/svxids.hrc>
37 
38 
39 // include interface declarations
40 #include <com/sun/star/beans/XPropertySet.hpp>
41 #include <com/sun/star/embed/StorageFactory.hpp>
42 #include <com/sun/star/embed/XTransactedObject.hpp>
43 #include <com/sun/star/embed/ElementModes.hpp>
44 #include <com/sun/star/form/XReset.hpp>
45 #include <com/sun/star/frame/Desktop.hpp>
46 #include <com/sun/star/frame/XController.hpp>
47 #include <com/sun/star/frame/XModel.hpp>
48 #include <com/sun/star/frame/ModuleManager.hpp>
49 #include <com/sun/star/frame/theUICommandDescription.hpp>
50 #include <com/sun/star/ui/GlobalAcceleratorConfiguration.hpp>
51 #include <com/sun/star/ui/theModuleUIConfigurationManagerSupplier.hpp>
52 #include <com/sun/star/ui/UIConfigurationManager.hpp>
53 #include <com/sun/star/ui/XUIConfigurationManager.hpp>
54 #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
55 
56 // include search util
57 #include <com/sun/star/util/SearchFlags.hpp>
58 #include <com/sun/star/util/SearchAlgorithms2.hpp>
59 #include <unotools/textsearch.hxx>
60 
61 // include other projects
64 #include <vcl/svapp.hxx>
65 #include <vcl/help.hxx>
67 // namespaces
68 
69 using namespace css;
70 
71 static const char FOLDERNAME_UICONFIG [] = "Configurations2";
72 
73 static const char MEDIATYPE_PROPNAME [] = "MediaType";
74 
75 static const sal_uInt16 KEYCODE_ARRAY[] =
76 {
77  KEY_F1,
78  KEY_F2,
79  KEY_F3,
80  KEY_F4,
81  KEY_F5,
82  KEY_F6,
83  KEY_F7,
84  KEY_F8,
85  KEY_F9,
86  KEY_F10,
87  KEY_F11,
88  KEY_F12,
89  KEY_F13,
90  KEY_F14,
91  KEY_F15,
92  KEY_F16,
93 
94  KEY_DOWN,
95  KEY_UP,
96  KEY_LEFT,
97  KEY_RIGHT,
98  KEY_HOME,
99  KEY_END,
100  KEY_PAGEUP,
101  KEY_PAGEDOWN,
102  KEY_RETURN,
103  KEY_ESCAPE,
105  KEY_INSERT,
106  KEY_DELETE,
107 
108  KEY_OPEN,
109  KEY_CUT,
110  KEY_COPY,
111  KEY_PASTE,
112  KEY_UNDO,
113  KEY_REPEAT,
114  KEY_FIND,
116  KEY_FRONT,
118  KEY_MENU,
119  KEY_HELP,
120 
121  KEY_SHIFT | KEY_F1,
122  KEY_SHIFT | KEY_F2,
123  KEY_SHIFT | KEY_F3,
124  KEY_SHIFT | KEY_F4,
125  KEY_SHIFT | KEY_F5,
126  KEY_SHIFT | KEY_F6,
127  KEY_SHIFT | KEY_F7,
128  KEY_SHIFT | KEY_F8,
129  KEY_SHIFT | KEY_F9,
130  KEY_SHIFT | KEY_F10,
131  KEY_SHIFT | KEY_F11,
132  KEY_SHIFT | KEY_F12,
133  KEY_SHIFT | KEY_F13,
134  KEY_SHIFT | KEY_F14,
135  KEY_SHIFT | KEY_F15,
136  KEY_SHIFT | KEY_F16,
137 
138  KEY_SHIFT | KEY_DOWN,
139  KEY_SHIFT | KEY_UP,
140  KEY_SHIFT | KEY_LEFT,
141  KEY_SHIFT | KEY_RIGHT,
142  KEY_SHIFT | KEY_HOME,
143  KEY_SHIFT | KEY_END,
144  KEY_SHIFT | KEY_PAGEUP,
145  KEY_SHIFT | KEY_PAGEDOWN,
146  KEY_SHIFT | KEY_RETURN,
148  KEY_SHIFT | KEY_ESCAPE,
149  KEY_SHIFT | KEY_BACKSPACE,
150  KEY_SHIFT | KEY_INSERT,
151  KEY_SHIFT | KEY_DELETE,
153 
154  KEY_MOD1 | KEY_0,
155  KEY_MOD1 | KEY_1,
156  KEY_MOD1 | KEY_2,
157  KEY_MOD1 | KEY_3,
158  KEY_MOD1 | KEY_4,
159  KEY_MOD1 | KEY_5,
160  KEY_MOD1 | KEY_6,
161  KEY_MOD1 | KEY_7,
162  KEY_MOD1 | KEY_8,
163  KEY_MOD1 | KEY_9,
164  KEY_MOD1 | KEY_A,
165  KEY_MOD1 | KEY_B,
166  KEY_MOD1 | KEY_C,
167  KEY_MOD1 | KEY_D,
168  KEY_MOD1 | KEY_E,
169  KEY_MOD1 | KEY_F,
170  KEY_MOD1 | KEY_G,
171  KEY_MOD1 | KEY_H,
172  KEY_MOD1 | KEY_I,
173  KEY_MOD1 | KEY_J,
174  KEY_MOD1 | KEY_K,
175  KEY_MOD1 | KEY_L,
176  KEY_MOD1 | KEY_M,
177  KEY_MOD1 | KEY_N,
178  KEY_MOD1 | KEY_O,
179  KEY_MOD1 | KEY_P,
180  KEY_MOD1 | KEY_Q,
181  KEY_MOD1 | KEY_R,
182  KEY_MOD1 | KEY_S,
183  KEY_MOD1 | KEY_T,
184  KEY_MOD1 | KEY_U,
185  KEY_MOD1 | KEY_V,
186  KEY_MOD1 | KEY_W,
187  KEY_MOD1 | KEY_X,
188  KEY_MOD1 | KEY_Y,
189  KEY_MOD1 | KEY_Z,
197  KEY_MOD1 | KEY_TAB,
198 
199  KEY_MOD1 | KEY_F1,
200  KEY_MOD1 | KEY_F2,
201  KEY_MOD1 | KEY_F3,
202  KEY_MOD1 | KEY_F4,
203  KEY_MOD1 | KEY_F5,
204  KEY_MOD1 | KEY_F6,
205  KEY_MOD1 | KEY_F7,
206  KEY_MOD1 | KEY_F8,
207  KEY_MOD1 | KEY_F9,
208  KEY_MOD1 | KEY_F10,
209  KEY_MOD1 | KEY_F11,
210  KEY_MOD1 | KEY_F12,
211  KEY_MOD1 | KEY_F13,
212  KEY_MOD1 | KEY_F14,
213  KEY_MOD1 | KEY_F15,
214  KEY_MOD1 | KEY_F16,
215 
216  KEY_MOD1 | KEY_DOWN,
217  KEY_MOD1 | KEY_UP,
218  KEY_MOD1 | KEY_LEFT,
219  KEY_MOD1 | KEY_RIGHT,
220  KEY_MOD1 | KEY_HOME,
221  KEY_MOD1 | KEY_END,
222  KEY_MOD1 | KEY_PAGEUP,
223  KEY_MOD1 | KEY_PAGEDOWN,
224  KEY_MOD1 | KEY_RETURN,
226  KEY_MOD1 | KEY_BACKSPACE,
227  KEY_MOD1 | KEY_INSERT,
228  KEY_MOD1 | KEY_DELETE,
229 
230  KEY_MOD1 | KEY_ADD,
235 
280 
282  KEY_SHIFT | KEY_MOD1 | KEY_F2,
283  KEY_SHIFT | KEY_MOD1 | KEY_F3,
284  KEY_SHIFT | KEY_MOD1 | KEY_F4,
285  KEY_SHIFT | KEY_MOD1 | KEY_F5,
286  KEY_SHIFT | KEY_MOD1 | KEY_F6,
287  KEY_SHIFT | KEY_MOD1 | KEY_F7,
288  KEY_SHIFT | KEY_MOD1 | KEY_F8,
289  KEY_SHIFT | KEY_MOD1 | KEY_F9,
290  KEY_SHIFT | KEY_MOD1 | KEY_F10,
291  KEY_SHIFT | KEY_MOD1 | KEY_F11,
292  KEY_SHIFT | KEY_MOD1 | KEY_F12,
293  KEY_SHIFT | KEY_MOD1 | KEY_F13,
294  KEY_SHIFT | KEY_MOD1 | KEY_F14,
295  KEY_SHIFT | KEY_MOD1 | KEY_F15,
296  KEY_SHIFT | KEY_MOD1 | KEY_F16,
297 
298  KEY_SHIFT | KEY_MOD1 | KEY_DOWN,
299  KEY_SHIFT | KEY_MOD1 | KEY_UP,
300  KEY_SHIFT | KEY_MOD1 | KEY_LEFT,
301  KEY_SHIFT | KEY_MOD1 | KEY_RIGHT,
302  KEY_SHIFT | KEY_MOD1 | KEY_HOME,
303  KEY_SHIFT | KEY_MOD1 | KEY_END,
304  KEY_SHIFT | KEY_MOD1 | KEY_PAGEUP,
305  KEY_SHIFT | KEY_MOD1 | KEY_PAGEDOWN,
306  KEY_SHIFT | KEY_MOD1 | KEY_RETURN,
307  KEY_SHIFT | KEY_MOD1 | KEY_ESCAPE,
309  KEY_SHIFT | KEY_MOD1 | KEY_BACKSPACE,
310  KEY_SHIFT | KEY_MOD1 | KEY_INSERT,
311  KEY_SHIFT | KEY_MOD1 | KEY_DELETE,
313 
314  KEY_MOD2 | KEY_0,
315  KEY_MOD2 | KEY_1,
316  KEY_MOD2 | KEY_2,
317  KEY_MOD2 | KEY_3,
318  KEY_MOD2 | KEY_4,
319  KEY_MOD2 | KEY_5,
320  KEY_MOD2 | KEY_6,
321  KEY_MOD2 | KEY_7,
322  KEY_MOD2 | KEY_8,
323  KEY_MOD2 | KEY_9,
324  KEY_MOD2 | KEY_A,
325  KEY_MOD2 | KEY_B,
326  KEY_MOD2 | KEY_C,
327  KEY_MOD2 | KEY_D,
328  KEY_MOD2 | KEY_E,
329  KEY_MOD2 | KEY_F,
330  KEY_MOD2 | KEY_G,
331  KEY_MOD2 | KEY_H,
332  KEY_MOD2 | KEY_I,
333  KEY_MOD2 | KEY_J,
334  KEY_MOD2 | KEY_K,
335  KEY_MOD2 | KEY_L,
336  KEY_MOD2 | KEY_M,
337  KEY_MOD2 | KEY_N,
338  KEY_MOD2 | KEY_O,
339  KEY_MOD2 | KEY_P,
340  KEY_MOD2 | KEY_Q,
341  KEY_MOD2 | KEY_R,
342  KEY_MOD2 | KEY_S,
343  KEY_MOD2 | KEY_T,
344  KEY_MOD2 | KEY_U,
345  KEY_MOD2 | KEY_V,
346  KEY_MOD2 | KEY_W,
347  KEY_MOD2 | KEY_X,
348  KEY_MOD2 | KEY_Y,
349  KEY_MOD2 | KEY_Z,
357 
358  KEY_MOD2 | KEY_F1,
359  KEY_MOD2 | KEY_F2,
360  KEY_MOD2 | KEY_F3,
361  KEY_MOD2 | KEY_F4,
362  KEY_MOD2 | KEY_F5,
363  KEY_MOD2 | KEY_F6,
364  KEY_MOD2 | KEY_F7,
365  KEY_MOD2 | KEY_F8,
366  KEY_MOD2 | KEY_F9,
367  KEY_MOD2 | KEY_F10,
368  KEY_MOD2 | KEY_F11,
369  KEY_MOD2 | KEY_F12,
370  KEY_MOD2 | KEY_F13,
371  KEY_MOD2 | KEY_F14,
372  KEY_MOD2 | KEY_F15,
373  KEY_MOD2 | KEY_F16,
374 
375  KEY_MOD2 | KEY_DOWN,
376  KEY_MOD2 | KEY_UP,
377  KEY_MOD2 | KEY_LEFT,
378  KEY_MOD2 | KEY_RIGHT,
379  KEY_MOD2 | KEY_HOME,
380  KEY_MOD2 | KEY_END,
381  KEY_MOD2 | KEY_PAGEUP,
382  KEY_MOD2 | KEY_PAGEDOWN,
383  KEY_MOD2 | KEY_RETURN,
385  KEY_MOD2 | KEY_BACKSPACE,
386  KEY_MOD2 | KEY_INSERT,
387  KEY_MOD2 | KEY_DELETE,
389 
433 
435  KEY_SHIFT | KEY_MOD2 | KEY_F2,
436  KEY_SHIFT | KEY_MOD2 | KEY_F3,
437  KEY_SHIFT | KEY_MOD2 | KEY_F4,
438  KEY_SHIFT | KEY_MOD2 | KEY_F5,
439  KEY_SHIFT | KEY_MOD2 | KEY_F6,
440  KEY_SHIFT | KEY_MOD2 | KEY_F7,
441  KEY_SHIFT | KEY_MOD2 | KEY_F8,
442  KEY_SHIFT | KEY_MOD2 | KEY_F9,
443  KEY_SHIFT | KEY_MOD2 | KEY_F10,
444  KEY_SHIFT | KEY_MOD2 | KEY_F11,
445  KEY_SHIFT | KEY_MOD2 | KEY_F12,
446  KEY_SHIFT | KEY_MOD2 | KEY_F13,
447  KEY_SHIFT | KEY_MOD2 | KEY_F14,
448  KEY_SHIFT | KEY_MOD2 | KEY_F15,
449  KEY_SHIFT | KEY_MOD2 | KEY_F16,
450 
451  KEY_SHIFT | KEY_MOD2 | KEY_DOWN,
452  KEY_SHIFT | KEY_MOD2 | KEY_UP,
453  KEY_SHIFT | KEY_MOD2 | KEY_LEFT,
454  KEY_SHIFT | KEY_MOD2 | KEY_RIGHT,
455  KEY_SHIFT | KEY_MOD2 | KEY_HOME,
456  KEY_SHIFT | KEY_MOD2 | KEY_END,
457  KEY_SHIFT | KEY_MOD2 | KEY_PAGEUP,
458  KEY_SHIFT | KEY_MOD2 | KEY_PAGEDOWN,
459  KEY_SHIFT | KEY_MOD2 | KEY_RETURN,
460  KEY_SHIFT | KEY_MOD2 | KEY_ESCAPE,
462  KEY_SHIFT | KEY_MOD2 | KEY_BACKSPACE,
463  KEY_SHIFT | KEY_MOD2 | KEY_INSERT,
464  KEY_SHIFT | KEY_MOD2 | KEY_DELETE,
466 
467  KEY_MOD1 | KEY_MOD2 | KEY_0,
468  KEY_MOD1 | KEY_MOD2 | KEY_1,
469  KEY_MOD1 | KEY_MOD2 | KEY_2,
470  KEY_MOD1 | KEY_MOD2 | KEY_3,
471  KEY_MOD1 | KEY_MOD2 | KEY_4,
472  KEY_MOD1 | KEY_MOD2 | KEY_5,
473  KEY_MOD1 | KEY_MOD2 | KEY_6,
474  KEY_MOD1 | KEY_MOD2 | KEY_7,
475  KEY_MOD1 | KEY_MOD2 | KEY_8,
476  KEY_MOD1 | KEY_MOD2 | KEY_9,
477  KEY_MOD1 | KEY_MOD2 | KEY_A,
478  KEY_MOD1 | KEY_MOD2 | KEY_B,
479  KEY_MOD1 | KEY_MOD2 | KEY_C,
480  KEY_MOD1 | KEY_MOD2 | KEY_D,
481  KEY_MOD1 | KEY_MOD2 | KEY_E,
482  KEY_MOD1 | KEY_MOD2 | KEY_F,
483  KEY_MOD1 | KEY_MOD2 | KEY_G,
484  KEY_MOD1 | KEY_MOD2 | KEY_H,
485  KEY_MOD1 | KEY_MOD2 | KEY_I,
486  KEY_MOD1 | KEY_MOD2 | KEY_J,
487  KEY_MOD1 | KEY_MOD2 | KEY_K,
488  KEY_MOD1 | KEY_MOD2 | KEY_L,
489  KEY_MOD1 | KEY_MOD2 | KEY_M,
490  KEY_MOD1 | KEY_MOD2 | KEY_N,
491  KEY_MOD1 | KEY_MOD2 | KEY_O,
492  KEY_MOD1 | KEY_MOD2 | KEY_P,
493  KEY_MOD1 | KEY_MOD2 | KEY_Q,
494  KEY_MOD1 | KEY_MOD2 | KEY_R,
495  KEY_MOD1 | KEY_MOD2 | KEY_S,
496  KEY_MOD1 | KEY_MOD2 | KEY_T,
497  KEY_MOD1 | KEY_MOD2 | KEY_U,
498  KEY_MOD1 | KEY_MOD2 | KEY_V,
499  KEY_MOD1 | KEY_MOD2 | KEY_W,
500  KEY_MOD1 | KEY_MOD2 | KEY_X,
501  KEY_MOD1 | KEY_MOD2 | KEY_Y,
502  KEY_MOD1 | KEY_MOD2 | KEY_Z,
510 
512  KEY_MOD1 | KEY_MOD2 | KEY_F2,
513  KEY_MOD1 | KEY_MOD2 | KEY_F3,
514  KEY_MOD1 | KEY_MOD2 | KEY_F4,
515  KEY_MOD1 | KEY_MOD2 | KEY_F5,
516  KEY_MOD1 | KEY_MOD2 | KEY_F6,
517  KEY_MOD1 | KEY_MOD2 | KEY_F7,
518  KEY_MOD1 | KEY_MOD2 | KEY_F8,
519  KEY_MOD1 | KEY_MOD2 | KEY_F9,
520  KEY_MOD1 | KEY_MOD2 | KEY_F10,
521  KEY_MOD1 | KEY_MOD2 | KEY_F11,
522  KEY_MOD1 | KEY_MOD2 | KEY_F12,
523  KEY_MOD1 | KEY_MOD2 | KEY_F13,
524  KEY_MOD1 | KEY_MOD2 | KEY_F14,
525  KEY_MOD1 | KEY_MOD2 | KEY_F15,
526  KEY_MOD1 | KEY_MOD2 | KEY_F16,
527 
528  KEY_MOD1 | KEY_MOD2 | KEY_DOWN,
529  KEY_MOD1 | KEY_MOD2 | KEY_UP,
530  KEY_MOD1 | KEY_MOD2 | KEY_LEFT,
531  KEY_MOD1 | KEY_MOD2 | KEY_RIGHT,
532  KEY_MOD1 | KEY_MOD2 | KEY_HOME,
533  KEY_MOD1 | KEY_MOD2 | KEY_END,
534  KEY_MOD1 | KEY_MOD2 | KEY_PAGEUP,
535  KEY_MOD1 | KEY_MOD2 | KEY_PAGEDOWN,
536  KEY_MOD1 | KEY_MOD2 | KEY_RETURN,
538  KEY_MOD1 | KEY_MOD2 | KEY_BACKSPACE,
539  KEY_MOD1 | KEY_MOD2 | KEY_INSERT,
540  KEY_MOD1 | KEY_MOD2 | KEY_DELETE,
541 
585 
587  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F2,
588  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F3,
589  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F4,
590  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F5,
591  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F6,
592  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F7,
593  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F8,
594  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F9,
595  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F10,
596  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F11,
597  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F12,
598  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F13,
599  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F14,
600  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F15,
601  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F16,
602 
603  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_DOWN,
604  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_UP,
605  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_LEFT,
606  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_RIGHT,
607  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_HOME,
608  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_END,
609  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_PAGEUP,
610  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_PAGEDOWN,
611  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_RETURN,
613  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_BACKSPACE,
614  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_INSERT,
615  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_DELETE,
617 
618 #ifdef __APPLE__
619  ,KEY_MOD3 | KEY_0,
620  KEY_MOD3 | KEY_1,
621  KEY_MOD3 | KEY_2,
622  KEY_MOD3 | KEY_3,
623  KEY_MOD3 | KEY_4,
624  KEY_MOD3 | KEY_5,
625  KEY_MOD3 | KEY_6,
626  KEY_MOD3 | KEY_7,
627  KEY_MOD3 | KEY_8,
628  KEY_MOD3 | KEY_9,
629  KEY_MOD3 | KEY_A,
630  KEY_MOD3 | KEY_B,
631  KEY_MOD3 | KEY_C,
632  KEY_MOD3 | KEY_D,
633  KEY_MOD3 | KEY_E,
634  KEY_MOD3 | KEY_F,
635  KEY_MOD3 | KEY_G,
636  KEY_MOD3 | KEY_H,
637  KEY_MOD3 | KEY_I,
638  KEY_MOD3 | KEY_J,
639  KEY_MOD3 | KEY_K,
640  KEY_MOD3 | KEY_L,
641  KEY_MOD3 | KEY_M,
642  KEY_MOD3 | KEY_N,
643  KEY_MOD3 | KEY_O,
644  KEY_MOD3 | KEY_P,
645  KEY_MOD3 | KEY_Q,
646  KEY_MOD3 | KEY_R,
647  KEY_MOD3 | KEY_S,
648  KEY_MOD3 | KEY_T,
649  KEY_MOD3 | KEY_U,
650  KEY_MOD3 | KEY_V,
651  KEY_MOD3 | KEY_W,
652  KEY_MOD3 | KEY_X,
653  KEY_MOD3 | KEY_Y,
654  KEY_MOD3 | KEY_Z,
662  KEY_MOD3 | KEY_TAB,
663 
664  KEY_MOD3 | KEY_F1,
665  KEY_MOD3 | KEY_F2,
666  KEY_MOD3 | KEY_F3,
667  KEY_MOD3 | KEY_F4,
668  KEY_MOD3 | KEY_F5,
669  KEY_MOD3 | KEY_F6,
670  KEY_MOD3 | KEY_F7,
671  KEY_MOD3 | KEY_F8,
672  KEY_MOD3 | KEY_F9,
673  KEY_MOD3 | KEY_F10,
674  KEY_MOD3 | KEY_F11,
675  KEY_MOD3 | KEY_F12,
676  KEY_MOD3 | KEY_F13,
677  KEY_MOD3 | KEY_F14,
678  KEY_MOD3 | KEY_F15,
679  KEY_MOD3 | KEY_F16,
680 
681  KEY_MOD3 | KEY_DOWN,
682  KEY_MOD3 | KEY_UP,
683  KEY_MOD3 | KEY_LEFT,
684  KEY_MOD3 | KEY_RIGHT,
685  KEY_MOD3 | KEY_HOME,
686  KEY_MOD3 | KEY_END,
687  KEY_MOD3 | KEY_PAGEUP,
688  KEY_MOD3 | KEY_PAGEDOWN,
689  KEY_MOD3 | KEY_RETURN,
691  KEY_MOD3 | KEY_BACKSPACE,
692  KEY_MOD3 | KEY_INSERT,
693  KEY_MOD3 | KEY_DELETE,
694 
695  KEY_MOD3 | KEY_ADD,
700 
745 
747  KEY_SHIFT | KEY_MOD3 | KEY_F2,
748  KEY_SHIFT | KEY_MOD3 | KEY_F3,
749  KEY_SHIFT | KEY_MOD3 | KEY_F4,
750  KEY_SHIFT | KEY_MOD3 | KEY_F5,
751  KEY_SHIFT | KEY_MOD3 | KEY_F6,
752  KEY_SHIFT | KEY_MOD3 | KEY_F7,
753  KEY_SHIFT | KEY_MOD3 | KEY_F8,
754  KEY_SHIFT | KEY_MOD3 | KEY_F9,
755  KEY_SHIFT | KEY_MOD3 | KEY_F10,
756  KEY_SHIFT | KEY_MOD3 | KEY_F11,
757  KEY_SHIFT | KEY_MOD3 | KEY_F12,
758  KEY_SHIFT | KEY_MOD3 | KEY_F13,
759  KEY_SHIFT | KEY_MOD3 | KEY_F14,
760  KEY_SHIFT | KEY_MOD3 | KEY_F15,
761  KEY_SHIFT | KEY_MOD3 | KEY_F16,
762 
763  KEY_SHIFT | KEY_MOD3 | KEY_DOWN,
764  KEY_SHIFT | KEY_MOD3 | KEY_UP,
765  KEY_SHIFT | KEY_MOD3 | KEY_LEFT,
766  KEY_SHIFT | KEY_MOD3 | KEY_RIGHT,
767  KEY_SHIFT | KEY_MOD3 | KEY_HOME,
768  KEY_SHIFT | KEY_MOD3 | KEY_END,
769  KEY_SHIFT | KEY_MOD3 | KEY_PAGEUP,
770  KEY_SHIFT | KEY_MOD3 | KEY_PAGEDOWN,
771  KEY_SHIFT | KEY_MOD3 | KEY_RETURN,
772  KEY_SHIFT | KEY_MOD3 | KEY_ESCAPE,
774  KEY_SHIFT | KEY_MOD3 | KEY_BACKSPACE,
775  KEY_SHIFT | KEY_MOD3 | KEY_INSERT,
776  KEY_SHIFT | KEY_MOD3 | KEY_DELETE,
778 #endif
779 };
780 
782 
786 IMPL_LINK(SfxAcceleratorConfigPage, KeyInputHdl, const KeyEvent&, rKey, bool)
787 {
788  vcl::KeyCode aCode1 = rKey.GetKeyCode();
789  sal_uInt16 nCode1 = aCode1.GetCode();
790  sal_uInt16 nMod1 = aCode1.GetModifier();
791 
792  // is it related to our list box ?
793  if (
794  (nCode1 != KEY_DOWN ) &&
795  (nCode1 != KEY_UP ) &&
796  (nCode1 != KEY_LEFT ) &&
797  (nCode1 != KEY_RIGHT ) &&
798  (nCode1 != KEY_PAGEUP ) &&
799  (nCode1 != KEY_PAGEDOWN)
800  )
801  {
802  for (int i = 0, nCount = m_xEntriesBox->n_children(); i < nCount; ++i)
803  {
804  TAccInfo* pUserData = reinterpret_cast<TAccInfo*>(m_xEntriesBox->get_id(i).toInt64());
805  if (pUserData)
806  {
807  sal_uInt16 nCode2 = pUserData->m_aKey.GetCode();
808  sal_uInt16 nMod2 = pUserData->m_aKey.GetModifier();
809 
810  if (nCode1 == nCode2 && nMod1 == nMod2)
811  {
812  m_xEntriesBox->select(i);
813  m_xEntriesBox->scroll_to_row(i);
814  return true;
815  }
816  }
817  }
818  }
819 
820  // no - handle it as normal dialog input
821  return false;
822 }
823 
825  : SfxTabPage(pPage, pController, "cui/ui/accelconfigpage.ui", "AccelConfigPage", &aSet)
826  , m_pMacroInfoItem()
827  , aLoadAccelConfigStr(CuiResId(RID_SVXSTR_LOADACCELCONFIG))
828  , aSaveAccelConfigStr(CuiResId(RID_SVXSTR_SAVEACCELCONFIG))
829  , aFilterAllStr(SfxResId(STR_SFX_FILTERNAME_ALL))
830  , aFilterCfgStr(CuiResId(RID_SVXSTR_FILTERNAME_CFG))
831  , m_bStylesInfoInitialized(false)
832  , m_xGlobal()
833  , m_xModule()
834  , m_xAct()
835  , m_aUpdateDataTimer("UpdateDataTimer")
836  , m_xEntriesBox(m_xBuilder->weld_tree_view("shortcuts"))
837  , m_xOfficeButton(m_xBuilder->weld_radio_button("office"))
838  , m_xModuleButton(m_xBuilder->weld_radio_button("module"))
839  , m_xChangeButton(m_xBuilder->weld_button("change"))
840  , m_xRemoveButton(m_xBuilder->weld_button("delete"))
841  , m_xGroupLBox(new CuiConfigGroupListBox(m_xBuilder->weld_tree_view("category")))
842  , m_xFunctionBox(new CuiConfigFunctionListBox(m_xBuilder->weld_tree_view("function")))
843  , m_xKeyBox(m_xBuilder->weld_tree_view("keys"))
844  , m_xSearchEdit(m_xBuilder->weld_entry("searchEntry"))
845  , m_xLoadButton(m_xBuilder->weld_button("load"))
846  , m_xSaveButton(m_xBuilder->weld_button("save"))
847  , m_xResetButton(m_xBuilder->weld_button("reset"))
848 {
849  Size aSize(m_xEntriesBox->get_approximate_digit_width() * 40,
850  m_xEntriesBox->get_height_rows(12));
851  m_xEntriesBox->set_size_request(aSize.Width(), aSize.Height());
852  aSize = Size(m_xEntriesBox->get_approximate_digit_width() * 19,
853  m_xEntriesBox->get_height_rows(10));
854  m_xGroupLBox->set_size_request(aSize.Width(), aSize.Height());
855  aSize = Size(m_xEntriesBox->get_approximate_digit_width() * 21,
856  m_xEntriesBox->get_height_rows(10));
857  m_xFunctionBox->set_size_request(aSize.Width(), aSize.Height());
858  aSize = Size(m_xEntriesBox->get_approximate_digit_width() * 20,
859  m_xEntriesBox->get_height_rows(10));
860  m_xKeyBox->set_size_request(aSize.Width(), aSize.Height());
861 
862  // install handler functions
863  m_xChangeButton->connect_clicked( LINK( this, SfxAcceleratorConfigPage, ChangeHdl ));
864  m_xRemoveButton->connect_clicked( LINK( this, SfxAcceleratorConfigPage, RemoveHdl ));
865  m_xEntriesBox->connect_changed ( LINK( this, SfxAcceleratorConfigPage, SelectHdl ));
866  m_xEntriesBox->connect_key_press( LINK( this, SfxAcceleratorConfigPage, KeyInputHdl ));
867  m_xGroupLBox->connect_changed ( LINK( this, SfxAcceleratorConfigPage, SelectHdl ));
868  m_xFunctionBox->connect_changed( LINK( this, SfxAcceleratorConfigPage, SelectHdl ));
869  m_xKeyBox->connect_changed ( LINK( this, SfxAcceleratorConfigPage, SelectHdl ));
870  m_xLoadButton->connect_clicked ( LINK( this, SfxAcceleratorConfigPage, Load ));
871  m_xSaveButton->connect_clicked ( LINK( this, SfxAcceleratorConfigPage, Save ));
872  m_xResetButton->connect_clicked ( LINK( this, SfxAcceleratorConfigPage, Default ));
873  m_xOfficeButton->connect_clicked( LINK( this, SfxAcceleratorConfigPage, RadioHdl ));
874  m_xModuleButton->connect_clicked( LINK( this, SfxAcceleratorConfigPage, RadioHdl ));
875  m_xSearchEdit->connect_changed( LINK( this, SfxAcceleratorConfigPage, SearchUpdateHdl ));
876  m_xSearchEdit->connect_focus_out(LINK(this, SfxAcceleratorConfigPage, FocusOut_Impl));
877 
878  // detect max keyname width
879  int nMaxWidth = 0;
880  for (unsigned short i : KEYCODE_ARRAY)
881  {
882  int nTmp = m_xEntriesBox->get_pixel_size(vcl::KeyCode(i).GetName()).Width();
883  if ( nTmp > nMaxWidth )
884  nMaxWidth = nTmp;
885  }
886  // recalc second tab
887  auto nNewTab = nMaxWidth + 5; // additional space
888 
889  // initialize Entriesbox
890  std::vector<int> aWidths;
891  aWidths.push_back(nNewTab);
892  m_xEntriesBox->set_column_fixed_widths(aWidths);
893 
894  //Initialize search util
895  m_options.AlgorithmType2 = util::SearchAlgorithms2::ABSOLUTE;
896  m_options.transliterateFlags |= TransliterationFlags::IGNORE_CASE;
897  m_options.searchFlag |= (util::SearchFlags::REG_NOT_BEGINOFLINE |
898  util::SearchFlags::REG_NOT_ENDOFLINE);
899  // initialize GroupBox
900  m_xGroupLBox->SetFunctionListBox(m_xFunctionBox.get());
901 
902  // initialize KeyBox
903  m_xKeyBox->make_sorted();
904 
906  m_aUpdateDataTimer.SetDebugName( "SfxAcceleratorConfigPage UpdateDataTimer" );
908 
910  m_aFillGroupIdle.SetPriority(TaskPriority::HIGHEST);
911  m_aFillGroupIdle.SetDebugName("SfxAcceleratorConfigPage m_aFillGroupIdle");
912 }
913 
915 {
917 
918  // free memory - remove all dynamic user data
919  for (int i = 0, nCount = m_xEntriesBox->n_children(); i < nCount; ++i)
920  {
921  TAccInfo* pUserData = reinterpret_cast<TAccInfo*>(m_xEntriesBox->get_id(i).toInt64());
922  delete pUserData;
923  }
924 }
925 
927 {
928  // already initialized ?
929  if (m_xContext.is())
930  return; // yes -> do nothing
931 
932  try
933  {
934  // no - initialize this instance
936 
937  m_xUICmdDescription = frame::theUICommandDescription::get(m_xContext);
938 
939  // get the current active frame, which should be our "parent"
940  // for this session
941  m_xFrame = GetFrame();
942  if ( !m_xFrame.is() )
943  {
944  uno::Reference<frame::XDesktop2> xDesktop = frame::Desktop::create( m_xContext );
945  m_xFrame = xDesktop->getActiveFrame();
946  }
947 
948  // identify module
949  uno::Reference<frame::XModuleManager2> xModuleManager =
950  frame::ModuleManager::create(m_xContext);
951  m_sModuleLongName = xModuleManager->identify(m_xFrame);
952  comphelper::SequenceAsHashMap lModuleProps(xModuleManager->getByName(m_sModuleLongName));
953  m_sModuleUIName = lModuleProps.getUnpackedValueOrDefault("ooSetupFactoryUIName", OUString());
954 
955  // get global accelerator configuration
956  m_xGlobal = css::ui::GlobalAcceleratorConfiguration::create(m_xContext);
957 
958  // get module accelerator configuration
959 
960  uno::Reference<ui::XModuleUIConfigurationManagerSupplier> xModuleCfgSupplier(
961  ui::theModuleUIConfigurationManagerSupplier::get(m_xContext));
962  uno::Reference<ui::XUIConfigurationManager> xUICfgManager =
963  xModuleCfgSupplier->getUIConfigurationManager(m_sModuleLongName);
964  m_xModule = xUICfgManager->getShortCutManager();
965  }
966  catch(const uno::RuntimeException&)
967  {
968  throw;
969  }
970  catch(const uno::Exception&)
971  {
972  m_xContext.clear();
973  }
974 }
975 
976 void SfxAcceleratorConfigPage::Init(const uno::Reference<ui::XAcceleratorConfiguration>& xAccMgr)
977 {
978  if (!xAccMgr.is())
979  return;
980 
982  {
983  uno::Reference<frame::XController> xController;
984  uno::Reference<frame::XModel> xModel;
985  if (m_xFrame.is())
986  xController = m_xFrame->getController();
987  if (xController.is())
988  xModel = xController->getModel();
989 
991  m_xGroupLBox->SetStylesInfo(&m_aStylesInfo);
993  }
994 
995  // Insert all editable accelerators into list box. It is possible
996  // that some accelerators are not mapped on the current system/keyboard
997  // but we don't want to lose these mappings.
998  for (sal_Int32 i1 = 0; i1 < KEYCODE_ARRAY_SIZE; ++i1)
999  {
1000  vcl::KeyCode aKey = KEYCODE_ARRAY[i1];
1001  OUString sKey = aKey.GetName();
1002  if (sKey.isEmpty())
1003  continue;
1004  TAccInfo* pEntry = new TAccInfo(i1, 0/*nListPos*/, aKey);
1005  m_xEntriesBox->append(OUString::number(reinterpret_cast<sal_Int64>(pEntry)), sKey);
1006  int nPos = m_xEntriesBox->n_children() - 1;
1007  m_xEntriesBox->set_text(nPos, OUString(), 1);
1008  m_xEntriesBox->set_sensitive(nPos, true);
1009  }
1010 
1011  // Assign all commands to its shortcuts - reading the accelerator config.
1012  uno::Sequence<awt::KeyEvent> lKeys = xAccMgr->getAllKeyEvents();
1013  sal_Int32 c2 = lKeys.getLength();
1014  sal_Int32 i2 = 0;
1015 
1016  for (i2=0; i2<c2; ++i2)
1017  {
1018  const awt::KeyEvent& aAWTKey = lKeys[i2];
1019  OUString sCommand = xAccMgr->getCommandByKeyEvent(aAWTKey);
1020  OUString sLabel = GetLabel4Command(sCommand);
1022  sal_Int32 nPos = MapKeyCodeToPos(aKeyCode);
1023 
1024  if (nPos == -1)
1025  continue;
1026 
1027  m_xEntriesBox->set_text(nPos, sLabel, 1);
1028 
1029  TAccInfo* pEntry = reinterpret_cast<TAccInfo*>(m_xEntriesBox->get_id(nPos).toInt64());
1030  pEntry->m_bIsConfigurable = true;
1031 
1032  pEntry->m_sCommand = sCommand;
1033  }
1034 
1035  // Map the VCL hardcoded key codes and mark them as not changeable
1037  sal_uLong i3 = 0;
1038  for (i3 = 0; i3 < c3; ++i3)
1039  {
1040  const vcl::KeyCode* pKeyCode = Application::GetReservedKeyCode(i3);
1041  sal_Int32 nPos = MapKeyCodeToPos(*pKeyCode);
1042 
1043  if (nPos == -1)
1044  continue;
1045 
1046  // Hardcoded function mapped so no ID possible and mark entry as not changeable
1047  TAccInfo* pEntry = reinterpret_cast<TAccInfo*>(m_xEntriesBox->get_id(nPos).toInt64());
1048  pEntry->m_bIsConfigurable = false;
1049 
1050  m_xEntriesBox->set_sensitive(nPos, false);
1051  }
1052 }
1053 
1054 void SfxAcceleratorConfigPage::Apply(const uno::Reference<ui::XAcceleratorConfiguration>& xAccMgr)
1055 {
1056  if (!xAccMgr.is())
1057  return;
1058 
1059  // Go through the list from the bottom to the top ...
1060  // because logical accelerator must be preferred instead of
1061  // physical ones!
1062  for (int i = 0, nCount = m_xEntriesBox->n_children(); i < nCount; ++i)
1063  {
1064  TAccInfo* pUserData = reinterpret_cast<TAccInfo*>(m_xEntriesBox->get_id(i).toInt64());
1065  OUString sCommand;
1066  awt::KeyEvent aAWTKey;
1067 
1068  if (pUserData)
1069  {
1070  sCommand = pUserData->m_sCommand;
1071  aAWTKey = svt::AcceleratorExecute::st_VCLKey2AWTKey(pUserData->m_aKey);
1072  }
1073 
1074  try
1075  {
1076  if (!sCommand.isEmpty())
1077  xAccMgr->setKeyEvent(aAWTKey, sCommand);
1078  else
1079  xAccMgr->removeKeyEvent(aAWTKey);
1080  }
1081  catch (const uno::RuntimeException&)
1082  {
1083  throw;
1084  }
1085  catch (const uno::Exception&)
1086  {
1087  }
1088  }
1089 }
1090 
1092 {
1093  m_xEntriesBox->clear();
1094 }
1095 
1097 {
1098  SelectHdl(m_xGroupLBox->get_widget());
1099 }
1100 
1102 {
1103  m_aUpdateDataTimer.Start();
1104 }
1105 
1107 {
1108  if (m_aUpdateDataTimer.IsActive())
1109  {
1110  m_aUpdateDataTimer.Stop();
1111  m_aUpdateDataTimer.Invoke();
1112  }
1113 }
1114 
1116 {
1117  // ask for filename, where we should load the new config data from
1118  StartFileDialog( StartFileDialogType::Open, aLoadAccelConfigStr );
1119 }
1120 
1122 {
1123  StartFileDialog( StartFileDialogType::SaveAs, aSaveAccelConfigStr );
1124 }
1125 
1127 {
1128  uno::Reference<form::XReset> xReset(m_xAct, uno::UNO_QUERY);
1129  if (xReset.is())
1130  xReset->reset();
1131 
1132  m_xEntriesBox->freeze();
1133  ResetConfig();
1134  Init(m_xAct);
1135  m_xEntriesBox->thaw();
1136  m_xEntriesBox->select(0);
1137  SelectHdl(*m_xEntriesBox);
1138 }
1139 
1141 {
1142  int nPos = m_xEntriesBox->get_selected_index();
1143  if (nPos == -1)
1144  return;
1145 
1146  TAccInfo* pEntry = reinterpret_cast<TAccInfo*>(m_xEntriesBox->get_id(nPos).toInt64());
1147  OUString sNewCommand = m_xFunctionBox->GetCurCommand();
1148  OUString sLabel = m_xFunctionBox->GetCurLabel();
1149  if (sLabel.isEmpty())
1150  sLabel = GetLabel4Command(sNewCommand);
1151 
1152  pEntry->m_sCommand = sNewCommand;
1153  m_xEntriesBox->set_text(nPos, sLabel, 1);
1154 
1155  SelectHdl(m_xFunctionBox->get_widget());
1156 }
1157 
1159 {
1160  // get selected entry
1161  int nPos = m_xEntriesBox->get_selected_index();
1162  if (nPos == -1)
1163  return;
1164 
1165  TAccInfo* pEntry = reinterpret_cast<TAccInfo*>(m_xEntriesBox->get_id(nPos).toInt64());
1166 
1167  // remove function name from selected entry
1168  m_xEntriesBox->set_text(nPos, OUString(), 1);
1169  pEntry->m_sCommand.clear();
1170 
1171  SelectHdl(m_xFunctionBox->get_widget());
1172 }
1173 
1175 {
1176  if (&rListBox == m_xEntriesBox.get())
1177  {
1178  TAccInfo* pEntry = reinterpret_cast<TAccInfo*>(m_xEntriesBox->get_selected_id().toInt64());
1179 
1180  OUString sPossibleNewCommand = m_xFunctionBox->GetCurCommand();
1181 
1182  m_xRemoveButton->set_sensitive( false );
1183  m_xChangeButton->set_sensitive( false );
1184 
1185  if (pEntry->m_bIsConfigurable)
1186  {
1187  if (pEntry->isConfigured())
1188  m_xRemoveButton->set_sensitive(true);
1189  m_xChangeButton->set_sensitive( pEntry->m_sCommand != sPossibleNewCommand );
1190  }
1191  }
1192  else if (&rListBox == &m_xGroupLBox->get_widget())
1193  {
1194  m_xGroupLBox->GroupSelected();
1195 
1196  // Pause redraw (Do not redraw at each removal)
1197  m_xFunctionBox->freeze();
1198  // Apply the search filter to the functions list
1199  OUString aSearchTerm(m_xSearchEdit->get_text());
1200  int nMatchFound = applySearchFilter(aSearchTerm);
1201  // Resume redraw
1202  m_xFunctionBox->thaw();
1203  if (nMatchFound != -1)
1204  {
1205  m_xFunctionBox->select(nMatchFound);
1206  SelectHdl(m_xFunctionBox->get_widget());
1207  }
1208  else
1209  {
1210  m_xKeyBox->clear();
1211  m_xChangeButton->set_sensitive(false);
1212  }
1213  }
1214  else if (&rListBox == &m_xFunctionBox->get_widget())
1215  {
1216  m_xRemoveButton->set_sensitive( false );
1217  m_xChangeButton->set_sensitive( false );
1218 
1219  // #i36994 First selected can return zero!
1220  TAccInfo* pEntry = reinterpret_cast<TAccInfo*>(m_xEntriesBox->get_selected_id().toInt64());
1221  if (pEntry)
1222  {
1223  OUString sPossibleNewCommand = m_xFunctionBox->GetCurCommand();
1224 
1225  if (pEntry->m_bIsConfigurable)
1226  {
1227  if (pEntry->isConfigured())
1228  m_xRemoveButton->set_sensitive(true);
1229  m_xChangeButton->set_sensitive( pEntry->m_sCommand != sPossibleNewCommand );
1230  }
1231 
1232  // update key box
1233  m_xKeyBox->clear();
1234  for (int i = 0, nCount = m_xEntriesBox->n_children(); i < nCount; ++i)
1235  {
1236  TAccInfo* pUserData = reinterpret_cast<TAccInfo*>(m_xEntriesBox->get_id(i).toInt64());
1237  if (pUserData && pUserData->m_sCommand == sPossibleNewCommand)
1238  {
1239  m_xKeyBox->append(OUString::number(reinterpret_cast<sal_Int64>(pUserData)), pUserData->m_aKey.GetName());
1240  }
1241  }
1242  }
1243  }
1244  else
1245  {
1246  // goto selected "key" entry of the key box
1247  int nP2 = -1;
1248  TAccInfo* pU2 = reinterpret_cast<TAccInfo*>(m_xKeyBox->get_selected_id().toInt64());
1249  if (pU2)
1250  nP2 = MapKeyCodeToPos(pU2->m_aKey);
1251  if (nP2 != -1)
1252  {
1253  m_xEntriesBox->select(nP2);
1254  m_xEntriesBox->scroll_to_row(nP2);
1255  SelectHdl(*m_xEntriesBox);
1256  }
1257  }
1258 }
1259 
1261 {
1262  uno::Reference<ui::XAcceleratorConfiguration> xOld = m_xAct;
1263 
1264  if (m_xOfficeButton->get_active())
1265  m_xAct = m_xGlobal;
1266  else if (m_xModuleButton->get_active())
1267  m_xAct = m_xModule;
1268 
1269  // nothing changed? => do nothing!
1270  if ( m_xAct.is() && ( xOld == m_xAct ) )
1271  return;
1272 
1273  m_xEntriesBox->freeze();
1274  ResetConfig();
1275  Init(m_xAct);
1276  m_xEntriesBox->thaw();
1277 
1278  m_xGroupLBox->Init(m_xContext, m_xFrame, m_sModuleLongName, true);
1279 
1280  // pb: #133213# do not select NULL entries
1281  if (m_xEntriesBox->n_children())
1282  m_xEntriesBox->select(0);
1283 
1284  m_aFillGroupIdle.Start();
1285 }
1286 
1288 {
1289  // activating the selection, typically "all commands", can take a long time
1290  // -> show wait cursor and disable input
1291  weld::WaitObject aWaitObject(GetFrameWeld());
1292 
1293  weld::TreeView& rTreeView = m_xGroupLBox->get_widget();
1294  SelectHdl(rTreeView);
1295 }
1296 
1298 {
1299  assert(m_pFileDlg);
1300 
1301  OUString sCfgName;
1302  if ( ERRCODE_NONE == m_pFileDlg->GetError() )
1303  sCfgName = m_pFileDlg->GetPath();
1304 
1305  if ( sCfgName.isEmpty() )
1306  return;
1307 
1308  weld::WaitObject aWaitObject(GetFrameWeld());
1309 
1310  uno::Reference<ui::XUIConfigurationManager> xCfgMgr;
1311  uno::Reference<embed::XStorage> xRootStorage; // we must hold the root storage alive, if xCfgMgr is used!
1312 
1313  try
1314  {
1315  // don't forget to release the storage afterwards!
1316  uno::Reference<lang::XSingleServiceFactory> xStorageFactory(embed::StorageFactory::create(m_xContext));
1317  uno::Sequence<uno::Any> lArgs(2);
1318  lArgs[0] <<= sCfgName;
1319  lArgs[1] <<= css::embed::ElementModes::READ;
1320 
1321  xRootStorage.set(xStorageFactory->createInstanceWithArguments(lArgs), uno::UNO_QUERY_THROW);
1322  uno::Reference<embed::XStorage> xUIConfig = xRootStorage->openStorageElement(FOLDERNAME_UICONFIG, embed::ElementModes::READ);
1323  if (xUIConfig.is())
1324  {
1325  uno::Reference<ui::XUIConfigurationManager2> xCfgMgr2 = ui::UIConfigurationManager::create(m_xContext);
1326  xCfgMgr2->setStorage(xUIConfig);
1327  xCfgMgr.set(xCfgMgr2, uno::UNO_QUERY_THROW);
1328  }
1329 
1330  if (xCfgMgr.is())
1331  {
1332  // open the configuration and update our UI
1333  uno::Reference<ui::XAcceleratorConfiguration> xTempAccMgr(xCfgMgr->getShortCutManager(), uno::UNO_SET_THROW);
1334 
1335  m_xEntriesBox->freeze();
1336  ResetConfig();
1337  Init(xTempAccMgr);
1338  m_xEntriesBox->thaw();
1339  if (m_xEntriesBox->n_children())
1340  {
1341  m_xEntriesBox->select(0);
1342  SelectHdl(m_xFunctionBox->get_widget());
1343  }
1344  }
1345 
1346  // don't forget to close the new opened storage!
1347  // We are the owner of it.
1348  if (xRootStorage.is())
1349  {
1350  uno::Reference<lang::XComponent> xComponent;
1351  xComponent.set(xCfgMgr, uno::UNO_QUERY);
1352  if (xComponent.is())
1353  xComponent->dispose();
1354  xRootStorage->dispose();
1355  }
1356  }
1357  catch(const uno::RuntimeException&)
1358  {
1359  throw;
1360  }
1361  catch(const uno::Exception&)
1362  {}
1363 }
1364 
1366 {
1367  assert(m_pFileDlg);
1368 
1369  OUString sCfgName;
1370  if ( ERRCODE_NONE == m_pFileDlg->GetError() )
1371  sCfgName = m_pFileDlg->GetPath();
1372 
1373  if ( sCfgName.isEmpty() )
1374  return;
1375 
1376  weld::WaitObject aWaitObject(GetFrameWeld());
1377 
1378  uno::Reference<embed::XStorage> xRootStorage;
1379 
1380  try
1381  {
1382  uno::Reference<lang::XSingleServiceFactory> xStorageFactory(embed::StorageFactory::create(m_xContext));
1383  uno::Sequence<uno::Any> lArgs(2);
1384  lArgs[0] <<= sCfgName;
1385  lArgs[1] <<= embed::ElementModes::WRITE;
1386 
1387  xRootStorage.set( xStorageFactory->createInstanceWithArguments(lArgs),
1388  uno::UNO_QUERY_THROW);
1389 
1390  uno::Reference<embed::XStorage> xUIConfig(
1391  xRootStorage->openStorageElement(FOLDERNAME_UICONFIG, embed::ElementModes::WRITE),
1392  uno::UNO_SET_THROW);
1393  uno::Reference<beans::XPropertySet> xUIConfigProps(
1394  xUIConfig,
1395  uno::UNO_QUERY_THROW);
1396 
1397  // set the correct media type if the storage was new created
1398  OUString sMediaType;
1399  xUIConfigProps->getPropertyValue(MEDIATYPE_PROPNAME) >>= sMediaType;
1400  if (sMediaType.isEmpty())
1401  xUIConfigProps->setPropertyValue(MEDIATYPE_PROPNAME, uno::Any(OUString("application/vnd.sun.xml.ui.configuration")));
1402 
1403  uno::Reference<ui::XUIConfigurationManager2> xCfgMgr = ui::UIConfigurationManager::create(m_xContext);
1404  xCfgMgr->setStorage(xUIConfig);
1405 
1406  // get the target configuration access and update with all shortcuts
1407  // which are set currently at the UI!
1408  // Don't copy the m_xAct content to it... because m_xAct will be updated
1409  // from the UI on pressing the button "OK" only. And inbetween it's not up to date!
1410  uno::Reference<ui::XAcceleratorConfiguration> xTargetAccMgr(xCfgMgr->getShortCutManager(), uno::UNO_SET_THROW);
1411  Apply(xTargetAccMgr);
1412 
1413  // commit (order is important!)
1414  uno::Reference<ui::XUIConfigurationPersistence> xCommit1(xTargetAccMgr, uno::UNO_QUERY_THROW);
1415  uno::Reference<ui::XUIConfigurationPersistence> xCommit2(xCfgMgr , uno::UNO_QUERY_THROW);
1416  xCommit1->store();
1417  xCommit2->store();
1418 
1419  if (xRootStorage.is())
1420  {
1421  // Commit root storage
1422  uno::Reference<embed::XTransactedObject> xCommit3(xRootStorage, uno::UNO_QUERY_THROW);
1423  xCommit3->commit();
1424  }
1425 
1426  if (xRootStorage.is())
1427  {
1428  if (xCfgMgr.is())
1429  xCfgMgr->dispose();
1430  xRootStorage->dispose();
1431  }
1432  }
1433  catch(const uno::RuntimeException&)
1434  {
1435  throw;
1436  }
1437  catch(const uno::Exception&)
1438  {}
1439 }
1440 
1442 {
1443  bool bSave = nType == StartFileDialogType::SaveAs;
1444  short nDialogType = bSave ? ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION
1445  : ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE;
1446  m_pFileDlg.reset(new sfx2::FileDialogHelper(nDialogType, FileDialogFlags::NONE, GetFrameWeld()));
1447 
1448  m_pFileDlg->SetTitle( rTitle );
1450  m_pFileDlg->AddFilter( aFilterCfgStr, "*.cfg" );
1451  m_pFileDlg->SetCurrentFilter( aFilterCfgStr );
1452 
1453  Link<sfx2::FileDialogHelper*,void> aDlgClosedLink = bSave ? LINK( this, SfxAcceleratorConfigPage, SaveHdl )
1454  : LINK( this, SfxAcceleratorConfigPage, LoadHdl );
1455  m_pFileDlg->StartExecuteModal( aDlgClosedLink );
1456 }
1457 
1458 
1460 {
1461  Apply(m_xAct);
1462  try
1463  {
1464  m_xAct->store();
1465  }
1466  catch(const uno::RuntimeException&)
1467  {
1468  throw;
1469  }
1470  catch(const uno::Exception&)
1471  {
1472  return false;
1473  }
1474 
1475  return true;
1476 }
1477 
1478 
1480 {
1481  // open accelerator configs
1482  // Note: It initialize some other members too, which are needed here ...
1483  // e.g. m_sModuleUIName!
1484  InitAccCfg();
1485 
1486  // change the description of the radio button, which switch to the module
1487  // dependent accelerator configuration
1488  OUString sButtonText = m_xModuleButton->get_label();
1489  sButtonText = m_xModuleButton->strip_mnemonic(sButtonText).replaceFirst("$(MODULE)", m_sModuleUIName);
1490  m_xModuleButton->set_label(sButtonText);
1491 
1492  if (m_xModule.is())
1493  m_xModuleButton->set_active(true);
1494  else
1495  {
1496  m_xModuleButton->hide();
1497  m_xOfficeButton->set_active(true);
1498  }
1499 
1500  RadioHdl(*m_xOfficeButton);
1501 
1502  const SfxPoolItem* pMacroItem=nullptr;
1503  if( SfxItemState::SET == rSet->GetItemState( SID_MACROINFO, true, &pMacroItem ) )
1504  {
1505  m_pMacroInfoItem = &dynamic_cast<const SfxMacroInfoItem&>(*pMacroItem);
1506  m_xGroupLBox->SelectMacro( m_pMacroInfoItem );
1507  }
1508 }
1509 
1511 {
1512  sal_uInt16 nCode1 = aKey.GetCode() + aKey.GetModifier();
1513  for (int i = 0, nCount = m_xEntriesBox->n_children(); i < nCount; ++i)
1514  {
1515  TAccInfo* pUserData = reinterpret_cast<TAccInfo*>(m_xEntriesBox->get_id(i).toInt64());
1516  if (pUserData)
1517  {
1518  sal_uInt16 nCode2 = pUserData->m_aKey.GetCode()+pUserData->m_aKey.GetModifier();
1519  if (nCode1 == nCode2)
1520  return i;
1521  }
1522  }
1523 
1524  return -1;
1525 }
1526 
1527 
1528 OUString SfxAcceleratorConfigPage::GetLabel4Command(const OUString& sCommand)
1529 {
1530  try
1531  {
1532  // check global command configuration first
1533  uno::Reference<container::XNameAccess> xModuleConf;
1534  m_xUICmdDescription->getByName(m_sModuleLongName) >>= xModuleConf;
1535  if (xModuleConf.is())
1536  {
1537  ::comphelper::SequenceAsHashMap lProps(xModuleConf->getByName(sCommand));
1538  OUString sLabel = lProps.getUnpackedValueOrDefault("Name", OUString());
1539  if (!sLabel.isEmpty())
1540  return sLabel;
1541  }
1542  }
1543  catch(const uno::RuntimeException&)
1544  {
1545  throw;
1546  }
1547  catch(const uno::Exception&)
1548  {}
1549 
1550  // may be it's a style URL .. they must be handled special
1551  SfxStyleInfo_Impl aStyle;
1552  aStyle.sCommand = sCommand;
1554  {
1555  m_aStylesInfo.getLabel4Style(aStyle);
1556  return aStyle.sLabel;
1557  }
1558 
1559  return sCommand;
1560 }
1561 
1562 /*
1563  * Remove entries which doesn't contain the search term
1564  */
1565 int SfxAcceleratorConfigPage::applySearchFilter(OUString const & rSearchTerm)
1566 {
1567  if (rSearchTerm.isEmpty())
1568  return -1;
1569 
1570  m_options.searchString = rSearchTerm;
1571  utl::TextSearch textSearch( m_options );
1572 
1573  for (int i = m_xFunctionBox->n_children(); i > 0; --i)
1574  {
1575  int nEntry = i - 1;
1576  OUString aStr = m_xFunctionBox->get_text(nEntry);
1577  sal_Int32 aStartPos = 0;
1578  sal_Int32 aEndPos = aStr.getLength();
1579 
1580  if (!textSearch.SearchForward( aStr, &aStartPos, &aEndPos ))
1581  m_xFunctionBox->remove(nEntry);
1582  }
1583 
1584  return m_xFunctionBox->n_children() ? 0 : -1;
1585 }
1586 
1587 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
#define KEY_V
#define KEY_COPY
#define KEY_SUBTRACT
#define KEY_3
#define KEY_F2
IMPL_LINK_NOARG(SfxAcceleratorConfigPage, ImplUpdateDataHdl, Timer *, void)
Definition: acccfg.cxx:1096
#define KEY_BACKSPACE
void Apply(const css::uno::Reference< css::ui::XAcceleratorConfiguration > &pAccMgr)
Definition: acccfg.cxx:1054
#define KEY_DELETE
#define KEY_CUT
void Init()
#define KEY_PROPERTIES
static const char FOLDERNAME_UICONFIG[]
Definition: acccfg.cxx:71
#define KEY_SPACE
#define KEY_PASTE
OUString GetLabel4Command(const OUString &rCommand)
Definition: acccfg.cxx:1528
void Init(const css::uno::Reference< css::ui::XAcceleratorConfiguration > &pAccMgr)
Definition: acccfg.cxx:976
#define KEY_K
#define KEY_TAB
#define FILEDIALOG_FILTER_ALL
#define KEY_PAGEDOWN
#define KEY_F4
#define KEY_5
#define KEY_F15
#define KEY_PAGEUP
bool isConfigured() const
Definition: acccfg.hxx:53
#define KEY_C
#define KEY_F1
sal_uIntPtr sal_uLong
std::unique_ptr< weld::Button > m_xLoadButton
Definition: acccfg.hxx:110
#define KEY_4
static css::awt::KeyEvent st_VCLKey2AWTKey(const vcl::KeyCode &aKey)
#define KEY_SHIFT
#define KEY_F16
IMPL_LINK(SfxAcceleratorConfigPage, KeyInputHdl, const KeyEvent &, rKey, bool)
select the entry, which match the current key input ...
Definition: acccfg.cxx:786
#define KEY_BRACKETRIGHT
#define KEY_0
static const sal_uInt16 KEYCODE_ARRAY_SIZE
Definition: acccfg.cxx:781
#define KEY_MOD1
css::uno::Reference< css::frame::XFrame > m_xFrame
Definition: acccfg.hxx:90
const SfxMacroInfoItem * m_pMacroInfoItem
Definition: acccfg.hxx:75
void getLabel4Style(SfxStyleInfo_Impl &aStyle)
Definition: cfgutil.cxx:118
OUString m_sModuleUIName
Definition: acccfg.hxx:93
#define KEY_W
sal_uInt16 GetCode() const
#define KEY_UNDO
OUString m_sModuleLongName
Definition: acccfg.hxx:92
std::unique_ptr< weld::RadioButton > m_xModuleButton
Definition: acccfg.hxx:103
std::unique_ptr< CuiConfigGroupListBox > m_xGroupLBox
Definition: acccfg.hxx:106
SfxStylesInfo_Impl m_aStylesInfo
Definition: acccfg.hxx:82
#define KEY_MOD3
#define KEY_LEFT
css::uno::Reference< css::ui::XAcceleratorConfiguration > m_xAct
Definition: acccfg.hxx:88
#define KEY_ADD
#define KEY_Y
#define KEY_F5
std::unique_ptr< CuiConfigFunctionListBox > m_xFunctionBox
Definition: acccfg.hxx:107
std::unique_ptr< weld::Entry > m_xSearchEdit
Definition: acccfg.hxx:109
#define KEY_F9
Reference< XController > xController
#define KEY_F
#define KEY_MOD2
#define KEY_D
#define KEY_L
#define KEY_CONTEXTMENU
#define KEY_HELP
static vcl::KeyCode st_AWTKey2VCLKey(const css::awt::KeyEvent &aKey)
#define KEY_A
sal_uInt16 GetModifier() const
std::unique_ptr< weld::Button > m_xSaveButton
Definition: acccfg.hxx:111
#define KEY_J
#define KEY_H
#define KEY_8
static const sal_uInt16 KEYCODE_ARRAY[]
Definition: acccfg.cxx:75
#define KEY_9
OUString m_sCommand
Definition: acccfg.hxx:61
css::uno::Reference< css::lang::XComponent > xComponent
#define SAL_N_ELEMENTS(arr)
bool SearchForward(const OUString &rStr, sal_Int32 *pStart, sal_Int32 *pEnd, css::util::SearchResult *pRes=nullptr)
OUString sLabel
Definition: cfgutil.hxx:43
#define KEY_N
#define KEY_1
#define KEY_7
std::unique_ptr< weld::TreeView > m_xKeyBox
Definition: acccfg.hxx:108
TValueType getUnpackedValueOrDefault(const OUString &sKey, const TValueType &aDefault) const
std::unique_ptr< weld::Button > m_xResetButton
Definition: acccfg.hxx:112
static const vcl::KeyCode * GetReservedKeyCode(sal_uLong i)
#define KEY_O
#define KEY_R
css::uno::Reference< css::frame::XFrame > GetFrame() const
SfxItemState GetItemState(sal_uInt16 nWhich, bool bSrchInParent=true, const SfxPoolItem **ppItem=nullptr) const
#define KEY_I
#define KEY_BRACKETLEFT
TransliterationFlags transliterateFlags
int i
#define KEY_ESCAPE
#define KEY_B
#define KEY_F8
sal_Int32 MapKeyCodeToPos(const vcl::KeyCode &rCode) const
Definition: acccfg.cxx:1510
OUString GetName(vcl::Window *pWindow=nullptr) const
vcl::KeyCode m_aKey
Definition: acccfg.hxx:62
#define KEY_COMMA
OUString sCommand
Definition: cfgutil.hxx:42
void init(const OUString &rModuleName, const css::uno::Reference< css::frame::XModel > &xModel)
Definition: cfgutil.cxx:65
#define KEY_Z
void SetTimeout(sal_uInt64 nTimeoutMs)
#define KEY_T
virtual ~SfxAcceleratorConfigPage() override
Definition: acccfg.cxx:914
OUString CuiResId(const char *pKey)
Definition: cuiresmgr.cxx:23
#define KEY_END
#define KEY_F12
#define KEY_DIVIDE
#define KEY_F7
css::uno::Reference< css::container::XNameAccess > m_xUICmdDescription
Definition: acccfg.hxx:89
#define KEY_SEMICOLON
#define KEY_RETURN
static const char MEDIATYPE_PROPNAME[]
Definition: acccfg.cxx:73
#define KEY_6
#define KEY_Q
#define KEY_M
weld::Window * GetFrameWeld() const
StartFileDialogType
#define KEY_DOWN
std::unique_ptr< weld::Button > m_xRemoveButton
Definition: acccfg.hxx:105
void Stop()
#define KEY_X
i18nutil::SearchOptions2 m_options
Definition: acccfg.hxx:97
#define KEY_TILDE
#define KEY_MULTIPLY
#define KEY_G
#define ERRCODE_NONE
std::unique_ptr< weld::Button > m_xChangeButton
Definition: acccfg.hxx:104
#define KEY_F10
#define KEY_EQUAL
std::unique_ptr< sfx2::FileDialogHelper > m_pFileDlg
Definition: acccfg.hxx:76
#define KEY_F14
virtual void Reset(const SfxItemSet *) override
Definition: acccfg.cxx:1479
#define EDIT_UPDATEDATA_TIMEOUT
int applySearchFilter(OUString const &rSearchTerm)
Definition: acccfg.cxx:1565
css::uno::Reference< css::ui::XAcceleratorConfiguration > m_xModule
Definition: acccfg.hxx:87
#define KEY_S
#define KEY_OPEN
#define KEY_FIND
Reference< XComponentContext > getProcessComponentContext()
void SetInvokeHandler(const Link< Timer *, void > &rLink)
css::uno::Reference< css::uno::XComponentContext > m_xContext
Definition: acccfg.hxx:85
#define KEY_U
static bool parseStyleCommand(SfxStyleInfo_Impl &aStyle)
Definition: cfgutil.cxx:85
std::unique_ptr< weld::TreeView > m_xEntriesBox
Definition: acccfg.hxx:101
#define KEY_F6
virtual bool FillItemSet(SfxItemSet *) override
Definition: acccfg.cxx:1459
#define KEY_HOME
void StartFileDialog(StartFileDialogType nType, const OUString &rTitle)
Definition: acccfg.cxx:1441
#define KEY_INSERT
Reference< XModel > xModel
void SetPriority(TaskPriority ePriority)
SfxAcceleratorConfigPage(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet &rItemSet)
Definition: acccfg.cxx:824
#define KEY_REPEAT
css::uno::Reference< css::ui::XAcceleratorConfiguration > m_xGlobal
Definition: acccfg.hxx:86
#define KEY_POINT
#define KEY_P
static sal_uLong GetReservedKeyCodeCount()
sal_Int32 nPos
#define KEY_F13
weld::Window * GetFrameWeld(const SfxFrame *pFrame)
aStr
#define KEY_RIGHT
OUString SfxResId(const char *pId)
#define KEY_F11
bool m_bIsConfigurable
Definition: acccfg.hxx:60
#define KEY_E
#define KEY_FRONT
std::unique_ptr< weld::RadioButton > m_xOfficeButton
Definition: acccfg.hxx:102
#define KEY_2
const uno::Reference< uno::XComponentContext > m_xContext
void SetDebugName(const sal_Char *pDebugName)
#define KEY_MENU
#define KEY_UP
#define KEY_F3
#define KEY_QUOTERIGHT