/* * 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 "sfx2/sidebar/CommandInfoProvider.hxx" #include #include #include #include #include #include #include using namespace css; using namespace cssu; using ::rtl::OUString; #define A2S(s) rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(s)) namespace { typedef ::cppu::WeakComponentImplHelper1 < css::lang::XEventListener > FrameListenerInterfaceBase; class FrameListener : public ::cppu::BaseMutex, public FrameListenerInterfaceBase { public: FrameListener (sfx2::sidebar::CommandInfoProvider& rInfoProvider, const Reference& rxFrame) : FrameListenerInterfaceBase(m_aMutex), mrInfoProvider(rInfoProvider), mxFrame(rxFrame) { if (mxFrame.is()) mxFrame->addEventListener(this); } virtual ~FrameListener (void) { } virtual void SAL_CALL disposing (void) { if (mxFrame.is()) mxFrame->removeEventListener(this); } virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) throw (cssu::RuntimeException) { (void)rEvent; mrInfoProvider.SetFrame(NULL); mxFrame = NULL; } private: sfx2::sidebar::CommandInfoProvider& mrInfoProvider; Reference mxFrame; }; } namespace sfx2 { namespace sidebar { CommandInfoProvider& CommandInfoProvider::Instance (void) { static CommandInfoProvider aProvider; return aProvider; } CommandInfoProvider::CommandInfoProvider (void) : mxServiceFactory(comphelper::getProcessServiceFactory()), mxCachedDataFrame(), mxCachedDocumentAcceleratorConfiguration(), mxCachedModuleAcceleratorConfiguration(), mxCachedGlobalAcceleratorConfiguration(), msCachedModuleIdentifier(), mxFrameListener() { } CommandInfoProvider::~CommandInfoProvider (void) { if (mxFrameListener.is()) { mxFrameListener->dispose(); mxFrameListener = NULL; } } OUString CommandInfoProvider::GetLabelForCommand ( const OUString& rsCommandName, const Reference& rxFrame) { SetFrame(rxFrame); const OUString sLabel (GetCommandLabel(rsCommandName)); const OUString sShortCut (GetCommandShortcut(rsCommandName)); if (sShortCut.getLength() > 0) return sLabel + A2S(" (") + sShortCut + A2S(")"); else return sLabel; } void CommandInfoProvider::SetFrame (const Reference& rxFrame) { if (rxFrame != mxCachedDataFrame) { // Detach from the old frame. if (mxFrameListener.is()) { mxFrameListener->dispose(); mxFrameListener = NULL; } // Release objects that are tied to the old frame. mxCachedDocumentAcceleratorConfiguration = NULL; mxCachedModuleAcceleratorConfiguration = NULL; msCachedModuleIdentifier = OUString(); mxCachedDataFrame = rxFrame; // Connect to the new frame. if (rxFrame.is()) mxFrameListener = new FrameListener(*this, rxFrame); } } Reference CommandInfoProvider::GetDocumentAcceleratorConfiguration (void) { if ( ! mxCachedDocumentAcceleratorConfiguration.is()) { // Get the accelerator configuration for the document. if (mxCachedDataFrame.is()) { Reference xController = mxCachedDataFrame->getController(); if (xController.is()) { Reference xModel (xController->getModel()); if (xModel.is()) { Reference xSupplier (xModel, UNO_QUERY); if (xSupplier.is()) { Reference xConfigurationManager( xSupplier->getUIConfigurationManager(), UNO_QUERY); if (xConfigurationManager.is()) { mxCachedDocumentAcceleratorConfiguration = Reference( xConfigurationManager->getShortCutManager(), UNO_QUERY); } } } } } } return mxCachedDocumentAcceleratorConfiguration; } Reference CommandInfoProvider::GetModuleAcceleratorConfiguration (void) { if ( ! mxCachedModuleAcceleratorConfiguration.is()) { try { Reference xSupplier ( mxServiceFactory->createInstance(A2S("com.sun.star.ui.ModuleUIConfigurationManagerSupplier")), UNO_QUERY); Reference xManager ( xSupplier->getUIConfigurationManager(GetModuleIdentifier())); if (xManager.is()) { mxCachedModuleAcceleratorConfiguration = Reference( xManager->getShortCutManager(), UNO_QUERY); } } catch (Exception&) { } } return mxCachedModuleAcceleratorConfiguration; } Reference CommandInfoProvider::GetGlobalAcceleratorConfiguration (void) { // Get the global accelerator configuration. if ( ! mxCachedGlobalAcceleratorConfiguration.is()) { mxCachedGlobalAcceleratorConfiguration = Reference( mxServiceFactory->createInstance(A2S("com.sun.star.ui.GlobalAcceleratorConfiguration")), UNO_QUERY); } return mxCachedGlobalAcceleratorConfiguration; } OUString CommandInfoProvider::GetModuleIdentifier (void) { if (msCachedModuleIdentifier.getLength() == 0) { Reference xModuleManager ( mxServiceFactory->createInstance(A2S("com.sun.star.frame.ModuleManager")), UNO_QUERY); if (xModuleManager.is()) msCachedModuleIdentifier = xModuleManager->identify(mxCachedDataFrame); } return msCachedModuleIdentifier; } OUString CommandInfoProvider::GetCommandShortcut (const OUString& rsCommandName) { OUString sShortcut; sShortcut = RetrieveShortcutsFromConfiguration(GetDocumentAcceleratorConfiguration(), rsCommandName); if (sShortcut.getLength() > 0) return sShortcut; sShortcut = RetrieveShortcutsFromConfiguration(GetModuleAcceleratorConfiguration(), rsCommandName); if (sShortcut.getLength() > 0) return sShortcut; sShortcut = RetrieveShortcutsFromConfiguration(GetGlobalAcceleratorConfiguration(), rsCommandName); if (sShortcut.getLength() > 0) return sShortcut; return OUString(); } OUString CommandInfoProvider::RetrieveShortcutsFromConfiguration( const Reference& rxConfiguration, const OUString& rsCommandName) { if (rxConfiguration.is()) { try { Sequence aCommands(1); aCommands[0] = rsCommandName; Sequence aKeyCodes (rxConfiguration->getPreferredKeyEventsForCommandList(aCommands)); if (aCommands.getLength() == 1) { css::awt::KeyEvent aKeyEvent; if (aKeyCodes[0] >>= aKeyEvent) { return svt::AcceleratorExecute::st_AWTKey2VCLKey(aKeyEvent).GetName(); } } } catch (lang::IllegalArgumentException&) { } } return OUString(); } Sequence CommandInfoProvider::GetCommandProperties (const OUString& rsCommandName) { Sequence aProperties; try { const OUString sModuleIdentifier (GetModuleIdentifier()); if (sModuleIdentifier.getLength() > 0) { Reference xNameAccess ( mxServiceFactory->createInstance( OUString::createFromAscii("com.sun.star.frame.UICommandDescription")), UNO_QUERY); Reference xUICommandLabels; if (xNameAccess.is()) if (xNameAccess->getByName(sModuleIdentifier) >>= xUICommandLabels) xUICommandLabels->getByName(rsCommandName) >>= aProperties; } } catch (Exception&) { } return aProperties; } OUString CommandInfoProvider::GetCommandLabel (const OUString& rsCommandName) { const Sequence aProperties (GetCommandProperties(rsCommandName)); for (sal_Int32 nIndex=0; nIndex>= sLabel; return sLabel; } } return OUString(); } } } // end of namespace sfx2/framework