Line data Source code
1 : /*
2 : * This file is part of the LibreOffice project.
3 : *
4 : * This Source Code Form is subject to the terms of the Mozilla Public
5 : * License, v. 2.0. If a copy of the MPL was not distributed with this
6 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 : *
8 : * This file incorporates work covered by the following license notice:
9 : *
10 : * Licensed to the Apache Software Foundation (ASF) under one or more
11 : * contributor license agreements. See the NOTICE file distributed
12 : * with this work for additional information regarding copyright
13 : * ownership. The ASF licenses this file to you under the Apache
14 : * License, Version 2.0 (the "License"); you may not use this file
15 : * except in compliance with the License. You may obtain a copy of
16 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
17 : */
18 :
19 : #include <uielement/toolbarmanager.hxx>
20 :
21 : #include <uielement/generictoolbarcontroller.hxx>
22 : #include "services.h"
23 : #include "general.h"
24 : #include "properties.h"
25 : #include <framework/imageproducer.hxx>
26 : #include <framework/sfxhelperfunctions.hxx>
27 : #include <classes/fwkresid.hxx>
28 : #include <classes/resource.hrc>
29 : #include <framework/addonsoptions.hxx>
30 : #include <uielement/toolbarmerger.hxx>
31 :
32 : #include <com/sun/star/ui/ItemType.hpp>
33 : #include <com/sun/star/frame/XDispatchProvider.hpp>
34 : #include <com/sun/star/frame/theUICommandDescription.hpp>
35 : #include <com/sun/star/beans/XPropertySet.hpp>
36 : #include <com/sun/star/awt/XDockableWindow.hpp>
37 : #include <com/sun/star/frame/XLayoutManager.hpp>
38 : #include <com/sun/star/ui/DockingArea.hpp>
39 : #include <com/sun/star/graphic/XGraphic.hpp>
40 : #include <com/sun/star/lang/XMultiComponentFactory.hpp>
41 : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
42 : #include <com/sun/star/frame/ModuleManager.hpp>
43 : #include <com/sun/star/frame/theToolbarControllerFactory.hpp>
44 : #include <com/sun/star/ui/GlobalAcceleratorConfiguration.hpp>
45 : #include <com/sun/star/ui/XUIElementSettings.hpp>
46 : #include <com/sun/star/ui/XUIConfigurationPersistence.hpp>
47 : #include <com/sun/star/ui/theModuleUIConfigurationManagerSupplier.hpp>
48 : #include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
49 : #include <com/sun/star/ui/ImageType.hpp>
50 : #include <com/sun/star/ui/UIElementType.hpp>
51 : #include <comphelper/sequence.hxx>
52 : #include <com/sun/star/frame/status/Visibility.hpp>
53 : #include <com/sun/star/lang/DisposedException.hpp>
54 : #include <com/sun/star/util/URLTransformer.hpp>
55 :
56 : #include <svtools/imgdef.hxx>
57 : #include <svtools/toolboxcontroller.hxx>
58 : #include <unotools/cmdoptions.hxx>
59 : #include <toolkit/helper/vclunohelper.hxx>
60 : #include <unotools/mediadescriptor.hxx>
61 : #include <comphelper/processfactory.hxx>
62 : #include <svtools/miscopt.hxx>
63 : #include <svl/imageitm.hxx>
64 : #include <svtools/framestatuslistener.hxx>
65 : #include <vcl/svapp.hxx>
66 : #include <vcl/menu.hxx>
67 : #include <vcl/syswin.hxx>
68 : #include <vcl/taskpanelist.hxx>
69 : #include <vcl/toolbox.hxx>
70 : #include <vcl/settings.hxx>
71 :
72 : #include <svtools/menuoptions.hxx>
73 : #include <boost/bind.hpp>
74 : #include <svtools/acceleratorexecute.hxx>
75 :
76 : // namespaces
77 :
78 : using namespace ::com::sun::star::awt;
79 : using namespace ::com::sun::star::beans;
80 : using namespace ::com::sun::star::uno;
81 : using namespace ::com::sun::star::lang;
82 : using namespace ::com::sun::star::frame;
83 : using namespace ::com::sun::star::graphic;
84 : using namespace ::com::sun::star::util;
85 : using namespace ::com::sun::star::container;
86 : using namespace ::com::sun::star::ui;
87 : using namespace ::com::sun::star;
88 :
89 : namespace framework
90 : {
91 :
92 : static const char ITEM_DESCRIPTOR_COMMANDURL[] = "CommandURL";
93 : static const char ITEM_DESCRIPTOR_HELPURL[] = "HelpURL";
94 : static const char ITEM_DESCRIPTOR_TOOLTIP[] = "Tooltip";
95 : static const char ITEM_DESCRIPTOR_CONTAINER[] = "ItemDescriptorContainer";
96 : static const char ITEM_DESCRIPTOR_LABEL[] = "Label";
97 : static const char ITEM_DESCRIPTOR_TYPE[] = "Type";
98 : static const char ITEM_DESCRIPTOR_VISIBLE[] = "IsVisible";
99 : static const char ITEM_DESCRIPTOR_WIDTH[] = "Width";
100 : static const char ITEM_DESCRIPTOR_STYLE[] = "Style";
101 :
102 : static const char MENUPREFIX[] = "private:resource/menubar/";
103 :
104 : static const char HELPID_PREFIX_TESTTOOL[] = ".HelpId:";
105 :
106 : static const sal_uInt16 STARTID_CUSTOMIZE_POPUPMENU = 1000;
107 :
108 : class ImageOrientationListener : public svt::FrameStatusListener
109 : {
110 : public:
111 : ImageOrientationListener( const Reference< XStatusListener >& rReceiver,
112 : const Reference< XComponentContext >& rxContext,
113 : const Reference< XFrame >& rFrame );
114 : virtual ~ImageOrientationListener();
115 :
116 : virtual void SAL_CALL statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw ( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
117 :
118 : private:
119 : Reference< XStatusListener > m_xReceiver;
120 : };
121 :
122 1236 : ImageOrientationListener::ImageOrientationListener(
123 : const Reference< XStatusListener >& rReceiver,
124 : const Reference< XComponentContext >& rxContext,
125 : const Reference< XFrame >& rFrame ) :
126 : FrameStatusListener( rxContext, rFrame ),
127 1236 : m_xReceiver( rReceiver )
128 : {
129 1236 : }
130 :
131 2472 : ImageOrientationListener::~ImageOrientationListener()
132 : {
133 2472 : }
134 :
135 1913 : void SAL_CALL ImageOrientationListener::statusChanged( const FeatureStateEvent& Event )
136 : throw ( RuntimeException, std::exception )
137 : {
138 1913 : if ( m_xReceiver.is() )
139 1913 : m_xReceiver->statusChanged( Event );
140 1913 : }
141 :
142 1236 : static sal_Int16 getImageTypeFromBools( bool bBig )
143 : {
144 1236 : sal_Int16 n( 0 );
145 1236 : if ( bBig )
146 1 : n |= ::com::sun::star::ui::ImageType::SIZE_LARGE;
147 1236 : return n;
148 : }
149 :
150 0 : static ::com::sun::star::uno::Reference< ::com::sun::star::frame::XLayoutManager > getLayoutManagerFromFrame(
151 : ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame )
152 : {
153 0 : ::com::sun::star::uno::Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager;
154 :
155 0 : Reference< XPropertySet > xPropSet( rFrame, UNO_QUERY );
156 0 : if ( xPropSet.is() )
157 : {
158 : try
159 : {
160 0 : xPropSet->getPropertyValue("LayoutManager") >>= xLayoutManager;
161 : }
162 0 : catch (const RuntimeException&)
163 : {
164 0 : throw;
165 : }
166 0 : catch (const Exception&)
167 : {
168 : }
169 : }
170 :
171 0 : return xLayoutManager;
172 : }
173 :
174 : // XInterface, XTypeProvider, XServiceInfo
175 :
176 9522 : ToolBarManager::ToolBarManager( const Reference< XComponentContext >& rxContext,
177 : const Reference< XFrame >& rFrame,
178 : const OUString& rResourceName,
179 : ToolBox* pToolBar ) :
180 : m_bDisposed( false ),
181 19044 : m_bSmallSymbols( !SvtMiscOptions().AreCurrentSymbolsLarge() ),
182 : m_bModuleIdentified( false ),
183 : m_bAddedToTaskPaneList( true ),
184 : m_bFrameActionRegistered( false ),
185 : m_bUpdateControllers( false ),
186 : m_bImageOrientationRegistered( false ),
187 : m_bImageMirrored( false ),
188 : m_lImageRotation( 0 ),
189 : m_pToolBar( pToolBar ),
190 : m_aResourceName( rResourceName ),
191 : m_xFrame( rFrame ),
192 : m_aListenerContainer( m_mutex ),
193 : m_xContext( rxContext ),
194 : m_sIconTheme( SvtMiscOptions().GetIconTheme() ),
195 28566 : m_bAcceleratorCfg( false )
196 : {
197 : OSL_ASSERT( m_xContext.is() );
198 :
199 9522 : vcl::Window* pWindow = m_pToolBar;
200 28584 : while ( pWindow && !pWindow->IsSystemWindow() )
201 9540 : pWindow = pWindow->GetParent();
202 :
203 9522 : if ( pWindow )
204 9522 : static_cast<SystemWindow *>(pWindow)->GetTaskPaneList()->AddWindow( m_pToolBar );
205 :
206 9522 : m_xToolbarControllerFactory = frame::theToolbarControllerFactory::get( m_xContext );
207 9522 : m_xURLTransformer = URLTransformer::create( m_xContext );
208 :
209 9522 : m_pToolBar->SetSelectHdl( LINK( this, ToolBarManager, Select) );
210 9522 : m_pToolBar->SetClickHdl( LINK( this, ToolBarManager, Click ) );
211 9522 : m_pToolBar->SetDropdownClickHdl( LINK( this, ToolBarManager, DropdownClick ) );
212 9522 : m_pToolBar->SetDoubleClickHdl( LINK( this, ToolBarManager, DoubleClick ) );
213 9522 : m_pToolBar->SetStateChangedHdl( LINK( this, ToolBarManager, StateChanged ) );
214 9522 : m_pToolBar->SetDataChangedHdl( LINK( this, ToolBarManager, DataChanged ) );
215 9522 : m_pToolBar->SetToolboxButtonSize( m_bSmallSymbols ? TOOLBOX_BUTTONSIZE_SMALL : TOOLBOX_BUTTONSIZE_LARGE );
216 :
217 : // enables a menu for clipped items and customization
218 9522 : SvtCommandOptions aCmdOptions;
219 9522 : sal_uInt16 nMenuType = TOOLBOX_MENUTYPE_CLIPPEDITEMS;
220 9522 : if ( !aCmdOptions.Lookup( SvtCommandOptions::CMDOPTION_DISABLED, OUString("CreateDialog")))
221 9522 : nMenuType |= TOOLBOX_MENUTYPE_CUSTOMIZE;
222 :
223 9522 : m_pToolBar->SetCommandHdl( LINK( this, ToolBarManager, Command ) );
224 9522 : m_pToolBar->SetMenuType( nMenuType );
225 9522 : m_pToolBar->SetMenuButtonHdl( LINK( this, ToolBarManager, MenuButton ) );
226 :
227 : // set name for testtool, the useful part is after the last '/'
228 9522 : sal_Int32 idx = rResourceName.lastIndexOf('/');
229 9522 : idx++; // will become 0 if '/' not found: use full string
230 19044 : OString aHelpIdAsString( HELPID_PREFIX_TESTTOOL );
231 19044 : OUString aToolbarName = rResourceName.copy( idx );
232 9522 : aHelpIdAsString += OUStringToOString( aToolbarName, RTL_TEXTENCODING_UTF8 );;
233 9522 : m_pToolBar->SetHelpId( aHelpIdAsString );
234 :
235 9522 : m_aAsyncUpdateControllersTimer.SetTimeout( 50 );
236 9522 : m_aAsyncUpdateControllersTimer.SetTimeoutHdl( LINK( this, ToolBarManager, AsyncUpdateControllersHdl ) );
237 :
238 19044 : SvtMiscOptions().AddListenerLink( LINK( this, ToolBarManager, MiscOptionsChanged ) );
239 9522 : }
240 :
241 16263 : ToolBarManager::~ToolBarManager()
242 : {
243 : assert(!m_aAsyncUpdateControllersTimer.IsActive());
244 : OSL_ASSERT( !m_pToolBar );
245 : OSL_ASSERT( !m_bAddedToTaskPaneList );
246 16263 : }
247 :
248 9509 : void ToolBarManager::Destroy()
249 : {
250 : OSL_ASSERT( m_pToolBar != nullptr );
251 9509 : SolarMutexGuard g;
252 9509 : if ( m_bAddedToTaskPaneList )
253 : {
254 9509 : vcl::Window* pWindow = m_pToolBar;
255 35196 : while ( pWindow && !pWindow->IsSystemWindow() )
256 16178 : pWindow = pWindow->GetParent();
257 :
258 9509 : if ( pWindow )
259 9509 : static_cast<SystemWindow *>(pWindow)->GetTaskPaneList()->RemoveWindow( m_pToolBar );
260 9509 : m_bAddedToTaskPaneList = false;
261 : }
262 :
263 : // Delete the additional add-ons data
264 105546 : for ( sal_uInt16 i = 0; i < m_pToolBar->GetItemCount(); i++ )
265 : {
266 96037 : sal_uInt16 nItemId = m_pToolBar->GetItemId( i );
267 96037 : if ( nItemId > 0 )
268 80893 : delete static_cast< AddonsParams* >( m_pToolBar->GetItemData( nItemId ));
269 : }
270 :
271 : // Hide toolbar as lazy delete can destroy the toolbar much later.
272 9509 : m_pToolBar->Hide();
273 : /* #i99167# removed change for i93173 since there is some weird crash */
274 : // #i93173# delete toolbar lazily as we can still be in one of its handlers
275 9509 : m_pToolBar->doLazyDelete();
276 :
277 9509 : m_pToolBar->SetSelectHdl( Link<ToolBox *, void>() );
278 9509 : m_pToolBar->SetActivateHdl( Link<ToolBox *, void>() );
279 9509 : m_pToolBar->SetDeactivateHdl( Link<ToolBox *, void>() );
280 9509 : m_pToolBar->SetClickHdl( Link<ToolBox *, void>() );
281 9509 : m_pToolBar->SetDropdownClickHdl( Link<ToolBox *, void>() );
282 9509 : m_pToolBar->SetDoubleClickHdl( Link<ToolBox *, void>() );
283 9509 : m_pToolBar->SetStateChangedHdl( Link<StateChangedType const *, void>() );
284 9509 : m_pToolBar->SetDataChangedHdl( Link<DataChangedEvent const *, void>() );
285 9509 : m_pToolBar->SetCommandHdl( Link<CommandEvent const *, void>() );
286 :
287 9509 : m_pToolBar.clear();
288 :
289 9509 : SvtMiscOptions().RemoveListenerLink( LINK( this, ToolBarManager, MiscOptionsChanged ) );
290 9509 : }
291 :
292 59091 : ToolBox* ToolBarManager::GetToolBar() const
293 : {
294 59091 : SolarMutexGuard g;
295 59091 : return m_pToolBar;
296 : }
297 :
298 0 : void ToolBarManager::CheckAndUpdateImages()
299 : {
300 0 : SolarMutexGuard g;
301 0 : bool bRefreshImages = false;
302 :
303 0 : SvtMiscOptions aMiscOptions;
304 0 : bool bCurrentSymbolsSmall = !aMiscOptions.AreCurrentSymbolsLarge();
305 0 : if ( m_bSmallSymbols != bCurrentSymbolsSmall )
306 : {
307 0 : bRefreshImages = true;
308 0 : m_bSmallSymbols = bCurrentSymbolsSmall;
309 : }
310 :
311 0 : const OUString& sCurrentIconTheme = aMiscOptions.GetIconTheme();
312 0 : if ( m_sIconTheme != sCurrentIconTheme )
313 : {
314 0 : bRefreshImages = true;
315 0 : m_sIconTheme = sCurrentIconTheme;
316 : }
317 :
318 : // Refresh images if requested
319 0 : if ( bRefreshImages )
320 0 : RefreshImages();
321 0 : }
322 :
323 0 : void ToolBarManager::RefreshImages()
324 : {
325 0 : SolarMutexGuard g;
326 :
327 0 : bool bBigImages( SvtMiscOptions().AreCurrentSymbolsLarge() );
328 0 : for ( sal_uInt16 nPos = 0; nPos < m_pToolBar->GetItemCount(); nPos++ )
329 : {
330 0 : sal_uInt16 nId( m_pToolBar->GetItemId( nPos ) );
331 :
332 0 : if ( nId > 0 )
333 : {
334 0 : OUString aCommandURL = m_pToolBar->GetItemCommand( nId );
335 0 : Image aImage = GetImageFromURL( m_xFrame, aCommandURL, bBigImages );
336 : // Try also to query for add-on images before giving up and use an
337 : // empty image.
338 0 : if ( !aImage )
339 0 : aImage = QueryAddonsImage( aCommandURL, bBigImages );
340 0 : m_pToolBar->SetItemImage( nId, aImage );
341 : }
342 : }
343 :
344 0 : m_pToolBar->SetToolboxButtonSize( bBigImages ? TOOLBOX_BUTTONSIZE_LARGE : TOOLBOX_BUTTONSIZE_SMALL );
345 0 : ::Size aSize = m_pToolBar->CalcWindowSizePixel();
346 0 : m_pToolBar->SetOutputSizePixel( aSize );
347 0 : }
348 :
349 1913 : void ToolBarManager::UpdateImageOrientation()
350 : {
351 1913 : SolarMutexGuard g;
352 :
353 1913 : if ( m_xUICommandLabels.is() )
354 : {
355 : sal_Int32 i;
356 1913 : Sequence< OUString > aSeqMirrorCmd;
357 3826 : Sequence< OUString > aSeqRotateCmd;
358 1913 : m_xUICommandLabels->getByName(
359 1913 : OUString( UICOMMANDDESCRIPTION_NAMEACCESS_COMMANDMIRRORIMAGELIST )) >>= aSeqMirrorCmd;
360 1913 : m_xUICommandLabels->getByName(
361 1913 : OUString( UICOMMANDDESCRIPTION_NAMEACCESS_COMMANDROTATEIMAGELIST )) >>= aSeqRotateCmd;
362 :
363 1913 : CommandToInfoMap::iterator pIter;
364 53564 : for ( i = 0; i < aSeqMirrorCmd.getLength(); i++ )
365 : {
366 51651 : OUString aMirrorCmd = aSeqMirrorCmd[i];
367 51651 : pIter = m_aCommandMap.find( aMirrorCmd );
368 51651 : if ( pIter != m_aCommandMap.end() )
369 5718 : pIter->second.bMirrored = true;
370 51651 : }
371 63129 : for ( i = 0; i < aSeqRotateCmd.getLength(); i++ )
372 : {
373 61216 : OUString aRotateCmd = aSeqRotateCmd[i];
374 61216 : pIter = m_aCommandMap.find( aRotateCmd );
375 61216 : if ( pIter != m_aCommandMap.end() )
376 10473 : pIter->second.bRotated = true;
377 63129 : }
378 : }
379 :
380 112763 : for ( sal_uInt16 nPos = 0; nPos < m_pToolBar->GetItemCount(); nPos++ )
381 : {
382 110850 : sal_uInt16 nId = m_pToolBar->GetItemId( nPos );
383 110850 : if ( nId > 0 )
384 : {
385 85064 : OUString aCmd = m_pToolBar->GetItemCommand( nId );
386 :
387 85064 : CommandToInfoMap::const_iterator pIter = m_aCommandMap.find( aCmd );
388 85064 : if ( pIter != m_aCommandMap.end() )
389 : {
390 85064 : if ( pIter->second.bRotated )
391 : {
392 10473 : m_pToolBar->SetItemImageMirrorMode( nId, false );
393 10473 : m_pToolBar->SetItemImageAngle( nId, m_lImageRotation );
394 : }
395 85064 : if ( pIter->second.bMirrored )
396 : {
397 5718 : m_pToolBar->SetItemImageMirrorMode( nId, m_bImageMirrored );
398 : }
399 85064 : }
400 : }
401 1913 : }
402 1913 : }
403 :
404 1344 : void ToolBarManager::UpdateControllers()
405 : {
406 :
407 1344 : if( SvtMiscOptions().DisableUICustomization() )
408 : {
409 0 : Any a;
410 0 : Reference< XLayoutManager > xLayoutManager;
411 0 : Reference< XPropertySet > xFramePropSet( m_xFrame, UNO_QUERY );
412 0 : if ( xFramePropSet.is() )
413 0 : a = xFramePropSet->getPropertyValue("LayoutManager");
414 0 : a >>= xLayoutManager;
415 0 : Reference< XDockableWindow > xDockable( VCLUnoHelper::GetInterface( m_pToolBar ), UNO_QUERY );
416 0 : if ( xLayoutManager.is() && xDockable.is() )
417 : {
418 0 : ::com::sun::star::awt::Point aPoint;
419 0 : aPoint.X = aPoint.Y = SAL_MAX_INT32;
420 0 : xLayoutManager->dockWindow( m_aResourceName, DockingArea_DOCKINGAREA_DEFAULT, aPoint );
421 0 : xLayoutManager->lockWindow( m_aResourceName );
422 0 : }
423 : }
424 :
425 1344 : if ( !m_bUpdateControllers )
426 : {
427 1344 : m_bUpdateControllers = true;
428 1344 : ToolBarControllerMap::iterator pIter = m_aControllerMap.begin();
429 :
430 55150 : while ( pIter != m_aControllerMap.end() )
431 : {
432 : try
433 : {
434 52462 : Reference< XUpdatable > xUpdatable( pIter->second, UNO_QUERY );
435 52462 : if ( xUpdatable.is() )
436 51882 : xUpdatable->update();
437 : }
438 0 : catch (const Exception&)
439 : {
440 : }
441 52462 : ++pIter;
442 : }
443 : }
444 1344 : m_bUpdateControllers = false;
445 1344 : }
446 :
447 : //for update toolbar controller via Support Visible
448 994 : void ToolBarManager::UpdateController( ::com::sun::star::uno::Reference< ::com::sun::star::frame::XToolbarController > xController)
449 : {
450 :
451 994 : if ( !m_bUpdateControllers )
452 : {
453 994 : m_bUpdateControllers = true;
454 : try
455 994 : { if(xController.is())
456 : {
457 994 : Reference< XUpdatable > xUpdatable( xController, UNO_QUERY );
458 994 : if ( xUpdatable.is() )
459 994 : xUpdatable->update();
460 : }
461 : }
462 0 : catch (const Exception&)
463 : {
464 : }
465 :
466 : }
467 994 : m_bUpdateControllers = false;
468 994 : }
469 :
470 6892 : void ToolBarManager::frameAction( const FrameActionEvent& Action )
471 : throw ( RuntimeException, std::exception )
472 : {
473 6892 : SolarMutexGuard g;
474 6892 : if ( Action.Action == FrameAction_CONTEXT_CHANGED )
475 : {
476 0 : m_aAsyncUpdateControllersTimer.Start();
477 6892 : }
478 6892 : }
479 :
480 1913 : void SAL_CALL ToolBarManager::statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event )
481 : throw ( ::com::sun::star::uno::RuntimeException, std::exception )
482 : {
483 1913 : SolarMutexGuard g;
484 1913 : if ( m_bDisposed )
485 1913 : return;
486 :
487 1913 : if ( Event.FeatureURL.Complete == ".uno:ImageOrientation" )
488 : {
489 1913 : SfxImageItem aItem( 1, 0 );
490 1913 : aItem.PutValue( Event.State );
491 :
492 1913 : m_lImageRotation = aItem.GetRotation();
493 1913 : m_bImageMirrored = aItem.IsMirrored();
494 1913 : UpdateImageOrientation();
495 1913 : }
496 : }
497 :
498 0 : void SAL_CALL ToolBarManager::disposing( const EventObject& Source ) throw ( RuntimeException, std::exception )
499 : {
500 : {
501 0 : SolarMutexGuard g;
502 0 : if ( m_bDisposed )
503 0 : return;
504 : }
505 :
506 0 : RemoveControllers();
507 :
508 : {
509 0 : SolarMutexGuard g;
510 0 : if ( m_xDocImageManager.is() )
511 : {
512 : try
513 : {
514 0 : m_xDocImageManager->removeConfigurationListener(
515 : Reference< XUIConfigurationListener >(
516 0 : static_cast< OWeakObject* >( this ), UNO_QUERY ));
517 : }
518 0 : catch (const Exception&)
519 : {
520 : }
521 : }
522 :
523 0 : if ( m_xModuleImageManager.is() )
524 : {
525 : try
526 : {
527 0 : m_xModuleImageManager->removeConfigurationListener(
528 : Reference< XUIConfigurationListener >(
529 0 : static_cast< OWeakObject* >( this ), UNO_QUERY ));
530 : }
531 0 : catch (const Exception&)
532 : {
533 : }
534 : }
535 :
536 0 : if ( m_xImageOrientationListener.is() )
537 : {
538 : ImageOrientationListener* pImageOrientation =
539 0 : static_cast<ImageOrientationListener*>(m_xImageOrientationListener.get());
540 0 : pImageOrientation->unbindListener();
541 0 : m_xImageOrientationListener.clear();
542 : }
543 :
544 0 : m_xDocImageManager.clear();
545 0 : m_xModuleImageManager.clear();
546 :
547 0 : if ( Source.Source == Reference< XInterface >( m_xFrame, UNO_QUERY ))
548 0 : m_xFrame.clear();
549 :
550 0 : m_xContext.clear();
551 : }
552 : }
553 :
554 : // XComponent
555 9509 : void SAL_CALL ToolBarManager::dispose() throw( RuntimeException, std::exception )
556 : {
557 9509 : Reference< XComponent > xThis( static_cast< OWeakObject* >(this), UNO_QUERY );
558 :
559 19018 : EventObject aEvent( xThis );
560 9509 : m_aListenerContainer.disposeAndClear( aEvent );
561 :
562 : {
563 9509 : SolarMutexGuard g;
564 :
565 9509 : RemoveControllers();
566 :
567 9509 : if ( m_xDocImageManager.is() )
568 : {
569 : try
570 : {
571 1184 : m_xDocImageManager->removeConfigurationListener(
572 : Reference< XUIConfigurationListener >(
573 1184 : static_cast< OWeakObject* >( this ), UNO_QUERY ));
574 : }
575 0 : catch (const Exception&)
576 : {
577 : }
578 : }
579 9509 : m_xDocImageManager.clear();
580 9509 : if ( m_xModuleImageManager.is() )
581 : {
582 : try
583 : {
584 1236 : m_xModuleImageManager->removeConfigurationListener(
585 : Reference< XUIConfigurationListener >(
586 1236 : static_cast< OWeakObject* >( this ), UNO_QUERY ));
587 : }
588 0 : catch (const Exception&)
589 : {
590 : }
591 : }
592 9509 : m_xModuleImageManager.clear();
593 :
594 9509 : ImplClearPopupMenu( m_pToolBar );
595 :
596 : // We have to destroy our toolbar instance now.
597 9509 : Destroy();
598 9509 : m_pToolBar.clear();
599 :
600 9509 : if ( m_bFrameActionRegistered && m_xFrame.is() )
601 : {
602 : try
603 : {
604 3991 : m_xFrame->removeFrameActionListener( Reference< XFrameActionListener >(
605 3991 : static_cast< ::cppu::OWeakObject *>( this ), UNO_QUERY ));
606 : }
607 0 : catch (const Exception&)
608 : {
609 : }
610 : }
611 :
612 9509 : if ( m_xImageOrientationListener.is() )
613 : {
614 : ImageOrientationListener* pImageOrientation =
615 1236 : static_cast<ImageOrientationListener*>(m_xImageOrientationListener.get());
616 1236 : pImageOrientation->unbindListener();
617 1236 : m_xImageOrientationListener.clear();
618 : }
619 :
620 9509 : m_xFrame.clear();
621 9509 : m_xContext.clear();
622 19018 : Reference< XComponent > xCompGAM( m_xGlobalAcceleratorManager, UNO_QUERY );
623 9509 : if ( xCompGAM.is() )
624 1236 : xCompGAM->dispose();
625 9509 : m_xGlobalAcceleratorManager.clear();
626 9509 : m_xModuleAcceleratorManager.clear();
627 9509 : m_xDocAcceleratorManager.clear();
628 :
629 : // stop timer to prevent timer events after dispose
630 : // do it last because other calls could restart timer in StateChanged()
631 9509 : m_aAsyncUpdateControllersTimer.Stop();
632 :
633 19018 : m_bDisposed = true;
634 9509 : }
635 9509 : }
636 :
637 0 : void SAL_CALL ToolBarManager::addEventListener( const Reference< XEventListener >& xListener ) throw( RuntimeException, std::exception )
638 : {
639 0 : SolarMutexGuard g;
640 :
641 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
642 0 : if ( m_bDisposed )
643 0 : throw DisposedException();
644 :
645 0 : m_aListenerContainer.addInterface( cppu::UnoType<XEventListener>::get(), xListener );
646 0 : }
647 :
648 0 : void SAL_CALL ToolBarManager::removeEventListener( const Reference< XEventListener >& xListener ) throw( RuntimeException, std::exception )
649 : {
650 0 : m_aListenerContainer.removeInterface( cppu::UnoType<XEventListener>::get(), xListener );
651 0 : }
652 :
653 : // XUIConfigurationListener
654 0 : void SAL_CALL ToolBarManager::elementInserted( const ::com::sun::star::ui::ConfigurationEvent& Event ) throw (::com::sun::star::uno::RuntimeException, std::exception)
655 : {
656 0 : impl_elementChanged(false,Event);
657 0 : }
658 :
659 0 : void SAL_CALL ToolBarManager::elementRemoved( const ::com::sun::star::ui::ConfigurationEvent& Event ) throw (::com::sun::star::uno::RuntimeException, std::exception)
660 : {
661 0 : impl_elementChanged(true,Event);
662 0 : }
663 0 : void ToolBarManager::impl_elementChanged(bool _bRemove,const ::com::sun::star::ui::ConfigurationEvent& Event )
664 : {
665 0 : SolarMutexGuard g;
666 :
667 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
668 0 : if ( m_bDisposed )
669 0 : return;
670 :
671 0 : Reference< XNameAccess > xNameAccess;
672 0 : sal_Int16 nImageType = sal_Int16();
673 : sal_Int16 nCurrentImageType = getImageTypeFromBools(
674 0 : SvtMiscOptions().AreCurrentSymbolsLarge()
675 0 : );
676 :
677 0 : if (( Event.aInfo >>= nImageType ) &&
678 0 : ( nImageType == nCurrentImageType ) &&
679 0 : ( Event.Element >>= xNameAccess ))
680 : {
681 0 : sal_Int16 nImageInfo( 1 );
682 0 : Reference< XInterface > xIfacDocImgMgr( m_xDocImageManager, UNO_QUERY );
683 0 : if ( xIfacDocImgMgr == Event.Source )
684 0 : nImageInfo = 0;
685 :
686 0 : Sequence< OUString > aSeq = xNameAccess->getElementNames();
687 0 : for ( sal_Int32 i = 0; i < aSeq.getLength(); i++ )
688 : {
689 0 : CommandToInfoMap::iterator pIter = m_aCommandMap.find( aSeq[i] );
690 0 : if ( pIter != m_aCommandMap.end() && ( pIter->second.nImageInfo >= nImageInfo ))
691 : {
692 0 : if ( _bRemove )
693 : {
694 0 : Image aImage;
695 0 : if (( pIter->second.nImageInfo == 0 ) && ( pIter->second.nImageInfo == nImageInfo ))
696 : {
697 : // Special case: An image from the document image manager has been removed.
698 : // It is possible that we have a image at our module image manager. Before
699 : // we can remove our image we have to ask our module image manager.
700 0 : Sequence< OUString > aCmdURLSeq( 1 );
701 0 : Sequence< Reference< XGraphic > > aGraphicSeq;
702 0 : aCmdURLSeq[0] = pIter->first;
703 0 : aGraphicSeq = m_xModuleImageManager->getImages( nImageType, aCmdURLSeq );
704 0 : aImage = Image( aGraphicSeq[0] );
705 : }
706 :
707 0 : setToolBarImage(aImage,pIter);
708 : } // if ( _bRemove )
709 : else
710 : {
711 0 : Reference< XGraphic > xGraphic;
712 0 : if ( xNameAccess->getByName( aSeq[i] ) >>= xGraphic )
713 : {
714 0 : Image aImage( xGraphic );
715 0 : setToolBarImage(aImage,pIter);
716 : }
717 0 : pIter->second.nImageInfo = nImageInfo;
718 : }
719 : }
720 0 : }
721 0 : }
722 : }
723 53343 : void ToolBarManager::setToolBarImage(const Image& _aImage,const CommandToInfoMap::const_iterator& _pIter)
724 : {
725 53343 : const ::std::vector< sal_uInt16 >& _rIDs = _pIter->second.aIds;
726 53343 : m_pToolBar->SetItemImage( _pIter->second.nId, _aImage );
727 53343 : ::std::for_each(_rIDs.begin(),_rIDs.end(),::boost::bind(&ToolBox::SetItemImage,m_pToolBar.get(),_1,_aImage));
728 53343 : }
729 :
730 0 : void SAL_CALL ToolBarManager::elementReplaced( const ::com::sun::star::ui::ConfigurationEvent& Event ) throw (::com::sun::star::uno::RuntimeException, std::exception)
731 : {
732 0 : impl_elementChanged(false,Event);
733 0 : }
734 :
735 13503 : void ToolBarManager::RemoveControllers()
736 : {
737 13503 : SolarMutexGuard g;
738 :
739 13503 : if ( m_bDisposed )
740 13503 : return;
741 :
742 13503 : m_aSubToolBarControllerMap.clear();
743 :
744 : // i90033
745 : // Remove item window pointers from the toolbar. They were
746 : // destroyed by the dispose() at the XComponent. This is needed
747 : // as VCL code later tries to access the item window data in certain
748 : // dtors where the item window is already invalid!
749 109540 : for ( sal_uInt16 i = 0; i < m_pToolBar->GetItemCount(); i++ )
750 : {
751 96037 : sal_uInt16 nItemId = m_pToolBar->GetItemId( i );
752 96037 : if ( nItemId > 0 )
753 : {
754 80893 : Reference< XComponent > xComponent( m_aControllerMap[ nItemId ], UNO_QUERY );
755 80893 : if ( xComponent.is() )
756 : {
757 : try
758 : {
759 80304 : xComponent->dispose();
760 : }
761 0 : catch (const Exception&)
762 : {
763 : }
764 : }
765 80893 : m_pToolBar->SetItemWindow(nItemId, 0);
766 : }
767 : }
768 13503 : m_aControllerMap.clear();
769 : }
770 :
771 93436 : uno::Sequence< beans::PropertyValue > ToolBarManager::GetPropsForCommand( const OUString& rCmdURL )
772 : {
773 93436 : Sequence< PropertyValue > aPropSeq;
774 :
775 : // Retrieve properties for command
776 : try
777 : {
778 93436 : if ( !m_bModuleIdentified )
779 : {
780 1236 : Reference< XModuleManager2 > xModuleManager = ModuleManager::create( m_xContext );
781 2472 : Reference< XInterface > xIfac( m_xFrame, UNO_QUERY );
782 :
783 1236 : m_bModuleIdentified = true;
784 1236 : m_aModuleIdentifier = xModuleManager->identify( xIfac );
785 :
786 1236 : if ( !m_aModuleIdentifier.isEmpty() )
787 : {
788 1236 : Reference< XNameAccess > xNameAccess = frame::theUICommandDescription::get( m_xContext );
789 1236 : xNameAccess->getByName( m_aModuleIdentifier ) >>= m_xUICommandLabels;
790 1236 : }
791 : }
792 :
793 93436 : if ( m_xUICommandLabels.is() )
794 : {
795 93436 : if ( !rCmdURL.isEmpty() )
796 93436 : m_xUICommandLabels->getByName( rCmdURL ) >>= aPropSeq;
797 : }
798 : }
799 0 : catch (const Exception&)
800 : {
801 : }
802 :
803 93436 : return aPropSeq;
804 : }
805 :
806 53343 : OUString ToolBarManager::RetrieveLabelFromCommand( const OUString& aCmdURL )
807 : {
808 53343 : OUString aLabel;
809 106686 : Sequence< PropertyValue > aPropSeq;
810 :
811 : // Retrieve popup menu labels
812 53343 : aPropSeq = GetPropsForCommand( aCmdURL );
813 106686 : for ( sal_Int32 i = 0; i < aPropSeq.getLength(); i++ )
814 : {
815 106686 : if ( aPropSeq[i].Name == "Name" )
816 : {
817 53343 : aPropSeq[i].Value >>= aLabel;
818 53343 : break;
819 : }
820 : }
821 106686 : return aLabel;
822 : }
823 :
824 40093 : sal_Int32 ToolBarManager::RetrievePropertiesFromCommand( const OUString& aCmdURL )
825 : {
826 40093 : sal_Int32 nProperties(0);
827 40093 : Sequence< PropertyValue > aPropSeq;
828 :
829 : // Retrieve popup menu labels
830 40093 : aPropSeq = GetPropsForCommand( aCmdURL );
831 160372 : for ( sal_Int32 i = 0; i < aPropSeq.getLength(); i++ )
832 : {
833 160372 : if ( aPropSeq[i].Name == "Properties" )
834 : {
835 40093 : aPropSeq[i].Value >>= nProperties;
836 40093 : break;
837 : }
838 : }
839 40093 : return nProperties;
840 : }
841 :
842 1236 : void ToolBarManager::CreateControllers()
843 : {
844 :
845 1236 : Reference< XWindow > xToolbarWindow = VCLUnoHelper::GetInterface( m_pToolBar );
846 :
847 2472 : css::util::URL aURL;
848 1236 : bool bHasDisabledEntries = SvtCommandOptions().HasEntries( SvtCommandOptions::CMDOPTION_DISABLED );
849 2472 : SvtCommandOptions aCmdOptions;
850 :
851 69723 : for ( sal_uInt16 i = 0; i < m_pToolBar->GetItemCount(); i++ )
852 : {
853 68487 : sal_uInt16 nId = m_pToolBar->GetItemId( i );
854 68487 : if ( nId == 0 )
855 30288 : continue;
856 :
857 53343 : OUString aLoadURL( ".uno:OpenUrl" );
858 106686 : OUString aCommandURL( m_pToolBar->GetItemCommand( nId ));
859 53343 : bool bInit( true );
860 53343 : bool bCreate( true );
861 106686 : Reference< XStatusListener > xController;
862 53343 : CommandToInfoMap::iterator pCommandIter = m_aCommandMap.find( aCommandURL );
863 53343 : sal_Int16 nWidth = ( pCommandIter != m_aCommandMap.end() ? pCommandIter->second.nWidth : 0 );
864 :
865 53343 : svt::ToolboxController* pController( 0 );
866 :
867 53343 : if ( bHasDisabledEntries )
868 : {
869 0 : aURL.Complete = aCommandURL;
870 0 : m_xURLTransformer->parseStrict( aURL );
871 0 : if ( aCmdOptions.Lookup( SvtCommandOptions::CMDOPTION_DISABLED, aURL.Path ))
872 : {
873 0 : m_aControllerMap[ nId ] = xController;
874 0 : m_pToolBar->HideItem( nId );
875 0 : continue;
876 : }
877 : }
878 :
879 106686 : if ( m_xToolbarControllerFactory.is() &&
880 53343 : m_xToolbarControllerFactory->hasController( aCommandURL, m_aModuleIdentifier ))
881 : {
882 2031 : PropertyValue aPropValue;
883 4062 : std::vector< Any > aPropertyVector;
884 :
885 2031 : aPropValue.Name = "ModuleIdentifier";
886 2031 : aPropValue.Value <<= m_aModuleIdentifier;
887 2031 : aPropertyVector.push_back( makeAny( aPropValue ));
888 2031 : aPropValue.Name = "Frame";
889 2031 : aPropValue.Value <<= m_xFrame;
890 2031 : aPropertyVector.push_back( makeAny( aPropValue ));
891 2031 : aPropValue.Name = "ServiceManager";
892 4062 : Reference<XMultiServiceFactory> xMSF(m_xContext->getServiceManager(), UNO_QUERY_THROW);
893 2031 : aPropValue.Value <<= xMSF;
894 2031 : aPropertyVector.push_back( makeAny( aPropValue ));
895 2031 : aPropValue.Name = "ParentWindow";
896 2031 : aPropValue.Value <<= xToolbarWindow;
897 2031 : aPropertyVector.push_back( makeAny( aPropValue ));
898 2031 : aPropValue.Name = "Identifier";
899 2031 : aPropValue.Value = uno::makeAny( nId );
900 2031 : aPropertyVector.push_back( uno::makeAny( aPropValue ) );
901 :
902 2031 : if ( nWidth > 0 )
903 : {
904 0 : aPropValue.Name = "Width";
905 0 : aPropValue.Value <<= nWidth;
906 0 : aPropertyVector.push_back( makeAny( aPropValue ));
907 : }
908 :
909 4062 : Sequence< Any > aArgs( comphelper::containerToSequence( aPropertyVector ));
910 6093 : xController = Reference< XStatusListener >( m_xToolbarControllerFactory->createInstanceWithArgumentsAndContext(
911 2031 : aCommandURL, aArgs, m_xContext ),
912 2031 : UNO_QUERY );
913 4062 : bInit = false; // Initialization is done through the factory service
914 : }
915 :
916 53343 : if (( aCommandURL == aLoadURL ) && ( !m_pToolBar->IsItemVisible(nId)))
917 589 : bCreate = false;
918 :
919 53343 : if ( !xController.is() && bCreate )
920 : {
921 50723 : pController = CreateToolBoxController( m_xFrame, m_pToolBar, nId, aCommandURL );
922 50723 : if ( !pController )
923 : {
924 40093 : if ( m_pToolBar->GetItemData( nId ) != 0 )
925 : {
926 : // retrieve additional parameters
927 0 : OUString aControlType = static_cast< AddonsParams* >( m_pToolBar->GetItemData( nId ))->aControlType;
928 :
929 : Reference< XStatusListener > xStatusListener(
930 : ToolBarMerger::CreateController( m_xContext,
931 : m_xFrame,
932 : m_pToolBar,
933 : aCommandURL,
934 : nId,
935 : nWidth,
936 0 : aControlType ), UNO_QUERY );
937 :
938 0 : xController = xStatusListener;
939 : }
940 : else
941 : {
942 40093 : MenuDescriptionMap::iterator it = m_aMenuMap.find( nId );
943 40093 : if ( it == m_aMenuMap.end() )
944 : {
945 80186 : xController = Reference< XStatusListener >(
946 80186 : new GenericToolbarController( m_xContext, m_xFrame, m_pToolBar, nId, aCommandURL ));
947 :
948 : // Accessibility support: Set toggle button role for specific commands
949 40093 : sal_Int32 nProps = RetrievePropertiesFromCommand( aCommandURL );
950 40093 : if ( nProps & UICOMMANDDESCRIPTION_PROPERTIES_TOGGLEBUTTON )
951 10643 : m_pToolBar->SetItemBits( nId, m_pToolBar->GetItemBits( nId ) | ToolBoxItemBits::CHECKABLE );
952 : }
953 : else
954 0 : xController = Reference< XStatusListener >(
955 0 : new MenuToolbarController( m_xContext, m_xFrame, m_pToolBar, nId, aCommandURL, m_aModuleIdentifier, m_aMenuMap[ nId ] ));
956 : }
957 : }
958 10630 : else if ( pController )
959 : {
960 10630 : xController = Reference< XStatusListener >( static_cast< ::cppu::OWeakObject *>( pController ), UNO_QUERY );
961 : }
962 : }
963 :
964 : // Associate ID and controller to be able to retrieve
965 : // the controller from the ID later.
966 53343 : m_aControllerMap[ nId ] = xController;
967 :
968 : // Fill sub-toolbars into our hash-map
969 106686 : Reference< XSubToolbarController > xSubToolBar( xController, UNO_QUERY );
970 53343 : if ( xSubToolBar.is() && xSubToolBar->opensSubToolbar() )
971 : {
972 974 : OUString aSubToolBarName = xSubToolBar->getSubToolbarName();
973 974 : if ( !aSubToolBarName.isEmpty() )
974 : {
975 : SubToolBarToSubToolBarControllerMap::iterator pIter =
976 974 : m_aSubToolBarControllerMap.find( aSubToolBarName );
977 974 : if ( pIter == m_aSubToolBarControllerMap.end() )
978 : {
979 974 : SubToolBarControllerVector aSubToolBarVector;
980 974 : aSubToolBarVector.push_back( xSubToolBar );
981 : m_aSubToolBarControllerMap.insert(
982 : SubToolBarToSubToolBarControllerMap::value_type(
983 974 : aSubToolBarName, aSubToolBarVector ));
984 : }
985 : else
986 0 : pIter->second.push_back( xSubToolBar );
987 974 : }
988 : }
989 :
990 106686 : Reference< XInitialization > xInit( xController, UNO_QUERY );
991 53343 : if ( xInit.is() )
992 : {
993 52754 : if ( bInit )
994 : {
995 50723 : PropertyValue aPropValue;
996 101446 : std::vector< Any > aPropertyVector;
997 :
998 50723 : aPropValue.Name = "Frame";
999 50723 : aPropValue.Value <<= m_xFrame;
1000 50723 : aPropertyVector.push_back( makeAny( aPropValue ));
1001 50723 : aPropValue.Name = "CommandURL";
1002 50723 : aPropValue.Value <<= aCommandURL;
1003 50723 : aPropertyVector.push_back( makeAny( aPropValue ));
1004 50723 : aPropValue.Name = "ServiceManager";
1005 101446 : Reference<XMultiServiceFactory> xMSF(m_xContext->getServiceManager(), UNO_QUERY_THROW);
1006 50723 : aPropValue.Value <<= xMSF;
1007 50723 : aPropertyVector.push_back( makeAny( aPropValue ));
1008 50723 : aPropValue.Name = "ParentWindow";
1009 50723 : aPropValue.Value <<= xToolbarWindow;
1010 50723 : aPropertyVector.push_back( makeAny( aPropValue ));
1011 50723 : aPropValue.Name = "ModuleIdentifier";
1012 50723 : aPropValue.Value <<= m_aModuleIdentifier;
1013 50723 : aPropertyVector.push_back( makeAny( aPropValue ));
1014 50723 : aPropValue.Name = "Identifier";
1015 50723 : aPropValue.Value = uno::makeAny( nId );
1016 50723 : aPropertyVector.push_back( uno::makeAny( aPropValue ) );
1017 :
1018 50723 : if ( nWidth > 0 )
1019 : {
1020 0 : aPropValue.Name = "Width";
1021 0 : aPropValue.Value <<= nWidth;
1022 0 : aPropertyVector.push_back( makeAny( aPropValue ));
1023 : }
1024 :
1025 101446 : Sequence< Any > aArgs( comphelper::containerToSequence( aPropertyVector ));
1026 50723 : xInit->initialize( aArgs );
1027 :
1028 50723 : if (pController)
1029 : {
1030 31890 : if(aCommandURL == ".uno:SwitchXFormsDesignMode" ||
1031 21260 : aCommandURL == ".uno:ViewDataSourceBrowser" ||
1032 31393 : aCommandURL == ".uno:ParaLeftToRight" ||
1033 10133 : aCommandURL == ".uno:ParaRightToLeft"
1034 : )
1035 994 : pController->setFastPropertyValue_NoBroadcast(1,makeAny(sal_True));
1036 50723 : }
1037 : }
1038 :
1039 : // Request a item window from the toolbar controller and set it at the VCL toolbar
1040 52754 : Reference< XToolbarController > xTbxController( xController, UNO_QUERY );
1041 52754 : if ( xTbxController.is() && xToolbarWindow.is() )
1042 : {
1043 52754 : Reference< XWindow > xWindow = xTbxController->createItemWindow( xToolbarWindow );
1044 52754 : if ( xWindow.is() )
1045 : {
1046 1566 : vcl::Window* pItemWin = VCLUnoHelper::GetWindow( xWindow );
1047 1566 : if ( pItemWin )
1048 : {
1049 1566 : WindowType nType = pItemWin->GetType();
1050 1566 : if ( nType == WINDOW_LISTBOX || nType == WINDOW_MULTILISTBOX || nType == WINDOW_COMBOBOX )
1051 1508 : pItemWin->SetAccessibleName( m_pToolBar->GetItemText( nId ) );
1052 1566 : m_pToolBar->SetItemWindow( nId, pItemWin );
1053 : }
1054 52754 : }
1055 52754 : }
1056 : }
1057 :
1058 : //for update Controller via support visiable state
1059 106686 : Reference< XPropertySet > xPropSet( xController, UNO_QUERY );
1060 53343 : if ( xPropSet.is() )
1061 : {
1062 : try
1063 : {
1064 52754 : bool bSupportVisible = true;
1065 52754 : Any a( xPropSet->getPropertyValue("SupportsVisible") );
1066 52754 : a >>= bSupportVisible;
1067 52754 : if (bSupportVisible)
1068 : {
1069 994 : Reference< XToolbarController > xTbxController( xController, UNO_QUERY );
1070 994 : UpdateController(xTbxController);
1071 52754 : }
1072 : }
1073 0 : catch (const RuntimeException&)
1074 : {
1075 0 : throw;
1076 : }
1077 0 : catch (const Exception&)
1078 : {
1079 : }
1080 : }
1081 53343 : }
1082 :
1083 1236 : AddFrameActionListener();
1084 2472 : AddImageOrientationListener();
1085 1236 : }
1086 :
1087 3994 : void ToolBarManager::AddFrameActionListener()
1088 : {
1089 3994 : if ( !m_bFrameActionRegistered && m_xFrame.is() )
1090 : {
1091 3994 : m_bFrameActionRegistered = true;
1092 3994 : m_xFrame->addFrameActionListener( Reference< XFrameActionListener >(
1093 3994 : static_cast< ::cppu::OWeakObject *>( this ), UNO_QUERY ));
1094 : }
1095 3994 : }
1096 :
1097 1236 : void ToolBarManager::AddImageOrientationListener()
1098 : {
1099 1236 : if ( !m_bImageOrientationRegistered && m_xFrame.is() )
1100 : {
1101 1236 : m_bImageOrientationRegistered = true;
1102 : ImageOrientationListener* pImageOrientation = new ImageOrientationListener(
1103 : Reference< XStatusListener >( static_cast< ::cppu::OWeakObject *>( this ), UNO_QUERY ),
1104 : m_xContext,
1105 1236 : m_xFrame );
1106 2472 : m_xImageOrientationListener = Reference< XComponent >( static_cast< ::cppu::OWeakObject *>(
1107 2472 : pImageOrientation ), UNO_QUERY );
1108 : pImageOrientation->addStatusListener(
1109 1236 : OUString( ".uno:ImageOrientation" ));
1110 1236 : pImageOrientation->bindListener();
1111 : }
1112 1236 : }
1113 :
1114 53343 : ToolBoxItemBits ToolBarManager::ConvertStyleToToolboxItemBits( sal_Int32 nStyle )
1115 : {
1116 53343 : ToolBoxItemBits nItemBits( ToolBoxItemBits::NONE );
1117 53343 : if ( nStyle & ::com::sun::star::ui::ItemStyle::RADIO_CHECK )
1118 4636 : nItemBits |= ToolBoxItemBits::RADIOCHECK;
1119 53343 : if ( nStyle & ::com::sun::star::ui::ItemStyle::ALIGN_LEFT )
1120 0 : nItemBits |= ToolBoxItemBits::LEFT;
1121 53343 : if ( nStyle & ::com::sun::star::ui::ItemStyle::AUTO_SIZE )
1122 0 : nItemBits |= ToolBoxItemBits::AUTOSIZE;
1123 53343 : if ( nStyle & ::com::sun::star::ui::ItemStyle::DROP_DOWN )
1124 2009 : nItemBits |= ToolBoxItemBits::DROPDOWN;
1125 53343 : if ( nStyle & ::com::sun::star::ui::ItemStyle::REPEAT )
1126 0 : nItemBits |= ToolBoxItemBits::REPEAT;
1127 53343 : if ( nStyle & ::com::sun::star::ui::ItemStyle::DROPDOWN_ONLY )
1128 11 : nItemBits |= ToolBoxItemBits::DROPDOWNONLY;
1129 53343 : if ( nStyle & ::com::sun::star::ui::ItemStyle::TEXT )
1130 0 : nItemBits |= ToolBoxItemBits::TEXT_ONLY;
1131 53343 : if ( nStyle & ::com::sun::star::ui::ItemStyle::ICON )
1132 0 : nItemBits |= ToolBoxItemBits::ICON_ONLY;
1133 :
1134 53343 : return nItemBits;
1135 : }
1136 :
1137 1236 : void ToolBarManager::FillToolbar( const Reference< XIndexAccess >& rItemContainer )
1138 : {
1139 1236 : OString aTbxName = OUStringToOString( m_aResourceName, RTL_TEXTENCODING_ASCII_US );
1140 : SAL_INFO( "fwk.uielement", "framework (cd100003) ::ToolBarManager::FillToolbar " << aTbxName.getStr() );
1141 :
1142 2472 : SolarMutexGuard g;
1143 :
1144 1236 : if ( m_bDisposed )
1145 1236 : return;
1146 :
1147 1236 : sal_uInt16 nId( 1 );
1148 :
1149 2472 : Reference< XModuleManager2 > xModuleManager = ModuleManager::create( m_xContext );
1150 1236 : if ( !m_xDocImageManager.is() )
1151 : {
1152 1236 : Reference< XModel > xModel( GetModelFromFrame() );
1153 1236 : if ( xModel.is() )
1154 : {
1155 1235 : Reference< XUIConfigurationManagerSupplier > xSupplier( xModel, UNO_QUERY );
1156 1235 : if ( xSupplier.is() )
1157 : {
1158 1184 : m_xDocUICfgMgr.set( xSupplier->getUIConfigurationManager(), UNO_QUERY );
1159 1184 : m_xDocImageManager = Reference< XImageManager >( m_xDocUICfgMgr->getImageManager(), UNO_QUERY );
1160 1184 : m_xDocImageManager->addConfigurationListener(
1161 : Reference< XUIConfigurationListener >(
1162 1184 : static_cast< OWeakObject* >( this ), UNO_QUERY ));
1163 1235 : }
1164 1236 : }
1165 : }
1166 :
1167 : try
1168 : {
1169 1236 : m_aModuleIdentifier = xModuleManager->identify( Reference< XInterface >( m_xFrame, UNO_QUERY ) );
1170 : }
1171 0 : catch (const Exception&)
1172 : {
1173 : }
1174 :
1175 1236 : if ( !m_xModuleImageManager.is() )
1176 : {
1177 : Reference< XModuleUIConfigurationManagerSupplier > xModuleCfgMgrSupplier =
1178 1236 : theModuleUIConfigurationManagerSupplier::get( m_xContext );
1179 1236 : m_xUICfgMgr = xModuleCfgMgrSupplier->getUIConfigurationManager( m_aModuleIdentifier );
1180 1236 : m_xModuleImageManager = Reference< XImageManager >( m_xUICfgMgr->getImageManager(), UNO_QUERY );
1181 1236 : m_xModuleImageManager->addConfigurationListener( Reference< XUIConfigurationListener >(
1182 1236 : static_cast< OWeakObject* >( this ), UNO_QUERY ));
1183 : }
1184 :
1185 1236 : RemoveControllers();
1186 :
1187 : // reset and fill command map
1188 1236 : m_pToolBar->Clear();
1189 1236 : m_aControllerMap.clear();
1190 1236 : m_aCommandMap.clear();
1191 :
1192 1236 : m_aMenuMap.clear();
1193 :
1194 2472 : CommandInfo aCmdInfo;
1195 69723 : for ( sal_Int32 n = 0; n < rItemContainer->getCount(); n++ )
1196 : {
1197 68487 : Sequence< PropertyValue > aProp;
1198 136974 : OUString aCommandURL;
1199 136974 : OUString aLabel;
1200 136974 : OUString aHelpURL;
1201 136974 : OUString aTooltip;
1202 68487 : sal_uInt16 nType( ::com::sun::star::ui::ItemType::DEFAULT );
1203 68487 : sal_uInt16 nWidth( 0 );
1204 68487 : sal_uInt32 nStyle( 0 );
1205 :
1206 136974 : Reference< XIndexAccess > aMenuDesc;
1207 : try
1208 : {
1209 68487 : if ( rItemContainer->getByIndex( n ) >>= aProp )
1210 : {
1211 68487 : bool bIsVisible( true );
1212 472176 : for ( int i = 0; i < aProp.getLength(); i++ )
1213 : {
1214 403689 : if ( aProp[i].Name == ITEM_DESCRIPTOR_COMMANDURL )
1215 : {
1216 68487 : aProp[i].Value >>= aCommandURL;
1217 68487 : if ( aCommandURL.startsWith(MENUPREFIX) )
1218 : {
1219 : try
1220 : {
1221 0 : Reference< XIndexAccess > xMenuContainer;
1222 0 : if ( m_xDocUICfgMgr.is() &&
1223 0 : m_xDocUICfgMgr->hasSettings( aCommandURL ) )
1224 0 : xMenuContainer = m_xDocUICfgMgr->getSettings( aCommandURL, sal_False );
1225 0 : if ( !xMenuContainer.is() &&
1226 0 : m_xUICfgMgr.is() &&
1227 0 : m_xUICfgMgr->hasSettings( aCommandURL ) )
1228 0 : xMenuContainer = m_xUICfgMgr->getSettings( aCommandURL, sal_False );
1229 0 : if ( xMenuContainer.is() && xMenuContainer->getCount() )
1230 : {
1231 0 : Sequence< PropertyValue > aProps;
1232 : // drop down menu info is currently
1233 : // the first ( and only ) menu
1234 : // in the menusettings container
1235 0 : xMenuContainer->getByIndex(0) >>= aProps;
1236 0 : for ( sal_Int32 index=0; index<aProps.getLength(); ++index )
1237 : {
1238 0 : if ( aProps[ index ].Name == ITEM_DESCRIPTOR_CONTAINER )
1239 :
1240 : {
1241 0 : aProps[ index ].Value >>= aMenuDesc;
1242 0 : break;
1243 : }
1244 0 : }
1245 0 : }
1246 : }
1247 0 : catch (const Exception&)
1248 : {
1249 : }
1250 : }
1251 : }
1252 335202 : else if ( aProp[i].Name == ITEM_DESCRIPTOR_HELPURL )
1253 53343 : aProp[i].Value >>= aHelpURL;
1254 281859 : else if ( aProp[i].Name == ITEM_DESCRIPTOR_TOOLTIP )
1255 53343 : aProp[i].Value >>= aTooltip;
1256 228516 : else if ( aProp[i].Name == ITEM_DESCRIPTOR_LABEL )
1257 53343 : aProp[i].Value >>= aLabel;
1258 175173 : else if ( aProp[i].Name == ITEM_DESCRIPTOR_TYPE )
1259 68487 : aProp[i].Value >>= nType;
1260 106686 : else if ( aProp[i].Name == ITEM_DESCRIPTOR_VISIBLE )
1261 53343 : aProp[i].Value >>= bIsVisible;
1262 53343 : else if ( aProp[i].Name == ITEM_DESCRIPTOR_WIDTH )
1263 0 : aProp[i].Value >>= nWidth;
1264 53343 : else if ( aProp[i].Name == ITEM_DESCRIPTOR_STYLE )
1265 53343 : aProp[i].Value >>= nStyle;
1266 : }
1267 :
1268 68487 : if (( nType == ::com::sun::star::ui::ItemType::DEFAULT ) && !aCommandURL.isEmpty() )
1269 : {
1270 53343 : OUString aString( RetrieveLabelFromCommand( aCommandURL ));
1271 :
1272 53343 : ToolBoxItemBits nItemBits = ConvertStyleToToolboxItemBits( nStyle );
1273 53343 : if ( aMenuDesc.is() )
1274 : {
1275 0 : m_aMenuMap[ nId ] = aMenuDesc;
1276 0 : nItemBits |= ToolBoxItemBits::DROPDOWNONLY;
1277 : }
1278 53343 : m_pToolBar->InsertItem( nId, aString, nItemBits );
1279 53343 : m_pToolBar->SetItemCommand( nId, aCommandURL );
1280 106686 : OUString sQuickHelp( aString );
1281 : // Use custom tooltip if available
1282 53343 : if ( !aTooltip.isEmpty() )
1283 0 : sQuickHelp = aTooltip;
1284 106686 : OUString sShortCut;
1285 53343 : if( RetrieveShortcut( aCommandURL, sShortCut ) )
1286 : {
1287 5 : sQuickHelp += " (";
1288 5 : sQuickHelp += sShortCut;
1289 5 : sQuickHelp += ")";
1290 : }
1291 53343 : m_pToolBar->SetQuickHelpText( nId, sQuickHelp );
1292 :
1293 53343 : if ( !aLabel.isEmpty() )
1294 : {
1295 2 : m_pToolBar->SetItemText( nId, aLabel );
1296 : }
1297 : else
1298 : {
1299 53341 : m_pToolBar->SetItemText( nId, aString );
1300 : }
1301 53343 : m_pToolBar->EnableItem( nId, true );
1302 53343 : m_pToolBar->SetItemState( nId, TRISTATE_FALSE );
1303 :
1304 : // Fill command map. It stores all our commands and from what
1305 : // image manager we got our image. So we can decide if we have to use an
1306 : // image from a notification message.
1307 53343 : CommandToInfoMap::iterator pIter = m_aCommandMap.find( aCommandURL );
1308 53343 : if ( pIter == m_aCommandMap.end())
1309 : {
1310 53343 : aCmdInfo.nId = nId;
1311 53343 : aCmdInfo.nWidth = nWidth;
1312 53343 : const CommandToInfoMap::value_type aValue( aCommandURL, aCmdInfo );
1313 53343 : m_aCommandMap.insert( aValue );
1314 : }
1315 : else
1316 : {
1317 0 : pIter->second.aIds.push_back( nId );
1318 : }
1319 :
1320 53343 : if ( !bIsVisible )
1321 18474 : m_pToolBar->HideItem( nId );
1322 :
1323 106686 : ++nId;
1324 : }
1325 15144 : else if ( nType == ::com::sun::star::ui::ItemType::SEPARATOR_LINE )
1326 : {
1327 15144 : m_pToolBar->InsertSeparator();
1328 : }
1329 0 : else if ( nType == ::com::sun::star::ui::ItemType::SEPARATOR_SPACE )
1330 : {
1331 0 : m_pToolBar->InsertSpace();
1332 : }
1333 0 : else if ( nType == ::com::sun::star::ui::ItemType::SEPARATOR_LINEBREAK )
1334 : {
1335 0 : m_pToolBar->InsertBreak();
1336 : }
1337 : }
1338 : }
1339 0 : catch (const ::com::sun::star::lang::IndexOutOfBoundsException&)
1340 : {
1341 0 : break;
1342 : }
1343 68487 : }
1344 :
1345 : // Support add-on toolbar merging here. Working directly on the toolbar object is much
1346 : // simpler and faster.
1347 1236 : const sal_uInt16 TOOLBAR_ITEM_STARTID = 1000;
1348 :
1349 2472 : MergeToolbarInstructionContainer aMergeInstructionContainer;
1350 :
1351 : // Retrieve the toolbar name from the resource name
1352 2472 : OUString aToolbarName( m_aResourceName );
1353 1236 : sal_Int32 nIndex = aToolbarName.lastIndexOf( '/' );
1354 1236 : if (( nIndex > 0 ) && ( nIndex < aToolbarName.getLength() ))
1355 1236 : aToolbarName = aToolbarName.copy( nIndex+1 );
1356 :
1357 1236 : AddonsOptions().GetMergeToolbarInstructions( aToolbarName, aMergeInstructionContainer );
1358 :
1359 1236 : if ( !aMergeInstructionContainer.empty() )
1360 : {
1361 0 : sal_uInt16 nItemId( TOOLBAR_ITEM_STARTID );
1362 0 : const sal_uInt32 nCount = aMergeInstructionContainer.size();
1363 0 : for ( sal_uInt32 i=0; i < nCount; i++ )
1364 : {
1365 0 : MergeToolbarInstruction& rInstruction = aMergeInstructionContainer[i];
1366 0 : if ( ToolBarMerger::IsCorrectContext( rInstruction.aMergeContext, m_aModuleIdentifier ))
1367 : {
1368 0 : ReferenceToolbarPathInfo aRefPoint = ToolBarMerger::FindReferencePoint( m_pToolBar, rInstruction.aMergePoint );
1369 :
1370 : // convert the sequence< sequence< propertyvalue > > structure to
1371 : // something we can better handle. A vector with item data
1372 0 : AddonToolbarItemContainer aItems;
1373 0 : ToolBarMerger::ConvertSeqSeqToVector( rInstruction.aMergeToolbarItems, aItems );
1374 :
1375 0 : if ( aRefPoint.bResult )
1376 : {
1377 : ToolBarMerger::ProcessMergeOperation( m_xFrame,
1378 : m_pToolBar,
1379 : aRefPoint.nPos,
1380 : nItemId,
1381 : m_aCommandMap,
1382 : m_aModuleIdentifier,
1383 : rInstruction.aMergeCommand,
1384 : rInstruction.aMergeCommandParameter,
1385 0 : aItems );
1386 : }
1387 : else
1388 : {
1389 : ToolBarMerger::ProcessMergeFallback( m_xFrame,
1390 : m_pToolBar,
1391 : aRefPoint.nPos,
1392 : nItemId,
1393 : m_aCommandMap,
1394 : m_aModuleIdentifier,
1395 : rInstruction.aMergeCommand,
1396 : rInstruction.aMergeFallback,
1397 0 : aItems );
1398 0 : }
1399 : }
1400 : }
1401 : }
1402 :
1403 : // Request images for all toolbar items. Must be done before CreateControllers as
1404 : // some controllers need access to the image.
1405 1236 : RequestImages();
1406 :
1407 : // Create controllers after we set the images. There are controllers which needs
1408 : // an image at the toolbar at creation time!
1409 1236 : CreateControllers();
1410 :
1411 : // Notify controllers that they are now correctly initialized and can start listening
1412 : // toolbars that will open in popup mode will be updated immediately to avoid flickering
1413 1236 : if( m_pToolBar->WillUsePopupMode() )
1414 0 : UpdateControllers();
1415 1236 : else if ( m_pToolBar->IsReallyVisible() )
1416 : {
1417 0 : m_aAsyncUpdateControllersTimer.Start();
1418 : }
1419 :
1420 : // Try to retrieve UIName from the container property set and set it as the title
1421 : // if it is not empty.
1422 2472 : Reference< XPropertySet > xPropSet( rItemContainer, UNO_QUERY );
1423 1236 : if ( xPropSet.is() )
1424 : {
1425 : try
1426 : {
1427 1236 : OUString aUIName;
1428 1236 : xPropSet->getPropertyValue("UIName") >>= aUIName;
1429 1236 : if ( !aUIName.isEmpty() )
1430 0 : m_pToolBar->SetText( aUIName );
1431 : }
1432 0 : catch (const Exception&)
1433 : {
1434 : }
1435 1236 : }
1436 : }
1437 :
1438 1236 : void ToolBarManager::RequestImages()
1439 : {
1440 :
1441 : // Request images from image manager
1442 1236 : Sequence< OUString > aCmdURLSeq( m_aCommandMap.size() );
1443 2472 : Sequence< Reference< XGraphic > > aDocGraphicSeq;
1444 2472 : Sequence< Reference< XGraphic > > aModGraphicSeq;
1445 :
1446 1236 : sal_uInt32 i = 0;
1447 1236 : CommandToInfoMap::iterator pIter = m_aCommandMap.begin();
1448 1236 : CommandToInfoMap::iterator pEnd = m_aCommandMap.end();
1449 55815 : while ( pIter != pEnd )
1450 : {
1451 53343 : aCmdURLSeq[i++] = pIter->first;
1452 53343 : ++pIter;
1453 : }
1454 :
1455 1236 : bool bBigImages( SvtMiscOptions().AreCurrentSymbolsLarge() );
1456 1236 : sal_Int16 p = getImageTypeFromBools( SvtMiscOptions().AreCurrentSymbolsLarge() );
1457 :
1458 1236 : if ( m_xDocImageManager.is() )
1459 1184 : aDocGraphicSeq = m_xDocImageManager->getImages( p, aCmdURLSeq );
1460 1236 : aModGraphicSeq = m_xModuleImageManager->getImages( p, aCmdURLSeq );
1461 :
1462 1236 : i = 0;
1463 1236 : pIter = m_aCommandMap.begin();
1464 55815 : while ( pIter != pEnd )
1465 : {
1466 53343 : Image aImage;
1467 53343 : if ( aDocGraphicSeq.getLength() > 0 )
1468 52541 : aImage = Image( aDocGraphicSeq[i] );
1469 53343 : if ( !aImage )
1470 : {
1471 53343 : aImage = Image( aModGraphicSeq[i] );
1472 : // Try also to query for add-on images before giving up and use an
1473 : // empty image.
1474 53343 : if ( !aImage )
1475 206 : aImage = QueryAddonsImage( aCmdURLSeq[i], bBigImages );
1476 :
1477 53343 : pIter->second.nImageInfo = 1; // mark image as module based
1478 : }
1479 : else
1480 : {
1481 0 : pIter->second.nImageInfo = 0; // mark image as document based
1482 : }
1483 53343 : setToolBarImage(aImage,pIter);
1484 53343 : ++pIter;
1485 53343 : ++i;
1486 54579 : }
1487 1236 : }
1488 :
1489 4 : void ToolBarManager::notifyRegisteredControllers( const OUString& aUIElementName, const OUString& aCommand )
1490 : {
1491 4 : SolarMutexClearableGuard aGuard;
1492 4 : if ( !m_aSubToolBarControllerMap.empty() )
1493 : {
1494 : SubToolBarToSubToolBarControllerMap::const_iterator pIter =
1495 2 : m_aSubToolBarControllerMap.find( aUIElementName );
1496 :
1497 2 : if ( pIter != m_aSubToolBarControllerMap.end() )
1498 : {
1499 0 : const SubToolBarControllerVector& rSubToolBarVector = pIter->second;
1500 0 : if ( !rSubToolBarVector.empty() )
1501 : {
1502 0 : SubToolBarControllerVector aNotifyVector = rSubToolBarVector;
1503 0 : aGuard.clear();
1504 :
1505 0 : const sal_uInt32 nCount = aNotifyVector.size();
1506 0 : for ( sal_uInt32 i=0; i < nCount; i++ )
1507 : {
1508 : try
1509 : {
1510 0 : Reference< XSubToolbarController > xController = aNotifyVector[i];
1511 0 : if ( xController.is() )
1512 0 : xController->functionSelected( aCommand );
1513 : }
1514 0 : catch (const RuntimeException&)
1515 : {
1516 0 : throw;
1517 : }
1518 0 : catch (const Exception&)
1519 : {
1520 : }
1521 0 : }
1522 : }
1523 : }
1524 4 : }
1525 4 : }
1526 2 : long ToolBarManager::HandleClick(void ( SAL_CALL XToolbarController::*_pClick )())
1527 : {
1528 2 : SolarMutexGuard g;
1529 :
1530 2 : if ( m_bDisposed )
1531 0 : return 1;
1532 :
1533 2 : sal_uInt16 nId( m_pToolBar->GetCurItemId() );
1534 2 : ToolBarControllerMap::const_iterator pIter = m_aControllerMap.find( nId );
1535 2 : if ( pIter != m_aControllerMap.end() )
1536 : {
1537 2 : Reference< XToolbarController > xController( pIter->second, UNO_QUERY );
1538 :
1539 2 : if ( xController.is() )
1540 2 : (xController.get()->*_pClick)( );
1541 : } // if ( pIter != m_aControllerMap.end() )
1542 2 : return 1;
1543 : }
1544 :
1545 4 : IMPL_LINK_NOARG_TYPED(ToolBarManager, Click, ToolBox *, void)
1546 : {
1547 2 : HandleClick(&XToolbarController::click);
1548 2 : }
1549 :
1550 0 : IMPL_LINK_NOARG_TYPED(ToolBarManager, DropdownClick, ToolBox *, void)
1551 : {
1552 0 : SolarMutexGuard g;
1553 :
1554 0 : if ( m_bDisposed )
1555 0 : return;
1556 :
1557 0 : sal_uInt16 nId( m_pToolBar->GetCurItemId() );
1558 0 : ToolBarControllerMap::const_iterator pIter = m_aControllerMap.find( nId );
1559 0 : if ( pIter != m_aControllerMap.end() )
1560 : {
1561 0 : Reference< XToolbarController > xController( pIter->second, UNO_QUERY );
1562 :
1563 0 : if ( xController.is() )
1564 : {
1565 0 : Reference< XWindow > xWin = xController->createPopupWindow();
1566 0 : if ( xWin.is() )
1567 0 : xWin->setFocus();
1568 0 : }
1569 0 : }
1570 : }
1571 :
1572 0 : IMPL_LINK_NOARG_TYPED(ToolBarManager, DoubleClick, ToolBox *, void)
1573 : {
1574 0 : HandleClick(&XToolbarController::doubleClick);
1575 0 : }
1576 :
1577 9509 : void ToolBarManager::ImplClearPopupMenu( ToolBox *pToolBar )
1578 : {
1579 9509 : if ( m_bDisposed )
1580 9509 : return;
1581 :
1582 9509 : ::PopupMenu *pMenu = pToolBar->GetMenu();
1583 :
1584 : // remove config entries from menu, so we have a clean menu to start with
1585 : // remove submenu first
1586 9509 : ::PopupMenu* pItemMenu = pMenu->GetPopupMenu( 1 );
1587 9509 : if( pItemMenu )
1588 : {
1589 0 : pItemMenu->Clear();
1590 0 : delete pItemMenu;
1591 0 : pItemMenu = NULL;
1592 0 : pMenu->SetPopupMenu( 1, pItemMenu );
1593 : }
1594 :
1595 : // remove all items that were not added by the toolbar itself
1596 : sal_uInt16 i;
1597 19018 : for( i=0; i<pMenu->GetItemCount(); )
1598 : {
1599 0 : if( pMenu->GetItemId( i ) < TOOLBOX_MENUITEM_START
1600 0 : && pMenu->GetItemId( i ) != 0 ) // Don't remove separators (Id == 0)
1601 0 : pMenu->RemoveItem( i );
1602 : else
1603 0 : i++;
1604 : }
1605 : }
1606 :
1607 0 : IMPL_LINK_TYPED( ToolBarManager, MenuDeactivate, Menu*, pMenu, bool )
1608 : {
1609 0 : SolarMutexGuard g;
1610 :
1611 0 : if ( m_bDisposed )
1612 0 : return true;
1613 :
1614 0 : if( pMenu != m_pToolBar->GetMenu() )
1615 0 : return true;
1616 :
1617 0 : ImplClearPopupMenu( m_pToolBar );
1618 :
1619 0 : return false;
1620 : }
1621 :
1622 1236 : Reference< XModel > ToolBarManager::GetModelFromFrame() const
1623 : {
1624 1236 : Reference< XController > xController = m_xFrame->getController();
1625 1236 : Reference< XModel > xModel;
1626 1236 : if ( xController.is() )
1627 1236 : xModel = xController->getModel();
1628 :
1629 1236 : return xModel;
1630 : }
1631 :
1632 0 : bool ToolBarManager::IsPluginMode() const
1633 : {
1634 0 : bool bPluginMode( false );
1635 :
1636 0 : if ( m_xFrame.is() )
1637 : {
1638 0 : Reference< XModel > xModel = GetModelFromFrame();
1639 0 : if ( xModel.is() )
1640 : {
1641 0 : Sequence< PropertyValue > aSeq = xModel->getArgs();
1642 0 : utl::MediaDescriptor aMediaDescriptor( aSeq );
1643 : bPluginMode = aMediaDescriptor.getUnpackedValueOrDefault(
1644 0 : utl::MediaDescriptor::PROP_VIEWONLY(), false );
1645 0 : }
1646 : }
1647 :
1648 0 : return bPluginMode;
1649 : }
1650 :
1651 0 : bool ToolBarManager::MenuItemAllowed( sal_uInt16 ) const
1652 : {
1653 0 : return true;
1654 : }
1655 :
1656 0 : ::PopupMenu * ToolBarManager::GetToolBarCustomMenu(ToolBox* pToolBar)
1657 : {
1658 : // update the list of hidden tool items first
1659 0 : pToolBar->UpdateCustomMenu();
1660 :
1661 0 : ::PopupMenu *pMenu = pToolBar->GetMenu();
1662 : // remove all entries before inserting new ones
1663 0 : ImplClearPopupMenu( pToolBar );
1664 : // No config menu entries if command ".uno:ConfigureDialog" is not enabled
1665 0 : Reference< XDispatch > xDisp;
1666 0 : com::sun::star::util::URL aURL;
1667 0 : if ( m_xFrame.is() )
1668 : {
1669 0 : Reference< XDispatchProvider > xProv( m_xFrame, UNO_QUERY );
1670 0 : aURL.Complete = ".uno:ConfigureDialog";
1671 0 : m_xURLTransformer->parseStrict( aURL );
1672 0 : if ( xProv.is() )
1673 0 : xDisp = xProv->queryDispatch( aURL, OUString(), 0 );
1674 :
1675 0 : if ( !xDisp.is() || IsPluginMode() )
1676 0 : return 0;
1677 : }
1678 :
1679 : // popup menu for quick customization
1680 0 : bool bHideDisabledEntries = !SvtMenuOptions().IsEntryHidingEnabled();
1681 0 : ::PopupMenu aPopupMenu( FwkResId( POPUPMENU_TOOLBAR_QUICKCUSTOMIZATION ));
1682 :
1683 0 : if ( m_pToolBar->IsCustomize() )
1684 : {
1685 0 : sal_uInt16 nPos( 0 );
1686 0 : ::PopupMenu* pItemMenu( aPopupMenu.GetPopupMenu( 1 ));
1687 :
1688 0 : bool bIsFloating( false );
1689 :
1690 0 : DockingManager* pDockMgr = vcl::Window::GetDockingManager();
1691 0 : if ( pDockMgr )
1692 0 : bIsFloating = pDockMgr->IsFloating( m_pToolBar );
1693 :
1694 0 : if ( !bIsFloating )
1695 : {
1696 0 : aPopupMenu.EnableItem( MENUITEM_TOOLBAR_DOCKTOOLBAR, false );
1697 0 : aPopupMenu.EnableItem( MENUITEM_TOOLBAR_DOCKALLTOOLBAR, false );
1698 0 : Reference< XDockableWindow > xDockable( VCLUnoHelper::GetInterface( m_pToolBar ), UNO_QUERY );
1699 0 : if( xDockable.is() )
1700 0 : aPopupMenu.CheckItem( MENUITEM_TOOLBAR_LOCKTOOLBARPOSITION, xDockable->isLocked() );
1701 : }
1702 : else
1703 0 : aPopupMenu.EnableItem( MENUITEM_TOOLBAR_LOCKTOOLBARPOSITION, false );
1704 :
1705 0 : if ( SvtMiscOptions().DisableUICustomization() )
1706 : {
1707 0 : aPopupMenu.EnableItem( MENUITEM_TOOLBAR_VISIBLEBUTTON, false );
1708 0 : aPopupMenu.EnableItem( MENUITEM_TOOLBAR_CUSTOMIZETOOLBAR, false );
1709 0 : aPopupMenu.EnableItem( MENUITEM_TOOLBAR_LOCKTOOLBARPOSITION, false );
1710 : }
1711 :
1712 : // Disable menu item CLOSE if the toolbar has no closer
1713 0 : if( !(pToolBar->GetFloatStyle() & WB_CLOSEABLE) )
1714 0 : aPopupMenu.EnableItem(MENUITEM_TOOLBAR_CLOSE, false);
1715 :
1716 0 : for ( nPos = 0; nPos < m_pToolBar->GetItemCount(); ++nPos )
1717 : {
1718 0 : if ( m_pToolBar->GetItemType(nPos) == ToolBoxItemType::BUTTON )
1719 : {
1720 0 : sal_uInt16 nId = m_pToolBar->GetItemId(nPos);
1721 0 : OUString aCommandURL = m_pToolBar->GetItemCommand( nId );
1722 0 : pItemMenu->InsertItem( STARTID_CUSTOMIZE_POPUPMENU+nPos, m_pToolBar->GetItemText( nId ), MenuItemBits::CHECKABLE );
1723 0 : pItemMenu->CheckItem( STARTID_CUSTOMIZE_POPUPMENU+nPos, m_pToolBar->IsItemVisible( nId ) );
1724 0 : pItemMenu->SetItemCommand( STARTID_CUSTOMIZE_POPUPMENU+nPos, aCommandURL );
1725 : pItemMenu->SetItemImage( STARTID_CUSTOMIZE_POPUPMENU+nPos,
1726 : GetImageFromURL( m_xFrame, aCommandURL, false )
1727 0 : );
1728 : }
1729 : else
1730 : {
1731 0 : pItemMenu->InsertSeparator();
1732 : }
1733 : }
1734 : }
1735 : else
1736 : {
1737 0 : sal_uInt16 nPos = aPopupMenu.GetItemPos( MENUITEM_TOOLBAR_CUSTOMIZETOOLBAR );
1738 0 : if ( nPos != MENU_ITEM_NOTFOUND )
1739 0 : aPopupMenu.RemoveItem( nPos );
1740 : }
1741 :
1742 : // copy all menu items to the toolbar menu
1743 0 : if( pMenu->GetItemCount() )
1744 0 : pMenu->InsertSeparator();
1745 :
1746 : sal_uInt16 i;
1747 0 : for( i=0; i< aPopupMenu.GetItemCount(); i++)
1748 : {
1749 0 : sal_uInt16 nId = aPopupMenu.GetItemId( i );
1750 0 : if ( MenuItemAllowed( nId ))
1751 0 : pMenu->CopyItem( aPopupMenu, i, MENU_APPEND );
1752 : }
1753 :
1754 : // set submenu to toolbar menu
1755 0 : if( aPopupMenu.GetPopupMenu( 1 ) )
1756 : {
1757 : // create an own submenu to avoid auto-delete when resource menu is deleted
1758 0 : ::PopupMenu *pItemMenu = new ::PopupMenu();
1759 :
1760 0 : for( i=0; i< aPopupMenu.GetPopupMenu( 1 )->GetItemCount(); i++)
1761 0 : pItemMenu->CopyItem( *aPopupMenu.GetPopupMenu( 1 ), i, MENU_APPEND );
1762 :
1763 0 : pMenu->SetPopupMenu( 1, pItemMenu );
1764 : }
1765 :
1766 : // Set the title of the menu
1767 0 : pMenu->SetText( pToolBar->GetText() );
1768 :
1769 0 : if ( bHideDisabledEntries )
1770 0 : pMenu->RemoveDisabledEntries();
1771 :
1772 0 : return pMenu;
1773 : }
1774 :
1775 0 : IMPL_LINK_TYPED( ToolBarManager, Command, CommandEvent const *, pCmdEvt, void )
1776 : {
1777 0 : SolarMutexGuard g;
1778 :
1779 0 : if ( m_bDisposed )
1780 0 : return;
1781 0 : if ( pCmdEvt->GetCommand() != CommandEventId::ContextMenu )
1782 0 : return;
1783 :
1784 0 : ::PopupMenu * pMenu = GetToolBarCustomMenu(m_pToolBar);
1785 0 : if (pMenu)
1786 : {
1787 : // We only want to handle events for the context menu, but not events
1788 : // on the toolbars overflow menu, hence we should only receive events
1789 : // from the toolbox menu when we are actually showing it as our context
1790 : // menu (the same menu retrieved with GetMenu() is reused for both the
1791 : // overflow and context menus). If we set these Hdls permanently rather
1792 : // than just when the context menu is showing, then events are duplicated
1793 : // when the menu is being used as an overflow menu.
1794 0 : Menu *pManagerMenu = m_pToolBar->GetMenu();
1795 0 : pManagerMenu->SetSelectHdl( LINK( this, ToolBarManager, MenuSelect ) );
1796 0 : pManagerMenu->SetDeactivateHdl( LINK( this, ToolBarManager, MenuDeactivate ) );
1797 :
1798 : // make sure all disabled entries will be shown
1799 0 : pMenu->SetMenuFlags( pMenu->GetMenuFlags() | MenuFlags::AlwaysShowDisabledEntries );
1800 0 : ::Point aPoint( pCmdEvt->GetMousePosPixel() );
1801 0 : pMenu->Execute( m_pToolBar, aPoint );
1802 :
1803 : //fdo#86820 We may have been disposed and so have a NULL m_pToolBar by
1804 : //executing a menu entry, e.g. inserting a chart replaces the toolbars
1805 0 : pManagerMenu = m_bDisposed ? NULL : m_pToolBar->GetMenu();
1806 0 : if (pManagerMenu)
1807 : {
1808 : // Unlink our listeners again -- see above for why.
1809 0 : pManagerMenu->SetSelectHdl( Link<>() );
1810 0 : pManagerMenu->SetDeactivateHdl( Link<Menu *, bool>() );
1811 : }
1812 0 : }
1813 : }
1814 :
1815 0 : IMPL_LINK_TYPED( ToolBarManager, MenuButton, ToolBox*, pToolBar, void )
1816 : {
1817 0 : SolarMutexGuard g;
1818 :
1819 0 : if ( m_bDisposed )
1820 0 : return;
1821 :
1822 0 : pToolBar->UpdateCustomMenu();
1823 : // remove all entries that do not come from the toolbar itself (fdo#38276)
1824 0 : ImplClearPopupMenu( pToolBar );
1825 : }
1826 :
1827 0 : IMPL_LINK( ToolBarManager, MenuSelect, Menu*, pMenu )
1828 : {
1829 : // We have to hold a reference to ourself as it is possible that we will be disposed and
1830 : // our refcount could be zero (destruction) otherwise.
1831 0 : Reference< XInterface > xInterface( static_cast< OWeakObject* >( this ), UNO_QUERY );
1832 :
1833 : {
1834 : // The guard must be in its own context as the we can get destroyed when our
1835 : // own xInterface reference get destroyed!
1836 0 : SolarMutexGuard g;
1837 :
1838 0 : if ( m_bDisposed )
1839 0 : return 1;
1840 :
1841 0 : switch ( pMenu->GetCurItemId() )
1842 : {
1843 : case MENUITEM_TOOLBAR_CUSTOMIZETOOLBAR:
1844 : {
1845 0 : Reference< XDispatch > xDisp;
1846 0 : com::sun::star::util::URL aURL;
1847 0 : if ( m_xFrame.is() )
1848 : {
1849 0 : Reference< XDispatchProvider > xProv( m_xFrame, UNO_QUERY );
1850 0 : aURL.Complete = ".uno:ConfigureDialog";
1851 0 : m_xURLTransformer->parseStrict( aURL );
1852 0 : if ( xProv.is() )
1853 0 : xDisp = xProv->queryDispatch( aURL, OUString(), 0 );
1854 : }
1855 :
1856 0 : if ( xDisp.is() )
1857 : {
1858 0 : Sequence< PropertyValue > aPropSeq( 1 );
1859 :
1860 0 : aPropSeq[ 0 ].Name = "ResourceURL";
1861 0 : aPropSeq[ 0 ].Value <<= m_aResourceName;
1862 :
1863 0 : xDisp->dispatch( aURL, aPropSeq );
1864 : }
1865 0 : break;
1866 : }
1867 :
1868 : case MENUITEM_TOOLBAR_DOCKTOOLBAR:
1869 : {
1870 0 : ExecuteInfo* pExecuteInfo = new ExecuteInfo;
1871 :
1872 0 : pExecuteInfo->aToolbarResName = m_aResourceName;
1873 0 : pExecuteInfo->nCmd = EXEC_CMD_DOCKTOOLBAR;
1874 0 : pExecuteInfo->xLayoutManager = getLayoutManagerFromFrame( m_xFrame );
1875 :
1876 0 : Application::PostUserEvent( LINK(0, ToolBarManager, ExecuteHdl_Impl), pExecuteInfo );
1877 0 : break;
1878 : }
1879 :
1880 : case MENUITEM_TOOLBAR_DOCKALLTOOLBAR:
1881 : {
1882 0 : ExecuteInfo* pExecuteInfo = new ExecuteInfo;
1883 :
1884 0 : pExecuteInfo->aToolbarResName = m_aResourceName;
1885 0 : pExecuteInfo->nCmd = EXEC_CMD_DOCKALLTOOLBARS;
1886 0 : pExecuteInfo->xLayoutManager = getLayoutManagerFromFrame( m_xFrame );
1887 :
1888 0 : Application::PostUserEvent( LINK(0, ToolBarManager, ExecuteHdl_Impl), pExecuteInfo );
1889 0 : break;
1890 : }
1891 :
1892 : case MENUITEM_TOOLBAR_LOCKTOOLBARPOSITION:
1893 : {
1894 0 : Reference< XLayoutManager > xLayoutManager = getLayoutManagerFromFrame( m_xFrame );
1895 0 : if ( xLayoutManager.is() )
1896 : {
1897 0 : Reference< XDockableWindow > xDockable( VCLUnoHelper::GetInterface( m_pToolBar ), UNO_QUERY );
1898 :
1899 0 : if( xDockable->isLocked() )
1900 0 : xLayoutManager->unlockWindow( m_aResourceName );
1901 : else
1902 0 : xLayoutManager->lockWindow( m_aResourceName );
1903 : }
1904 0 : break;
1905 : }
1906 :
1907 : case MENUITEM_TOOLBAR_CLOSE:
1908 : {
1909 0 : ExecuteInfo* pExecuteInfo = new ExecuteInfo;
1910 :
1911 0 : pExecuteInfo->aToolbarResName = m_aResourceName;
1912 0 : pExecuteInfo->nCmd = EXEC_CMD_CLOSETOOLBAR;
1913 0 : pExecuteInfo->xLayoutManager = getLayoutManagerFromFrame( m_xFrame );
1914 0 : pExecuteInfo->xWindow = VCLUnoHelper::GetInterface( m_pToolBar );
1915 :
1916 0 : Application::PostUserEvent( LINK(0, ToolBarManager, ExecuteHdl_Impl), pExecuteInfo );
1917 0 : break;
1918 : }
1919 :
1920 : default:
1921 : {
1922 0 : sal_uInt16 nId = pMenu->GetCurItemId();
1923 0 : if(( nId > 0 ) && ( nId < TOOLBOX_MENUITEM_START ))
1924 : // Items in the "enable/disable" sub-menu
1925 : {
1926 : // toggle toolbar button visibility
1927 0 : OUString aCommand = pMenu->GetItemCommand( nId );
1928 :
1929 0 : Reference< XLayoutManager > xLayoutManager = getLayoutManagerFromFrame( m_xFrame );
1930 0 : if ( xLayoutManager.is() )
1931 : {
1932 0 : Reference< XUIElementSettings > xUIElementSettings( xLayoutManager->getElement( m_aResourceName ), UNO_QUERY );
1933 0 : if ( xUIElementSettings.is() )
1934 : {
1935 0 : Reference< XIndexContainer > xItemContainer( xUIElementSettings->getSettings( sal_True ), UNO_QUERY );
1936 0 : sal_Int32 nCount = xItemContainer->getCount();
1937 0 : for ( sal_Int32 i = 0; i < nCount; i++ )
1938 : {
1939 0 : Sequence< PropertyValue > aProp;
1940 0 : sal_Int32 nVisibleIndex( -1 );
1941 0 : OUString aCommandURL;
1942 0 : bool bVisible( false );
1943 :
1944 0 : if ( xItemContainer->getByIndex( i ) >>= aProp )
1945 : {
1946 0 : for ( sal_Int32 j = 0; j < aProp.getLength(); j++ )
1947 : {
1948 0 : if ( aProp[j].Name == ITEM_DESCRIPTOR_COMMANDURL )
1949 : {
1950 0 : aProp[j].Value >>= aCommandURL;
1951 : }
1952 0 : else if ( aProp[j].Name == ITEM_DESCRIPTOR_VISIBLE )
1953 : {
1954 0 : aProp[j].Value >>= bVisible;
1955 0 : nVisibleIndex = j;
1956 : }
1957 : }
1958 :
1959 0 : if (( aCommandURL == aCommand ) && ( nVisibleIndex >= 0 ))
1960 : {
1961 : // We have found the requested item, toggle the visible flag
1962 : // and write back the configuration settings to the toolbar
1963 0 : aProp[nVisibleIndex].Value = makeAny( !bVisible );
1964 : try
1965 : {
1966 0 : xItemContainer->replaceByIndex( i, makeAny( aProp ));
1967 0 : xUIElementSettings->setSettings( xItemContainer );
1968 0 : Reference< XPropertySet > xPropSet( xUIElementSettings, UNO_QUERY );
1969 0 : if ( xPropSet.is() )
1970 : {
1971 0 : Reference< XUIConfigurationPersistence > xUICfgMgr;
1972 0 : if (( xPropSet->getPropertyValue("ConfigurationSource") >>= xUICfgMgr ) && ( xUICfgMgr.is() ))
1973 0 : xUICfgMgr->store();
1974 0 : }
1975 : }
1976 0 : catch (const Exception&)
1977 : {
1978 : }
1979 :
1980 0 : break;
1981 : }
1982 : }
1983 0 : }
1984 0 : }
1985 0 : }
1986 : }
1987 : else
1988 : // The list of "hidden items", i.e. items which are disabled on
1989 : // the toolbar hence shown in the context menu for easier access,
1990 : // which are managed by the owning toolbar.
1991 : {
1992 0 : m_pToolBar->TriggerItem( pMenu->GetCurItemId()
1993 0 : - TOOLBOX_MENUITEM_START );
1994 : }
1995 0 : break;
1996 : }
1997 : }
1998 :
1999 : // remove all entries - deactivate is not reliable
2000 : // The method checks if we are already disposed and in that case does nothing!
2001 0 : ImplClearPopupMenu( m_pToolBar );
2002 : }
2003 :
2004 0 : return 1;
2005 : }
2006 :
2007 4 : IMPL_LINK_NOARG_TYPED(ToolBarManager, Select, ToolBox *, void)
2008 : {
2009 2 : if ( m_bDisposed )
2010 2 : return;
2011 :
2012 2 : sal_Int16 nKeyModifier( (sal_Int16)m_pToolBar->GetModifier() );
2013 2 : sal_uInt16 nId( m_pToolBar->GetCurItemId() );
2014 :
2015 2 : ToolBarControllerMap::const_iterator pIter = m_aControllerMap.find( nId );
2016 2 : if ( pIter != m_aControllerMap.end() )
2017 : {
2018 2 : Reference< XToolbarController > xController( pIter->second, UNO_QUERY );
2019 :
2020 2 : if ( xController.is() )
2021 2 : xController->execute( nKeyModifier );
2022 : }
2023 : }
2024 :
2025 59220 : IMPL_LINK_TYPED( ToolBarManager, StateChanged, StateChangedType const *, pStateChangedType, void )
2026 : {
2027 29610 : if ( m_bDisposed )
2028 29610 : return;
2029 :
2030 29610 : if ( *pStateChangedType == StateChangedType::ControlBackground )
2031 : {
2032 0 : CheckAndUpdateImages();
2033 : }
2034 29610 : else if ( *pStateChangedType == StateChangedType::Visible )
2035 : {
2036 13350 : if ( m_pToolBar->IsReallyVisible() )
2037 : {
2038 6668 : m_aAsyncUpdateControllersTimer.Start();
2039 : }
2040 : }
2041 16260 : else if ( *pStateChangedType == StateChangedType::InitShow )
2042 : {
2043 6678 : m_aAsyncUpdateControllersTimer.Start();
2044 : }
2045 : }
2046 :
2047 12 : IMPL_LINK_TYPED( ToolBarManager, DataChanged, DataChangedEvent const *, pDataChangedEvent, void )
2048 : {
2049 18 : if ((( pDataChangedEvent->GetType() == DataChangedEventType::SETTINGS ) ||
2050 24 : ( pDataChangedEvent->GetType() == DataChangedEventType::DISPLAY )) &&
2051 24 : ( pDataChangedEvent->GetFlags() & AllSettingsFlags::STYLE ))
2052 : {
2053 0 : CheckAndUpdateImages();
2054 : }
2055 :
2056 6 : for ( sal_uInt16 nPos = 0; nPos < m_pToolBar->GetItemCount(); ++nPos )
2057 : {
2058 0 : const sal_uInt16 nId = m_pToolBar->GetItemId(nPos);
2059 0 : vcl::Window* pWindow = m_pToolBar->GetItemWindow( nId );
2060 0 : if ( pWindow )
2061 : {
2062 0 : const DataChangedEvent& rDCEvt( *pDataChangedEvent );
2063 0 : pWindow->DataChanged( rDCEvt );
2064 : }
2065 : }
2066 :
2067 12 : if ( !m_pToolBar->IsFloatingMode() &&
2068 6 : m_pToolBar->IsVisible() )
2069 : {
2070 : // Resize toolbar, layout manager is resize listener and will calc
2071 : // the layout automatically.
2072 6 : ::Size aSize( m_pToolBar->CalcWindowSizePixel() );
2073 6 : m_pToolBar->SetOutputSizePixel( aSize );
2074 : }
2075 6 : }
2076 :
2077 0 : IMPL_LINK_NOARG(ToolBarManager, MiscOptionsChanged)
2078 : {
2079 0 : CheckAndUpdateImages();
2080 0 : return 0;
2081 : }
2082 :
2083 2688 : IMPL_LINK_NOARG_TYPED(ToolBarManager, AsyncUpdateControllersHdl, Timer *, void)
2084 : {
2085 : // The guard must be in its own context as the we can get destroyed when our
2086 : // own xInterface reference get destroyed!
2087 1344 : Reference< XComponent > xThis( static_cast< OWeakObject* >(this), UNO_QUERY );
2088 :
2089 2688 : SolarMutexGuard g;
2090 :
2091 1344 : if ( m_bDisposed )
2092 1344 : return;
2093 :
2094 : // Request to update our controllers
2095 1344 : m_aAsyncUpdateControllersTimer.Stop();
2096 2688 : UpdateControllers();
2097 : }
2098 :
2099 0 : IMPL_STATIC_LINK( ToolBarManager, ExecuteHdl_Impl, ExecuteInfo*, pExecuteInfo )
2100 : {
2101 : try
2102 : {
2103 : // Asynchronous execution as this can lead to our own destruction!
2104 0 : if (( pExecuteInfo->nCmd == EXEC_CMD_CLOSETOOLBAR ) &&
2105 0 : ( pExecuteInfo->xLayoutManager.is() ) &&
2106 0 : ( pExecuteInfo->xWindow.is() ))
2107 : {
2108 : // Use docking window close to close the toolbar. The toolbar layout manager is
2109 : // listener and will react correctly according to the context sensitive
2110 : // flag of our toolbar.
2111 0 : vcl::Window* pWin = VCLUnoHelper::GetWindow( pExecuteInfo->xWindow );
2112 0 : DockingWindow* pDockWin = dynamic_cast< DockingWindow* >( pWin );
2113 0 : if ( pDockWin )
2114 0 : pDockWin->Close();
2115 : }
2116 0 : else if (( pExecuteInfo->nCmd == EXEC_CMD_DOCKTOOLBAR ) &&
2117 0 : ( pExecuteInfo->xLayoutManager.is() ))
2118 : {
2119 0 : ::com::sun::star::awt::Point aPoint;
2120 0 : aPoint.X = aPoint.Y = SAL_MAX_INT32;
2121 0 : pExecuteInfo->xLayoutManager->dockWindow( pExecuteInfo->aToolbarResName,
2122 : DockingArea_DOCKINGAREA_DEFAULT,
2123 0 : aPoint );
2124 : }
2125 0 : else if (( pExecuteInfo->nCmd == EXEC_CMD_DOCKALLTOOLBARS ) &&
2126 0 : ( pExecuteInfo->xLayoutManager.is() ))
2127 : {
2128 0 : pExecuteInfo->xLayoutManager->dockAllWindows( UIElementType::TOOLBAR );
2129 : }
2130 : }
2131 0 : catch (const Exception&)
2132 : {
2133 : }
2134 :
2135 0 : delete pExecuteInfo;
2136 0 : return 0;
2137 : }
2138 :
2139 206 : Image ToolBarManager::QueryAddonsImage( const OUString& aCommandURL, bool bBigImages )
2140 : {
2141 206 : Image aImage = framework::AddonsOptions().GetImageFromURL( aCommandURL, bBigImages );
2142 206 : return aImage;
2143 : }
2144 :
2145 159217 : bool ToolBarManager::impl_RetrieveShortcutsFromConfiguration(
2146 : const Reference< XAcceleratorConfiguration >& rAccelCfg,
2147 : const OUString& rCommand,
2148 : OUString& rShortCut )
2149 : {
2150 159217 : if ( rAccelCfg.is() )
2151 : {
2152 : try
2153 : {
2154 159217 : com::sun::star::awt::KeyEvent aKeyEvent;
2155 318429 : Sequence< OUString > aCommands(1);
2156 159217 : aCommands[0] = rCommand;
2157 :
2158 318429 : Sequence< Any > aSeqKeyCode( rAccelCfg->getPreferredKeyEventsForCommandList( aCommands ) );
2159 159217 : if( aSeqKeyCode.getLength() == 1 )
2160 : {
2161 159217 : if ( aSeqKeyCode[0] >>= aKeyEvent )
2162 : {
2163 5 : rShortCut = svt::AcceleratorExecute::st_AWTKey2VCLKey( aKeyEvent ).GetName();
2164 5 : return true;
2165 : }
2166 159212 : }
2167 : }
2168 0 : catch (const IllegalArgumentException&)
2169 : {
2170 : }
2171 : }
2172 :
2173 159212 : return false;
2174 : }
2175 :
2176 53343 : bool ToolBarManager::RetrieveShortcut( const OUString& rCommandURL, OUString& rShortCut )
2177 : {
2178 53343 : if ( m_bModuleIdentified )
2179 : {
2180 53343 : Reference< XAcceleratorConfiguration > xDocAccelCfg( m_xDocAcceleratorManager );
2181 106681 : Reference< XAcceleratorConfiguration > xModuleAccelCfg( m_xModuleAcceleratorManager );
2182 106681 : Reference< XAcceleratorConfiguration > xGlobalAccelCfg( m_xGlobalAcceleratorManager );
2183 :
2184 53343 : if ( !m_bAcceleratorCfg )
2185 : {
2186 : // Retrieve references on demand
2187 1236 : m_bAcceleratorCfg = true;
2188 1236 : if ( !xDocAccelCfg.is() )
2189 : {
2190 1236 : Reference< XController > xController = m_xFrame->getController();
2191 2472 : Reference< XModel > xModel;
2192 1236 : if ( xController.is() )
2193 : {
2194 1236 : xModel = xController->getModel();
2195 1236 : if ( xModel.is() )
2196 : {
2197 1235 : Reference< XUIConfigurationManagerSupplier > xSupplier( xModel, UNO_QUERY );
2198 1235 : if ( xSupplier.is() )
2199 : {
2200 1184 : Reference< XUIConfigurationManager > xDocUICfgMgr( xSupplier->getUIConfigurationManager(), UNO_QUERY );
2201 1184 : if ( xDocUICfgMgr.is() )
2202 : {
2203 1184 : xDocAccelCfg = xDocUICfgMgr->getShortCutManager();
2204 1184 : m_xDocAcceleratorManager = xDocAccelCfg;
2205 1184 : }
2206 1235 : }
2207 : }
2208 1236 : }
2209 : }
2210 :
2211 1236 : if ( !xModuleAccelCfg.is() )
2212 : {
2213 : Reference< XModuleUIConfigurationManagerSupplier > xModuleCfgMgrSupplier =
2214 1236 : theModuleUIConfigurationManagerSupplier::get( m_xContext );
2215 : try
2216 : {
2217 1236 : Reference< XUIConfigurationManager > xUICfgMgr = xModuleCfgMgrSupplier->getUIConfigurationManager( m_aModuleIdentifier );
2218 1236 : if ( xUICfgMgr.is() )
2219 : {
2220 1236 : xModuleAccelCfg = xUICfgMgr->getShortCutManager();
2221 1236 : m_xModuleAcceleratorManager = xModuleAccelCfg;
2222 1236 : }
2223 : }
2224 0 : catch (const RuntimeException&)
2225 : {
2226 0 : throw;
2227 : }
2228 0 : catch (const Exception&)
2229 : {
2230 1236 : }
2231 : }
2232 :
2233 1236 : if ( !xGlobalAccelCfg.is() ) try
2234 : {
2235 1236 : xGlobalAccelCfg = GlobalAcceleratorConfiguration::create( m_xContext );
2236 1236 : m_xGlobalAcceleratorManager = xGlobalAccelCfg;
2237 : }
2238 0 : catch ( const css::uno::DeploymentException& )
2239 : {
2240 : SAL_WARN("fwk.uielement", "GlobalAcceleratorConfiguration"
2241 : " not available. This should happen only on mobile platforms.");
2242 : }
2243 : }
2244 :
2245 53343 : bool bFound = false;
2246 :
2247 53343 : if ( m_xGlobalAcceleratorManager.is() )
2248 53343 : bFound = impl_RetrieveShortcutsFromConfiguration( xGlobalAccelCfg, rCommandURL, rShortCut );
2249 53343 : if ( !bFound && m_xModuleAcceleratorManager.is() )
2250 53338 : bFound = impl_RetrieveShortcutsFromConfiguration( xModuleAccelCfg, rCommandURL, rShortCut );
2251 53343 : if ( !bFound && m_xDocAcceleratorManager.is() )
2252 52536 : impl_RetrieveShortcutsFromConfiguration( xGlobalAccelCfg, rCommandURL, rShortCut );
2253 :
2254 53343 : if( bFound )
2255 53343 : return true;
2256 : }
2257 53338 : return false;
2258 : }
2259 :
2260 648 : }
2261 :
2262 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|