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