forked from amazingfate/loongoffice
Attempt to clean up most but certainly not all the spelling mistakes that found home in OpenOffice through decades. We could probably blame the international nature of the code but it is somewhat shameful that this wasn't done before. (cherry picked from commit a6efc99d19d533fcf53106b6667bafba4d364370) Conflicts: accessibility/bridge/org/openoffice/java/accessibility/AccessibleTextImpl.java accessibility/bridge/org/openoffice/java/accessibility/Component.java accessibility/bridge/org/openoffice/java/accessibility/Container.java accessibility/bridge/org/openoffice/java/accessibility/DescendantManager.java accessibility/bridge/org/openoffice/java/accessibility/Dialog.java accessibility/bridge/org/openoffice/java/accessibility/Frame.java accessibility/bridge/org/openoffice/java/accessibility/List.java accessibility/bridge/org/openoffice/java/accessibility/Menu.java accessibility/bridge/org/openoffice/java/accessibility/Table.java accessibility/bridge/org/openoffice/java/accessibility/Tree.java accessibility/bridge/org/openoffice/java/accessibility/Window.java accessibility/bridge/source/java/WindowsAccessBridgeAdapter.cxx accessibility/inc/accessibility/extended/AccessibleBrowseBoxBase.hxx accessibility/inc/accessibility/extended/AccessibleGridControlBase.hxx accessibility/inc/accessibility/standard/vclxaccessiblebox.hxx accessibility/source/extended/accessibleiconchoicectrlentry.cxx accessibility/source/extended/accessiblelistboxentry.cxx accessibility/source/extended/accessibletablistbox.cxx accessibility/source/extended/accessibletablistboxtable.cxx accessibility/workben/org/openoffice/accessibility/awb/canvas/Canvas.java accessibility/workben/org/openoffice/accessibility/misc/OfficeConnection.java apple_remote/AppleRemote.m autodoc/inc/ary/cpp/c_gate.hxx autodoc/inc/ary/cpp/cp_ce.hxx autodoc/inc/ary/cpp/cp_def.hxx autodoc/inc/ary/cpp/cp_type.hxx autodoc/inc/ary/doc/d_parametrized.hxx autodoc/inc/ary/idl/i_type.hxx autodoc/source/ary/inc/cross_refs.hxx autodoc/source/ary/inc/sorted_idset.hxx autodoc/source/display/html/outfile.hxx autodoc/source/display/html/pagemake.cxx autodoc/source/display/idl/hi_env.hxx autodoc/source/parser/inc/tokens/tokproct.hxx autodoc/source/parser_i/inc/s2_luidl/tokproct.hxx autodoc/source/parser_i/inc/tokens/tkp2.hxx automation/inc/automation/commtypes.hxx automation/inc/automation/simplecm.hxx automation/source/server/recorder.cxx automation/source/server/recorder.hxx automation/source/server/statemnt.cxx automation/source/simplecm/packethandler.hxx automation/source/simplecm/simplecm.cxx avmedia/source/framework/soundhandler.cxx basegfx/inc/basegfx/range/rangeexpander.hxx basic/inc/basic/sbxdef.hxx basic/source/classes/sbunoobj.cxx basic/source/classes/sbxmod.cxx basic/source/comp/dim.cxx basic/source/comp/exprgen.cxx basic/source/runtime/step1.cxx basic/source/runtime/step2.cxx basic/source/sbx/sbxint.cxx basic/source/uno/namecont.cxx basic/workben/mgrtest.cxx bean/com/sun/star/beans/LocalOfficeConnection.java bean/com/sun/star/beans/LocalOfficeWindow.java bean/com/sun/star/comp/beans/LocalOfficeConnection.java bean/com/sun/star/comp/beans/LocalOfficeWindow.java bean/com/sun/star/comp/beans/OOoBean.java bridges/inc/bridges/cpp_uno/bridge.hxx bridges/source/cpp_uno/cc50_solaris_intel/cpp2uno.cxx bridges/source/cpp_uno/cc50_solaris_intel/except.cxx bridges/source/cpp_uno/cc50_solaris_intel/uno2cpp.cxx bridges/source/cpp_uno/cc50_solaris_sparc/cpp2uno.cxx bridges/source/cpp_uno/cc50_solaris_sparc/except.cxx bridges/source/cpp_uno/cc50_solaris_sparc/uno2cpp.cxx bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx bridges/source/cpp_uno/gcc3_macosx_x86-64/uno2cpp.cxx bridges/source/cpp_uno/gcc3_netbsd_intel/cpp2uno.cxx bridges/source/cpp_uno/gcc3_netbsd_intel/except.cxx bridges/source/cpp_uno/gcc3_netbsd_intel/uno2cpp.cxx bridges/source/cpp_uno/gcc3_os2_intel/cpp2uno.cxx bridges/source/cpp_uno/gcc3_os2_intel/except.cxx bridges/source/cpp_uno/gcc3_os2_intel/uno2cpp.cxx bridges/source/cpp_uno/mingw_x86-64/uno2cpp.cxx bridges/source/cpp_uno/msvc_win32_intel/except.cxx bridges/source/cpp_uno/s5abi_macosx_x86-64/except.cxx bridges/source/cpp_uno/shared/component.cxx bridges/source/jni_uno/jni_base.h bridges/source/jni_uno/jni_bridge.cxx bridges/source/jni_uno/jni_java2uno.cxx bridges/source/jni_uno/jni_uno2java.cxx canvas/inc/canvas/base/doublebitmapbase.hxx canvas/inc/canvas/base/floatbitmapbase.hxx canvas/inc/canvas/base/integerbitmapbase.hxx canvas/source/cairo/cairo_canvasbitmap.cxx canvas/source/cairo/cairo_textlayout.cxx chart2/source/controller/dialogs/ObjectNameProvider.cxx chart2/source/view/diagram/VDiagram.cxx chart2/source/view/main/ChartView.cxx cli_ure/source/native/makefile.mk cli_ure/source/uno_bridge/cli_data.cxx codemaker/source/javamaker/javatype.cxx comphelper/inc/comphelper/componentcontext.hxx comphelper/inc/comphelper/interaction.hxx comphelper/inc/comphelper/locale.hxx comphelper/inc/comphelper/string.hxx comphelper/source/container/embeddedobjectcontainer.cxx comphelper/source/misc/accessiblecontexthelper.cxx comphelper/source/misc/asyncnotification.cxx comphelper/source/misc/locale.cxx comphelper/source/misc/mediadescriptor.cxx comphelper/source/misc/numberedcollection.cxx comphelper/source/misc/proxyaggregation.cxx comphelper/source/misc/scopeguard.cxx comphelper/source/misc/sequenceashashmap.cxx configure.in connectivity/source/commontools/parameters.cxx connectivity/source/drivers/dbase/DTable.cxx connectivity/source/drivers/evoab2/NStatement.cxx connectivity/source/drivers/file/FPreparedStatement.cxx connectivity/source/drivers/jdbc/DatabaseMetaData.cxx connectivity/source/inc/flat/ETable.hxx connectivity/source/parse/sqlnode.cxx cosv/inc/cosv/persist.hxx cosv/inc/cosv/ploc_dir.hxx cosv/inc/cosv/tpl/dyn.hxx cppu/source/LogBridge/LogBridge.cxx cppu/source/uno/data.cxx cppuhelper/source/bootstrap.cxx cppuhelper/source/component_context.cxx cppuhelper/source/propshlp.cxx cppuhelper/source/servicefactory.cxx cpputools/source/registercomponent/registercomponent.cxx cui/source/customize/acccfg.cxx cui/source/dialogs/about.cxx cui/source/dialogs/commonlingui.hxx cui/source/dialogs/showcols.cxx cui/source/inc/cuihyperdlg.hxx cui/source/inc/cuitabline.hxx cui/source/options/optsave.src cui/source/tabpages/tpline.cxx cui/source/tabpages/transfrm.cxx dbaccess/source/core/api/CacheSet.cxx dbaccess/source/core/api/KeySet.cxx dbaccess/source/core/api/RowSet.cxx dbaccess/source/core/api/RowSet.hxx dbaccess/source/core/api/RowSetBase.cxx dbaccess/source/core/api/RowSetBase.hxx dbaccess/source/core/api/RowSetCache.cxx dbaccess/source/core/api/querycomposer.cxx dbaccess/source/ext/adabas/Acomponentmodule.hxx dbaccess/source/ui/app/AppControllerDnD.cxx dbaccess/source/ui/app/AppDetailView.cxx dbaccess/source/ui/browser/brwctrlr.cxx dbaccess/source/ui/browser/sbagrid.cxx dbaccess/source/ui/browser/unodatbr.cxx dbaccess/source/ui/dlg/AdabasStat.hxx dbaccess/source/ui/dlg/UserAdmin.cxx dbaccess/source/ui/dlg/directsql.cxx dbaccess/source/ui/dlg/generalpage.hxx dbaccess/source/ui/dlg/tablespage.cxx dbaccess/source/ui/inc/JoinTableView.hxx dbaccess/source/ui/inc/TableController.hxx dbaccess/source/ui/inc/UITools.hxx dbaccess/source/ui/inc/brwctrlr.hxx dbaccess/source/ui/inc/datasourcemap.hxx dbaccess/source/ui/querydesign/JoinTableView.cxx dbaccess/source/ui/querydesign/QueryDesignView.cxx dbaccess/source/ui/querydesign/SelectionBrowseBox.cxx dbaccess/source/ui/querydesign/TableWindow.cxx dbaccess/source/ui/querydesign/querycontroller.cxx dbaccess/source/ui/relationdesign/RelationTableView.cxx dbaccess/source/ui/tabledesign/TableController.cxx desktop/source/app/app.cxx desktop/source/app/appinit.cxx desktop/source/app/langselect.cxx desktop/source/app/officeipcthread.cxx desktop/source/deployment/manager/dp_extensionmanager.cxx desktop/source/deployment/misc/dp_misc.cxx desktop/source/deployment/misc/dp_resource.cxx desktop/source/deployment/registry/dp_backend.cxx desktop/source/deployment/registry/package/dp_package.cxx desktop/source/migration/cfgfilter.cxx desktop/source/migration/migration.cxx desktop/source/splash/splash.cxx desktop/win32/source/QuickStart/QuickStart.cpp desktop/win32/source/setup/setup.cpp drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx dtrans/source/win32/clipb/MtaOleClipb.hxx dtrans/source/win32/clipb/WinClipbImpl.cxx editeng/source/editeng/editview.cxx editeng/source/editeng/impedit2.cxx editeng/source/editeng/impedit3.cxx editeng/source/editeng/impedit4.cxx editeng/source/editeng/textconv.hxx editeng/source/misc/unolingu.cxx embeddedobj/source/commonembedding/persistence.cxx embeddedobj/source/general/dummyobject.cxx embeddedobj/source/msole/olecomponent.cxx embeddedobj/source/msole/olepersist.cxx embeddedobj/test/Container1/NativeView.java extensions/source/bibliography/framectr.cxx extensions/source/macosx/spotlight/OOoContentDataParser.m extensions/source/macosx/spotlight/unzip.h extensions/source/macosx/spotlight/unzip.m extensions/source/oooimprovement/myconfigurationhelper.hxx extensions/source/propctrlr/eventhandler.cxx extensions/source/propctrlr/formcomponenthandler.cxx extensions/source/propctrlr/pcrcomponentcontext.hxx extensions/source/scanner/twain.cxx extensions/source/update/check/updatecheckconfig.hxx external/mingwheaders/mingw_atl_headers.patch extras/source/misc_config/wizard/web/layouts/source.xml.xsl fileaccess/source/FileAccess.cxx filter/inc/filter/msfilter/msocximex.hxx filter/inc/filter/msfilter/svxmsbas.hxx filter/qa/complex/filter/detection/typeDetection/Helper.java filter/source/config/cache/basecontainer.cxx filter/source/config/cache/cacheitem.hxx filter/source/config/cache/contenthandlerfactory.cxx filter/source/config/cache/filtercache.cxx filter/source/config/cache/filtercache.hxx filter/source/config/cache/filterfactory.cxx filter/source/config/cache/frameloaderfactory.cxx filter/source/config/cache/querytokenizer.hxx filter/source/config/cache/typedetection.cxx filter/source/config/cache/typedetection.hxx filter/source/config/cache/versions.hxx filter/source/config/fragments/makefile.mk filter/source/config/tools/merge/pyAltFCFGMerge filter/source/flash/swfwriter.cxx filter/source/flash/swfwriter1.cxx filter/source/msfilter/msdffimp.cxx filter/source/msfilter/msocximex.cxx filter/source/msfilter/msvbahelper.cxx filter/source/msfilter/svxmsbas.cxx filter/source/xmlfilterdetect/filterdetect.cxx filter/source/xslt/import/uof2/uof2odf.xsl filter/source/xslt/odf2xhtml/export/xhtml/body.xsl filter/source/xsltfilter/com/sun/star/comp/xsltfilter/Base64.java forms/source/xforms/convert.hxx forms/source/xforms/model.cxx fpicker/source/aqua/SalAquaFilePicker.mm fpicker/source/office/fpinteraction.cxx fpicker/source/unx/gnome/SalGtkFolderPicker.cxx fpicker/source/unx/kde4/KDE4FilePicker.cxx fpicker/source/win32/filepicker/PreviewCtrl.cxx fpicker/source/win32/filepicker/PreviewCtrl.hxx fpicker/source/win32/filepicker/VistaFilePicker.cxx fpicker/source/win32/filepicker/VistaFilePickerImpl.hxx fpicker/source/win32/filepicker/helppopupwindow.hxx fpicker/source/win32/folderpicker/MtaFop.hxx framework/inc/classes/droptargetlistener.hxx framework/inc/classes/filtercache.hxx framework/inc/classes/filtercachedata.hxx framework/inc/classes/protocolhandlercache.hxx framework/inc/classes/servicemanager.hxx framework/inc/commands.h framework/inc/dispatch/basedispatcher.hxx framework/inc/dispatch/blankdispatcher.hxx framework/inc/dispatch/closedispatcher.hxx framework/inc/dispatch/createdispatcher.hxx framework/inc/dispatch/dispatchprovider.hxx framework/inc/dispatch/helpagentdispatcher.hxx framework/inc/dispatch/mailtodispatcher.hxx framework/inc/dispatch/menudispatcher.hxx framework/inc/dispatch/oxt_handler.hxx framework/inc/dispatch/popupmenudispatcher.hxx framework/inc/dispatch/selfdispatcher.hxx framework/inc/dispatch/servicehandler.hxx framework/inc/dispatch/startmoduledispatcher.hxx framework/inc/dispatch/systemexec.hxx framework/inc/helper/fixeddocumentproperties.hxx framework/inc/helper/ocomponentaccess.hxx framework/inc/helper/oframes.hxx framework/inc/helper/otasksenumeration.hxx framework/inc/helper/persistentwindowstate.hxx framework/inc/helper/statusindicator.hxx framework/inc/helper/statusindicatorfactory.hxx framework/inc/helper/tagwindowasmodified.hxx framework/inc/helper/titlebarupdate.hxx framework/inc/helper/vclstatusindicator.hxx framework/inc/interaction/quietinteraction.hxx framework/inc/jobs/helponstartup.hxx framework/inc/jobs/job.hxx framework/inc/jobs/jobdata.hxx framework/inc/jobs/jobexecutor.hxx framework/inc/loadstate.h framework/inc/macros/debug/assertion.hxx framework/inc/macros/debug/event.hxx framework/inc/macros/debug/filterdbg.hxx framework/inc/macros/debug/memorymeasure.hxx framework/inc/macros/debug/timemeasure.hxx framework/inc/macros/xserviceinfo.hxx framework/inc/queries.h framework/inc/recording/dispatchrecordersupplier.hxx framework/inc/services/autorecovery.hxx framework/inc/services/backingcomp.hxx framework/inc/services/contenthandlerfactory.hxx framework/inc/services/desktop.hxx framework/inc/services/detectorfactory.hxx framework/inc/services/frame.hxx framework/inc/services/frameloaderfactory.hxx framework/inc/services/layoutmanager.hxx framework/inc/services/license.hxx framework/inc/services/logindialog.hxx framework/inc/services/modulemanager.hxx framework/inc/services/pathsettings.hxx framework/inc/services/pluginframe.hxx framework/inc/services/substitutepathvars.hxx framework/inc/services/task.hxx framework/inc/services/taskcreatorsrv.hxx framework/inc/stdtypes.h framework/inc/threadhelp/fairrwlock.hxx framework/inc/threadhelp/inoncopyable.h framework/inc/threadhelp/itransactionmanager.h framework/inc/threadhelp/lockhelper.hxx framework/inc/threadhelp/readguard.hxx framework/inc/threadhelp/resetableguard.hxx framework/inc/threadhelp/transactionguard.hxx framework/inc/threadhelp/writeguard.hxx framework/inc/uifactory/uielementfactorymanager.hxx framework/inc/xml/acceleratorconfigurationreader.hxx framework/qa/complex/dispatches/checkdispatchapi.java framework/qa/complex/framework/autosave/AutoSave.java framework/qa/complex/framework/autosave/Protocol.java framework/qa/complex/framework/recovery/RecoveryTest.java framework/qa/complex/loadAllDocuments/StreamSimulator.java framework/source/accelerators/acceleratorconfiguration.cxx framework/source/accelerators/acceleratorexecute.cxx framework/source/accelerators/acceleratorexecute.hxx framework/source/accelerators/keymapping.cxx framework/source/accelerators/presethandler.cxx framework/source/application/framework.cxx framework/source/application/login.cxx framework/source/classes/framecontainer.cxx framework/source/classes/menumanager.cxx framework/source/classes/taskcreator.cxx framework/source/dispatch/closedispatcher.cxx framework/source/dispatch/dispatchprovider.cxx framework/source/dispatch/helpagentdispatcher.cxx framework/source/dispatch/interceptionhelper.cxx framework/source/dispatch/mailtodispatcher.cxx framework/source/dispatch/menudispatcher.cxx framework/source/dispatch/oxt_handler.cxx framework/source/dispatch/servicehandler.cxx framework/source/fwe/classes/framelistanalyzer.cxx framework/source/fwe/dispatch/interaction.cxx framework/source/fwe/helper/titlehelper.cxx framework/source/fwe/helper/undomanagerhelper.cxx framework/source/fwe/xml/eventsdocumenthandler.cxx framework/source/fwe/xml/statusbardocumenthandler.cxx framework/source/fwe/xml/toolboxdocumenthandler.cxx framework/source/fwi/classes/protocolhandlercache.cxx framework/source/fwi/threadhelp/lockhelper.cxx framework/source/fwi/threadhelp/transactionmanager.cxx framework/source/helper/persistentwindowstate.cxx framework/source/helper/statusindicatorfactory.cxx framework/source/helper/vclstatusindicator.cxx framework/source/inc/accelerators/acceleratorcache.hxx framework/source/inc/accelerators/acceleratorconfiguration.hxx framework/source/inc/accelerators/presethandler.hxx framework/source/inc/accelerators/storageholder.hxx framework/source/inc/loadenv/actionlockguard.hxx framework/source/inc/loadenv/loadenv.hxx framework/source/inc/loadenv/loadenvexception.hxx framework/source/inc/pattern/frame.hxx framework/source/inc/pattern/storages.hxx framework/source/inc/pattern/window.hxx framework/source/jobs/helponstartup.cxx framework/source/jobs/job.cxx framework/source/jobs/jobdata.cxx framework/source/jobs/jobdispatch.cxx framework/source/jobs/jobresult.cxx framework/source/jobs/joburl.cxx framework/source/jobs/shelljob.cxx framework/source/loadenv/loadenv.cxx framework/source/services/autorecovery.cxx framework/source/services/backingwindow.cxx framework/source/services/desktop.cxx framework/source/services/frame.cxx framework/source/services/modulemanager.cxx framework/source/services/pathsettings.cxx framework/source/services/substitutepathvars.cxx framework/source/uiconfiguration/moduleuicfgsupplier.cxx framework/source/uiconfiguration/moduleuiconfigurationmanager.cxx framework/source/uiconfiguration/uicategorydescription.cxx framework/source/uiconfiguration/uiconfigurationmanagerimpl.cxx framework/source/uiconfiguration/windowstateconfiguration.cxx framework/source/uielement/uicommanddescription.cxx framework/source/unotypes/fwk.xml framework/source/xml/imagesdocumenthandler.cxx framework/test/test.cxx framework/test/test_componentenumeration.bas framework/test/test_statusindicatorfactory.bas framework/test/threadtest.cxx framework/test/threadtest/threadtest.cxx framework/test/typecfg/cfgview.cxx framework/test/typecfg/xml2xcd.cxx include/basegfx/polygon/b2dpolygon.hxx include/canvas/base/graphicdevicebase.hxx include/canvas/canvastools.hxx include/comphelper/configurationhelper.hxx include/comphelper/embeddedobjectcontainer.hxx include/comphelper/propagg.hxx include/comphelper/sequenceashashmap.hxx include/connectivity/sqlerror.hxx include/connectivity/sqlnode.hxx include/cppuhelper/propshlp.hxx include/editeng/AccessibleContextBase.hxx include/framework/framelistanalyzer.hxx sfx2/source/dialog/backingcomp.cxx vcl/unx/gtk/fpicker/SalGtkFilePicker.cxx Change-Id: I2618bf83c0e30f68f23ff25f6eb466df04d34c6d
1456 lines
54 KiB
C++
1456 lines
54 KiB
C++
/* -*- 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 <accelerators/acceleratorconfiguration.hxx>
|
|
|
|
#include <accelerators/presethandler.hxx>
|
|
|
|
#include <xml/saxnamespacefilter.hxx>
|
|
#include <xml/acceleratorconfigurationreader.hxx>
|
|
#include <xml/acceleratorconfigurationwriter.hxx>
|
|
|
|
#include <acceleratorconst.h>
|
|
#include <services.h>
|
|
|
|
#include <com/sun/star/xml/sax/Parser.hpp>
|
|
#include <com/sun/star/xml/sax/InputSource.hpp>
|
|
#include <com/sun/star/xml/sax/Writer.hpp>
|
|
#include <com/sun/star/io/XActiveDataSource.hpp>
|
|
#include <com/sun/star/embed/ElementModes.hpp>
|
|
#include <com/sun/star/io/XSeekable.hpp>
|
|
#include <com/sun/star/io/XTruncate.hpp>
|
|
#include <com/sun/star/beans/XPropertySet.hpp>
|
|
|
|
#include <vcl/svapp.hxx>
|
|
#include <com/sun/star/container/XNamed.hpp>
|
|
#include <com/sun/star/container/XNameContainer.hpp>
|
|
#include <com/sun/star/awt/KeyEvent.hpp>
|
|
#include <com/sun/star/awt/KeyModifier.hpp>
|
|
#include <com/sun/star/lang/XSingleServiceFactory.hpp>
|
|
#include <comphelper/configurationhelper.hxx>
|
|
#include <officecfg/Setup.hxx>
|
|
#include <unotools/configpaths.hxx>
|
|
#include <svtools/acceleratorexecute.hxx>
|
|
|
|
namespace framework
|
|
{
|
|
const char CFG_ENTRY_SECONDARY[] = "SecondaryKeys";
|
|
const char CFG_PROP_COMMAND[] = "Command";
|
|
|
|
OUString lcl_getKeyString(salhelper::SingletonRef<framework::KeyMapping>& _rKeyMapping, const css::awt::KeyEvent& aKeyEvent)
|
|
{
|
|
const sal_Int32 nBeginIndex = 4; // "KEY_" is the prefix of a identifier...
|
|
OUStringBuffer sKeyBuffer((_rKeyMapping->mapCodeToIdentifier(aKeyEvent.KeyCode)).copy(nBeginIndex));
|
|
|
|
if ( (aKeyEvent.Modifiers & css::awt::KeyModifier::SHIFT) == css::awt::KeyModifier::SHIFT )
|
|
sKeyBuffer.appendAscii("_SHIFT");
|
|
if ( (aKeyEvent.Modifiers & css::awt::KeyModifier::MOD1 ) == css::awt::KeyModifier::MOD1 )
|
|
sKeyBuffer.appendAscii("_MOD1");
|
|
if ( (aKeyEvent.Modifiers & css::awt::KeyModifier::MOD2 ) == css::awt::KeyModifier::MOD2 )
|
|
sKeyBuffer.appendAscii("_MOD2");
|
|
if ( (aKeyEvent.Modifiers & css::awt::KeyModifier::MOD3 ) == css::awt::KeyModifier::MOD3 )
|
|
sKeyBuffer.appendAscii("_MOD3");
|
|
|
|
return sKeyBuffer.makeStringAndClear();
|
|
}
|
|
|
|
XMLBasedAcceleratorConfiguration::XMLBasedAcceleratorConfiguration(const css::uno::Reference< css::uno::XComponentContext >& xContext)
|
|
: m_xContext (xContext )
|
|
, m_aPresetHandler(xContext )
|
|
, m_pWriteCache (0 )
|
|
{
|
|
}
|
|
|
|
XMLBasedAcceleratorConfiguration::~XMLBasedAcceleratorConfiguration()
|
|
{
|
|
SAL_WARN_IF(m_pWriteCache, "fwk", "XMLBasedAcceleratorConfiguration::~XMLBasedAcceleratorConfiguration(): Changes not flushed. Ignore it ...");
|
|
}
|
|
|
|
css::uno::Sequence< css::awt::KeyEvent > SAL_CALL XMLBasedAcceleratorConfiguration::getAllKeyEvents()
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
SolarMutexGuard g;
|
|
AcceleratorCache& rCache = impl_getCFG();
|
|
AcceleratorCache::TKeyList lKeys = rCache.getAllKeys();
|
|
return lKeys.getAsConstList();
|
|
}
|
|
|
|
OUString SAL_CALL XMLBasedAcceleratorConfiguration::getCommandByKeyEvent(const css::awt::KeyEvent& aKeyEvent)
|
|
throw(css::container::NoSuchElementException,
|
|
css::uno::RuntimeException, std::exception )
|
|
{
|
|
SolarMutexGuard g;
|
|
AcceleratorCache& rCache = impl_getCFG();
|
|
if (!rCache.hasKey(aKeyEvent))
|
|
throw css::container::NoSuchElementException(
|
|
OUString(),
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
return rCache.getCommandByKey(aKeyEvent);
|
|
}
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::setKeyEvent(const css::awt::KeyEvent& aKeyEvent,
|
|
const OUString& sCommand )
|
|
throw(css::lang::IllegalArgumentException,
|
|
css::uno::RuntimeException, std::exception )
|
|
{
|
|
if (
|
|
(aKeyEvent.KeyCode == 0) &&
|
|
(aKeyEvent.KeyChar == 0) &&
|
|
(aKeyEvent.KeyFunc == 0) &&
|
|
(aKeyEvent.Modifiers == 0)
|
|
)
|
|
throw css::lang::IllegalArgumentException(
|
|
OUString("Such key event seems not to be supported by any operating system."),
|
|
static_cast< ::cppu::OWeakObject* >(this),
|
|
0);
|
|
|
|
if (sCommand.isEmpty())
|
|
throw css::lang::IllegalArgumentException(
|
|
OUString("Empty command strings are not allowed here."),
|
|
static_cast< ::cppu::OWeakObject* >(this),
|
|
1);
|
|
|
|
SolarMutexGuard g;
|
|
AcceleratorCache& rCache = impl_getCFG(true); // sal_True => force getting of a writeable cache!
|
|
rCache.setKeyCommandPair(aKeyEvent, sCommand);
|
|
}
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::removeKeyEvent(const css::awt::KeyEvent& aKeyEvent)
|
|
throw(css::container::NoSuchElementException,
|
|
css::uno::RuntimeException, std::exception )
|
|
{
|
|
SolarMutexGuard g;
|
|
AcceleratorCache& rCache = impl_getCFG(true); // true => force using of a writeable cache
|
|
if (!rCache.hasKey(aKeyEvent))
|
|
throw css::container::NoSuchElementException(
|
|
OUString(),
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
rCache.removeKey(aKeyEvent);
|
|
}
|
|
|
|
css::uno::Sequence< css::awt::KeyEvent > SAL_CALL XMLBasedAcceleratorConfiguration::getKeyEventsByCommand(const OUString& sCommand)
|
|
throw(css::lang::IllegalArgumentException ,
|
|
css::container::NoSuchElementException,
|
|
css::uno::RuntimeException, std::exception )
|
|
{
|
|
if (sCommand.isEmpty())
|
|
throw css::lang::IllegalArgumentException(
|
|
OUString("Empty command strings are not allowed here."),
|
|
static_cast< ::cppu::OWeakObject* >(this),
|
|
1);
|
|
|
|
SolarMutexGuard g;
|
|
AcceleratorCache& rCache = impl_getCFG();
|
|
if (!rCache.hasCommand(sCommand))
|
|
throw css::container::NoSuchElementException(
|
|
OUString(),
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
|
|
AcceleratorCache::TKeyList lKeys = rCache.getKeysByCommand(sCommand);
|
|
return lKeys.getAsConstList();
|
|
}
|
|
|
|
css::uno::Sequence< css::uno::Any > SAL_CALL XMLBasedAcceleratorConfiguration::getPreferredKeyEventsForCommandList(const css::uno::Sequence< OUString >& lCommandList)
|
|
throw(css::lang::IllegalArgumentException ,
|
|
css::uno::RuntimeException, std::exception )
|
|
{
|
|
SolarMutexGuard g;
|
|
|
|
sal_Int32 i = 0;
|
|
sal_Int32 c = lCommandList.getLength();
|
|
css::uno::Sequence< css::uno::Any > lPreferredOnes (c); // dont pack list!
|
|
AcceleratorCache& rCache = impl_getCFG();
|
|
|
|
for (i=0; i<c; ++i)
|
|
{
|
|
const OUString& rCommand = lCommandList[i];
|
|
if (rCommand.isEmpty())
|
|
throw css::lang::IllegalArgumentException(
|
|
OUString("Empty command strings are not allowed here."),
|
|
static_cast< ::cppu::OWeakObject* >(this),
|
|
(sal_Int16)i);
|
|
|
|
if (!rCache.hasCommand(rCommand))
|
|
continue;
|
|
|
|
AcceleratorCache::TKeyList lKeys = rCache.getKeysByCommand(rCommand);
|
|
if ( lKeys.empty() )
|
|
continue;
|
|
|
|
css::uno::Any& rAny = lPreferredOnes[i];
|
|
rAny <<= *(lKeys.begin());
|
|
}
|
|
|
|
return lPreferredOnes;
|
|
}
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::removeCommandFromAllKeyEvents(const OUString& sCommand)
|
|
throw(css::lang::IllegalArgumentException ,
|
|
css::container::NoSuchElementException,
|
|
css::uno::RuntimeException, std::exception )
|
|
{
|
|
if (sCommand.isEmpty())
|
|
throw css::lang::IllegalArgumentException(
|
|
OUString("Empty command strings are not allowed here."),
|
|
static_cast< ::cppu::OWeakObject* >(this),
|
|
0);
|
|
|
|
SolarMutexGuard g;
|
|
AcceleratorCache& rCache = impl_getCFG(true); // sal_True => force getting of a writeable cache!
|
|
if (!rCache.hasCommand(sCommand))
|
|
throw css::container::NoSuchElementException(
|
|
OUString("Command does not exists inside this container."),
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
rCache.removeCommand(sCommand);
|
|
}
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::reload()
|
|
throw(css::uno::Exception ,
|
|
css::uno::RuntimeException, std::exception)
|
|
{
|
|
css::uno::Reference< css::io::XStream > xStream;
|
|
css::uno::Reference< css::io::XStream > xStreamNoLang;
|
|
{
|
|
SolarMutexGuard g;
|
|
xStream = m_aPresetHandler.openTarget(PresetHandler::TARGET_CURRENT(), true); // sal_True => open or create!
|
|
try
|
|
{
|
|
xStreamNoLang = m_aPresetHandler.openPreset(PresetHandler::PRESET_DEFAULT(), true);
|
|
}
|
|
catch(const css::io::IOException&) {} // does not have to exist
|
|
}
|
|
|
|
css::uno::Reference< css::io::XInputStream > xIn;
|
|
if (xStream.is())
|
|
xIn = xStream->getInputStream();
|
|
if (!xIn.is())
|
|
throw css::io::IOException(
|
|
OUString("Could not open accelerator configuration for reading."),
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
|
|
// impl_ts_load() does not clear the cache
|
|
{
|
|
SolarMutexGuard g;
|
|
m_aReadCache = AcceleratorCache();
|
|
}
|
|
|
|
impl_ts_load(xIn);
|
|
|
|
// Load also the general language independent default accelerators
|
|
// (ignoring the already defined accelerators)
|
|
if (xStreamNoLang.is())
|
|
{
|
|
xIn = xStreamNoLang->getInputStream();
|
|
if (xIn.is())
|
|
impl_ts_load(xIn);
|
|
}
|
|
}
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::store()
|
|
throw(css::uno::Exception ,
|
|
css::uno::RuntimeException, std::exception)
|
|
{
|
|
css::uno::Reference< css::io::XStream > xStream;
|
|
{
|
|
SolarMutexGuard g;
|
|
xStream = m_aPresetHandler.openTarget(PresetHandler::TARGET_CURRENT(), true); // sal_True => open or create!
|
|
}
|
|
|
|
css::uno::Reference< css::io::XOutputStream > xOut;
|
|
if (xStream.is())
|
|
xOut = xStream->getOutputStream();
|
|
|
|
if (!xOut.is())
|
|
throw css::io::IOException(
|
|
OUString("Could not open accelerator configuration for saving."),
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
|
|
impl_ts_save(xOut);
|
|
|
|
xOut.clear();
|
|
xStream.clear();
|
|
|
|
m_aPresetHandler.commitUserChanges();
|
|
}
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::storeToStorage(const css::uno::Reference< css::embed::XStorage >& xStorage)
|
|
throw(css::uno::Exception ,
|
|
css::uno::RuntimeException, std::exception)
|
|
{
|
|
css::uno::Reference< css::io::XStream > xStream = StorageHolder::openSubStreamWithFallback(
|
|
xStorage,
|
|
PresetHandler::TARGET_CURRENT(),
|
|
css::embed::ElementModes::READWRITE,
|
|
false); // False => no fallback from read/write to readonly!
|
|
css::uno::Reference< css::io::XOutputStream > xOut;
|
|
if (xStream.is())
|
|
xOut = xStream->getOutputStream();
|
|
|
|
if (!xOut.is())
|
|
throw css::io::IOException(
|
|
OUString("Could not open accelerator configuration for saving."),
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
|
|
impl_ts_save(xOut);
|
|
|
|
// TODO inform listener about success, so it can flush the root and sub storage of this stream!
|
|
}
|
|
|
|
sal_Bool SAL_CALL XMLBasedAcceleratorConfiguration::isModified()
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
SolarMutexGuard g;
|
|
return (m_pWriteCache != 0);
|
|
}
|
|
|
|
sal_Bool SAL_CALL XMLBasedAcceleratorConfiguration::isReadOnly()
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
css::uno::Reference< css::io::XStream > xStream;
|
|
{
|
|
SolarMutexGuard g;
|
|
xStream = m_aPresetHandler.openTarget(PresetHandler::TARGET_CURRENT(), true); // sal_True => open or create!
|
|
}
|
|
|
|
css::uno::Reference< css::io::XOutputStream > xOut;
|
|
if (xStream.is())
|
|
xOut = xStream->getOutputStream();
|
|
return !(xOut.is());
|
|
}
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::setStorage(const css::uno::Reference< css::embed::XStorage >& /*xStorage*/)
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
SAL_INFO("fwk", "XMLBasedAcceleratorConfiguration::setStorage(): implement this HACK .-)");
|
|
}
|
|
|
|
sal_Bool SAL_CALL XMLBasedAcceleratorConfiguration::hasStorage()
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
SAL_INFO("fwk", "XMLBasedAcceleratorConfiguration::hasStorage(): implement this HACK .-)");
|
|
return sal_False;
|
|
}
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::addConfigurationListener(const css::uno::Reference< css::ui::XUIConfigurationListener >& /*xListener*/)
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
SAL_INFO("fwk", "XMLBasedAcceleratorConfiguration::addConfigurationListener(): implement me");
|
|
}
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::removeConfigurationListener(const css::uno::Reference< css::ui::XUIConfigurationListener >& /*xListener*/)
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
SAL_INFO("fwk", "XMLBasedAcceleratorConfiguration::removeConfigurationListener(): implement me");
|
|
}
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::reset()
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
{
|
|
SolarMutexGuard g;
|
|
m_aPresetHandler.copyPresetToTarget(PresetHandler::PRESET_DEFAULT(), PresetHandler::TARGET_CURRENT());
|
|
}
|
|
|
|
reload();
|
|
}
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::addResetListener(const css::uno::Reference< css::form::XResetListener >& /*xListener*/)
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
SAL_INFO("fwk", "XMLBasedAcceleratorConfiguration::addResetListener(): implement me");
|
|
}
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::removeResetListener(const css::uno::Reference< css::form::XResetListener >& /*xListener*/)
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
SAL_INFO("fwk", "XMLBasedAcceleratorConfiguration::removeResetListener(): implement me");
|
|
}
|
|
|
|
// IStorageListener
|
|
void XMLBasedAcceleratorConfiguration::changesOccurred(const OUString& /*sPath*/)
|
|
{
|
|
reload();
|
|
}
|
|
|
|
void XMLBasedAcceleratorConfiguration::impl_ts_load(const css::uno::Reference< css::io::XInputStream >& xStream)
|
|
{
|
|
css::uno::Reference< css::uno::XComponentContext > xContext;
|
|
{
|
|
SolarMutexGuard g;
|
|
xContext = m_xContext;
|
|
if (m_pWriteCache)
|
|
{
|
|
// be aware of reentrance problems - use temp variable for calling delete ... :-)
|
|
AcceleratorCache* pTemp = m_pWriteCache;
|
|
m_pWriteCache = 0;
|
|
delete pTemp;
|
|
}
|
|
}
|
|
|
|
css::uno::Reference< css::io::XSeekable > xSeek(xStream, css::uno::UNO_QUERY);
|
|
if (xSeek.is())
|
|
xSeek->seek(0);
|
|
|
|
SolarMutexGuard g;
|
|
|
|
// create the parser queue
|
|
// Note: Use special filter object between parser and reader
|
|
// to get filtered xml with right namespaces ...
|
|
// Use further a temp cache for reading!
|
|
AcceleratorConfigurationReader* pReader = new AcceleratorConfigurationReader(m_aReadCache);
|
|
css::uno::Reference< css::xml::sax::XDocumentHandler > xReader (static_cast< ::cppu::OWeakObject* >(pReader), css::uno::UNO_QUERY_THROW);
|
|
SaxNamespaceFilter* pFilter = new SaxNamespaceFilter(xReader);
|
|
css::uno::Reference< css::xml::sax::XDocumentHandler > xFilter (static_cast< ::cppu::OWeakObject* >(pFilter), css::uno::UNO_QUERY_THROW);
|
|
|
|
// connect parser, filter and stream
|
|
css::uno::Reference< css::xml::sax::XParser > xParser = css::xml::sax::Parser::create(xContext);
|
|
xParser->setDocumentHandler(xFilter);
|
|
|
|
css::xml::sax::InputSource aSource;
|
|
aSource.aInputStream = xStream;
|
|
|
|
// TODO think about error handling
|
|
xParser->parseStream(aSource);
|
|
}
|
|
|
|
void XMLBasedAcceleratorConfiguration::impl_ts_save(const css::uno::Reference< css::io::XOutputStream >& xStream)
|
|
{
|
|
bool bChanged;
|
|
AcceleratorCache aCache;
|
|
css::uno::Reference< css::uno::XComponentContext > xContext;
|
|
{
|
|
SolarMutexGuard g;
|
|
bChanged = (m_pWriteCache != 0);
|
|
if (bChanged)
|
|
aCache.takeOver(*m_pWriteCache);
|
|
else
|
|
aCache.takeOver(m_aReadCache);
|
|
xContext = m_xContext;
|
|
}
|
|
|
|
css::uno::Reference< css::io::XTruncate > xClearable(xStream, css::uno::UNO_QUERY_THROW);
|
|
xClearable->truncate();
|
|
|
|
// TODO can be removed if seek(0) is done by truncate() automatically!
|
|
css::uno::Reference< css::io::XSeekable > xSeek(xStream, css::uno::UNO_QUERY);
|
|
if (xSeek.is())
|
|
xSeek->seek(0);
|
|
|
|
// combine writer/cache/stream etcpp.
|
|
css::uno::Reference< css::xml::sax::XWriter > xWriter = css::xml::sax::Writer::create(xContext);
|
|
xWriter->setOutputStream(xStream);
|
|
|
|
// write into the stream
|
|
css::uno::Reference< css::xml::sax::XDocumentHandler > xHandler(xWriter, css::uno::UNO_QUERY_THROW);
|
|
AcceleratorConfigurationWriter aWriter(aCache, xHandler);
|
|
aWriter.flush();
|
|
|
|
SolarMutexGuard g;
|
|
// take over all changes into the readonly cache ...
|
|
// and forget the copy-on-write copied cache
|
|
if (bChanged)
|
|
{
|
|
m_aReadCache.takeOver(*m_pWriteCache);
|
|
// live with reentrance .-)
|
|
AcceleratorCache* pTemp = m_pWriteCache;
|
|
m_pWriteCache = 0;
|
|
delete pTemp;
|
|
}
|
|
}
|
|
|
|
AcceleratorCache& XMLBasedAcceleratorConfiguration::impl_getCFG(bool bWriteAccessRequested)
|
|
{
|
|
SolarMutexGuard g;
|
|
|
|
//create copy of our readonly-cache, if write access is forced ... but
|
|
//not still possible!
|
|
if (
|
|
(bWriteAccessRequested) &&
|
|
(!m_pWriteCache )
|
|
)
|
|
{
|
|
m_pWriteCache = new AcceleratorCache(m_aReadCache);
|
|
}
|
|
|
|
// in case, we have a writeable cache, we use it for reading too!
|
|
// Otherwise the API user can't find its own changes ...
|
|
if (m_pWriteCache)
|
|
return *m_pWriteCache;
|
|
else
|
|
return m_aReadCache;
|
|
}
|
|
|
|
OUString XMLBasedAcceleratorConfiguration::impl_ts_getLocale() const
|
|
{
|
|
OUString sISOLocale = officecfg::Setup::L10N::ooLocale::get();
|
|
|
|
if (sISOLocale.isEmpty())
|
|
return OUString("en-US");
|
|
return sISOLocale;
|
|
}
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* XCU based accelerator configuration
|
|
*
|
|
*******************************************************************************/
|
|
|
|
XCUBasedAcceleratorConfiguration::XCUBasedAcceleratorConfiguration(const css::uno::Reference< css::uno::XComponentContext >& xContext)
|
|
: m_xContext (xContext )
|
|
, m_pPrimaryWriteCache(0 )
|
|
, m_pSecondaryWriteCache(0 )
|
|
{
|
|
const OUString CFG_ENTRY_ACCELERATORS("org.openoffice.Office.Accelerators");
|
|
m_xCfg = css::uno::Reference< css::container::XNameAccess > (
|
|
::comphelper::ConfigurationHelper::openConfig( m_xContext, CFG_ENTRY_ACCELERATORS, ::comphelper::ConfigurationHelper::E_ALL_LOCALES ),
|
|
css::uno::UNO_QUERY );
|
|
}
|
|
|
|
XCUBasedAcceleratorConfiguration::~XCUBasedAcceleratorConfiguration()
|
|
{
|
|
}
|
|
|
|
css::uno::Sequence< css::awt::KeyEvent > SAL_CALL XCUBasedAcceleratorConfiguration::getAllKeyEvents()
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
SolarMutexGuard g;
|
|
|
|
AcceleratorCache::TKeyList lKeys = impl_getCFG(true).getAllKeys(); //get keys from PrimaryKeys set
|
|
|
|
AcceleratorCache::TKeyList lSecondaryKeys = impl_getCFG(false).getAllKeys(); //get keys from SecondaryKeys set
|
|
lKeys.reserve(lKeys.size()+lSecondaryKeys.size());
|
|
AcceleratorCache::TKeyList::const_iterator pIt;
|
|
AcceleratorCache::TKeyList::const_iterator pEnd = lSecondaryKeys.end();
|
|
for ( pIt = lSecondaryKeys.begin(); pIt != pEnd; ++pIt )
|
|
lKeys.push_back(*pIt);
|
|
|
|
return lKeys.getAsConstList();
|
|
}
|
|
|
|
OUString SAL_CALL XCUBasedAcceleratorConfiguration::getCommandByKeyEvent(const css::awt::KeyEvent& aKeyEvent)
|
|
throw(css::container::NoSuchElementException,
|
|
css::uno::RuntimeException, std::exception )
|
|
{
|
|
SolarMutexGuard g;
|
|
|
|
AcceleratorCache& rPrimaryCache = impl_getCFG(true );
|
|
AcceleratorCache& rSecondaryCache = impl_getCFG(false);
|
|
|
|
if (!rPrimaryCache.hasKey(aKeyEvent) && !rSecondaryCache.hasKey(aKeyEvent))
|
|
throw css::container::NoSuchElementException(
|
|
OUString(),
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
|
|
if (rPrimaryCache.hasKey(aKeyEvent))
|
|
return rPrimaryCache.getCommandByKey(aKeyEvent);
|
|
else
|
|
return rSecondaryCache.getCommandByKey(aKeyEvent);
|
|
}
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::setKeyEvent(const css::awt::KeyEvent& aKeyEvent,
|
|
const OUString& sCommand )
|
|
throw(css::lang::IllegalArgumentException,
|
|
css::uno::RuntimeException, std::exception )
|
|
{
|
|
SAL_INFO( "fwk.accelerators", "XCUBasedAcceleratorConfiguration::setKeyEvent" );
|
|
|
|
if (
|
|
(aKeyEvent.KeyCode == 0) &&
|
|
(aKeyEvent.KeyChar == 0) &&
|
|
(aKeyEvent.KeyFunc == 0) &&
|
|
(aKeyEvent.Modifiers == 0)
|
|
)
|
|
throw css::lang::IllegalArgumentException(
|
|
OUString("Such key event seems not to be supported by any operating system."),
|
|
static_cast< ::cppu::OWeakObject* >(this),
|
|
0);
|
|
|
|
if (sCommand.isEmpty())
|
|
throw css::lang::IllegalArgumentException(
|
|
OUString("Empty command strings are not allowed here."),
|
|
static_cast< ::cppu::OWeakObject* >(this),
|
|
1);
|
|
|
|
SolarMutexGuard g;
|
|
|
|
AcceleratorCache& rPrimaryCache = impl_getCFG(true, true ); // sal_True => force getting of a writeable cache!
|
|
AcceleratorCache& rSecondaryCache = impl_getCFG(false, true); // sal_True => force getting of a writeable cache!
|
|
|
|
if ( rPrimaryCache.hasKey(aKeyEvent) )
|
|
{
|
|
OUString sOriginalCommand = rPrimaryCache.getCommandByKey(aKeyEvent);
|
|
if ( sCommand != sOriginalCommand )
|
|
{
|
|
if (rSecondaryCache.hasCommand(sOriginalCommand))
|
|
{
|
|
AcceleratorCache::TKeyList lSecondaryKeys = rSecondaryCache.getKeysByCommand(sOriginalCommand);
|
|
rSecondaryCache.removeKey(lSecondaryKeys[0]);
|
|
rPrimaryCache.setKeyCommandPair(lSecondaryKeys[0], sOriginalCommand);
|
|
}
|
|
|
|
if (rPrimaryCache.hasCommand(sCommand))
|
|
{
|
|
AcceleratorCache::TKeyList lPrimaryKeys = rPrimaryCache.getKeysByCommand(sCommand);
|
|
rPrimaryCache.removeKey(lPrimaryKeys[0]);
|
|
rSecondaryCache.setKeyCommandPair(lPrimaryKeys[0], sCommand);
|
|
}
|
|
|
|
rPrimaryCache.setKeyCommandPair(aKeyEvent, sCommand);
|
|
}
|
|
}
|
|
|
|
else if ( rSecondaryCache.hasKey(aKeyEvent) )
|
|
{
|
|
OUString sOriginalCommand = rSecondaryCache.getCommandByKey(aKeyEvent);
|
|
if (sCommand != sOriginalCommand)
|
|
{
|
|
if (rPrimaryCache.hasCommand(sCommand))
|
|
{
|
|
AcceleratorCache::TKeyList lPrimaryKeys = rPrimaryCache.getKeysByCommand(sCommand);
|
|
rPrimaryCache.removeKey(lPrimaryKeys[0]);
|
|
rSecondaryCache.setKeyCommandPair(lPrimaryKeys[0], sCommand);
|
|
}
|
|
|
|
rSecondaryCache.removeKey(aKeyEvent);
|
|
rPrimaryCache.setKeyCommandPair(aKeyEvent, sCommand);
|
|
}
|
|
}
|
|
|
|
else
|
|
{
|
|
if (rPrimaryCache.hasCommand(sCommand))
|
|
{
|
|
AcceleratorCache::TKeyList lPrimaryKeys = rPrimaryCache.getKeysByCommand(sCommand);
|
|
rPrimaryCache.removeKey(lPrimaryKeys[0]);
|
|
rSecondaryCache.setKeyCommandPair(lPrimaryKeys[0], sCommand);
|
|
}
|
|
|
|
rPrimaryCache.setKeyCommandPair(aKeyEvent, sCommand);
|
|
}
|
|
}
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::removeKeyEvent(const css::awt::KeyEvent& aKeyEvent)
|
|
throw(css::container::NoSuchElementException,
|
|
css::uno::RuntimeException, std::exception )
|
|
{
|
|
SolarMutexGuard g;
|
|
|
|
AcceleratorCache& rPrimaryCache = impl_getCFG(true, true );
|
|
AcceleratorCache& rSecondaryCache = impl_getCFG(false, true);
|
|
|
|
if (!rPrimaryCache.hasKey(aKeyEvent) && !rSecondaryCache.hasKey(aKeyEvent))
|
|
throw css::container::NoSuchElementException(
|
|
OUString(),
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
|
|
if (rPrimaryCache.hasKey(aKeyEvent))
|
|
{
|
|
OUString sDelCommand = rPrimaryCache.getCommandByKey(aKeyEvent);
|
|
if (!sDelCommand.isEmpty())
|
|
{
|
|
OUString sOriginalCommand = rPrimaryCache.getCommandByKey(aKeyEvent);
|
|
if (rSecondaryCache.hasCommand(sOriginalCommand))
|
|
{
|
|
AcceleratorCache::TKeyList lSecondaryKeys = rSecondaryCache.getKeysByCommand(sOriginalCommand);
|
|
rSecondaryCache.removeKey(lSecondaryKeys[0]);
|
|
rPrimaryCache.setKeyCommandPair(lSecondaryKeys[0], sOriginalCommand);
|
|
}
|
|
|
|
rPrimaryCache.removeKey(aKeyEvent);
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
OUString sDelCommand = rSecondaryCache.getCommandByKey(aKeyEvent);
|
|
if (!sDelCommand.isEmpty())
|
|
rSecondaryCache.removeKey(aKeyEvent);
|
|
}
|
|
}
|
|
|
|
css::uno::Sequence< css::awt::KeyEvent > SAL_CALL XCUBasedAcceleratorConfiguration::getKeyEventsByCommand(const OUString& sCommand)
|
|
throw(css::lang::IllegalArgumentException ,
|
|
css::container::NoSuchElementException,
|
|
css::uno::RuntimeException, std::exception )
|
|
{
|
|
if (sCommand.isEmpty())
|
|
throw css::lang::IllegalArgumentException(
|
|
OUString("Empty command strings are not allowed here."),
|
|
static_cast< ::cppu::OWeakObject* >(this),
|
|
1);
|
|
|
|
SolarMutexGuard g;
|
|
|
|
AcceleratorCache& rPrimaryCache = impl_getCFG(true );
|
|
AcceleratorCache& rSecondaryCache = impl_getCFG(false);
|
|
|
|
if (!rPrimaryCache.hasCommand(sCommand) && !rSecondaryCache.hasCommand(sCommand))
|
|
throw css::container::NoSuchElementException(
|
|
OUString(),
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
|
|
AcceleratorCache::TKeyList lKeys = rPrimaryCache.getKeysByCommand(sCommand);
|
|
|
|
AcceleratorCache::TKeyList lSecondaryKeys = rSecondaryCache.getKeysByCommand(sCommand);
|
|
AcceleratorCache::TKeyList::const_iterator pIt;
|
|
for (pIt = lSecondaryKeys.begin(); pIt != lSecondaryKeys.end(); ++pIt)
|
|
lKeys.push_back(*pIt);
|
|
|
|
return lKeys.getAsConstList();
|
|
}
|
|
|
|
AcceleratorCache::TKeyList::const_iterator lcl_getPreferredKey(const AcceleratorCache::TKeyList& lKeys)
|
|
{
|
|
AcceleratorCache::TKeyList::const_iterator pIt;
|
|
for ( pIt = lKeys.begin ();
|
|
pIt != lKeys.end ();
|
|
++pIt )
|
|
{
|
|
const css::awt::KeyEvent& rAWTKey = *pIt;
|
|
const KeyCode aVCLKey = ::svt::AcceleratorExecute::st_AWTKey2VCLKey(rAWTKey);
|
|
const OUString sName = aVCLKey.GetName();
|
|
|
|
if (!sName.isEmpty())
|
|
return pIt;
|
|
}
|
|
|
|
return lKeys.end();
|
|
}
|
|
|
|
css::uno::Sequence< css::uno::Any > SAL_CALL XCUBasedAcceleratorConfiguration::getPreferredKeyEventsForCommandList(const css::uno::Sequence< OUString >& lCommandList)
|
|
throw(css::lang::IllegalArgumentException ,
|
|
css::uno::RuntimeException, std::exception )
|
|
{
|
|
SolarMutexGuard g;
|
|
|
|
sal_Int32 i = 0;
|
|
sal_Int32 c = lCommandList.getLength();
|
|
css::uno::Sequence< css::uno::Any > lPreferredOnes (c); // dont pack list!
|
|
AcceleratorCache& rCache = impl_getCFG(true);
|
|
|
|
for (i=0; i<c; ++i)
|
|
{
|
|
const OUString& rCommand = lCommandList[i];
|
|
if (rCommand.isEmpty())
|
|
throw css::lang::IllegalArgumentException(
|
|
OUString("Empty command strings are not allowed here."),
|
|
static_cast< ::cppu::OWeakObject* >(this),
|
|
(sal_Int16)i);
|
|
|
|
if (!rCache.hasCommand(rCommand))
|
|
continue;
|
|
|
|
AcceleratorCache::TKeyList lKeys = rCache.getKeysByCommand(rCommand);
|
|
if ( lKeys.empty() )
|
|
continue;
|
|
|
|
AcceleratorCache::TKeyList::const_iterator pPreferredKey = lcl_getPreferredKey(lKeys);
|
|
if (pPreferredKey != lKeys.end ())
|
|
{
|
|
css::uno::Any& rAny = lPreferredOnes[i];
|
|
rAny <<= *(pPreferredKey);
|
|
}
|
|
}
|
|
|
|
return lPreferredOnes;
|
|
}
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::removeCommandFromAllKeyEvents(const OUString& sCommand)
|
|
throw(css::lang::IllegalArgumentException ,
|
|
css::container::NoSuchElementException,
|
|
css::uno::RuntimeException, std::exception )
|
|
{
|
|
if (sCommand.isEmpty())
|
|
throw css::lang::IllegalArgumentException(
|
|
OUString("Empty command strings are not allowed here."),
|
|
static_cast< ::cppu::OWeakObject* >(this),
|
|
0);
|
|
|
|
SolarMutexGuard g;
|
|
|
|
AcceleratorCache& rPrimaryCache = impl_getCFG(true, true );
|
|
AcceleratorCache& rSecondaryCache = impl_getCFG(false, true);
|
|
|
|
if (!rPrimaryCache.hasCommand(sCommand) && !rSecondaryCache.hasCommand(sCommand))
|
|
throw css::container::NoSuchElementException(
|
|
OUString("Command does not exists inside this container."),
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
|
|
if (rPrimaryCache.hasCommand(sCommand))
|
|
rPrimaryCache.removeCommand(sCommand);
|
|
if (rSecondaryCache.hasCommand(sCommand))
|
|
rSecondaryCache.removeCommand(sCommand);
|
|
}
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::reload()
|
|
throw(css::uno::Exception ,
|
|
css::uno::RuntimeException, std::exception)
|
|
{
|
|
SAL_INFO( "fwk.accelerators", "XCUBasedAcceleratorConfiguration::reload()" );
|
|
|
|
SolarMutexGuard g;
|
|
|
|
bool bPreferred;
|
|
css::uno::Reference< css::container::XNameAccess > xAccess;
|
|
|
|
bPreferred = true;
|
|
m_aPrimaryReadCache = AcceleratorCache();
|
|
if (m_pPrimaryWriteCache)
|
|
{
|
|
// be aware of reentrance problems - use temp variable for calling delete ... :-)
|
|
AcceleratorCache* pTemp = m_pPrimaryWriteCache;
|
|
m_pPrimaryWriteCache = 0;
|
|
delete pTemp;
|
|
}
|
|
m_xCfg->getByName(CFG_ENTRY_PRIMARY) >>= xAccess;
|
|
impl_ts_load(bPreferred, xAccess); // load the preferred keys
|
|
|
|
bPreferred = false;
|
|
m_aSecondaryReadCache = AcceleratorCache();
|
|
if (m_pSecondaryWriteCache)
|
|
{
|
|
// be aware of reentrance problems - use temp variable for calling delete ... :-)
|
|
AcceleratorCache* pTemp = m_pSecondaryWriteCache;
|
|
m_pSecondaryWriteCache = 0;
|
|
delete pTemp;
|
|
}
|
|
m_xCfg->getByName(CFG_ENTRY_SECONDARY) >>= xAccess;
|
|
impl_ts_load(bPreferred, xAccess); // load the secondary keys
|
|
}
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::store()
|
|
throw(css::uno::Exception ,
|
|
css::uno::RuntimeException, std::exception)
|
|
{
|
|
SAL_INFO( "fwk.accelerators", "XCUBasedAcceleratorConfiguration::store()" );
|
|
|
|
SolarMutexGuard g;
|
|
|
|
bool bPreferred;
|
|
css::uno::Reference< css::container::XNameAccess > xAccess;
|
|
|
|
bPreferred = true;
|
|
// on-demand creation of the primary write cache
|
|
impl_getCFG(bPreferred, true);
|
|
m_xCfg->getByName(CFG_ENTRY_PRIMARY) >>= xAccess;
|
|
impl_ts_save(bPreferred, xAccess);
|
|
|
|
bPreferred = false;
|
|
// on-demand creation of the secondary write cache
|
|
impl_getCFG(bPreferred, true);
|
|
m_xCfg->getByName(CFG_ENTRY_SECONDARY) >>= xAccess;
|
|
impl_ts_save(bPreferred, xAccess);
|
|
}
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::storeToStorage(const css::uno::Reference< css::embed::XStorage >& xStorage)
|
|
throw(css::uno::Exception ,
|
|
css::uno::RuntimeException, std::exception)
|
|
{
|
|
// use m_aCache + old AcceleratorXMLWriter to store data directly on storage given as parameter ...
|
|
if (!xStorage.is())
|
|
return;
|
|
|
|
long nOpenModes = css::embed::ElementModes::READWRITE;
|
|
css::uno::Reference< css::embed::XStorage > xAcceleratorTypeStorage = xStorage->openStorageElement(OUString("accelerator"), nOpenModes);
|
|
if (!xAcceleratorTypeStorage.is())
|
|
return;
|
|
|
|
css::uno::Reference< css::io::XStream > xStream = xAcceleratorTypeStorage->openStreamElement(OUString("current"), nOpenModes);
|
|
css::uno::Reference< css::io::XOutputStream > xOut;
|
|
if (xStream.is())
|
|
xOut = xStream->getOutputStream();
|
|
if (!xOut.is())
|
|
throw css::io::IOException(
|
|
OUString("Could not open accelerator configuration for saving."),
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
|
|
// the original m_aCache has been split into primay cache and secondary cache...
|
|
// we should merge them before storing to storage
|
|
AcceleratorCache aCache;
|
|
{
|
|
SolarMutexGuard g;
|
|
|
|
if (m_pPrimaryWriteCache != 0)
|
|
aCache.takeOver(*m_pPrimaryWriteCache);
|
|
else
|
|
aCache.takeOver(m_aPrimaryReadCache);
|
|
|
|
AcceleratorCache::TKeyList lKeys;
|
|
AcceleratorCache::TKeyList::const_iterator pIt;
|
|
if (m_pSecondaryWriteCache!=0)
|
|
{
|
|
lKeys = m_pSecondaryWriteCache->getAllKeys();
|
|
for ( pIt=lKeys.begin(); pIt!=lKeys.end(); ++pIt )
|
|
aCache.setKeyCommandPair(*pIt, m_pSecondaryWriteCache->getCommandByKey(*pIt));
|
|
}
|
|
else
|
|
{
|
|
lKeys = m_aSecondaryReadCache.getAllKeys();
|
|
for ( pIt=lKeys.begin(); pIt!=lKeys.end(); ++pIt )
|
|
aCache.setKeyCommandPair(*pIt, m_aSecondaryReadCache.getCommandByKey(*pIt));
|
|
}
|
|
}
|
|
|
|
css::uno::Reference< css::io::XTruncate > xClearable(xOut, css::uno::UNO_QUERY_THROW);
|
|
xClearable->truncate();
|
|
css::uno::Reference< css::io::XSeekable > xSeek(xOut, css::uno::UNO_QUERY);
|
|
if (xSeek.is())
|
|
xSeek->seek(0);
|
|
|
|
css::uno::Reference< css::xml::sax::XWriter > xWriter = css::xml::sax::Writer::create(m_xContext);
|
|
xWriter->setOutputStream(xOut);
|
|
|
|
// write into the stream
|
|
css::uno::Reference< css::xml::sax::XDocumentHandler > xHandler(xWriter, css::uno::UNO_QUERY_THROW);
|
|
AcceleratorConfigurationWriter aWriter(aCache, xHandler);
|
|
aWriter.flush();
|
|
}
|
|
|
|
sal_Bool SAL_CALL XCUBasedAcceleratorConfiguration::isModified()
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
return sal_False;
|
|
}
|
|
|
|
sal_Bool SAL_CALL XCUBasedAcceleratorConfiguration::isReadOnly()
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
return sal_False;
|
|
}
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::setStorage(const css::uno::Reference< css::embed::XStorage >& /*xStorage*/)
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
SAL_INFO("fwk", "XCUBasedAcceleratorConfiguration::setStorage(): implement this HACK .-)");
|
|
}
|
|
|
|
sal_Bool SAL_CALL XCUBasedAcceleratorConfiguration::hasStorage()
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
SAL_INFO("fwk", "XCUBasedAcceleratorConfiguration::hasStorage(): implement this HACK .-)");
|
|
return sal_False;
|
|
}
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::addConfigurationListener(const css::uno::Reference< css::ui::XUIConfigurationListener >& /*xListener*/)
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
SAL_INFO("fwk", "XCUBasedAcceleratorConfiguration::addConfigurationListener(): implement me");
|
|
}
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::removeConfigurationListener(const css::uno::Reference< css::ui::XUIConfigurationListener >& /*xListener*/)
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
SAL_INFO("fwk", "XCUBasedAcceleratorConfiguration::removeConfigurationListener(): implement me");
|
|
}
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::reset()
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
css::uno::Reference< css::container::XNamed > xNamed(m_xCfg, css::uno::UNO_QUERY);
|
|
OUString sConfig = xNamed->getName();
|
|
if ( sConfig == "Global" )
|
|
{
|
|
m_xCfg = css::uno::Reference< css::container::XNameAccess > (
|
|
::comphelper::ConfigurationHelper::openConfig( m_xContext, CFG_ENTRY_GLOBAL, ::comphelper::ConfigurationHelper::E_ALL_LOCALES ),
|
|
css::uno::UNO_QUERY );
|
|
XCUBasedAcceleratorConfiguration::reload();
|
|
}
|
|
else if ( sConfig == "Modules" )
|
|
{
|
|
m_xCfg = css::uno::Reference< css::container::XNameAccess > (
|
|
::comphelper::ConfigurationHelper::openConfig( m_xContext, CFG_ENTRY_MODULES, ::comphelper::ConfigurationHelper::E_ALL_LOCALES ),
|
|
css::uno::UNO_QUERY );
|
|
XCUBasedAcceleratorConfiguration::reload();
|
|
}
|
|
}
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::addResetListener(const css::uno::Reference< css::form::XResetListener >& /*xListener*/)
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
SAL_INFO("fwk", "XCUBasedAcceleratorConfiguration::addResetListener(): implement me");
|
|
}
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::removeResetListener(const css::uno::Reference< css::form::XResetListener >& /*xListener*/)
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
SAL_INFO("fwk", "XCUBasedAcceleratorConfiguration::removeResetListener(): implement me");
|
|
}
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::changesOccurred(const css::util::ChangesEvent& aEvent)
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
SAL_INFO( "fwk.accelerators", "XCUBasedAcceleratorConfiguration::changesOccurred()" );
|
|
|
|
css::uno::Reference< css::container::XHierarchicalNameAccess > xHAccess;
|
|
aEvent.Base >>= xHAccess;
|
|
if (! xHAccess.is ())
|
|
return;
|
|
|
|
css::util::ChangesEvent aReceivedEvents( aEvent );
|
|
const sal_Int32 c = aReceivedEvents.Changes.getLength();
|
|
sal_Int32 i = 0;
|
|
for (i=0; i<c; ++i)
|
|
{
|
|
const css::util::ElementChange& aChange = aReceivedEvents.Changes[i];
|
|
|
|
// Only path of form "PrimaryKeys/Modules/Module['<module_name>']/Key['<command_url>']/Command[<locale>]" will
|
|
// be interesting for use. Sometimes short path values are given also by the broadcaster ... but they must be ignored :-)
|
|
// So we try to split the path into 3 parts (module isn't important here, because we already know it ... because
|
|
// these instance is bound to a specific module configuration ... or it''s the global configuration where no module is given at all.
|
|
|
|
OUString sOrgPath;
|
|
OUString sPath;
|
|
OUString sKey;
|
|
|
|
aChange.Accessor >>= sOrgPath;
|
|
sPath = sOrgPath;
|
|
OUString sPrimarySecondary = ::utl::extractFirstFromConfigurationPath(sPath, &sPath);
|
|
OUString sGlobalModules = ::utl::extractFirstFromConfigurationPath(sPath, &sPath);
|
|
|
|
if ( sGlobalModules == CFG_ENTRY_GLOBAL )
|
|
{
|
|
OUString sModule;
|
|
sKey = ::utl::extractFirstFromConfigurationPath(sPath, &sPath);
|
|
if ( !sKey.isEmpty() && !sPath.isEmpty() )
|
|
reloadChanged(sPrimarySecondary, sGlobalModules, sModule, sKey);
|
|
}
|
|
else if ( sGlobalModules == CFG_ENTRY_MODULES )
|
|
{
|
|
OUString sModule = ::utl::extractFirstFromConfigurationPath(sPath, &sPath);
|
|
sKey = ::utl::extractFirstFromConfigurationPath(sPath, &sPath);
|
|
|
|
if ( !sKey.isEmpty() && !sPath.isEmpty() )
|
|
{
|
|
reloadChanged(sPrimarySecondary, sGlobalModules, sModule, sKey);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::disposing(const css::lang::EventObject& /*aSource*/)
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
}
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::dispose()
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
// nop
|
|
}
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& /*xListener*/ )
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
// nop
|
|
}
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& /*xListener*/ )
|
|
throw(css::uno::RuntimeException, std::exception)
|
|
{
|
|
// nop
|
|
}
|
|
|
|
void XCUBasedAcceleratorConfiguration::impl_ts_load( bool bPreferred, const css::uno::Reference< css::container::XNameAccess >& xCfg )
|
|
{
|
|
AcceleratorCache aReadCache = AcceleratorCache();
|
|
css::uno::Reference< css::container::XNameAccess > xAccess;
|
|
if ( m_sGlobalOrModules == "Global" )
|
|
xCfg->getByName(CFG_ENTRY_GLOBAL) >>= xAccess;
|
|
else if ( m_sGlobalOrModules == "Modules" )
|
|
{
|
|
css::uno::Reference< css::container::XNameAccess > xModules;
|
|
xCfg->getByName(CFG_ENTRY_MODULES) >>= xModules;
|
|
xModules->getByName(m_sModuleCFG) >>= xAccess;
|
|
}
|
|
|
|
const OUString sIsoLang = impl_ts_getLocale();
|
|
const OUString sDefaultLocale("en-US");
|
|
|
|
css::uno::Reference< css::container::XNameAccess > xKey;
|
|
css::uno::Reference< css::container::XNameAccess > xCommand;
|
|
if (xAccess.is())
|
|
{
|
|
css::uno::Sequence< OUString > lKeys = xAccess->getElementNames();
|
|
sal_Int32 nKeys = lKeys.getLength();
|
|
for ( sal_Int32 i=0; i<nKeys; ++i )
|
|
{
|
|
OUString sKey = lKeys[i];
|
|
xAccess->getByName(sKey) >>= xKey;
|
|
xKey->getByName(CFG_PROP_COMMAND) >>= xCommand;
|
|
|
|
css::uno::Sequence< OUString > lLocales = xCommand->getElementNames();
|
|
sal_Int32 nLocales = lLocales.getLength();
|
|
::std::vector< OUString > aLocales;
|
|
for ( sal_Int32 j=0; j<nLocales; ++j )
|
|
aLocales.push_back(lLocales[j]);
|
|
|
|
::std::vector< OUString >::const_iterator pFound;
|
|
for ( pFound = aLocales.begin(); pFound != aLocales.end(); ++pFound )
|
|
{
|
|
if ( *pFound == sIsoLang )
|
|
break;
|
|
}
|
|
|
|
if ( pFound == aLocales.end() )
|
|
{
|
|
for ( pFound = aLocales.begin(); pFound != aLocales.end(); ++pFound )
|
|
{
|
|
if ( *pFound == sDefaultLocale )
|
|
break;
|
|
}
|
|
|
|
if ( pFound == aLocales.end() )
|
|
continue;
|
|
}
|
|
|
|
OUString sLocale = *pFound;
|
|
OUString sCommand;
|
|
xCommand->getByName(sLocale) >>= sCommand;
|
|
if (sCommand.isEmpty())
|
|
continue;
|
|
|
|
css::awt::KeyEvent aKeyEvent;
|
|
|
|
sal_Int32 nIndex = 0;
|
|
OUString sKeyCommand = sKey.getToken(0, '_', nIndex);
|
|
OUString sPrefix("KEY_");
|
|
aKeyEvent.KeyCode = m_rKeyMapping->mapIdentifierToCode(sPrefix + sKeyCommand);
|
|
|
|
css::uno::Sequence< OUString > sToken(4);
|
|
const sal_Int32 nToken = 4;
|
|
bool bValid = true;
|
|
sal_Int32 k;
|
|
for (k=0; k<nToken; ++k)
|
|
{
|
|
if (nIndex < 0)
|
|
break;
|
|
|
|
sToken[k] = sKey.getToken(0, '_', nIndex);
|
|
if (sToken[k].isEmpty())
|
|
{
|
|
bValid = false;
|
|
break;
|
|
}
|
|
|
|
if ( sToken[k] == "SHIFT" )
|
|
aKeyEvent.Modifiers |= css::awt::KeyModifier::SHIFT;
|
|
else if ( sToken[k] == "MOD1" )
|
|
aKeyEvent.Modifiers |= css::awt::KeyModifier::MOD1;
|
|
else if ( sToken[k] == "MOD2" )
|
|
aKeyEvent.Modifiers |= css::awt::KeyModifier::MOD2;
|
|
else if ( sToken[k] == "MOD3" )
|
|
aKeyEvent.Modifiers |= css::awt::KeyModifier::MOD3;
|
|
else
|
|
{
|
|
bValid = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( !aReadCache.hasKey(aKeyEvent) && bValid && k<nToken)
|
|
aReadCache.setKeyCommandPair(aKeyEvent, sCommand);
|
|
}
|
|
}
|
|
|
|
if (bPreferred)
|
|
m_aPrimaryReadCache.takeOver(aReadCache);
|
|
else
|
|
m_aSecondaryReadCache.takeOver(aReadCache);
|
|
}
|
|
|
|
void XCUBasedAcceleratorConfiguration::impl_ts_save(bool bPreferred, const css::uno::Reference< css::container::XNameAccess >& /*xCfg*/)
|
|
{
|
|
if (bPreferred)
|
|
{
|
|
AcceleratorCache::TKeyList::const_iterator pIt;
|
|
AcceleratorCache::TKeyList lPrimaryReadKeys = m_aPrimaryReadCache.getAllKeys();
|
|
AcceleratorCache::TKeyList lPrimaryWriteKeys = m_pPrimaryWriteCache->getAllKeys();
|
|
|
|
for ( pIt = lPrimaryReadKeys.begin(); pIt != lPrimaryReadKeys.end(); ++pIt )
|
|
{
|
|
if (!m_pPrimaryWriteCache->hasKey(*pIt))
|
|
removeKeyFromConfiguration(*pIt, true);
|
|
}
|
|
|
|
for ( pIt = lPrimaryWriteKeys.begin(); pIt != lPrimaryWriteKeys.end(); ++pIt )
|
|
{
|
|
OUString sCommand = m_pPrimaryWriteCache->getCommandByKey(*pIt);
|
|
if (!m_aPrimaryReadCache.hasKey(*pIt))
|
|
{
|
|
insertKeyToConfiguration(*pIt, sCommand, true);
|
|
}
|
|
else
|
|
{
|
|
OUString sReadCommand = m_aPrimaryReadCache.getCommandByKey(*pIt);
|
|
if (sReadCommand != sCommand)
|
|
insertKeyToConfiguration(*pIt, sCommand, true);
|
|
}
|
|
}
|
|
|
|
// take over all changes into the original container
|
|
SolarMutexGuard g;
|
|
if (m_pPrimaryWriteCache)
|
|
{
|
|
m_aPrimaryReadCache.takeOver(*m_pPrimaryWriteCache);
|
|
AcceleratorCache* pTemp = m_pPrimaryWriteCache;
|
|
m_pPrimaryWriteCache = 0;
|
|
delete pTemp;
|
|
}
|
|
}
|
|
|
|
else
|
|
{
|
|
AcceleratorCache::TKeyList::const_iterator pIt;
|
|
AcceleratorCache::TKeyList lSecondaryReadKeys = m_aSecondaryReadCache.getAllKeys();
|
|
AcceleratorCache::TKeyList lSecondaryWriteKeys = m_pSecondaryWriteCache->getAllKeys();
|
|
|
|
for ( pIt = lSecondaryReadKeys.begin(); pIt != lSecondaryReadKeys.end(); ++pIt)
|
|
{
|
|
if (!m_pSecondaryWriteCache->hasKey(*pIt))
|
|
removeKeyFromConfiguration(*pIt, false);
|
|
}
|
|
|
|
for ( pIt = lSecondaryWriteKeys.begin(); pIt != lSecondaryWriteKeys.end(); ++pIt )
|
|
{
|
|
OUString sCommand = m_pSecondaryWriteCache->getCommandByKey(*pIt);
|
|
if (!m_aSecondaryReadCache.hasKey(*pIt))
|
|
{
|
|
insertKeyToConfiguration(*pIt, sCommand, false);
|
|
}
|
|
else
|
|
{
|
|
OUString sReadCommand = m_aSecondaryReadCache.getCommandByKey(*pIt);
|
|
if (sReadCommand != sCommand)
|
|
insertKeyToConfiguration(*pIt, sCommand, false);
|
|
}
|
|
}
|
|
|
|
// take over all changes into the original container
|
|
SolarMutexGuard g;
|
|
if (m_pSecondaryWriteCache)
|
|
{
|
|
m_aSecondaryReadCache.takeOver(*m_pSecondaryWriteCache);
|
|
AcceleratorCache* pTemp = m_pSecondaryWriteCache;
|
|
m_pSecondaryWriteCache = 0;
|
|
delete pTemp;
|
|
}
|
|
}
|
|
|
|
::comphelper::ConfigurationHelper::flush(m_xCfg);
|
|
}
|
|
|
|
void XCUBasedAcceleratorConfiguration::insertKeyToConfiguration( const css::awt::KeyEvent& aKeyEvent, const OUString& sCommand, const bool bPreferred )
|
|
{
|
|
css::uno::Reference< css::container::XNameAccess > xAccess;
|
|
css::uno::Reference< css::container::XNameContainer > xContainer;
|
|
css::uno::Reference< css::lang::XSingleServiceFactory > xFac;
|
|
css::uno::Reference< css::uno::XInterface > xInst;
|
|
|
|
if ( bPreferred )
|
|
m_xCfg->getByName(CFG_ENTRY_PRIMARY) >>= xAccess;
|
|
else
|
|
m_xCfg->getByName(CFG_ENTRY_SECONDARY) >>= xAccess;
|
|
|
|
if ( m_sGlobalOrModules == CFG_ENTRY_GLOBAL )
|
|
xAccess->getByName(CFG_ENTRY_GLOBAL) >>= xContainer;
|
|
else if ( m_sGlobalOrModules == CFG_ENTRY_MODULES )
|
|
{
|
|
css::uno::Reference< css::container::XNameContainer > xModules;
|
|
xAccess->getByName(CFG_ENTRY_MODULES) >>= xModules;
|
|
if ( !xModules->hasByName(m_sModuleCFG) )
|
|
{
|
|
xFac = css::uno::Reference< css::lang::XSingleServiceFactory >(xModules, css::uno::UNO_QUERY);
|
|
xInst = xFac->createInstance();
|
|
xModules->insertByName(m_sModuleCFG, css::uno::makeAny(xInst));
|
|
}
|
|
xModules->getByName(m_sModuleCFG) >>= xContainer;
|
|
}
|
|
|
|
const OUString sKey = lcl_getKeyString(m_rKeyMapping,aKeyEvent);
|
|
css::uno::Reference< css::container::XNameAccess > xKey;
|
|
css::uno::Reference< css::container::XNameContainer > xCommand;
|
|
if ( !xContainer->hasByName(sKey) )
|
|
{
|
|
xFac = css::uno::Reference< css::lang::XSingleServiceFactory >(xContainer, css::uno::UNO_QUERY);
|
|
xInst = xFac->createInstance();
|
|
xContainer->insertByName(sKey, css::uno::makeAny(xInst));
|
|
}
|
|
xContainer->getByName(sKey) >>= xKey;
|
|
|
|
xKey->getByName(CFG_PROP_COMMAND) >>= xCommand;
|
|
OUString sLocale = impl_ts_getLocale();
|
|
if ( !xCommand->hasByName(sLocale) )
|
|
xCommand->insertByName(sLocale, css::uno::makeAny(sCommand));
|
|
else
|
|
xCommand->replaceByName(sLocale, css::uno::makeAny(sCommand));
|
|
}
|
|
|
|
void XCUBasedAcceleratorConfiguration::removeKeyFromConfiguration( const css::awt::KeyEvent& aKeyEvent, const bool bPreferred )
|
|
{
|
|
css::uno::Reference< css::container::XNameAccess > xAccess;
|
|
css::uno::Reference< css::container::XNameContainer > xContainer;
|
|
|
|
if ( bPreferred )
|
|
m_xCfg->getByName(CFG_ENTRY_PRIMARY) >>= xAccess;
|
|
else
|
|
m_xCfg->getByName(CFG_ENTRY_SECONDARY) >>= xAccess;
|
|
|
|
if ( m_sGlobalOrModules == CFG_ENTRY_GLOBAL )
|
|
xAccess->getByName(CFG_ENTRY_GLOBAL) >>= xContainer;
|
|
else if ( m_sGlobalOrModules == CFG_ENTRY_MODULES )
|
|
{
|
|
css::uno::Reference< css::container::XNameAccess > xModules;
|
|
xAccess->getByName(CFG_ENTRY_MODULES) >>= xModules;
|
|
if ( !xModules->hasByName(m_sModuleCFG) )
|
|
return;
|
|
xModules->getByName(m_sModuleCFG) >>= xContainer;
|
|
}
|
|
|
|
const OUString sKey = lcl_getKeyString(m_rKeyMapping,aKeyEvent);
|
|
xContainer->removeByName(sKey);
|
|
}
|
|
|
|
void XCUBasedAcceleratorConfiguration::reloadChanged( const OUString& sPrimarySecondary, const OUString& sGlobalModules, const OUString& sModule, const OUString& sKey )
|
|
{
|
|
css::uno::Reference< css::container::XNameAccess > xAccess;
|
|
css::uno::Reference< css::container::XNameContainer > xContainer;
|
|
|
|
m_xCfg->getByName(sPrimarySecondary) >>= xAccess;
|
|
if ( sGlobalModules == CFG_ENTRY_GLOBAL )
|
|
xAccess->getByName(CFG_ENTRY_GLOBAL) >>= xContainer;
|
|
else
|
|
{
|
|
css::uno::Reference< css::container::XNameAccess > xModules;
|
|
xAccess->getByName(CFG_ENTRY_MODULES) >>= xModules;
|
|
if ( !xModules->hasByName(sModule) )
|
|
return;
|
|
xModules->getByName(sModule) >>= xContainer;
|
|
}
|
|
|
|
css::awt::KeyEvent aKeyEvent;
|
|
OUString sKeyIdentifier;
|
|
|
|
sal_Int32 nIndex = 0;
|
|
sKeyIdentifier = sKey.getToken(0, '_', nIndex);
|
|
aKeyEvent.KeyCode = m_rKeyMapping->mapIdentifierToCode(OUString("KEY_")+sKeyIdentifier);
|
|
|
|
css::uno::Sequence< OUString > sToken(3);
|
|
const sal_Int32 nToken = 3;
|
|
for (sal_Int32 i=0; i<nToken; ++i)
|
|
{
|
|
if ( nIndex < 0 )
|
|
break;
|
|
|
|
sToken[i] = sKey.getToken(0, '_', nIndex);
|
|
if ( sToken[i] == "SHIFT" )
|
|
aKeyEvent.Modifiers |= css::awt::KeyModifier::SHIFT;
|
|
else if ( sToken[i] == "MOD1" )
|
|
aKeyEvent.Modifiers |= css::awt::KeyModifier::MOD1;
|
|
else if ( sToken[i] == "MOD2" )
|
|
aKeyEvent.Modifiers |= css::awt::KeyModifier::MOD2;
|
|
else if ( sToken[i] == "MOD3" )
|
|
aKeyEvent.Modifiers |= css::awt::KeyModifier::MOD3;
|
|
}
|
|
|
|
css::uno::Reference< css::container::XNameAccess > xKey;
|
|
css::uno::Reference< css::container::XNameAccess > xCommand;
|
|
OUString sCommand;
|
|
|
|
if (xContainer->hasByName(sKey))
|
|
{
|
|
OUString sLocale = impl_ts_getLocale();
|
|
xContainer->getByName(sKey) >>= xKey;
|
|
xKey->getByName(CFG_PROP_COMMAND) >>= xCommand;
|
|
xCommand->getByName(sLocale) >>= sCommand;
|
|
}
|
|
|
|
if ( sPrimarySecondary == CFG_ENTRY_PRIMARY )
|
|
{
|
|
if (sCommand.isEmpty())
|
|
m_aPrimaryReadCache.removeKey(aKeyEvent);
|
|
else
|
|
m_aPrimaryReadCache.setKeyCommandPair(aKeyEvent, sCommand);
|
|
}
|
|
else if ( sPrimarySecondary == CFG_ENTRY_SECONDARY )
|
|
{
|
|
if (sCommand.isEmpty())
|
|
m_aSecondaryReadCache.removeKey(aKeyEvent);
|
|
else
|
|
m_aSecondaryReadCache.setKeyCommandPair(aKeyEvent, sCommand);
|
|
}
|
|
}
|
|
|
|
AcceleratorCache& XCUBasedAcceleratorConfiguration::impl_getCFG(bool bPreferred, bool bWriteAccessRequested)
|
|
{
|
|
SolarMutexGuard g;
|
|
|
|
if (bPreferred)
|
|
{
|
|
//create copy of our readonly-cache, if write access is forced ... but
|
|
//not still possible!
|
|
if (
|
|
(bWriteAccessRequested) &&
|
|
(!m_pPrimaryWriteCache )
|
|
)
|
|
{
|
|
m_pPrimaryWriteCache = new AcceleratorCache(m_aPrimaryReadCache);
|
|
}
|
|
|
|
// in case, we have a writeable cache, we use it for reading too!
|
|
// Otherwise the API user can't find its own changes ...
|
|
if (m_pPrimaryWriteCache)
|
|
return *m_pPrimaryWriteCache;
|
|
else
|
|
return m_aPrimaryReadCache;
|
|
}
|
|
|
|
else
|
|
{
|
|
//create copy of our readonly-cache, if write access is forced ... but
|
|
//not still possible!
|
|
if (
|
|
(bWriteAccessRequested) &&
|
|
(!m_pSecondaryWriteCache )
|
|
)
|
|
{
|
|
m_pSecondaryWriteCache = new AcceleratorCache(m_aSecondaryReadCache);
|
|
}
|
|
|
|
// in case, we have a writeable cache, we use it for reading too!
|
|
// Otherwise the API user can't find its own changes ...
|
|
if (m_pSecondaryWriteCache)
|
|
return *m_pSecondaryWriteCache;
|
|
else
|
|
return m_aSecondaryReadCache;
|
|
}
|
|
}
|
|
|
|
OUString XCUBasedAcceleratorConfiguration::impl_ts_getLocale() const
|
|
{
|
|
OUString sISOLocale = officecfg::Setup::L10N::ooLocale::get();
|
|
|
|
if (sISOLocale.isEmpty())
|
|
return OUString("en-US");
|
|
return sISOLocale;
|
|
}
|
|
|
|
} // namespace framework
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|