1*45da7d5eSAndre Fischer /************************************************************** 2*45da7d5eSAndre Fischer * 3*45da7d5eSAndre Fischer * Licensed to the Apache Software Foundation (ASF) under one 4*45da7d5eSAndre Fischer * or more contributor license agreements. See the NOTICE file 5*45da7d5eSAndre Fischer * distributed with this work for additional information 6*45da7d5eSAndre Fischer * regarding copyright ownership. The ASF licenses this file 7*45da7d5eSAndre Fischer * to you under the Apache License, Version 2.0 (the 8*45da7d5eSAndre Fischer * "License"); you may not use this file except in compliance 9*45da7d5eSAndre Fischer * with the License. You may obtain a copy of the License at 10*45da7d5eSAndre Fischer * 11*45da7d5eSAndre Fischer * http://www.apache.org/licenses/LICENSE-2.0 12*45da7d5eSAndre Fischer * 13*45da7d5eSAndre Fischer * Unless required by applicable law or agreed to in writing, 14*45da7d5eSAndre Fischer * software distributed under the License is distributed on an 15*45da7d5eSAndre Fischer * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*45da7d5eSAndre Fischer * KIND, either express or implied. See the License for the 17*45da7d5eSAndre Fischer * specific language governing permissions and limitations 18*45da7d5eSAndre Fischer * under the License. 19*45da7d5eSAndre Fischer * 20*45da7d5eSAndre Fischer *************************************************************/ 21*45da7d5eSAndre Fischer 22*45da7d5eSAndre Fischer #include "precompiled_sfx2.hxx" 23*45da7d5eSAndre Fischer 24*45da7d5eSAndre Fischer #include "CommandInfoProvider.hxx" 25*45da7d5eSAndre Fischer 26*45da7d5eSAndre Fischer #include <comphelper/processfactory.hxx> 27*45da7d5eSAndre Fischer #include <svtools/acceleratorexecute.hxx> 28*45da7d5eSAndre Fischer #include <cppuhelper/compbase1.hxx> 29*45da7d5eSAndre Fischer #include <cppuhelper/basemutex.hxx> 30*45da7d5eSAndre Fischer 31*45da7d5eSAndre Fischer #include <com/sun/star/frame/XModuleManager.hpp> 32*45da7d5eSAndre Fischer #include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp> 33*45da7d5eSAndre Fischer #include <com/sun/star/ui/XModuleUIConfigurationManagerSupplier.hpp> 34*45da7d5eSAndre Fischer 35*45da7d5eSAndre Fischer using namespace css; 36*45da7d5eSAndre Fischer using namespace cssu; 37*45da7d5eSAndre Fischer using ::rtl::OUString; 38*45da7d5eSAndre Fischer 39*45da7d5eSAndre Fischer 40*45da7d5eSAndre Fischer #define A2S(s) rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(s)) 41*45da7d5eSAndre Fischer 42*45da7d5eSAndre Fischer 43*45da7d5eSAndre Fischer namespace 44*45da7d5eSAndre Fischer { 45*45da7d5eSAndre Fischer typedef ::cppu::WeakComponentImplHelper1 < 46*45da7d5eSAndre Fischer css::lang::XEventListener 47*45da7d5eSAndre Fischer > FrameListenerInterfaceBase; 48*45da7d5eSAndre Fischer class FrameListener 49*45da7d5eSAndre Fischer : public ::cppu::BaseMutex, 50*45da7d5eSAndre Fischer public FrameListenerInterfaceBase 51*45da7d5eSAndre Fischer { 52*45da7d5eSAndre Fischer public: 53*45da7d5eSAndre Fischer FrameListener (sfx2::sidebar::CommandInfoProvider& rInfoProvider, const Reference<frame::XFrame>& rxFrame) 54*45da7d5eSAndre Fischer : FrameListenerInterfaceBase(m_aMutex), 55*45da7d5eSAndre Fischer mrInfoProvider(rInfoProvider), 56*45da7d5eSAndre Fischer mxFrame(rxFrame) 57*45da7d5eSAndre Fischer { 58*45da7d5eSAndre Fischer if (mxFrame.is()) 59*45da7d5eSAndre Fischer mxFrame->addEventListener(this); 60*45da7d5eSAndre Fischer } 61*45da7d5eSAndre Fischer virtual ~FrameListener (void) 62*45da7d5eSAndre Fischer { 63*45da7d5eSAndre Fischer } 64*45da7d5eSAndre Fischer virtual void SAL_CALL disposing (void) 65*45da7d5eSAndre Fischer { 66*45da7d5eSAndre Fischer if (mxFrame.is()) 67*45da7d5eSAndre Fischer mxFrame->removeEventListener(this); 68*45da7d5eSAndre Fischer } 69*45da7d5eSAndre Fischer virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) 70*45da7d5eSAndre Fischer throw (cssu::RuntimeException) 71*45da7d5eSAndre Fischer { 72*45da7d5eSAndre Fischer (void)rEvent; 73*45da7d5eSAndre Fischer mrInfoProvider.SetFrame(NULL); 74*45da7d5eSAndre Fischer mxFrame = NULL; 75*45da7d5eSAndre Fischer } 76*45da7d5eSAndre Fischer 77*45da7d5eSAndre Fischer private: 78*45da7d5eSAndre Fischer sfx2::sidebar::CommandInfoProvider& mrInfoProvider; 79*45da7d5eSAndre Fischer Reference<frame::XFrame> mxFrame; 80*45da7d5eSAndre Fischer }; 81*45da7d5eSAndre Fischer } 82*45da7d5eSAndre Fischer 83*45da7d5eSAndre Fischer 84*45da7d5eSAndre Fischer 85*45da7d5eSAndre Fischer namespace sfx2 { namespace sidebar { 86*45da7d5eSAndre Fischer 87*45da7d5eSAndre Fischer CommandInfoProvider& CommandInfoProvider::Instance (void) 88*45da7d5eSAndre Fischer { 89*45da7d5eSAndre Fischer static CommandInfoProvider aProvider; 90*45da7d5eSAndre Fischer return aProvider; 91*45da7d5eSAndre Fischer } 92*45da7d5eSAndre Fischer 93*45da7d5eSAndre Fischer 94*45da7d5eSAndre Fischer 95*45da7d5eSAndre Fischer 96*45da7d5eSAndre Fischer CommandInfoProvider::CommandInfoProvider (void) 97*45da7d5eSAndre Fischer : mxServiceFactory(comphelper::getProcessServiceFactory()), 98*45da7d5eSAndre Fischer mxCachedDataFrame(), 99*45da7d5eSAndre Fischer mxCachedDocumentAcceleratorConfiguration(), 100*45da7d5eSAndre Fischer mxCachedModuleAcceleratorConfiguration(), 101*45da7d5eSAndre Fischer mxCachedGlobalAcceleratorConfiguration(), 102*45da7d5eSAndre Fischer msCachedModuleIdentifier(), 103*45da7d5eSAndre Fischer mxFrameListener() 104*45da7d5eSAndre Fischer { 105*45da7d5eSAndre Fischer } 106*45da7d5eSAndre Fischer 107*45da7d5eSAndre Fischer 108*45da7d5eSAndre Fischer 109*45da7d5eSAndre Fischer 110*45da7d5eSAndre Fischer CommandInfoProvider::~CommandInfoProvider (void) 111*45da7d5eSAndre Fischer { 112*45da7d5eSAndre Fischer if (mxFrameListener.is()) 113*45da7d5eSAndre Fischer { 114*45da7d5eSAndre Fischer mxFrameListener->dispose(); 115*45da7d5eSAndre Fischer mxFrameListener = NULL; 116*45da7d5eSAndre Fischer } 117*45da7d5eSAndre Fischer } 118*45da7d5eSAndre Fischer 119*45da7d5eSAndre Fischer 120*45da7d5eSAndre Fischer 121*45da7d5eSAndre Fischer 122*45da7d5eSAndre Fischer OUString CommandInfoProvider::GetLabelForCommand ( 123*45da7d5eSAndre Fischer const OUString& rsCommandName, 124*45da7d5eSAndre Fischer const Reference<frame::XFrame>& rxFrame) 125*45da7d5eSAndre Fischer { 126*45da7d5eSAndre Fischer SetFrame(rxFrame); 127*45da7d5eSAndre Fischer 128*45da7d5eSAndre Fischer const OUString sLabel (GetCommandLabel(rsCommandName)); 129*45da7d5eSAndre Fischer const OUString sShortCut (GetCommandShortcut(rsCommandName)); 130*45da7d5eSAndre Fischer if (sShortCut.getLength() > 0) 131*45da7d5eSAndre Fischer return sLabel + A2S(" (") + sShortCut + A2S(")"); 132*45da7d5eSAndre Fischer else 133*45da7d5eSAndre Fischer return sLabel; 134*45da7d5eSAndre Fischer } 135*45da7d5eSAndre Fischer 136*45da7d5eSAndre Fischer 137*45da7d5eSAndre Fischer 138*45da7d5eSAndre Fischer 139*45da7d5eSAndre Fischer void CommandInfoProvider::SetFrame (const Reference<frame::XFrame>& rxFrame) 140*45da7d5eSAndre Fischer { 141*45da7d5eSAndre Fischer if (rxFrame != mxCachedDataFrame) 142*45da7d5eSAndre Fischer { 143*45da7d5eSAndre Fischer // Detach from the old frame. 144*45da7d5eSAndre Fischer if (mxFrameListener.is()) 145*45da7d5eSAndre Fischer { 146*45da7d5eSAndre Fischer mxFrameListener->dispose(); 147*45da7d5eSAndre Fischer mxFrameListener = NULL; 148*45da7d5eSAndre Fischer } 149*45da7d5eSAndre Fischer 150*45da7d5eSAndre Fischer // Release objects that are tied to the old frame. 151*45da7d5eSAndre Fischer mxCachedDocumentAcceleratorConfiguration = NULL; 152*45da7d5eSAndre Fischer mxCachedModuleAcceleratorConfiguration = NULL; 153*45da7d5eSAndre Fischer msCachedModuleIdentifier = OUString(); 154*45da7d5eSAndre Fischer mxCachedDataFrame = rxFrame; 155*45da7d5eSAndre Fischer 156*45da7d5eSAndre Fischer // Connect to the new frame. 157*45da7d5eSAndre Fischer if (rxFrame.is()) 158*45da7d5eSAndre Fischer mxFrameListener = new FrameListener(*this, rxFrame); 159*45da7d5eSAndre Fischer } 160*45da7d5eSAndre Fischer } 161*45da7d5eSAndre Fischer 162*45da7d5eSAndre Fischer 163*45da7d5eSAndre Fischer 164*45da7d5eSAndre Fischer 165*45da7d5eSAndre Fischer Reference<ui::XAcceleratorConfiguration> CommandInfoProvider::GetDocumentAcceleratorConfiguration (void) 166*45da7d5eSAndre Fischer { 167*45da7d5eSAndre Fischer if ( ! mxCachedDocumentAcceleratorConfiguration.is()) 168*45da7d5eSAndre Fischer { 169*45da7d5eSAndre Fischer // Get the accelerator configuration for the document. 170*45da7d5eSAndre Fischer if (mxCachedDataFrame.is()) 171*45da7d5eSAndre Fischer { 172*45da7d5eSAndre Fischer Reference<frame::XController> xController = mxCachedDataFrame->getController(); 173*45da7d5eSAndre Fischer if (xController.is()) 174*45da7d5eSAndre Fischer { 175*45da7d5eSAndre Fischer Reference<frame::XModel> xModel (xController->getModel()); 176*45da7d5eSAndre Fischer if (xModel.is()) 177*45da7d5eSAndre Fischer { 178*45da7d5eSAndre Fischer Reference<ui::XUIConfigurationManagerSupplier> xSupplier (xModel, UNO_QUERY); 179*45da7d5eSAndre Fischer if (xSupplier.is()) 180*45da7d5eSAndre Fischer { 181*45da7d5eSAndre Fischer Reference<ui::XUIConfigurationManager> xConfigurationManager( 182*45da7d5eSAndre Fischer xSupplier->getUIConfigurationManager(), 183*45da7d5eSAndre Fischer UNO_QUERY); 184*45da7d5eSAndre Fischer if (xConfigurationManager.is()) 185*45da7d5eSAndre Fischer { 186*45da7d5eSAndre Fischer mxCachedDocumentAcceleratorConfiguration = Reference<ui::XAcceleratorConfiguration>( 187*45da7d5eSAndre Fischer xConfigurationManager->getShortCutManager(), 188*45da7d5eSAndre Fischer UNO_QUERY); 189*45da7d5eSAndre Fischer } 190*45da7d5eSAndre Fischer } 191*45da7d5eSAndre Fischer } 192*45da7d5eSAndre Fischer } 193*45da7d5eSAndre Fischer } 194*45da7d5eSAndre Fischer } 195*45da7d5eSAndre Fischer return mxCachedDocumentAcceleratorConfiguration; 196*45da7d5eSAndre Fischer } 197*45da7d5eSAndre Fischer 198*45da7d5eSAndre Fischer 199*45da7d5eSAndre Fischer 200*45da7d5eSAndre Fischer 201*45da7d5eSAndre Fischer Reference<ui::XAcceleratorConfiguration> CommandInfoProvider::GetModuleAcceleratorConfiguration (void) 202*45da7d5eSAndre Fischer { 203*45da7d5eSAndre Fischer if ( ! mxCachedModuleAcceleratorConfiguration.is()) 204*45da7d5eSAndre Fischer { 205*45da7d5eSAndre Fischer try 206*45da7d5eSAndre Fischer { 207*45da7d5eSAndre Fischer Reference<ui::XModuleUIConfigurationManagerSupplier> xSupplier ( 208*45da7d5eSAndre Fischer mxServiceFactory->createInstance(A2S("com.sun.star.ui.ModuleUIConfigurationManagerSupplier")), 209*45da7d5eSAndre Fischer UNO_QUERY); 210*45da7d5eSAndre Fischer Reference<ui::XUIConfigurationManager> xManager ( 211*45da7d5eSAndre Fischer xSupplier->getUIConfigurationManager(GetModuleIdentifier())); 212*45da7d5eSAndre Fischer if (xManager.is()) 213*45da7d5eSAndre Fischer { 214*45da7d5eSAndre Fischer mxCachedModuleAcceleratorConfiguration = Reference<ui::XAcceleratorConfiguration>( 215*45da7d5eSAndre Fischer xManager->getShortCutManager(), 216*45da7d5eSAndre Fischer UNO_QUERY); 217*45da7d5eSAndre Fischer } 218*45da7d5eSAndre Fischer } 219*45da7d5eSAndre Fischer catch (Exception&) 220*45da7d5eSAndre Fischer { 221*45da7d5eSAndre Fischer } 222*45da7d5eSAndre Fischer } 223*45da7d5eSAndre Fischer return mxCachedModuleAcceleratorConfiguration; 224*45da7d5eSAndre Fischer } 225*45da7d5eSAndre Fischer 226*45da7d5eSAndre Fischer 227*45da7d5eSAndre Fischer 228*45da7d5eSAndre Fischer 229*45da7d5eSAndre Fischer Reference<ui::XAcceleratorConfiguration> CommandInfoProvider::GetGlobalAcceleratorConfiguration (void) 230*45da7d5eSAndre Fischer { 231*45da7d5eSAndre Fischer // Get the global accelerator configuration. 232*45da7d5eSAndre Fischer if ( ! mxCachedGlobalAcceleratorConfiguration.is()) 233*45da7d5eSAndre Fischer { 234*45da7d5eSAndre Fischer mxCachedGlobalAcceleratorConfiguration = Reference<ui::XAcceleratorConfiguration>( 235*45da7d5eSAndre Fischer mxServiceFactory->createInstance(A2S("com.sun.star.ui.GlobalAcceleratorConfiguration")), 236*45da7d5eSAndre Fischer UNO_QUERY); 237*45da7d5eSAndre Fischer } 238*45da7d5eSAndre Fischer 239*45da7d5eSAndre Fischer return mxCachedGlobalAcceleratorConfiguration; 240*45da7d5eSAndre Fischer } 241*45da7d5eSAndre Fischer 242*45da7d5eSAndre Fischer 243*45da7d5eSAndre Fischer 244*45da7d5eSAndre Fischer 245*45da7d5eSAndre Fischer OUString CommandInfoProvider::GetModuleIdentifier (void) 246*45da7d5eSAndre Fischer { 247*45da7d5eSAndre Fischer if (msCachedModuleIdentifier.getLength() == 0) 248*45da7d5eSAndre Fischer { 249*45da7d5eSAndre Fischer Reference<frame::XModuleManager> xModuleManager ( 250*45da7d5eSAndre Fischer mxServiceFactory->createInstance(A2S("com.sun.star.frame.ModuleManager")), 251*45da7d5eSAndre Fischer UNO_QUERY); 252*45da7d5eSAndre Fischer if (xModuleManager.is()) 253*45da7d5eSAndre Fischer msCachedModuleIdentifier = xModuleManager->identify(mxCachedDataFrame); 254*45da7d5eSAndre Fischer } 255*45da7d5eSAndre Fischer return msCachedModuleIdentifier; 256*45da7d5eSAndre Fischer } 257*45da7d5eSAndre Fischer 258*45da7d5eSAndre Fischer 259*45da7d5eSAndre Fischer 260*45da7d5eSAndre Fischer 261*45da7d5eSAndre Fischer OUString CommandInfoProvider::GetCommandShortcut (const OUString& rsCommandName) 262*45da7d5eSAndre Fischer { 263*45da7d5eSAndre Fischer OUString sShortcut; 264*45da7d5eSAndre Fischer 265*45da7d5eSAndre Fischer sShortcut = RetrieveShortcutsFromConfiguration(GetDocumentAcceleratorConfiguration(), rsCommandName); 266*45da7d5eSAndre Fischer if (sShortcut.getLength() > 0) 267*45da7d5eSAndre Fischer return sShortcut; 268*45da7d5eSAndre Fischer 269*45da7d5eSAndre Fischer sShortcut = RetrieveShortcutsFromConfiguration(GetModuleAcceleratorConfiguration(), rsCommandName); 270*45da7d5eSAndre Fischer if (sShortcut.getLength() > 0) 271*45da7d5eSAndre Fischer return sShortcut; 272*45da7d5eSAndre Fischer 273*45da7d5eSAndre Fischer sShortcut = RetrieveShortcutsFromConfiguration(GetGlobalAcceleratorConfiguration(), rsCommandName); 274*45da7d5eSAndre Fischer if (sShortcut.getLength() > 0) 275*45da7d5eSAndre Fischer return sShortcut; 276*45da7d5eSAndre Fischer 277*45da7d5eSAndre Fischer return OUString(); 278*45da7d5eSAndre Fischer } 279*45da7d5eSAndre Fischer 280*45da7d5eSAndre Fischer 281*45da7d5eSAndre Fischer 282*45da7d5eSAndre Fischer 283*45da7d5eSAndre Fischer OUString CommandInfoProvider::RetrieveShortcutsFromConfiguration( 284*45da7d5eSAndre Fischer const Reference<ui::XAcceleratorConfiguration>& rxConfiguration, 285*45da7d5eSAndre Fischer const OUString& rsCommandName) 286*45da7d5eSAndre Fischer { 287*45da7d5eSAndre Fischer if (rxConfiguration.is()) 288*45da7d5eSAndre Fischer { 289*45da7d5eSAndre Fischer try 290*45da7d5eSAndre Fischer { 291*45da7d5eSAndre Fischer Sequence<OUString> aCommands(1); 292*45da7d5eSAndre Fischer aCommands[0] = rsCommandName; 293*45da7d5eSAndre Fischer 294*45da7d5eSAndre Fischer Sequence<Any> aKeyCodes (rxConfiguration->getPreferredKeyEventsForCommandList(aCommands)); 295*45da7d5eSAndre Fischer if (aCommands.getLength() == 1) 296*45da7d5eSAndre Fischer { 297*45da7d5eSAndre Fischer css::awt::KeyEvent aKeyEvent; 298*45da7d5eSAndre Fischer if (aKeyCodes[0] >>= aKeyEvent) 299*45da7d5eSAndre Fischer { 300*45da7d5eSAndre Fischer return svt::AcceleratorExecute::st_AWTKey2VCLKey(aKeyEvent).GetName(); 301*45da7d5eSAndre Fischer } 302*45da7d5eSAndre Fischer } 303*45da7d5eSAndre Fischer } 304*45da7d5eSAndre Fischer catch (lang::IllegalArgumentException&) 305*45da7d5eSAndre Fischer { 306*45da7d5eSAndre Fischer } 307*45da7d5eSAndre Fischer } 308*45da7d5eSAndre Fischer return OUString(); 309*45da7d5eSAndre Fischer } 310*45da7d5eSAndre Fischer 311*45da7d5eSAndre Fischer 312*45da7d5eSAndre Fischer 313*45da7d5eSAndre Fischer 314*45da7d5eSAndre Fischer Sequence<beans::PropertyValue> CommandInfoProvider::GetCommandProperties (const OUString& rsCommandName) 315*45da7d5eSAndre Fischer { 316*45da7d5eSAndre Fischer Sequence<beans::PropertyValue> aProperties; 317*45da7d5eSAndre Fischer 318*45da7d5eSAndre Fischer try 319*45da7d5eSAndre Fischer { 320*45da7d5eSAndre Fischer const OUString sModuleIdentifier (GetModuleIdentifier()); 321*45da7d5eSAndre Fischer if (sModuleIdentifier.getLength() > 0) 322*45da7d5eSAndre Fischer { 323*45da7d5eSAndre Fischer Reference<container::XNameAccess> xNameAccess ( 324*45da7d5eSAndre Fischer mxServiceFactory->createInstance( 325*45da7d5eSAndre Fischer OUString::createFromAscii("com.sun.star.frame.UICommandDescription")), 326*45da7d5eSAndre Fischer UNO_QUERY); 327*45da7d5eSAndre Fischer Reference<container::XNameAccess> xUICommandLabels; 328*45da7d5eSAndre Fischer if (xNameAccess.is()) 329*45da7d5eSAndre Fischer if (xNameAccess->getByName(sModuleIdentifier) >>= xUICommandLabels) 330*45da7d5eSAndre Fischer xUICommandLabels->getByName(rsCommandName) >>= aProperties; 331*45da7d5eSAndre Fischer } 332*45da7d5eSAndre Fischer } 333*45da7d5eSAndre Fischer catch (Exception&) 334*45da7d5eSAndre Fischer { 335*45da7d5eSAndre Fischer } 336*45da7d5eSAndre Fischer 337*45da7d5eSAndre Fischer return aProperties; 338*45da7d5eSAndre Fischer } 339*45da7d5eSAndre Fischer 340*45da7d5eSAndre Fischer 341*45da7d5eSAndre Fischer 342*45da7d5eSAndre Fischer 343*45da7d5eSAndre Fischer OUString CommandInfoProvider::GetCommandLabel (const OUString& rsCommandName) 344*45da7d5eSAndre Fischer { 345*45da7d5eSAndre Fischer const Sequence<beans::PropertyValue> aProperties (GetCommandProperties(rsCommandName)); 346*45da7d5eSAndre Fischer for (sal_Int32 nIndex=0; nIndex<aProperties.getLength(); ++nIndex) 347*45da7d5eSAndre Fischer { 348*45da7d5eSAndre Fischer if (aProperties[nIndex].Name.equalsAscii("Name")) 349*45da7d5eSAndre Fischer { 350*45da7d5eSAndre Fischer OUString sLabel; 351*45da7d5eSAndre Fischer aProperties[nIndex].Value >>= sLabel; 352*45da7d5eSAndre Fischer return sLabel; 353*45da7d5eSAndre Fischer } 354*45da7d5eSAndre Fischer } 355*45da7d5eSAndre Fischer return OUString(); 356*45da7d5eSAndre Fischer } 357*45da7d5eSAndre Fischer 358*45da7d5eSAndre Fischer 359*45da7d5eSAndre Fischer } } // end of namespace sfx2/framework 360