145da7d5eSAndre Fischer /**************************************************************
245da7d5eSAndre Fischer *
345da7d5eSAndre Fischer * Licensed to the Apache Software Foundation (ASF) under one
445da7d5eSAndre Fischer * or more contributor license agreements. See the NOTICE file
545da7d5eSAndre Fischer * distributed with this work for additional information
645da7d5eSAndre Fischer * regarding copyright ownership. The ASF licenses this file
745da7d5eSAndre Fischer * to you under the Apache License, Version 2.0 (the
845da7d5eSAndre Fischer * "License"); you may not use this file except in compliance
945da7d5eSAndre Fischer * with the License. You may obtain a copy of the License at
1045da7d5eSAndre Fischer *
1145da7d5eSAndre Fischer * http://www.apache.org/licenses/LICENSE-2.0
1245da7d5eSAndre Fischer *
1345da7d5eSAndre Fischer * Unless required by applicable law or agreed to in writing,
1445da7d5eSAndre Fischer * software distributed under the License is distributed on an
1545da7d5eSAndre Fischer * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1645da7d5eSAndre Fischer * KIND, either express or implied. See the License for the
1745da7d5eSAndre Fischer * specific language governing permissions and limitations
1845da7d5eSAndre Fischer * under the License.
1945da7d5eSAndre Fischer *
2045da7d5eSAndre Fischer *************************************************************/
2145da7d5eSAndre Fischer
2245da7d5eSAndre Fischer #include "precompiled_sfx2.hxx"
2345da7d5eSAndre Fischer
24*f35c6d02SAndre Fischer #include "sfx2/sidebar/CommandInfoProvider.hxx"
2545da7d5eSAndre Fischer
2645da7d5eSAndre Fischer #include <comphelper/processfactory.hxx>
2745da7d5eSAndre Fischer #include <svtools/acceleratorexecute.hxx>
2845da7d5eSAndre Fischer #include <cppuhelper/compbase1.hxx>
2945da7d5eSAndre Fischer #include <cppuhelper/basemutex.hxx>
3045da7d5eSAndre Fischer
3145da7d5eSAndre Fischer #include <com/sun/star/frame/XModuleManager.hpp>
3245da7d5eSAndre Fischer #include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
3345da7d5eSAndre Fischer #include <com/sun/star/ui/XModuleUIConfigurationManagerSupplier.hpp>
3445da7d5eSAndre Fischer
3545da7d5eSAndre Fischer using namespace css;
3645da7d5eSAndre Fischer using namespace cssu;
3745da7d5eSAndre Fischer using ::rtl::OUString;
3845da7d5eSAndre Fischer
3945da7d5eSAndre Fischer
4045da7d5eSAndre Fischer #define A2S(s) rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(s))
4145da7d5eSAndre Fischer
4245da7d5eSAndre Fischer
4345da7d5eSAndre Fischer namespace
4445da7d5eSAndre Fischer {
4545da7d5eSAndre Fischer typedef ::cppu::WeakComponentImplHelper1 <
4645da7d5eSAndre Fischer css::lang::XEventListener
4745da7d5eSAndre Fischer > FrameListenerInterfaceBase;
4845da7d5eSAndre Fischer class FrameListener
4945da7d5eSAndre Fischer : public ::cppu::BaseMutex,
5045da7d5eSAndre Fischer public FrameListenerInterfaceBase
5145da7d5eSAndre Fischer {
5245da7d5eSAndre Fischer public:
FrameListener(sfx2::sidebar::CommandInfoProvider & rInfoProvider,const Reference<frame::XFrame> & rxFrame)5345da7d5eSAndre Fischer FrameListener (sfx2::sidebar::CommandInfoProvider& rInfoProvider, const Reference<frame::XFrame>& rxFrame)
5445da7d5eSAndre Fischer : FrameListenerInterfaceBase(m_aMutex),
5545da7d5eSAndre Fischer mrInfoProvider(rInfoProvider),
5645da7d5eSAndre Fischer mxFrame(rxFrame)
5745da7d5eSAndre Fischer {
5845da7d5eSAndre Fischer if (mxFrame.is())
5945da7d5eSAndre Fischer mxFrame->addEventListener(this);
6045da7d5eSAndre Fischer }
~FrameListener(void)6145da7d5eSAndre Fischer virtual ~FrameListener (void)
6245da7d5eSAndre Fischer {
6345da7d5eSAndre Fischer }
disposing(void)6445da7d5eSAndre Fischer virtual void SAL_CALL disposing (void)
6545da7d5eSAndre Fischer {
6645da7d5eSAndre Fischer if (mxFrame.is())
6745da7d5eSAndre Fischer mxFrame->removeEventListener(this);
6845da7d5eSAndre Fischer }
disposing(const css::lang::EventObject & rEvent)6945da7d5eSAndre Fischer virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent)
7045da7d5eSAndre Fischer throw (cssu::RuntimeException)
7145da7d5eSAndre Fischer {
7245da7d5eSAndre Fischer (void)rEvent;
7345da7d5eSAndre Fischer mrInfoProvider.SetFrame(NULL);
7445da7d5eSAndre Fischer mxFrame = NULL;
7545da7d5eSAndre Fischer }
7645da7d5eSAndre Fischer
7745da7d5eSAndre Fischer private:
7845da7d5eSAndre Fischer sfx2::sidebar::CommandInfoProvider& mrInfoProvider;
7945da7d5eSAndre Fischer Reference<frame::XFrame> mxFrame;
8045da7d5eSAndre Fischer };
8145da7d5eSAndre Fischer }
8245da7d5eSAndre Fischer
8345da7d5eSAndre Fischer
8445da7d5eSAndre Fischer
8545da7d5eSAndre Fischer namespace sfx2 { namespace sidebar {
8645da7d5eSAndre Fischer
Instance(void)8745da7d5eSAndre Fischer CommandInfoProvider& CommandInfoProvider::Instance (void)
8845da7d5eSAndre Fischer {
8945da7d5eSAndre Fischer static CommandInfoProvider aProvider;
9045da7d5eSAndre Fischer return aProvider;
9145da7d5eSAndre Fischer }
9245da7d5eSAndre Fischer
9345da7d5eSAndre Fischer
9445da7d5eSAndre Fischer
9545da7d5eSAndre Fischer
CommandInfoProvider(void)9645da7d5eSAndre Fischer CommandInfoProvider::CommandInfoProvider (void)
9745da7d5eSAndre Fischer : mxServiceFactory(comphelper::getProcessServiceFactory()),
9845da7d5eSAndre Fischer mxCachedDataFrame(),
9945da7d5eSAndre Fischer mxCachedDocumentAcceleratorConfiguration(),
10045da7d5eSAndre Fischer mxCachedModuleAcceleratorConfiguration(),
10145da7d5eSAndre Fischer mxCachedGlobalAcceleratorConfiguration(),
10245da7d5eSAndre Fischer msCachedModuleIdentifier(),
10345da7d5eSAndre Fischer mxFrameListener()
10445da7d5eSAndre Fischer {
10545da7d5eSAndre Fischer }
10645da7d5eSAndre Fischer
10745da7d5eSAndre Fischer
10845da7d5eSAndre Fischer
10945da7d5eSAndre Fischer
~CommandInfoProvider(void)11045da7d5eSAndre Fischer CommandInfoProvider::~CommandInfoProvider (void)
11145da7d5eSAndre Fischer {
11245da7d5eSAndre Fischer if (mxFrameListener.is())
11345da7d5eSAndre Fischer {
11445da7d5eSAndre Fischer mxFrameListener->dispose();
11545da7d5eSAndre Fischer mxFrameListener = NULL;
11645da7d5eSAndre Fischer }
11745da7d5eSAndre Fischer }
11845da7d5eSAndre Fischer
11945da7d5eSAndre Fischer
12045da7d5eSAndre Fischer
12145da7d5eSAndre Fischer
GetLabelForCommand(const OUString & rsCommandName,const Reference<frame::XFrame> & rxFrame)12245da7d5eSAndre Fischer OUString CommandInfoProvider::GetLabelForCommand (
12345da7d5eSAndre Fischer const OUString& rsCommandName,
12445da7d5eSAndre Fischer const Reference<frame::XFrame>& rxFrame)
12545da7d5eSAndre Fischer {
12645da7d5eSAndre Fischer SetFrame(rxFrame);
12745da7d5eSAndre Fischer
12845da7d5eSAndre Fischer const OUString sLabel (GetCommandLabel(rsCommandName));
12945da7d5eSAndre Fischer const OUString sShortCut (GetCommandShortcut(rsCommandName));
13045da7d5eSAndre Fischer if (sShortCut.getLength() > 0)
13145da7d5eSAndre Fischer return sLabel + A2S(" (") + sShortCut + A2S(")");
13245da7d5eSAndre Fischer else
13345da7d5eSAndre Fischer return sLabel;
13445da7d5eSAndre Fischer }
13545da7d5eSAndre Fischer
13645da7d5eSAndre Fischer
13745da7d5eSAndre Fischer
13845da7d5eSAndre Fischer
SetFrame(const Reference<frame::XFrame> & rxFrame)13945da7d5eSAndre Fischer void CommandInfoProvider::SetFrame (const Reference<frame::XFrame>& rxFrame)
14045da7d5eSAndre Fischer {
14145da7d5eSAndre Fischer if (rxFrame != mxCachedDataFrame)
14245da7d5eSAndre Fischer {
14345da7d5eSAndre Fischer // Detach from the old frame.
14445da7d5eSAndre Fischer if (mxFrameListener.is())
14545da7d5eSAndre Fischer {
14645da7d5eSAndre Fischer mxFrameListener->dispose();
14745da7d5eSAndre Fischer mxFrameListener = NULL;
14845da7d5eSAndre Fischer }
14945da7d5eSAndre Fischer
15045da7d5eSAndre Fischer // Release objects that are tied to the old frame.
15145da7d5eSAndre Fischer mxCachedDocumentAcceleratorConfiguration = NULL;
15245da7d5eSAndre Fischer mxCachedModuleAcceleratorConfiguration = NULL;
15345da7d5eSAndre Fischer msCachedModuleIdentifier = OUString();
15445da7d5eSAndre Fischer mxCachedDataFrame = rxFrame;
15545da7d5eSAndre Fischer
15645da7d5eSAndre Fischer // Connect to the new frame.
15745da7d5eSAndre Fischer if (rxFrame.is())
15845da7d5eSAndre Fischer mxFrameListener = new FrameListener(*this, rxFrame);
15945da7d5eSAndre Fischer }
16045da7d5eSAndre Fischer }
16145da7d5eSAndre Fischer
16245da7d5eSAndre Fischer
16345da7d5eSAndre Fischer
16445da7d5eSAndre Fischer
GetDocumentAcceleratorConfiguration(void)16545da7d5eSAndre Fischer Reference<ui::XAcceleratorConfiguration> CommandInfoProvider::GetDocumentAcceleratorConfiguration (void)
16645da7d5eSAndre Fischer {
16745da7d5eSAndre Fischer if ( ! mxCachedDocumentAcceleratorConfiguration.is())
16845da7d5eSAndre Fischer {
16945da7d5eSAndre Fischer // Get the accelerator configuration for the document.
17045da7d5eSAndre Fischer if (mxCachedDataFrame.is())
17145da7d5eSAndre Fischer {
17245da7d5eSAndre Fischer Reference<frame::XController> xController = mxCachedDataFrame->getController();
17345da7d5eSAndre Fischer if (xController.is())
17445da7d5eSAndre Fischer {
17545da7d5eSAndre Fischer Reference<frame::XModel> xModel (xController->getModel());
17645da7d5eSAndre Fischer if (xModel.is())
17745da7d5eSAndre Fischer {
17845da7d5eSAndre Fischer Reference<ui::XUIConfigurationManagerSupplier> xSupplier (xModel, UNO_QUERY);
17945da7d5eSAndre Fischer if (xSupplier.is())
18045da7d5eSAndre Fischer {
18145da7d5eSAndre Fischer Reference<ui::XUIConfigurationManager> xConfigurationManager(
18245da7d5eSAndre Fischer xSupplier->getUIConfigurationManager(),
18345da7d5eSAndre Fischer UNO_QUERY);
18445da7d5eSAndre Fischer if (xConfigurationManager.is())
18545da7d5eSAndre Fischer {
18645da7d5eSAndre Fischer mxCachedDocumentAcceleratorConfiguration = Reference<ui::XAcceleratorConfiguration>(
18745da7d5eSAndre Fischer xConfigurationManager->getShortCutManager(),
18845da7d5eSAndre Fischer UNO_QUERY);
18945da7d5eSAndre Fischer }
19045da7d5eSAndre Fischer }
19145da7d5eSAndre Fischer }
19245da7d5eSAndre Fischer }
19345da7d5eSAndre Fischer }
19445da7d5eSAndre Fischer }
19545da7d5eSAndre Fischer return mxCachedDocumentAcceleratorConfiguration;
19645da7d5eSAndre Fischer }
19745da7d5eSAndre Fischer
19845da7d5eSAndre Fischer
19945da7d5eSAndre Fischer
20045da7d5eSAndre Fischer
GetModuleAcceleratorConfiguration(void)20145da7d5eSAndre Fischer Reference<ui::XAcceleratorConfiguration> CommandInfoProvider::GetModuleAcceleratorConfiguration (void)
20245da7d5eSAndre Fischer {
20345da7d5eSAndre Fischer if ( ! mxCachedModuleAcceleratorConfiguration.is())
20445da7d5eSAndre Fischer {
20545da7d5eSAndre Fischer try
20645da7d5eSAndre Fischer {
20745da7d5eSAndre Fischer Reference<ui::XModuleUIConfigurationManagerSupplier> xSupplier (
20845da7d5eSAndre Fischer mxServiceFactory->createInstance(A2S("com.sun.star.ui.ModuleUIConfigurationManagerSupplier")),
20945da7d5eSAndre Fischer UNO_QUERY);
21045da7d5eSAndre Fischer Reference<ui::XUIConfigurationManager> xManager (
21145da7d5eSAndre Fischer xSupplier->getUIConfigurationManager(GetModuleIdentifier()));
21245da7d5eSAndre Fischer if (xManager.is())
21345da7d5eSAndre Fischer {
21445da7d5eSAndre Fischer mxCachedModuleAcceleratorConfiguration = Reference<ui::XAcceleratorConfiguration>(
21545da7d5eSAndre Fischer xManager->getShortCutManager(),
21645da7d5eSAndre Fischer UNO_QUERY);
21745da7d5eSAndre Fischer }
21845da7d5eSAndre Fischer }
21945da7d5eSAndre Fischer catch (Exception&)
22045da7d5eSAndre Fischer {
22145da7d5eSAndre Fischer }
22245da7d5eSAndre Fischer }
22345da7d5eSAndre Fischer return mxCachedModuleAcceleratorConfiguration;
22445da7d5eSAndre Fischer }
22545da7d5eSAndre Fischer
22645da7d5eSAndre Fischer
22745da7d5eSAndre Fischer
22845da7d5eSAndre Fischer
GetGlobalAcceleratorConfiguration(void)22945da7d5eSAndre Fischer Reference<ui::XAcceleratorConfiguration> CommandInfoProvider::GetGlobalAcceleratorConfiguration (void)
23045da7d5eSAndre Fischer {
23145da7d5eSAndre Fischer // Get the global accelerator configuration.
23245da7d5eSAndre Fischer if ( ! mxCachedGlobalAcceleratorConfiguration.is())
23345da7d5eSAndre Fischer {
23445da7d5eSAndre Fischer mxCachedGlobalAcceleratorConfiguration = Reference<ui::XAcceleratorConfiguration>(
23545da7d5eSAndre Fischer mxServiceFactory->createInstance(A2S("com.sun.star.ui.GlobalAcceleratorConfiguration")),
23645da7d5eSAndre Fischer UNO_QUERY);
23745da7d5eSAndre Fischer }
23845da7d5eSAndre Fischer
23945da7d5eSAndre Fischer return mxCachedGlobalAcceleratorConfiguration;
24045da7d5eSAndre Fischer }
24145da7d5eSAndre Fischer
24245da7d5eSAndre Fischer
24345da7d5eSAndre Fischer
24445da7d5eSAndre Fischer
GetModuleIdentifier(void)24545da7d5eSAndre Fischer OUString CommandInfoProvider::GetModuleIdentifier (void)
24645da7d5eSAndre Fischer {
24745da7d5eSAndre Fischer if (msCachedModuleIdentifier.getLength() == 0)
24845da7d5eSAndre Fischer {
24945da7d5eSAndre Fischer Reference<frame::XModuleManager> xModuleManager (
25045da7d5eSAndre Fischer mxServiceFactory->createInstance(A2S("com.sun.star.frame.ModuleManager")),
25145da7d5eSAndre Fischer UNO_QUERY);
25245da7d5eSAndre Fischer if (xModuleManager.is())
25345da7d5eSAndre Fischer msCachedModuleIdentifier = xModuleManager->identify(mxCachedDataFrame);
25445da7d5eSAndre Fischer }
25545da7d5eSAndre Fischer return msCachedModuleIdentifier;
25645da7d5eSAndre Fischer }
25745da7d5eSAndre Fischer
25845da7d5eSAndre Fischer
25945da7d5eSAndre Fischer
26045da7d5eSAndre Fischer
GetCommandShortcut(const OUString & rsCommandName)26145da7d5eSAndre Fischer OUString CommandInfoProvider::GetCommandShortcut (const OUString& rsCommandName)
26245da7d5eSAndre Fischer {
26345da7d5eSAndre Fischer OUString sShortcut;
26445da7d5eSAndre Fischer
26545da7d5eSAndre Fischer sShortcut = RetrieveShortcutsFromConfiguration(GetDocumentAcceleratorConfiguration(), rsCommandName);
26645da7d5eSAndre Fischer if (sShortcut.getLength() > 0)
26745da7d5eSAndre Fischer return sShortcut;
26845da7d5eSAndre Fischer
26945da7d5eSAndre Fischer sShortcut = RetrieveShortcutsFromConfiguration(GetModuleAcceleratorConfiguration(), rsCommandName);
27045da7d5eSAndre Fischer if (sShortcut.getLength() > 0)
27145da7d5eSAndre Fischer return sShortcut;
27245da7d5eSAndre Fischer
27345da7d5eSAndre Fischer sShortcut = RetrieveShortcutsFromConfiguration(GetGlobalAcceleratorConfiguration(), rsCommandName);
27445da7d5eSAndre Fischer if (sShortcut.getLength() > 0)
27545da7d5eSAndre Fischer return sShortcut;
27645da7d5eSAndre Fischer
27745da7d5eSAndre Fischer return OUString();
27845da7d5eSAndre Fischer }
27945da7d5eSAndre Fischer
28045da7d5eSAndre Fischer
28145da7d5eSAndre Fischer
28245da7d5eSAndre Fischer
RetrieveShortcutsFromConfiguration(const Reference<ui::XAcceleratorConfiguration> & rxConfiguration,const OUString & rsCommandName)28345da7d5eSAndre Fischer OUString CommandInfoProvider::RetrieveShortcutsFromConfiguration(
28445da7d5eSAndre Fischer const Reference<ui::XAcceleratorConfiguration>& rxConfiguration,
28545da7d5eSAndre Fischer const OUString& rsCommandName)
28645da7d5eSAndre Fischer {
28745da7d5eSAndre Fischer if (rxConfiguration.is())
28845da7d5eSAndre Fischer {
28945da7d5eSAndre Fischer try
29045da7d5eSAndre Fischer {
29145da7d5eSAndre Fischer Sequence<OUString> aCommands(1);
29245da7d5eSAndre Fischer aCommands[0] = rsCommandName;
29345da7d5eSAndre Fischer
29445da7d5eSAndre Fischer Sequence<Any> aKeyCodes (rxConfiguration->getPreferredKeyEventsForCommandList(aCommands));
29545da7d5eSAndre Fischer if (aCommands.getLength() == 1)
29645da7d5eSAndre Fischer {
29745da7d5eSAndre Fischer css::awt::KeyEvent aKeyEvent;
29845da7d5eSAndre Fischer if (aKeyCodes[0] >>= aKeyEvent)
29945da7d5eSAndre Fischer {
30045da7d5eSAndre Fischer return svt::AcceleratorExecute::st_AWTKey2VCLKey(aKeyEvent).GetName();
30145da7d5eSAndre Fischer }
30245da7d5eSAndre Fischer }
30345da7d5eSAndre Fischer }
30445da7d5eSAndre Fischer catch (lang::IllegalArgumentException&)
30545da7d5eSAndre Fischer {
30645da7d5eSAndre Fischer }
30745da7d5eSAndre Fischer }
30845da7d5eSAndre Fischer return OUString();
30945da7d5eSAndre Fischer }
31045da7d5eSAndre Fischer
31145da7d5eSAndre Fischer
31245da7d5eSAndre Fischer
31345da7d5eSAndre Fischer
GetCommandProperties(const OUString & rsCommandName)31445da7d5eSAndre Fischer Sequence<beans::PropertyValue> CommandInfoProvider::GetCommandProperties (const OUString& rsCommandName)
31545da7d5eSAndre Fischer {
31645da7d5eSAndre Fischer Sequence<beans::PropertyValue> aProperties;
31745da7d5eSAndre Fischer
31845da7d5eSAndre Fischer try
31945da7d5eSAndre Fischer {
32045da7d5eSAndre Fischer const OUString sModuleIdentifier (GetModuleIdentifier());
32145da7d5eSAndre Fischer if (sModuleIdentifier.getLength() > 0)
32245da7d5eSAndre Fischer {
32345da7d5eSAndre Fischer Reference<container::XNameAccess> xNameAccess (
32445da7d5eSAndre Fischer mxServiceFactory->createInstance(
32545da7d5eSAndre Fischer OUString::createFromAscii("com.sun.star.frame.UICommandDescription")),
32645da7d5eSAndre Fischer UNO_QUERY);
32745da7d5eSAndre Fischer Reference<container::XNameAccess> xUICommandLabels;
32845da7d5eSAndre Fischer if (xNameAccess.is())
32945da7d5eSAndre Fischer if (xNameAccess->getByName(sModuleIdentifier) >>= xUICommandLabels)
33045da7d5eSAndre Fischer xUICommandLabels->getByName(rsCommandName) >>= aProperties;
33145da7d5eSAndre Fischer }
33245da7d5eSAndre Fischer }
33345da7d5eSAndre Fischer catch (Exception&)
33445da7d5eSAndre Fischer {
33545da7d5eSAndre Fischer }
33645da7d5eSAndre Fischer
33745da7d5eSAndre Fischer return aProperties;
33845da7d5eSAndre Fischer }
33945da7d5eSAndre Fischer
34045da7d5eSAndre Fischer
34145da7d5eSAndre Fischer
34245da7d5eSAndre Fischer
GetCommandLabel(const OUString & rsCommandName)34345da7d5eSAndre Fischer OUString CommandInfoProvider::GetCommandLabel (const OUString& rsCommandName)
34445da7d5eSAndre Fischer {
34545da7d5eSAndre Fischer const Sequence<beans::PropertyValue> aProperties (GetCommandProperties(rsCommandName));
34645da7d5eSAndre Fischer for (sal_Int32 nIndex=0; nIndex<aProperties.getLength(); ++nIndex)
34745da7d5eSAndre Fischer {
34845da7d5eSAndre Fischer if (aProperties[nIndex].Name.equalsAscii("Name"))
34945da7d5eSAndre Fischer {
35045da7d5eSAndre Fischer OUString sLabel;
35145da7d5eSAndre Fischer aProperties[nIndex].Value >>= sLabel;
35245da7d5eSAndre Fischer return sLabel;
35345da7d5eSAndre Fischer }
35445da7d5eSAndre Fischer }
35545da7d5eSAndre Fischer return OUString();
35645da7d5eSAndre Fischer }
35745da7d5eSAndre Fischer
35845da7d5eSAndre Fischer
35945da7d5eSAndre Fischer } } // end of namespace sfx2/framework
360