LCOV - code coverage report
Current view: top level - cui/source/customize - acccfg.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 0 540 0.0 %
Date: 2015-06-13 12:38:46 Functions: 0 45 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       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/msg.hxx>
      28             : #include <sfx2/app.hxx>
      29             : #include <sfx2/filedlghelper.hxx>
      30             : #include <sfx2/minfitem.hxx>
      31             : #include <sfx2/sfxresid.hxx>
      32             : #include <svl/stritem.hxx>
      33             : #include "svtools/treelistentry.hxx"
      34             : 
      35             : #include <sal/macros.h>
      36             : #include <vcl/builderfactory.hxx>
      37             : 
      38             : #include "cuires.hrc"
      39             : #include "acccfg.hrc"
      40             : 
      41             : #include <svx/svxids.hrc>
      42             : 
      43             : 
      44             : // include interface declarations
      45             : #include <com/sun/star/awt/KeyModifier.hpp>
      46             : #include <com/sun/star/embed/StorageFactory.hpp>
      47             : #include <com/sun/star/embed/XTransactedObject.hpp>
      48             : #include <com/sun/star/embed/ElementModes.hpp>
      49             : #include <com/sun/star/form/XReset.hpp>
      50             : #include <com/sun/star/frame/Desktop.hpp>
      51             : #include <com/sun/star/frame/XFramesSupplier.hpp>
      52             : #include <com/sun/star/frame/XFrame.hpp>
      53             : #include <com/sun/star/frame/XController.hpp>
      54             : #include <com/sun/star/frame/XModel.hpp>
      55             : #include <com/sun/star/frame/ModuleManager.hpp>
      56             : #include <com/sun/star/frame/theUICommandDescription.hpp>
      57             : #include <com/sun/star/ui/GlobalAcceleratorConfiguration.hpp>
      58             : #include <com/sun/star/ui/theModuleUIConfigurationManagerSupplier.hpp>
      59             : #include <com/sun/star/ui/UIConfigurationManager.hpp>
      60             : #include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
      61             : #include <com/sun/star/ui/XUIConfigurationManager.hpp>
      62             : #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
      63             : 
      64             : // include other projects
      65             : #include <comphelper/processfactory.hxx>
      66             : #include <svtools/acceleratorexecute.hxx>
      67             : #include <svtools/svlbitm.hxx>
      68             : #include <vcl/svapp.hxx>
      69             : #include <vcl/help.hxx>
      70             : #include <rtl/ustrbuf.hxx>
      71             : #include <comphelper/sequenceashashmap.hxx>
      72             : 
      73             : // namespaces
      74             : 
      75             : using namespace css;
      76             : 
      77             : static const char MODULEPROP_SHORTNAME  [] = "ooSetupFactoryShortName";
      78             : static const char MODULEPROP_UINAME     [] = "ooSetupFactoryUIName";
      79             : static const char CMDPROP_UINAME        [] = "Name";
      80             : 
      81             : static const char FOLDERNAME_UICONFIG   [] = "Configurations2";
      82             : 
      83             : static const char MEDIATYPE_PROPNAME    [] = "MediaType";
      84             : static const char MEDIATYPE_UICONFIG    [] = "application/vnd.sun.xml.ui.configuration";
      85             : 
      86             : static const sal_uInt16 KEYCODE_ARRAY[] =
      87             : {
      88             :     KEY_F1,
      89             :     KEY_F2,
      90             :     KEY_F3,
      91             :     KEY_F4,
      92             :     KEY_F5,
      93             :     KEY_F6,
      94             :     KEY_F7,
      95             :     KEY_F8,
      96             :     KEY_F9,
      97             :     KEY_F10,
      98             :     KEY_F11,
      99             :     KEY_F12,
     100             :     KEY_F13,
     101             :     KEY_F14,
     102             :     KEY_F15,
     103             :     KEY_F16,
     104             : 
     105             :     KEY_DOWN,
     106             :     KEY_UP,
     107             :     KEY_LEFT,
     108             :     KEY_RIGHT,
     109             :     KEY_HOME,
     110             :     KEY_END,
     111             :     KEY_PAGEUP,
     112             :     KEY_PAGEDOWN,
     113             :     KEY_RETURN,
     114             :     KEY_ESCAPE,
     115             :     KEY_BACKSPACE,
     116             :     KEY_INSERT,
     117             :     KEY_DELETE,
     118             : 
     119             :     KEY_OPEN,
     120             :     KEY_CUT,
     121             :     KEY_COPY,
     122             :     KEY_PASTE,
     123             :     KEY_UNDO,
     124             :     KEY_REPEAT,
     125             :     KEY_FIND,
     126             :     KEY_PROPERTIES,
     127             :     KEY_FRONT,
     128             :     KEY_CONTEXTMENU,
     129             :     KEY_MENU,
     130             :     KEY_HELP,
     131             : 
     132             :     KEY_SHIFT | KEY_F1,
     133             :     KEY_SHIFT | KEY_F2,
     134             :     KEY_SHIFT | KEY_F3,
     135             :     KEY_SHIFT | KEY_F4,
     136             :     KEY_SHIFT | KEY_F5,
     137             :     KEY_SHIFT | KEY_F6,
     138             :     KEY_SHIFT | KEY_F7,
     139             :     KEY_SHIFT | KEY_F8,
     140             :     KEY_SHIFT | KEY_F9,
     141             :     KEY_SHIFT | KEY_F10,
     142             :     KEY_SHIFT | KEY_F11,
     143             :     KEY_SHIFT | KEY_F12,
     144             :     KEY_SHIFT | KEY_F13,
     145             :     KEY_SHIFT | KEY_F14,
     146             :     KEY_SHIFT | KEY_F15,
     147             :     KEY_SHIFT | KEY_F16,
     148             : 
     149             :     KEY_SHIFT | KEY_DOWN,
     150             :     KEY_SHIFT | KEY_UP,
     151             :     KEY_SHIFT | KEY_LEFT,
     152             :     KEY_SHIFT | KEY_RIGHT,
     153             :     KEY_SHIFT | KEY_HOME,
     154             :     KEY_SHIFT | KEY_END,
     155             :     KEY_SHIFT | KEY_PAGEUP,
     156             :     KEY_SHIFT | KEY_PAGEDOWN,
     157             :     KEY_SHIFT | KEY_RETURN,
     158             :     KEY_SHIFT | KEY_SPACE,
     159             :     KEY_SHIFT | KEY_ESCAPE,
     160             :     KEY_SHIFT | KEY_BACKSPACE,
     161             :     KEY_SHIFT | KEY_INSERT,
     162             :     KEY_SHIFT | KEY_DELETE,
     163             : 
     164             :     KEY_MOD1 | KEY_0,
     165             :     KEY_MOD1 | KEY_1,
     166             :     KEY_MOD1 | KEY_2,
     167             :     KEY_MOD1 | KEY_3,
     168             :     KEY_MOD1 | KEY_4,
     169             :     KEY_MOD1 | KEY_5,
     170             :     KEY_MOD1 | KEY_6,
     171             :     KEY_MOD1 | KEY_7,
     172             :     KEY_MOD1 | KEY_8,
     173             :     KEY_MOD1 | KEY_9,
     174             :     KEY_MOD1 | KEY_A,
     175             :     KEY_MOD1 | KEY_B,
     176             :     KEY_MOD1 | KEY_C,
     177             :     KEY_MOD1 | KEY_D,
     178             :     KEY_MOD1 | KEY_E,
     179             :     KEY_MOD1 | KEY_F,
     180             :     KEY_MOD1 | KEY_G,
     181             :     KEY_MOD1 | KEY_H,
     182             :     KEY_MOD1 | KEY_I,
     183             :     KEY_MOD1 | KEY_J,
     184             :     KEY_MOD1 | KEY_K,
     185             :     KEY_MOD1 | KEY_L,
     186             :     KEY_MOD1 | KEY_M,
     187             :     KEY_MOD1 | KEY_N,
     188             :     KEY_MOD1 | KEY_O,
     189             :     KEY_MOD1 | KEY_P,
     190             :     KEY_MOD1 | KEY_Q,
     191             :     KEY_MOD1 | KEY_R,
     192             :     KEY_MOD1 | KEY_S,
     193             :     KEY_MOD1 | KEY_T,
     194             :     KEY_MOD1 | KEY_U,
     195             :     KEY_MOD1 | KEY_V,
     196             :     KEY_MOD1 | KEY_W,
     197             :     KEY_MOD1 | KEY_X,
     198             :     KEY_MOD1 | KEY_Y,
     199             :     KEY_MOD1 | KEY_Z,
     200             :     KEY_MOD1 | KEY_SEMICOLON,
     201             :     KEY_MOD1 | KEY_QUOTERIGHT,
     202             :     KEY_MOD1 | KEY_BRACKETLEFT,
     203             :     KEY_MOD1 | KEY_BRACKETRIGHT,
     204             :     KEY_MOD1 | KEY_POINT,
     205             : 
     206             :     KEY_MOD1 | KEY_F1,
     207             :     KEY_MOD1 | KEY_F2,
     208             :     KEY_MOD1 | KEY_F3,
     209             :     KEY_MOD1 | KEY_F4,
     210             :     KEY_MOD1 | KEY_F5,
     211             :     KEY_MOD1 | KEY_F6,
     212             :     KEY_MOD1 | KEY_F7,
     213             :     KEY_MOD1 | KEY_F8,
     214             :     KEY_MOD1 | KEY_F9,
     215             :     KEY_MOD1 | KEY_F10,
     216             :     KEY_MOD1 | KEY_F11,
     217             :     KEY_MOD1 | KEY_F12,
     218             :     KEY_MOD1 | KEY_F13,
     219             :     KEY_MOD1 | KEY_F14,
     220             :     KEY_MOD1 | KEY_F15,
     221             :     KEY_MOD1 | KEY_F16,
     222             : 
     223             :     KEY_MOD1 | KEY_DOWN,
     224             :     KEY_MOD1 | KEY_UP,
     225             :     KEY_MOD1 | KEY_LEFT,
     226             :     KEY_MOD1 | KEY_RIGHT,
     227             :     KEY_MOD1 | KEY_HOME,
     228             :     KEY_MOD1 | KEY_END,
     229             :     KEY_MOD1 | KEY_PAGEUP,
     230             :     KEY_MOD1 | KEY_PAGEDOWN,
     231             :     KEY_MOD1 | KEY_RETURN,
     232             :     KEY_MOD1 | KEY_SPACE,
     233             :     KEY_MOD1 | KEY_BACKSPACE,
     234             :     KEY_MOD1 | KEY_INSERT,
     235             :     KEY_MOD1 | KEY_DELETE,
     236             : 
     237             :     KEY_MOD1 | KEY_ADD,
     238             :     KEY_MOD1 | KEY_SUBTRACT,
     239             :     KEY_MOD1 | KEY_MULTIPLY,
     240             :     KEY_MOD1 | KEY_DIVIDE,
     241             : 
     242             :     KEY_SHIFT | KEY_MOD1 | KEY_0,
     243             :     KEY_SHIFT | KEY_MOD1 | KEY_1,
     244             :     KEY_SHIFT | KEY_MOD1 | KEY_2,
     245             :     KEY_SHIFT | KEY_MOD1 | KEY_3,
     246             :     KEY_SHIFT | KEY_MOD1 | KEY_4,
     247             :     KEY_SHIFT | KEY_MOD1 | KEY_5,
     248             :     KEY_SHIFT | KEY_MOD1 | KEY_6,
     249             :     KEY_SHIFT | KEY_MOD1 | KEY_7,
     250             :     KEY_SHIFT | KEY_MOD1 | KEY_8,
     251             :     KEY_SHIFT | KEY_MOD1 | KEY_9,
     252             :     KEY_SHIFT | KEY_MOD1 | KEY_A,
     253             :     KEY_SHIFT | KEY_MOD1 | KEY_B,
     254             :     KEY_SHIFT | KEY_MOD1 | KEY_C,
     255             :     KEY_SHIFT | KEY_MOD1 | KEY_D,
     256             :     KEY_SHIFT | KEY_MOD1 | KEY_E,
     257             :     KEY_SHIFT | KEY_MOD1 | KEY_F,
     258             :     KEY_SHIFT | KEY_MOD1 | KEY_G,
     259             :     KEY_SHIFT | KEY_MOD1 | KEY_H,
     260             :     KEY_SHIFT | KEY_MOD1 | KEY_I,
     261             :     KEY_SHIFT | KEY_MOD1 | KEY_J,
     262             :     KEY_SHIFT | KEY_MOD1 | KEY_K,
     263             :     KEY_SHIFT | KEY_MOD1 | KEY_L,
     264             :     KEY_SHIFT | KEY_MOD1 | KEY_M,
     265             :     KEY_SHIFT | KEY_MOD1 | KEY_N,
     266             :     KEY_SHIFT | KEY_MOD1 | KEY_O,
     267             :     KEY_SHIFT | KEY_MOD1 | KEY_P,
     268             :     KEY_SHIFT | KEY_MOD1 | KEY_Q,
     269             :     KEY_SHIFT | KEY_MOD1 | KEY_R,
     270             :     KEY_SHIFT | KEY_MOD1 | KEY_S,
     271             :     KEY_SHIFT | KEY_MOD1 | KEY_T,
     272             :     KEY_SHIFT | KEY_MOD1 | KEY_U,
     273             :     KEY_SHIFT | KEY_MOD1 | KEY_V,
     274             :     KEY_SHIFT | KEY_MOD1 | KEY_W,
     275             :     KEY_SHIFT | KEY_MOD1 | KEY_X,
     276             :     KEY_SHIFT | KEY_MOD1 | KEY_Y,
     277             :     KEY_SHIFT | KEY_MOD1 | KEY_Z,
     278             :     KEY_SHIFT | KEY_MOD1 | KEY_SEMICOLON,
     279             :     KEY_SHIFT | KEY_MOD1 | KEY_QUOTERIGHT,
     280             :     KEY_SHIFT | KEY_MOD1 | KEY_BRACKETLEFT,
     281             :     KEY_SHIFT | KEY_MOD1 | KEY_BRACKETRIGHT,
     282             :     KEY_SHIFT | KEY_MOD1 | KEY_POINT,
     283             : 
     284             :     KEY_SHIFT | KEY_MOD1 | KEY_F1,
     285             :     KEY_SHIFT | KEY_MOD1 | KEY_F2,
     286             :     KEY_SHIFT | KEY_MOD1 | KEY_F3,
     287             :     KEY_SHIFT | KEY_MOD1 | KEY_F4,
     288             :     KEY_SHIFT | KEY_MOD1 | KEY_F5,
     289             :     KEY_SHIFT | KEY_MOD1 | KEY_F6,
     290             :     KEY_SHIFT | KEY_MOD1 | KEY_F7,
     291             :     KEY_SHIFT | KEY_MOD1 | KEY_F8,
     292             :     KEY_SHIFT | KEY_MOD1 | KEY_F9,
     293             :     KEY_SHIFT | KEY_MOD1 | KEY_F10,
     294             :     KEY_SHIFT | KEY_MOD1 | KEY_F11,
     295             :     KEY_SHIFT | KEY_MOD1 | KEY_F12,
     296             :     KEY_SHIFT | KEY_MOD1 | KEY_F13,
     297             :     KEY_SHIFT | KEY_MOD1 | KEY_F14,
     298             :     KEY_SHIFT | KEY_MOD1 | KEY_F15,
     299             :     KEY_SHIFT | KEY_MOD1 | KEY_F16,
     300             : 
     301             :     KEY_SHIFT | KEY_MOD1 | KEY_DOWN,
     302             :     KEY_SHIFT | KEY_MOD1 | KEY_UP,
     303             :     KEY_SHIFT | KEY_MOD1 | KEY_LEFT,
     304             :     KEY_SHIFT | KEY_MOD1 | KEY_RIGHT,
     305             :     KEY_SHIFT | KEY_MOD1 | KEY_HOME,
     306             :     KEY_SHIFT | KEY_MOD1 | KEY_END,
     307             :     KEY_SHIFT | KEY_MOD1 | KEY_PAGEUP,
     308             :     KEY_SHIFT | KEY_MOD1 | KEY_PAGEDOWN,
     309             :     KEY_SHIFT | KEY_MOD1 | KEY_RETURN,
     310             :     KEY_SHIFT | KEY_MOD1 | KEY_ESCAPE,
     311             :     KEY_SHIFT | KEY_MOD1 | KEY_BACKSPACE,
     312             :     KEY_SHIFT | KEY_MOD1 | KEY_INSERT,
     313             :     KEY_SHIFT | KEY_MOD1 | KEY_DELETE,
     314             : 
     315             :     KEY_MOD2 | KEY_0,
     316             :     KEY_MOD2 | KEY_1,
     317             :     KEY_MOD2 | KEY_2,
     318             :     KEY_MOD2 | KEY_3,
     319             :     KEY_MOD2 | KEY_4,
     320             :     KEY_MOD2 | KEY_5,
     321             :     KEY_MOD2 | KEY_6,
     322             :     KEY_MOD2 | KEY_7,
     323             :     KEY_MOD2 | KEY_8,
     324             :     KEY_MOD2 | KEY_9,
     325             :     KEY_MOD2 | KEY_A,
     326             :     KEY_MOD2 | KEY_B,
     327             :     KEY_MOD2 | KEY_C,
     328             :     KEY_MOD2 | KEY_D,
     329             :     KEY_MOD2 | KEY_E,
     330             :     KEY_MOD2 | KEY_F,
     331             :     KEY_MOD2 | KEY_G,
     332             :     KEY_MOD2 | KEY_H,
     333             :     KEY_MOD2 | KEY_I,
     334             :     KEY_MOD2 | KEY_J,
     335             :     KEY_MOD2 | KEY_K,
     336             :     KEY_MOD2 | KEY_L,
     337             :     KEY_MOD2 | KEY_M,
     338             :     KEY_MOD2 | KEY_N,
     339             :     KEY_MOD2 | KEY_O,
     340             :     KEY_MOD2 | KEY_P,
     341             :     KEY_MOD2 | KEY_Q,
     342             :     KEY_MOD2 | KEY_R,
     343             :     KEY_MOD2 | KEY_S,
     344             :     KEY_MOD2 | KEY_T,
     345             :     KEY_MOD2 | KEY_U,
     346             :     KEY_MOD2 | KEY_V,
     347             :     KEY_MOD2 | KEY_W,
     348             :     KEY_MOD2 | KEY_X,
     349             :     KEY_MOD2 | KEY_Y,
     350             :     KEY_MOD2 | KEY_Z,
     351             :     KEY_MOD2 | KEY_SEMICOLON,
     352             :     KEY_MOD2 | KEY_QUOTERIGHT,
     353             :     KEY_MOD2 | KEY_BRACKETLEFT,
     354             :     KEY_MOD2 | KEY_BRACKETRIGHT,
     355             :     KEY_MOD2 | KEY_POINT,
     356             : 
     357             :     KEY_MOD2 | KEY_F1,
     358             :     KEY_MOD2 | KEY_F2,
     359             :     KEY_MOD2 | KEY_F3,
     360             :     KEY_MOD2 | KEY_F4,
     361             :     KEY_MOD2 | KEY_F5,
     362             :     KEY_MOD2 | KEY_F6,
     363             :     KEY_MOD2 | KEY_F7,
     364             :     KEY_MOD2 | KEY_F8,
     365             :     KEY_MOD2 | KEY_F9,
     366             :     KEY_MOD2 | KEY_F10,
     367             :     KEY_MOD2 | KEY_F11,
     368             :     KEY_MOD2 | KEY_F12,
     369             :     KEY_MOD2 | KEY_F13,
     370             :     KEY_MOD2 | KEY_F14,
     371             :     KEY_MOD2 | KEY_F15,
     372             :     KEY_MOD2 | KEY_F16,
     373             : 
     374             :     KEY_MOD2 | KEY_DOWN,
     375             :     KEY_MOD2 | KEY_UP,
     376             :     KEY_MOD2 | KEY_LEFT,
     377             :     KEY_MOD2 | KEY_RIGHT,
     378             :     KEY_MOD2 | KEY_HOME,
     379             :     KEY_MOD2 | KEY_END,
     380             :     KEY_MOD2 | KEY_PAGEUP,
     381             :     KEY_MOD2 | KEY_PAGEDOWN,
     382             :     KEY_MOD2 | KEY_RETURN,
     383             :     KEY_MOD2 | KEY_SPACE,
     384             :     KEY_MOD2 | KEY_BACKSPACE,
     385             :     KEY_MOD2 | KEY_INSERT,
     386             :     KEY_MOD2 | KEY_DELETE,
     387             : 
     388             :     KEY_SHIFT | KEY_MOD2 | KEY_0,
     389             :     KEY_SHIFT | KEY_MOD2 | KEY_1,
     390             :     KEY_SHIFT | KEY_MOD2 | KEY_2,
     391             :     KEY_SHIFT | KEY_MOD2 | KEY_3,
     392             :     KEY_SHIFT | KEY_MOD2 | KEY_4,
     393             :     KEY_SHIFT | KEY_MOD2 | KEY_5,
     394             :     KEY_SHIFT | KEY_MOD2 | KEY_6,
     395             :     KEY_SHIFT | KEY_MOD2 | KEY_7,
     396             :     KEY_SHIFT | KEY_MOD2 | KEY_8,
     397             :     KEY_SHIFT | KEY_MOD2 | KEY_9,
     398             :     KEY_SHIFT | KEY_MOD2 | KEY_A,
     399             :     KEY_SHIFT | KEY_MOD2 | KEY_B,
     400             :     KEY_SHIFT | KEY_MOD2 | KEY_C,
     401             :     KEY_SHIFT | KEY_MOD2 | KEY_D,
     402             :     KEY_SHIFT | KEY_MOD2 | KEY_E,
     403             :     KEY_SHIFT | KEY_MOD2 | KEY_F,
     404             :     KEY_SHIFT | KEY_MOD2 | KEY_G,
     405             :     KEY_SHIFT | KEY_MOD2 | KEY_H,
     406             :     KEY_SHIFT | KEY_MOD2 | KEY_I,
     407             :     KEY_SHIFT | KEY_MOD2 | KEY_J,
     408             :     KEY_SHIFT | KEY_MOD2 | KEY_K,
     409             :     KEY_SHIFT | KEY_MOD2 | KEY_L,
     410             :     KEY_SHIFT | KEY_MOD2 | KEY_M,
     411             :     KEY_SHIFT | KEY_MOD2 | KEY_N,
     412             :     KEY_SHIFT | KEY_MOD2 | KEY_O,
     413             :     KEY_SHIFT | KEY_MOD2 | KEY_P,
     414             :     KEY_SHIFT | KEY_MOD2 | KEY_Q,
     415             :     KEY_SHIFT | KEY_MOD2 | KEY_R,
     416             :     KEY_SHIFT | KEY_MOD2 | KEY_S,
     417             :     KEY_SHIFT | KEY_MOD2 | KEY_T,
     418             :     KEY_SHIFT | KEY_MOD2 | KEY_U,
     419             :     KEY_SHIFT | KEY_MOD2 | KEY_V,
     420             :     KEY_SHIFT | KEY_MOD2 | KEY_W,
     421             :     KEY_SHIFT | KEY_MOD2 | KEY_X,
     422             :     KEY_SHIFT | KEY_MOD2 | KEY_Y,
     423             :     KEY_SHIFT | KEY_MOD2 | KEY_Z,
     424             :     KEY_SHIFT | KEY_MOD2 | KEY_SEMICOLON,
     425             :     KEY_SHIFT | KEY_MOD2 | KEY_QUOTERIGHT,
     426             :     KEY_SHIFT | KEY_MOD2 | KEY_BRACKETLEFT,
     427             :     KEY_SHIFT | KEY_MOD2 | KEY_BRACKETRIGHT,
     428             :     KEY_SHIFT | KEY_MOD2 | KEY_POINT,
     429             : 
     430             :     KEY_SHIFT | KEY_MOD2 | KEY_F1,
     431             :     KEY_SHIFT | KEY_MOD2 | KEY_F2,
     432             :     KEY_SHIFT | KEY_MOD2 | KEY_F3,
     433             :     KEY_SHIFT | KEY_MOD2 | KEY_F4,
     434             :     KEY_SHIFT | KEY_MOD2 | KEY_F5,
     435             :     KEY_SHIFT | KEY_MOD2 | KEY_F6,
     436             :     KEY_SHIFT | KEY_MOD2 | KEY_F7,
     437             :     KEY_SHIFT | KEY_MOD2 | KEY_F8,
     438             :     KEY_SHIFT | KEY_MOD2 | KEY_F9,
     439             :     KEY_SHIFT | KEY_MOD2 | KEY_F10,
     440             :     KEY_SHIFT | KEY_MOD2 | KEY_F11,
     441             :     KEY_SHIFT | KEY_MOD2 | KEY_F12,
     442             :     KEY_SHIFT | KEY_MOD2 | KEY_F13,
     443             :     KEY_SHIFT | KEY_MOD2 | KEY_F14,
     444             :     KEY_SHIFT | KEY_MOD2 | KEY_F15,
     445             :     KEY_SHIFT | KEY_MOD2 | KEY_F16,
     446             : 
     447             :     KEY_SHIFT | KEY_MOD2 | KEY_DOWN,
     448             :     KEY_SHIFT | KEY_MOD2 | KEY_UP,
     449             :     KEY_SHIFT | KEY_MOD2 | KEY_LEFT,
     450             :     KEY_SHIFT | KEY_MOD2 | KEY_RIGHT,
     451             :     KEY_SHIFT | KEY_MOD2 | KEY_HOME,
     452             :     KEY_SHIFT | KEY_MOD2 | KEY_END,
     453             :     KEY_SHIFT | KEY_MOD2 | KEY_PAGEUP,
     454             :     KEY_SHIFT | KEY_MOD2 | KEY_PAGEDOWN,
     455             :     KEY_SHIFT | KEY_MOD2 | KEY_RETURN,
     456             :     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,
     460             : 
     461             :     KEY_MOD1 | KEY_MOD2 | KEY_0,
     462             :     KEY_MOD1 | KEY_MOD2 | KEY_1,
     463             :     KEY_MOD1 | KEY_MOD2 | KEY_2,
     464             :     KEY_MOD1 | KEY_MOD2 | KEY_3,
     465             :     KEY_MOD1 | KEY_MOD2 | KEY_4,
     466             :     KEY_MOD1 | KEY_MOD2 | KEY_5,
     467             :     KEY_MOD1 | KEY_MOD2 | KEY_6,
     468             :     KEY_MOD1 | KEY_MOD2 | KEY_7,
     469             :     KEY_MOD1 | KEY_MOD2 | KEY_8,
     470             :     KEY_MOD1 | KEY_MOD2 | KEY_9,
     471             :     KEY_MOD1 | KEY_MOD2 | KEY_A,
     472             :     KEY_MOD1 | KEY_MOD2 | KEY_B,
     473             :     KEY_MOD1 | KEY_MOD2 | KEY_C,
     474             :     KEY_MOD1 | KEY_MOD2 | KEY_D,
     475             :     KEY_MOD1 | KEY_MOD2 | KEY_E,
     476             :     KEY_MOD1 | KEY_MOD2 | KEY_F,
     477             :     KEY_MOD1 | KEY_MOD2 | KEY_G,
     478             :     KEY_MOD1 | KEY_MOD2 | KEY_H,
     479             :     KEY_MOD1 | KEY_MOD2 | KEY_I,
     480             :     KEY_MOD1 | KEY_MOD2 | KEY_J,
     481             :     KEY_MOD1 | KEY_MOD2 | KEY_K,
     482             :     KEY_MOD1 | KEY_MOD2 | KEY_L,
     483             :     KEY_MOD1 | KEY_MOD2 | KEY_M,
     484             :     KEY_MOD1 | KEY_MOD2 | KEY_N,
     485             :     KEY_MOD1 | KEY_MOD2 | KEY_O,
     486             :     KEY_MOD1 | KEY_MOD2 | KEY_P,
     487             :     KEY_MOD1 | KEY_MOD2 | KEY_Q,
     488             :     KEY_MOD1 | KEY_MOD2 | KEY_R,
     489             :     KEY_MOD1 | KEY_MOD2 | KEY_S,
     490             :     KEY_MOD1 | KEY_MOD2 | KEY_T,
     491             :     KEY_MOD1 | KEY_MOD2 | KEY_U,
     492             :     KEY_MOD1 | KEY_MOD2 | KEY_V,
     493             :     KEY_MOD1 | KEY_MOD2 | KEY_W,
     494             :     KEY_MOD1 | KEY_MOD2 | KEY_X,
     495             :     KEY_MOD1 | KEY_MOD2 | KEY_Y,
     496             :     KEY_MOD1 | KEY_MOD2 | KEY_Z,
     497             :     KEY_MOD1 | KEY_MOD2 | KEY_SEMICOLON,
     498             :     KEY_MOD1 | KEY_MOD2 | KEY_QUOTERIGHT,
     499             :     KEY_MOD1 | KEY_MOD2 | KEY_BRACKETLEFT,
     500             :     KEY_MOD1 | KEY_MOD2 | KEY_BRACKETRIGHT,
     501             :     KEY_MOD1 | KEY_MOD2 | KEY_POINT,
     502             : 
     503             :     KEY_MOD1 | KEY_MOD2 | KEY_F1,
     504             :     KEY_MOD1 | KEY_MOD2 | KEY_F2,
     505             :     KEY_MOD1 | KEY_MOD2 | KEY_F3,
     506             :     KEY_MOD1 | KEY_MOD2 | KEY_F4,
     507             :     KEY_MOD1 | KEY_MOD2 | KEY_F5,
     508             :     KEY_MOD1 | KEY_MOD2 | KEY_F6,
     509             :     KEY_MOD1 | KEY_MOD2 | KEY_F7,
     510             :     KEY_MOD1 | KEY_MOD2 | KEY_F8,
     511             :     KEY_MOD1 | KEY_MOD2 | KEY_F9,
     512             :     KEY_MOD1 | KEY_MOD2 | KEY_F10,
     513             :     KEY_MOD1 | KEY_MOD2 | KEY_F11,
     514             :     KEY_MOD1 | KEY_MOD2 | KEY_F12,
     515             :     KEY_MOD1 | KEY_MOD2 | KEY_F13,
     516             :     KEY_MOD1 | KEY_MOD2 | KEY_F14,
     517             :     KEY_MOD1 | KEY_MOD2 | KEY_F15,
     518             :     KEY_MOD1 | KEY_MOD2 | KEY_F16,
     519             : 
     520             :     KEY_MOD1 | KEY_MOD2 | KEY_DOWN,
     521             :     KEY_MOD1 | KEY_MOD2 | KEY_UP,
     522             :     KEY_MOD1 | KEY_MOD2 | KEY_LEFT,
     523             :     KEY_MOD1 | KEY_MOD2 | KEY_RIGHT,
     524             :     KEY_MOD1 | KEY_MOD2 | KEY_HOME,
     525             :     KEY_MOD1 | KEY_MOD2 | KEY_END,
     526             :     KEY_MOD1 | KEY_MOD2 | KEY_PAGEUP,
     527             :     KEY_MOD1 | KEY_MOD2 | KEY_PAGEDOWN,
     528             :     KEY_MOD1 | KEY_MOD2 | KEY_RETURN,
     529             :     KEY_MOD1 | KEY_MOD2 | KEY_SPACE,
     530             :     KEY_MOD1 | KEY_MOD2 | KEY_BACKSPACE,
     531             :     KEY_MOD1 | KEY_MOD2 | KEY_INSERT,
     532             :     KEY_MOD1 | KEY_MOD2 | KEY_DELETE,
     533             : 
     534             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_0,
     535             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_1,
     536             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_2,
     537             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_3,
     538             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_4,
     539             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_5,
     540             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_6,
     541             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_7,
     542             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_8,
     543             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_9,
     544             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_A,
     545             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_B,
     546             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_C,
     547             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_D,
     548             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_E,
     549             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F,
     550             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_G,
     551             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_H,
     552             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_I,
     553             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_J,
     554             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_K,
     555             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_L,
     556             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_M,
     557             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_N,
     558             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_O,
     559             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_P,
     560             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_Q,
     561             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_R,
     562             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_S,
     563             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_T,
     564             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_U,
     565             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_V,
     566             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_W,
     567             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_X,
     568             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_Y,
     569             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_Z,
     570             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_SEMICOLON,
     571             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_QUOTERIGHT,
     572             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_BRACKETLEFT,
     573             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_BRACKETRIGHT,
     574             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_POINT,
     575             : 
     576             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F1,
     577             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F2,
     578             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F3,
     579             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F4,
     580             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F5,
     581             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F6,
     582             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F7,
     583             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F8,
     584             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F9,
     585             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F10,
     586             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F11,
     587             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F12,
     588             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F13,
     589             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F14,
     590             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F15,
     591             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_F16,
     592             : 
     593             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_DOWN,
     594             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_UP,
     595             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_LEFT,
     596             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_RIGHT,
     597             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_HOME,
     598             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_END,
     599             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_PAGEUP,
     600             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_PAGEDOWN,
     601             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_RETURN,
     602             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_SPACE,
     603             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_BACKSPACE,
     604             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_INSERT,
     605             :     KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_DELETE
     606             : };
     607             : 
     608             : static const sal_uInt16 KEYCODE_ARRAY_SIZE = SAL_N_ELEMENTS(KEYCODE_ARRAY);
     609             : 
     610             : // seems to be needed to layout the list box, which shows all
     611             : // assignable shortcuts
     612             : static long AccCfgTabs[] =
     613             : {
     614             :     2,  // Number of Tabs
     615             :     0,
     616             :     120 // Function
     617             : };
     618             : 
     619             : 
     620             : class SfxAccCfgLBoxString_Impl : public SvLBoxString
     621             : {
     622             : public:
     623             :     SfxAccCfgLBoxString_Impl(SvTreeListEntry* pEntry, sal_uInt16 nFlags, const OUString& sText);
     624             : 
     625             :     virtual ~SfxAccCfgLBoxString_Impl();
     626             : 
     627             :     virtual void Paint(const Point& aPos, SvTreeListBox& rDevice, vcl::RenderContext& rRenderContext,
     628             :                        const SvViewDataEntry* pView, const SvTreeListEntry& rEntry) SAL_OVERRIDE;
     629             : };
     630             : 
     631             : 
     632           0 : SfxAccCfgLBoxString_Impl::SfxAccCfgLBoxString_Impl(SvTreeListEntry* pEntry, sal_uInt16 nFlags, const OUString& sText)
     633           0 :     : SvLBoxString(pEntry, nFlags, sText)
     634           0 : {}
     635             : 
     636           0 : SfxAccCfgLBoxString_Impl::~SfxAccCfgLBoxString_Impl()
     637           0 : {}
     638             : 
     639           0 : void SfxAccCfgLBoxString_Impl::Paint(const Point& aPos, SvTreeListBox& /*rDevice*/, vcl::RenderContext& rRenderContext,
     640             :                                      const SvViewDataEntry* /*pView*/, const SvTreeListEntry& rEntry)
     641             : {
     642           0 :     TAccInfo* pUserData = static_cast<TAccInfo*>(rEntry.GetUserData());
     643           0 :     if (!pUserData)
     644           0 :         return;
     645             : 
     646           0 :     if (pUserData->m_bIsConfigurable)
     647           0 :         rRenderContext.DrawText(aPos, GetText());
     648             :     else
     649           0 :         rRenderContext.DrawCtrlText(aPos, GetText(), 0, -1, DrawTextFlags::Disable);
     650             : 
     651             : }
     652             : 
     653           0 : VCL_BUILDER_DECL_FACTORY(SfxAccCfgTabListBox)
     654             : {
     655           0 :     WinBits nWinBits = WB_TABSTOP;
     656             : 
     657           0 :     OString sBorder = VclBuilder::extractCustomProperty(rMap);
     658           0 :     if (!sBorder.isEmpty())
     659           0 :        nWinBits |= WB_BORDER;
     660             : 
     661           0 :     rRet = VclPtr<SfxAccCfgTabListBox_Impl>::Create(pParent, nWinBits);
     662           0 : }
     663             : 
     664           0 : void SfxAccCfgTabListBox_Impl::InitEntry(SvTreeListEntry* pEntry,
     665             :                                          const OUString& rText,
     666             :                                          const Image& rImage1,
     667             :                                          const Image& rImage2,
     668             :                                          SvLBoxButtonKind eButtonKind)
     669             : {
     670           0 :     SvTabListBox::InitEntry(pEntry, rText, rImage1, rImage2, eButtonKind);
     671           0 : }
     672             : 
     673           0 : SfxAccCfgTabListBox_Impl::~SfxAccCfgTabListBox_Impl()
     674             : {
     675           0 :     disposeOnce();
     676           0 : }
     677             : 
     678           0 : void SfxAccCfgTabListBox_Impl::dispose()
     679             : {
     680           0 :     m_pAccelConfigPage.clear();
     681           0 :     SvTabListBox::dispose();
     682           0 : }
     683             : 
     684             : /** select the entry, which match the current key input ... excepting
     685             :     keys, which are used for the dialog itself.
     686             :   */
     687           0 : void SfxAccCfgTabListBox_Impl::KeyInput(const KeyEvent& aKey)
     688             : {
     689           0 :     vcl::KeyCode aCode1 = aKey.GetKeyCode();
     690           0 :     sal_uInt16 nCode1 = aCode1.GetCode();
     691           0 :     sal_uInt16 nMod1 = aCode1.GetModifier();
     692             : 
     693             :     // is it related to our list box ?
     694           0 :     if (
     695           0 :         (nCode1 != KEY_DOWN    ) &&
     696           0 :         (nCode1 != KEY_UP      ) &&
     697           0 :         (nCode1 != KEY_LEFT    ) &&
     698           0 :         (nCode1 != KEY_RIGHT   ) &&
     699           0 :         (nCode1 != KEY_PAGEUP  ) &&
     700             :         (nCode1 != KEY_PAGEDOWN)
     701             :        )
     702             :     {
     703           0 :         SvTreeListEntry* pEntry = First();
     704           0 :         while (pEntry)
     705             :         {
     706           0 :             TAccInfo* pUserData = static_cast<TAccInfo*>(pEntry->GetUserData());
     707           0 :             if (pUserData)
     708             :             {
     709           0 :                 sal_uInt16 nCode2 = pUserData->m_aKey.GetCode();
     710           0 :                 sal_uInt16 nMod2  = pUserData->m_aKey.GetModifier();
     711             : 
     712           0 :                 if ((nCode1 == nCode2) &&
     713             :                     (nMod1  == nMod2 ))
     714             :                 {
     715           0 :                     Select(pEntry);
     716           0 :                     MakeVisible(pEntry);
     717           0 :                     return;
     718             :                 }
     719             :             }
     720           0 :             pEntry = Next(pEntry);
     721             :         }
     722             :     }
     723             : 
     724             :     // no - handle it as normal dialog input
     725           0 :     SvTabListBox::KeyInput(aKey);
     726             : }
     727             : 
     728           0 : SfxAcceleratorConfigPage::SfxAcceleratorConfigPage( vcl::Window* pParent, const SfxItemSet& aSet )
     729             :     : SfxTabPage(pParent, "AccelConfigPage", "cui/ui/accelconfigpage.ui", &aSet)
     730             :     , m_pMacroInfoItem()
     731             :     , m_pStringItem()
     732             :     , m_pFontItem()
     733             :     , m_pFileDlg(NULL)
     734           0 :     , aLoadAccelConfigStr(CUI_RES(RID_SVXSTR_LOADACCELCONFIG))
     735           0 :     , aSaveAccelConfigStr(CUI_RES(RID_SVXSTR_SAVEACCELCONFIG))
     736           0 :     , aFilterCfgStr(CUI_RES(RID_SVXSTR_FILTERNAME_CFG))
     737             :     , m_bStylesInfoInitialized(false)
     738             :     , m_xGlobal()
     739             :     , m_xModule()
     740           0 :     , m_xAct()
     741             : {
     742           0 :     get(m_pOfficeButton, "office");
     743           0 :     get(m_pModuleButton, "module");
     744           0 :     get(m_pChangeButton, "change");
     745           0 :     get(m_pRemoveButton, "delete");
     746           0 :     get(m_pLoadButton, "load");
     747           0 :     get(m_pSaveButton, "save");
     748           0 :     get(m_pResetButton, "reset");
     749           0 :     get(m_pEntriesBox, "shortcuts");
     750           0 :     Size aSize(LogicToPixel(Size(174, 100), MAP_APPFONT));
     751           0 :     m_pEntriesBox->set_width_request(aSize.Width());
     752           0 :     m_pEntriesBox->set_height_request(aSize.Height());
     753           0 :     m_pEntriesBox->SetAccelConfigPage(this);
     754           0 :     get(m_pGroupLBox, "category");
     755           0 :     aSize = LogicToPixel(Size(78 , 91), MAP_APPFONT);
     756           0 :     m_pGroupLBox->set_width_request(aSize.Width());
     757           0 :     m_pGroupLBox->set_height_request(aSize.Height());
     758           0 :     get(m_pFunctionBox, "function");
     759           0 :     aSize = LogicToPixel(Size(88, 91), MAP_APPFONT);
     760           0 :     m_pFunctionBox->set_width_request(aSize.Width());
     761           0 :     m_pFunctionBox->set_height_request(aSize.Height());
     762           0 :     get(m_pKeyBox, "keys");
     763           0 :     aSize = LogicToPixel(Size(80, 91), MAP_APPFONT);
     764           0 :     m_pKeyBox->set_width_request(aSize.Width());
     765           0 :     m_pKeyBox->set_height_request(aSize.Height());
     766             : 
     767           0 :     aFilterAllStr = SfxResId( STR_SFX_FILTERNAME_ALL );
     768             : 
     769             :     // install handler functions
     770           0 :     m_pChangeButton->SetClickHdl( LINK( this, SfxAcceleratorConfigPage, ChangeHdl ));
     771           0 :     m_pRemoveButton->SetClickHdl( LINK( this, SfxAcceleratorConfigPage, RemoveHdl ));
     772           0 :     m_pEntriesBox->SetSelectHdl ( LINK( this, SfxAcceleratorConfigPage, SelectHdl ));
     773           0 :     m_pGroupLBox->SetSelectHdl  ( LINK( this, SfxAcceleratorConfigPage, SelectHdl ));
     774           0 :     m_pFunctionBox->SetSelectHdl( LINK( this, SfxAcceleratorConfigPage, SelectHdl ));
     775           0 :     m_pKeyBox->SetSelectHdl     ( LINK( this, SfxAcceleratorConfigPage, SelectHdl ));
     776           0 :     m_pLoadButton->SetClickHdl  ( LINK( this, SfxAcceleratorConfigPage, Load      ));
     777           0 :     m_pSaveButton->SetClickHdl  ( LINK( this, SfxAcceleratorConfigPage, Save      ));
     778           0 :     m_pResetButton->SetClickHdl ( LINK( this, SfxAcceleratorConfigPage, Default   ));
     779           0 :     m_pOfficeButton->SetClickHdl( LINK( this, SfxAcceleratorConfigPage, RadioHdl  ));
     780           0 :     m_pModuleButton->SetClickHdl( LINK( this, SfxAcceleratorConfigPage, RadioHdl  ));
     781             : 
     782             :     // initialize Entriesbox
     783           0 :     m_pEntriesBox->SetStyle(m_pEntriesBox->GetStyle()|WB_HSCROLL|WB_CLIPCHILDREN);
     784           0 :     m_pEntriesBox->SetSelectionMode(SINGLE_SELECTION);
     785           0 :     m_pEntriesBox->SetTabs(&AccCfgTabs[0], MAP_APPFONT);
     786           0 :     m_pEntriesBox->Resize(); // OS: Hack for right selection
     787           0 :     m_pEntriesBox->SetSpaceBetweenEntries(0);
     788           0 :     m_pEntriesBox->SetDragDropMode(DragDropMode::NONE);
     789             : 
     790             :     // detect max keyname width
     791           0 :     long nMaxWidth  = 0;
     792           0 :     for ( sal_uInt16 i = 0; i < KEYCODE_ARRAY_SIZE; ++i )
     793             :     {
     794           0 :         long nTmp = GetTextWidth( vcl::KeyCode( KEYCODE_ARRAY[i] ).GetName() );
     795           0 :         if ( nTmp > nMaxWidth )
     796           0 :             nMaxWidth = nTmp;
     797             :     }
     798             :     // recalc second tab
     799           0 :     long nNewTab = PixelToLogic( Size( nMaxWidth, 0 ), MAP_APPFONT ).Width();
     800           0 :     nNewTab = nNewTab + 5; // additional space
     801           0 :     m_pEntriesBox->SetTab( 1, nNewTab );
     802             : 
     803             :     // initialize GroupBox
     804           0 :     m_pGroupLBox->SetFunctionListBox(m_pFunctionBox);
     805             : 
     806             :     // initialize KeyBox
     807           0 :     m_pKeyBox->SetStyle(m_pKeyBox->GetStyle()|WB_CLIPCHILDREN|WB_HSCROLL|WB_SORT);
     808           0 : }
     809             : 
     810           0 : SfxAcceleratorConfigPage::~SfxAcceleratorConfigPage()
     811             : {
     812           0 :     disposeOnce();
     813           0 : }
     814             : 
     815           0 : void SfxAcceleratorConfigPage::dispose()
     816             : {
     817             :     // free memory - remove all dynamic user data
     818           0 :     SvTreeListEntry* pEntry = m_pEntriesBox->First();
     819           0 :     while (pEntry)
     820             :     {
     821           0 :         TAccInfo* pUserData = static_cast<TAccInfo*>(pEntry->GetUserData());
     822           0 :         if (pUserData)
     823           0 :             delete pUserData;
     824           0 :         pEntry = m_pEntriesBox->Next(pEntry);
     825             :     }
     826             : 
     827           0 :     pEntry = m_pKeyBox->First();
     828           0 :     while (pEntry)
     829             :     {
     830           0 :         TAccInfo* pUserData = static_cast<TAccInfo*>(pEntry->GetUserData());
     831           0 :         if (pUserData)
     832           0 :             delete pUserData;
     833           0 :         pEntry = m_pKeyBox->Next(pEntry);
     834             :     }
     835             : 
     836           0 :     m_pEntriesBox->Clear();
     837           0 :     m_pKeyBox->Clear();
     838             : 
     839           0 :     delete m_pFileDlg;
     840           0 :     m_pFileDlg = NULL;
     841             : 
     842           0 :     m_pEntriesBox.clear();
     843           0 :     m_pOfficeButton.clear();
     844           0 :     m_pModuleButton.clear();
     845           0 :     m_pChangeButton.clear();
     846           0 :     m_pRemoveButton.clear();
     847           0 :     m_pGroupLBox.clear();
     848           0 :     m_pFunctionBox.clear();
     849           0 :     m_pKeyBox.clear();
     850           0 :     m_pLoadButton.clear();
     851           0 :     m_pSaveButton.clear();
     852           0 :     m_pResetButton.clear();
     853             : 
     854           0 :     SfxTabPage::dispose();
     855           0 : }
     856             : 
     857           0 : void SfxAcceleratorConfigPage::InitAccCfg()
     858             : {
     859             :     // already initialized ?
     860           0 :     if (m_xContext.is())
     861           0 :         return; // yes -> do nothing
     862             : 
     863             :     try
     864             :     {
     865             :         // no - initialize this instance
     866           0 :         m_xContext = comphelper::getProcessComponentContext();
     867             : 
     868           0 :         m_xUICmdDescription = frame::theUICommandDescription::get(m_xContext);
     869             : 
     870             :         // get the current active frame, which should be our "parent"
     871             :         // for this session
     872           0 :         m_xFrame = GetFrame();
     873           0 :         if ( !m_xFrame.is() )
     874             :         {
     875           0 :             uno::Reference<frame::XDesktop2> xDesktop = frame::Desktop::create( m_xContext );
     876           0 :             m_xFrame = xDesktop->getActiveFrame();
     877             :         }
     878             : 
     879             :         // identify module
     880             :         uno::Reference<frame::XModuleManager2> xModuleManager =
     881           0 :                  frame::ModuleManager::create(m_xContext);
     882           0 :         m_sModuleLongName = xModuleManager->identify(m_xFrame);
     883           0 :         comphelper::SequenceAsHashMap lModuleProps(xModuleManager->getByName(m_sModuleLongName));
     884           0 :         m_sModuleShortName = lModuleProps.getUnpackedValueOrDefault(MODULEPROP_SHORTNAME, OUString());
     885           0 :         m_sModuleUIName    = lModuleProps.getUnpackedValueOrDefault(MODULEPROP_UINAME   , OUString());
     886             : 
     887             :         // get global accelerator configuration
     888           0 :         m_xGlobal = css::ui::GlobalAcceleratorConfiguration::create(m_xContext);
     889             : 
     890             :         // get module accelerator configuration
     891             : 
     892             :         uno::Reference<ui::XModuleUIConfigurationManagerSupplier> xModuleCfgSupplier(
     893           0 :             ui::theModuleUIConfigurationManagerSupplier::get(m_xContext));
     894             :         uno::Reference<ui::XUIConfigurationManager> xUICfgManager =
     895           0 :             xModuleCfgSupplier->getUIConfigurationManager(m_sModuleLongName);
     896           0 :         m_xModule = xUICfgManager->getShortCutManager();
     897             :     }
     898           0 :     catch(const uno::RuntimeException&)
     899             :     {
     900           0 :         throw;
     901             :     }
     902           0 :     catch(const uno::Exception&)
     903             :     {
     904           0 :         m_xContext.clear();
     905             :     }
     906             : }
     907             : 
     908             : /** Initialize text columns with own class to enable custom painting
     909             :     This is needed as we have to paint disabled entries by ourself. No support for that in the
     910             :     original SvTabListBox!
     911             :   */
     912           0 : void SfxAcceleratorConfigPage::CreateCustomItems(SvTreeListEntry* pEntry,
     913             :                                                  const OUString& sCol1 ,
     914             :                                                  const OUString& sCol2)
     915             : {
     916           0 :     SfxAccCfgLBoxString_Impl* pStringItem = new SfxAccCfgLBoxString_Impl(pEntry, 0, sCol1);
     917           0 :     pEntry->ReplaceItem(pStringItem, 1);
     918             : 
     919           0 :     pStringItem = new SfxAccCfgLBoxString_Impl(pEntry, 0, sCol2);
     920           0 :     pEntry->ReplaceItem(pStringItem, 2);
     921           0 : }
     922             : 
     923             : 
     924           0 : void SfxAcceleratorConfigPage::Init(const uno::Reference<ui::XAcceleratorConfiguration>& xAccMgr)
     925             : {
     926           0 :     if (!xAccMgr.is())
     927           0 :         return;
     928             : 
     929           0 :     if (!m_bStylesInfoInitialized)
     930             :     {
     931           0 :         uno::Reference<frame::XController> xController;
     932           0 :         uno::Reference<frame::XModel> xModel;
     933           0 :         if (m_xFrame.is())
     934           0 :             xController = m_xFrame->getController();
     935           0 :         if (xController.is())
     936           0 :             xModel = xController->getModel();
     937             : 
     938           0 :         m_aStylesInfo.setModel(xModel);
     939           0 :         m_pFunctionBox->SetStylesInfo(&m_aStylesInfo);
     940           0 :         m_pGroupLBox->SetStylesInfo(&m_aStylesInfo);
     941           0 :         m_bStylesInfoInitialized = true;
     942             :     }
     943             : 
     944             :     // Insert all editable accelerators into list box. It is possible
     945             :     // that some accelerators are not mapped on the current system/keyboard
     946             :     // but we don't want to lose these mappings.
     947           0 :     sal_Int32 c1 = KEYCODE_ARRAY_SIZE;
     948           0 :     sal_Int32 i1  = 0;
     949           0 :     sal_Int32 nListPos = 0;
     950           0 :     for (i1 = 0; i1 < c1; ++i1)
     951             :     {
     952           0 :         vcl::KeyCode aKey = KEYCODE_ARRAY[i1];
     953           0 :         OUString sKey = aKey.GetName();
     954           0 :         if (sKey.isEmpty())
     955           0 :             continue;
     956           0 :         TAccInfo*    pEntry   = new TAccInfo(i1, nListPos, aKey);
     957           0 :         SvTreeListEntry* pLBEntry = m_pEntriesBox->InsertEntryToColumn(sKey, 0L, TREELIST_APPEND, 0xFFFF);
     958           0 :         pLBEntry->SetUserData(pEntry);
     959           0 :     }
     960             : 
     961             :     // Assign all commands to its shortcuts - reading the accelerator config.
     962           0 :     uno::Sequence<awt::KeyEvent> lKeys = xAccMgr->getAllKeyEvents();
     963           0 :     sal_Int32 c2 = lKeys.getLength();
     964           0 :     sal_Int32 i2 = 0;
     965           0 :     sal_uInt16 nCol = m_pEntriesBox->TabCount()-1;
     966             : 
     967           0 :     for (i2=0; i2<c2; ++i2)
     968             :     {
     969           0 :         const awt::KeyEvent& aAWTKey  = lKeys[i2];
     970           0 :               OUString     sCommand = xAccMgr->getCommandByKeyEvent(aAWTKey);
     971           0 :               OUString     sLabel   = GetLabel4Command(sCommand);
     972           0 :               vcl::KeyCode aKeyCode = svt::AcceleratorExecute::st_AWTKey2VCLKey(aAWTKey);
     973           0 :               sal_uLong    nPos     = MapKeyCodeToPos(aKeyCode);
     974             : 
     975           0 :         if (nPos == TREELIST_ENTRY_NOTFOUND)
     976           0 :             continue;
     977             : 
     978           0 :         m_pEntriesBox->SetEntryText(sLabel, nPos, nCol);
     979             : 
     980           0 :         SvTreeListEntry* pLBEntry = m_pEntriesBox->GetEntry(0, nPos);
     981           0 :         TAccInfo* pEntry = static_cast<TAccInfo*>(pLBEntry->GetUserData());
     982             : 
     983           0 :         pEntry->m_bIsConfigurable = true;
     984           0 :         pEntry->m_sCommand = sCommand;
     985           0 :         CreateCustomItems(pLBEntry, SvTabListBox::GetEntryText(pLBEntry, 0), sLabel);
     986           0 :     }
     987             : 
     988             :     // Map the VCL hardcoded key codes and mark them as not changeable
     989           0 :     sal_uLong c3 = Application::GetReservedKeyCodeCount();
     990           0 :     sal_uLong i3 = 0;
     991           0 :     for (i3 = 0; i3 < c3; ++i3)
     992             :     {
     993           0 :         const vcl::KeyCode* pKeyCode = Application::GetReservedKeyCode(i3);
     994           0 :         sal_uLong nPos = MapKeyCodeToPos(*pKeyCode);
     995             : 
     996           0 :         if (nPos == TREELIST_ENTRY_NOTFOUND)
     997           0 :             continue;
     998             : 
     999             :         // Hardcoded function mapped so no ID possible and mark entry as not changeable
    1000           0 :         SvTreeListEntry* pLBEntry = m_pEntriesBox->GetEntry(0, nPos);
    1001           0 :         TAccInfo* pEntry = static_cast<TAccInfo*>(pLBEntry->GetUserData());
    1002             : 
    1003           0 :         pEntry->m_bIsConfigurable = false;
    1004           0 :         CreateCustomItems(pLBEntry, SvTabListBox::GetEntryText(pLBEntry, 0), OUString());
    1005           0 :     }
    1006             : }
    1007             : 
    1008           0 : void SfxAcceleratorConfigPage::Apply(const uno::Reference<ui::XAcceleratorConfiguration>& xAccMgr)
    1009             : {
    1010           0 :     if (!xAccMgr.is())
    1011           0 :         return;
    1012             : 
    1013             :     // Go through the list from the bottom to the top ...
    1014             :     // because logical accelerator must be preferred instead of
    1015             :     // physical ones!
    1016           0 :     SvTreeListEntry* pEntry = m_pEntriesBox->First();
    1017           0 :     while (pEntry)
    1018             :     {
    1019           0 :         TAccInfo* pUserData = static_cast<TAccInfo*>(pEntry->GetUserData());
    1020           0 :         OUString sCommand;
    1021           0 :         awt::KeyEvent aAWTKey;
    1022             : 
    1023           0 :         if (pUserData)
    1024             :         {
    1025           0 :             sCommand = pUserData->m_sCommand;
    1026           0 :             aAWTKey  = svt::AcceleratorExecute::st_VCLKey2AWTKey(pUserData->m_aKey);
    1027             :         }
    1028             : 
    1029             :         try
    1030             :         {
    1031           0 :             if (!sCommand.isEmpty())
    1032           0 :                 xAccMgr->setKeyEvent(aAWTKey, sCommand);
    1033             :             else
    1034           0 :                 xAccMgr->removeKeyEvent(aAWTKey);
    1035             :         }
    1036           0 :         catch(const uno::RuntimeException&)
    1037             :         {
    1038           0 :             throw;
    1039             :         }
    1040           0 :         catch(const uno::Exception&)
    1041             :         {
    1042             :         }
    1043             : 
    1044           0 :         pEntry = m_pEntriesBox->Next(pEntry);
    1045           0 :     }
    1046             : }
    1047             : 
    1048           0 : void SfxAcceleratorConfigPage::ResetConfig()
    1049             : {
    1050           0 :     m_pEntriesBox->Clear();
    1051           0 : }
    1052             : 
    1053           0 : IMPL_LINK_NOARG(SfxAcceleratorConfigPage, Load)
    1054             : {
    1055             :     // ask for filename, where we should load the new config data from
    1056           0 :     StartFileDialog( 0, aLoadAccelConfigStr );
    1057           0 :     return 0;
    1058             : }
    1059             : 
    1060           0 : IMPL_LINK_NOARG(SfxAcceleratorConfigPage, Save)
    1061             : {
    1062           0 :     StartFileDialog( WB_SAVEAS, aSaveAccelConfigStr );
    1063           0 :     return 0;
    1064             : }
    1065             : 
    1066           0 : IMPL_LINK_NOARG(SfxAcceleratorConfigPage, Default)
    1067             : {
    1068           0 :     uno::Reference<form::XReset> xReset(m_xAct, uno::UNO_QUERY);
    1069           0 :     if (xReset.is())
    1070           0 :         xReset->reset();
    1071             : 
    1072           0 :     m_pEntriesBox->SetUpdateMode(false);
    1073           0 :     ResetConfig();
    1074           0 :     Init(m_xAct);
    1075           0 :     m_pEntriesBox->SetUpdateMode(true);
    1076           0 :     m_pEntriesBox->Invalidate();
    1077           0 :     m_pEntriesBox->Select(m_pEntriesBox->GetEntry(0, 0));
    1078             : 
    1079           0 :     return 0;
    1080             : }
    1081             : 
    1082           0 : IMPL_LINK_NOARG(SfxAcceleratorConfigPage, ChangeHdl)
    1083             : {
    1084           0 :     sal_uLong nPos = SvTreeList::GetRelPos( m_pEntriesBox->FirstSelected() );
    1085           0 :     TAccInfo* pEntry = static_cast<TAccInfo*>(m_pEntriesBox->GetEntry(0, nPos)->GetUserData());
    1086           0 :     OUString sNewCommand = m_pFunctionBox->GetCurCommand();
    1087           0 :     OUString sLabel = m_pFunctionBox->GetCurLabel();
    1088           0 :     if (sLabel.isEmpty())
    1089           0 :         sLabel = GetLabel4Command(sNewCommand);
    1090             : 
    1091           0 :     pEntry->m_sCommand = sNewCommand;
    1092           0 :     sal_uInt16 nCol = m_pEntriesBox->TabCount() - 1;
    1093           0 :     m_pEntriesBox->SetEntryText(sLabel, nPos, nCol);
    1094             : 
    1095           0 :     ((Link<> &) m_pFunctionBox->GetSelectHdl()).Call( m_pFunctionBox );
    1096           0 :     return 0;
    1097             : }
    1098             : 
    1099           0 : IMPL_LINK_NOARG(SfxAcceleratorConfigPage, RemoveHdl)
    1100             : {
    1101             :     // get selected entry
    1102           0 :     sal_uLong nPos = SvTreeList::GetRelPos( m_pEntriesBox->FirstSelected() );
    1103           0 :     TAccInfo* pEntry = static_cast<TAccInfo*>(m_pEntriesBox->GetEntry(0, nPos)->GetUserData());
    1104             : 
    1105             :     // remove function name from selected entry
    1106           0 :     sal_uInt16 nCol = m_pEntriesBox->TabCount() - 1;
    1107           0 :     m_pEntriesBox->SetEntryText( OUString(), nPos, nCol );
    1108           0 :     (pEntry->m_sCommand).clear();
    1109             : 
    1110           0 :     ((Link<> &) m_pFunctionBox->GetSelectHdl()).Call( m_pFunctionBox );
    1111           0 :     return 0;
    1112             : }
    1113             : 
    1114           0 : IMPL_LINK( SfxAcceleratorConfigPage, SelectHdl, Control*, pListBox )
    1115             : {
    1116             :     // disable help
    1117           0 :     Help::ShowBalloon( this, Point(), OUString() );
    1118           0 :     if (pListBox == m_pEntriesBox)
    1119             :     {
    1120           0 :         sal_uLong nPos = SvTreeList::GetRelPos( m_pEntriesBox->FirstSelected() );
    1121           0 :         TAccInfo* pEntry = static_cast<TAccInfo*>(m_pEntriesBox->GetEntry(0, nPos)->GetUserData());
    1122           0 :         OUString sPossibleNewCommand = m_pFunctionBox->GetCurCommand();
    1123             : 
    1124           0 :         m_pRemoveButton->Enable( false );
    1125           0 :         m_pChangeButton->Enable( false );
    1126             : 
    1127           0 :         if (pEntry->m_bIsConfigurable)
    1128             :         {
    1129           0 :             if (pEntry->isConfigured())
    1130           0 :                 m_pRemoveButton->Enable( true );
    1131           0 :             m_pChangeButton->Enable( pEntry->m_sCommand != sPossibleNewCommand );
    1132           0 :         }
    1133             :     }
    1134           0 :     else if ( pListBox == m_pGroupLBox )
    1135             :     {
    1136           0 :         m_pGroupLBox->GroupSelected();
    1137           0 :         if ( !m_pFunctionBox->FirstSelected() )
    1138           0 :             m_pChangeButton->Enable( false );
    1139             :     }
    1140           0 :     else if ( pListBox == m_pFunctionBox )
    1141             :     {
    1142           0 :         m_pRemoveButton->Enable( false );
    1143           0 :         m_pChangeButton->Enable( false );
    1144             : 
    1145             :         // #i36994 First selected can return zero!
    1146           0 :         SvTreeListEntry* pLBEntry = m_pEntriesBox->FirstSelected();
    1147           0 :         if ( pLBEntry != 0 )
    1148             :         {
    1149           0 :             sal_uLong nPos = SvTreeList::GetRelPos( pLBEntry );
    1150           0 :             TAccInfo* pEntry = static_cast<TAccInfo*>(m_pEntriesBox->GetEntry(0, nPos)->GetUserData());
    1151           0 :             OUString sPossibleNewCommand = m_pFunctionBox->GetCurCommand();
    1152             : 
    1153           0 :             if (pEntry->m_bIsConfigurable)
    1154             :             {
    1155           0 :                 if (pEntry->isConfigured())
    1156           0 :                     m_pRemoveButton->Enable( true );
    1157           0 :                 m_pChangeButton->Enable( pEntry->m_sCommand != sPossibleNewCommand );
    1158             :             }
    1159             : 
    1160             :             // update key box
    1161           0 :             m_pKeyBox->Clear();
    1162           0 :             SvTreeListEntry* pIt = m_pEntriesBox->First();
    1163           0 :             while ( pIt )
    1164             :             {
    1165           0 :                 TAccInfo* pUserData = static_cast<TAccInfo*>(pIt->GetUserData());
    1166           0 :                 if ( pUserData && pUserData->m_sCommand == sPossibleNewCommand )
    1167             :                 {
    1168           0 :                     TAccInfo* pU1 = new TAccInfo(-1, -1, pUserData->m_aKey);
    1169           0 :                     SvTreeListEntry* pE1 = m_pKeyBox->InsertEntry( pUserData->m_aKey.GetName(), 0L, true, TREELIST_APPEND );
    1170           0 :                     pE1->SetUserData(pU1);
    1171           0 :                     pE1->EnableChildrenOnDemand( false );
    1172             :                 }
    1173           0 :                 pIt = m_pEntriesBox->Next(pIt);
    1174           0 :             }
    1175             :         }
    1176             :     }
    1177             :     else
    1178             :     {
    1179             :         // goto selected "key" entry of the key box
    1180           0 :         SvTreeListEntry* pE2 = 0;
    1181           0 :         TAccInfo* pU2 = 0;
    1182           0 :         sal_uLong nP2 = TREELIST_ENTRY_NOTFOUND;
    1183           0 :         SvTreeListEntry* pE3 = 0;
    1184             : 
    1185           0 :         pE2 = m_pKeyBox->FirstSelected();
    1186           0 :         if (pE2)
    1187           0 :             pU2 = static_cast<TAccInfo*>(pE2->GetUserData());
    1188           0 :         if (pU2)
    1189           0 :             nP2 = MapKeyCodeToPos(pU2->m_aKey);
    1190           0 :         if (nP2 != TREELIST_ENTRY_NOTFOUND)
    1191           0 :             pE3 = m_pEntriesBox->GetEntry( 0, nP2 );
    1192           0 :         if (pE3)
    1193             :         {
    1194           0 :             m_pEntriesBox->Select( pE3 );
    1195           0 :             m_pEntriesBox->MakeVisible( pE3 );
    1196             :         }
    1197             :     }
    1198             : 
    1199           0 :     return 0;
    1200             : }
    1201             : 
    1202           0 : IMPL_LINK_NOARG(SfxAcceleratorConfigPage, RadioHdl)
    1203             : {
    1204           0 :     uno::Reference<ui::XAcceleratorConfiguration> xOld = m_xAct;
    1205             : 
    1206           0 :     if (m_pOfficeButton->IsChecked())
    1207           0 :         m_xAct = m_xGlobal;
    1208           0 :     else if (m_pModuleButton->IsChecked())
    1209           0 :         m_xAct = m_xModule;
    1210             : 
    1211             :     // nothing changed? => do nothing!
    1212           0 :     if ( m_xAct.is() && ( xOld == m_xAct ) )
    1213           0 :         return 0;
    1214             : 
    1215           0 :     m_pEntriesBox->SetUpdateMode( false );
    1216           0 :     ResetConfig();
    1217           0 :     Init(m_xAct);
    1218           0 :     m_pEntriesBox->SetUpdateMode( true );
    1219           0 :     m_pEntriesBox->Invalidate();
    1220             : 
    1221           0 :     m_pGroupLBox->Init(m_xContext, m_xFrame, m_sModuleLongName, true);
    1222             : 
    1223             :     // pb: #133213# do not select NULL entries
    1224           0 :     SvTreeListEntry* pEntry = m_pEntriesBox->GetEntry( 0, 0 );
    1225           0 :     if ( pEntry )
    1226           0 :         m_pEntriesBox->Select( pEntry );
    1227           0 :     pEntry = m_pGroupLBox->GetEntry( 0, 0 );
    1228           0 :     if ( pEntry )
    1229           0 :         m_pGroupLBox->Select( pEntry );
    1230             : 
    1231           0 :     ((Link<> &) m_pFunctionBox->GetSelectHdl()).Call( m_pFunctionBox );
    1232           0 :     return 1L;
    1233             : }
    1234             : 
    1235             : 
    1236           0 : IMPL_LINK_NOARG(SfxAcceleratorConfigPage, LoadHdl)
    1237             : {
    1238             :     assert(m_pFileDlg);
    1239             : 
    1240           0 :     OUString sCfgName;
    1241           0 :     if ( ERRCODE_NONE == m_pFileDlg->GetError() )
    1242           0 :         sCfgName = m_pFileDlg->GetPath();
    1243             : 
    1244           0 :     if ( sCfgName.isEmpty() )
    1245           0 :         return 0;
    1246             : 
    1247           0 :     GetTabDialog()->EnterWait();
    1248             : 
    1249           0 :     uno::Reference<frame::XModel> xDoc;
    1250           0 :     uno::Reference<ui::XUIConfigurationManager> xCfgMgr;
    1251           0 :     uno::Reference<embed::XStorage> xRootStorage; // we must hold the root storage alive, if xCfgMgr is used!
    1252             : 
    1253             :     try
    1254             :     {
    1255             :         // first check if URL points to a document already loaded
    1256           0 :         xDoc = SearchForAlreadyLoadedDoc(sCfgName);
    1257           0 :         if (xDoc.is())
    1258             :         {
    1259             :             // Get ui config manager. There should always be one at the model.
    1260           0 :             uno::Reference<ui::XUIConfigurationManagerSupplier> xCfgSupplier(xDoc, uno::UNO_QUERY_THROW);
    1261           0 :             xCfgMgr = xCfgSupplier->getUIConfigurationManager();
    1262             :         }
    1263             :         else
    1264             :         {
    1265             :             // URL doesn't point to a loaded document, try to access it as a single storage
    1266             :             // dont forget to release the storage afterwards!
    1267           0 :             uno::Reference<lang::XSingleServiceFactory> xStorageFactory(embed::StorageFactory::create(m_xContext));
    1268           0 :             uno::Sequence<uno::Any> lArgs(2);
    1269           0 :             lArgs[0] <<= sCfgName;
    1270           0 :             lArgs[1] <<= css::embed::ElementModes::READ;
    1271             : 
    1272           0 :             xRootStorage = uno::Reference<embed::XStorage>(xStorageFactory->createInstanceWithArguments(lArgs), uno::UNO_QUERY_THROW);
    1273           0 :             uno::Reference<embed::XStorage> xUIConfig = xRootStorage->openStorageElement(FOLDERNAME_UICONFIG, embed::ElementModes::READ);
    1274           0 :             if (xUIConfig.is())
    1275             :             {
    1276           0 :                 uno::Reference<ui::XUIConfigurationManager2> xCfgMgr2 = ui::UIConfigurationManager::create(m_xContext);
    1277           0 :                 xCfgMgr2->setStorage(xUIConfig);
    1278           0 :                 xCfgMgr.set(xCfgMgr2, uno::UNO_QUERY_THROW);
    1279           0 :             }
    1280             :         }
    1281             : 
    1282           0 :         if (xCfgMgr.is())
    1283             :         {
    1284             :             // open the configuration and update our UI
    1285           0 :             uno::Reference<ui::XAcceleratorConfiguration> xTempAccMgr(xCfgMgr->getShortCutManager(), uno::UNO_QUERY_THROW);
    1286             : 
    1287           0 :             m_pEntriesBox->SetUpdateMode(false);
    1288           0 :             ResetConfig();
    1289           0 :             Init(xTempAccMgr);
    1290           0 :             m_pEntriesBox->SetUpdateMode(true);
    1291           0 :             m_pEntriesBox->Invalidate();
    1292           0 :             m_pEntriesBox->Select(m_pEntriesBox->GetEntry(0, 0));
    1293             : 
    1294             :         }
    1295             : 
    1296             :         // dont forget to close the new opened storage!
    1297             :         // We are the owner of it.
    1298           0 :         if (xRootStorage.is())
    1299             :         {
    1300           0 :             uno::Reference<lang::XComponent> xComponent;
    1301           0 :             xComponent = uno::Reference<css::lang::XComponent>(xCfgMgr, uno::UNO_QUERY);
    1302           0 :             if (xComponent.is())
    1303           0 :                 xComponent->dispose();
    1304           0 :             xComponent = uno::Reference<css::lang::XComponent>(xRootStorage, uno::UNO_QUERY);
    1305           0 :             if (xComponent.is())
    1306           0 :                 xComponent->dispose();
    1307             :         }
    1308             :     }
    1309           0 :     catch(const uno::RuntimeException&)
    1310             :     {
    1311           0 :         throw;
    1312             :     }
    1313           0 :     catch(const uno::Exception&)
    1314             :     {}
    1315             : 
    1316           0 :     GetTabDialog()->LeaveWait();
    1317             : 
    1318           0 :     return 0;
    1319             : }
    1320             : 
    1321             : 
    1322           0 : IMPL_LINK_NOARG(SfxAcceleratorConfigPage, SaveHdl)
    1323             : {
    1324             :     assert(m_pFileDlg);
    1325             : 
    1326           0 :     OUString sCfgName;
    1327           0 :     if ( ERRCODE_NONE == m_pFileDlg->GetError() )
    1328           0 :         sCfgName = m_pFileDlg->GetPath();
    1329             : 
    1330           0 :     if ( sCfgName.isEmpty() )
    1331           0 :         return 0;
    1332             : 
    1333           0 :     GetTabDialog()->EnterWait();
    1334             : 
    1335           0 :     uno::Reference<frame::XModel> xDoc;
    1336           0 :     uno::Reference<ui::XUIConfigurationManager> xCfgMgr;
    1337           0 :     uno::Reference<embed::XStorage> xRootStorage;
    1338             : 
    1339             :     try
    1340             :     {
    1341             :         // first check if URL points to a document already loaded
    1342           0 :         xDoc = SearchForAlreadyLoadedDoc(sCfgName);
    1343           0 :         if (xDoc.is())
    1344             :         {
    1345             :             // get config manager, force creation if there was none before
    1346           0 :             uno::Reference<ui::XUIConfigurationManagerSupplier> xCfgSupplier(xDoc, uno::UNO_QUERY_THROW);
    1347           0 :             xCfgMgr = xCfgSupplier->getUIConfigurationManager();
    1348             :         }
    1349             :         else
    1350             :         {
    1351             :             // URL doesn't point to a loaded document, try to access it as a single storage
    1352           0 :             uno::Reference<lang::XSingleServiceFactory> xStorageFactory(embed::StorageFactory::create(m_xContext));
    1353           0 :             uno::Sequence<uno::Any> lArgs(2);
    1354           0 :             lArgs[0] <<= sCfgName;
    1355           0 :             lArgs[1] <<= embed::ElementModes::WRITE;
    1356             : 
    1357           0 :             xRootStorage = uno::Reference<embed::XStorage>(
    1358           0 :                                 xStorageFactory->createInstanceWithArguments(lArgs),
    1359           0 :                                 uno::UNO_QUERY_THROW);
    1360             : 
    1361             :             uno::Reference<embed::XStorage> xUIConfig(
    1362           0 :                                 xRootStorage->openStorageElement(FOLDERNAME_UICONFIG, embed::ElementModes::WRITE),
    1363           0 :                                 uno::UNO_QUERY_THROW);
    1364             :             uno::Reference<beans::XPropertySet> xUIConfigProps(
    1365             :                                 xUIConfig,
    1366           0 :                                 uno::UNO_QUERY_THROW);
    1367             : 
    1368             :             // set the correct media type if the storage was new created
    1369           0 :             OUString sMediaType;
    1370           0 :             xUIConfigProps->getPropertyValue(MEDIATYPE_PROPNAME) >>= sMediaType;
    1371           0 :             if (sMediaType.isEmpty())
    1372           0 :                 xUIConfigProps->setPropertyValue(MEDIATYPE_PROPNAME, uno::makeAny(OUString(MEDIATYPE_UICONFIG)));
    1373             : 
    1374           0 :             uno::Reference<ui::XUIConfigurationManager2> xCfgMgr2 = ui::UIConfigurationManager::create(m_xContext);
    1375           0 :             xCfgMgr2->setStorage(xUIConfig);
    1376           0 :             xCfgMgr.set( xCfgMgr2, uno::UNO_QUERY_THROW );
    1377             :         }
    1378             : 
    1379           0 :         if (xCfgMgr.is())
    1380             :         {
    1381             :             // get the target configuration access and update with all shortcuts
    1382             :             // which are set currently at the UI !
    1383             :             // Dont copy the m_xAct content to it ... because m_xAct will be updated
    1384             :             // from the UI on pressing the button "OK" only. And inbetween it's not up to date !
    1385           0 :             uno::Reference<ui::XAcceleratorConfiguration> xTargetAccMgr(xCfgMgr->getShortCutManager(), uno::UNO_QUERY_THROW);
    1386           0 :             Apply(xTargetAccMgr);
    1387             : 
    1388             :             // commit (order is important!)
    1389           0 :             uno::Reference<ui::XUIConfigurationPersistence> xCommit1(xTargetAccMgr, uno::UNO_QUERY_THROW);
    1390           0 :             uno::Reference<ui::XUIConfigurationPersistence> xCommit2(xCfgMgr      , uno::UNO_QUERY_THROW);
    1391           0 :             xCommit1->store();
    1392           0 :             xCommit2->store();
    1393             : 
    1394           0 :             if (xRootStorage.is())
    1395             :             {
    1396             :                 // Commit root storage
    1397           0 :                 uno::Reference<embed::XTransactedObject> xCommit3(xRootStorage, uno::UNO_QUERY_THROW);
    1398           0 :                 xCommit3->commit();
    1399           0 :             }
    1400             :         }
    1401             : 
    1402           0 :         if (xRootStorage.is())
    1403             :         {
    1404           0 :             uno::Reference<lang::XComponent> xComponent(xCfgMgr, uno::UNO_QUERY);
    1405           0 :             if (xComponent.is())
    1406           0 :                 xComponent->dispose();
    1407           0 :             xComponent.set(xRootStorage, uno::UNO_QUERY);
    1408           0 :             if (xComponent.is())
    1409           0 :                 xComponent->dispose();
    1410             :         }
    1411             :     }
    1412           0 :     catch(const uno::RuntimeException&)
    1413             :     {
    1414           0 :         throw;
    1415             :     }
    1416           0 :     catch(const uno::Exception&)
    1417             :     {}
    1418             : 
    1419           0 :     GetTabDialog()->LeaveWait();
    1420             : 
    1421           0 :     return 0;
    1422             : }
    1423             : 
    1424             : 
    1425           0 : void SfxAcceleratorConfigPage::StartFileDialog( WinBits nBits, const OUString& rTitle )
    1426             : {
    1427           0 :     bool bSave = ( ( nBits & WB_SAVEAS ) == WB_SAVEAS );
    1428             :     short nDialogType = bSave ? ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION
    1429           0 :                               : ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE;
    1430           0 :     if ( m_pFileDlg )
    1431           0 :         delete m_pFileDlg;
    1432           0 :     m_pFileDlg = new sfx2::FileDialogHelper( nDialogType, 0 );
    1433             : 
    1434           0 :     m_pFileDlg->SetTitle( rTitle );
    1435           0 :     m_pFileDlg->AddFilter( aFilterAllStr, OUString(FILEDIALOG_FILTER_ALL) );
    1436           0 :     m_pFileDlg->AddFilter( aFilterCfgStr, OUString("*.cfg") );
    1437           0 :     m_pFileDlg->SetCurrentFilter( aFilterCfgStr );
    1438             : 
    1439             :     Link<> aDlgClosedLink = bSave ? LINK( this, SfxAcceleratorConfigPage, SaveHdl )
    1440           0 :                                 : LINK( this, SfxAcceleratorConfigPage, LoadHdl );
    1441           0 :     m_pFileDlg->StartExecuteModal( aDlgClosedLink );
    1442           0 : }
    1443             : 
    1444             : 
    1445           0 : bool SfxAcceleratorConfigPage::FillItemSet( SfxItemSet* )
    1446             : {
    1447           0 :     Apply(m_xAct);
    1448             :     try
    1449             :     {
    1450           0 :         m_xAct->store();
    1451             :     }
    1452           0 :     catch(const uno::RuntimeException&)
    1453             :     {
    1454           0 :         throw;
    1455             :     }
    1456           0 :     catch(const uno::Exception&)
    1457             :     {
    1458           0 :         return false;
    1459             :     }
    1460             : 
    1461           0 :     return true;
    1462             : }
    1463             : 
    1464             : 
    1465           0 : void SfxAcceleratorConfigPage::Reset( const SfxItemSet* rSet )
    1466             : {
    1467             :     // open accelerator configs
    1468             :     // Note: It initialize some other members too, which are needed here ...
    1469             :     // e.g. m_sModuleUIName!
    1470           0 :     InitAccCfg();
    1471             : 
    1472             :     // change the description of the radio button, which switch to the module
    1473             :     // dependent accelerator configuration
    1474           0 :     OUString sButtonText = m_pModuleButton->GetText();
    1475           0 :     sButtonText = sButtonText.replaceFirst("$(MODULE)", m_sModuleUIName);
    1476           0 :     m_pModuleButton->SetText(sButtonText);
    1477             : 
    1478           0 :     if (m_xModule.is())
    1479           0 :         m_pModuleButton->Check();
    1480             :     else
    1481             :     {
    1482           0 :         m_pModuleButton->Hide();
    1483           0 :         m_pOfficeButton->Check();
    1484             :     }
    1485             : 
    1486           0 :     RadioHdl(0);
    1487             : 
    1488           0 :     const SfxPoolItem* pMacroItem=0;
    1489           0 :     if( SfxItemState::SET == rSet->GetItemState( SID_MACROINFO, true, &pMacroItem ) )
    1490             :     {
    1491           0 :         m_pMacroInfoItem = PTR_CAST( SfxMacroInfoItem, pMacroItem );
    1492           0 :         m_pGroupLBox->SelectMacro( m_pMacroInfoItem );
    1493             :     }
    1494             :     else
    1495             :     {
    1496           0 :         const SfxPoolItem* pStringItem=0;
    1497           0 :         if( SfxItemState::SET == rSet->GetItemState( SID_CHARMAP, true, &pStringItem ) )
    1498           0 :             m_pStringItem = PTR_CAST( SfxStringItem, pStringItem );
    1499             : 
    1500           0 :         const SfxPoolItem* pFontItem=0;
    1501           0 :         if( SfxItemState::SET == rSet->GetItemState( SID_ATTR_SPECIALCHAR, true, &pFontItem ) )
    1502           0 :             m_pFontItem = PTR_CAST( SfxStringItem, pFontItem );
    1503           0 :     }
    1504           0 : }
    1505             : 
    1506             : 
    1507           0 : sal_uLong SfxAcceleratorConfigPage::MapKeyCodeToPos(const vcl::KeyCode& aKey) const
    1508             : {
    1509           0 :     sal_uInt16 nCode1 = aKey.GetCode() + aKey.GetModifier();
    1510           0 :     SvTreeListEntry* pEntry = m_pEntriesBox->First();
    1511           0 :     sal_uLong i = 0;
    1512             : 
    1513           0 :     while (pEntry)
    1514             :     {
    1515           0 :         TAccInfo* pUserData = static_cast<TAccInfo*>(pEntry->GetUserData());
    1516           0 :         if (pUserData)
    1517             :         {
    1518           0 :             sal_uInt16 nCode2 = pUserData->m_aKey.GetCode()+pUserData->m_aKey.GetModifier();
    1519           0 :             if (nCode1 == nCode2)
    1520           0 :                 return i;
    1521             :         }
    1522           0 :         pEntry = m_pEntriesBox->Next(pEntry);
    1523           0 :         ++i;
    1524             :     }
    1525             : 
    1526           0 :     return TREELIST_ENTRY_NOTFOUND;
    1527             : }
    1528             : 
    1529             : 
    1530           0 : OUString SfxAcceleratorConfigPage::GetLabel4Command(const OUString& sCommand)
    1531             : {
    1532             :     try
    1533             :     {
    1534             :         // check global command configuration first
    1535           0 :         uno::Reference<container::XNameAccess> xModuleConf;
    1536           0 :         m_xUICmdDescription->getByName(m_sModuleLongName) >>= xModuleConf;
    1537           0 :         if (xModuleConf.is())
    1538             :         {
    1539           0 :             ::comphelper::SequenceAsHashMap lProps(xModuleConf->getByName(sCommand));
    1540           0 :             OUString sLabel = lProps.getUnpackedValueOrDefault(CMDPROP_UINAME, OUString());
    1541           0 :             if (!sLabel.isEmpty())
    1542           0 :                 return sLabel;
    1543           0 :         }
    1544             :     }
    1545           0 :     catch(const uno::RuntimeException&)
    1546             :     {
    1547           0 :         throw;
    1548             :     }
    1549           0 :     catch(const uno::Exception&)
    1550             :     {}
    1551             : 
    1552             :     // may be it's a style URL .. they must be handled special
    1553           0 :     SfxStyleInfo_Impl aStyle;
    1554           0 :     aStyle.sCommand = sCommand;
    1555           0 :     if (SfxStylesInfo_Impl::parseStyleCommand(aStyle))
    1556             :     {
    1557           0 :         m_aStylesInfo.getLabel4Style(aStyle);
    1558           0 :         return aStyle.sLabel;
    1559             :     }
    1560             : 
    1561           0 :     return sCommand;
    1562             : }
    1563             : 
    1564           0 : uno::Reference<frame::XModel> SfxAcceleratorConfigPage::SearchForAlreadyLoadedDoc(const OUString& /*sName*/)
    1565             : {
    1566           0 :     return uno::Reference<frame::XModel>();
    1567           0 : }
    1568             : 
    1569             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11