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 // include own files
21 
22 #include <acccfg.hxx>
23 #include <cfgutil.hxx>
24 #include <dialmgr.hxx>
25 
26 #include <sfx2/filedlghelper.hxx>
27 #include <sfx2/minfitem.hxx>
28 #include <sfx2/sfxresid.hxx>
29 
30 #include <sal/macros.h>
31 #include <vcl/event.hxx>
32 
33 #include <strings.hrc>
34 #include <sfx2/strings.hrc>
35 #include <svx/svxids.hrc>
36 
37 // include interface declarations
38 #include <com/sun/star/beans/XPropertySet.hpp>
39 #include <com/sun/star/embed/StorageFactory.hpp>
40 #include <com/sun/star/embed/XTransactedObject.hpp>
41 #include <com/sun/star/embed/ElementModes.hpp>
42 #include <com/sun/star/form/XReset.hpp>
43 #include <com/sun/star/frame/Desktop.hpp>
44 #include <com/sun/star/frame/XController.hpp>
45 #include <com/sun/star/frame/XModel.hpp>
46 #include <com/sun/star/frame/ModuleManager.hpp>
47 #include <com/sun/star/frame/theUICommandDescription.hpp>
48 #include <com/sun/star/ui/GlobalAcceleratorConfiguration.hpp>
49 #include <com/sun/star/ui/theModuleUIConfigurationManagerSupplier.hpp>
50 #include <com/sun/star/ui/UIConfigurationManager.hpp>
51 #include <com/sun/star/ui/XUIConfigurationManager.hpp>
52 #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
53 
54 // include search util
55 #include <com/sun/star/util/SearchFlags.hpp>
56 #include <com/sun/star/util/SearchAlgorithms2.hpp>
57 #include <unotools/textsearch.hxx>
58 
59 // include other projects
62 #include <vcl/svapp.hxx>
64 #include <config_features.h>
65 
66 // namespaces
67 
68 using namespace css;
69 
70 constexpr OUStringLiteral FOLDERNAME_UICONFIG = u"Configurations2";
71 
72 constexpr OUStringLiteral MEDIATYPE_PROPNAME = u"MediaType";
73 
74 const sal_uInt16 KEYCODE_ARRAY[] = { KEY_F1,
75  KEY_F2,
76  KEY_F3,
77  KEY_F4,
78  KEY_F5,
79  KEY_F6,
80  KEY_F7,
81  KEY_F8,
82  KEY_F9,
83  KEY_F10,
84  KEY_F11,
85  KEY_F12,
86  KEY_F13,
87  KEY_F14,
88  KEY_F15,
89  KEY_F16,
90 
91  KEY_DOWN,
92  KEY_UP,
93  KEY_LEFT,
94  KEY_RIGHT,
95  KEY_HOME,
96  KEY_END,
97  KEY_PAGEUP,
99  KEY_RETURN,
100  KEY_ESCAPE,
102  KEY_INSERT,
103  KEY_DELETE,
104 
105  KEY_OPEN,
106  KEY_CUT,
107  KEY_COPY,
108  KEY_PASTE,
109  KEY_UNDO,
110  KEY_REPEAT,
111  KEY_FIND,
113  KEY_FRONT,
115  KEY_MENU,
116  KEY_HELP,
117 
118  KEY_SHIFT | KEY_F1,
119  KEY_SHIFT | KEY_F2,
120  KEY_SHIFT | KEY_F3,
121  KEY_SHIFT | KEY_F4,
122  KEY_SHIFT | KEY_F5,
123  KEY_SHIFT | KEY_F6,
124  KEY_SHIFT | KEY_F7,
125  KEY_SHIFT | KEY_F8,
126  KEY_SHIFT | KEY_F9,
127  KEY_SHIFT | KEY_F10,
128  KEY_SHIFT | KEY_F11,
129  KEY_SHIFT | KEY_F12,
130  KEY_SHIFT | KEY_F13,
131  KEY_SHIFT | KEY_F14,
132  KEY_SHIFT | KEY_F15,
133  KEY_SHIFT | KEY_F16,
134 
135  KEY_SHIFT | KEY_DOWN,
136  KEY_SHIFT | KEY_UP,
137  KEY_SHIFT | KEY_LEFT,
138  KEY_SHIFT | KEY_RIGHT,
139  KEY_SHIFT | KEY_HOME,
140  KEY_SHIFT | KEY_END,
141  KEY_SHIFT | KEY_PAGEUP,
142  KEY_SHIFT | KEY_PAGEDOWN,
143  KEY_SHIFT | KEY_RETURN,
145  KEY_SHIFT | KEY_ESCAPE,
146  KEY_SHIFT | KEY_BACKSPACE,
147  KEY_SHIFT | KEY_INSERT,
148  KEY_SHIFT | KEY_DELETE,
150 
151  KEY_MOD1 | KEY_0,
152  KEY_MOD1 | KEY_1,
153  KEY_MOD1 | KEY_2,
154  KEY_MOD1 | KEY_3,
155  KEY_MOD1 | KEY_4,
156  KEY_MOD1 | KEY_5,
157  KEY_MOD1 | KEY_6,
158  KEY_MOD1 | KEY_7,
159  KEY_MOD1 | KEY_8,
160  KEY_MOD1 | KEY_9,
161  KEY_MOD1 | KEY_A,
162  KEY_MOD1 | KEY_B,
163  KEY_MOD1 | KEY_C,
164  KEY_MOD1 | KEY_D,
165  KEY_MOD1 | KEY_E,
166  KEY_MOD1 | KEY_F,
167  KEY_MOD1 | KEY_G,
168  KEY_MOD1 | KEY_H,
169  KEY_MOD1 | KEY_I,
170  KEY_MOD1 | KEY_J,
171  KEY_MOD1 | KEY_K,
172  KEY_MOD1 | KEY_L,
173  KEY_MOD1 | KEY_M,
174  KEY_MOD1 | KEY_N,
175  KEY_MOD1 | KEY_O,
176  KEY_MOD1 | KEY_P,
177  KEY_MOD1 | KEY_Q,
178  KEY_MOD1 | KEY_R,
179  KEY_MOD1 | KEY_S,
180  KEY_MOD1 | KEY_T,
181  KEY_MOD1 | KEY_U,
182  KEY_MOD1 | KEY_V,
183  KEY_MOD1 | KEY_W,
184  KEY_MOD1 | KEY_X,
185  KEY_MOD1 | KEY_Y,
186  KEY_MOD1 | KEY_Z,
195  KEY_MOD1 | KEY_TAB,
196 
197  KEY_MOD1 | KEY_F1,
198  KEY_MOD1 | KEY_F2,
199  KEY_MOD1 | KEY_F3,
200  KEY_MOD1 | KEY_F4,
201  KEY_MOD1 | KEY_F5,
202  KEY_MOD1 | KEY_F6,
203  KEY_MOD1 | KEY_F7,
204  KEY_MOD1 | KEY_F8,
205  KEY_MOD1 | KEY_F9,
206  KEY_MOD1 | KEY_F10,
207  KEY_MOD1 | KEY_F11,
208  KEY_MOD1 | KEY_F12,
209  KEY_MOD1 | KEY_F13,
210  KEY_MOD1 | KEY_F14,
211  KEY_MOD1 | KEY_F15,
212  KEY_MOD1 | KEY_F16,
213 
214  KEY_MOD1 | KEY_DOWN,
215  KEY_MOD1 | KEY_UP,
216  KEY_MOD1 | KEY_LEFT,
217  KEY_MOD1 | KEY_RIGHT,
218  KEY_MOD1 | KEY_HOME,
219  KEY_MOD1 | KEY_END,
220  KEY_MOD1 | KEY_PAGEUP,
221  KEY_MOD1 | KEY_PAGEDOWN,
222  KEY_MOD1 | KEY_RETURN,
224  KEY_MOD1 | KEY_BACKSPACE,
225  KEY_MOD1 | KEY_INSERT,
226  KEY_MOD1 | KEY_DELETE,
227 
228  KEY_MOD1 | KEY_ADD,
233 
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,
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 
434 
436  KEY_SHIFT | KEY_MOD2 | KEY_F2,
437  KEY_SHIFT | KEY_MOD2 | KEY_F3,
438  KEY_SHIFT | KEY_MOD2 | KEY_F4,
439  KEY_SHIFT | KEY_MOD2 | KEY_F5,
440  KEY_SHIFT | KEY_MOD2 | KEY_F6,
441  KEY_SHIFT | KEY_MOD2 | KEY_F7,
442  KEY_SHIFT | KEY_MOD2 | KEY_F8,
443  KEY_SHIFT | KEY_MOD2 | KEY_F9,
444  KEY_SHIFT | KEY_MOD2 | KEY_F10,
445  KEY_SHIFT | KEY_MOD2 | KEY_F11,
446  KEY_SHIFT | KEY_MOD2 | KEY_F12,
447  KEY_SHIFT | KEY_MOD2 | KEY_F13,
448  KEY_SHIFT | KEY_MOD2 | KEY_F14,
449  KEY_SHIFT | KEY_MOD2 | KEY_F15,
450  KEY_SHIFT | KEY_MOD2 | KEY_F16,
451 
452  KEY_SHIFT | KEY_MOD2 | KEY_DOWN,
453  KEY_SHIFT | KEY_MOD2 | KEY_UP,
454  KEY_SHIFT | KEY_MOD2 | KEY_LEFT,
455  KEY_SHIFT | KEY_MOD2 | KEY_RIGHT,
456  KEY_SHIFT | KEY_MOD2 | KEY_HOME,
457  KEY_SHIFT | KEY_MOD2 | KEY_END,
458  KEY_SHIFT | KEY_MOD2 | KEY_PAGEUP,
459  KEY_SHIFT | KEY_MOD2 | KEY_PAGEDOWN,
460  KEY_SHIFT | KEY_MOD2 | KEY_RETURN,
461  KEY_SHIFT | KEY_MOD2 | KEY_ESCAPE,
463  KEY_SHIFT | KEY_MOD2 | KEY_BACKSPACE,
464  KEY_SHIFT | KEY_MOD2 | KEY_INSERT,
465  KEY_SHIFT | KEY_MOD2 | KEY_DELETE,
467 
468  KEY_MOD1 | KEY_MOD2 | KEY_0,
469  KEY_MOD1 | KEY_MOD2 | KEY_1,
470  KEY_MOD1 | KEY_MOD2 | KEY_2,
471  KEY_MOD1 | KEY_MOD2 | KEY_3,
472  KEY_MOD1 | KEY_MOD2 | KEY_4,
473  KEY_MOD1 | KEY_MOD2 | KEY_5,
474  KEY_MOD1 | KEY_MOD2 | KEY_6,
475  KEY_MOD1 | KEY_MOD2 | KEY_7,
476  KEY_MOD1 | KEY_MOD2 | KEY_8,
477  KEY_MOD1 | KEY_MOD2 | KEY_9,
478  KEY_MOD1 | KEY_MOD2 | KEY_A,
479  KEY_MOD1 | KEY_MOD2 | KEY_B,
480  KEY_MOD1 | KEY_MOD2 | KEY_C,
481  KEY_MOD1 | KEY_MOD2 | KEY_D,
482  KEY_MOD1 | KEY_MOD2 | KEY_E,
483  KEY_MOD1 | KEY_MOD2 | KEY_F,
484  KEY_MOD1 | KEY_MOD2 | KEY_G,
485  KEY_MOD1 | KEY_MOD2 | KEY_H,
486  KEY_MOD1 | KEY_MOD2 | KEY_I,
487  KEY_MOD1 | KEY_MOD2 | KEY_J,
488  KEY_MOD1 | KEY_MOD2 | KEY_K,
489  KEY_MOD1 | KEY_MOD2 | KEY_L,
490  KEY_MOD1 | KEY_MOD2 | KEY_M,
491  KEY_MOD1 | KEY_MOD2 | KEY_N,
492  KEY_MOD1 | KEY_MOD2 | KEY_O,
493  KEY_MOD1 | KEY_MOD2 | KEY_P,
494  KEY_MOD1 | KEY_MOD2 | KEY_Q,
495  KEY_MOD1 | KEY_MOD2 | KEY_R,
496  KEY_MOD1 | KEY_MOD2 | KEY_S,
497  KEY_MOD1 | KEY_MOD2 | KEY_T,
498  KEY_MOD1 | KEY_MOD2 | KEY_U,
499  KEY_MOD1 | KEY_MOD2 | KEY_V,
500  KEY_MOD1 | KEY_MOD2 | KEY_W,
501  KEY_MOD1 | KEY_MOD2 | KEY_X,
502  KEY_MOD1 | KEY_MOD2 | KEY_Y,
503  KEY_MOD1 | KEY_MOD2 | KEY_Z,
513 
515  KEY_MOD1 | KEY_MOD2 | KEY_F2,
516  KEY_MOD1 | KEY_MOD2 | KEY_F3,
517  KEY_MOD1 | KEY_MOD2 | KEY_F4,
518  KEY_MOD1 | KEY_MOD2 | KEY_F5,
519  KEY_MOD1 | KEY_MOD2 | KEY_F6,
520  KEY_MOD1 | KEY_MOD2 | KEY_F7,
521  KEY_MOD1 | KEY_MOD2 | KEY_F8,
522  KEY_MOD1 | KEY_MOD2 | KEY_F9,
523  KEY_MOD1 | KEY_MOD2 | KEY_F10,
524  KEY_MOD1 | KEY_MOD2 | KEY_F11,
525  KEY_MOD1 | KEY_MOD2 | KEY_F12,
526  KEY_MOD1 | KEY_MOD2 | KEY_F13,
527  KEY_MOD1 | KEY_MOD2 | KEY_F14,
528  KEY_MOD1 | KEY_MOD2 | KEY_F15,
529  KEY_MOD1 | KEY_MOD2 | KEY_F16,
530 
531  KEY_MOD1 | KEY_MOD2 | KEY_DOWN,
532  KEY_MOD1 | KEY_MOD2 | KEY_UP,
533  KEY_MOD1 | KEY_MOD2 | KEY_LEFT,
534  KEY_MOD1 | KEY_MOD2 | KEY_RIGHT,
535  KEY_MOD1 | KEY_MOD2 | KEY_HOME,
536  KEY_MOD1 | KEY_MOD2 | KEY_END,
537  KEY_MOD1 | KEY_MOD2 | KEY_PAGEUP,
538  KEY_MOD1 | KEY_MOD2 | KEY_PAGEDOWN,
539  KEY_MOD1 | KEY_MOD2 | KEY_RETURN,
541  KEY_MOD1 | KEY_MOD2 | KEY_BACKSPACE,
542  KEY_MOD1 | KEY_MOD2 | KEY_INSERT,
543  KEY_MOD1 | KEY_MOD2 | KEY_DELETE,
544 
589 
591  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F2,
592  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F3,
593  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F4,
594  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F5,
595  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F6,
596  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F7,
597  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F8,
598  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F9,
599  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F10,
600  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F11,
601  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F12,
602  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F13,
603  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F14,
604  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F15,
605  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F16,
606 
607  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_DOWN,
608  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_UP,
609  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_LEFT,
610  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_RIGHT,
611  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_HOME,
612  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_END,
613  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_PAGEUP,
614  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_PAGEDOWN,
615  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_RETURN,
617  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_BACKSPACE,
618  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_INSERT,
619  KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_DELETE,
621 
622 #ifdef __APPLE__
623  ,
624  KEY_MOD3 | KEY_0,
625  KEY_MOD3 | KEY_1,
626  KEY_MOD3 | KEY_2,
627  KEY_MOD3 | KEY_3,
628  KEY_MOD3 | KEY_4,
629  KEY_MOD3 | KEY_5,
630  KEY_MOD3 | KEY_6,
631  KEY_MOD3 | KEY_7,
632  KEY_MOD3 | KEY_8,
633  KEY_MOD3 | KEY_9,
634  KEY_MOD3 | KEY_A,
635  KEY_MOD3 | KEY_B,
636  KEY_MOD3 | KEY_C,
637  KEY_MOD3 | KEY_D,
638  KEY_MOD3 | KEY_E,
639  KEY_MOD3 | KEY_F,
640  KEY_MOD3 | KEY_G,
641  KEY_MOD3 | KEY_H,
642  KEY_MOD3 | KEY_I,
643  KEY_MOD3 | KEY_J,
644  KEY_MOD3 | KEY_K,
645  KEY_MOD3 | KEY_L,
646  KEY_MOD3 | KEY_M,
647  KEY_MOD3 | KEY_N,
648  KEY_MOD3 | KEY_O,
649  KEY_MOD3 | KEY_P,
650  KEY_MOD3 | KEY_Q,
651  KEY_MOD3 | KEY_R,
652  KEY_MOD3 | KEY_S,
653  KEY_MOD3 | KEY_T,
654  KEY_MOD3 | KEY_U,
655  KEY_MOD3 | KEY_V,
656  KEY_MOD3 | KEY_W,
657  KEY_MOD3 | KEY_X,
658  KEY_MOD3 | KEY_Y,
659  KEY_MOD3 | KEY_Z,
668  KEY_MOD3 | KEY_TAB,
669 
670  KEY_MOD3 | KEY_F1,
671  KEY_MOD3 | KEY_F2,
672  KEY_MOD3 | KEY_F3,
673  KEY_MOD3 | KEY_F4,
674  KEY_MOD3 | KEY_F5,
675  KEY_MOD3 | KEY_F6,
676  KEY_MOD3 | KEY_F7,
677  KEY_MOD3 | KEY_F8,
678  KEY_MOD3 | KEY_F9,
679  KEY_MOD3 | KEY_F10,
680  KEY_MOD3 | KEY_F11,
681  KEY_MOD3 | KEY_F12,
682  KEY_MOD3 | KEY_F13,
683  KEY_MOD3 | KEY_F14,
684  KEY_MOD3 | KEY_F15,
685  KEY_MOD3 | KEY_F16,
686 
687  KEY_MOD3 | KEY_DOWN,
688  KEY_MOD3 | KEY_UP,
689  KEY_MOD3 | KEY_LEFT,
690  KEY_MOD3 | KEY_RIGHT,
691  KEY_MOD3 | KEY_HOME,
692  KEY_MOD3 | KEY_END,
693  KEY_MOD3 | KEY_PAGEUP,
694  KEY_MOD3 | KEY_PAGEDOWN,
695  KEY_MOD3 | KEY_RETURN,
697  KEY_MOD3 | KEY_BACKSPACE,
698  KEY_MOD3 | KEY_INSERT,
699  KEY_MOD3 | KEY_DELETE,
700 
701  KEY_MOD3 | KEY_ADD,
706 
752 
754  KEY_SHIFT | KEY_MOD3 | KEY_F2,
755  KEY_SHIFT | KEY_MOD3 | KEY_F3,
756  KEY_SHIFT | KEY_MOD3 | KEY_F4,
757  KEY_SHIFT | KEY_MOD3 | KEY_F5,
758  KEY_SHIFT | KEY_MOD3 | KEY_F6,
759  KEY_SHIFT | KEY_MOD3 | KEY_F7,
760  KEY_SHIFT | KEY_MOD3 | KEY_F8,
761  KEY_SHIFT | KEY_MOD3 | KEY_F9,
762  KEY_SHIFT | KEY_MOD3 | KEY_F10,
763  KEY_SHIFT | KEY_MOD3 | KEY_F11,
764  KEY_SHIFT | KEY_MOD3 | KEY_F12,
765  KEY_SHIFT | KEY_MOD3 | KEY_F13,
766  KEY_SHIFT | KEY_MOD3 | KEY_F14,
767  KEY_SHIFT | KEY_MOD3 | KEY_F15,
768  KEY_SHIFT | KEY_MOD3 | KEY_F16,
769 
770  KEY_SHIFT | KEY_MOD3 | KEY_DOWN,
771  KEY_SHIFT | KEY_MOD3 | KEY_UP,
772  KEY_SHIFT | KEY_MOD3 | KEY_LEFT,
773  KEY_SHIFT | KEY_MOD3 | KEY_RIGHT,
774  KEY_SHIFT | KEY_MOD3 | KEY_HOME,
775  KEY_SHIFT | KEY_MOD3 | KEY_END,
776  KEY_SHIFT | KEY_MOD3 | KEY_PAGEUP,
777  KEY_SHIFT | KEY_MOD3 | KEY_PAGEDOWN,
778  KEY_SHIFT | KEY_MOD3 | KEY_RETURN,
779  KEY_SHIFT | KEY_MOD3 | KEY_ESCAPE,
781  KEY_SHIFT | KEY_MOD3 | KEY_BACKSPACE,
782  KEY_SHIFT | KEY_MOD3 | KEY_INSERT,
783  KEY_SHIFT | KEY_MOD3 | KEY_DELETE,
785 #endif
786 };
787 
789 
793 IMPL_LINK(SfxAcceleratorConfigPage, KeyInputHdl, const KeyEvent&, rKey, bool)
794 {
795  vcl::KeyCode aCode1 = rKey.GetKeyCode();
796  sal_uInt16 nCode1 = aCode1.GetCode();
797  sal_uInt16 nMod1 = aCode1.GetModifier();
798 
799  // is it related to our list box ?
800  if ((nCode1 != KEY_DOWN) && (nCode1 != KEY_UP) && (nCode1 != KEY_LEFT) && (nCode1 != KEY_RIGHT)
801  && (nCode1 != KEY_PAGEUP) && (nCode1 != KEY_PAGEDOWN))
802  {
803  for (int i = 0, nCount = m_xEntriesBox->n_children(); i < nCount; ++i)
804  {
805  TAccInfo* pUserData = reinterpret_cast<TAccInfo*>(m_xEntriesBox->get_id(i).toInt64());
806  if (pUserData)
807  {
808  sal_uInt16 nCode2 = pUserData->m_aKey.GetCode();
809  sal_uInt16 nMod2 = pUserData->m_aKey.GetModifier();
810 
811  if (nCode1 == nCode2 && nMod1 == nMod2)
812  {
813  m_xEntriesBox->select(i);
814  m_xEntriesBox->scroll_to_row(i);
815  return true;
816  }
817  }
818  }
819  }
820 
821  // no - handle it as normal dialog input
822  return false;
823 }
824 
826  weld::DialogController* pController,
827  const SfxItemSet& aSet)
828  : SfxTabPage(pPage, pController, "cui/ui/accelconfigpage.ui", "AccelConfigPage", &aSet)
829 #if HAVE_FEATURE_SCRIPTING
830  , m_pMacroInfoItem()
831 #endif
832  , aLoadAccelConfigStr(CuiResId(RID_SVXSTR_LOADACCELCONFIG))
833  , aSaveAccelConfigStr(CuiResId(RID_SVXSTR_SAVEACCELCONFIG))
834  , aFilterAllStr(SfxResId(STR_SFX_FILTERNAME_ALL))
835  , aFilterCfgStr(CuiResId(RID_SVXSTR_FILTERNAME_CFG))
836  , m_bStylesInfoInitialized(false)
837  , m_aUpdateDataTimer("SfxAcceleratorConfigPage UpdateDataTimer")
838  , m_aFillGroupIdle("SfxAcceleratorConfigPage m_aFillGroupIdle")
839  , m_xEntriesBox(m_xBuilder->weld_tree_view("shortcuts"))
840  , m_xOfficeButton(m_xBuilder->weld_radio_button("office"))
841  , m_xModuleButton(m_xBuilder->weld_radio_button("module"))
842  , m_xChangeButton(m_xBuilder->weld_button("change"))
843  , m_xRemoveButton(m_xBuilder->weld_button("delete"))
844  , m_xGroupLBox(new CuiConfigGroupListBox(m_xBuilder->weld_tree_view("category")))
845  , m_xFunctionBox(new CuiConfigFunctionListBox(m_xBuilder->weld_tree_view("function")))
846  , m_xKeyBox(m_xBuilder->weld_tree_view("keys"))
847  , m_xSearchEdit(m_xBuilder->weld_entry("searchEntry"))
848  , m_xLoadButton(m_xBuilder->weld_button("load"))
849  , m_xSaveButton(m_xBuilder->weld_button("save"))
850  , m_xResetButton(m_xBuilder->weld_button("reset"))
851 {
852  Size aSize(m_xEntriesBox->get_approximate_digit_width() * 40,
853  m_xEntriesBox->get_height_rows(12));
854  m_xEntriesBox->set_size_request(aSize.Width(), aSize.Height());
855  aSize = Size(m_xEntriesBox->get_approximate_digit_width() * 19,
856  m_xEntriesBox->get_height_rows(10));
857  m_xGroupLBox->set_size_request(aSize.Width(), aSize.Height());
858  aSize = Size(m_xEntriesBox->get_approximate_digit_width() * 21,
859  m_xEntriesBox->get_height_rows(10));
860  m_xFunctionBox->set_size_request(aSize.Width(), aSize.Height());
861  aSize = Size(m_xEntriesBox->get_approximate_digit_width() * 20,
862  m_xEntriesBox->get_height_rows(10));
863  m_xKeyBox->set_size_request(aSize.Width(), aSize.Height());
864 
865  // install handler functions
866  m_xChangeButton->connect_clicked(LINK(this, SfxAcceleratorConfigPage, ChangeHdl));
867  m_xRemoveButton->connect_clicked(LINK(this, SfxAcceleratorConfigPage, RemoveHdl));
868  m_xEntriesBox->connect_changed(LINK(this, SfxAcceleratorConfigPage, SelectHdl));
869  m_xEntriesBox->connect_key_press(LINK(this, SfxAcceleratorConfigPage, KeyInputHdl));
870  m_xGroupLBox->connect_changed(LINK(this, SfxAcceleratorConfigPage, SelectHdl));
871  m_xFunctionBox->connect_changed(LINK(this, SfxAcceleratorConfigPage, SelectHdl));
872  m_xKeyBox->connect_changed(LINK(this, SfxAcceleratorConfigPage, SelectHdl));
873  m_xLoadButton->connect_clicked(LINK(this, SfxAcceleratorConfigPage, Load));
874  m_xSaveButton->connect_clicked(LINK(this, SfxAcceleratorConfigPage, Save));
875  m_xResetButton->connect_clicked(LINK(this, SfxAcceleratorConfigPage, Default));
876  m_xOfficeButton->connect_toggled(LINK(this, SfxAcceleratorConfigPage, RadioHdl));
877  m_xSearchEdit->connect_changed(LINK(this, SfxAcceleratorConfigPage, SearchUpdateHdl));
878  m_xSearchEdit->connect_focus_out(LINK(this, SfxAcceleratorConfigPage, FocusOut_Impl));
879 
880  // detect max keyname width
881  int nMaxWidth = 0;
882  for (unsigned short i : KEYCODE_ARRAY)
883  {
884  int nTmp = m_xEntriesBox->get_pixel_size(vcl::KeyCode(i).GetName()).Width();
885  if (nTmp > nMaxWidth)
886  nMaxWidth = nTmp;
887  }
888  // recalc second tab
889  auto nNewTab = nMaxWidth + 5; // additional space
890 
891  // initialize Entriesbox
892  std::vector<int> aWidths{ nNewTab };
893  m_xEntriesBox->set_column_fixed_widths(aWidths);
894 
895  //Initialize search util
896  m_options.AlgorithmType2 = util::SearchAlgorithms2::ABSOLUTE;
897  m_options.transliterateFlags |= TransliterationFlags::IGNORE_CASE;
899  |= (util::SearchFlags::REG_NOT_BEGINOFLINE | util::SearchFlags::REG_NOT_ENDOFLINE);
900  // initialize GroupBox
901  m_xGroupLBox->SetFunctionListBox(m_xFunctionBox.get());
902 
903  // initialize KeyBox
904  m_xKeyBox->make_sorted();
905 
908 
910  m_aFillGroupIdle.SetPriority(TaskPriority::HIGHEST);
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));
953  = 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  size_t 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 
1094 {
1095  SelectHdl(m_xGroupLBox->get_widget());
1096 }
1097 
1099 {
1100  m_aUpdateDataTimer.Start();
1101 }
1102 
1104 {
1105  if (m_aUpdateDataTimer.IsActive())
1106  {
1107  m_aUpdateDataTimer.Stop();
1108  m_aUpdateDataTimer.Invoke();
1109  }
1110 }
1111 
1113 {
1114  // ask for filename, where we should load the new config data from
1115  StartFileDialog(StartFileDialogType::Open, aLoadAccelConfigStr);
1116 }
1117 
1119 {
1120  StartFileDialog(StartFileDialogType::SaveAs, aSaveAccelConfigStr);
1121 }
1122 
1124 {
1125  uno::Reference<form::XReset> xReset(m_xAct, uno::UNO_QUERY);
1126  if (xReset.is())
1127  xReset->reset();
1128 
1129  m_xEntriesBox->freeze();
1130  ResetConfig();
1131  Init(m_xAct);
1132  m_xEntriesBox->thaw();
1133  m_xEntriesBox->select(0);
1134  SelectHdl(*m_xEntriesBox);
1135 }
1136 
1138 {
1139  int nPos = m_xEntriesBox->get_selected_index();
1140  if (nPos == -1)
1141  return;
1142 
1143  TAccInfo* pEntry = reinterpret_cast<TAccInfo*>(m_xEntriesBox->get_id(nPos).toInt64());
1144  OUString sNewCommand = m_xFunctionBox->GetCurCommand();
1145  OUString sLabel = m_xFunctionBox->GetCurLabel();
1146  if (sLabel.isEmpty())
1147  sLabel = GetLabel4Command(sNewCommand);
1148 
1149  pEntry->m_sCommand = sNewCommand;
1150  m_xEntriesBox->set_text(nPos, sLabel, 1);
1151 
1152  SelectHdl(m_xFunctionBox->get_widget());
1153 }
1154 
1156 {
1157  // get selected entry
1158  int nPos = m_xEntriesBox->get_selected_index();
1159  if (nPos == -1)
1160  return;
1161 
1162  TAccInfo* pEntry = reinterpret_cast<TAccInfo*>(m_xEntriesBox->get_id(nPos).toInt64());
1163 
1164  // remove function name from selected entry
1165  m_xEntriesBox->set_text(nPos, OUString(), 1);
1166  pEntry->m_sCommand.clear();
1167 
1168  SelectHdl(m_xFunctionBox->get_widget());
1169 }
1170 
1172 {
1173  if (&rListBox == m_xEntriesBox.get())
1174  {
1175  TAccInfo* pEntry = reinterpret_cast<TAccInfo*>(m_xEntriesBox->get_selected_id().toInt64());
1176 
1177  OUString sPossibleNewCommand = m_xFunctionBox->GetCurCommand();
1178 
1179  m_xRemoveButton->set_sensitive(false);
1180  m_xChangeButton->set_sensitive(false);
1181 
1182  if (pEntry && pEntry->m_bIsConfigurable)
1183  {
1184  if (pEntry->isConfigured())
1185  m_xRemoveButton->set_sensitive(true);
1186  m_xChangeButton->set_sensitive(pEntry->m_sCommand != sPossibleNewCommand);
1187  }
1188  }
1189  else if (&rListBox == &m_xGroupLBox->get_widget())
1190  {
1191  m_xGroupLBox->GroupSelected();
1192 
1193  // Pause redraw (Do not redraw at each removal)
1194  m_xFunctionBox->freeze();
1195  // Apply the search filter to the functions list
1196  OUString aSearchTerm(m_xSearchEdit->get_text());
1197  int nMatchFound = applySearchFilter(aSearchTerm);
1198  // Resume redraw
1199  m_xFunctionBox->thaw();
1200  if (nMatchFound != -1)
1201  {
1202  m_xFunctionBox->select(nMatchFound);
1203  SelectHdl(m_xFunctionBox->get_widget());
1204  }
1205  else
1206  {
1207  m_xKeyBox->clear();
1208  m_xChangeButton->set_sensitive(false);
1209  }
1210  }
1211  else if (&rListBox == &m_xFunctionBox->get_widget())
1212  {
1213  m_xRemoveButton->set_sensitive(false);
1214  m_xChangeButton->set_sensitive(false);
1215 
1216  // #i36994 First selected can return null!
1217  TAccInfo* pEntry = reinterpret_cast<TAccInfo*>(m_xEntriesBox->get_selected_id().toInt64());
1218  if (pEntry)
1219  {
1220  OUString sPossibleNewCommand = m_xFunctionBox->GetCurCommand();
1221 
1222  if (pEntry->m_bIsConfigurable)
1223  {
1224  if (pEntry->isConfigured())
1225  m_xRemoveButton->set_sensitive(true);
1226  m_xChangeButton->set_sensitive(pEntry->m_sCommand != sPossibleNewCommand
1227  && !sPossibleNewCommand.isEmpty());
1228  }
1229 
1230  // update key box
1231  m_xKeyBox->clear();
1232  if (!sPossibleNewCommand.isEmpty())
1233  {
1234  for (int i = 0, nCount = m_xEntriesBox->n_children(); i < nCount; ++i)
1235  {
1236  TAccInfo* pUserData
1237  = reinterpret_cast<TAccInfo*>(m_xEntriesBox->get_id(i).toInt64());
1238  if (pUserData && pUserData->m_sCommand == sPossibleNewCommand)
1239  {
1240  m_xKeyBox->append(OUString::number(reinterpret_cast<sal_Int64>(pUserData)),
1241  pUserData->m_aKey.GetName());
1242  }
1243  }
1244  }
1245  }
1246  }
1247  else
1248  {
1249  // goto selected "key" entry of the key box
1250  int nP2 = -1;
1251  TAccInfo* pU2 = reinterpret_cast<TAccInfo*>(m_xKeyBox->get_selected_id().toInt64());
1252  if (pU2)
1253  nP2 = MapKeyCodeToPos(pU2->m_aKey);
1254  if (nP2 != -1)
1255  {
1256  m_xEntriesBox->select(nP2);
1257  m_xEntriesBox->scroll_to_row(nP2);
1258  SelectHdl(*m_xEntriesBox);
1259  }
1260  }
1261 }
1262 
1264 {
1265  uno::Reference<ui::XAcceleratorConfiguration> xOld = m_xAct;
1266 
1267  if (m_xOfficeButton->get_active())
1268  m_xAct = m_xGlobal;
1269  else if (m_xModuleButton->get_active())
1270  m_xAct = m_xModule;
1271 
1272  // nothing changed? => do nothing!
1273  if (m_xAct.is() && (xOld == m_xAct))
1274  return;
1275 
1276  m_xEntriesBox->freeze();
1277  ResetConfig();
1278  Init(m_xAct);
1279  m_xEntriesBox->thaw();
1280 
1281  m_xGroupLBox->Init(m_xContext, m_xFrame, m_sModuleLongName, true);
1282 
1283  // pb: #133213# do not select NULL entries
1284  if (m_xEntriesBox->n_children())
1285  m_xEntriesBox->select(0);
1286 
1287  m_aFillGroupIdle.Start();
1288 }
1289 
1291 {
1292  // activating the selection, typically "all commands", can take a long time
1293  // -> show wait cursor and disable input
1294  weld::WaitObject aWaitObject(GetFrameWeld());
1295 
1296  weld::TreeView& rTreeView = m_xGroupLBox->get_widget();
1297  SelectHdl(rTreeView);
1298 }
1299 
1301 {
1302  assert(m_pFileDlg);
1303 
1304  OUString sCfgName;
1305  if (ERRCODE_NONE == m_pFileDlg->GetError())
1306  sCfgName = m_pFileDlg->GetPath();
1307 
1308  if (sCfgName.isEmpty())
1309  return;
1310 
1311  weld::WaitObject aWaitObject(GetFrameWeld());
1312 
1313  uno::Reference<ui::XUIConfigurationManager> xCfgMgr;
1314  uno::Reference<embed::XStorage>
1315  xRootStorage; // we must hold the root storage alive, if xCfgMgr is used!
1316 
1317  try
1318  {
1319  // don't forget to release the storage afterwards!
1320  uno::Reference<lang::XSingleServiceFactory> xStorageFactory(
1321  embed::StorageFactory::create(m_xContext));
1322  uno::Sequence<uno::Any> lArgs(2);
1323  lArgs[0] <<= sCfgName;
1324  lArgs[1] <<= css::embed::ElementModes::READ;
1325 
1326  xRootStorage.set(xStorageFactory->createInstanceWithArguments(lArgs), uno::UNO_QUERY_THROW);
1327  uno::Reference<embed::XStorage> xUIConfig
1328  = xRootStorage->openStorageElement(FOLDERNAME_UICONFIG, embed::ElementModes::READ);
1329  if (xUIConfig.is())
1330  {
1331  uno::Reference<ui::XUIConfigurationManager2> xCfgMgr2
1332  = ui::UIConfigurationManager::create(m_xContext);
1333  xCfgMgr2->setStorage(xUIConfig);
1334  xCfgMgr.set(xCfgMgr2, uno::UNO_QUERY_THROW);
1335  }
1336 
1337  if (xCfgMgr.is())
1338  {
1339  // open the configuration and update our UI
1340  uno::Reference<ui::XAcceleratorConfiguration> xTempAccMgr(xCfgMgr->getShortCutManager(),
1341  uno::UNO_SET_THROW);
1342 
1343  m_xEntriesBox->freeze();
1344  ResetConfig();
1345  Init(xTempAccMgr);
1346  m_xEntriesBox->thaw();
1347  if (m_xEntriesBox->n_children())
1348  {
1349  m_xEntriesBox->select(0);
1350  SelectHdl(m_xFunctionBox->get_widget());
1351  }
1352  }
1353 
1354  // don't forget to close the new opened storage!
1355  // We are the owner of it.
1356  if (xRootStorage.is())
1357  {
1358  uno::Reference<lang::XComponent> xComponent;
1359  xComponent.set(xCfgMgr, uno::UNO_QUERY);
1360  if (xComponent.is())
1361  xComponent->dispose();
1362  xRootStorage->dispose();
1363  }
1364  }
1365  catch (const uno::RuntimeException&)
1366  {
1367  throw;
1368  }
1369  catch (const uno::Exception&)
1370  {
1371  }
1372 }
1373 
1375 {
1376  assert(m_pFileDlg);
1377 
1378  OUString sCfgName;
1379  if (ERRCODE_NONE == m_pFileDlg->GetError())
1380  sCfgName = m_pFileDlg->GetPath();
1381 
1382  if (sCfgName.isEmpty())
1383  return;
1384 
1385  weld::WaitObject aWaitObject(GetFrameWeld());
1386 
1387  uno::Reference<embed::XStorage> xRootStorage;
1388 
1389  try
1390  {
1391  uno::Reference<lang::XSingleServiceFactory> xStorageFactory(
1392  embed::StorageFactory::create(m_xContext));
1393  uno::Sequence<uno::Any> lArgs(2);
1394  lArgs[0] <<= sCfgName;
1395  lArgs[1] <<= embed::ElementModes::WRITE;
1396 
1397  xRootStorage.set(xStorageFactory->createInstanceWithArguments(lArgs), uno::UNO_QUERY_THROW);
1398 
1399  uno::Reference<embed::XStorage> xUIConfig(
1400  xRootStorage->openStorageElement(FOLDERNAME_UICONFIG, embed::ElementModes::WRITE),
1401  uno::UNO_SET_THROW);
1402  uno::Reference<beans::XPropertySet> xUIConfigProps(xUIConfig, uno::UNO_QUERY_THROW);
1403 
1404  // set the correct media type if the storage was new created
1405  OUString sMediaType;
1406  xUIConfigProps->getPropertyValue(MEDIATYPE_PROPNAME) >>= sMediaType;
1407  if (sMediaType.isEmpty())
1408  xUIConfigProps->setPropertyValue(
1409  MEDIATYPE_PROPNAME, uno::Any(OUString("application/vnd.sun.xml.ui.configuration")));
1410 
1411  uno::Reference<ui::XUIConfigurationManager2> xCfgMgr
1412  = ui::UIConfigurationManager::create(m_xContext);
1413  xCfgMgr->setStorage(xUIConfig);
1414 
1415  // get the target configuration access and update with all shortcuts
1416  // which are set currently at the UI!
1417  // Don't copy the m_xAct content to it... because m_xAct will be updated
1418  // from the UI on pressing the button "OK" only. And inbetween it's not up to date!
1419  uno::Reference<ui::XAcceleratorConfiguration> xTargetAccMgr(xCfgMgr->getShortCutManager(),
1420  uno::UNO_SET_THROW);
1421  Apply(xTargetAccMgr);
1422 
1423  // commit (order is important!)
1424  uno::Reference<ui::XUIConfigurationPersistence> xCommit1(xTargetAccMgr,
1425  uno::UNO_QUERY_THROW);
1426  uno::Reference<ui::XUIConfigurationPersistence> xCommit2(xCfgMgr, uno::UNO_QUERY_THROW);
1427  xCommit1->store();
1428  xCommit2->store();
1429 
1430  if (xRootStorage.is())
1431  {
1432  // Commit root storage
1433  uno::Reference<embed::XTransactedObject> xCommit3(xRootStorage, uno::UNO_QUERY_THROW);
1434  xCommit3->commit();
1435  }
1436 
1437  if (xRootStorage.is())
1438  {
1439  if (xCfgMgr.is())
1440  xCfgMgr->dispose();
1441  xRootStorage->dispose();
1442  }
1443  }
1444  catch (const uno::RuntimeException&)
1445  {
1446  throw;
1447  }
1448  catch (const uno::Exception&)
1449  {
1450  }
1451 }
1452 
1454 {
1455  bool bSave = nType == StartFileDialogType::SaveAs;
1456  short nDialogType = bSave ? ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION
1457  : ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE;
1458  m_pFileDlg.reset(
1459  new sfx2::FileDialogHelper(nDialogType, FileDialogFlags::NONE, GetFrameWeld()));
1460 
1461  m_pFileDlg->SetTitle(rTitle);
1463  m_pFileDlg->AddFilter(aFilterCfgStr, "*.cfg");
1464  m_pFileDlg->SetCurrentFilter(aFilterCfgStr);
1466 
1468  = bSave ? LINK(this, SfxAcceleratorConfigPage, SaveHdl)
1469  : LINK(this, SfxAcceleratorConfigPage, LoadHdl);
1470  m_pFileDlg->StartExecuteModal(aDlgClosedLink);
1471 }
1472 
1474 {
1475  Apply(m_xAct);
1476  try
1477  {
1478  m_xAct->store();
1479  }
1480  catch (const uno::RuntimeException&)
1481  {
1482  throw;
1483  }
1484  catch (const uno::Exception&)
1485  {
1486  return false;
1487  }
1488 
1489  return true;
1490 }
1491 
1493 {
1494  // open accelerator configs
1495  // Note: It initialize some other members too, which are needed here ...
1496  // e.g. m_sModuleUIName!
1497  InitAccCfg();
1498 
1499  // change the description of the radio button, which switch to the module
1500  // dependent accelerator configuration
1501  OUString sButtonText = m_xModuleButton->get_label();
1502  sButtonText
1503  = m_xModuleButton->strip_mnemonic(sButtonText).replaceFirst("$(MODULE)", m_sModuleUIName);
1504  m_xModuleButton->set_label(sButtonText);
1505 
1506  if (m_xModule.is())
1507  m_xModuleButton->set_active(true);
1508  else
1509  {
1510  m_xModuleButton->hide();
1511  m_xOfficeButton->set_active(true);
1512  }
1513 
1514  RadioHdl(*m_xOfficeButton);
1515 
1516 #if HAVE_FEATURE_SCRIPTING
1517  const SfxPoolItem* pMacroItem = nullptr;
1518  if (SfxItemState::SET == rSet->GetItemState(SID_MACROINFO, true, &pMacroItem))
1519  {
1520  m_pMacroInfoItem = &dynamic_cast<const SfxMacroInfoItem&>(*pMacroItem);
1521  m_xGroupLBox->SelectMacro(m_pMacroInfoItem);
1522  }
1523 #else
1524  (void)rSet;
1525 #endif
1526 }
1527 
1529 {
1530  sal_uInt16 nCode1 = aKey.GetCode() + aKey.GetModifier();
1531  for (int i = 0, nCount = m_xEntriesBox->n_children(); i < nCount; ++i)
1532  {
1533  TAccInfo* pUserData = reinterpret_cast<TAccInfo*>(m_xEntriesBox->get_id(i).toInt64());
1534  if (pUserData)
1535  {
1536  sal_uInt16 nCode2 = pUserData->m_aKey.GetCode() + pUserData->m_aKey.GetModifier();
1537  if (nCode1 == nCode2)
1538  return i;
1539  }
1540  }
1541 
1542  return -1;
1543 }
1544 
1545 OUString SfxAcceleratorConfigPage::GetLabel4Command(const OUString& sCommand)
1546 {
1547  try
1548  {
1549  // check global command configuration first
1550  uno::Reference<container::XNameAccess> xModuleConf;
1551  m_xUICmdDescription->getByName(m_sModuleLongName) >>= xModuleConf;
1552  if (xModuleConf.is())
1553  {
1554  ::comphelper::SequenceAsHashMap lProps(xModuleConf->getByName(sCommand));
1555  OUString sLabel = lProps.getUnpackedValueOrDefault("Name", OUString());
1556  if (!sLabel.isEmpty())
1557  return sLabel;
1558  }
1559  }
1560  catch (const uno::RuntimeException&)
1561  {
1562  throw;
1563  }
1564  catch (const uno::Exception&)
1565  {
1566  }
1567 
1568  // may be it's a style URL .. they must be handled special
1569  SfxStyleInfo_Impl aStyle;
1570  aStyle.sCommand = sCommand;
1572  {
1573  m_aStylesInfo.getLabel4Style(aStyle);
1574  return aStyle.sLabel;
1575  }
1576 
1577  return sCommand;
1578 }
1579 
1580 /*
1581  * Remove entries which doesn't contain the search term
1582  */
1583 int SfxAcceleratorConfigPage::applySearchFilter(OUString const& rSearchTerm)
1584 {
1585  if (rSearchTerm.isEmpty())
1586  return -1;
1587 
1588  m_options.searchString = rSearchTerm;
1589  utl::TextSearch textSearch(m_options);
1590 
1591  for (int i = m_xFunctionBox->n_children(); i > 0; --i)
1592  {
1593  int nEntry = i - 1;
1594  OUString aStr = m_xFunctionBox->get_text(nEntry);
1595  sal_Int32 aStartPos = 0;
1596  sal_Int32 aEndPos = aStr.getLength();
1597 
1598  if (!textSearch.SearchForward(aStr, &aStartPos, &aEndPos))
1599  m_xFunctionBox->remove(nEntry);
1600  }
1601 
1602  return m_xFunctionBox->n_children() ? 0 : -1;
1603 }
1604 
1605 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
constexpr sal_uInt16 KEY_4
IMPL_LINK_NOARG(SfxAcceleratorConfigPage, ImplUpdateDataHdl, Timer *, void)
Definition: acccfg.cxx:1093
constexpr sal_uInt16 KEY_E
constexpr sal_uInt16 KEY_FRONT
void Apply(const css::uno::Reference< css::ui::XAcceleratorConfiguration > &pAccMgr)
Definition: acccfg.cxx:1054
constexpr sal_uInt16 KEY_7
constexpr sal_uInt16 KEY_MOD1
void Init()
constexpr sal_uInt16 KEY_QUOTERIGHT
OUString GetLabel4Command(const OUString &rCommand)
Definition: acccfg.cxx:1545
void Init(const css::uno::Reference< css::ui::XAcceleratorConfiguration > &pAccMgr)
Definition: acccfg.cxx:976
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:56
constexpr sal_uInt16 KEY_2
constexpr sal_uInt16 KEY_F3
std::unique_ptr< weld::Button > m_xLoadButton
Definition: acccfg.hxx:119
static size_t GetReservedKeyCodeCount()
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:793
css::uno::Reference< css::lang::XComponent > m_xFrame
constexpr sal_uInt16 KEY_H
const sal_uInt16 KEYCODE_ARRAY_SIZE
Definition: acccfg.cxx:788
constexpr sal_uInt16 KEY_F4
void getLabel4Style(SfxStyleInfo_Impl &aStyle)
Definition: cfgutil.cxx:124
sal_uInt16 GetCode() const
OUString m_sModuleLongName
Definition: acccfg.hxx:101
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:112
std::unique_ptr< CuiConfigGroupListBox > m_xGroupLBox
Definition: acccfg.hxx:115
constexpr sal_uInt16 KEY_ADD
SfxStylesInfo_Impl m_aStylesInfo
Definition: acccfg.hxx:91
constexpr sal_uInt16 KEY_Y
constexpr sal_uInt16 KEY_SEMICOLON
constexpr sal_uInt16 KEY_UP
std::unique_ptr< CuiConfigFunctionListBox > m_xFunctionBox
Definition: acccfg.hxx:116
std::unique_ptr< weld::Entry > m_xSearchEdit
Definition: acccfg.hxx:118
constexpr sal_uInt16 KEY_F1
constexpr sal_uInt16 KEY_F9
constexpr sal_uInt16 KEY_END
constexpr sal_uInt16 KEY_9
OUString GetName() const
constexpr sal_uInt16 KEY_REPEAT
Reference< XController > xController
constexpr sal_uInt16 KEY_1
constexpr OUStringLiteral MEDIATYPE_PROPNAME
Definition: acccfg.cxx:72
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:120
const sal_uInt16 KEYCODE_ARRAY[]
Definition: acccfg.cxx:74
constexpr sal_uInt16 KEY_R
constexpr sal_uInt16 KEY_Q
constexpr sal_uInt16 KEY_QUOTELEFT
constexpr sal_uInt16 KEY_CUT
OUString m_sCommand
Definition: acccfg.hxx:64
constexpr sal_uInt16 KEY_TILDE
constexpr sal_uInt16 KEY_PROPERTIES
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:47
OUString CuiResId(TranslateId aKey)
Definition: cuiresmgr.cxx:23
constexpr sal_uInt16 KEY_5
std::unique_ptr< weld::TreeView > m_xKeyBox
Definition: acccfg.hxx:117
TValueType getUnpackedValueOrDefault(const OUString &sKey, const TValueType &aDefault) const
std::unique_ptr< weld::Button > m_xResetButton
Definition: acccfg.hxx:121
css::uno::Reference< css::frame::XFrame > GetFrame() const
SfxItemState GetItemState(sal_uInt16 nWhich, bool bSrchInParent=true, const SfxPoolItem **ppItem=nullptr) const
int i
constexpr sal_uInt16 KEY_K
constexpr sal_uInt16 KEY_HOME
TransliterationFlags transliterateFlags
constexpr sal_uInt16 KEY_F13
float u
sal_Int32 MapKeyCodeToPos(const vcl::KeyCode &rCode) const
Definition: acccfg.cxx:1528
constexpr sal_uInt16 KEY_3
constexpr sal_uInt16 KEY_W
constexpr sal_uInt16 KEY_PAGEDOWN
constexpr sal_uInt16 KEY_BRACKETLEFT
vcl::KeyCode m_aKey
Definition: acccfg.hxx:65
css::uno::Reference< css::ui::XAcceleratorConfiguration > m_xGlobal
Definition: acccfg.hxx:95
constexpr sal_uInt16 KEY_COPY
constexpr sal_uInt16 KEY_HELP
OUString sCommand
Definition: cfgutil.hxx:46
void init(const OUString &rModuleName, const css::uno::Reference< css::frame::XModel > &xModel)
Definition: cfgutil.cxx:70
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
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
constexpr sal_uInt16 KEY_FIND
weld::Window * GetFrameWeld() const
css::uno::Reference< css::ui::XAcceleratorConfiguration > m_xModule
Definition: acccfg.hxx:96
css::uno::Reference< css::uno::XComponentContext > m_xContext
Definition: acccfg.hxx:94
StartFileDialogType
css::uno::Reference< css::container::XNameAccess > m_xUICmdDescription
Definition: acccfg.hxx:98
constexpr sal_uInt16 KEY_8
constexpr sal_uInt16 KEY_G
std::unique_ptr< weld::Button > m_xRemoveButton
Definition: acccfg.hxx:114
constexpr sal_uInt16 KEY_SUBTRACT
void Stop()
constexpr OUStringLiteral sMediaType
i18nutil::SearchOptions2 m_options
Definition: acccfg.hxx:106
#define ERRCODE_NONE
std::unique_ptr< weld::Button > m_xChangeButton
Definition: acccfg.hxx:113
std::unique_ptr< sfx2::FileDialogHelper > m_pFileDlg
Definition: acccfg.hxx:85
constexpr sal_uInt16 KEY_F16
constexpr sal_uInt16 KEY_ESCAPE
css::uno::Reference< css::frame::XFrame > m_xFrame
Definition: acccfg.hxx:99
virtual void Reset(const SfxItemSet *) override
Definition: acccfg.cxx:1492
constexpr sal_uInt16 KEY_F
#define EDIT_UPDATEDATA_TIMEOUT
constexpr sal_uInt16 KEY_F14
int applySearchFilter(OUString const &rSearchTerm)
Definition: acccfg.cxx:1583
constexpr sal_uInt16 KEY_N
constexpr sal_uInt16 KEY_F11
constexpr sal_uInt16 KEY_F12
if(aStr!=aBuf) UpdateName_Impl(m_xFollowLb.get()
constexpr sal_uInt16 KEY_BRACKETRIGHT
Reference< XComponentContext > getProcessComponentContext()
void SetInvokeHandler(const Link< Timer *, void > &rLink)
constexpr sal_uInt16 KEY_L
constexpr sal_uInt16 KEY_BACKSPACE
static bool parseStyleCommand(SfxStyleInfo_Impl &aStyle)
Definition: cfgutil.cxx:91
constexpr sal_uInt16 KEY_U
std::unique_ptr< weld::TreeView > m_xEntriesBox
Definition: acccfg.hxx:110
constexpr sal_uInt16 KEY_POINT
constexpr sal_uInt16 KEY_MULTIPLY
virtual bool FillItemSet(SfxItemSet *) override
Definition: acccfg.cxx:1473
constexpr sal_uInt16 KEY_EQUAL
constexpr sal_uInt16 KEY_Z
void StartFileDialog(StartFileDialogType nType, const OUString &rTitle)
Definition: acccfg.cxx:1453
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:825
constexpr sal_uInt16 KEY_DELETE
constexpr sal_uInt16 KEY_LEFT
Reference< XComponentContext > m_xContext
constexpr sal_uInt16 KEY_F15
static const vcl::KeyCode * GetReservedKeyCode(size_t i)
constexpr sal_uInt16 KEY_MOD3
constexpr sal_uInt16 KEY_INSERT
constexpr sal_uInt16 KEY_SHIFT
constexpr sal_uInt16 KEY_DIVIDE
weld::Window * GetFrameWeld(const SfxFrame *pFrame)
aStr
constexpr OUStringLiteral FOLDERNAME_UICONFIG
Definition: acccfg.cxx:70
bool m_bIsConfigurable
Definition: acccfg.hxx:63
sal_uInt16 nPos
OUString SfxResId(TranslateId aId)
std::unique_ptr< weld::RadioButton > m_xOfficeButton
Definition: acccfg.hxx:111
constexpr sal_uInt16 KEY_TAB
constexpr sal_uInt16 KEY_F8
css::uno::Reference< css::ui::XAcceleratorConfiguration > m_xAct
Definition: acccfg.hxx:97
typedef void(CALLTYPE *GetFuncDataPtr)(sal_uInt16 &nNo