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