diff options
Diffstat (limited to 'cui/source/customize/acccfg.cxx')
-rw-r--r-- | cui/source/customize/acccfg.cxx | 1578 |
1 files changed, 0 insertions, 1578 deletions
diff --git a/cui/source/customize/acccfg.cxx b/cui/source/customize/acccfg.cxx deleted file mode 100644 index fa46fb429..000000000 --- a/cui/source/customize/acccfg.cxx +++ /dev/null @@ -1,1578 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -//----------------------------------------------- -// include own files - -#include "acccfg.hxx" -#include "cfgutil.hxx" -#include <dialmgr.hxx> - -#include <sfx2/msg.hxx> -#include <sfx2/app.hxx> -#include <sfx2/filedlghelper.hxx> -#include <sfx2/minfitem.hxx> -#include <sfx2/sfxresid.hxx> -#include <svl/stritem.hxx> - -#include <sal/macros.h> - -#include "cuires.hrc" -#include "acccfg.hrc" - -#include <svx/svxids.hrc> // SID_CHARMAP, SID_ATTR_SPECIALCHAR - -//----------------------------------------------- -// include interface declarations -#include <com/sun/star/frame/XFramesSupplier.hpp> -#include <com/sun/star/frame/XFrame.hpp> -#include <com/sun/star/frame/XController.hpp> -#include <com/sun/star/frame/XModel.hpp> -#include <com/sun/star/form/XReset.hpp> -#include <com/sun/star/ui/XModuleUIConfigurationManagerSupplier.hpp> -#include <com/sun/star/frame/XModuleManager.hpp> - -#include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp> -#include <com/sun/star/ui/XUIConfigurationManager.hpp> -#include <com/sun/star/awt/KeyModifier.hpp> -#include <com/sun/star/embed/XTransactedObject.hpp> -#include <com/sun/star/embed/ElementModes.hpp> - -#include <com/sun/star/ui/dialogs/TemplateDescription.hpp> - -//----------------------------------------------- -// include other projects -#include <unotools/processfactory.hxx> -#include <svtools/acceleratorexecute.hxx> -#include <comphelper/processfactory.hxx> -#include <svtools/svlbitm.hxx> -#include <vcl/svapp.hxx> -#include <vcl/help.hxx> -#include <rtl/ustrbuf.hxx> -#include <comphelper/sequenceashashmap.hxx> - -//----------------------------------------------- -// namespaces - -#ifdef css - #error "ambigous praeprozessor directive for css ..." -#else - namespace css = ::com::sun::star; -#endif - -using namespace com::sun::star; - -//----------------------------------------------- -// definitions - -//----------------------------------------------- -static ::rtl::OUString SERVICE_STORAGEFACTORY (RTL_CONSTASCII_USTRINGPARAM("com.sun.star.embed.StorageFactory" )); -static ::rtl::OUString SERVICE_UICONFIGMGR (RTL_CONSTASCII_USTRINGPARAM("com.sun.star.ui.UIConfigurationManager" )); -static ::rtl::OUString SERVICE_DESKTOP (RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.Desktop" )); -static ::rtl::OUString SERVICE_MODULEMANAGER (RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.ModuleManager" )); -static ::rtl::OUString SERVICE_GLOBALACCCFG (RTL_CONSTASCII_USTRINGPARAM("com.sun.star.ui.GlobalAcceleratorConfiguration" )); -static ::rtl::OUString SERVICE_MODULEUICONFIGSUPPLIER (RTL_CONSTASCII_USTRINGPARAM("com.sun.star.ui.ModuleUIConfigurationManagerSupplier")); -static ::rtl::OUString SERVICE_UICMDDESCRIPTION (RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.UICommandDescription" )); - -static ::rtl::OUString MODULEPROP_SHORTNAME (RTL_CONSTASCII_USTRINGPARAM("ooSetupFactoryShortName" )); -static ::rtl::OUString MODULEPROP_UINAME (RTL_CONSTASCII_USTRINGPARAM("ooSetupFactoryUIName" )); -static ::rtl::OUString CMDPROP_UINAME (RTL_CONSTASCII_USTRINGPARAM("Name" )); - -static ::rtl::OUString FOLDERNAME_UICONFIG (RTL_CONSTASCII_USTRINGPARAM("Configurations2" )); - -static ::rtl::OUString MEDIATYPE_PROPNAME (RTL_CONSTASCII_USTRINGPARAM("MediaType" )); -static ::rtl::OUString MEDIATYPE_UICONFIG (RTL_CONSTASCII_USTRINGPARAM("application/vnd.sun.xml.ui.configuration" )); - -//----------------------------------------------- -static sal_uInt16 KEYCODE_ARRAY[] = -{ - KEY_F1 , - KEY_F2 , - KEY_F3 , - KEY_F4 , - KEY_F5 , - KEY_F6 , - KEY_F7 , - KEY_F8 , - KEY_F9 , - KEY_F10 , - KEY_F11 , - KEY_F12 , - KEY_F13 , - KEY_F14 , - KEY_F15 , - KEY_F16 , - - KEY_DOWN , - KEY_UP , - KEY_LEFT , - KEY_RIGHT , - KEY_HOME , - KEY_END , - KEY_PAGEUP , - KEY_PAGEDOWN , - KEY_RETURN , - KEY_ESCAPE , - KEY_BACKSPACE, - KEY_INSERT , - KEY_DELETE , - - KEY_OPEN , - KEY_CUT , - KEY_COPY , - KEY_PASTE , - KEY_UNDO , - KEY_REPEAT , - KEY_FIND , - KEY_PROPERTIES , - KEY_FRONT , - KEY_CONTEXTMENU , - KEY_MENU , - KEY_HELP , - - KEY_F1 | KEY_SHIFT, - KEY_F2 | KEY_SHIFT, - KEY_F3 | KEY_SHIFT, - KEY_F4 | KEY_SHIFT, - KEY_F5 | KEY_SHIFT, - KEY_F6 | KEY_SHIFT, - KEY_F7 | KEY_SHIFT, - KEY_F8 | KEY_SHIFT, - KEY_F9 | KEY_SHIFT, - KEY_F10 | KEY_SHIFT, - KEY_F11 | KEY_SHIFT, - KEY_F12 | KEY_SHIFT, - KEY_F13 | KEY_SHIFT, - KEY_F14 | KEY_SHIFT, - KEY_F15 | KEY_SHIFT, - KEY_F16 | KEY_SHIFT, - - KEY_DOWN | KEY_SHIFT, - KEY_UP | KEY_SHIFT, - KEY_LEFT | KEY_SHIFT, - KEY_RIGHT | KEY_SHIFT, - KEY_HOME | KEY_SHIFT, - KEY_END | KEY_SHIFT, - KEY_PAGEUP | KEY_SHIFT, - KEY_PAGEDOWN | KEY_SHIFT, - KEY_RETURN | KEY_SHIFT, - KEY_SPACE | KEY_SHIFT, - KEY_ESCAPE | KEY_SHIFT, - KEY_BACKSPACE | KEY_SHIFT, - KEY_INSERT | KEY_SHIFT, - KEY_DELETE | KEY_SHIFT, - - KEY_0 | KEY_MOD1 , - KEY_1 | KEY_MOD1 , - KEY_2 | KEY_MOD1 , - KEY_3 | KEY_MOD1 , - KEY_4 | KEY_MOD1 , - KEY_5 | KEY_MOD1 , - KEY_6 | KEY_MOD1 , - KEY_7 | KEY_MOD1 , - KEY_8 | KEY_MOD1 , - KEY_9 | KEY_MOD1 , - KEY_A | KEY_MOD1 , - KEY_B | KEY_MOD1 , - KEY_C | KEY_MOD1 , - KEY_D | KEY_MOD1 , - KEY_E | KEY_MOD1 , - KEY_F | KEY_MOD1 , - KEY_G | KEY_MOD1 , - KEY_H | KEY_MOD1 , - KEY_I | KEY_MOD1 , - KEY_J | KEY_MOD1 , - KEY_K | KEY_MOD1 , - KEY_L | KEY_MOD1 , - KEY_M | KEY_MOD1 , - KEY_N | KEY_MOD1 , - KEY_O | KEY_MOD1 , - KEY_P | KEY_MOD1 , - KEY_Q | KEY_MOD1 , - KEY_R | KEY_MOD1 , - KEY_S | KEY_MOD1 , - KEY_T | KEY_MOD1 , - KEY_U | KEY_MOD1 , - KEY_V | KEY_MOD1 , - KEY_W | KEY_MOD1 , - KEY_X | KEY_MOD1 , - KEY_Y | KEY_MOD1 , - KEY_Z | KEY_MOD1 , - KEY_SEMICOLON | KEY_MOD1 , - KEY_BRACKETLEFT | KEY_MOD1 , - KEY_BRACKETRIGHT | KEY_MOD1, - - KEY_F1 | KEY_MOD1 , - KEY_F2 | KEY_MOD1 , - KEY_F3 | KEY_MOD1 , - KEY_F4 | KEY_MOD1 , - KEY_F5 | KEY_MOD1 , - KEY_F6 | KEY_MOD1 , - KEY_F7 | KEY_MOD1 , - KEY_F8 | KEY_MOD1 , - KEY_F9 | KEY_MOD1 , - KEY_F10 | KEY_MOD1 , - KEY_F11 | KEY_MOD1 , - KEY_F12 | KEY_MOD1 , - KEY_F13 | KEY_MOD1 , - KEY_F14 | KEY_MOD1 , - KEY_F15 | KEY_MOD1 , - KEY_F16 | KEY_MOD1 , - - KEY_DOWN | KEY_MOD1 , - KEY_UP | KEY_MOD1 , - KEY_LEFT | KEY_MOD1 , - KEY_RIGHT | KEY_MOD1 , - KEY_HOME | KEY_MOD1 , - KEY_END | KEY_MOD1 , - KEY_PAGEUP | KEY_MOD1 , - KEY_PAGEDOWN | KEY_MOD1 , - KEY_RETURN | KEY_MOD1 , - KEY_SPACE | KEY_MOD1 , - KEY_BACKSPACE | KEY_MOD1 , - KEY_INSERT | KEY_MOD1 , - KEY_DELETE | KEY_MOD1 , - - KEY_ADD | KEY_MOD1 , - KEY_SUBTRACT | KEY_MOD1 , - KEY_MULTIPLY | KEY_MOD1 , - KEY_DIVIDE | KEY_MOD1 , - - KEY_0 | KEY_SHIFT | KEY_MOD1, - KEY_1 | KEY_SHIFT | KEY_MOD1, - KEY_2 | KEY_SHIFT | KEY_MOD1, - KEY_3 | KEY_SHIFT | KEY_MOD1, - KEY_4 | KEY_SHIFT | KEY_MOD1, - KEY_5 | KEY_SHIFT | KEY_MOD1, - KEY_6 | KEY_SHIFT | KEY_MOD1, - KEY_7 | KEY_SHIFT | KEY_MOD1, - KEY_8 | KEY_SHIFT | KEY_MOD1, - KEY_9 | KEY_SHIFT | KEY_MOD1, - KEY_A | KEY_SHIFT | KEY_MOD1, - KEY_B | KEY_SHIFT | KEY_MOD1, - KEY_C | KEY_SHIFT | KEY_MOD1, - KEY_D | KEY_SHIFT | KEY_MOD1, - KEY_E | KEY_SHIFT | KEY_MOD1, - KEY_F | KEY_SHIFT | KEY_MOD1, - KEY_G | KEY_SHIFT | KEY_MOD1, - KEY_H | KEY_SHIFT | KEY_MOD1, - KEY_I | KEY_SHIFT | KEY_MOD1, - KEY_J | KEY_SHIFT | KEY_MOD1, - KEY_K | KEY_SHIFT | KEY_MOD1, - KEY_L | KEY_SHIFT | KEY_MOD1, - KEY_M | KEY_SHIFT | KEY_MOD1, - KEY_N | KEY_SHIFT | KEY_MOD1, - KEY_O | KEY_SHIFT | KEY_MOD1, - KEY_P | KEY_SHIFT | KEY_MOD1, - KEY_Q | KEY_SHIFT | KEY_MOD1, - KEY_R | KEY_SHIFT | KEY_MOD1, - KEY_S | KEY_SHIFT | KEY_MOD1, - KEY_T | KEY_SHIFT | KEY_MOD1, - KEY_U | KEY_SHIFT | KEY_MOD1, - KEY_V | KEY_SHIFT | KEY_MOD1, - KEY_W | KEY_SHIFT | KEY_MOD1, - KEY_X | KEY_SHIFT | KEY_MOD1, - KEY_Y | KEY_SHIFT | KEY_MOD1, - KEY_Z | KEY_SHIFT | KEY_MOD1, - KEY_SEMICOLON | KEY_SHIFT | KEY_MOD1 , - KEY_BRACKETLEFT | KEY_SHIFT | KEY_MOD1 , - KEY_BRACKETRIGHT | KEY_SHIFT | KEY_MOD1, - - KEY_F1 | KEY_SHIFT | KEY_MOD1, - KEY_F2 | KEY_SHIFT | KEY_MOD1, - KEY_F3 | KEY_SHIFT | KEY_MOD1, - KEY_F4 | KEY_SHIFT | KEY_MOD1, - KEY_F5 | KEY_SHIFT | KEY_MOD1, - KEY_F6 | KEY_SHIFT | KEY_MOD1, - KEY_F7 | KEY_SHIFT | KEY_MOD1, - KEY_F8 | KEY_SHIFT | KEY_MOD1, - KEY_F9 | KEY_SHIFT | KEY_MOD1, - KEY_F10 | KEY_SHIFT | KEY_MOD1, - KEY_F11 | KEY_SHIFT | KEY_MOD1, - KEY_F12 | KEY_SHIFT | KEY_MOD1, - KEY_F13 | KEY_SHIFT | KEY_MOD1, - KEY_F14 | KEY_SHIFT | KEY_MOD1, - KEY_F15 | KEY_SHIFT | KEY_MOD1, - KEY_F16 | KEY_SHIFT | KEY_MOD1, - - KEY_DOWN | KEY_SHIFT | KEY_MOD1, - KEY_UP | KEY_SHIFT | KEY_MOD1, - KEY_LEFT | KEY_SHIFT | KEY_MOD1, - KEY_RIGHT | KEY_SHIFT | KEY_MOD1, - KEY_HOME | KEY_SHIFT | KEY_MOD1, - KEY_END | KEY_SHIFT | KEY_MOD1, - KEY_PAGEUP | KEY_SHIFT | KEY_MOD1, - KEY_PAGEDOWN | KEY_SHIFT | KEY_MOD1, - KEY_RETURN | KEY_SHIFT | KEY_MOD1, - KEY_SPACE | KEY_SHIFT | KEY_MOD1, - KEY_BACKSPACE | KEY_SHIFT | KEY_MOD1, - KEY_INSERT | KEY_SHIFT | KEY_MOD1, - KEY_DELETE | KEY_SHIFT | KEY_MOD1, - - KEY_0 | KEY_MOD2 , - KEY_1 | KEY_MOD2 , - KEY_2 | KEY_MOD2 , - KEY_3 | KEY_MOD2 , - KEY_4 | KEY_MOD2 , - KEY_5 | KEY_MOD2 , - KEY_6 | KEY_MOD2 , - KEY_7 | KEY_MOD2 , - KEY_8 | KEY_MOD2 , - KEY_9 | KEY_MOD2 , - KEY_A | KEY_MOD2 , - KEY_B | KEY_MOD2 , - KEY_C | KEY_MOD2 , - KEY_D | KEY_MOD2 , - KEY_E | KEY_MOD2 , - KEY_F | KEY_MOD2 , - KEY_G | KEY_MOD2 , - KEY_H | KEY_MOD2 , - KEY_I | KEY_MOD2 , - KEY_J | KEY_MOD2 , - KEY_K | KEY_MOD2 , - KEY_L | KEY_MOD2 , - KEY_M | KEY_MOD2 , - KEY_N | KEY_MOD2 , - KEY_O | KEY_MOD2 , - KEY_P | KEY_MOD2 , - KEY_Q | KEY_MOD2 , - KEY_R | KEY_MOD2 , - KEY_S | KEY_MOD2 , - KEY_T | KEY_MOD2 , - KEY_U | KEY_MOD2 , - KEY_V | KEY_MOD2 , - KEY_W | KEY_MOD2 , - KEY_X | KEY_MOD2 , - KEY_Y | KEY_MOD2 , - KEY_Z | KEY_MOD2 , - KEY_SEMICOLON | KEY_MOD2 , - KEY_BRACKETLEFT | KEY_MOD2 , - KEY_BRACKETRIGHT | KEY_MOD2, - - KEY_F1 | KEY_MOD2 , - KEY_F2 | KEY_MOD2 , - KEY_F3 | KEY_MOD2 , - KEY_F4 | KEY_MOD2 , - KEY_F5 | KEY_MOD2 , - KEY_F6 | KEY_MOD2 , - KEY_F7 | KEY_MOD2 , - KEY_F8 | KEY_MOD2 , - KEY_F9 | KEY_MOD2 , - KEY_F10 | KEY_MOD2 , - KEY_F11 | KEY_MOD2 , - KEY_F12 | KEY_MOD2 , - KEY_F13 | KEY_MOD2 , - KEY_F14 | KEY_MOD2 , - KEY_F15 | KEY_MOD2 , - KEY_F16 | KEY_MOD2 , - - KEY_DOWN | KEY_MOD2 , - KEY_UP | KEY_MOD2 , - KEY_LEFT | KEY_MOD2 , - KEY_RIGHT | KEY_MOD2 , - KEY_HOME | KEY_MOD2 , - KEY_END | KEY_MOD2 , - KEY_PAGEUP | KEY_MOD2 , - KEY_PAGEDOWN | KEY_MOD2 , - KEY_RETURN | KEY_MOD2 , - KEY_SPACE | KEY_MOD2 , - KEY_BACKSPACE | KEY_MOD2 , - KEY_INSERT | KEY_MOD2 , - KEY_DELETE | KEY_MOD2 , - - KEY_0 | KEY_SHIFT | KEY_MOD2, - KEY_1 | KEY_SHIFT | KEY_MOD2, - KEY_2 | KEY_SHIFT | KEY_MOD2, - KEY_3 | KEY_SHIFT | KEY_MOD2, - KEY_4 | KEY_SHIFT | KEY_MOD2, - KEY_5 | KEY_SHIFT | KEY_MOD2, - KEY_6 | KEY_SHIFT | KEY_MOD2, - KEY_7 | KEY_SHIFT | KEY_MOD2, - KEY_8 | KEY_SHIFT | KEY_MOD2, - KEY_9 | KEY_SHIFT | KEY_MOD2, - KEY_A | KEY_SHIFT | KEY_MOD2, - KEY_B | KEY_SHIFT | KEY_MOD2, - KEY_C | KEY_SHIFT | KEY_MOD2, - KEY_D | KEY_SHIFT | KEY_MOD2, - KEY_E | KEY_SHIFT | KEY_MOD2, - KEY_F | KEY_SHIFT | KEY_MOD2, - KEY_G | KEY_SHIFT | KEY_MOD2, - KEY_H | KEY_SHIFT | KEY_MOD2, - KEY_I | KEY_SHIFT | KEY_MOD2, - KEY_J | KEY_SHIFT | KEY_MOD2, - KEY_K | KEY_SHIFT | KEY_MOD2, - KEY_L | KEY_SHIFT | KEY_MOD2, - KEY_M | KEY_SHIFT | KEY_MOD2, - KEY_N | KEY_SHIFT | KEY_MOD2, - KEY_O | KEY_SHIFT | KEY_MOD2, - KEY_P | KEY_SHIFT | KEY_MOD2, - KEY_Q | KEY_SHIFT | KEY_MOD2, - KEY_R | KEY_SHIFT | KEY_MOD2, - KEY_S | KEY_SHIFT | KEY_MOD2, - KEY_T | KEY_SHIFT | KEY_MOD2, - KEY_U | KEY_SHIFT | KEY_MOD2, - KEY_V | KEY_SHIFT | KEY_MOD2, - KEY_W | KEY_SHIFT | KEY_MOD2, - KEY_X | KEY_SHIFT | KEY_MOD2, - KEY_Y | KEY_SHIFT | KEY_MOD2, - KEY_Z | KEY_SHIFT | KEY_MOD2, - KEY_SEMICOLON | KEY_SHIFT | KEY_MOD2 , - KEY_BRACKETLEFT | KEY_SHIFT | KEY_MOD2 , - KEY_BRACKETRIGHT | KEY_SHIFT | KEY_MOD2, - - KEY_F1 | KEY_SHIFT | KEY_MOD2, - KEY_F2 | KEY_SHIFT | KEY_MOD2, - KEY_F3 | KEY_SHIFT | KEY_MOD2, - KEY_F4 | KEY_SHIFT | KEY_MOD2, - KEY_F5 | KEY_SHIFT | KEY_MOD2, - KEY_F6 | KEY_SHIFT | KEY_MOD2, - KEY_F7 | KEY_SHIFT | KEY_MOD2, - KEY_F8 | KEY_SHIFT | KEY_MOD2, - KEY_F9 | KEY_SHIFT | KEY_MOD2, - KEY_F10 | KEY_SHIFT | KEY_MOD2, - KEY_F11 | KEY_SHIFT | KEY_MOD2, - KEY_F12 | KEY_SHIFT | KEY_MOD2, - KEY_F13 | KEY_SHIFT | KEY_MOD2, - KEY_F14 | KEY_SHIFT | KEY_MOD2, - KEY_F15 | KEY_SHIFT | KEY_MOD2, - KEY_F16 | KEY_SHIFT | KEY_MOD2, - - KEY_DOWN | KEY_SHIFT | KEY_MOD2, - KEY_UP | KEY_SHIFT | KEY_MOD2, - KEY_LEFT | KEY_SHIFT | KEY_MOD2, - KEY_RIGHT | KEY_SHIFT | KEY_MOD2, - KEY_HOME | KEY_SHIFT | KEY_MOD2, - KEY_END | KEY_SHIFT | KEY_MOD2, - KEY_PAGEUP | KEY_SHIFT | KEY_MOD2, - KEY_PAGEDOWN | KEY_SHIFT | KEY_MOD2, - KEY_RETURN | KEY_SHIFT | KEY_MOD2, - KEY_SPACE | KEY_SHIFT | KEY_MOD2, - KEY_BACKSPACE | KEY_SHIFT | KEY_MOD2, - KEY_INSERT | KEY_SHIFT | KEY_MOD2, - KEY_DELETE | KEY_SHIFT | KEY_MOD2, - - KEY_0 | KEY_MOD1 | KEY_MOD2 , - KEY_1 | KEY_MOD1 | KEY_MOD2 , - KEY_2 | KEY_MOD1 | KEY_MOD2 , - KEY_3 | KEY_MOD1 | KEY_MOD2 , - KEY_4 | KEY_MOD1 | KEY_MOD2 , - KEY_5 | KEY_MOD1 | KEY_MOD2 , - KEY_6 | KEY_MOD1 | KEY_MOD2 , - KEY_7 | KEY_MOD1 | KEY_MOD2 , - KEY_8 | KEY_MOD1 | KEY_MOD2 , - KEY_9 | KEY_MOD1 | KEY_MOD2 , - KEY_A | KEY_MOD1 | KEY_MOD2 , - KEY_B | KEY_MOD1 | KEY_MOD2 , - KEY_C | KEY_MOD1 | KEY_MOD2 , - KEY_D | KEY_MOD1 | KEY_MOD2 , - KEY_E | KEY_MOD1 | KEY_MOD2 , - KEY_F | KEY_MOD1 | KEY_MOD2 , - KEY_G | KEY_MOD1 | KEY_MOD2 , - KEY_H | KEY_MOD1 | KEY_MOD2 , - KEY_I | KEY_MOD1 | KEY_MOD2 , - KEY_J | KEY_MOD1 | KEY_MOD2 , - KEY_K | KEY_MOD1 | KEY_MOD2 , - KEY_L | KEY_MOD1 | KEY_MOD2 , - KEY_M | KEY_MOD1 | KEY_MOD2 , - KEY_N | KEY_MOD1 | KEY_MOD2 , - KEY_O | KEY_MOD1 | KEY_MOD2 , - KEY_P | KEY_MOD1 | KEY_MOD2 , - KEY_Q | KEY_MOD1 | KEY_MOD2 , - KEY_R | KEY_MOD1 | KEY_MOD2 , - KEY_S | KEY_MOD1 | KEY_MOD2 , - KEY_T | KEY_MOD1 | KEY_MOD2 , - KEY_U | KEY_MOD1 | KEY_MOD2 , - KEY_V | KEY_MOD1 | KEY_MOD2 , - KEY_W | KEY_MOD1 | KEY_MOD2 , - KEY_X | KEY_MOD1 | KEY_MOD2 , - KEY_Y | KEY_MOD1 | KEY_MOD2 , - KEY_Z | KEY_MOD1 | KEY_MOD2 , - - KEY_F1 | KEY_MOD1 | KEY_MOD2 , - KEY_F2 | KEY_MOD1 | KEY_MOD2 , - KEY_F3 | KEY_MOD1 | KEY_MOD2 , - KEY_F4 | KEY_MOD1 | KEY_MOD2 , - KEY_F5 | KEY_MOD1 | KEY_MOD2 , - KEY_F6 | KEY_MOD1 | KEY_MOD2 , - KEY_F7 | KEY_MOD1 | KEY_MOD2 , - KEY_F8 | KEY_MOD1 | KEY_MOD2 , - KEY_F9 | KEY_MOD1 | KEY_MOD2 , - KEY_F10 | KEY_MOD1 | KEY_MOD2 , - KEY_F11 | KEY_MOD1 | KEY_MOD2 , - KEY_F12 | KEY_MOD1 | KEY_MOD2 , - KEY_F13 | KEY_MOD1 | KEY_MOD2 , - KEY_F14 | KEY_MOD1 | KEY_MOD2 , - KEY_F15 | KEY_MOD1 | KEY_MOD2 , - KEY_F16 | KEY_MOD1 | KEY_MOD2 , - - KEY_DOWN | KEY_MOD1 | KEY_MOD2 , - KEY_UP | KEY_MOD1 | KEY_MOD2 , - KEY_LEFT | KEY_MOD1 | KEY_MOD2 , - KEY_RIGHT | KEY_MOD1 | KEY_MOD2 , - KEY_HOME | KEY_MOD1 | KEY_MOD2 , - KEY_END | KEY_MOD1 | KEY_MOD2 , - KEY_PAGEUP | KEY_MOD1 | KEY_MOD2 , - KEY_PAGEDOWN | KEY_MOD1 | KEY_MOD2 , - KEY_RETURN | KEY_MOD1 | KEY_MOD2 , - KEY_SPACE | KEY_MOD1 | KEY_MOD2 , - KEY_BACKSPACE | KEY_MOD1 | KEY_MOD2 , - KEY_INSERT | KEY_MOD1 | KEY_MOD2 , - KEY_DELETE | KEY_MOD1 | KEY_MOD2 , - - KEY_0 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_1 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_2 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_3 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_4 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_5 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_6 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_7 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_8 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_9 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_A | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_B | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_C | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_D | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_E | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_F | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_G | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_H | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_I | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_J | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_K | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_L | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_M | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_N | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_O | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_P | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_Q | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_R | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_S | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_T | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_U | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_V | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_W | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_X | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_Y | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_Z | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_SEMICOLON | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_BRACKETLEFT | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_BRACKETRIGHT | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - - KEY_F1 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_F2 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_F3 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_F4 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_F5 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_F6 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_F7 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_F8 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_F9 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_F10 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_F11 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_F12 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_F13 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_F14 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_F15 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_F16 | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - - KEY_DOWN | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_UP | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_LEFT | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_RIGHT | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_HOME | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_END | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_PAGEUP | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_PAGEDOWN | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_RETURN | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_SPACE | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_BACKSPACE | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_INSERT | KEY_SHIFT | KEY_MOD1 | KEY_MOD2, - KEY_DELETE | KEY_SHIFT | KEY_MOD1 | KEY_MOD2 -}; - -static sal_uInt16 KEYCODE_ARRAY_SIZE = SAL_N_ELEMENTS(KEYCODE_ARRAY); - -//----------------------------------------------- -// seems to be needed to layout the list box, which shows all -// assignable shortcuts -static long AccCfgTabs[] = -{ - 2, // Number of Tabs - 0, - 120 // Function -}; - -//----------------------------------------------- -class SfxAccCfgLBoxString_Impl : public SvLBoxString -{ - public: - SfxAccCfgLBoxString_Impl( SvLBoxEntry* pEntry, - sal_uInt16 nFlags, - const String& sText ); - - virtual ~SfxAccCfgLBoxString_Impl(); - - virtual void Paint(const Point& aPos , - SvLBox& rDevice, - sal_uInt16 nFlags , - SvLBoxEntry* pEntry ); -}; - -//----------------------------------------------- -SfxAccCfgLBoxString_Impl::SfxAccCfgLBoxString_Impl( SvLBoxEntry* pEntry, - sal_uInt16 nFlags, - const String& sText ) - : SvLBoxString(pEntry, nFlags, sText) -{ -} - -//----------------------------------------------- -SfxAccCfgLBoxString_Impl::~SfxAccCfgLBoxString_Impl() -{ -} - -//----------------------------------------------- -void SfxAccCfgLBoxString_Impl::Paint(const Point& aPos , - SvLBox& rDevice, - sal_uInt16 /*nFlags*/, - SvLBoxEntry* pEntry ) -{ - - if (!pEntry) - return; - - TAccInfo* pUserData = (TAccInfo*)pEntry->GetUserData(); - if (!pUserData) - return; - - if (pUserData->m_bIsConfigurable) - rDevice.DrawText(aPos, GetText()); - else - rDevice.DrawCtrlText(aPos, GetText(), 0, STRING_LEN, TEXT_DRAW_DISABLE); - -} - -//----------------------------------------------- -void SfxAccCfgTabListBox_Impl::InitEntry( SvLBoxEntry* pEntry , - const XubString& sText , - const Image& aImage1, - const Image& aImage2, - SvLBoxButtonKind eButtonKind) -{ - SvTabListBox::InitEntry(pEntry, sText, aImage1, aImage2, eButtonKind); -} - -//----------------------------------------------- -/** select the entry, which match the current key input ... excepting - keys, which are used for the dialog itself. - */ -void SfxAccCfgTabListBox_Impl::KeyInput(const KeyEvent& aKey) -{ - KeyCode aCode1 = aKey.GetKeyCode(); - sal_uInt16 nCode1 = aCode1.GetCode(); - sal_uInt16 nMod1 = aCode1.GetModifier(); - - // is it related to our list box ? - if ( - (nCode1 != KEY_DOWN ) && - (nCode1 != KEY_UP ) && - (nCode1 != KEY_LEFT ) && - (nCode1 != KEY_RIGHT ) && - (nCode1 != KEY_PAGEUP ) && - (nCode1 != KEY_PAGEDOWN) - ) - { - SvLBoxEntry* pEntry = First(); - while (pEntry) - { - TAccInfo* pUserData = (TAccInfo*)pEntry->GetUserData(); - if (pUserData) - { - sal_uInt16 nCode2 = pUserData->m_aKey.GetCode(); - sal_uInt16 nMod2 = pUserData->m_aKey.GetModifier(); - if ( - (nCode1 == nCode2) && - (nMod1 == nMod2 ) - ) - { - Select (pEntry); - MakeVisible(pEntry); - return; - } - } - pEntry = Next(pEntry); - } - } - - // no - handle it as normal dialog input - SvTabListBox::KeyInput(aKey); -} - -//----------------------------------------------- -SfxAcceleratorConfigPage::SfxAcceleratorConfigPage( Window* pParent, const SfxItemSet& aSet ) - : SfxTabPage (pParent, CUI_RES(RID_SVXPAGE_KEYBOARD), aSet) - , m_pMacroInfoItem () - , m_pStringItem () - , m_pFontItem () - , m_pFileDlg (NULL) - , aEntriesBox (this , this, CUI_RES(BOX_ACC_ENTRIES )) - , aKeyboardGroup (this , CUI_RES(GRP_ACC_KEYBOARD )) - , aOfficeButton (this , CUI_RES(RB_OFFICE )) - , aModuleButton (this , CUI_RES(RB_MODULE )) - , aChangeButton (this , CUI_RES(BTN_ACC_CHANGE )) - , aRemoveButton (this , CUI_RES(BTN_ACC_REMOVE )) - , aGroupText (this , CUI_RES(TXT_ACC_GROUP )) - , pGroupLBox(new SfxConfigGroupListBox_Impl( this, CUI_RES(BOX_ACC_GROUP), SFX_SLOT_ACCELCONFIG )) - , aFunctionText (this , CUI_RES(TXT_ACC_FUNCTION )) - , pFunctionBox(new SfxConfigFunctionListBox_Impl( this, CUI_RES( BOX_ACC_FUNCTION ))) - , aKeyText (this , CUI_RES(TXT_ACC_KEY )) - , aKeyBox (this , CUI_RES(BOX_ACC_KEY )) - , aFunctionsGroup (this , CUI_RES(GRP_ACC_FUNCTIONS )) - , aLoadButton (this , CUI_RES(BTN_LOAD )) - , aSaveButton (this , CUI_RES(BTN_SAVE )) - , aResetButton (this , CUI_RES(BTN_RESET )) - , aLoadAccelConfigStr ( CUI_RES( STR_LOADACCELCONFIG ) ) - , aSaveAccelConfigStr ( CUI_RES( STR_SAVEACCELCONFIG ) ) - , aFilterCfgStr ( CUI_RES( STR_FILTERNAME_CFG ) ) - , m_bStylesInfoInitialized(sal_False) - , m_xGlobal () - , m_xModule () - , m_xAct () -{ - FreeResource(); - - aFilterAllStr = String( SfxResId( STR_SFX_FILTERNAME_ALL ) ); - -// install handler functions - aChangeButton.SetClickHdl( LINK( this, SfxAcceleratorConfigPage, ChangeHdl )); - aRemoveButton.SetClickHdl( LINK( this, SfxAcceleratorConfigPage, RemoveHdl )); - aEntriesBox.SetSelectHdl ( LINK( this, SfxAcceleratorConfigPage, SelectHdl )); - pGroupLBox->SetSelectHdl ( LINK( this, SfxAcceleratorConfigPage, SelectHdl )); - pFunctionBox->SetSelectHdl( LINK( this, SfxAcceleratorConfigPage, SelectHdl )); - aKeyBox.SetSelectHdl ( LINK( this, SfxAcceleratorConfigPage, SelectHdl )); - aLoadButton.SetClickHdl ( LINK( this, SfxAcceleratorConfigPage, Load )); - aSaveButton.SetClickHdl ( LINK( this, SfxAcceleratorConfigPage, Save )); - aResetButton.SetClickHdl ( LINK( this, SfxAcceleratorConfigPage, Default )); - aOfficeButton.SetClickHdl( LINK( this, SfxAcceleratorConfigPage, RadioHdl )); - aModuleButton.SetClickHdl( LINK( this, SfxAcceleratorConfigPage, RadioHdl )); - - // initialize Entriesbox - aEntriesBox.SetStyle(aEntriesBox.GetStyle()|WB_HSCROLL|WB_CLIPCHILDREN); - aEntriesBox.SetSelectionMode(SINGLE_SELECTION); - aEntriesBox.SetTabs(&AccCfgTabs[0], MAP_APPFONT); - aEntriesBox.Resize(); // OS: Hack for right selection - aEntriesBox.SetSpaceBetweenEntries(0); - aEntriesBox.SetDragDropMode(0); - - // detect max keyname width - long nMaxWidth = 0; - for ( sal_uInt16 i = 0; i < KEYCODE_ARRAY_SIZE; ++i ) - { - long nTmp = GetTextWidth( KeyCode( KEYCODE_ARRAY[i] ).GetName() ); - if ( nTmp > nMaxWidth ) - nMaxWidth = nTmp; - } - // recalc second tab - long nNewTab = PixelToLogic( Size( nMaxWidth, 0 ), MAP_APPFONT ).Width(); - nNewTab = nNewTab + 5; // additional space - aEntriesBox.SetTab( 1, nNewTab ); - - // initialize GroupBox - pGroupLBox->SetFunctionListBox(pFunctionBox); - - // initialize KeyBox - aKeyBox.SetStyle(aKeyBox.GetStyle()|WB_CLIPCHILDREN|WB_HSCROLL|WB_SORT); -} - -//----------------------------------------------- -SfxAcceleratorConfigPage::~SfxAcceleratorConfigPage() -{ - // free memory - remove all dynamic user data - SvLBoxEntry* pEntry = aEntriesBox.First(); - while (pEntry) - { - TAccInfo* pUserData = (TAccInfo*)pEntry->GetUserData(); - if (pUserData) - delete pUserData; - pEntry = aEntriesBox.Next(pEntry); - } - - pEntry = aKeyBox.First(); - while (pEntry) - { - TAccInfo* pUserData = (TAccInfo*)pEntry->GetUserData(); - if (pUserData) - delete pUserData; - pEntry = aKeyBox.Next(pEntry); - } - - aEntriesBox.Clear(); - aKeyBox.Clear(); - - delete m_pFileDlg; - delete pGroupLBox; - delete pFunctionBox; -} - -//----------------------------------------------- -void SfxAcceleratorConfigPage::InitAccCfg() -{ - // already initialized ? - if (m_xSMGR.is()) - return; // yes -> do nothing - - try - { - // no - initialize this instance - m_xSMGR = ::utl::getProcessServiceFactory(); - - m_xUICmdDescription = css::uno::Reference< css::container::XNameAccess >(m_xSMGR->createInstance(SERVICE_UICMDDESCRIPTION), css::uno::UNO_QUERY_THROW); - - // get the current active frame, which should be our "parent" - // for this session - m_xFrame = GetFrame(); - if ( !m_xFrame.is() ) - { - css::uno::Reference< css::frame::XFramesSupplier > xDesktop(m_xSMGR->createInstance(SERVICE_DESKTOP), css::uno::UNO_QUERY_THROW); - m_xFrame = xDesktop->getActiveFrame(); - } - - // identify module - css::uno::Reference< css::frame::XModuleManager > xModuleManager (m_xSMGR->createInstance(SERVICE_MODULEMANAGER), css::uno::UNO_QUERY_THROW); - css::uno::Reference< css::container::XNameAccess > xModuleManagerCont(xModuleManager , css::uno::UNO_QUERY_THROW); - m_sModuleLongName = xModuleManager->identify(m_xFrame); - ::comphelper::SequenceAsHashMap lModuleProps(xModuleManagerCont->getByName(m_sModuleLongName)); - m_sModuleShortName = lModuleProps.getUnpackedValueOrDefault(MODULEPROP_SHORTNAME, ::rtl::OUString()); - m_sModuleUIName = lModuleProps.getUnpackedValueOrDefault(MODULEPROP_UINAME , ::rtl::OUString()); - - // get global accelerator configuration - m_xGlobal = css::uno::Reference< css::ui::XAcceleratorConfiguration >(m_xSMGR->createInstance(SERVICE_GLOBALACCCFG), css::uno::UNO_QUERY_THROW); - - // get module accelerator configuration - css::uno::Reference< css::ui::XModuleUIConfigurationManagerSupplier > xModuleCfgSupplier(m_xSMGR->createInstance(SERVICE_MODULEUICONFIGSUPPLIER), css::uno::UNO_QUERY_THROW); - css::uno::Reference< css::ui::XUIConfigurationManager > xUICfgManager = xModuleCfgSupplier->getUIConfigurationManager(m_sModuleLongName); - m_xModule = css::uno::Reference< css::ui::XAcceleratorConfiguration >(xUICfgManager->getShortCutManager(), css::uno::UNO_QUERY_THROW); - } - catch(const css::uno::RuntimeException& exRun) - { throw exRun; } - catch(const css::uno::Exception&) - { m_xSMGR.clear(); } -} - -//----------------------------------------------- -/** Initialize text columns with own class to enable custom painting - This is needed as we have to paint disabled entries by ourself. No support for that in the - original SvTabListBox! - */ -void SfxAcceleratorConfigPage::CreateCustomItems( SvLBoxEntry* pEntry, - const String& sCol1 , - const String& sCol2 ) -{ - SfxAccCfgLBoxString_Impl* pStringItem = new SfxAccCfgLBoxString_Impl(pEntry, 0, sCol1); - pEntry->ReplaceItem(pStringItem, 1); - - pStringItem = new SfxAccCfgLBoxString_Impl(pEntry, 0, sCol2); - pEntry->ReplaceItem(pStringItem, 2); -} - -//----------------------------------------------- -void SfxAcceleratorConfigPage::Init(const css::uno::Reference< css::ui::XAcceleratorConfiguration >& xAccMgr) -{ - if (!xAccMgr.is()) - return; - - if (!m_bStylesInfoInitialized) - { - css::uno::Reference< css::frame::XController > xController; - css::uno::Reference< css::frame::XModel > xModel; - if (m_xFrame.is()) - xController = m_xFrame->getController(); - if (xController.is()) - xModel = xController->getModel(); - - m_aStylesInfo.setModel(xModel); - pFunctionBox->SetStylesInfo(&m_aStylesInfo); - pGroupLBox->SetStylesInfo(&m_aStylesInfo); - m_bStylesInfoInitialized = sal_True; - } - - // Insert all editable accelerators into list box. It is possible - // that some accelerators are not mapped on the current system/keyboard - // but we don't want to lose these mappings. - sal_uInt16 c1 = KEYCODE_ARRAY_SIZE; - sal_uInt16 i1 = 0; - sal_uInt16 nListPos = 0; - for (i1=0; i1<c1; ++i1) - { - KeyCode aKey = KEYCODE_ARRAY[i1]; - String sKey = aKey.GetName(); - if (!sKey.Len()) - continue; - TAccInfo* pEntry = new TAccInfo(i1, nListPos, aKey); - SvLBoxEntry* pLBEntry = aEntriesBox.InsertEntryToColumn(sKey, 0L, LIST_APPEND, 0xFFFF); - pLBEntry->SetUserData(pEntry); - } - - // Assign all commands to its shortcuts - reading the accelerator config. - css::uno::Sequence< css::awt::KeyEvent > lKeys = xAccMgr->getAllKeyEvents(); - sal_Int32 c2 = lKeys.getLength(); - sal_Int32 i2 = 0; - sal_uInt16 nCol = aEntriesBox.TabCount()-1; - - for (i2=0; i2<c2; ++i2) - { - const css::awt::KeyEvent& aAWTKey = lKeys[i2]; - ::rtl::OUString sCommand = xAccMgr->getCommandByKeyEvent(aAWTKey); - String sLabel = GetLabel4Command(sCommand); - KeyCode aKeyCode = ::svt::AcceleratorExecute::st_AWTKey2VCLKey(aAWTKey); - sal_uInt16 nPos = MapKeyCodeToPos(aKeyCode); - - if (nPos == LISTBOX_ENTRY_NOTFOUND) - continue; - - aEntriesBox.SetEntryText(sLabel, nPos, nCol); - - SvLBoxEntry* pLBEntry = aEntriesBox.GetEntry(0, nPos); - TAccInfo* pEntry = (TAccInfo*)pLBEntry->GetUserData(); - - pEntry->m_bIsConfigurable = sal_True; - pEntry->m_sCommand = sCommand; - CreateCustomItems(pLBEntry, aEntriesBox.GetEntryText(pLBEntry, 0), sLabel); - } - - // Map the VCL hardcoded key codes and mark them as not changeable - sal_uLong c3 = Application::GetReservedKeyCodeCount(); - sal_uLong i3 = 0; - for (i3=0; i3<c3; ++i3) - { - const KeyCode* pKeyCode = Application::GetReservedKeyCode(i3); - sal_uInt16 nPos = MapKeyCodeToPos(*pKeyCode); - - if (nPos == LISTBOX_ENTRY_NOTFOUND) - continue; - - // Hardcoded function mapped so no ID possible and mark entry as not changeable - SvLBoxEntry* pLBEntry = aEntriesBox.GetEntry(0, nPos); - TAccInfo* pEntry = (TAccInfo*)pLBEntry->GetUserData(); - - pEntry->m_bIsConfigurable = sal_False; - CreateCustomItems(pLBEntry, aEntriesBox.GetEntryText(pLBEntry, 0), String()); - } -} - -//----------------------------------------------- -void SfxAcceleratorConfigPage::Apply(const css::uno::Reference< css::ui::XAcceleratorConfiguration >& xAccMgr) -{ - if (!xAccMgr.is()) - return; - - // Go through the list from the bottom to the top ... - // because logical accelerator must be preferred instead of - // physical ones! - SvLBoxEntry* pEntry = aEntriesBox.First(); - while (pEntry) - { - TAccInfo* pUserData = (TAccInfo*)pEntry->GetUserData(); - ::rtl::OUString sCommand ; - css::awt::KeyEvent aAWTKey ; - - if (pUserData) - { - sCommand = pUserData->m_sCommand; - aAWTKey = ::svt::AcceleratorExecute::st_VCLKey2AWTKey(pUserData->m_aKey); - } - - try - { - if (sCommand.getLength()) - xAccMgr->setKeyEvent(aAWTKey, sCommand); - else - xAccMgr->removeKeyEvent(aAWTKey); - } - catch(const css::uno::RuntimeException& exRun) - { throw exRun; } - catch(const css::uno::Exception&) - {} - - pEntry = aEntriesBox.Next(pEntry); - } -} - -//----------------------------------------------- -void SfxAcceleratorConfigPage::ResetConfig() -{ - aEntriesBox.Clear(); -} - -//----------------------------------------------- -IMPL_LINK( SfxAcceleratorConfigPage, Load, Button*, EMPTYARG ) -{ - // ask for filename, where we should load the new config data from - StartFileDialog( WB_OPEN | WB_STDMODAL | WB_3DLOOK, aLoadAccelConfigStr ); - return 0; -} - -//----------------------------------------------- -IMPL_LINK( SfxAcceleratorConfigPage, Save, Button*, EMPTYARG ) -{ - StartFileDialog( WB_SAVEAS | WB_STDMODAL | WB_3DLOOK, aSaveAccelConfigStr ); - return 0; -} - -//----------------------------------------------- -IMPL_LINK(SfxAcceleratorConfigPage, Default, PushButton*, EMPTYARG) -{ - css::uno::Reference< css::form::XReset > xReset(m_xAct, css::uno::UNO_QUERY); - if (xReset.is()) - xReset->reset(); - - aEntriesBox.SetUpdateMode(sal_False); - ResetConfig(); - Init(m_xAct); - aEntriesBox.SetUpdateMode(sal_True); - aEntriesBox.Invalidate(); - aEntriesBox.Select(aEntriesBox.GetEntry(0, 0)); - - return 0; -} - -//----------------------------------------------- -IMPL_LINK( SfxAcceleratorConfigPage, ChangeHdl, Button*, EMPTYARG ) -{ - sal_uInt16 nPos = (sal_uInt16) aEntriesBox.GetModel()->GetRelPos( aEntriesBox.FirstSelected() ); - TAccInfo* pEntry = (TAccInfo*)aEntriesBox.GetEntry(0, nPos)->GetUserData(); - String sNewCommand = pFunctionBox->GetCurCommand(); - String sLabel = pFunctionBox->GetCurLabel(); - if (!sLabel.Len()) - sLabel = GetLabel4Command(sNewCommand); - - pEntry->m_sCommand = sNewCommand; - sal_uInt16 nCol = aEntriesBox.TabCount() - 1; - aEntriesBox.SetEntryText(sLabel, nPos, nCol); - - ((Link &) pFunctionBox->GetSelectHdl()).Call( pFunctionBox ); - return 0; -} - -//----------------------------------------------- -IMPL_LINK( SfxAcceleratorConfigPage, RemoveHdl, Button *, EMPTYARG ) -{ - // get selected entry - sal_uInt16 nPos = (sal_uInt16) aEntriesBox.GetModel()->GetRelPos( aEntriesBox.FirstSelected() ); - TAccInfo* pEntry = (TAccInfo*)aEntriesBox.GetEntry(0, nPos)->GetUserData(); - - // remove function name from selected entry - sal_uInt16 nCol = aEntriesBox.TabCount() - 1; - aEntriesBox.SetEntryText( String(), nPos, nCol ); - pEntry->m_sCommand = ::rtl::OUString(); - - ((Link &) pFunctionBox->GetSelectHdl()).Call( pFunctionBox ); - return 0; -} - -//----------------------------------------------- -IMPL_LINK( SfxAcceleratorConfigPage, SelectHdl, Control*, pListBox ) -{ - // disable help - Help::ShowBalloon( this, Point(), String() ); - if ( pListBox == &aEntriesBox ) - { - sal_uInt16 nPos = (sal_uInt16) aEntriesBox.GetModel()->GetRelPos( aEntriesBox.FirstSelected() ); - TAccInfo* pEntry = (TAccInfo*)aEntriesBox.GetEntry(0, nPos)->GetUserData(); - ::rtl::OUString sPossibleNewCommand = pFunctionBox->GetCurCommand(); - - aRemoveButton.Enable( sal_False ); - aChangeButton.Enable( sal_False ); - - if (pEntry->m_bIsConfigurable) - { - if (pEntry->isConfigured()) - aRemoveButton.Enable( sal_True ); - aChangeButton.Enable( pEntry->m_sCommand != sPossibleNewCommand ); - } - } - else if ( pListBox == pGroupLBox ) - { - pGroupLBox->GroupSelected(); - if ( !pFunctionBox->FirstSelected() ) - aChangeButton.Enable( sal_False ); - } - else if ( pListBox == pFunctionBox ) - { - aRemoveButton.Enable( sal_False ); - aChangeButton.Enable( sal_False ); - - // #i36994 First selected can return zero! - SvLBoxEntry* pLBEntry = aEntriesBox.FirstSelected(); - if ( pLBEntry != 0 ) - { - sal_uInt16 nPos = (sal_uInt16) aEntriesBox.GetModel()->GetRelPos( pLBEntry ); - TAccInfo* pEntry = (TAccInfo*)aEntriesBox.GetEntry(0, nPos)->GetUserData(); - ::rtl::OUString sPossibleNewCommand = pFunctionBox->GetCurCommand(); - - if (pEntry->m_bIsConfigurable) - { - if (pEntry->isConfigured()) - aRemoveButton.Enable( sal_True ); - aChangeButton.Enable( pEntry->m_sCommand != sPossibleNewCommand ); - } - - // update key box - aKeyBox.Clear(); - SvLBoxEntry* pIt = aEntriesBox.First(); - while ( pIt ) - { - TAccInfo* pUserData = (TAccInfo*)pIt->GetUserData(); - if ( pUserData && pUserData->m_sCommand == sPossibleNewCommand ) - { - TAccInfo* pU1 = new TAccInfo(-1, -1, pUserData->m_aKey); - SvLBoxEntry* pE1 = aKeyBox.InsertEntry( pUserData->m_aKey.GetName(), 0L, sal_True, LIST_APPEND ); - pE1->SetUserData(pU1); - pE1->EnableChildsOnDemand( sal_False ); - } - pIt = aEntriesBox.Next(pIt); - } - } - } - else - { - // goto selected "key" entry of the key box - SvLBoxEntry* pE2 = 0; - TAccInfo* pU2 = 0; - sal_uInt16 nP2 = LISTBOX_ENTRY_NOTFOUND; - SvLBoxEntry* pE3 = 0; - - pE2 = aKeyBox.FirstSelected(); - if (pE2) - pU2 = (TAccInfo*)pE2->GetUserData(); - if (pU2) - nP2 = MapKeyCodeToPos(pU2->m_aKey); - if (nP2 != LISTBOX_ENTRY_NOTFOUND) - pE3 = aEntriesBox.GetEntry( 0, nP2 ); - if (pE3) - { - aEntriesBox.Select( pE3 ); - aEntriesBox.MakeVisible( pE3 ); - } - } - - return 0; -} - -//----------------------------------------------- -IMPL_LINK( SfxAcceleratorConfigPage, RadioHdl, RadioButton *, EMPTYARG ) -{ - css::uno::Reference< css::ui::XAcceleratorConfiguration > xOld = m_xAct; - - if (aOfficeButton.IsChecked()) - m_xAct = m_xGlobal; - else if (aModuleButton.IsChecked()) - m_xAct = m_xModule; - - // nothing changed? => do nothing! - if ( m_xAct.is() && ( xOld == m_xAct ) ) - return 0; - - aEntriesBox.SetUpdateMode( sal_False ); - ResetConfig(); - Init(m_xAct); - aEntriesBox.SetUpdateMode( sal_True ); - aEntriesBox.Invalidate(); - - pGroupLBox->Init(m_xSMGR, m_xFrame, m_sModuleLongName); - - // pb: #133213# do not select NULL entries - SvLBoxEntry* pEntry = aEntriesBox.GetEntry( 0, 0 ); - if ( pEntry ) - aEntriesBox.Select( pEntry ); - pEntry = pGroupLBox->GetEntry( 0, 0 ); - if ( pEntry ) - pGroupLBox->Select( pEntry ); - - ((Link &) pFunctionBox->GetSelectHdl()).Call( pFunctionBox ); - return 1L; -} - -//----------------------------------------------- -IMPL_LINK( SfxAcceleratorConfigPage, LoadHdl, sfx2::FileDialogHelper*, EMPTYARG ) -{ - DBG_ASSERT( m_pFileDlg, "SfxInternetPage::DialogClosedHdl(): no file dialog" ); - - ::rtl::OUString sCfgName; - if ( ERRCODE_NONE == m_pFileDlg->GetError() ) - sCfgName = m_pFileDlg->GetPath(); - - if ( !sCfgName.getLength() ) - return 0; - - GetTabDialog()->EnterWait(); - - css::uno::Reference< css::frame::XModel > xDoc ; - css::uno::Reference< css::ui::XUIConfigurationManager > xCfgMgr ; - css::uno::Reference< css::embed::XStorage > xRootStorage; // we must hold the root storage alive, if xCfgMgr is used! - - try - { - // first check if URL points to a document already loaded - xDoc = SearchForAlreadyLoadedDoc(sCfgName); - if (xDoc.is()) - { - // Get ui config manager. There should always be one at the model. - css::uno::Reference< css::ui::XUIConfigurationManagerSupplier > xCfgSupplier(xDoc, css::uno::UNO_QUERY_THROW); - xCfgMgr = xCfgSupplier->getUIConfigurationManager(); - } - else - { - // URL doesn't point to a loaded document, try to access it as a single storage - // dont forget to release the storage afterwards! - css::uno::Reference< css::lang::XSingleServiceFactory > xStorageFactory(m_xSMGR->createInstance(SERVICE_STORAGEFACTORY), css::uno::UNO_QUERY_THROW); - css::uno::Sequence< css::uno::Any > lArgs(2); - lArgs[0] <<= sCfgName; - lArgs[1] <<= css::embed::ElementModes::READ; - - xRootStorage = css::uno::Reference< css::embed::XStorage >(xStorageFactory->createInstanceWithArguments(lArgs), css::uno::UNO_QUERY_THROW); - css::uno::Reference< css::embed::XStorage > xUIConfig = xRootStorage->openStorageElement(FOLDERNAME_UICONFIG, css::embed::ElementModes::READ); - if (xUIConfig.is()) - { - xCfgMgr = css::uno::Reference< css::ui::XUIConfigurationManager >(m_xSMGR->createInstance(SERVICE_UICONFIGMGR), css::uno::UNO_QUERY_THROW); - css::uno::Reference< css::ui::XUIConfigurationStorage > xCfgMgrStore(xCfgMgr, css::uno::UNO_QUERY_THROW); - xCfgMgrStore->setStorage(xUIConfig); - } - } - - if (xCfgMgr.is()) - { - // open the configuration and update our UI - css::uno::Reference< css::ui::XAcceleratorConfiguration > xTempAccMgr(xCfgMgr->getShortCutManager(), css::uno::UNO_QUERY_THROW); - - aEntriesBox.SetUpdateMode(sal_False); - ResetConfig(); - Init(xTempAccMgr); - aEntriesBox.SetUpdateMode(sal_True); - aEntriesBox.Invalidate(); - aEntriesBox.Select(aEntriesBox.GetEntry(0, 0)); - - } - - // dont forget to close the new opened storage! - // We are the owner of it. - if (xRootStorage.is()) - { - css::uno::Reference< css::lang::XComponent > xComponent; - xComponent = css::uno::Reference< css::lang::XComponent >(xCfgMgr, css::uno::UNO_QUERY); - if (xComponent.is()) - xComponent->dispose(); - xComponent = css::uno::Reference< css::lang::XComponent >(xRootStorage, css::uno::UNO_QUERY); - if (xComponent.is()) - xComponent->dispose(); - } - } - catch(const css::uno::RuntimeException& exRun) - { throw exRun; } - catch(const css::uno::Exception&) - {} - - GetTabDialog()->LeaveWait(); - - return 0; -} - -//----------------------------------------------- -IMPL_LINK( SfxAcceleratorConfigPage, SaveHdl, sfx2::FileDialogHelper*, EMPTYARG ) -{ - DBG_ASSERT( m_pFileDlg, "SfxInternetPage::DialogClosedHdl(): no file dialog" ); - - ::rtl::OUString sCfgName; - if ( ERRCODE_NONE == m_pFileDlg->GetError() ) - sCfgName = m_pFileDlg->GetPath(); - - if ( !sCfgName.getLength() ) - return 0; - - GetTabDialog()->EnterWait(); - - css::uno::Reference< css::frame::XModel > xDoc ; - css::uno::Reference< css::ui::XUIConfigurationManager > xCfgMgr ; - css::uno::Reference< css::embed::XStorage > xRootStorage; - - try - { - // first check if URL points to a document already loaded - xDoc = SearchForAlreadyLoadedDoc(sCfgName); - if (xDoc.is()) - { - // get config manager, force creation if there was none before - css::uno::Reference< css::ui::XUIConfigurationManagerSupplier > xCfgSupplier(xDoc, css::uno::UNO_QUERY_THROW); - xCfgMgr = xCfgSupplier->getUIConfigurationManager(); - } - else - { - // URL doesn't point to a loaded document, try to access it as a single storage - css::uno::Reference< css::lang::XSingleServiceFactory > xStorageFactory(m_xSMGR->createInstance(SERVICE_STORAGEFACTORY), css::uno::UNO_QUERY_THROW); - css::uno::Sequence< css::uno::Any > lArgs(2); - lArgs[0] <<= sCfgName; - lArgs[1] <<= css::embed::ElementModes::WRITE; - - xRootStorage = css::uno::Reference< css::embed::XStorage >( - xStorageFactory->createInstanceWithArguments(lArgs), - css::uno::UNO_QUERY_THROW); - - css::uno::Reference< css::embed::XStorage > xUIConfig( - xRootStorage->openStorageElement(FOLDERNAME_UICONFIG, css::embed::ElementModes::WRITE), - css::uno::UNO_QUERY_THROW); - css::uno::Reference< css::beans::XPropertySet > xUIConfigProps( - xUIConfig, - css::uno::UNO_QUERY_THROW); - - // set the correct media type if the storage was new created - ::rtl::OUString sMediaType; - xUIConfigProps->getPropertyValue(MEDIATYPE_PROPNAME) >>= sMediaType; - if (!sMediaType.getLength()) - xUIConfigProps->setPropertyValue(MEDIATYPE_PROPNAME, css::uno::makeAny(MEDIATYPE_UICONFIG)); - - xCfgMgr = css::uno::Reference< css::ui::XUIConfigurationManager >(m_xSMGR->createInstance(SERVICE_UICONFIGMGR), css::uno::UNO_QUERY_THROW); - css::uno::Reference< css::ui::XUIConfigurationStorage > xUICfgStore(xCfgMgr, css::uno::UNO_QUERY_THROW); - xUICfgStore->setStorage(xUIConfig); - } - - if (xCfgMgr.is()) - { - // get the target configuration access and update with all shortcuts - // which are set currently at the UI ! - // Dont copy the m_xAct content to it ... because m_xAct will be updated - // from the UI on pressing the button "OK" only. And inbetween it's not up to date ! - css::uno::Reference< css::ui::XAcceleratorConfiguration > xTargetAccMgr(xCfgMgr->getShortCutManager(), css::uno::UNO_QUERY_THROW); - Apply(xTargetAccMgr); - - // commit (order is important!) - css::uno::Reference< css::ui::XUIConfigurationPersistence > xCommit1(xTargetAccMgr, css::uno::UNO_QUERY_THROW); - css::uno::Reference< css::ui::XUIConfigurationPersistence > xCommit2(xCfgMgr , css::uno::UNO_QUERY_THROW); - xCommit1->store(); - xCommit2->store(); - - if (xRootStorage.is()) - { - // Commit root storage - css::uno::Reference< css::embed::XTransactedObject > xCommit3(xRootStorage, css::uno::UNO_QUERY_THROW); - xCommit3->commit(); - } - } - - if (xRootStorage.is()) - { - css::uno::Reference< css::lang::XComponent > xComponent; - xComponent = css::uno::Reference< css::lang::XComponent >(xCfgMgr, css::uno::UNO_QUERY); - if (xComponent.is()) - xComponent->dispose(); - xComponent = css::uno::Reference< css::lang::XComponent >(xRootStorage, css::uno::UNO_QUERY); - if (xComponent.is()) - xComponent->dispose(); - } - } - catch(const css::uno::RuntimeException& exRun) - { throw exRun; } - catch(const css::uno::Exception&) - {} - - GetTabDialog()->LeaveWait(); - - return 0; -} - -//----------------------------------------------- -void SfxAcceleratorConfigPage::StartFileDialog( WinBits nBits, const String& rTitle ) -{ - bool bSave = ( ( nBits & WB_SAVEAS ) == WB_SAVEAS ); - short nDialogType = bSave ? css::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE - : css::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE; - if ( m_pFileDlg ) - delete m_pFileDlg; - m_pFileDlg = new sfx2::FileDialogHelper( nDialogType, 0 ); - - m_pFileDlg->SetTitle( rTitle ); - m_pFileDlg->AddFilter( aFilterAllStr, DEFINE_CONST_UNICODE( FILEDIALOG_FILTER_ALL ) ); - m_pFileDlg->AddFilter( aFilterCfgStr, DEFINE_CONST_UNICODE( "*.cfg" ) ); - - Link aDlgClosedLink = bSave ? LINK( this, SfxAcceleratorConfigPage, SaveHdl ) - : LINK( this, SfxAcceleratorConfigPage, LoadHdl ); - m_pFileDlg->StartExecuteModal( aDlgClosedLink ); -} - -//----------------------------------------------- -sal_Bool SfxAcceleratorConfigPage::FillItemSet( SfxItemSet& ) -{ - Apply(m_xAct); - try - { - m_xAct->store(); - } - catch(const css::uno::RuntimeException& exRun) - { throw exRun; } - catch(const css::uno::Exception&) - { return sal_False; } - - return sal_True; -} - -//----------------------------------------------- -void SfxAcceleratorConfigPage::Reset( const SfxItemSet& rSet ) -{ - // open accelerator configs - // Note: It initialize some other members too, which are needed here ... - // e.g. m_sModuleUIName! - InitAccCfg(); - - // change te description of the radio button, which switch to the module - // dependend accelerator configuration - String sButtonText = aModuleButton.GetText(); - sButtonText.SearchAndReplace(String::CreateFromAscii("$(MODULE)"), m_sModuleUIName); - aModuleButton.SetText(sButtonText); - - if (m_xModule.is()) - aModuleButton.Check(); - else - { - aModuleButton.Hide(); - aOfficeButton.Check(); - } - - RadioHdl(0); - - const SfxPoolItem* pMacroItem=0; - if( SFX_ITEM_SET == rSet.GetItemState( SID_MACROINFO, sal_True, &pMacroItem ) ) - { - m_pMacroInfoItem = PTR_CAST( SfxMacroInfoItem, pMacroItem ); - pGroupLBox->SelectMacro( m_pMacroInfoItem ); - } - else - { - const SfxPoolItem* pStringItem=0; - if( SFX_ITEM_SET == rSet.GetItemState( SID_CHARMAP, sal_True, &pStringItem ) ) - m_pStringItem = PTR_CAST( SfxStringItem, pStringItem ); - - const SfxPoolItem* pFontItem=0; - if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_SPECIALCHAR, sal_True, &pFontItem ) ) - m_pFontItem = PTR_CAST( SfxStringItem, pFontItem ); - } -} - -//----------------------------------------------- -sal_uInt16 SfxAcceleratorConfigPage::MapKeyCodeToPos(const KeyCode& aKey) const -{ - sal_uInt16 nCode1 = aKey.GetCode()+aKey.GetModifier(); - SvLBoxEntry* pEntry = aEntriesBox.First(); - sal_uInt16 i = 0; - - while (pEntry) - { - TAccInfo* pUserData = (TAccInfo*)pEntry->GetUserData(); - if (pUserData) - { - sal_uInt16 nCode2 = pUserData->m_aKey.GetCode()+pUserData->m_aKey.GetModifier(); - if (nCode1 == nCode2) - return i; - } - pEntry = aEntriesBox.Next(pEntry); - ++i; - } - - return LISTBOX_ENTRY_NOTFOUND; -} - -//----------------------------------------------- -String SfxAcceleratorConfigPage::GetLabel4Command(const String& sCommand) -{ - try - { - // check global command configuration first - css::uno::Reference< css::container::XNameAccess > xModuleConf; - m_xUICmdDescription->getByName(m_sModuleLongName) >>= xModuleConf; - if (xModuleConf.is()) - { - ::comphelper::SequenceAsHashMap lProps(xModuleConf->getByName(sCommand)); - String sLabel = String(lProps.getUnpackedValueOrDefault(CMDPROP_UINAME, ::rtl::OUString())); - if (sLabel.Len()) - return sLabel; - } - } - catch(const css::uno::RuntimeException& exRun) - { throw exRun; } - catch(const css::uno::Exception&) - {} - - // may be it's a style URL .. they must be handled special - SfxStyleInfo_Impl aStyle; - aStyle.sCommand = sCommand; - if (m_aStylesInfo.parseStyleCommand(aStyle)) - { - m_aStylesInfo.getLabel4Style(aStyle); - return aStyle.sLabel; - } - else - { - String aRet( String::CreateFromAscii("Symbols: ") ); - xub_StrLen nPos = sCommand.SearchAscii(".uno:InsertSymbol?Symbols:string="); - if ( nPos == 0 ) - { - aRet += String( sCommand, 34, sCommand.Len()-34 ); - return aRet; - } - } - - return sCommand; -} - -SfxTabPage* SfxAcceleratorConfigPage::Create( Window* pParent, const SfxItemSet& rAttrSet ) -{ - return new SfxAcceleratorConfigPage( pParent, rAttrSet ); -} - -//----------------------------------------------- -css::uno::Reference< css::frame::XModel > SfxAcceleratorConfigPage::SearchForAlreadyLoadedDoc(const String& /*sName*/) -{ - return css::uno::Reference< css::frame::XModel >(); -} - -SvxShortcutAssignDlg::SvxShortcutAssignDlg( Window* pParent, const uno::Reference< frame::XFrame >& rxDocumentFrame, const SfxItemSet& rSet ) - : SfxSingleTabDialog( pParent, rSet, 0 ) -{ - SfxTabPage* pPage = SfxAcceleratorConfigPage::Create( this, rSet ); - pPage->SetFrame( rxDocumentFrame ); - SetTabPage( pPage ); - -} - -SvxShortcutAssignDlg::~SvxShortcutAssignDlg() -{ -} - - -// .uno:InsertSymbol?Symbols:string=bla - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |