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