diff options
Diffstat (limited to 'cui/source/customize/acccfg.cxx')
-rw-r--r-- | cui/source/customize/acccfg.cxx | 1702 |
1 files changed, 1702 insertions, 0 deletions
diff --git a/cui/source/customize/acccfg.cxx b/cui/source/customize/acccfg.cxx new file mode 100644 index 000000000000..8ff50323cc76 --- /dev/null +++ b/cui/source/customize/acccfg.cxx @@ -0,0 +1,1702 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: acccfg.cxx,v $ + * $Revision: 1.40 $ + * + * 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. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_cui.hxx" + +//----------------------------------------------- +// include own files + +#include "acccfg.hxx" +#include "cfgutil.hxx" +#include <dialmgr.hxx> + +#include <sfx2/msg.hxx> +#include <sfx2/macrconf.hxx> +#include <sfx2/app.hxx> +#include <sfx2/filedlghelper.hxx> +#include <sfx2/minfitem.hxx> +#include <svl/stritem.hxx> + +#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/frame/XModuleManager.hpp> +#include <com/sun/star/ui/XModuleUIConfigurationManagerSupplier.hpp> +#include <com/sun/star/frame/XModuleManager.hpp> + +#ifndef _COM_SUN_STAR_UI_XUICONFIGURATIONMANAGERSUPLLIER_HPP_ +#include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp> +#endif +#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::OUString::createFromAscii("com.sun.star.embed.StorageFactory" ); +static ::rtl::OUString SERVICE_UICONFIGMGR = ::rtl::OUString::createFromAscii("com.sun.star.ui.UIConfigurationManager" ); +static ::rtl::OUString SERVICE_DESKTOP = ::rtl::OUString::createFromAscii("com.sun.star.frame.Desktop" ); +static ::rtl::OUString SERVICE_MODULEMANAGER = ::rtl::OUString::createFromAscii("com.sun.star.frame.ModuleManager" ); +static ::rtl::OUString SERVICE_GLOBALACCCFG = ::rtl::OUString::createFromAscii("com.sun.star.ui.GlobalAcceleratorConfiguration" ); +static ::rtl::OUString SERVICE_MODULEUICONFIGSUPPLIER = ::rtl::OUString::createFromAscii("com.sun.star.ui.ModuleUIConfigurationManagerSupplier"); +static ::rtl::OUString SERVICE_UICMDDESCRIPTION = ::rtl::OUString::createFromAscii("com.sun.star.frame.UICommandDescription" ); + +static ::rtl::OUString MODULEPROP_SHORTNAME = ::rtl::OUString::createFromAscii("ooSetupFactoryShortName" ); +static ::rtl::OUString MODULEPROP_UINAME = ::rtl::OUString::createFromAscii("ooSetupFactoryUIName" ); +static ::rtl::OUString CMDPROP_UINAME = ::rtl::OUString::createFromAscii("Name" ); + +static ::rtl::OUString FOLDERNAME_UICONFIG = ::rtl::OUString::createFromAscii("Configurations2" ); + +static ::rtl::OUString MEDIATYPE_PROPNAME = ::rtl::OUString::createFromAscii("MediaType" ); +static ::rtl::OUString MEDIATYPE_UICONFIG = ::rtl::OUString::createFromAscii("application/vnd.sun.xml.ui.configuration" ); + +//----------------------------------------------- +static USHORT __FAR_DATA 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_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_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_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_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_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_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_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_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_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_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_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_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_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 USHORT KEYCODE_ARRAY_SIZE = (sizeof(KEYCODE_ARRAY) / sizeof(KEYCODE_ARRAY[0])); + +//----------------------------------------------- +// 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, + USHORT nFlags, + const String& sText ); + + virtual ~SfxAccCfgLBoxString_Impl(); + + virtual void Paint(const Point& aPos , + SvLBox& rDevice, + USHORT nFlags , + SvLBoxEntry* pEntry ); +}; + +//----------------------------------------------- +SfxAccCfgLBoxString_Impl::SfxAccCfgLBoxString_Impl( SvLBoxEntry* pEntry, + USHORT nFlags, + const String& sText ) + : SvLBoxString(pEntry, nFlags, sText) +{ +} + +//----------------------------------------------- +SfxAccCfgLBoxString_Impl::~SfxAccCfgLBoxString_Impl() +{ +} + +//----------------------------------------------- +void SfxAccCfgLBoxString_Impl::Paint(const Point& aPos , + SvLBox& rDevice, + USHORT /*nFlags*/, + SvLBoxEntry* pEntry ) +{ + /*/ ??? realy needed !!! + Font aOldFont(rDevice.GetFont()); + Font aNewFont(aOldFont ); + rDevice.SetFont( aFont ); + */ + + 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); + + //rDev.SetFont( aOldFont ); +} + +//----------------------------------------------- +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(); + USHORT nCode1 = aCode1.GetCode(); + USHORT 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) + { + USHORT nCode2 = pUserData->m_aKey.GetCode(); + USHORT 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 ) ) + , aFilterAllStr ( CUI_RES( STR_SFX_FILTERNAME_ALL ) ) + , aFilterCfgStr ( CUI_RES( STR_FILTERNAME_CFG ) ) + , m_bStylesInfoInitialized(sal_False) + , m_xGlobal () + , m_xModule () + , m_xAct () +{ + FreeResource(); + +// 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.SetWindowBits(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 ( USHORT 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.SetWindowBits(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. + USHORT c1 = KEYCODE_ARRAY_SIZE; + USHORT i1 = 0; + USHORT 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; + USHORT 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); + USHORT 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 + ULONG c3 = Application::GetReservedKeyCodeCount(); + ULONG i3 = 0; + for (i3=0; i3<c3; ++i3) + { + const KeyCode* pKeyCode = Application::GetReservedKeyCode(i3); + USHORT 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, aLoadAccelConfigStr ); + 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(FALSE); + ResetConfig(); + Init(m_xAct); + aEntriesBox.SetUpdateMode(TRUE); + aEntriesBox.Invalidate(); + aEntriesBox.Select(aEntriesBox.GetEntry(0, 0)); + + return 0; +} + +//----------------------------------------------- +IMPL_LINK( SfxAcceleratorConfigPage, ChangeHdl, Button*, EMPTYARG ) +{ + USHORT nPos = (USHORT) 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; + USHORT 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 + USHORT nPos = (USHORT) aEntriesBox.GetModel()->GetRelPos( aEntriesBox.FirstSelected() ); + TAccInfo* pEntry = (TAccInfo*)aEntriesBox.GetEntry(0, nPos)->GetUserData(); + + // remove function name from selected entry + USHORT 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 ) + { + USHORT nPos = (USHORT) aEntriesBox.GetModel()->GetRelPos( aEntriesBox.FirstSelected() ); + TAccInfo* pEntry = (TAccInfo*)aEntriesBox.GetEntry(0, nPos)->GetUserData(); + ::rtl::OUString sPossibleNewCommand = pFunctionBox->GetCurCommand(); + + aRemoveButton.Enable( FALSE ); + aChangeButton.Enable( FALSE ); + + if (pEntry->m_bIsConfigurable) + { + if (pEntry->isConfigured()) + aRemoveButton.Enable( TRUE ); + aChangeButton.Enable( pEntry->m_sCommand != sPossibleNewCommand ); + } + } + else if ( pListBox == pGroupLBox ) + { + pGroupLBox->GroupSelected(); + if ( !pFunctionBox->FirstSelected() ) + aChangeButton.Enable( FALSE ); + } + else if ( pListBox == pFunctionBox ) + { + aRemoveButton.Enable( FALSE ); + aChangeButton.Enable( FALSE ); + + // #i36994 First selected can return zero! + SvLBoxEntry* pLBEntry = aEntriesBox.FirstSelected(); + if ( pLBEntry != 0 ) + { + USHORT nPos = (USHORT) 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( 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, TRUE, LIST_APPEND ); + pE1->SetUserData(pU1); + pE1->EnableChildsOnDemand( FALSE ); + } + pIt = aEntriesBox.Next(pIt); + } + } + } + else + { + // goto selected "key" entry of the key box + SvLBoxEntry* pE2 = 0; + TAccInfo* pU2 = 0; + USHORT 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( FALSE ); + ResetConfig(); + Init(m_xAct); + aEntriesBox.SetUpdateMode( 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(FALSE); + ResetConfig(); + Init(xTempAccMgr); + aEntriesBox.SetUpdateMode(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; +} + +::rtl::OUString RetrieveLabelFromCommand( const ::rtl::OUString& aCmdURL ) +{ + ::rtl::OUString aLabel; + if ( aCmdURL.getLength() ) + { + try + { + uno::Reference< container::XNameAccess > xNameAccess( ::comphelper::getProcessServiceFactory()->createInstance( rtl::OUString::createFromAscii("com.sun.star.frame.UICommandDescription") ), uno::UNO_QUERY ); + if ( xNameAccess.is() ) + { + uno::Reference< container::XNameAccess > xUICommandLabels; + const ::rtl::OUString aModule( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.text.TextDocument" ) ); + uno::Any a = xNameAccess->getByName( aModule ); + uno::Reference< container::XNameAccess > xUICommands; + a >>= xUICommandLabels; + rtl::OUString aStr; + uno::Sequence< beans::PropertyValue > aPropSeq; + a = xUICommandLabels->getByName( aCmdURL ); + if ( a >>= aPropSeq ) + { + for ( sal_Int32 i = 0; i < aPropSeq.getLength(); i++ ) + { + if ( aPropSeq[i].Name.equalsAscii( "Name" )) + { + aPropSeq[i].Value >>= aStr; + break; + } + } + } + aLabel = aStr; + } + } + catch ( uno::Exception& ) + { + } + } + + return aLabel; +} + + +//----------------------------------------------- +String SfxAcceleratorConfigPage::GetFunctionName(KeyFuncType eType) const +{ + ::rtl::OUStringBuffer sName(256); + sName.appendAscii("\""); + switch(eType) + { + case KEYFUNC_NEW : + sName.append( RetrieveLabelFromCommand( ::rtl::OUString::createFromAscii(".uno:NewDoc") ) ); + break; + + case KEYFUNC_OPEN : + sName.append( RetrieveLabelFromCommand( ::rtl::OUString::createFromAscii(".uno:Open") ) ); + break; + + case KEYFUNC_SAVE : + sName.append( RetrieveLabelFromCommand( ::rtl::OUString::createFromAscii(".uno:Save") ) ); + break; + + case KEYFUNC_SAVEAS : + sName.append( RetrieveLabelFromCommand( ::rtl::OUString::createFromAscii(".uno:SaveAs") ) ); + break; + + case KEYFUNC_PRINT : + sName.append( RetrieveLabelFromCommand( ::rtl::OUString::createFromAscii(".uno:Print") ) ); + break; + + case KEYFUNC_CLOSE : + sName.append( RetrieveLabelFromCommand( ::rtl::OUString::createFromAscii(".uno:Close") ) ); + break; + + case KEYFUNC_QUIT : + sName.append( RetrieveLabelFromCommand( ::rtl::OUString::createFromAscii(".uno:Quit") ) ); + break; + + case KEYFUNC_CUT : + sName.append( RetrieveLabelFromCommand( ::rtl::OUString::createFromAscii(".uno:Cut") ) ); + break; + + case KEYFUNC_COPY : + sName.append( RetrieveLabelFromCommand( ::rtl::OUString::createFromAscii(".uno:Copy") ) ); + break; + + case KEYFUNC_PASTE : + sName.append( RetrieveLabelFromCommand( ::rtl::OUString::createFromAscii(".uno:Paste") ) ); + break; + + case KEYFUNC_UNDO : + sName.append( RetrieveLabelFromCommand( ::rtl::OUString::createFromAscii(".uno:Undo") ) ); + break; + + case KEYFUNC_REDO : + sName.append( RetrieveLabelFromCommand( ::rtl::OUString::createFromAscii(".uno:Redo") ) ); + break; + + case KEYFUNC_DELETE : + sName.append( RetrieveLabelFromCommand( ::rtl::OUString::createFromAscii(".uno:Delete") ) ); + break; + + case KEYFUNC_REPEAT : + sName.append( RetrieveLabelFromCommand( ::rtl::OUString::createFromAscii(".uno:Repeat") ) ); + break; + + case KEYFUNC_FIND : + sName.append( RetrieveLabelFromCommand( ::rtl::OUString::createFromAscii(".uno:Search") ) ); + break; + + case KEYFUNC_FINDBACKWARD : + sName.append( RetrieveLabelFromCommand( ::rtl::OUString::createFromAscii(".uno:SearchBackwards") ) ); + break; + + case KEYFUNC_PROPERTIES : + sName.append( RetrieveLabelFromCommand( ::rtl::OUString::createFromAscii(".uno:Options") ) ); + break; + + case KEYFUNC_FRONT : + sName.append( RetrieveLabelFromCommand( ::rtl::OUString::createFromAscii(".uno:ToFront") ) ); + break; + + default: + break; + } + sName.appendAscii("\""); + return String(sName.makeStringAndClear()); +} + +//----------------------------------------------- +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->SetDialogHelpId( bSave ? HID_CONFIG_SAVE : HID_CONFIG_LOAD ); + 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 ); +} + +//----------------------------------------------- +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 FALSE; } + + return 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, 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, TRUE, &pStringItem ) ) + m_pStringItem = PTR_CAST( SfxStringItem, pStringItem ); + + const SfxPoolItem* pFontItem=0; + if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_SPECIALCHAR, TRUE, &pFontItem ) ) + m_pFontItem = PTR_CAST( SfxStringItem, pFontItem ); + + if ( m_pStringItem ) + pGroupLBox->AddAndSelect( m_pStringItem, m_pFontItem ); + } +} + +//----------------------------------------------- +void SfxAcceleratorConfigPage::SelectMacro(const SfxMacroInfoItem *pItem) +{ + m_pMacroInfoItem = pItem; + pGroupLBox->SelectMacro( pItem ); +} + +//----------------------------------------------- +void SfxAcceleratorConfigPage::CopySource2Target(const css::uno::Reference< css::ui::XAcceleratorConfiguration >& xSourceAccMgr, + const css::uno::Reference< css::ui::XAcceleratorConfiguration >& xTargetAccMgr) +{ + const css::uno::Sequence< css::awt::KeyEvent > lKeys = xSourceAccMgr->getAllKeyEvents(); + sal_Int32 c = lKeys.getLength(); + sal_Int32 i = 0; + for (i=0; i<c; ++i) + { + const css::awt::KeyEvent& rKey = lKeys[i]; + ::rtl::OUString sCommand = xSourceAccMgr->getCommandByKeyEvent(rKey); + xTargetAccMgr->setKeyEvent(rKey, sCommand); + } +} + +//----------------------------------------------- +KeyCode SfxAcceleratorConfigPage::MapPosToKeyCode(USHORT nPos) const +{ + TAccInfo* pEntry = (TAccInfo*)aEntriesBox.GetEntry(0, nPos)->GetUserData(); + KeyCode aCode(KEYCODE_ARRAY[pEntry->m_nKeyPos] & 0xFFF , + KEYCODE_ARRAY[pEntry->m_nKeyPos] & (KEY_SHIFT | KEY_MOD2)); + return aCode; +} + +//----------------------------------------------- +USHORT SfxAcceleratorConfigPage::MapKeyCodeToPos(const KeyCode& aKey) const +{ + USHORT nCode1 = aKey.GetCode()+aKey.GetModifier(); + SvLBoxEntry* pEntry = aEntriesBox.First(); + USHORT i = 0; + + while (pEntry) + { + TAccInfo* pUserData = (TAccInfo*)pEntry->GetUserData(); + if (pUserData) + { + USHORT 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 |