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 742 : FrameListener (sfx2::sidebar::CommandInfoProvider& rInfoProvider, const Reference<frame::XFrame>& rxFrame)
49 : : FrameListenerInterfaceBase(m_aMutex),
50 : mrInfoProvider(rInfoProvider),
51 742 : mxFrame(rxFrame)
52 : {
53 742 : if (mxFrame.is())
54 742 : mxFrame->addEventListener(this);
55 742 : }
56 1484 : virtual ~FrameListener (void)
57 742 : {
58 1484 : }
59 742 : virtual void SAL_CALL disposing (void) SAL_OVERRIDE
60 : {
61 742 : if (mxFrame.is())
62 742 : mxFrame->removeEventListener(this);
63 742 : }
64 728 : virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent)
65 : throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE
66 : {
67 : (void)rEvent;
68 728 : mrInfoProvider.SetFrame(NULL);
69 728 : mxFrame = NULL;
70 728 : }
71 :
72 : private:
73 : sfx2::sidebar::CommandInfoProvider& mrInfoProvider;
74 : Reference<frame::XFrame> mxFrame;
75 : };
76 : }
77 :
78 :
79 :
80 : namespace sfx2 { namespace sidebar {
81 :
82 22144 : CommandInfoProvider& CommandInfoProvider::Instance (void)
83 : {
84 22144 : static CommandInfoProvider aProvider;
85 22144 : return aProvider;
86 : }
87 :
88 :
89 :
90 :
91 34 : CommandInfoProvider::CommandInfoProvider (void)
92 : : mxContext(comphelper::getProcessComponentContext()),
93 : mxCachedDataFrame(),
94 : mxCachedDocumentAcceleratorConfiguration(),
95 : mxCachedModuleAcceleratorConfiguration(),
96 : mxCachedGlobalAcceleratorConfiguration(),
97 : msCachedModuleIdentifier(),
98 34 : mxFrameListener()
99 : {
100 34 : }
101 :
102 :
103 :
104 :
105 68 : CommandInfoProvider::~CommandInfoProvider (void)
106 : {
107 34 : if (mxFrameListener.is())
108 : {
109 0 : mxFrameListener->dispose();
110 0 : mxFrameListener = NULL;
111 : }
112 34 : }
113 :
114 :
115 :
116 :
117 22144 : OUString CommandInfoProvider::GetLabelForCommand (
118 : const OUString& rsCommandName,
119 : const Reference<frame::XFrame>& rxFrame)
120 : {
121 22144 : SetFrame(rxFrame);
122 :
123 22144 : const OUString sLabel (GetCommandLabel(rsCommandName));
124 44288 : const OUString sShortCut (GetCommandShortcut(rsCommandName));
125 22144 : if (sShortCut.getLength() > 0)
126 0 : return sLabel + " (" + sShortCut + ")";
127 : else
128 44288 : return sLabel;
129 : }
130 :
131 :
132 :
133 :
134 22872 : void CommandInfoProvider::SetFrame (const Reference<frame::XFrame>& rxFrame)
135 : {
136 22872 : if (rxFrame != mxCachedDataFrame)
137 : {
138 : // Detach from the old frame.
139 1470 : if (mxFrameListener.is())
140 : {
141 742 : mxFrameListener->dispose();
142 742 : mxFrameListener = NULL;
143 : }
144 :
145 : // Release objects that are tied to the old frame.
146 1470 : mxCachedDocumentAcceleratorConfiguration = NULL;
147 1470 : mxCachedModuleAcceleratorConfiguration = NULL;
148 1470 : msCachedModuleIdentifier = OUString();
149 1470 : mxCachedDataFrame = rxFrame;
150 :
151 : // Connect to the new frame.
152 1470 : if (rxFrame.is())
153 742 : mxFrameListener = new FrameListener(*this, rxFrame);
154 : }
155 22872 : }
156 :
157 :
158 :
159 :
160 22144 : Reference<ui::XAcceleratorConfiguration> CommandInfoProvider::GetDocumentAcceleratorConfiguration (void)
161 : {
162 22144 : if ( ! mxCachedDocumentAcceleratorConfiguration.is())
163 : {
164 : // Get the accelerator configuration for the document.
165 742 : if (mxCachedDataFrame.is())
166 : {
167 742 : Reference<frame::XController> xController = mxCachedDataFrame->getController();
168 742 : if (xController.is())
169 : {
170 742 : Reference<frame::XModel> xModel (xController->getModel());
171 742 : if (xModel.is())
172 : {
173 742 : Reference<ui::XUIConfigurationManagerSupplier> xSupplier (xModel, UNO_QUERY);
174 742 : if (xSupplier.is())
175 : {
176 : Reference<ui::XUIConfigurationManager> xConfigurationManager(
177 742 : xSupplier->getUIConfigurationManager(),
178 742 : UNO_QUERY);
179 742 : if (xConfigurationManager.is())
180 : {
181 742 : mxCachedDocumentAcceleratorConfiguration = xConfigurationManager->getShortCutManager();
182 742 : }
183 742 : }
184 742 : }
185 742 : }
186 : }
187 : }
188 22144 : return mxCachedDocumentAcceleratorConfiguration;
189 : }
190 :
191 :
192 :
193 :
194 22144 : Reference<ui::XAcceleratorConfiguration> CommandInfoProvider::GetModuleAcceleratorConfiguration (void)
195 : {
196 22144 : if ( ! mxCachedModuleAcceleratorConfiguration.is())
197 : {
198 : try
199 : {
200 742 : Reference<ui::XModuleUIConfigurationManagerSupplier> xSupplier = ui::theModuleUIConfigurationManagerSupplier::get(mxContext);
201 : Reference<ui::XUIConfigurationManager> xManager (
202 1484 : xSupplier->getUIConfigurationManager(GetModuleIdentifier()));
203 742 : if (xManager.is())
204 : {
205 742 : mxCachedModuleAcceleratorConfiguration = xManager->getShortCutManager();
206 742 : }
207 : }
208 0 : catch (Exception&)
209 : {
210 : }
211 : }
212 22144 : return mxCachedModuleAcceleratorConfiguration;
213 : }
214 :
215 :
216 :
217 :
218 22144 : Reference<ui::XAcceleratorConfiguration> CommandInfoProvider::GetGlobalAcceleratorConfiguration (void)
219 : {
220 : // Get the global accelerator configuration.
221 22144 : if ( ! mxCachedGlobalAcceleratorConfiguration.is())
222 : {
223 34 : mxCachedGlobalAcceleratorConfiguration = ui::GlobalAcceleratorConfiguration::create(mxContext);
224 : }
225 :
226 22144 : return mxCachedGlobalAcceleratorConfiguration;
227 : }
228 :
229 :
230 :
231 :
232 22886 : OUString CommandInfoProvider::GetModuleIdentifier (void)
233 : {
234 22886 : if (msCachedModuleIdentifier.getLength() == 0)
235 : {
236 742 : Reference<frame::XModuleManager2> xModuleManager = frame::ModuleManager::create(mxContext);
237 742 : msCachedModuleIdentifier = xModuleManager->identify(mxCachedDataFrame);
238 : }
239 22886 : return msCachedModuleIdentifier;
240 : }
241 :
242 :
243 :
244 :
245 22144 : OUString CommandInfoProvider::GetCommandShortcut (const OUString& rsCommandName)
246 : {
247 22144 : OUString sShortcut;
248 :
249 22144 : sShortcut = RetrieveShortcutsFromConfiguration(GetDocumentAcceleratorConfiguration(), rsCommandName);
250 22144 : if (sShortcut.getLength() > 0)
251 0 : return sShortcut;
252 :
253 22144 : sShortcut = RetrieveShortcutsFromConfiguration(GetModuleAcceleratorConfiguration(), rsCommandName);
254 22144 : if (sShortcut.getLength() > 0)
255 0 : return sShortcut;
256 :
257 22144 : sShortcut = RetrieveShortcutsFromConfiguration(GetGlobalAcceleratorConfiguration(), rsCommandName);
258 22144 : if (sShortcut.getLength() > 0)
259 0 : return sShortcut;
260 :
261 22144 : return OUString();
262 : }
263 :
264 :
265 :
266 :
267 66432 : OUString CommandInfoProvider::RetrieveShortcutsFromConfiguration(
268 : const Reference<ui::XAcceleratorConfiguration>& rxConfiguration,
269 : const OUString& rsCommandName)
270 : {
271 66432 : if (rxConfiguration.is())
272 : {
273 : try
274 : {
275 66432 : Sequence<OUString> aCommands(1);
276 66432 : aCommands[0] = rsCommandName;
277 :
278 132864 : Sequence<Any> aKeyCodes (rxConfiguration->getPreferredKeyEventsForCommandList(aCommands));
279 66432 : if (aCommands.getLength() == 1)
280 : {
281 66432 : css::awt::KeyEvent aKeyEvent;
282 66432 : if (aKeyCodes[0] >>= aKeyEvent)
283 : {
284 0 : return svt::AcceleratorExecute::st_AWTKey2VCLKey(aKeyEvent).GetName();
285 66432 : }
286 66432 : }
287 : }
288 0 : catch (lang::IllegalArgumentException&)
289 : {
290 : }
291 : }
292 66432 : return OUString();
293 : }
294 :
295 :
296 :
297 :
298 22144 : Sequence<beans::PropertyValue> CommandInfoProvider::GetCommandProperties (const OUString& rsCommandName)
299 : {
300 22144 : Sequence<beans::PropertyValue> aProperties;
301 :
302 : try
303 : {
304 22144 : const OUString sModuleIdentifier (GetModuleIdentifier());
305 22144 : if (sModuleIdentifier.getLength() > 0)
306 : {
307 22144 : Reference<container::XNameAccess> xNameAccess = frame::theUICommandDescription::get(mxContext);
308 44288 : Reference<container::XNameAccess> xUICommandLabels;
309 22144 : if (xNameAccess->getByName(sModuleIdentifier) >>= xUICommandLabels)
310 44288 : xUICommandLabels->getByName(rsCommandName) >>= aProperties;
311 22144 : }
312 : }
313 0 : catch (Exception&)
314 : {
315 : }
316 :
317 22144 : return aProperties;
318 : }
319 :
320 :
321 :
322 :
323 22144 : OUString CommandInfoProvider::GetCommandLabel (const OUString& rsCommandName)
324 : {
325 22144 : const Sequence<beans::PropertyValue> aProperties (GetCommandProperties(rsCommandName));
326 44288 : for (sal_Int32 nIndex=0; nIndex<aProperties.getLength(); ++nIndex)
327 : {
328 44288 : if (aProperties[nIndex].Name.equalsAscii("Name"))
329 : {
330 22144 : OUString sLabel;
331 22144 : aProperties[nIndex].Value >>= sLabel;
332 22144 : return sLabel;
333 : }
334 : }
335 0 : return OUString();
336 : }
337 :
338 :
339 : } } // end of namespace sfx2/framework
340 :
341 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|