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: 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 } 6145da7d5eSAndre Fischer virtual ~FrameListener (void) 6245da7d5eSAndre Fischer { 6345da7d5eSAndre Fischer } 6445da7d5eSAndre Fischer virtual void SAL_CALL disposing (void) 6545da7d5eSAndre Fischer { 6645da7d5eSAndre Fischer if (mxFrame.is()) 6745da7d5eSAndre Fischer mxFrame->removeEventListener(this); 6845da7d5eSAndre Fischer } 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 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 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 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 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 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 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 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 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 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 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 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 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 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