LCOV - code coverage report
Current view: top level - sfx2/source/sidebar - CommandInfoProvider.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 117 126 92.9 %
Date: 2015-06-13 12:38:46 Functions: 18 18 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <sfx2/sidebar/CommandInfoProvider.hxx>
      21             : 
      22             : #include <comphelper/processfactory.hxx>
      23             : #include <svtools/acceleratorexecute.hxx>
      24             : #include <cppuhelper/compbase1.hxx>
      25             : #include <cppuhelper/basemutex.hxx>
      26             : 
      27             : #include <com/sun/star/frame/ModuleManager.hpp>
      28             : #include <com/sun/star/frame/theUICommandDescription.hpp>
      29             : #include <com/sun/star/ui/GlobalAcceleratorConfiguration.hpp>
      30             : #include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
      31             : #include <com/sun/star/ui/theModuleUIConfigurationManagerSupplier.hpp>
      32             : 
      33             : using namespace css;
      34             : using namespace css::uno;
      35             : using ::rtl::OUString;
      36             : 
      37             : 
      38             : namespace
      39             : {
      40             :     typedef ::cppu::WeakComponentImplHelper1 <
      41             :         css::lang::XEventListener
      42             :         > FrameListenerInterfaceBase;
      43             :     class FrameListener
      44             :         : public ::cppu::BaseMutex,
      45             :           public FrameListenerInterfaceBase
      46             :     {
      47             :     public:
      48         538 :         FrameListener (sfx2::sidebar::CommandInfoProvider& rInfoProvider, const Reference<frame::XFrame>& rxFrame)
      49             :             : FrameListenerInterfaceBase(m_aMutex),
      50             :               mrInfoProvider(rInfoProvider),
      51         538 :               mxFrame(rxFrame)
      52             :         {
      53         538 :             if (mxFrame.is())
      54         538 :                 mxFrame->addEventListener(this);
      55         538 :         }
      56        1076 :         virtual ~FrameListener()
      57         538 :         {
      58        1076 :         }
      59         538 :         virtual void SAL_CALL disposing() SAL_OVERRIDE
      60             :         {
      61         538 :             if (mxFrame.is())
      62         538 :                 mxFrame->removeEventListener(this);
      63         538 :         }
      64         527 :         virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent)
      65             :             throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE
      66             :         {
      67             :             (void)rEvent;
      68         527 :             mrInfoProvider.SetFrame(NULL);
      69         527 :             mxFrame = NULL;
      70         527 :         }
      71             : 
      72             :     private:
      73             :         sfx2::sidebar::CommandInfoProvider& mrInfoProvider;
      74             :         Reference<frame::XFrame> mxFrame;
      75             :     };
      76             : }
      77             : 
      78             : namespace sfx2 { namespace sidebar {
      79             : 
      80       18859 : CommandInfoProvider& CommandInfoProvider::Instance()
      81             : {
      82       18859 :     static CommandInfoProvider aProvider;
      83       18859 :     return aProvider;
      84             : }
      85             : 
      86          40 : CommandInfoProvider::CommandInfoProvider()
      87             :     : mxContext(comphelper::getProcessComponentContext()),
      88             :       mxCachedDataFrame(),
      89             :       mxCachedDocumentAcceleratorConfiguration(),
      90             :       mxCachedModuleAcceleratorConfiguration(),
      91             :       mxCachedGlobalAcceleratorConfiguration(),
      92             :       msCachedModuleIdentifier(),
      93          40 :       mxFrameListener()
      94             : {
      95          40 : }
      96             : 
      97          80 : CommandInfoProvider::~CommandInfoProvider()
      98             : {
      99          40 :     if (mxFrameListener.is())
     100             :     {
     101           0 :         mxFrameListener->dispose();
     102           0 :         mxFrameListener = NULL;
     103             :     }
     104          40 : }
     105             : 
     106             : 
     107       18859 : OUString CommandInfoProvider::GetLabelForCommand (
     108             :     const OUString& rsCommandName,
     109             :     const Reference<frame::XFrame>& rxFrame)
     110             : {
     111       18859 :     SetFrame(rxFrame);
     112             : 
     113       18859 :     const OUString sLabel (GetCommandLabel(rsCommandName));
     114       37718 :     const OUString sShortCut (GetCommandShortcut(rsCommandName));
     115       18859 :     if (sShortCut.getLength() > 0)
     116           0 :         return sLabel + " (" + sShortCut + ")";
     117             :     else
     118       37718 :         return sLabel;
     119             : }
     120             : 
     121       19386 : void CommandInfoProvider::SetFrame (const Reference<frame::XFrame>& rxFrame)
     122             : {
     123       19386 :     if (rxFrame != mxCachedDataFrame)
     124             :     {
     125             :         // Detach from the old frame.
     126        1065 :         if (mxFrameListener.is())
     127             :         {
     128         538 :             mxFrameListener->dispose();
     129         538 :             mxFrameListener = NULL;
     130             :         }
     131             : 
     132             :         // Release objects that are tied to the old frame.
     133        1065 :         mxCachedDocumentAcceleratorConfiguration = NULL;
     134        1065 :         mxCachedModuleAcceleratorConfiguration = NULL;
     135        1065 :         msCachedModuleIdentifier.clear();
     136        1065 :         mxCachedDataFrame = rxFrame;
     137             : 
     138             :         // Connect to the new frame.
     139        1065 :         if (rxFrame.is())
     140         538 :             mxFrameListener = new FrameListener(*this, rxFrame);
     141             :     }
     142       19386 : }
     143             : 
     144       18859 : Reference<ui::XAcceleratorConfiguration> CommandInfoProvider::GetDocumentAcceleratorConfiguration()
     145             : {
     146       18859 :     if ( ! mxCachedDocumentAcceleratorConfiguration.is())
     147             :     {
     148             :         // Get the accelerator configuration for the document.
     149         538 :         if (mxCachedDataFrame.is())
     150             :         {
     151         538 :             Reference<frame::XController> xController = mxCachedDataFrame->getController();
     152         538 :             if (xController.is())
     153             :             {
     154         538 :                 Reference<frame::XModel> xModel (xController->getModel());
     155         538 :                 if (xModel.is())
     156             :                 {
     157         538 :                     Reference<ui::XUIConfigurationManagerSupplier> xSupplier (xModel, UNO_QUERY);
     158         538 :                     if (xSupplier.is())
     159             :                     {
     160             :                         Reference<ui::XUIConfigurationManager> xConfigurationManager(
     161         538 :                             xSupplier->getUIConfigurationManager(),
     162         538 :                             UNO_QUERY);
     163         538 :                         if (xConfigurationManager.is())
     164             :                         {
     165         538 :                             mxCachedDocumentAcceleratorConfiguration = xConfigurationManager->getShortCutManager();
     166         538 :                         }
     167         538 :                     }
     168         538 :                 }
     169         538 :             }
     170             :         }
     171             :     }
     172       18859 :     return mxCachedDocumentAcceleratorConfiguration;
     173             : }
     174             : 
     175       18859 : Reference<ui::XAcceleratorConfiguration> CommandInfoProvider::GetModuleAcceleratorConfiguration()
     176             : {
     177       18859 :     if ( ! mxCachedModuleAcceleratorConfiguration.is())
     178             :     {
     179             :         try
     180             :         {
     181         538 :             Reference<ui::XModuleUIConfigurationManagerSupplier> xSupplier  = ui::theModuleUIConfigurationManagerSupplier::get(mxContext);
     182             :             Reference<ui::XUIConfigurationManager> xManager (
     183        1076 :                 xSupplier->getUIConfigurationManager(GetModuleIdentifier()));
     184         538 :             if (xManager.is())
     185             :             {
     186         538 :                 mxCachedModuleAcceleratorConfiguration = xManager->getShortCutManager();
     187         538 :             }
     188             :         }
     189           0 :         catch (Exception&)
     190             :         {
     191             :         }
     192             :     }
     193       18859 :     return mxCachedModuleAcceleratorConfiguration;
     194             : }
     195             : 
     196       18859 : Reference<ui::XAcceleratorConfiguration> CommandInfoProvider::GetGlobalAcceleratorConfiguration()
     197             : {
     198             :     // Get the global accelerator configuration.
     199       18859 :     if ( ! mxCachedGlobalAcceleratorConfiguration.is())
     200             :     {
     201          40 :         mxCachedGlobalAcceleratorConfiguration = ui::GlobalAcceleratorConfiguration::create(mxContext);
     202             :     }
     203             : 
     204       18859 :     return mxCachedGlobalAcceleratorConfiguration;
     205             : }
     206             : 
     207       19397 : OUString CommandInfoProvider::GetModuleIdentifier()
     208             : {
     209       19397 :     if (msCachedModuleIdentifier.getLength() == 0)
     210             :     {
     211         538 :         Reference<frame::XModuleManager2> xModuleManager = frame::ModuleManager::create(mxContext);
     212         538 :         msCachedModuleIdentifier = xModuleManager->identify(mxCachedDataFrame);
     213             :     }
     214       19397 :     return msCachedModuleIdentifier;
     215             : }
     216             : 
     217       18859 : OUString CommandInfoProvider::GetCommandShortcut (const OUString& rsCommandName)
     218             : {
     219       18859 :     OUString sShortcut;
     220             : 
     221       18859 :     sShortcut = RetrieveShortcutsFromConfiguration(GetDocumentAcceleratorConfiguration(), rsCommandName);
     222       18859 :     if (sShortcut.getLength() > 0)
     223           0 :         return sShortcut;
     224             : 
     225       18859 :     sShortcut = RetrieveShortcutsFromConfiguration(GetModuleAcceleratorConfiguration(), rsCommandName);
     226       18859 :     if (sShortcut.getLength() > 0)
     227           0 :         return sShortcut;
     228             : 
     229       18859 :     sShortcut = RetrieveShortcutsFromConfiguration(GetGlobalAcceleratorConfiguration(), rsCommandName);
     230       18859 :     if (sShortcut.getLength() > 0)
     231           0 :         return sShortcut;
     232             : 
     233       18859 :     return OUString();
     234             : }
     235             : 
     236       56577 : OUString CommandInfoProvider::RetrieveShortcutsFromConfiguration(
     237             :     const Reference<ui::XAcceleratorConfiguration>& rxConfiguration,
     238             :     const OUString& rsCommandName)
     239             : {
     240       56577 :     if (rxConfiguration.is())
     241             :     {
     242             :         try
     243             :         {
     244       56577 :             Sequence<OUString> aCommands(1);
     245       56577 :             aCommands[0] = rsCommandName;
     246             : 
     247      113154 :             Sequence<Any> aKeyCodes (rxConfiguration->getPreferredKeyEventsForCommandList(aCommands));
     248       56577 :             if (aCommands.getLength() == 1)
     249             :             {
     250       56577 :                 css::awt::KeyEvent aKeyEvent;
     251       56577 :                 if (aKeyCodes[0] >>= aKeyEvent)
     252             :                 {
     253           0 :                     return svt::AcceleratorExecute::st_AWTKey2VCLKey(aKeyEvent).GetName();
     254       56577 :                 }
     255       56577 :             }
     256             :         }
     257           0 :         catch (lang::IllegalArgumentException&)
     258             :         {
     259             :         }
     260             :     }
     261       56577 :     return OUString();
     262             : }
     263             : 
     264       18859 : Sequence<beans::PropertyValue> CommandInfoProvider::GetCommandProperties (const OUString& rsCommandName)
     265             : {
     266       18859 :     Sequence<beans::PropertyValue> aProperties;
     267             : 
     268             :     try
     269             :     {
     270       18859 :         const OUString sModuleIdentifier (GetModuleIdentifier());
     271       18859 :         if (sModuleIdentifier.getLength() > 0)
     272             :         {
     273       18859 :             Reference<container::XNameAccess> xNameAccess  = frame::theUICommandDescription::get(mxContext);
     274       37718 :             Reference<container::XNameAccess> xUICommandLabels;
     275       18859 :             if (xNameAccess->getByName(sModuleIdentifier) >>= xUICommandLabels)
     276       37718 :                 xUICommandLabels->getByName(rsCommandName) >>= aProperties;
     277       18859 :         }
     278             :     }
     279         757 :     catch (Exception&)
     280             :     {
     281             :     }
     282             : 
     283       18859 :     return aProperties;
     284             : }
     285             : 
     286       18859 : OUString CommandInfoProvider::GetCommandLabel (const OUString& rsCommandName)
     287             : {
     288       18859 :     const Sequence<beans::PropertyValue> aProperties (GetCommandProperties(rsCommandName));
     289       36961 :     for (sal_Int32 nIndex=0; nIndex<aProperties.getLength(); ++nIndex)
     290             :     {
     291       36204 :         if (aProperties[nIndex].Name == "Name")
     292             :         {
     293       18102 :             OUString sLabel;
     294       18102 :             aProperties[nIndex].Value >>= sLabel;
     295       18102 :             return sLabel;
     296             :         }
     297             :     }
     298         757 :     return OUString();
     299             : }
     300             : 
     301             : } } // end of namespace sfx2/framework
     302             : 
     303             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11