1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: toolbarmanager.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_framework.hxx"
33 #include <uielement/toolbarmanager.hxx>
35 //_________________________________________________________________________________________________________________
37 //_________________________________________________________________________________________________________________
40 #ifndef __FRAMEWORK_UIELEMENT_TOOLBAR_HXX
41 #include <uielement/toolbar.hxx>
43 #ifndef __FRAMEWORK_UIELEMENT_GENERICTOOLBARCONTROLLER_HXX
44 #include <uielement/generictoolbarcontroller.hxx>
46 #include <threadhelp/resetableguard.hxx>
49 #include "properties.h"
50 #include <helper/imageproducer.hxx>
51 #include <classes/sfxhelperfunctions.hxx>
52 #include <classes/fwkresid.hxx>
53 #ifndef __FRAMEWORK_CLASES_RESOURCE_HRC_
54 #include <classes/resource.hrc>
56 #include <classes/addonsoptions.hxx>
57 #include <uielement/toolbarmerger.hxx>
59 //_________________________________________________________________________________________________________________
61 //_________________________________________________________________________________________________________________
62 #include <com/sun/star/ui/ItemType.hpp>
63 #include <com/sun/star/frame/XDispatchProvider.hpp>
64 #include <com/sun/star/beans/XPropertySet.hpp>
65 #include <com/sun/star/awt/XDockableWindow.hpp>
66 #include <com/sun/star/frame/XLayoutManager.hpp>
67 #ifndef _COM_SUN_STAR_UI_XDOCKINGAREA_HPP_
68 #include <com/sun/star/ui/DockingArea.hpp>
70 #include <com/sun/star/graphic/XGraphic.hpp>
71 #include <com/sun/star/lang/XMultiComponentFactory.hpp>
72 #include <com/sun/star/frame/XModuleManager.hpp>
73 #include <com/sun/star/ui/XUIElementSettings.hpp>
74 #include <com/sun/star/ui/XUIConfigurationPersistence.hpp>
75 #include <com/sun/star/ui/XModuleUIConfigurationManagerSupplier.hpp>
76 #include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
77 #include <com/sun/star/ui/ImageType.hpp>
78 #include <com/sun/star/ui/UIElementType.hpp>
79 #include <comphelper/sequence.hxx>
80 #include <com/sun/star/frame/status/Visibility.hpp>
82 //_________________________________________________________________________________________________________________
84 //_________________________________________________________________________________________________________________
85 #include <svtools/imgdef.hxx>
86 #include <svtools/toolboxcontroller.hxx>
87 #include <svtools/cmdoptions.hxx>
88 #ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_
89 #include <toolkit/unohlp.hxx>
91 #include <comphelper/mediadescriptor.hxx>
92 #include <svtools/miscopt.hxx>
93 #include <svtools/imageitm.hxx>
94 #include <svtools/framestatuslistener.hxx>
95 #include <vcl/svapp.hxx>
96 #include <vcl/menu.hxx>
97 #include <vcl/syswin.hxx>
98 #include <vcl/taskpanelist.hxx>
99 #include <rtl/logfile.hxx>
100 #include <svtools/menuoptions.hxx>
101 #include <svtools/cmdoptions.hxx>
102 #include <boost/bind.hpp>
104 //_________________________________________________________________________________________________________________
106 //_________________________________________________________________________________________________________________
108 using namespace ::com::sun::star::awt
;
109 using namespace ::com::sun::star::beans
;
110 using namespace ::com::sun::star::uno
;
111 using namespace ::com::sun::star::lang
;
112 using namespace ::com::sun::star::frame
;
113 using namespace ::com::sun::star::graphic
;
114 using namespace ::com::sun::star::util
;
115 using namespace ::com::sun::star::container
;
116 using namespace ::com::sun::star::frame
;
117 using namespace ::com::sun::star::ui
;
122 static const char ITEM_DESCRIPTOR_COMMANDURL
[] = "CommandURL";
123 static const char ITEM_DESCRIPTOR_HELPURL
[] = "HelpURL";
124 static const char ITEM_DESCRIPTOR_TOOLTIP
[] = "Tooltip";
125 static const char ITEM_DESCRIPTOR_CONTAINER
[] = "ItemDescriptorContainer";
126 static const char ITEM_DESCRIPTOR_LABEL
[] = "Label";
127 static const char ITEM_DESCRIPTOR_TYPE
[] = "Type";
128 static const char ITEM_DESCRIPTOR_VISIBLE
[] = "IsVisible";
129 static const char ITEM_DESCRIPTOR_WIDTH
[] = "Width";
130 static const char ITEM_DESCRIPTOR_STYLE
[] = "Style";
132 static const sal_Int32 ITEM_DESCRIPTOR_COMMANDURL_LEN
= 10;
133 static const sal_Int32 ITEM_DESCRIPTOR_HELPURL_LEN
= 7;
134 static const sal_Int32 ITEM_DESCRIPTOR_TOOLTIP_LEN
= 7;
135 static const sal_Int32 ITEM_DESCRIPTOR_CONTAINER_LEN
= 23;
136 static const sal_Int32 ITEM_DESCRIPTOR_LABEL_LEN
= 5;
137 static const sal_Int32 ITEM_DESCRIPTOR_TYPE_LEN
= 4;
138 static const sal_Int32 ITEM_DESCRIPTOR_VISIBLE_LEN
= 9;
139 static const sal_Int32 ITEM_DESCRIPTOR_WIDTH_LEN
= 5;
140 static const sal_Int32 ITEM_DESCRIPTOR_STYLE_LEN
= 5;
142 static const char HELPID_PREFIX
[] = "helpid:";
143 static const char HELPID_PREFIX_TESTTOOL
[] = ".HelpId:";
144 //static sal_Int32 HELPID_PREFIX_LENGTH = 7;
145 static const USHORT STARTID_CUSTOMIZE_POPUPMENU
= 1000;
148 class ImageOrientationListener
: public svt::FrameStatusListener
151 ImageOrientationListener( const Reference
< XStatusListener
> rReceiver
,
152 const Reference
< XMultiServiceFactory
> rServiceManager
,
153 const Reference
< XFrame
> rFrame
);
154 virtual ~ImageOrientationListener();
156 virtual void SAL_CALL
statusChanged( const ::com::sun::star::frame::FeatureStateEvent
& Event
) throw ( ::com::sun::star::uno::RuntimeException
);
159 Reference
< XStatusListener
> m_xReceiver
;
162 ImageOrientationListener::ImageOrientationListener(
163 const Reference
< XStatusListener
> rReceiver
,
164 const Reference
< XMultiServiceFactory
> rServiceManager
,
165 const Reference
< XFrame
> rFrame
) :
166 FrameStatusListener( rServiceManager
, rFrame
),
167 m_xReceiver( rReceiver
)
171 ImageOrientationListener::~ImageOrientationListener()
175 void SAL_CALL
ImageOrientationListener::statusChanged( const FeatureStateEvent
& Event
)
176 throw ( RuntimeException
)
178 if ( m_xReceiver
.is() )
179 m_xReceiver
->statusChanged( Event
);
182 //*****************************************************************************************************************
184 static sal_Int16
getImageTypeFromBools( sal_Bool bBig
, sal_Bool bHighContrast
)
188 n
|= ::com::sun::star::ui::ImageType::SIZE_LARGE
;
190 n
|= ::com::sun::star::ui::ImageType::COLOR_HIGHCONTRAST
;
194 static ::com::sun::star::uno::Reference
< ::com::sun::star::frame::XLayoutManager
> getLayoutManagerFromFrame(
195 ::com::sun::star::uno::Reference
< ::com::sun::star::frame::XFrame
>& rFrame
)
197 ::com::sun::star::uno::Reference
< ::com::sun::star::frame::XLayoutManager
> xLayoutManager
;
199 Reference
< XPropertySet
> xPropSet( rFrame
, UNO_QUERY
);
204 xPropSet
->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" ))) >>= xLayoutManager
;
206 catch ( RuntimeException
& )
215 return xLayoutManager
;
218 //*****************************************************************************************************************
219 // XInterface, XTypeProvider, XServiceInfo
220 //*****************************************************************************************************************
221 DEFINE_XINTERFACE_6 ( ToolBarManager
,
223 DIRECT_INTERFACE( ::com::sun::star::lang::XTypeProvider
),
224 DIRECT_INTERFACE( ::com::sun::star::lang::XComponent
),
225 DIRECT_INTERFACE( ::com::sun::star::frame::XFrameActionListener
),
226 DIRECT_INTERFACE( ::com::sun::star::ui::XUIConfigurationListener
),
227 DIRECT_INTERFACE( ::com::sun::star::frame::XStatusListener
),
228 DERIVED_INTERFACE( ::com::sun::star::lang::XEventListener
, ::com::sun::star::frame::XFrameActionListener
)
231 DEFINE_XTYPEPROVIDER_6 ( ToolBarManager
,
232 ::com::sun::star::lang::XTypeProvider
,
233 ::com::sun::star::lang::XComponent
,
234 ::com::sun::star::ui::XUIConfigurationListener
,
235 ::com::sun::star::frame::XFrameActionListener
,
236 ::com::sun::star::frame::XStatusListener
,
237 ::com::sun::star::lang::XEventListener
240 ToolBarManager::ToolBarManager( const Reference
< XMultiServiceFactory
>& rServiceManager
,
241 const Reference
< XFrame
>& rFrame
,
242 const rtl::OUString
& rResourceName
,
243 ToolBar
* pToolBar
) :
244 ThreadHelpBase( &Application::GetSolarMutex() ),
246 m_bDisposed( sal_False
),
247 m_bIsHiContrast( pToolBar
->GetSettings().GetStyleSettings().GetHighContrastMode() ),
248 m_bSmallSymbols( !SvtMiscOptions().AreCurrentSymbolsLarge() ),
249 m_bModuleIdentified( sal_False
),
250 m_bAddedToTaskPaneList( sal_True
),
251 m_bFrameActionRegistered( sal_False
),
252 m_bUpdateControllers( sal_False
),
253 m_bImageOrientationRegistered( sal_False
),
254 m_bImageMirrored( sal_False
),
255 m_bCanBeCustomized( !SvtMiscOptions().DisableUICustomization() ),
256 m_lImageRotation( 0 ),
257 m_pToolBar( pToolBar
),
258 m_aResourceName( rResourceName
),
260 m_aListenerContainer( m_aLock
.getShareableOslMutex() ),
261 m_xServiceManager( rServiceManager
),
262 m_nSymbolsStyle( SvtMiscOptions().GetCurrentSymbolsStyle() )
264 Window
* pWindow
= m_pToolBar
;
265 while ( pWindow
&& !pWindow
->IsSystemWindow() )
266 pWindow
= pWindow
->GetParent();
269 ((SystemWindow
*)pWindow
)->GetTaskPaneList()->AddWindow( m_pToolBar
);
271 if ( m_xServiceManager
.is() )
273 m_xToolbarControllerRegistration
= Reference
< XUIControllerRegistration
>(
274 m_xServiceManager
->createInstance( SERVICENAME_TOOLBARCONTROLLERFACTORY
),
277 m_xURLTransformer
.set( m_xServiceManager
->createInstance(
278 SERVICENAME_URLTRANSFORMER
),
282 m_pToolBar
->SetSelectHdl( LINK( this, ToolBarManager
, Select
) );
283 m_pToolBar
->SetActivateHdl( LINK( this, ToolBarManager
, Activate
) );
284 m_pToolBar
->SetDeactivateHdl( LINK( this, ToolBarManager
, Deactivate
) );
285 m_pToolBar
->SetClickHdl( LINK( this, ToolBarManager
, Click
) );
286 m_pToolBar
->SetDropdownClickHdl( LINK( this, ToolBarManager
, DropdownClick
) );
287 m_pToolBar
->SetDoubleClickHdl( LINK( this, ToolBarManager
, DoubleClick
) );
288 m_pToolBar
->SetStateChangedHdl( LINK( this, ToolBarManager
, StateChanged
) );
289 m_pToolBar
->SetDataChangedHdl( LINK( this, ToolBarManager
, DataChanged
) );
290 m_pToolBar
->SetToolboxButtonSize( m_bSmallSymbols
? TOOLBOX_BUTTONSIZE_SMALL
: TOOLBOX_BUTTONSIZE_LARGE
);
292 // enables a menu for clipped items and customization
293 SvtCommandOptions aCmdOptions
;
294 USHORT nMenuType
= TOOLBOX_MENUTYPE_CLIPPEDITEMS
;
295 if ( !aCmdOptions
.Lookup( SvtCommandOptions::CMDOPTION_DISABLED
, ::rtl::OUString::createFromAscii( "CreateDialog" )))
296 nMenuType
|= TOOLBOX_MENUTYPE_CUSTOMIZE
;
297 //added for issue33668 by shizhoubo
298 m_pToolBar
->SetCommandHdl( LINK( this, ToolBarManager
, Command
) );
300 m_pToolBar
->SetMenuType( nMenuType
);
301 m_pToolBar
->SetMenuButtonHdl( LINK( this, ToolBarManager
, MenuButton
) );
302 m_pToolBar
->GetMenu()->SetSelectHdl( LINK( this, ToolBarManager
, MenuSelect
) );
303 m_pToolBar
->GetMenu()->SetDeactivateHdl( LINK( this, ToolBarManager
, MenuDeactivate
) );
305 // set name for testtool, the useful part is after the last '/'
306 sal_Int32 idx
= rResourceName
.lastIndexOf('/');
307 idx
++; // will become 0 if '/' not found: use full string
308 ::rtl::OUString
aHelpIdAsString( RTL_CONSTASCII_USTRINGPARAM( HELPID_PREFIX_TESTTOOL
));
309 ::rtl::OUString aToolbarName
= rResourceName
.copy( idx
);
310 aHelpIdAsString
+= aToolbarName
;
311 m_pToolBar
->SetSmartHelpId( SmartId( aHelpIdAsString
) );
313 m_aAsyncUpdateControllersTimer
.SetTimeout( 50 );
314 m_aAsyncUpdateControllersTimer
.SetTimeoutHdl( LINK( this, ToolBarManager
, AsyncUpdateControllersHdl
) );
317 ToolBarManager::~ToolBarManager()
319 OSL_ASSERT( m_pToolBar
== 0 );
320 OSL_ASSERT( !m_bAddedToTaskPaneList
);
323 void ToolBarManager::Destroy()
325 ResetableGuard
aGuard( m_aLock
);
326 if ( m_bAddedToTaskPaneList
)
328 Window
* pWindow
= m_pToolBar
;
329 while ( pWindow
&& !pWindow
->IsSystemWindow() )
330 pWindow
= pWindow
->GetParent();
333 ((SystemWindow
*)pWindow
)->GetTaskPaneList()->RemoveWindow( m_pToolBar
);
334 m_bAddedToTaskPaneList
= sal_False
;
337 // Delete the additional add-ons data
338 for ( sal_uInt16 i
= 0; i
< m_pToolBar
->GetItemCount(); i
++ )
340 sal_uInt16 nItemId
= m_pToolBar
->GetItemId( i
);
342 delete static_cast< AddonsParams
* >( m_pToolBar
->GetItemData( nItemId
));
345 /* #i99167# removed change for i93173 since there is some weird crash */
346 // #i93173# delete toolbar lazily as we can still be in one of its handlers
347 m_pToolBar
->doLazyDelete();
350 m_pToolBar
->SetSelectHdl( aEmpty
);
351 m_pToolBar
->SetActivateHdl( aEmpty
);
352 m_pToolBar
->SetDeactivateHdl( aEmpty
);
353 m_pToolBar
->SetClickHdl( aEmpty
);
354 m_pToolBar
->SetDropdownClickHdl( aEmpty
);
355 m_pToolBar
->SetDoubleClickHdl( aEmpty
);
356 m_pToolBar
->SetStateChangedHdl( aEmpty
);
357 m_pToolBar
->SetDataChangedHdl( aEmpty
);
359 // delete m_pToolBar;
363 ToolBox
* ToolBarManager::GetToolBar() const
365 ResetableGuard
aGuard( m_aLock
);
369 void ToolBarManager::CheckAndUpdateImages()
371 ResetableGuard
aGuard( m_aLock
);
372 sal_Bool bRefreshImages
= sal_False
;
374 // Check if high contrast/normal mode have changed
375 if ( m_pToolBar
->GetSettings().GetStyleSettings().GetHighContrastMode() )
377 if ( !m_bIsHiContrast
)
379 bRefreshImages
= TRUE
;
380 m_bIsHiContrast
= sal_True
;
383 else if ( m_bIsHiContrast
)
385 bRefreshImages
= sal_True
;
386 m_bIsHiContrast
= sal_False
;
389 SvtMiscOptions aMiscOptions
;
390 bool bCurrentSymbolsSmall
= !aMiscOptions
.AreCurrentSymbolsLarge();
391 if ( m_bSmallSymbols
!= bCurrentSymbolsSmall
)
393 bRefreshImages
= sal_True
;
394 m_bSmallSymbols
= bCurrentSymbolsSmall
;
397 sal_Int16 nCurrentSymbolsStyle
= aMiscOptions
.GetCurrentSymbolsStyle();
398 if ( m_nSymbolsStyle
!= nCurrentSymbolsStyle
)
400 bRefreshImages
= sal_True
;
401 m_nSymbolsStyle
= nCurrentSymbolsStyle
;
404 // Refresh images if requested
405 if ( bRefreshImages
)
409 void ToolBarManager::RefreshImages()
411 ResetableGuard
aGuard( m_aLock
);
413 sal_Bool
bBigImages( SvtMiscOptions().AreCurrentSymbolsLarge() );
414 for ( USHORT nPos
= 0; nPos
< m_pToolBar
->GetItemCount(); nPos
++ )
416 USHORT
nId( m_pToolBar
->GetItemId( nPos
) );
420 ::rtl::OUString aCommandURL
= m_pToolBar
->GetItemCommand( nId
);
421 Image aImage
= GetImageFromURL( m_xFrame
, aCommandURL
, bBigImages
, m_bIsHiContrast
);
422 // Try also to query for add-on images before giving up and use an
425 aImage
= QueryAddonsImage( aCommandURL
, bBigImages
, m_bIsHiContrast
);
426 m_pToolBar
->SetItemImage( nId
, aImage
);
430 m_pToolBar
->SetToolboxButtonSize( bBigImages
? TOOLBOX_BUTTONSIZE_LARGE
: TOOLBOX_BUTTONSIZE_SMALL
);
431 ::Size aSize
= m_pToolBar
->CalcWindowSizePixel();
432 m_pToolBar
->SetOutputSizePixel( aSize
);
435 void ToolBarManager::UpdateImageOrientation()
437 ResetableGuard
aGuard( m_aLock
);
439 if ( m_xUICommandLabels
.is() )
442 Sequence
< rtl::OUString
> aSeqMirrorCmd
;
443 Sequence
< rtl::OUString
> aSeqRotateCmd
;
444 m_xUICommandLabels
->getByName(
445 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( UICOMMANDDESCRIPTION_NAMEACCESS_COMMANDMIRRORIMAGELIST
))) >>= aSeqMirrorCmd
;
446 m_xUICommandLabels
->getByName(
447 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( UICOMMANDDESCRIPTION_NAMEACCESS_COMMANDROTATEIMAGELIST
))) >>= aSeqRotateCmd
;
449 CommandToInfoMap::iterator pIter
;
450 for ( i
= 0; i
< aSeqMirrorCmd
.getLength(); i
++ )
452 rtl::OUString aMirrorCmd
= aSeqMirrorCmd
[i
];
453 pIter
= m_aCommandMap
.find( aMirrorCmd
);
454 if ( pIter
!= m_aCommandMap
.end() )
455 pIter
->second
.bMirrored
= sal_True
;
457 for ( i
= 0; i
< aSeqRotateCmd
.getLength(); i
++ )
459 rtl::OUString aRotateCmd
= aSeqRotateCmd
[i
];
460 pIter
= m_aCommandMap
.find( aRotateCmd
);
461 if ( pIter
!= m_aCommandMap
.end() )
462 pIter
->second
.bRotated
= sal_True
;
466 for ( USHORT nPos
= 0; nPos
< m_pToolBar
->GetItemCount(); nPos
++ )
468 USHORT nId
= m_pToolBar
->GetItemId( nPos
);
471 rtl::OUString aCmd
= m_pToolBar
->GetItemCommand( nId
);
473 CommandToInfoMap::const_iterator pIter
= m_aCommandMap
.find( aCmd
);
474 if ( pIter
!= m_aCommandMap
.end() )
476 if ( pIter
->second
.bRotated
)
478 m_pToolBar
->SetItemImageMirrorMode( nId
, FALSE
);
479 m_pToolBar
->SetItemImageAngle( nId
, m_lImageRotation
);
481 if ( pIter
->second
.bMirrored
)
482 m_pToolBar
->SetItemImageMirrorMode( nId
, m_bImageMirrored
);
488 void ToolBarManager::UpdateControllers()
490 RTL_LOGFILE_CONTEXT( aLog
, "framework (cd100003) ::ToolBarManager::UpdateControllers" );
492 if( !m_bCanBeCustomized
)
495 Reference
< XLayoutManager
> xLayoutManager
;
496 Reference
< XPropertySet
> xFramePropSet( m_xFrame
, UNO_QUERY
);
497 if ( xFramePropSet
.is() )
498 a
= xFramePropSet
->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" )));
499 a
>>= xLayoutManager
;
500 Reference
< XDockableWindow
> xDockable( VCLUnoHelper::GetInterface( m_pToolBar
), UNO_QUERY
);
501 if ( xLayoutManager
.is() && xDockable
.is() )
503 ::com::sun::star::awt::Point aPoint
;
504 aPoint
.X
= aPoint
.Y
= LONG_MAX
;
505 xLayoutManager
->dockWindow( m_aResourceName
, DockingArea_DOCKINGAREA_DEFAULT
, aPoint
);
506 xLayoutManager
->lockWindow( m_aResourceName
);
510 if ( !m_bUpdateControllers
)
512 m_bUpdateControllers
= sal_True
;
513 ToolBarControllerMap::iterator pIter
= m_aControllerMap
.begin();
515 while ( pIter
!= m_aControllerMap
.end() )
519 Reference
< XUpdatable
> xUpdatable( pIter
->second
, UNO_QUERY
);
520 if ( xUpdatable
.is() )
521 xUpdatable
->update();
529 m_bUpdateControllers
= sal_False
;
532 void ToolBarManager::frameAction( const FrameActionEvent
& Action
)
533 throw ( RuntimeException
)
535 ResetableGuard
aGuard( m_aLock
);
536 if ( Action
.Action
== FrameAction_CONTEXT_CHANGED
)
537 m_aAsyncUpdateControllersTimer
.Start();
540 void SAL_CALL
ToolBarManager::statusChanged( const ::com::sun::star::frame::FeatureStateEvent
& Event
)
541 throw ( ::com::sun::star::uno::RuntimeException
)
543 ResetableGuard
aGuard( m_aLock
);
547 if ( Event
.FeatureURL
.Complete
.equalsAscii( ".uno:ImageOrientation" ))
549 SfxImageItem
aItem( 1, 0 );
550 aItem
.PutValue( Event
.State
);
552 m_lImageRotation
= aItem
.GetRotation();
553 m_bImageMirrored
= aItem
.IsMirrored();
554 UpdateImageOrientation();
558 void SAL_CALL
ToolBarManager::disposing( const EventObject
& Source
) throw ( RuntimeException
)
561 ResetableGuard
aGuard( m_aLock
);
569 ResetableGuard
aGuard( m_aLock
);
570 if ( m_xDocImageManager
.is() )
574 m_xDocImageManager
->removeConfigurationListener(
575 Reference
< XUIConfigurationListener
>(
576 static_cast< OWeakObject
* >( this ), UNO_QUERY
));
583 if ( m_xModuleImageManager
.is() )
587 m_xModuleImageManager
->removeConfigurationListener(
588 Reference
< XUIConfigurationListener
>(
589 static_cast< OWeakObject
* >( this ), UNO_QUERY
));
596 if ( m_xImageOrientationListener
.is() )
598 ImageOrientationListener
* pImageOrientation
=
599 (ImageOrientationListener
*)m_xImageOrientationListener
.get();
600 pImageOrientation
->unbindListener();
601 m_xImageOrientationListener
.clear();
604 m_xDocImageManager
.clear();
605 m_xModuleImageManager
.clear();
607 if ( Source
.Source
== Reference
< XInterface
>( m_xFrame
, UNO_QUERY
))
610 m_xServiceManager
.clear();
615 void SAL_CALL
ToolBarManager::dispose() throw( RuntimeException
)
617 Reference
< XComponent
> xThis( static_cast< OWeakObject
* >(this), UNO_QUERY
);
619 EventObject
aEvent( xThis
);
620 m_aListenerContainer
.disposeAndClear( aEvent
);
623 ResetableGuard
aGuard( m_aLock
);
625 // stop timer to prevent timer events after dispose
626 m_aAsyncUpdateControllersTimer
.Stop();
630 if ( m_xDocImageManager
.is() )
634 m_xDocImageManager
->removeConfigurationListener(
635 Reference
< XUIConfigurationListener
>(
636 static_cast< OWeakObject
* >( this ), UNO_QUERY
));
642 m_xDocImageManager
.clear();
643 if ( m_xModuleImageManager
.is() )
647 m_xModuleImageManager
->removeConfigurationListener(
648 Reference
< XUIConfigurationListener
>(
649 static_cast< OWeakObject
* >( this ), UNO_QUERY
));
655 m_xModuleImageManager
.clear();
657 ImplClearPopupMenu( m_pToolBar
);
659 // We have to destroy our toolbar instance now.
662 if ( m_bFrameActionRegistered
&& m_xFrame
.is() )
666 m_xFrame
->removeFrameActionListener( Reference
< XFrameActionListener
>(
667 static_cast< ::cppu::OWeakObject
*>( this ), UNO_QUERY
));
674 if ( m_xImageOrientationListener
.is() )
676 ImageOrientationListener
* pImageOrientation
=
677 (ImageOrientationListener
*)m_xImageOrientationListener
.get();
678 pImageOrientation
->unbindListener();
679 m_xImageOrientationListener
.clear();
683 m_xServiceManager
.clear();
685 m_bDisposed
= sal_True
;
689 void SAL_CALL
ToolBarManager::addEventListener( const Reference
< XEventListener
>& xListener
) throw( RuntimeException
)
691 ResetableGuard
aGuard( m_aLock
);
693 /* SAFE AREA ----------------------------------------------------------------------------------------------- */
695 throw DisposedException();
697 m_aListenerContainer
.addInterface( ::getCppuType( ( const Reference
< XEventListener
>* ) NULL
), xListener
);
700 void SAL_CALL
ToolBarManager::removeEventListener( const Reference
< XEventListener
>& xListener
) throw( RuntimeException
)
702 m_aListenerContainer
.removeInterface( ::getCppuType( ( const Reference
< XEventListener
>* ) NULL
), xListener
);
705 // XUIConfigurationListener
706 void SAL_CALL
ToolBarManager::elementInserted( const ::com::sun::star::ui::ConfigurationEvent
& Event
) throw (::com::sun::star::uno::RuntimeException
)
708 impl_elementChanged(false,Event
);
711 void SAL_CALL
ToolBarManager::elementRemoved( const ::com::sun::star::ui::ConfigurationEvent
& Event
) throw (::com::sun::star::uno::RuntimeException
)
713 impl_elementChanged(true,Event
);
715 void ToolBarManager::impl_elementChanged(bool _bRemove
,const ::com::sun::star::ui::ConfigurationEvent
& Event
)
717 ResetableGuard
aGuard( m_aLock
);
719 /* SAFE AREA ----------------------------------------------------------------------------------------------- */
723 Reference
< XNameAccess
> xNameAccess
;
724 sal_Int16 nImageType
= sal_Int16();
725 sal_Int16 nCurrentImageType
= getImageTypeFromBools(
726 SvtMiscOptions().AreCurrentSymbolsLarge(),
729 if (( Event
.aInfo
>>= nImageType
) &&
730 ( nImageType
== nCurrentImageType
) &&
731 ( Event
.Element
>>= xNameAccess
))
733 sal_Int16
nImageInfo( 1 );
734 Reference
< XInterface
> xIfacDocImgMgr( m_xDocImageManager
, UNO_QUERY
);
735 if ( xIfacDocImgMgr
== Event
.Source
)
738 Sequence
< rtl::OUString
> aSeq
= xNameAccess
->getElementNames();
739 for ( sal_Int32 i
= 0; i
< aSeq
.getLength(); i
++ )
741 CommandToInfoMap::iterator pIter
= m_aCommandMap
.find( aSeq
[i
] );
742 if ( pIter
!= m_aCommandMap
.end() && ( pIter
->second
.nImageInfo
>= nImageInfo
))
747 if (( pIter
->second
.nImageInfo
== 0 ) && ( pIter
->second
.nImageInfo
== nImageInfo
))
749 // Special case: An image from the document image manager has been removed.
750 // It is possible that we have a image at our module image manager. Before
751 // we can remove our image we have to ask our module image manager.
752 Sequence
< rtl::OUString
> aCmdURLSeq( 1 );
753 Sequence
< Reference
< XGraphic
> > aGraphicSeq
;
754 aCmdURLSeq
[0] = pIter
->first
;
755 aGraphicSeq
= m_xModuleImageManager
->getImages( nImageType
, aCmdURLSeq
);
756 aImage
= Image( aGraphicSeq
[0] );
759 setToolBarImage(aImage
,pIter
);
763 Reference
< XGraphic
> xGraphic
;
764 if ( xNameAccess
->getByName( aSeq
[i
] ) >>= xGraphic
)
766 Image
aImage( xGraphic
);
767 setToolBarImage(aImage
,pIter
);
769 pIter
->second
.nImageInfo
= nImageInfo
;
775 void ToolBarManager::setToolBarImage(const Image
& _aImage
,const CommandToInfoMap::const_iterator
& _pIter
)
777 const ::std::vector
< USHORT
>& _rIDs
= _pIter
->second
.aIds
;
778 m_pToolBar
->SetItemImage( _pIter
->second
.nId
, _aImage
);
779 ::std::for_each(_rIDs
.begin(),_rIDs
.end(),::boost::bind(&ToolBar::SetItemImage
,m_pToolBar
,_1
,_aImage
));
782 void SAL_CALL
ToolBarManager::elementReplaced( const ::com::sun::star::ui::ConfigurationEvent
& Event
) throw (::com::sun::star::uno::RuntimeException
)
784 impl_elementChanged(false,Event
);
787 void ToolBarManager::RemoveControllers()
789 ResetableGuard
aGuard( m_aLock
);
794 m_aSubToolBarControllerMap
.clear();
798 // Remove item window pointers from the toolbar. They were
799 // destroyed by the dispose() at the XComponent. This is needed
800 // as VCL code later tries to access the item window data in certain
801 // dtors where the item window is already invalid!
802 for ( sal_uInt16 i
= 0; i
< m_pToolBar
->GetItemCount(); i
++ )
804 sal_uInt16 nItemId
= m_pToolBar
->GetItemId( i
);
807 Reference
< XComponent
> xComponent( m_aControllerMap
[ nItemId
], UNO_QUERY
);
808 if ( xComponent
.is() )
812 xComponent
->dispose();
818 m_pToolBar
->SetItemWindow(nItemId
, 0);
821 m_aControllerMap
.clear();
824 ::rtl::OUString
ToolBarManager::RetrieveLabelFromCommand( const ::rtl::OUString
& aCmdURL
)
826 ::rtl::OUString aLabel
;
828 // Retrieve popup menu labels
829 if ( !m_bModuleIdentified
)
831 Reference
< XModuleManager
> xModuleManager( m_xServiceManager
->createInstance( SERVICENAME_MODULEMANAGER
), UNO_QUERY_THROW
);
832 Reference
< XInterface
> xIfac( m_xFrame
, UNO_QUERY
);
835 m_bModuleIdentified
= sal_True
;
836 m_aModuleIdentifier
= xModuleManager
->identify( xIfac
);
838 if ( m_aModuleIdentifier
.getLength() > 0 )
840 Reference
< XNameAccess
> xNameAccess( m_xServiceManager
->createInstance( SERVICENAME_UICOMMANDDESCRIPTION
), UNO_QUERY
);
841 if ( xNameAccess
.is() )
843 xNameAccess
->getByName( m_aModuleIdentifier
) >>= m_xUICommandLabels
;
852 if ( m_xUICommandLabels
.is() )
856 if ( aCmdURL
.getLength() > 0 )
859 Sequence
< PropertyValue
> aPropSeq
;
860 if ( m_xUICommandLabels
->getByName( aCmdURL
) >>= aPropSeq
)
862 for ( sal_Int32 i
= 0; i
< aPropSeq
.getLength(); i
++ )
864 if ( aPropSeq
[i
].Name
.equalsAscii( "Name" ))
866 aPropSeq
[i
].Value
>>= aStr
;
874 catch ( com::sun::star::uno::Exception
& )
882 void ToolBarManager::CreateControllers()
884 RTL_LOGFILE_CONTEXT( aLog
, "framework (cd100003) ::ToolBarManager::CreateControllers" );
886 Reference
< XMultiComponentFactory
> xToolbarControllerFactory( m_xToolbarControllerRegistration
, UNO_QUERY
);
887 Reference
< XComponentContext
> xComponentContext
;
888 Reference
< XPropertySet
> xProps( m_xServiceManager
, UNO_QUERY
);
889 Reference
< XWindow
> xToolbarWindow
= VCLUnoHelper::GetInterface( m_pToolBar
);
892 sal_Bool bHasDisabledEntries
= SvtCommandOptions().HasEntries( SvtCommandOptions::CMDOPTION_DISABLED
);
893 SvtCommandOptions aCmdOptions
;
896 xProps
->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ))) >>= xComponentContext
;
898 for ( USHORT i
= 0; i
< m_pToolBar
->GetItemCount(); i
++ )
900 USHORT nId
= m_pToolBar
->GetItemId( i
);
904 sal_Int16
nWidth( sal_Int16( m_pToolBar
->GetHelpId( nId
)));
905 rtl::OUString
aLoadURL( RTL_CONSTASCII_USTRINGPARAM( ".uno:OpenUrl" ));
906 rtl::OUString
aCommandURL( m_pToolBar
->GetItemCommand( nId
));
907 sal_Bool
bInit( sal_True
);
908 sal_Bool
bCreate( sal_True
);
909 Reference
< XStatusListener
> xController
;
911 svt::ToolboxController
* pController( 0 );
913 m_pToolBar
->SetHelpId( nId
, 0 ); // reset value again
914 if ( bHasDisabledEntries
)
916 aURL
.Complete
= aCommandURL
;
917 m_xURLTransformer
->parseStrict( aURL
);
918 if ( aCmdOptions
.Lookup( SvtCommandOptions::CMDOPTION_DISABLED
, aURL
.Path
))
920 m_aControllerMap
[ nId
] = xController
;
921 m_pToolBar
->HideItem( nId
);
926 if ( m_xToolbarControllerRegistration
.is() &&
927 m_xToolbarControllerRegistration
->hasController( aCommandURL
, m_aModuleIdentifier
))
929 if ( xToolbarControllerFactory
.is() )
931 PropertyValue aPropValue
;
932 std::vector
< Any
> aPropertyVector
;
934 aPropValue
.Name
= rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ModuleName" ));
935 aPropValue
.Value
<<= m_aModuleIdentifier
;
936 aPropertyVector
.push_back( makeAny( aPropValue
));
937 aPropValue
.Name
= rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Frame" ));
938 aPropValue
.Value
<<= m_xFrame
;
939 aPropertyVector
.push_back( makeAny( aPropValue
));
940 aPropValue
.Name
= rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ServiceManager" ));
941 aPropValue
.Value
<<= m_xServiceManager
;
942 aPropertyVector
.push_back( makeAny( aPropValue
));
943 aPropValue
.Name
= rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ParentWindow" ));
944 aPropValue
.Value
<<= xToolbarWindow
;
945 aPropertyVector
.push_back( makeAny( aPropValue
));
949 aPropValue
.Name
= rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Width" ));
950 aPropValue
.Value
<<= nWidth
;
951 aPropertyVector
.push_back( makeAny( aPropValue
));
954 Sequence
< Any
> aArgs( comphelper::containerToSequence( aPropertyVector
));
955 xController
= Reference
< XStatusListener
>( xToolbarControllerFactory
->createInstanceWithArgumentsAndContext(
956 aCommandURL
, aArgs
, xComponentContext
),
958 bInit
= sal_False
; // Initialization is done through the factory service
962 if (( aCommandURL
== aLoadURL
) && ( !m_pToolBar
->IsItemVisible(nId
)))
965 if ( !xController
.is() && m_pToolBar
&& bCreate
)
967 pController
= CreateToolBoxController( m_xFrame
, m_pToolBar
, nId
, aCommandURL
);
970 if ( m_pToolBar
->GetItemData( nId
) != 0 )
972 // retrieve additional parameters
973 ::rtl::OUString aControlType
= static_cast< AddonsParams
* >( m_pToolBar
->GetItemData( nId
))->aControlType
;
975 Reference
< XStatusListener
> xStatusListener(
976 ToolBarMerger::CreateController( m_xServiceManager
,
982 aControlType
), UNO_QUERY
);
984 xController
= xStatusListener
;
988 MenuDescriptionMap::iterator it
= m_aMenuMap
.find( nId
);
989 if ( it
== m_aMenuMap
.end() )
990 xController
= Reference
< XStatusListener
>(
991 new GenericToolbarController( m_xServiceManager
, m_xFrame
, m_pToolBar
, nId
, aCommandURL
));
993 xController
= Reference
< XStatusListener
>(
994 new MenuToolbarController( m_xServiceManager
, m_xFrame
, m_pToolBar
, nId
, aCommandURL
, m_aModuleIdentifier
, m_aMenuMap
[ nId
] ));
997 else if ( pController
)
999 xController
= Reference
< XStatusListener
>( static_cast< ::cppu::OWeakObject
*>( pController
), UNO_QUERY
);
1003 // Associate ID and controller to be able to retrieve
1004 // the controller from the ID later.
1005 m_aControllerMap
[ nId
] = xController
;
1007 // Fill sub-toolbars into our hash-map
1008 Reference
< XSubToolbarController
> xSubToolBar( xController
, UNO_QUERY
);
1009 if ( xSubToolBar
.is() && xSubToolBar
->opensSubToolbar() )
1011 rtl::OUString aSubToolBarName
= xSubToolBar
->getSubToolbarName();
1012 if ( aSubToolBarName
.getLength() != 0 )
1014 SubToolBarToSubToolBarControllerMap::iterator pIter
=
1015 m_aSubToolBarControllerMap
.find( aSubToolBarName
);
1016 if ( pIter
== m_aSubToolBarControllerMap
.end() )
1018 SubToolBarControllerVector aSubToolBarVector
;
1019 aSubToolBarVector
.push_back( xSubToolBar
);
1020 m_aSubToolBarControllerMap
.insert(
1021 SubToolBarToSubToolBarControllerMap::value_type(
1022 aSubToolBarName
, aSubToolBarVector
));
1025 pIter
->second
.push_back( xSubToolBar
);
1029 Reference
< XInitialization
> xInit( xController
, UNO_QUERY
);
1034 PropertyValue aPropValue
;
1035 std::vector
< Any
> aPropertyVector
;
1037 aPropValue
.Name
= ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Frame" ));
1038 aPropValue
.Value
<<= m_xFrame
;
1039 aPropertyVector
.push_back( makeAny( aPropValue
));
1040 aPropValue
.Name
= ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CommandURL" ));
1041 aPropValue
.Value
<<= aCommandURL
;
1042 aPropertyVector
.push_back( makeAny( aPropValue
));
1043 aPropValue
.Name
= ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ServiceManager" ));
1044 aPropValue
.Value
<<= m_xServiceManager
;
1045 aPropertyVector
.push_back( makeAny( aPropValue
));
1046 aPropValue
.Name
= rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ParentWindow" ));
1047 aPropValue
.Value
<<= xToolbarWindow
;
1048 aPropertyVector
.push_back( makeAny( aPropValue
));
1051 aPropValue
.Name
= rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Width" ));
1052 aPropValue
.Value
<<= nWidth
;
1053 aPropertyVector
.push_back( makeAny( aPropValue
));
1056 Sequence
< Any
> aArgs( comphelper::containerToSequence( aPropertyVector
));
1057 xInit
->initialize( aArgs
);
1060 // Request a item window from the toolbar controller and set it at the VCL toolbar
1061 Reference
< XToolbarController
> xTbxController( xController
, UNO_QUERY
);
1062 if ( xTbxController
.is() && xToolbarWindow
.is() )
1064 Reference
< XWindow
> xWindow
= xTbxController
->createItemWindow( xToolbarWindow
);
1067 Window
* pItemWin
= VCLUnoHelper::GetWindow( xWindow
);
1070 WindowType nType
= pItemWin
->GetType();
1071 if ( nType
== WINDOW_LISTBOX
|| nType
== WINDOW_MULTILISTBOX
|| nType
== WINDOW_COMBOBOX
)
1072 pItemWin
->SetAccessibleName( m_pToolBar
->GetItemText( nId
) );
1073 m_pToolBar
->SetItemWindow( nId
, pItemWin
);
1080 AddFrameActionListener();
1081 AddImageOrientationListener();
1084 void ToolBarManager::AddFrameActionListener()
1086 if ( !m_bFrameActionRegistered
&& m_xFrame
.is() )
1088 m_bFrameActionRegistered
= sal_True
;
1089 m_xFrame
->addFrameActionListener( Reference
< XFrameActionListener
>(
1090 static_cast< ::cppu::OWeakObject
*>( this ), UNO_QUERY
));
1094 void ToolBarManager::AddImageOrientationListener()
1096 if ( !m_bImageOrientationRegistered
&& m_xFrame
.is() )
1098 m_bImageOrientationRegistered
= sal_True
;
1099 ImageOrientationListener
* pImageOrientation
= new ImageOrientationListener(
1100 Reference
< XStatusListener
>( static_cast< ::cppu::OWeakObject
*>( this ), UNO_QUERY
),
1103 m_xImageOrientationListener
= Reference
< XComponent
>( static_cast< ::cppu::OWeakObject
*>(
1104 pImageOrientation
), UNO_QUERY
);
1105 pImageOrientation
->addStatusListener(
1106 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ImageOrientation" )));
1107 pImageOrientation
->bindListener();
1111 sal_uInt16
ToolBarManager::ConvertStyleToToolboxItemBits( sal_Int32 nStyle
)
1113 sal_uInt16
nItemBits( 0 );
1114 if ( nStyle
& ::com::sun::star::ui::ItemStyle::RADIO_CHECK
)
1115 nItemBits
|= TIB_RADIOCHECK
;
1116 if ( nStyle
& ::com::sun::star::ui::ItemStyle::ALIGN_LEFT
)
1117 nItemBits
|= TIB_LEFT
;
1118 if ( nStyle
& ::com::sun::star::ui::ItemStyle::AUTO_SIZE
)
1119 nItemBits
|= TIB_AUTOSIZE
;
1120 if ( nStyle
& ::com::sun::star::ui::ItemStyle::DROP_DOWN
)
1121 nItemBits
|= TIB_DROPDOWN
;
1122 if ( nStyle
& ::com::sun::star::ui::ItemStyle::REPEAT
)
1123 nItemBits
|= TIB_REPEAT
;
1124 if ( nStyle
& ::com::sun::star::ui::ItemStyle::DROPDOWN_ONLY
)
1125 nItemBits
|= TIB_DROPDOWNONLY
;
1126 if ( nStyle
& ::com::sun::star::ui::ItemStyle::TEXT
)
1127 nItemBits
|= TIB_TEXT_ONLY
;
1128 if ( nStyle
& ::com::sun::star::ui::ItemStyle::ICON
)
1129 nItemBits
|= TIB_ICON_ONLY
;
1134 void ToolBarManager::FillToolbar( const Reference
< XIndexAccess
>& rItemContainer
)
1136 ::rtl::OString aTbxName
= rtl::OUStringToOString( m_aResourceName
, RTL_TEXTENCODING_ASCII_US
);
1138 RTL_LOGFILE_CONTEXT( aLog
, "framework (cd100003) ::ToolBarManager::FillToolbar" );
1139 RTL_LOGFILE_CONTEXT_TRACE1( aLog
, "framework (cd100003) ::ToolBarManager::FillToolbar %s", aTbxName
.getStr() );
1141 ResetableGuard
aGuard( m_aLock
);
1147 ::rtl::OUString
aHelpIdPrefix( RTL_CONSTASCII_USTRINGPARAM( HELPID_PREFIX
));
1149 Reference
< XModuleManager
> xModuleManager( Reference
< XModuleManager
>(
1150 m_xServiceManager
->createInstance( SERVICENAME_MODULEMANAGER
), UNO_QUERY
));
1151 if ( !m_xDocImageManager
.is() )
1153 Reference
< XModel
> xModel( GetModelFromFrame() );
1156 Reference
< XUIConfigurationManagerSupplier
> xSupplier( xModel
, UNO_QUERY
);
1157 if ( xSupplier
.is() )
1159 Reference
< XUIConfigurationManager
> xDocUICfgMgr( xSupplier
->getUIConfigurationManager(), UNO_QUERY
);
1160 m_xDocImageManager
= Reference
< XImageManager
>( xDocUICfgMgr
->getImageManager(), UNO_QUERY
);
1161 m_xDocImageManager
->addConfigurationListener(
1162 Reference
< XUIConfigurationListener
>(
1163 static_cast< OWeakObject
* >( this ), UNO_QUERY
));
1170 if ( xModuleManager
.is() )
1171 m_aModuleIdentifier
= xModuleManager
->identify( Reference
< XInterface
>( m_xFrame
, UNO_QUERY
) );
1177 if ( !m_xModuleImageManager
.is() )
1179 Reference
< XModuleUIConfigurationManagerSupplier
> xModuleCfgMgrSupplier( m_xServiceManager
->createInstance(
1180 SERVICENAME_MODULEUICONFIGURATIONMANAGERSUPPLIER
),
1182 Reference
< XUIConfigurationManager
> xUICfgMgr
= xModuleCfgMgrSupplier
->getUIConfigurationManager( m_aModuleIdentifier
);
1183 m_xModuleImageManager
= Reference
< XImageManager
>( xUICfgMgr
->getImageManager(), UNO_QUERY
);
1184 m_xModuleImageManager
->addConfigurationListener( Reference
< XUIConfigurationListener
>(
1185 static_cast< OWeakObject
* >( this ), UNO_QUERY
));
1188 RemoveControllers();
1190 // reset and fill command map
1191 m_pToolBar
->Clear();
1192 m_aControllerMap
.clear();
1193 m_aCommandMap
.clear();
1197 CommandInfo aCmdInfo
;
1198 for ( sal_Int32 n
= 0; n
< rItemContainer
->getCount(); n
++ )
1200 Sequence
< PropertyValue
> aProp
;
1201 rtl::OUString aCommandURL
;
1202 rtl::OUString aLabel
;
1203 rtl::OUString aHelpURL
;
1204 rtl::OUString aTooltip
;
1205 sal_uInt16
nType( ::com::sun::star::ui::ItemType::DEFAULT
);
1206 sal_uInt16
nWidth( 0 );
1207 sal_Bool
bIsVisible( sal_True
);
1208 sal_uInt32
nStyle( 0 );
1210 Reference
< XIndexAccess
> aMenuDesc
;
1213 if ( rItemContainer
->getByIndex( n
) >>= aProp
)
1215 for ( int i
= 0; i
< aProp
.getLength(); i
++ )
1217 if ( aProp
[i
].Name
.equalsAsciiL( ITEM_DESCRIPTOR_COMMANDURL
, ITEM_DESCRIPTOR_COMMANDURL_LEN
))
1218 aProp
[i
].Value
>>= aCommandURL
;
1219 else if ( aProp
[i
].Name
.equalsAsciiL( ITEM_DESCRIPTOR_HELPURL
, ITEM_DESCRIPTOR_HELPURL_LEN
))
1220 aProp
[i
].Value
>>= aHelpURL
;
1221 else if ( aProp
[i
].Name
.equalsAsciiL( ITEM_DESCRIPTOR_TOOLTIP
, ITEM_DESCRIPTOR_TOOLTIP_LEN
))
1222 aProp
[i
].Value
>>= aTooltip
;
1223 else if ( aProp
[i
].Name
.equalsAsciiL( ITEM_DESCRIPTOR_LABEL
, ITEM_DESCRIPTOR_LABEL_LEN
))
1224 aProp
[i
].Value
>>= aLabel
;
1225 else if ( aProp
[i
].Name
.equalsAsciiL( ITEM_DESCRIPTOR_TYPE
, ITEM_DESCRIPTOR_TYPE_LEN
))
1226 aProp
[i
].Value
>>= nType
;
1227 else if ( aProp
[i
].Name
.equalsAsciiL( ITEM_DESCRIPTOR_VISIBLE
, ITEM_DESCRIPTOR_VISIBLE_LEN
))
1228 aProp
[i
].Value
>>= bIsVisible
;
1229 else if ( aProp
[i
].Name
.equalsAsciiL( ITEM_DESCRIPTOR_WIDTH
, ITEM_DESCRIPTOR_WIDTH_LEN
))
1230 aProp
[i
].Value
>>= nWidth
;
1231 else if ( aProp
[i
].Name
.equalsAsciiL( ITEM_DESCRIPTOR_STYLE
, ITEM_DESCRIPTOR_STYLE_LEN
))
1232 aProp
[i
].Value
>>= nStyle
;
1233 else if ( aProp
[i
].Name
.equalsAsciiL( ITEM_DESCRIPTOR_CONTAINER
, ITEM_DESCRIPTOR_CONTAINER_LEN
))
1234 aProp
[i
].Value
>>= aMenuDesc
;
1237 if (( nType
== ::com::sun::star::ui::ItemType::DEFAULT
) && ( aCommandURL
.getLength() > 0 ))
1239 ::rtl::OUString
aString( RetrieveLabelFromCommand( aCommandURL
));
1241 sal_uInt16 nItemBits
= ConvertStyleToToolboxItemBits( nStyle
);
1242 if ( aMenuDesc
.is() )
1243 m_aMenuMap
[ nId
] = aMenuDesc
;
1244 m_pToolBar
->InsertItem( nId
, aString
, nItemBits
);
1245 m_pToolBar
->SetItemCommand( nId
, aCommandURL
);
1246 if ( aTooltip
.getLength() )
1247 m_pToolBar
->SetQuickHelpText( nId
, aTooltip
);
1249 m_pToolBar
->SetQuickHelpText( nId
, aString
);
1250 if ( aLabel
.getLength() > 0 )
1251 m_pToolBar
->SetItemText( nId
, aLabel
);
1253 m_pToolBar
->SetItemText( nId
, aString
);
1254 m_pToolBar
->EnableItem( nId
, sal_True
);
1255 m_pToolBar
->SetItemState( nId
, STATE_NOCHECK
);
1257 // Fill command map. It stores all our commands and from what
1258 // image manager we got our image. So we can decide if we have to use an
1259 // image from a notification message.
1260 CommandToInfoMap::iterator pIter
= m_aCommandMap
.find( aCommandURL
);
1261 if ( pIter
== m_aCommandMap
.end())
1264 m_aCommandMap
.insert( CommandToInfoMap::value_type( aCommandURL
, aCmdInfo
));
1268 pIter
->second
.aIds
.push_back( nId
);
1271 // Add additional information for the controller to the obsolete help id
1272 m_pToolBar
->SetHelpId( ULONG( nWidth
));
1275 m_pToolBar
->HideItem( nId
);
1279 else if ( nType
== ::com::sun::star::ui::ItemType::SEPARATOR_LINE
)
1281 m_pToolBar
->InsertSeparator();
1283 else if ( nType
== ::com::sun::star::ui::ItemType::SEPARATOR_SPACE
)
1285 m_pToolBar
->InsertSpace();
1287 else if ( nType
== ::com::sun::star::ui::ItemType::SEPARATOR_LINEBREAK
)
1289 m_pToolBar
->InsertBreak();
1293 catch ( ::com::sun::star::lang::IndexOutOfBoundsException
& )
1299 // Support add-on toolbar merging here. Working directly on the toolbar object is much
1300 // simpler and faster.
1301 const sal_uInt16 TOOLBAR_ITEM_STARTID
= 1000;
1303 MergeToolbarInstructionContainer aMergeInstructionContainer
;
1305 // Retrieve the toolbar name from the resource name
1306 ::rtl::OUString
aToolbarName( m_aResourceName
);
1307 sal_Int32 nIndex
= aToolbarName
.lastIndexOf( '/' );
1308 if (( nIndex
> 0 ) && ( nIndex
< aToolbarName
.getLength() ))
1309 aToolbarName
= aToolbarName
.copy( nIndex
+1 );
1311 AddonsOptions().GetMergeToolbarInstructions( aToolbarName
, aMergeInstructionContainer
);
1313 if ( !aMergeInstructionContainer
.empty() )
1315 sal_uInt16
nItemId( TOOLBAR_ITEM_STARTID
);
1316 const sal_uInt32 nCount
= aMergeInstructionContainer
.size();
1317 for ( sal_uInt32 i
=0; i
< nCount
; i
++ )
1319 MergeToolbarInstruction
& rInstruction
= aMergeInstructionContainer
[i
];
1320 if ( ToolBarMerger::IsCorrectContext( rInstruction
.aMergeContext
, m_aModuleIdentifier
))
1322 ReferenceToolbarPathInfo aRefPoint
= ToolBarMerger::FindReferencePoint( m_pToolBar
, rInstruction
.aMergePoint
);
1324 // convert the sequence< sequence< propertyvalue > > structure to
1325 // something we can better handle. A vector with item data
1326 AddonToolbarItemContainer aItems
;
1327 ToolBarMerger::ConvertSeqSeqToVector( rInstruction
.aMergeToolbarItems
, aItems
);
1329 if ( aRefPoint
.bResult
)
1331 ToolBarMerger::ProcessMergeOperation( m_xFrame
,
1336 m_aModuleIdentifier
,
1337 rInstruction
.aMergeCommand
,
1338 rInstruction
.aMergeCommandParameter
,
1343 ToolBarMerger::ProcessMergeFallback( m_xFrame
,
1348 m_aModuleIdentifier
,
1349 rInstruction
.aMergeCommand
,
1350 rInstruction
.aMergeFallback
,
1357 // Request images for all toolbar items. Must be done before CreateControllers as
1358 // some controllers need access to the image.
1361 // Create controllers after we set the images. There are controllers which needs
1362 // an image at the toolbar at creation time!
1363 CreateControllers();
1365 // Notify controllers that they are now correctly initialized and can start listening
1366 // toolbars that will open in popup mode will be updated immediately to avoid flickering
1367 if( m_pToolBar
->WillUsePopupMode() )
1368 UpdateControllers();
1369 else if ( m_pToolBar
->IsReallyVisible() )
1370 m_aAsyncUpdateControllersTimer
.Start();
1372 // Try to retrieve UIName from the container property set and set it as the title
1373 // if it is not empty.
1374 Reference
< XPropertySet
> xPropSet( rItemContainer
, UNO_QUERY
);
1375 if ( xPropSet
.is() )
1379 rtl::OUString aUIName
;
1380 xPropSet
->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "UIName" ))) >>= aUIName
;
1381 if ( aUIName
.getLength() > 0 )
1382 m_pToolBar
->SetText( aUIName
);
1384 catch ( Exception
& )
1390 void ToolBarManager::RequestImages()
1392 RTL_LOGFILE_CONTEXT( aLog
, "framework (cd100003) ::ToolBarManager::RequestImages" );
1394 // Request images from image manager
1395 Sequence
< rtl::OUString
> aCmdURLSeq( m_aCommandMap
.size() );
1396 Sequence
< Reference
< XGraphic
> > aDocGraphicSeq
;
1397 Sequence
< Reference
< XGraphic
> > aModGraphicSeq
;
1400 CommandToInfoMap::iterator pIter
= m_aCommandMap
.begin();
1401 CommandToInfoMap::iterator pEnd
= m_aCommandMap
.end();
1402 while ( pIter
!= pEnd
)
1404 aCmdURLSeq
[i
++] = pIter
->first
;
1408 sal_Bool
bBigImages( SvtMiscOptions().AreCurrentSymbolsLarge() );
1409 m_bIsHiContrast
= m_pToolBar
->GetSettings().GetStyleSettings().GetHighContrastMode();
1410 sal_Int16 p
= getImageTypeFromBools( SvtMiscOptions().AreCurrentSymbolsLarge(), m_bIsHiContrast
);
1412 if ( m_xDocImageManager
.is() )
1413 aDocGraphicSeq
= m_xDocImageManager
->getImages( p
, aCmdURLSeq
);
1414 aModGraphicSeq
= m_xModuleImageManager
->getImages( p
, aCmdURLSeq
);
1417 pIter
= m_aCommandMap
.begin();
1418 while ( pIter
!= pEnd
)
1420 rtl::OUString aCommandURL
= aCmdURLSeq
[i
];
1423 if ( aDocGraphicSeq
.getLength() > 0 )
1424 aImage
= Image( aDocGraphicSeq
[i
] );
1427 aImage
= Image( aModGraphicSeq
[i
] );
1428 // Try also to query for add-on images before giving up and use an
1431 aImage
= QueryAddonsImage( aCmdURLSeq
[i
], bBigImages
, m_bIsHiContrast
);
1433 pIter
->second
.nImageInfo
= 1; // mark image as module based
1437 pIter
->second
.nImageInfo
= 0; // mark image as document based
1439 setToolBarImage(aImage
,pIter
);
1445 void ToolBarManager::notifyRegisteredControllers( const rtl::OUString
& aUIElementName
, const rtl::OUString
& aCommand
)
1447 ResetableGuard
aGuard( m_aLock
);
1448 if ( !m_aSubToolBarControllerMap
.empty() )
1450 SubToolBarToSubToolBarControllerMap::const_iterator pIter
=
1451 m_aSubToolBarControllerMap
.find( aUIElementName
);
1453 if ( pIter
!= m_aSubToolBarControllerMap
.end() )
1455 const SubToolBarControllerVector
& rSubToolBarVector
= pIter
->second
;
1456 if ( !rSubToolBarVector
.empty() )
1458 SubToolBarControllerVector aNotifyVector
= rSubToolBarVector
;
1461 const sal_uInt32 nCount
= aNotifyVector
.size();
1462 for ( sal_uInt32 i
=0; i
< nCount
; i
++ )
1466 Reference
< XSubToolbarController
> xController
= aNotifyVector
[i
];
1467 if ( xController
.is() )
1468 xController
->functionSelected( aCommand
);
1470 catch ( RuntimeException
& e
)
1474 catch ( Exception
& )
1482 long ToolBarManager::HandleClick(void ( SAL_CALL
XToolbarController::*_pClick
)())
1484 ResetableGuard
aGuard( m_aLock
);
1489 USHORT
nId( m_pToolBar
->GetCurItemId() );
1490 ToolBarControllerMap::const_iterator pIter
= m_aControllerMap
.find( nId
);
1491 if ( pIter
!= m_aControllerMap
.end() )
1493 Reference
< XToolbarController
> xController( pIter
->second
, UNO_QUERY
);
1495 if ( xController
.is() )
1496 (xController
.get()->*_pClick
)( );
1497 } // if ( pIter != m_aControllerMap.end() )
1501 IMPL_LINK( ToolBarManager
, Click
, ToolBox
*, EMPTYARG
)
1503 return HandleClick(&XToolbarController::click
);
1506 IMPL_LINK( ToolBarManager
, DropdownClick
, ToolBox
*, EMPTYARG
)
1508 ResetableGuard
aGuard( m_aLock
);
1513 USHORT
nId( m_pToolBar
->GetCurItemId() );
1514 ToolBarControllerMap::const_iterator pIter
= m_aControllerMap
.find( nId
);
1515 if ( pIter
!= m_aControllerMap
.end() )
1517 Reference
< XToolbarController
> xController( pIter
->second
, UNO_QUERY
);
1519 if ( xController
.is() )
1520 xController
->createPopupWindow();
1525 IMPL_LINK( ToolBarManager
, DoubleClick
, ToolBox
*, EMPTYARG
)
1527 return HandleClick(&XToolbarController::doubleClick
);
1530 void ToolBarManager::ImplClearPopupMenu( ToolBox
*pToolBar
)
1535 PopupMenu
*pMenu
= pToolBar
->GetMenu();
1537 // remove config entries from menu, so we have a clean menu to start with
1538 // remove submenu first
1539 PopupMenu
* pItemMenu
= pMenu
->GetPopupMenu( 1 );
1545 pMenu
->SetPopupMenu( 1, pItemMenu
);
1548 // remove all items that were not added by the toolbar itself
1550 for( i
=0; i
<pMenu
->GetItemCount(); )
1552 if( pMenu
->GetItemId( i
) < TOOLBOX_MENUITEM_START
)
1553 pMenu
->RemoveItem( i
);
1559 IMPL_LINK( ToolBarManager
, MenuDeactivate
, Menu
*, pMenu
)
1561 ResetableGuard
aGuard( m_aLock
);
1566 if( pMenu
!= m_pToolBar
->GetMenu() )
1569 ImplClearPopupMenu( m_pToolBar
);
1574 Reference
< XModel
> ToolBarManager::GetModelFromFrame() const
1576 Reference
< XController
> xController
= m_xFrame
->getController();
1577 Reference
< XModel
> xModel
;
1578 if ( xController
.is() )
1579 xModel
= xController
->getModel();
1584 sal_Bool
ToolBarManager::IsPluginMode() const
1586 sal_Bool
bPluginMode( sal_False
);
1588 if ( m_xFrame
.is() )
1590 Reference
< XModel
> xModel
= GetModelFromFrame();
1593 Sequence
< PropertyValue
> aSeq
= xModel
->getArgs();
1594 comphelper::MediaDescriptor
aMediaDescriptor( aSeq
);
1595 bPluginMode
= aMediaDescriptor
.getUnpackedValueOrDefault
< sal_Bool
>(
1596 comphelper::MediaDescriptor::PROP_VIEWONLY(), sal_False
);
1603 bool ToolBarManager::MenuItemAllowed( sal_uInt16
) const
1608 //added for i33668 by shizhoubo : 200804
1609 PopupMenu
* ToolBarManager::GetToolBarCustomMeun(ToolBox
* pToolBar
)
1611 PopupMenu
*pMenu
= pToolBar
->GetMenu();
1612 // remove all entries before inserting new ones
1613 ImplClearPopupMenu( pToolBar
);
1614 // No config menu entries if command ".uno:ConfigureDialog" is not enabled
1615 Reference
< XDispatch
> xDisp
;
1616 com::sun::star::util::URL aURL
;
1617 if ( m_xFrame
.is() )
1619 Reference
< XDispatchProvider
> xProv( m_xFrame
, UNO_QUERY
);
1620 aURL
.Complete
= ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ConfigureDialog" ));
1621 m_xURLTransformer
->parseStrict( aURL
);
1623 xDisp
= xProv
->queryDispatch( aURL
, ::rtl::OUString(), 0 );
1625 if ( !xDisp
.is() || IsPluginMode() )
1629 // popup menu for quick customization
1630 sal_Bool bHideDisabledEntries
= !SvtMenuOptions().IsEntryHidingEnabled();
1631 PopupMenu
aPopupMenu( FwkResId( POPUPMENU_TOOLBAR_QUICKCUSTOMIZATION
));
1633 if ( m_pToolBar
->IsCustomize() )
1636 PopupMenu
* pItemMenu( aPopupMenu
.GetPopupMenu( 1 ));
1638 sal_Bool
bIsFloating( sal_False
);
1640 DockingManager
* pDockMgr
= Window::GetDockingManager();
1642 bIsFloating
= pDockMgr
->IsFloating( m_pToolBar
);
1646 aPopupMenu
.EnableItem( MENUITEM_TOOLBAR_DOCKTOOLBAR
, sal_False
);
1647 aPopupMenu
.EnableItem( MENUITEM_TOOLBAR_DOCKALLTOOLBAR
, sal_False
);
1648 Reference
< XDockableWindow
> xDockable( VCLUnoHelper::GetInterface( m_pToolBar
), UNO_QUERY
);
1649 if( xDockable
.is() )
1650 aPopupMenu
.CheckItem( MENUITEM_TOOLBAR_LOCKTOOLBARPOSITION
, xDockable
->isLocked() );
1653 aPopupMenu
.EnableItem( MENUITEM_TOOLBAR_LOCKTOOLBARPOSITION
, sal_False
);
1655 if ( !m_bCanBeCustomized
)
1657 // Non-configurable toolbars should disable configuration menu items
1658 aPopupMenu
.EnableItem( MENUITEM_TOOLBAR_VISIBLEBUTTON
, sal_False
);
1659 aPopupMenu
.EnableItem( MENUITEM_TOOLBAR_CUSTOMIZETOOLBAR
, sal_False
);
1660 aPopupMenu
.EnableItem( MENUITEM_TOOLBAR_LOCKTOOLBARPOSITION
, sal_False
);
1663 // Disable menu item CLOSE if the toolbar has no closer
1664 //added for issue64028 by shizhoubo
1665 if( !(pToolBar
->GetFloatStyle() & WB_CLOSEABLE
) )
1666 aPopupMenu
.EnableItem(MENUITEM_TOOLBAR_CLOSE
, sal_False
);
1669 pItemMenu
->SetMenuFlags (pItemMenu
->GetMenuFlags () |
1670 MENU_FLAG_SHOWCHECKIMAGES
);
1672 for ( nPos
= 0; nPos
< m_pToolBar
->GetItemCount(); ++nPos
)
1674 if ( m_pToolBar
->GetItemType(nPos
) == TOOLBOXITEM_BUTTON
)
1676 USHORT nId
= m_pToolBar
->GetItemId(nPos
);
1677 ::rtl::OUString aCommandURL
= m_pToolBar
->GetItemCommand( nId
);
1678 pItemMenu
->InsertItem( STARTID_CUSTOMIZE_POPUPMENU
+nPos
, m_pToolBar
->GetItemText( nId
), MIB_CHECKABLE
);
1679 pItemMenu
->CheckItem( STARTID_CUSTOMIZE_POPUPMENU
+nPos
, m_pToolBar
->IsItemVisible( nId
) );
1680 pItemMenu
->SetItemCommand( STARTID_CUSTOMIZE_POPUPMENU
+nPos
, aCommandURL
);
1681 pItemMenu
->SetItemImage( STARTID_CUSTOMIZE_POPUPMENU
+nPos
,
1682 GetImageFromURL( m_xFrame
,
1689 pItemMenu
->InsertSeparator();
1695 USHORT nPos
= aPopupMenu
.GetItemPos( MENUITEM_TOOLBAR_CUSTOMIZETOOLBAR
);
1696 if ( nPos
!= MENU_ITEM_NOTFOUND
)
1697 aPopupMenu
.RemoveItem( nPos
);
1700 // copy all menu items to the toolbar menu
1701 if( pMenu
->GetItemCount() )
1702 pMenu
->InsertSeparator();
1705 for( i
=0; i
< aPopupMenu
.GetItemCount(); i
++)
1707 sal_uInt16 nId
= aPopupMenu
.GetItemId( i
);
1708 if ( MenuItemAllowed( nId
))
1709 pMenu
->CopyItem( aPopupMenu
, i
, MENU_APPEND
);
1712 // set submenu to toolbar menu
1713 if( aPopupMenu
.GetPopupMenu( 1 ) )
1715 // create an own submenu to avoid auto-delete when resource menu is deleted
1716 PopupMenu
*pItemMenu
= new PopupMenu();
1718 pItemMenu
->SetMenuFlags (pItemMenu
->GetMenuFlags () |
1719 MENU_FLAG_SHOWCHECKIMAGES
);
1721 for( i
=0; i
< aPopupMenu
.GetPopupMenu( 1 )->GetItemCount(); i
++)
1722 pItemMenu
->CopyItem( *aPopupMenu
.GetPopupMenu( 1 ), i
, MENU_APPEND
);
1724 pMenu
->SetPopupMenu( 1, pItemMenu
);
1727 if ( bHideDisabledEntries
)
1728 pMenu
->RemoveDisabledEntries();
1733 // addd for 33668 by shizhoubo
1734 IMPL_LINK( ToolBarManager
, Command
, CommandEvent
*, pCmdEvt
)
1736 ResetableGuard
aGuard( m_aLock
);
1740 if ( pCmdEvt
->GetCommand() != COMMAND_CONTEXTMENU
)
1743 PopupMenu
* pMenu
= GetToolBarCustomMeun(m_pToolBar
);
1746 // make sure all disabled entries will be shown
1747 pMenu
->SetMenuFlags( pMenu
->GetMenuFlags() | MENU_FLAG_ALWAYSSHOWDISABLEDENTRIES
);
1748 ::Point
aPoint( pCmdEvt
->GetMousePosPixel() );
1749 pMenu
->Execute( m_pToolBar
, aPoint
);
1756 IMPL_LINK( ToolBarManager
, MenuButton
, ToolBox
*, pToolBar
)
1758 ResetableGuard
aGuard( m_aLock
);
1762 //modify for i33668 by shizhoubo:2008:04
1763 GetToolBarCustomMeun(pToolBar
);
1768 IMPL_LINK( ToolBarManager
, MenuSelect
, Menu
*, pMenu
)
1770 // We have to hold a reference to ourself as it is possible that we will be disposed and
1771 // our refcount could be zero (destruction) otherwise.
1772 Reference
< XInterface
> xInterface( static_cast< OWeakObject
* >( this ), UNO_QUERY
);
1775 // The guard must be in its own context as the we can get destroyed when our
1776 // own xInterface reference get destroyed!
1777 ResetableGuard
aGuard( m_aLock
);
1782 switch ( pMenu
->GetCurItemId() )
1784 case MENUITEM_TOOLBAR_CUSTOMIZETOOLBAR
:
1786 Reference
< XDispatch
> xDisp
;
1787 com::sun::star::util::URL aURL
;
1788 if ( m_xFrame
.is() )
1790 Reference
< XDispatchProvider
> xProv( m_xFrame
, UNO_QUERY
);
1791 aURL
.Complete
= ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ConfigureDialog" ));
1792 m_xURLTransformer
->parseStrict( aURL
);
1794 xDisp
= xProv
->queryDispatch( aURL
, ::rtl::OUString(), 0 );
1799 Sequence
< PropertyValue
> aPropSeq( 1 );
1801 aPropSeq
[ 0 ].Name
=
1802 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ResourceURL"));
1803 aPropSeq
[ 0 ].Value
<<= m_aResourceName
;
1805 xDisp
->dispatch( aURL
, aPropSeq
);
1810 case MENUITEM_TOOLBAR_DOCKTOOLBAR
:
1812 ExecuteInfo
* pExecuteInfo
= new ExecuteInfo
;
1814 pExecuteInfo
->aToolbarResName
= m_aResourceName
;
1815 pExecuteInfo
->nCmd
= EXEC_CMD_DOCKTOOLBAR
;
1816 pExecuteInfo
->xLayoutManager
= getLayoutManagerFromFrame( m_xFrame
);
1818 Application::PostUserEvent( STATIC_LINK(0, ToolBarManager
, ExecuteHdl_Impl
), pExecuteInfo
);
1822 case MENUITEM_TOOLBAR_DOCKALLTOOLBAR
:
1824 ExecuteInfo
* pExecuteInfo
= new ExecuteInfo
;
1826 pExecuteInfo
->aToolbarResName
= m_aResourceName
;
1827 pExecuteInfo
->nCmd
= EXEC_CMD_DOCKALLTOOLBARS
;
1828 pExecuteInfo
->xLayoutManager
= getLayoutManagerFromFrame( m_xFrame
);
1830 Application::PostUserEvent( STATIC_LINK(0, ToolBarManager
, ExecuteHdl_Impl
), pExecuteInfo
);
1834 case MENUITEM_TOOLBAR_LOCKTOOLBARPOSITION
:
1836 Reference
< XLayoutManager
> xLayoutManager
= getLayoutManagerFromFrame( m_xFrame
);
1837 if ( xLayoutManager
.is() )
1839 Reference
< XDockableWindow
> xDockable( VCLUnoHelper::GetInterface( m_pToolBar
), UNO_QUERY
);
1841 if( xDockable
->isLocked() )
1842 xLayoutManager
->unlockWindow( m_aResourceName
);
1844 xLayoutManager
->lockWindow( m_aResourceName
);
1849 case MENUITEM_TOOLBAR_CLOSE
:
1851 ExecuteInfo
* pExecuteInfo
= new ExecuteInfo
;
1853 pExecuteInfo
->aToolbarResName
= m_aResourceName
;
1854 pExecuteInfo
->nCmd
= EXEC_CMD_CLOSETOOLBAR
;
1855 pExecuteInfo
->xLayoutManager
= getLayoutManagerFromFrame( m_xFrame
);
1856 pExecuteInfo
->xWindow
= VCLUnoHelper::GetInterface( m_pToolBar
);
1858 Application::PostUserEvent( STATIC_LINK(0, ToolBarManager
, ExecuteHdl_Impl
), pExecuteInfo
);
1863 USHORT nId
= pMenu
->GetCurItemId();
1864 if(( nId
> 0 ) && ( nId
< TOOLBOX_MENUITEM_START
))
1866 // toggle toolbar button visibility
1867 rtl::OUString aCommand
= pMenu
->GetItemCommand( nId
);
1869 Reference
< XLayoutManager
> xLayoutManager
= getLayoutManagerFromFrame( m_xFrame
);
1870 if ( xLayoutManager
.is() )
1872 Reference
< XUIElementSettings
> xUIElementSettings( xLayoutManager
->getElement( m_aResourceName
), UNO_QUERY
);
1873 if ( xUIElementSettings
.is() )
1875 Reference
< XIndexContainer
> xItemContainer( xUIElementSettings
->getSettings( sal_True
), UNO_QUERY
);
1876 sal_Int32 nCount
= xItemContainer
->getCount();
1877 for ( sal_Int32 i
= 0; i
< nCount
; i
++ )
1879 Sequence
< PropertyValue
> aProp
;
1880 sal_Int32
nVisibleIndex( -1 );
1881 rtl::OUString aCommandURL
;
1882 sal_Bool
bVisible( sal_False
);
1884 if ( xItemContainer
->getByIndex( i
) >>= aProp
)
1886 for ( sal_Int32 j
= 0; j
< aProp
.getLength(); j
++ )
1888 if ( aProp
[j
].Name
.equalsAscii( ITEM_DESCRIPTOR_COMMANDURL
))
1890 aProp
[j
].Value
>>= aCommandURL
;
1892 else if ( aProp
[j
].Name
.equalsAscii( ITEM_DESCRIPTOR_VISIBLE
))
1894 aProp
[j
].Value
>>= bVisible
;
1899 if (( aCommandURL
== aCommand
) && ( nVisibleIndex
>= 0 ))
1901 // We have found the requested item, toggle the visible flag
1902 // and write back the configuration settings to the toolbar
1903 aProp
[nVisibleIndex
].Value
= makeAny( !bVisible
);
1906 xItemContainer
->replaceByIndex( i
, makeAny( aProp
));
1907 xUIElementSettings
->setSettings( Reference
< XIndexAccess
>( xItemContainer
, UNO_QUERY
));
1908 Reference
< XPropertySet
> xPropSet( xUIElementSettings
, UNO_QUERY
);
1909 if ( xPropSet
.is() )
1911 Reference
< XUIConfigurationPersistence
> xUICfgMgr
;
1912 if (( xPropSet
->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ConfigurationSource" ))) >>= xUICfgMgr
) && ( xUICfgMgr
.is() ))
1916 catch ( Exception
& )
1931 // remove all entries - deactivate is not reliable
1932 // The method checks if we are already disposed and in that case does nothing!
1933 ImplClearPopupMenu( m_pToolBar
);
1939 IMPL_LINK( ToolBarManager
, Select
, ToolBox
*, EMPTYARG
)
1944 sal_Int16
nKeyModifier( (sal_Int16
)m_pToolBar
->GetModifier() );
1945 USHORT
nId( m_pToolBar
->GetCurItemId() );
1947 ToolBarControllerMap::const_iterator pIter
= m_aControllerMap
.find( nId
);
1948 if ( pIter
!= m_aControllerMap
.end() )
1950 Reference
< XToolbarController
> xController( pIter
->second
, UNO_QUERY
);
1952 if ( xController
.is() )
1953 xController
->execute( nKeyModifier
);
1959 IMPL_LINK( ToolBarManager
, Highlight
, ToolBox
*, EMPTYARG
)
1964 IMPL_LINK( ToolBarManager
, Activate
, ToolBox
*, EMPTYARG
)
1969 IMPL_LINK( ToolBarManager
, Deactivate
, ToolBox
*, EMPTYARG
)
1974 IMPL_LINK( ToolBarManager
, StateChanged
, StateChangedType
*, pStateChangedType
)
1979 if ( *pStateChangedType
== STATE_CHANGE_CONTROLBACKGROUND
)
1981 // Check if we need to get new images for normal/high contrast mode
1982 CheckAndUpdateImages();
1984 else if ( *pStateChangedType
== STATE_CHANGE_VISIBLE
)
1986 if ( m_pToolBar
->IsReallyVisible() )
1987 m_aAsyncUpdateControllersTimer
.Start();
1989 else if ( *pStateChangedType
== STATE_CHANGE_INITSHOW
)
1991 m_aAsyncUpdateControllersTimer
.Start();
1996 IMPL_LINK( ToolBarManager
, DataChanged
, DataChangedEvent
*, pDataChangedEvent
)
1998 if ((( pDataChangedEvent
->GetType() == DATACHANGED_SETTINGS
) ||
1999 ( pDataChangedEvent
->GetType() == DATACHANGED_DISPLAY
)) &&
2000 ( pDataChangedEvent
->GetFlags() & SETTINGS_STYLE
))
2002 // Check if we need to get new images for normal/high contrast mode
2003 CheckAndUpdateImages();
2006 for ( USHORT nPos
= 0; nPos
< m_pToolBar
->GetItemCount(); ++nPos
)
2008 const USHORT nId
= m_pToolBar
->GetItemId(nPos
);
2009 Window
* pWindow
= m_pToolBar
->GetItemWindow( nId
);
2012 const DataChangedEvent
& rDCEvt( *pDataChangedEvent
);
2013 pWindow
->DataChanged( rDCEvt
);
2017 if ( !m_pToolBar
->IsFloatingMode() &&
2018 m_pToolBar
->IsVisible() )
2020 // Resize toolbar, layout manager is resize listener and will calc
2021 // the layout automatically.
2022 ::Size
aSize( m_pToolBar
->CalcWindowSizePixel() );
2023 m_pToolBar
->SetOutputSizePixel( aSize
);
2029 IMPL_LINK( ToolBarManager
, AsyncUpdateControllersHdl
, Timer
*, EMPTYARG
)
2031 // The guard must be in its own context as the we can get destroyed when our
2032 // own xInterface reference get destroyed!
2033 Reference
< XComponent
> xThis( static_cast< OWeakObject
* >(this), UNO_QUERY
);
2035 ResetableGuard
aGuard( m_aLock
);
2040 // Request to update our controllers
2041 m_aAsyncUpdateControllersTimer
.Stop();
2042 UpdateControllers();
2047 IMPL_STATIC_LINK_NOINSTANCE( ToolBarManager
, ExecuteHdl_Impl
, ExecuteInfo
*, pExecuteInfo
)
2051 // Asynchronous execution as this can lead to our own destruction!
2052 if (( pExecuteInfo
->nCmd
== EXEC_CMD_CLOSETOOLBAR
) &&
2053 ( pExecuteInfo
->xLayoutManager
.is() ) &&
2054 ( pExecuteInfo
->xWindow
.is() ))
2056 // Use docking window close to close the toolbar. The layout manager is
2057 // listener and will react correctly according to the context sensitive
2058 // flag of our toolbar.
2059 Window
* pWin
= VCLUnoHelper::GetWindow( pExecuteInfo
->xWindow
);
2060 DockingWindow
* pDockWin
= dynamic_cast< DockingWindow
* >( pWin
);
2064 else if (( pExecuteInfo
->nCmd
== EXEC_CMD_DOCKTOOLBAR
) &&
2065 ( pExecuteInfo
->xLayoutManager
.is() ))
2067 ::com::sun::star::awt::Point aPoint
;
2068 aPoint
.X
= aPoint
.Y
= SAL_MAX_INT32
;
2069 pExecuteInfo
->xLayoutManager
->dockWindow( pExecuteInfo
->aToolbarResName
,
2070 DockingArea_DOCKINGAREA_DEFAULT
,
2073 else if (( pExecuteInfo
->nCmd
== EXEC_CMD_DOCKALLTOOLBARS
) &&
2074 ( pExecuteInfo
->xLayoutManager
.is() ))
2076 pExecuteInfo
->xLayoutManager
->dockAllWindows( UIElementType::TOOLBAR
);
2079 catch ( Exception
& )
2083 delete pExecuteInfo
;
2087 Image
ToolBarManager::QueryAddonsImage( const ::rtl::OUString
& aCommandURL
, bool bBigImages
, bool bHiContrast
)
2089 Image aImage
= framework::AddonsOptions().GetImageFromURL( aCommandURL
, bBigImages
, bHiContrast
);