/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
// include own files
#include <acccfg.hxx>
#include <cfgutil.hxx>
#include <dialmgr.hxx>
#include <sfx2/filedlghelper.hxx>
#include <sfx2/minfitem.hxx>
#include <sfx2/sfxresid.hxx>
#include <sal/macros.h>
#include <vcl/event.hxx>
#include <strings.hrc>
#include <sfx2/strings.hrc>
#include <svx/svxids.hrc>
// include interface declarations
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/embed/StorageFactory.hpp>
#include <com/sun/star/embed/XTransactedObject.hpp>
#include <com/sun/star/embed/ElementModes.hpp>
#include <com/sun/star/form/XReset.hpp>
#include <com/sun/star/frame/Desktop.hpp>
#include <com/sun/star/frame/XController.hpp>
#include <com/sun/star/frame/XModel.hpp>
#include <com/sun/star/frame/ModuleManager.hpp>
#include <com/sun/star/frame/theUICommandDescription.hpp>
#include <com/sun/star/ui/GlobalAcceleratorConfiguration.hpp>
#include <com/sun/star/ui/theModuleUIConfigurationManagerSupplier.hpp>
#include <com/sun/star/ui/UIConfigurationManager.hpp>
#include <com/sun/star/ui/XUIConfigurationManager.hpp>
#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
// include search util
#include <com/sun/star/util/SearchFlags.hpp>
#include <com/sun/star/util/SearchAlgorithms2.hpp>
#include <unotools/textsearch.hxx>
// include other projects
#include <comphelper/processfactory.hxx>
#include <svtools/acceleratorexecute.hxx>
#include <vcl/svapp.hxx>
#include <comphelper/sequenceashashmap.hxx>
#include <config_features.h>
#include <com/sun/star/frame/LayoutManager.hpp>
// namespaces
using namespace css;
constexpr OUString FOLDERNAME_UICONFIG = u
"Configurations2"_ustr;
constexpr OUString MEDIATYPE_PROPNAME = u
"MediaType"_ustr;
const 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_SHIFT | 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_EQUAL,
KEY_MOD1 | 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_NUMBERSIGN,
KEY_MOD1 | KEY_COLON,
KEY_MOD1 | KEY_SEMICOLON,
KEY_MOD1 | KEY_QUOTELEFT,
KEY_MOD1 | KEY_QUOTERIGHT,
KEY_MOD1 | KEY_BRACKETLEFT,
KEY_MOD1 | KEY_BRACKETRIGHT,
KEY_MOD1 | KEY_RIGHTCURLYBRACKET,
KEY_MOD1 | KEY_POINT,
KEY_MOD1 | KEY_COMMA,
KEY_MOD1 | KEY_TILDE,
KEY_MOD1 | KEY_TAB,
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_EQUAL,
KEY_SHIFT | 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_NUMBERSIGN,
KEY_SHIFT | KEY_MOD1 | KEY_COLON,
KEY_SHIFT | KEY_MOD1 | KEY_SEMICOLON,
KEY_SHIFT | KEY_MOD1 | KEY_QUOTELEFT,
KEY_SHIFT | KEY_MOD1 | KEY_QUOTERIGHT,
KEY_SHIFT | KEY_MOD1 | KEY_BRACKETLEFT,
KEY_SHIFT | KEY_MOD1 | KEY_BRACKETRIGHT,
KEY_SHIFT | KEY_MOD1 | KEY_RIGHTCURLYBRACKET,
KEY_SHIFT | KEY_MOD1 | KEY_POINT,
KEY_SHIFT | KEY_MOD1 | KEY_COMMA,
KEY_SHIFT | KEY_MOD1 | KEY_TILDE,
KEY_SHIFT | KEY_MOD1 | KEY_TAB,
KEY_SHIFT | KEY_MOD1 | KEY_DIVIDE,
KEY_SHIFT | KEY_MOD1 | KEY_ADD,
KEY_SHIFT | KEY_MOD1 | KEY_SUBTRACT,
KEY_SHIFT | KEY_MOD1 | KEY_MULTIPLY,
KEY_SHIFT | KEY_MOD1 | KEY_LESS,
KEY_SHIFT | KEY_MOD1 | KEY_GREATER,
KEY_SHIFT | KEY_MOD1 | KEY_OPEN,
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_ESCAPE,
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_EQUAL,
KEY_MOD2 | 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_NUMBERSIGN,
KEY_MOD2 | KEY_COLON,
KEY_MOD2 | KEY_SEMICOLON,
KEY_MOD2 | KEY_QUOTELEFT,
KEY_MOD2 | KEY_QUOTERIGHT,
KEY_MOD2 | KEY_BRACKETLEFT,
KEY_MOD2 | KEY_BRACKETRIGHT,
KEY_MOD2 | KEY_RIGHTCURLYBRACKET,
KEY_MOD2 | KEY_POINT,
KEY_MOD2 | KEY_COMMA,
KEY_MOD2 | KEY_TILDE,
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_EQUAL,
KEY_SHIFT | 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_NUMBERSIGN,
KEY_SHIFT | KEY_MOD2 | KEY_COLON,
KEY_SHIFT | KEY_MOD2 | KEY_SEMICOLON,
KEY_SHIFT | KEY_MOD2 | KEY_QUOTELEFT,
KEY_SHIFT | KEY_MOD2 | KEY_QUOTERIGHT,
KEY_SHIFT | KEY_MOD2 | KEY_BRACKETLEFT,
KEY_SHIFT | KEY_MOD2 | KEY_BRACKETRIGHT,
KEY_SHIFT | KEY_MOD2 | KEY_RIGHTCURLYBRACKET,
KEY_SHIFT | KEY_MOD2 | KEY_POINT,
KEY_SHIFT | KEY_MOD2 | KEY_COMMA,
KEY_SHIFT | KEY_MOD2 | KEY_TILDE,
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_ESCAPE,
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_EQUAL,
KEY_MOD1 | 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_NUMBERSIGN,
KEY_MOD1 | KEY_MOD2 | KEY_COLON,
KEY_MOD1 | KEY_MOD2 | KEY_SEMICOLON,
KEY_MOD1 | KEY_MOD2 | KEY_QUOTELEFT,
KEY_MOD1 | KEY_MOD2 | KEY_QUOTERIGHT,
KEY_MOD1 | KEY_MOD2 | KEY_BRACKETLEFT,
KEY_MOD1 | KEY_MOD2 | KEY_BRACKETRIGHT,
KEY_MOD1 | KEY_MOD2 | KEY_RIGHTCURLYBRACKET,
KEY_MOD1 | KEY_MOD2 | KEY_POINT,
KEY_MOD1 | KEY_MOD2 | KEY_COMMA,
KEY_MOD1 | KEY_MOD2 | KEY_TILDE,
KEY_MOD1 | KEY_MOD2 | KEY_EQUAL,
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_SHIFT | 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_NUMBERSIGN,
KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_COLON,
KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_SEMICOLON,
KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_QUOTELEFT,
KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_QUOTERIGHT,
KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_BRACKETLEFT,
KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_BRACKETRIGHT,
KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_RIGHTCURLYBRACKET,
KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_POINT,
KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_COMMA,
KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_TILDE,
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 | KEY_EQUAL
#ifdef __APPLE__
,
KEY_MOD3 | KEY_0,
KEY_MOD3 | KEY_1,
KEY_MOD3 | KEY_2,
KEY_MOD3 | KEY_3,
KEY_MOD3 | KEY_4,
KEY_MOD3 | KEY_5,
KEY_MOD3 | KEY_6,
KEY_MOD3 | KEY_7,
KEY_MOD3 | KEY_8,
KEY_MOD3 | KEY_9,
KEY_MOD3 | KEY_A,
KEY_MOD3 | KEY_B,
KEY_MOD3 | KEY_C,
KEY_MOD3 | KEY_D,
KEY_MOD3 | KEY_E,
KEY_MOD3 | KEY_F,
KEY_MOD3 | KEY_G,
KEY_MOD3 | KEY_H,
KEY_MOD3 | KEY_I,
KEY_MOD3 | KEY_J,
KEY_MOD3 | KEY_K,
KEY_MOD3 | KEY_L,
KEY_MOD3 | KEY_M,
KEY_MOD3 | KEY_N,
KEY_MOD3 | KEY_O,
KEY_MOD3 | KEY_P,
KEY_MOD3 | KEY_Q,
KEY_MOD3 | KEY_R,
KEY_MOD3 | KEY_S,
KEY_MOD3 | KEY_T,
KEY_MOD3 | KEY_U,
KEY_MOD3 | KEY_V,
KEY_MOD3 | KEY_W,
KEY_MOD3 | KEY_X,
KEY_MOD3 | KEY_Y,
KEY_MOD3 | KEY_Z,
KEY_MOD2 | KEY_NUMBERSIGN,
KEY_MOD3 | KEY_COLON,
KEY_MOD3 | KEY_SEMICOLON,
KEY_MOD3 | KEY_QUOTELEFT,
KEY_MOD3 | KEY_QUOTERIGHT,
KEY_MOD3 | KEY_BRACKETLEFT,
KEY_MOD3 | KEY_BRACKETRIGHT,
KEY_MOD3 | KEY_RIGHTCURLYBRACKET,
KEY_MOD3 | KEY_POINT,
KEY_MOD3 | KEY_COMMA,
KEY_MOD3 | KEY_TILDE,
KEY_MOD3 | KEY_TAB,
KEY_MOD3 | KEY_F1,
KEY_MOD3 | KEY_F2,
KEY_MOD3 | KEY_F3,
KEY_MOD3 | KEY_F4,
KEY_MOD3 | KEY_F5,
KEY_MOD3 | KEY_F6,
KEY_MOD3 | KEY_F7,
KEY_MOD3 | KEY_F8,
KEY_MOD3 | KEY_F9,
KEY_MOD3 | KEY_F10,
KEY_MOD3 | KEY_F11,
KEY_MOD3 | KEY_F12,
KEY_MOD3 | KEY_F13,
KEY_MOD3 | KEY_F14,
KEY_MOD3 | KEY_F15,
KEY_MOD3 | KEY_F16,
KEY_MOD3 | KEY_DOWN,
KEY_MOD3 | KEY_UP,
KEY_MOD3 | KEY_LEFT,
KEY_MOD3 | KEY_RIGHT,
KEY_MOD3 | KEY_HOME,
KEY_MOD3 | KEY_END,
KEY_MOD3 | KEY_PAGEUP,
KEY_MOD3 | KEY_PAGEDOWN,
KEY_MOD3 | KEY_RETURN,
KEY_MOD3 | KEY_SPACE,
KEY_MOD3 | KEY_BACKSPACE,
KEY_MOD3 | KEY_INSERT,
KEY_MOD3 | KEY_DELETE,
KEY_MOD3 | KEY_ADD,
KEY_MOD3 | KEY_SUBTRACT,
KEY_MOD3 | KEY_MULTIPLY,
KEY_MOD3 | KEY_DIVIDE,
KEY_MOD3 | KEY_EQUAL,
KEY_SHIFT | KEY_MOD3 | KEY_0,
KEY_SHIFT | KEY_MOD3 | KEY_1,
KEY_SHIFT | KEY_MOD3 | KEY_2,
KEY_SHIFT | KEY_MOD3 | KEY_3,
KEY_SHIFT | KEY_MOD3 | KEY_4,
KEY_SHIFT | KEY_MOD3 | KEY_5,
KEY_SHIFT | KEY_MOD3 | KEY_6,
KEY_SHIFT | KEY_MOD3 | KEY_7,
KEY_SHIFT | KEY_MOD3 | KEY_8,
KEY_SHIFT | KEY_MOD3 | KEY_9,
KEY_SHIFT | KEY_MOD3 | KEY_A,
KEY_SHIFT | KEY_MOD3 | KEY_B,
KEY_SHIFT | KEY_MOD3 | KEY_C,
KEY_SHIFT | KEY_MOD3 | KEY_D,
KEY_SHIFT | KEY_MOD3 | KEY_E,
KEY_SHIFT | KEY_MOD3 | KEY_F,
KEY_SHIFT | KEY_MOD3 | KEY_G,
KEY_SHIFT | KEY_MOD3 | KEY_H,
KEY_SHIFT | KEY_MOD3 | KEY_I,
KEY_SHIFT | KEY_MOD3 | KEY_J,
KEY_SHIFT | KEY_MOD3 | KEY_K,
KEY_SHIFT | KEY_MOD3 | KEY_L,
KEY_SHIFT | KEY_MOD3 | KEY_M,
KEY_SHIFT | KEY_MOD3 | KEY_N,
KEY_SHIFT | KEY_MOD3 | KEY_O,
KEY_SHIFT | KEY_MOD3 | KEY_P,
KEY_SHIFT | KEY_MOD3 | KEY_Q,
KEY_SHIFT | KEY_MOD3 | KEY_R,
KEY_SHIFT | KEY_MOD3 | KEY_S,
KEY_SHIFT | KEY_MOD3 | KEY_T,
KEY_SHIFT | KEY_MOD3 | KEY_U,
KEY_SHIFT | KEY_MOD3 | KEY_V,
KEY_SHIFT | KEY_MOD3 | KEY_W,
KEY_SHIFT | KEY_MOD3 | KEY_X,
KEY_SHIFT | KEY_MOD3 | KEY_Y,
KEY_SHIFT | KEY_MOD3 | KEY_Z,
KEY_SHIFT | KEY_MOD3 | KEY_NUMBERSIGN,
KEY_SHIFT | KEY_MOD3 | KEY_COLON,
KEY_SHIFT | KEY_MOD3 | KEY_SEMICOLON,
KEY_SHIFT | KEY_MOD3 | KEY_QUOTELEFT,
KEY_SHIFT | KEY_MOD3 | KEY_QUOTERIGHT,
KEY_SHIFT | KEY_MOD3 | KEY_BRACKETLEFT,
KEY_SHIFT | KEY_MOD3 | KEY_BRACKETRIGHT,
KEY_SHIFT | KEY_MOD3 | KEY_RIGHTCURLYBRACKET,
KEY_SHIFT | KEY_MOD3 | KEY_POINT,
KEY_SHIFT | KEY_MOD3 | KEY_COMMA,
KEY_SHIFT | KEY_MOD3 | KEY_TILDE,
KEY_SHIFT | KEY_MOD3 | KEY_TAB,
KEY_SHIFT | KEY_MOD3 | KEY_F1,
KEY_SHIFT | KEY_MOD3 | KEY_F2,
KEY_SHIFT | KEY_MOD3 | KEY_F3,
KEY_SHIFT | KEY_MOD3 | KEY_F4,
KEY_SHIFT | KEY_MOD3 | KEY_F5,
KEY_SHIFT | KEY_MOD3 | KEY_F6,
KEY_SHIFT | KEY_MOD3 | KEY_F7,
KEY_SHIFT | KEY_MOD3 | KEY_F8,
KEY_SHIFT | KEY_MOD3 | KEY_F9,
KEY_SHIFT | KEY_MOD3 | KEY_F10,
KEY_SHIFT | KEY_MOD3 | KEY_F11,
KEY_SHIFT | KEY_MOD3 | KEY_F12,
KEY_SHIFT | KEY_MOD3 | KEY_F13,
KEY_SHIFT | KEY_MOD3 | KEY_F14,
KEY_SHIFT | KEY_MOD3 | KEY_F15,
KEY_SHIFT | KEY_MOD3 | KEY_F16,
KEY_SHIFT | KEY_MOD3 | KEY_DOWN,
KEY_SHIFT | KEY_MOD3 | KEY_UP,
KEY_SHIFT | KEY_MOD3 | KEY_LEFT,
KEY_SHIFT | KEY_MOD3 | KEY_RIGHT,
KEY_SHIFT | KEY_MOD3 | KEY_HOME,
KEY_SHIFT | KEY_MOD3 | KEY_END,
KEY_SHIFT | KEY_MOD3 | KEY_PAGEUP,
KEY_SHIFT | KEY_MOD3 | KEY_PAGEDOWN,
KEY_SHIFT | KEY_MOD3 | KEY_RETURN,
KEY_SHIFT | KEY_MOD3 | KEY_ESCAPE,
KEY_SHIFT | KEY_MOD3 | KEY_SPACE,
KEY_SHIFT | KEY_MOD3 | KEY_BACKSPACE,
KEY_SHIFT | KEY_MOD3 | KEY_INSERT,
KEY_SHIFT | KEY_MOD3 | KEY_DELETE,
KEY_SHIFT | KEY_MOD3 | KEY_EQUAL
#endif
};
const sal_uInt16 KEYCODE_ARRAY_SIZE = std::size(KEYCODE_ARRAY);
/** select the entry, which match the current key input ... excepting
keys, which are used for the dialog itself.
*/
IMPL_LINK(SfxAcceleratorConfigPage, KeyInputHdl,
const KeyEvent&, rKey,
bool)
{
vcl::KeyCode aCode1 = rKey.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))
// no - handle it as normal dialog input
return false;
for (
int i = 0, nCount = m_xEntriesBox->n_children(); i < nCount; ++i)
{
TAccInfo* pUserData = weld::fromId<TAccInfo*>(m_xEntriesBox->get_id(i));
if (pUserData)
{
sal_uInt16 nCode2 = pUserData->m_aKey.GetCode();
sal_uInt16 nMod2 = pUserData->m_aKey.GetModifier();
if (nCode1 == nCode2 && nMod1 == nMod2)
{
m_xEntriesBox->select(i);
m_xEntriesBox->scroll_to_row(i);
return true;
}
}
}
// no - handle it as normal dialog input
return false;
}
SfxAcceleratorConfigPage::SfxAcceleratorConfigPage(weld::Container* pPage,
weld::DialogController* pController,
const SfxItemSet& aSet)
: SfxTabPage(pPage, pController, u
"cui/ui/accelconfigpage.ui"_ustr, u
"AccelConfigPage"_ustr,
&aSet)
#if HAVE_FEATURE_SCRIPTING
, m_pMacroInfoItem()
#endif
, aLoadAccelConfigStr(CuiResId(RID_CUISTR_LOADACCELCONFIG))
, aSaveAccelConfigStr(CuiResId(RID_CUISTR_SAVEACCELCONFIG))
, aFilterAllStr(SfxResId(STR_SFX_FILTERNAME_ALL))
, aFilterCfgStr(CuiResId(RID_CUISTR_FILTERNAME_CFG))
, m_bStylesInfoInitialized(
false)
, m_aUpdateDataTimer(
"SfxAcceleratorConfigPage UpdateDataTimer")
, m_xEntriesBox(m_xBuilder->weld_tree_view(u
"shortcuts"_ustr))
, m_xOfficeButton(m_xBuilder->weld_radio_button(u
"office"_ustr))
, m_xModuleButton(m_xBuilder->weld_radio_button(u
"module"_ustr))
, m_xChangeButton(m_xBuilder->weld_button(u
"change"_ustr))
, m_xRemoveButton(m_xBuilder->weld_button(u
"delete"_ustr))
, m_xGroupLBox(
new CuiConfigGroupListBox(m_xBuilder->weld_tree_view(u
"category"_ust
r)))
, m_xFunctionBox(new CuiConfigFunctionListBox(m_xBuilder->weld_tree_view(u"function"_ustr)))
, m_xKeyBox(m_xBuilder->weld_tree_view(u"keys"_ustr))
, m_xSearchEdit(m_xBuilder->weld_entry(u"searchEntry"_ustr))
, m_xLoadButton(m_xBuilder->weld_button(u"load"_ustr))
, m_xSaveButton(m_xBuilder->weld_button(u"save"_ustr))
, m_xResetButton(m_xBuilder->weld_button(u"reset"_ustr))
{
Size aSize(m_xEntriesBox->get_approximate_digit_width() * 40,
m_xEntriesBox->get_height_rows(10));
m_xEntriesBox->set_size_request(aSize.Width(), aSize.Height());
aSize = Size(m_xEntriesBox->get_approximate_digit_width() * 19,
m_xEntriesBox->get_height_rows(9));
m_xGroupLBox->set_size_request(aSize.Width(), aSize.Height());
aSize = Size(m_xEntriesBox->get_approximate_digit_width() * 21,
m_xEntriesBox->get_height_rows(9));
m_xFunctionBox->set_size_request(aSize.Width(), aSize.Height());
aSize = Size(m_xEntriesBox->get_approximate_digit_width() * 20,
m_xEntriesBox->get_height_rows(9));
m_xKeyBox->set_size_request(aSize.Width(), aSize.Height());
// install handler functions
m_xChangeButton->connect_clicked(LINK(this, SfxAcceleratorConfigPage, ChangeHdl));
m_xRemoveButton->connect_clicked(LINK(this, SfxAcceleratorConfigPage, RemoveHdl));
m_xEntriesBox->connect_selection_changed(LINK(this, SfxAcceleratorConfigPage, SelectHdl));
m_xEntriesBox->connect_key_press(LINK(this, SfxAcceleratorConfigPage, KeyInputHdl));
m_xGroupLBox->connect_changed(LINK(this, SfxAcceleratorConfigPage, SelectHdl));
m_xFunctionBox->connect_changed(LINK(this, SfxAcceleratorConfigPage, SelectHdl));
m_xKeyBox->connect_selection_changed(LINK(this, SfxAcceleratorConfigPage, SelectHdl));
m_xLoadButton->connect_clicked(LINK(this, SfxAcceleratorConfigPage, Load));
m_xSaveButton->connect_clicked(LINK(this, SfxAcceleratorConfigPage, Save));
m_xResetButton->connect_clicked(LINK(this, SfxAcceleratorConfigPage, Default));
m_xOfficeButton->connect_toggled(LINK(this, SfxAcceleratorConfigPage, RadioHdl));
m_xSearchEdit->connect_changed(LINK(this, SfxAcceleratorConfigPage, SearchUpdateHdl));
m_xSearchEdit->connect_focus_out(LINK(this, SfxAcceleratorConfigPage, FocusOut_Impl));
// detect max keyname width
int nMaxWidth = 0;
for (unsigned short i : KEYCODE_ARRAY)
{
int nTmp = m_xEntriesBox->get_pixel_size(vcl::KeyCode(i).GetName()).Width();
if (nTmp > nMaxWidth)
nMaxWidth = nTmp;
}
// recalc second tab
auto nNewTab = nMaxWidth + 5; // additional space
// initialize Entriesbox
std::vector<int> aWidths{ nNewTab };
m_xEntriesBox->set_column_fixed_widths(aWidths);
//Initialize search util
m_options.AlgorithmType2 = util::SearchAlgorithms2::ABSOLUTE;
m_options.transliterateFlags |= TransliterationFlags::IGNORE_CASE;
m_options.searchFlag
|= (util::SearchFlags::REG_NOT_BEGINOFLINE | util::SearchFlags::REG_NOT_ENDOFLINE);
// initialize GroupBox
m_xGroupLBox->SetFunctionListBox(m_xFunctionBox.get());
// initialize KeyBox
m_xKeyBox->make_sorted();
m_aUpdateDataTimer.SetInvokeHandler(LINK(this, SfxAcceleratorConfigPage, ImplUpdateDataHdl));
m_aUpdateDataTimer.SetTimeout(EDIT_UPDATEDATA_TIMEOUT);
}
SfxAcceleratorConfigPage::~SfxAcceleratorConfigPage()
{
// free memory - remove all dynamic user data
for (int i = 0, nCount = m_xEntriesBox->n_children(); i < nCount; ++i)
{
TAccInfo* pUserData = weld::fromId<TAccInfo*>(m_xEntriesBox->get_id(i));
delete pUserData;
}
}
void SfxAcceleratorConfigPage::InitAccCfg()
{
// already initialized ?
if (m_xContext.is())
return; // yes -> do nothing
try
{
// no - initialize this instance
m_xContext = comphelper::getProcessComponentContext();
m_xUICmdDescription = frame::theUICommandDescription::get(m_xContext);
// get the current active frame, which should be our "parent"
// for this session
m_xFrame = GetFrame();
if (!m_xFrame.is())
{
uno::Reference<frame::XDesktop2> xDesktop = frame::Desktop::create(m_xContext);
m_xFrame = xDesktop->getActiveFrame();
}
// identify module
uno::Reference<frame::XModuleManager2> xModuleManager
= frame::ModuleManager::create(m_xContext);
m_sModuleLongName = xModuleManager->identify(m_xFrame);
comphelper::SequenceAsHashMap lModuleProps(xModuleManager->getByName(m_sModuleLongName));
m_sModuleUIName
= lModuleProps.getUnpackedValueOrDefault(u"ooSetupFactoryUIName"_ustr, OUString());
// get global accelerator configuration
m_xGlobal = css::ui::GlobalAcceleratorConfiguration::create(m_xContext);
// get module accelerator configuration
uno::Reference<ui::XModuleUIConfigurationManagerSupplier> xModuleCfgSupplier(
ui::theModuleUIConfigurationManagerSupplier::get(m_xContext));
uno::Reference<ui::XUIConfigurationManager> xUICfgManager
= xModuleCfgSupplier->getUIConfigurationManager(m_sModuleLongName);
m_xModule = xUICfgManager->getShortCutManager();
}
catch (const uno::RuntimeException&)
{
throw;
}
catch (const uno::Exception&)
{
m_xContext.clear();
}
}
void SfxAcceleratorConfigPage::Init(const uno::Reference<ui::XAcceleratorConfiguration>& xAccMgr)
{
if (!xAccMgr.is())
return;
if (!m_bStylesInfoInitialized)
{
uno::Reference<frame::XController> xController;
uno::Reference<frame::XModel> xModel;
if (m_xFrame.is())
xController = m_xFrame->getController();
if (xController.is())
xModel = xController->getModel();
m_aStylesInfo.init(m_sModuleLongName, xModel);
m_xGroupLBox->SetStylesInfo(&m_aStylesInfo);
m_bStylesInfoInitialized = 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.
for (sal_Int32 i1 = 0; i1 < KEYCODE_ARRAY_SIZE; ++i1)
{
vcl::KeyCode aKey = KEYCODE_ARRAY[i1];
OUString sKey = aKey.GetName();
if (sKey.isEmpty())
continue;
TAccInfo* pEntry = new TAccInfo(i1, 0 /*nListPos*/, aKey);
m_xEntriesBox->append(weld::toId(pEntry), sKey);
int nPos = m_xEntriesBox->n_children() - 1;
m_xEntriesBox->set_text(nPos, OUString(), 1);
m_xEntriesBox->set_sensitive(nPos, true);
}
// Assign all commands to its shortcuts - reading the accelerator config.
uno::Sequence<awt::KeyEvent> lKeys = xAccMgr->getAllKeyEvents();
sal_Int32 c2 = lKeys.getLength();
sal_Int32 i2 = 0;
for (i2 = 0; i2 < c2; ++i2)
{
const awt::KeyEvent& aAWTKey = lKeys[i2];
OUString sCommand = xAccMgr->getCommandByKeyEvent(aAWTKey);
OUString sLabel = GetLabel4Command(sCommand);
vcl::KeyCode aKeyCode = svt::AcceleratorExecute::st_AWTKey2VCLKey(aAWTKey);
sal_Int32 nPos = MapKeyCodeToPos(aKeyCode);
if (nPos == -1)
continue;
m_xEntriesBox->set_text(nPos, sLabel, 1);
TAccInfo* pEntry = weld::fromId<TAccInfo*>(m_xEntriesBox->get_id(nPos));
pEntry->m_bIsConfigurable = true;
pEntry->m_sCommand = sCommand;
}
// Map the VCL hardcoded key codes and mark them as not changeable
size_t c3 = Application::GetReservedKeyCodeCount();
size_t i3 = 0;
for (i3 = 0; i3 < c3; ++i3)
{
const vcl::KeyCode* pKeyCode = Application::GetReservedKeyCode(i3);
sal_Int32 nPos = MapKeyCodeToPos(*pKeyCode);
if (nPos == -1)
continue;
// Hardcoded function mapped so no ID possible and mark entry as not changeable
TAccInfo* pEntry = weld::fromId<TAccInfo*>(m_xEntriesBox->get_id(nPos));
pEntry->m_bIsConfigurable = false;
m_xEntriesBox->set_sensitive(nPos, false);
}
}
void SfxAcceleratorConfigPage::Apply(const uno::Reference<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!
for (int i = 0, nCount = m_xEntriesBox->n_children(); i < nCount; ++i)
{
TAccInfo* pUserData = weld::fromId<TAccInfo*>(m_xEntriesBox->get_id(i));
OUString sCommand;
awt::KeyEvent aAWTKey;
if (pUserData)
{
sCommand = pUserData->m_sCommand;
aAWTKey = svt::AcceleratorExecute::st_VCLKey2AWTKey(pUserData->m_aKey);
}
try
{
if (!sCommand.isEmpty())
xAccMgr->setKeyEvent(aAWTKey, sCommand);
else
xAccMgr->removeKeyEvent(aAWTKey);
}
catch (const uno::RuntimeException&)
{
throw;
}
catch (const uno::Exception&)
{
}
}
}
void SfxAcceleratorConfigPage::ResetConfig() { m_xEntriesBox->clear(); }
IMPL_LINK_NOARG(SfxAcceleratorConfigPage, ImplUpdateDataHdl, Timer*, void)
{
SelectHdl(m_xGroupLBox->get_widget());
}
IMPL_LINK_NOARG(SfxAcceleratorConfigPage, SearchUpdateHdl, weld::Entry&, void)
{
m_aUpdateDataTimer.Start();
}
IMPL_LINK_NOARG(SfxAcceleratorConfigPage, FocusOut_Impl, weld::Widget&, void)
{
if (m_aUpdateDataTimer.IsActive())
{
m_aUpdateDataTimer.Stop();
m_aUpdateDataTimer.Invoke();
}
}
IMPL_LINK_NOARG(SfxAcceleratorConfigPage, Load, weld::Button&, void)
{
// ask for filename, where we should load the new config data from
StartFileDialog(StartFileDialogType::Open, aLoadAccelConfigStr);
}
IMPL_LINK_NOARG(SfxAcceleratorConfigPage, Save, weld::Button&, void)
{
StartFileDialog(StartFileDialogType::SaveAs, aSaveAccelConfigStr);
}
IMPL_LINK_NOARG(SfxAcceleratorConfigPage, Default, weld::Button&, void)
{
uno::Reference<form::XReset> xReset(m_xAct, uno::UNO_QUERY);
if (xReset.is())
xReset->reset();
m_xEntriesBox->freeze();
ResetConfig();
Init(m_xAct);
m_xEntriesBox->thaw();
m_xEntriesBox->select(0);
SelectHdl(*m_xEntriesBox);
}
IMPL_LINK_NOARG(SfxAcceleratorConfigPage, ChangeHdl, weld::Button&, void)
{
int nPos = m_xEntriesBox->get_selected_index();
if (nPos == -1)
return;
TAccInfo* pEntry = weld::fromId<TAccInfo*>(m_xEntriesBox->get_id(nPos));
OUString sNewCommand = m_xFunctionBox->GetCurCommand();
OUString sLabel = m_xFunctionBox->GetCurLabel();
if (sLabel.isEmpty())
sLabel = GetLabel4Command(sNewCommand);
pEntry->m_sCommand = sNewCommand;
m_xEntriesBox->set_text(nPos, sLabel, 1);
SelectHdl(m_xFunctionBox->get_widget());
}
IMPL_LINK_NOARG(SfxAcceleratorConfigPage, RemoveHdl, weld::Button&, void)
{
// get selected entry
int nPos = m_xEntriesBox->get_selected_index();
if (nPos == -1)
return;
TAccInfo* pEntry = weld::fromId<TAccInfo*>(m_xEntriesBox->get_id(nPos));
// remove function name from selected entry
m_xEntriesBox->set_text(nPos, OUString(), 1);
pEntry->m_sCommand.clear();
SelectHdl(m_xFunctionBox->get_widget());
}
IMPL_LINK(SfxAcceleratorConfigPage, SelectHdl, weld::TreeView&, rListBox, void)
{
if (&rListBox == m_xEntriesBox.get())
{
TAccInfo* pEntry = weld::fromId<TAccInfo*>(m_xEntriesBox->get_selected_id());
OUString sPossibleNewCommand = m_xFunctionBox->GetCurCommand();
m_xRemoveButton->set_sensitive(false);
m_xChangeButton->set_sensitive(false);
if (pEntry && pEntry->m_bIsConfigurable)
{
if (pEntry->isConfigured())
m_xRemoveButton->set_sensitive(true);
m_xChangeButton->set_sensitive(pEntry->m_sCommand != sPossibleNewCommand);
}
}
else if (&rListBox == &m_xGroupLBox->get_widget())
{
m_xGroupLBox->GroupSelected();
// Pause redraw (Do not redraw at each removal)
m_xFunctionBox->freeze();
// Apply the search filter to the functions list
OUString aSearchTerm(m_xSearchEdit->get_text());
int nMatchFound = applySearchFilter(aSearchTerm);
// Resume redraw
m_xFunctionBox->thaw();
if (nMatchFound != -1)
{
m_xFunctionBox->select(nMatchFound);
SelectHdl(m_xFunctionBox->get_widget());
}
else
{
m_xKeyBox->clear();
m_xChangeButton->set_sensitive(false);
}
}
else if (&rListBox == &m_xFunctionBox->get_widget())
{
m_xRemoveButton->set_sensitive(false);
m_xChangeButton->set_sensitive(false);
// #i36994 First selected can return null!
TAccInfo* pEntry = weld::fromId<TAccInfo*>(m_xEntriesBox->get_selected_id());
if (pEntry)
{
OUString sPossibleNewCommand = m_xFunctionBox->GetCurCommand();
if (pEntry->m_bIsConfigurable)
{
if (pEntry->isConfigured())
m_xRemoveButton->set_sensitive(true);
m_xChangeButton->set_sensitive(pEntry->m_sCommand != sPossibleNewCommand
&& !sPossibleNewCommand.isEmpty());
}
// update key box
m_xKeyBox->clear();
if (!sPossibleNewCommand.isEmpty())
{
for (int i = 0, nCount = m_xEntriesBox->n_children(); i < nCount; ++i)
{
TAccInfo* pUserData = weld::fromId<TAccInfo*>(m_xEntriesBox->get_id(i));
if (pUserData && pUserData->m_sCommand == sPossibleNewCommand)
{
m_xKeyBox->append(weld::toId(pUserData), pUserData->m_aKey.GetName());
}
}
}
}
}
else
{
// goto selected "key" entry of the key box
int nP2 = -1;
TAccInfo* pU2 = weld::fromId<TAccInfo*>(m_xKeyBox->get_selected_id());
if (pU2)
nP2 = MapKeyCodeToPos(pU2->m_aKey);
if (nP2 != -1)
{
m_xEntriesBox->select(nP2);
m_xEntriesBox->scroll_to_row(nP2);
SelectHdl(*m_xEntriesBox);
}
}
}
--> --------------------
--> maximum size reached
--> --------------------