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