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