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

Generated by: LCOV version 1.10