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_svtools.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <svtools/contextmenuhelper.hxx>
28*b1cdbd2cSJim Jagielski #include <svtools/menuoptions.hxx>
29*b1cdbd2cSJim Jagielski #include <svtools/miscopt.hxx>
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XDispatch.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XDispatchProvider.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XModuleManager.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XStatusListener.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiServiceFactory.hpp>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
37*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/XUIConfigurationManager.hpp>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/XModuleUIConfigurationManagerSupplier.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/ImageType.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyValue.hpp>
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski #include <osl/conditn.hxx>
43*b1cdbd2cSJim Jagielski #include <cppuhelper/weak.hxx>
44*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
45*b1cdbd2cSJim Jagielski #include <vos/mutex.hxx>
46*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
47*b1cdbd2cSJim Jagielski #include <vcl/image.hxx>
48*b1cdbd2cSJim Jagielski #include <toolkit/unohlp.hxx>
49*b1cdbd2cSJim Jagielski #include <toolkit/awt/vclxwindow.hxx>
50*b1cdbd2cSJim Jagielski #include <toolkit/awt/vclxmenu.hxx>
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski namespace svt
55*b1cdbd2cSJim Jagielski {
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski // internal helper class to retrieve status updates
58*b1cdbd2cSJim Jagielski class StateEventHelper : public ::com::sun::star::frame::XStatusListener,
59*b1cdbd2cSJim Jagielski                          public ::cppu::OWeakObject
60*b1cdbd2cSJim Jagielski {
61*b1cdbd2cSJim Jagielski     public:
62*b1cdbd2cSJim Jagielski         StateEventHelper( const uno::Reference< frame::XDispatchProvider >& xDispatchProvider,
63*b1cdbd2cSJim Jagielski                           const uno::Reference< util::XURLTransformer >& xURLTransformer,
64*b1cdbd2cSJim Jagielski                           const rtl::OUString& aCommandURL );
65*b1cdbd2cSJim Jagielski         virtual ~StateEventHelper();
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski         bool isCommandEnabled();
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski 		// XInterface
70*b1cdbd2cSJim Jagielski 		virtual uno::Any SAL_CALL queryInterface( const uno::Type& aType ) throw ( uno::RuntimeException);
71*b1cdbd2cSJim Jagielski 		virtual void SAL_CALL acquire() throw ();
72*b1cdbd2cSJim Jagielski 		virtual void SAL_CALL release() throw ();
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski         // XEventListener
75*b1cdbd2cSJim Jagielski 	    virtual void SAL_CALL disposing(const lang::EventObject& Source) throw( uno::RuntimeException );
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski         // XStatusListener
78*b1cdbd2cSJim Jagielski 	    virtual void SAL_CALL statusChanged(const frame::FeatureStateEvent& Event) throw( uno::RuntimeException );
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski     private:
81*b1cdbd2cSJim Jagielski         StateEventHelper();
82*b1cdbd2cSJim Jagielski         StateEventHelper( const StateEventHelper& );
83*b1cdbd2cSJim Jagielski         StateEventHelper& operator=( const StateEventHelper& );
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski         bool                                       m_bCurrentCommandEnabled;
86*b1cdbd2cSJim Jagielski         ::rtl::OUString                            m_aCommandURL;
87*b1cdbd2cSJim Jagielski         uno::Reference< frame::XDispatchProvider > m_xDispatchProvider;
88*b1cdbd2cSJim Jagielski         uno::Reference< util::XURLTransformer >    m_xURLTransformer;
89*b1cdbd2cSJim Jagielski         osl::Condition                             m_aCondition;
90*b1cdbd2cSJim Jagielski };
91*b1cdbd2cSJim Jagielski 
StateEventHelper(const uno::Reference<frame::XDispatchProvider> & xDispatchProvider,const uno::Reference<util::XURLTransformer> & xURLTransformer,const rtl::OUString & rCommandURL)92*b1cdbd2cSJim Jagielski StateEventHelper::StateEventHelper(
93*b1cdbd2cSJim Jagielski     const uno::Reference< frame::XDispatchProvider >& xDispatchProvider,
94*b1cdbd2cSJim Jagielski     const uno::Reference< util::XURLTransformer >& xURLTransformer,
95*b1cdbd2cSJim Jagielski     const rtl::OUString& rCommandURL ) :
96*b1cdbd2cSJim Jagielski     m_bCurrentCommandEnabled( true ),
97*b1cdbd2cSJim Jagielski     m_aCommandURL( rCommandURL ),
98*b1cdbd2cSJim Jagielski     m_xDispatchProvider( xDispatchProvider ),
99*b1cdbd2cSJim Jagielski     m_xURLTransformer( xURLTransformer )
100*b1cdbd2cSJim Jagielski {
101*b1cdbd2cSJim Jagielski     m_aCondition.reset();
102*b1cdbd2cSJim Jagielski }
103*b1cdbd2cSJim Jagielski 
~StateEventHelper()104*b1cdbd2cSJim Jagielski StateEventHelper::~StateEventHelper()
105*b1cdbd2cSJim Jagielski {}
106*b1cdbd2cSJim Jagielski 
queryInterface(const uno::Type & aType)107*b1cdbd2cSJim Jagielski uno::Any SAL_CALL StateEventHelper::queryInterface(
108*b1cdbd2cSJim Jagielski     const uno::Type& aType )
109*b1cdbd2cSJim Jagielski throw ( uno::RuntimeException )
110*b1cdbd2cSJim Jagielski {
111*b1cdbd2cSJim Jagielski     uno::Any a = ::cppu::queryInterface(
112*b1cdbd2cSJim Jagielski 				aType,
113*b1cdbd2cSJim Jagielski 				SAL_STATIC_CAST( XStatusListener*, this ));
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski 	if( a.hasValue() )
116*b1cdbd2cSJim Jagielski 		return a;
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski     return ::cppu::OWeakObject::queryInterface( aType );
119*b1cdbd2cSJim Jagielski }
120*b1cdbd2cSJim Jagielski 
acquire()121*b1cdbd2cSJim Jagielski void SAL_CALL StateEventHelper::acquire()
122*b1cdbd2cSJim Jagielski throw ()
123*b1cdbd2cSJim Jagielski {
124*b1cdbd2cSJim Jagielski     ::cppu::OWeakObject::acquire();
125*b1cdbd2cSJim Jagielski }
126*b1cdbd2cSJim Jagielski 
release()127*b1cdbd2cSJim Jagielski void SAL_CALL StateEventHelper::release()
128*b1cdbd2cSJim Jagielski throw ()
129*b1cdbd2cSJim Jagielski {
130*b1cdbd2cSJim Jagielski     ::cppu::OWeakObject::release();
131*b1cdbd2cSJim Jagielski }
132*b1cdbd2cSJim Jagielski 
disposing(const lang::EventObject &)133*b1cdbd2cSJim Jagielski void SAL_CALL StateEventHelper::disposing(
134*b1cdbd2cSJim Jagielski     const lang::EventObject& )
135*b1cdbd2cSJim Jagielski throw ( uno::RuntimeException )
136*b1cdbd2cSJim Jagielski {
137*b1cdbd2cSJim Jagielski     vos::OGuard	aSolarGuard( Application::GetSolarMutex() );
138*b1cdbd2cSJim Jagielski     m_xDispatchProvider.clear();
139*b1cdbd2cSJim Jagielski     m_xURLTransformer.clear();
140*b1cdbd2cSJim Jagielski     m_aCondition.set();
141*b1cdbd2cSJim Jagielski }
142*b1cdbd2cSJim Jagielski 
statusChanged(const frame::FeatureStateEvent & Event)143*b1cdbd2cSJim Jagielski void SAL_CALL StateEventHelper::statusChanged(
144*b1cdbd2cSJim Jagielski     const frame::FeatureStateEvent& Event )
145*b1cdbd2cSJim Jagielski throw ( uno::RuntimeException )
146*b1cdbd2cSJim Jagielski {
147*b1cdbd2cSJim Jagielski     vos::OGuard	aSolarGuard( Application::GetSolarMutex() );
148*b1cdbd2cSJim Jagielski     m_bCurrentCommandEnabled = Event.IsEnabled;
149*b1cdbd2cSJim Jagielski     m_aCondition.set();
150*b1cdbd2cSJim Jagielski }
151*b1cdbd2cSJim Jagielski 
isCommandEnabled()152*b1cdbd2cSJim Jagielski bool StateEventHelper::isCommandEnabled()
153*b1cdbd2cSJim Jagielski {
154*b1cdbd2cSJim Jagielski     // Be sure that we cannot die during condition wait
155*b1cdbd2cSJim Jagielski     uno::Reference< frame::XStatusListener > xSelf(
156*b1cdbd2cSJim Jagielski         SAL_STATIC_CAST( frame::XStatusListener*, this ));
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski     uno::Reference< frame::XDispatch > xDispatch;
159*b1cdbd2cSJim Jagielski     util::URL                          aTargetURL;
160*b1cdbd2cSJim Jagielski     {
161*b1cdbd2cSJim Jagielski         vos::OGuard	aSolarGuard( Application::GetSolarMutex() );
162*b1cdbd2cSJim Jagielski         if ( m_xDispatchProvider.is() && m_xURLTransformer.is() )
163*b1cdbd2cSJim Jagielski         {
164*b1cdbd2cSJim Jagielski             ::rtl::OUString aSelf( RTL_CONSTASCII_USTRINGPARAM( "_self" ));
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski             aTargetURL.Complete = m_aCommandURL;
167*b1cdbd2cSJim Jagielski             m_xURLTransformer->parseStrict( aTargetURL );
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski             try
170*b1cdbd2cSJim Jagielski             {
171*b1cdbd2cSJim Jagielski                 xDispatch = m_xDispatchProvider->queryDispatch( aTargetURL, aSelf, 0 );
172*b1cdbd2cSJim Jagielski             }
173*b1cdbd2cSJim Jagielski             catch ( uno::RuntimeException& )
174*b1cdbd2cSJim Jagielski             {
175*b1cdbd2cSJim Jagielski                 throw;
176*b1cdbd2cSJim Jagielski             }
177*b1cdbd2cSJim Jagielski             catch ( uno::Exception& )
178*b1cdbd2cSJim Jagielski             {
179*b1cdbd2cSJim Jagielski             }
180*b1cdbd2cSJim Jagielski         }
181*b1cdbd2cSJim Jagielski     }
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski     bool bResult( false );
184*b1cdbd2cSJim Jagielski     if ( xDispatch.is() )
185*b1cdbd2cSJim Jagielski     {
186*b1cdbd2cSJim Jagielski         try
187*b1cdbd2cSJim Jagielski         {
188*b1cdbd2cSJim Jagielski             // add/remove ourself to retrieve status by callback
189*b1cdbd2cSJim Jagielski             xDispatch->addStatusListener( xSelf, aTargetURL );
190*b1cdbd2cSJim Jagielski             xDispatch->removeStatusListener( xSelf, aTargetURL );
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski             // wait for anwser
193*b1cdbd2cSJim Jagielski             m_aCondition.wait();
194*b1cdbd2cSJim Jagielski         }
195*b1cdbd2cSJim Jagielski         catch ( uno::RuntimeException& )
196*b1cdbd2cSJim Jagielski         {
197*b1cdbd2cSJim Jagielski             throw;
198*b1cdbd2cSJim Jagielski         }
199*b1cdbd2cSJim Jagielski         catch ( uno::Exception& )
200*b1cdbd2cSJim Jagielski         {
201*b1cdbd2cSJim Jagielski         }
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski         vos::OGuard	aSolarGuard( Application::GetSolarMutex() );
204*b1cdbd2cSJim Jagielski         bResult = m_bCurrentCommandEnabled;
205*b1cdbd2cSJim Jagielski     }
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski     return bResult;
208*b1cdbd2cSJim Jagielski }
209*b1cdbd2cSJim Jagielski 
210*b1cdbd2cSJim Jagielski /*************************************************************************/
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski struct ExecuteInfo
213*b1cdbd2cSJim Jagielski {
214*b1cdbd2cSJim Jagielski     uno::Reference< frame::XDispatch >    xDispatch;
215*b1cdbd2cSJim Jagielski     util::URL                             aTargetURL;
216*b1cdbd2cSJim Jagielski     uno::Sequence< beans::PropertyValue > aArgs;
217*b1cdbd2cSJim Jagielski };
218*b1cdbd2cSJim Jagielski 
lcl_FindPopupFromItemId(const PopupMenu * pPopupMenu,sal_uInt16 nItemId)219*b1cdbd2cSJim Jagielski static const PopupMenu* lcl_FindPopupFromItemId( const PopupMenu* pPopupMenu, sal_uInt16 nItemId )
220*b1cdbd2cSJim Jagielski {
221*b1cdbd2cSJim Jagielski     if ( pPopupMenu )
222*b1cdbd2cSJim Jagielski     {
223*b1cdbd2cSJim Jagielski         sal_uInt16 nCount = pPopupMenu->GetItemCount();
224*b1cdbd2cSJim Jagielski         for ( sal_uInt16 i = 0; i < nCount; i++ )
225*b1cdbd2cSJim Jagielski         {
226*b1cdbd2cSJim Jagielski             sal_uInt16 nId = pPopupMenu->GetItemId( i );
227*b1cdbd2cSJim Jagielski             if ( nId == nItemId )
228*b1cdbd2cSJim Jagielski                 return pPopupMenu;
229*b1cdbd2cSJim Jagielski             else
230*b1cdbd2cSJim Jagielski             {
231*b1cdbd2cSJim Jagielski                 const PopupMenu* pResult( 0 );
232*b1cdbd2cSJim Jagielski 
233*b1cdbd2cSJim Jagielski                 const PopupMenu* pSubPopup = pPopupMenu->GetPopupMenu( i );
234*b1cdbd2cSJim Jagielski                 if ( pPopupMenu )
235*b1cdbd2cSJim Jagielski                     pResult = lcl_FindPopupFromItemId( pSubPopup, nItemId );
236*b1cdbd2cSJim Jagielski                 if ( pResult != 0 )
237*b1cdbd2cSJim Jagielski                     return pResult;
238*b1cdbd2cSJim Jagielski             }
239*b1cdbd2cSJim Jagielski         }
240*b1cdbd2cSJim Jagielski     }
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski     return NULL;
243*b1cdbd2cSJim Jagielski }
244*b1cdbd2cSJim Jagielski 
lcl_GetItemCommandRecursive(const PopupMenu * pPopupMenu,sal_uInt16 nItemId)245*b1cdbd2cSJim Jagielski static ::rtl::OUString lcl_GetItemCommandRecursive( const PopupMenu* pPopupMenu, sal_uInt16 nItemId )
246*b1cdbd2cSJim Jagielski {
247*b1cdbd2cSJim Jagielski     const PopupMenu* pPopup = lcl_FindPopupFromItemId( pPopupMenu, nItemId );
248*b1cdbd2cSJim Jagielski     if ( pPopup )
249*b1cdbd2cSJim Jagielski         return pPopup->GetItemCommand( nItemId );
250*b1cdbd2cSJim Jagielski     else
251*b1cdbd2cSJim Jagielski         return ::rtl::OUString();
252*b1cdbd2cSJim Jagielski }
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski /*************************************************************************/
255*b1cdbd2cSJim Jagielski 
ContextMenuHelper(const uno::Reference<frame::XFrame> & xFrame,bool bAutoRefresh)256*b1cdbd2cSJim Jagielski ContextMenuHelper::ContextMenuHelper(
257*b1cdbd2cSJim Jagielski     const uno::Reference< frame::XFrame >& xFrame,
258*b1cdbd2cSJim Jagielski     bool bAutoRefresh ) :
259*b1cdbd2cSJim Jagielski     m_xWeakFrame( xFrame ),
260*b1cdbd2cSJim Jagielski     m_aSelf( RTL_CONSTASCII_USTRINGPARAM( "_self" )),
261*b1cdbd2cSJim Jagielski     m_bAutoRefresh( bAutoRefresh ),
262*b1cdbd2cSJim Jagielski     m_bUICfgMgrAssociated( false )
263*b1cdbd2cSJim Jagielski {
264*b1cdbd2cSJim Jagielski }
265*b1cdbd2cSJim Jagielski 
~ContextMenuHelper()266*b1cdbd2cSJim Jagielski ContextMenuHelper::~ContextMenuHelper()
267*b1cdbd2cSJim Jagielski {
268*b1cdbd2cSJim Jagielski }
269*b1cdbd2cSJim Jagielski 
270*b1cdbd2cSJim Jagielski void
completeAndExecute(const Point & aPos,PopupMenu & rPopupMenu)271*b1cdbd2cSJim Jagielski ContextMenuHelper::completeAndExecute(
272*b1cdbd2cSJim Jagielski     const Point& aPos,
273*b1cdbd2cSJim Jagielski     PopupMenu& rPopupMenu )
274*b1cdbd2cSJim Jagielski {
275*b1cdbd2cSJim Jagielski     vos::OGuard	aSolarGuard( Application::GetSolarMutex() );
276*b1cdbd2cSJim Jagielski 
277*b1cdbd2cSJim Jagielski     associateUIConfigurationManagers();
278*b1cdbd2cSJim Jagielski     completeMenuProperties( &rPopupMenu );
279*b1cdbd2cSJim Jagielski     executePopupMenu( aPos, &rPopupMenu );
280*b1cdbd2cSJim Jagielski     resetAssociations();
281*b1cdbd2cSJim Jagielski }
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski void
completeAndExecute(const Point & aPos,const uno::Reference<awt::XPopupMenu> & xPopupMenu)284*b1cdbd2cSJim Jagielski ContextMenuHelper::completeAndExecute(
285*b1cdbd2cSJim Jagielski     const Point& aPos,
286*b1cdbd2cSJim Jagielski     const uno::Reference< awt::XPopupMenu >& xPopupMenu )
287*b1cdbd2cSJim Jagielski {
288*b1cdbd2cSJim Jagielski     vos::OGuard	aSolarGuard( Application::GetSolarMutex() );
289*b1cdbd2cSJim Jagielski 
290*b1cdbd2cSJim Jagielski     VCLXMenu* pXMenu = VCLXMenu::GetImplementation( xPopupMenu );
291*b1cdbd2cSJim Jagielski     if ( pXMenu )
292*b1cdbd2cSJim Jagielski     {
293*b1cdbd2cSJim Jagielski         PopupMenu* pPopupMenu = dynamic_cast< PopupMenu* >( pXMenu->GetMenu() );
294*b1cdbd2cSJim Jagielski         // as dynamic_cast can return zero check pointer
295*b1cdbd2cSJim Jagielski         if ( pPopupMenu )
296*b1cdbd2cSJim Jagielski         {
297*b1cdbd2cSJim Jagielski             associateUIConfigurationManagers();
298*b1cdbd2cSJim Jagielski             completeMenuProperties( pPopupMenu );
299*b1cdbd2cSJim Jagielski             executePopupMenu( aPos, pPopupMenu );
300*b1cdbd2cSJim Jagielski             resetAssociations();
301*b1cdbd2cSJim Jagielski         }
302*b1cdbd2cSJim Jagielski     }
303*b1cdbd2cSJim Jagielski }
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski uno::Reference< awt::XPopupMenu >
create(const::rtl::OUString &)306*b1cdbd2cSJim Jagielski ContextMenuHelper::create(
307*b1cdbd2cSJim Jagielski     const ::rtl::OUString& /*aPopupMenuResourceId*/ )
308*b1cdbd2cSJim Jagielski {
309*b1cdbd2cSJim Jagielski     // NOT IMPLEMENTED YET!
310*b1cdbd2cSJim Jagielski     return uno::Reference< awt::XPopupMenu >();
311*b1cdbd2cSJim Jagielski }
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski bool
createAndExecute(const Point &,const::rtl::OUString &)314*b1cdbd2cSJim Jagielski ContextMenuHelper::createAndExecute(
315*b1cdbd2cSJim Jagielski     const Point& /*aPos*/,
316*b1cdbd2cSJim Jagielski     const ::rtl::OUString& /*aPopupMenuResourceId*/ )
317*b1cdbd2cSJim Jagielski {
318*b1cdbd2cSJim Jagielski     // NOT IMPLEMENTED YET!
319*b1cdbd2cSJim Jagielski     return false;
320*b1cdbd2cSJim Jagielski }
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski // private member
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski void
executePopupMenu(const Point & rPos,PopupMenu * pMenu)325*b1cdbd2cSJim Jagielski ContextMenuHelper::executePopupMenu(
326*b1cdbd2cSJim Jagielski     const Point& rPos,
327*b1cdbd2cSJim Jagielski     PopupMenu* pMenu )
328*b1cdbd2cSJim Jagielski {
329*b1cdbd2cSJim Jagielski     if ( pMenu )
330*b1cdbd2cSJim Jagielski     {
331*b1cdbd2cSJim Jagielski         uno::Reference< frame::XFrame > xFrame( m_xWeakFrame );
332*b1cdbd2cSJim Jagielski         if ( xFrame.is() )
333*b1cdbd2cSJim Jagielski         {
334*b1cdbd2cSJim Jagielski             uno::Reference< awt::XWindow > xWindow( xFrame->getContainerWindow() );
335*b1cdbd2cSJim Jagielski             if ( xWindow.is() )
336*b1cdbd2cSJim Jagielski             {
337*b1cdbd2cSJim Jagielski                 Window* pParent = VCLUnoHelper::GetWindow( xWindow );
338*b1cdbd2cSJim Jagielski                 sal_uInt16 nResult = pMenu->Execute( pParent, rPos );
339*b1cdbd2cSJim Jagielski 
340*b1cdbd2cSJim Jagielski                 if ( nResult > 0 )
341*b1cdbd2cSJim Jagielski                 {
342*b1cdbd2cSJim Jagielski                     ::rtl::OUString aCommand = lcl_GetItemCommandRecursive( pMenu, nResult );
343*b1cdbd2cSJim Jagielski                     if ( aCommand.getLength() > 0 )
344*b1cdbd2cSJim Jagielski                         dispatchCommand( xFrame, aCommand );
345*b1cdbd2cSJim Jagielski                 }
346*b1cdbd2cSJim Jagielski             }
347*b1cdbd2cSJim Jagielski         }
348*b1cdbd2cSJim Jagielski     }
349*b1cdbd2cSJim Jagielski }
350*b1cdbd2cSJim Jagielski 
351*b1cdbd2cSJim Jagielski bool
dispatchCommand(const uno::Reference<::frame::XFrame> & rFrame,const::rtl::OUString & aCommandURL)352*b1cdbd2cSJim Jagielski ContextMenuHelper::dispatchCommand(
353*b1cdbd2cSJim Jagielski     const uno::Reference< ::frame::XFrame >& rFrame,
354*b1cdbd2cSJim Jagielski     const ::rtl::OUString& aCommandURL )
355*b1cdbd2cSJim Jagielski {
356*b1cdbd2cSJim Jagielski     if ( !m_xURLTransformer.is() )
357*b1cdbd2cSJim Jagielski     {
358*b1cdbd2cSJim Jagielski         m_xURLTransformer = uno::Reference< util::XURLTransformer >(
359*b1cdbd2cSJim Jagielski             ::comphelper::getProcessServiceFactory()->createInstance(
360*b1cdbd2cSJim Jagielski                 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
361*b1cdbd2cSJim Jagielski                     "com.sun.star.util.URLTransformer" ))),
362*b1cdbd2cSJim Jagielski             uno::UNO_QUERY );
363*b1cdbd2cSJim Jagielski     }
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski     util::URL aTargetURL;
366*b1cdbd2cSJim Jagielski     uno::Reference< frame::XDispatch > xDispatch;
367*b1cdbd2cSJim Jagielski     if ( m_xURLTransformer.is() )
368*b1cdbd2cSJim Jagielski     {
369*b1cdbd2cSJim Jagielski         aTargetURL.Complete = aCommandURL;
370*b1cdbd2cSJim Jagielski         m_xURLTransformer->parseStrict( aTargetURL );
371*b1cdbd2cSJim Jagielski 
372*b1cdbd2cSJim Jagielski         uno::Reference< frame::XDispatchProvider > xDispatchProvider(
373*b1cdbd2cSJim Jagielski             rFrame, uno::UNO_QUERY );
374*b1cdbd2cSJim Jagielski         if ( xDispatchProvider.is() )
375*b1cdbd2cSJim Jagielski         {
376*b1cdbd2cSJim Jagielski             try
377*b1cdbd2cSJim Jagielski             {
378*b1cdbd2cSJim Jagielski                 xDispatch = xDispatchProvider->queryDispatch( aTargetURL, m_aSelf, 0 );
379*b1cdbd2cSJim Jagielski             }
380*b1cdbd2cSJim Jagielski             catch ( uno::RuntimeException& )
381*b1cdbd2cSJim Jagielski             {
382*b1cdbd2cSJim Jagielski                 throw;
383*b1cdbd2cSJim Jagielski             }
384*b1cdbd2cSJim Jagielski             catch ( uno::Exception& )
385*b1cdbd2cSJim Jagielski             {
386*b1cdbd2cSJim Jagielski             }
387*b1cdbd2cSJim Jagielski         }
388*b1cdbd2cSJim Jagielski     }
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski     if ( xDispatch.is() )
391*b1cdbd2cSJim Jagielski     {
392*b1cdbd2cSJim Jagielski         ExecuteInfo* pExecuteInfo = new ExecuteInfo;
393*b1cdbd2cSJim Jagielski         pExecuteInfo->xDispatch    = xDispatch;
394*b1cdbd2cSJim Jagielski         pExecuteInfo->aTargetURL   = aTargetURL;
395*b1cdbd2cSJim Jagielski         pExecuteInfo->aArgs        = m_aDefaultArgs;
396*b1cdbd2cSJim Jagielski 
397*b1cdbd2cSJim Jagielski         Application::PostUserEvent( STATIC_LINK(0, ContextMenuHelper , ExecuteHdl_Impl), pExecuteInfo );
398*b1cdbd2cSJim Jagielski         return true;
399*b1cdbd2cSJim Jagielski     }
400*b1cdbd2cSJim Jagielski 
401*b1cdbd2cSJim Jagielski     return false;
402*b1cdbd2cSJim Jagielski }
403*b1cdbd2cSJim Jagielski 
404*b1cdbd2cSJim Jagielski // retrieves and stores references to our user-interface
405*b1cdbd2cSJim Jagielski // configuration managers, like image manager, ui command
406*b1cdbd2cSJim Jagielski // description manager.
407*b1cdbd2cSJim Jagielski bool
associateUIConfigurationManagers()408*b1cdbd2cSJim Jagielski ContextMenuHelper::associateUIConfigurationManagers()
409*b1cdbd2cSJim Jagielski {
410*b1cdbd2cSJim Jagielski     uno::Reference< frame::XFrame > xFrame( m_xWeakFrame );
411*b1cdbd2cSJim Jagielski     if ( !m_bUICfgMgrAssociated && xFrame.is() )
412*b1cdbd2cSJim Jagielski     {
413*b1cdbd2cSJim Jagielski         // clear current state
414*b1cdbd2cSJim Jagielski         m_xDocImageMgr.clear();
415*b1cdbd2cSJim Jagielski         m_xModuleImageMgr.clear();
416*b1cdbd2cSJim Jagielski         m_xUICommandLabels.clear();
417*b1cdbd2cSJim Jagielski 
418*b1cdbd2cSJim Jagielski         try
419*b1cdbd2cSJim Jagielski         {
420*b1cdbd2cSJim Jagielski             uno::Reference < frame::XController > xController;
421*b1cdbd2cSJim Jagielski             uno::Reference < frame::XModel > xModel;
422*b1cdbd2cSJim Jagielski             xController = xFrame->getController();
423*b1cdbd2cSJim Jagielski             if ( xController.is() )
424*b1cdbd2cSJim Jagielski                 xModel = xController->getModel();
425*b1cdbd2cSJim Jagielski 
426*b1cdbd2cSJim Jagielski             if ( xModel.is() )
427*b1cdbd2cSJim Jagielski             {
428*b1cdbd2cSJim Jagielski                 // retrieve document image manager form model
429*b1cdbd2cSJim Jagielski                 uno::Reference< ui::XUIConfigurationManagerSupplier > xSupplier( xModel, uno::UNO_QUERY );
430*b1cdbd2cSJim Jagielski                 if ( xSupplier.is() )
431*b1cdbd2cSJim Jagielski                 {
432*b1cdbd2cSJim Jagielski                     uno::Reference< ui::XUIConfigurationManager > xDocUICfgMgr(
433*b1cdbd2cSJim Jagielski                         xSupplier->getUIConfigurationManager(), uno::UNO_QUERY );
434*b1cdbd2cSJim Jagielski                     m_xDocImageMgr = uno::Reference< ui::XImageManager >(
435*b1cdbd2cSJim Jagielski                         xDocUICfgMgr->getImageManager(), uno::UNO_QUERY );
436*b1cdbd2cSJim Jagielski                 }
437*b1cdbd2cSJim Jagielski             }
438*b1cdbd2cSJim Jagielski 
439*b1cdbd2cSJim Jagielski             uno::Reference< frame::XModuleManager > xModuleManager(
440*b1cdbd2cSJim Jagielski                 ::comphelper::getProcessServiceFactory()->createInstance(
441*b1cdbd2cSJim Jagielski                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
442*b1cdbd2cSJim Jagielski                         "com.sun.star.frame.ModuleManager" ))),
443*b1cdbd2cSJim Jagielski                 uno::UNO_QUERY );
444*b1cdbd2cSJim Jagielski 
445*b1cdbd2cSJim Jagielski             uno::Reference< ui::XImageManager > xModuleImageManager;
446*b1cdbd2cSJim Jagielski             rtl::OUString                       aModuleId;
447*b1cdbd2cSJim Jagielski             if ( xModuleManager.is() )
448*b1cdbd2cSJim Jagielski             {
449*b1cdbd2cSJim Jagielski                 // retrieve module image manager
450*b1cdbd2cSJim Jagielski                 aModuleId = xModuleManager->identify( xFrame );
451*b1cdbd2cSJim Jagielski 
452*b1cdbd2cSJim Jagielski                 uno::Reference< ui::XModuleUIConfigurationManagerSupplier > xModuleCfgMgrSupplier(
453*b1cdbd2cSJim Jagielski                     ::comphelper::getProcessServiceFactory()->createInstance(
454*b1cdbd2cSJim Jagielski                         rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
455*b1cdbd2cSJim Jagielski                             "com.sun.star.ui.ModuleUIConfigurationManagerSupplier" ))),
456*b1cdbd2cSJim Jagielski                         uno::UNO_QUERY );
457*b1cdbd2cSJim Jagielski                 if ( xModuleCfgMgrSupplier.is() )
458*b1cdbd2cSJim Jagielski                 {
459*b1cdbd2cSJim Jagielski                     uno::Reference< ui::XUIConfigurationManager > xUICfgMgr(
460*b1cdbd2cSJim Jagielski                         xModuleCfgMgrSupplier->getUIConfigurationManager( aModuleId ));
461*b1cdbd2cSJim Jagielski                     if ( xUICfgMgr.is() )
462*b1cdbd2cSJim Jagielski                     {
463*b1cdbd2cSJim Jagielski                         m_xModuleImageMgr = uno::Reference< ui::XImageManager >(
464*b1cdbd2cSJim Jagielski                             xUICfgMgr->getImageManager(), uno::UNO_QUERY );
465*b1cdbd2cSJim Jagielski                     }
466*b1cdbd2cSJim Jagielski                 }
467*b1cdbd2cSJim Jagielski             }
468*b1cdbd2cSJim Jagielski 
469*b1cdbd2cSJim Jagielski             uno::Reference< container::XNameAccess > xNameAccess(
470*b1cdbd2cSJim Jagielski                 ::comphelper::getProcessServiceFactory()->createInstance(
471*b1cdbd2cSJim Jagielski                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
472*b1cdbd2cSJim Jagielski                         "com.sun.star.frame.UICommandDescription" ))),
473*b1cdbd2cSJim Jagielski                     uno::UNO_QUERY );
474*b1cdbd2cSJim Jagielski             if ( xNameAccess.is() )
475*b1cdbd2cSJim Jagielski             {
476*b1cdbd2cSJim Jagielski                 try
477*b1cdbd2cSJim Jagielski                 {
478*b1cdbd2cSJim Jagielski                     uno::Any a = xNameAccess->getByName( aModuleId );
479*b1cdbd2cSJim Jagielski                     a >>= m_xUICommandLabels;
480*b1cdbd2cSJim Jagielski                 }
481*b1cdbd2cSJim Jagielski                 catch ( container::NoSuchElementException& )
482*b1cdbd2cSJim Jagielski                 {
483*b1cdbd2cSJim Jagielski                 }
484*b1cdbd2cSJim Jagielski             }
485*b1cdbd2cSJim Jagielski         }
486*b1cdbd2cSJim Jagielski         catch ( uno::RuntimeException& )
487*b1cdbd2cSJim Jagielski         {
488*b1cdbd2cSJim Jagielski             throw;
489*b1cdbd2cSJim Jagielski         }
490*b1cdbd2cSJim Jagielski         catch ( uno::Exception& )
491*b1cdbd2cSJim Jagielski         {
492*b1cdbd2cSJim Jagielski             m_bUICfgMgrAssociated = true;
493*b1cdbd2cSJim Jagielski             return false;
494*b1cdbd2cSJim Jagielski         }
495*b1cdbd2cSJim Jagielski         m_bUICfgMgrAssociated = true;
496*b1cdbd2cSJim Jagielski     }
497*b1cdbd2cSJim Jagielski 
498*b1cdbd2cSJim Jagielski     return true;
499*b1cdbd2cSJim Jagielski }
500*b1cdbd2cSJim Jagielski 
501*b1cdbd2cSJim Jagielski Image
getImageFromCommandURL(const::rtl::OUString & aCmdURL,bool bHiContrast) const502*b1cdbd2cSJim Jagielski ContextMenuHelper::getImageFromCommandURL(
503*b1cdbd2cSJim Jagielski     const ::rtl::OUString& aCmdURL,
504*b1cdbd2cSJim Jagielski     bool                   bHiContrast ) const
505*b1cdbd2cSJim Jagielski {
506*b1cdbd2cSJim Jagielski     Image     aImage;
507*b1cdbd2cSJim Jagielski     sal_Int16 nImageType( ui::ImageType::COLOR_NORMAL|
508*b1cdbd2cSJim Jagielski                           ui::ImageType::SIZE_DEFAULT );
509*b1cdbd2cSJim Jagielski     if ( bHiContrast )
510*b1cdbd2cSJim Jagielski         nImageType |= ui::ImageType::COLOR_HIGHCONTRAST;
511*b1cdbd2cSJim Jagielski 
512*b1cdbd2cSJim Jagielski     uno::Sequence< uno::Reference< graphic::XGraphic > > aGraphicSeq;
513*b1cdbd2cSJim Jagielski     uno::Sequence< ::rtl::OUString > aImageCmdSeq( 1 );
514*b1cdbd2cSJim Jagielski     aImageCmdSeq[0] = aCmdURL;
515*b1cdbd2cSJim Jagielski 
516*b1cdbd2cSJim Jagielski     if ( m_xDocImageMgr.is() )
517*b1cdbd2cSJim Jagielski     {
518*b1cdbd2cSJim Jagielski         try
519*b1cdbd2cSJim Jagielski         {
520*b1cdbd2cSJim Jagielski             aGraphicSeq = m_xDocImageMgr->getImages( nImageType, aImageCmdSeq );
521*b1cdbd2cSJim Jagielski             uno::Reference< graphic::XGraphic > xGraphic = aGraphicSeq[0];
522*b1cdbd2cSJim Jagielski             aImage = Image( xGraphic );
523*b1cdbd2cSJim Jagielski 
524*b1cdbd2cSJim Jagielski             if ( !!aImage )
525*b1cdbd2cSJim Jagielski                 return aImage;
526*b1cdbd2cSJim Jagielski         }
527*b1cdbd2cSJim Jagielski         catch ( uno::RuntimeException& )
528*b1cdbd2cSJim Jagielski         {
529*b1cdbd2cSJim Jagielski             throw;
530*b1cdbd2cSJim Jagielski         }
531*b1cdbd2cSJim Jagielski         catch ( uno::Exception& )
532*b1cdbd2cSJim Jagielski         {
533*b1cdbd2cSJim Jagielski         }
534*b1cdbd2cSJim Jagielski     }
535*b1cdbd2cSJim Jagielski 
536*b1cdbd2cSJim Jagielski     if ( m_xModuleImageMgr.is() )
537*b1cdbd2cSJim Jagielski     {
538*b1cdbd2cSJim Jagielski         try
539*b1cdbd2cSJim Jagielski         {
540*b1cdbd2cSJim Jagielski             aGraphicSeq = m_xModuleImageMgr->getImages( nImageType, aImageCmdSeq );
541*b1cdbd2cSJim Jagielski             uno::Reference< ::com::sun::star::graphic::XGraphic > xGraphic = aGraphicSeq[0];
542*b1cdbd2cSJim Jagielski 	    aImage = Image( xGraphic );
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski             if ( !!aImage )
545*b1cdbd2cSJim Jagielski                 return aImage;
546*b1cdbd2cSJim Jagielski         }
547*b1cdbd2cSJim Jagielski         catch ( uno::RuntimeException& )
548*b1cdbd2cSJim Jagielski         {
549*b1cdbd2cSJim Jagielski             throw;
550*b1cdbd2cSJim Jagielski         }
551*b1cdbd2cSJim Jagielski         catch ( uno::Exception& )
552*b1cdbd2cSJim Jagielski         {
553*b1cdbd2cSJim Jagielski         }
554*b1cdbd2cSJim Jagielski     }
555*b1cdbd2cSJim Jagielski 
556*b1cdbd2cSJim Jagielski     return aImage;
557*b1cdbd2cSJim Jagielski }
558*b1cdbd2cSJim Jagielski 
559*b1cdbd2cSJim Jagielski rtl::OUString
getLabelFromCommandURL(const::rtl::OUString & aCmdURL) const560*b1cdbd2cSJim Jagielski ContextMenuHelper::getLabelFromCommandURL(
561*b1cdbd2cSJim Jagielski     const ::rtl::OUString& aCmdURL ) const
562*b1cdbd2cSJim Jagielski {
563*b1cdbd2cSJim Jagielski     ::rtl::OUString aLabel;
564*b1cdbd2cSJim Jagielski 
565*b1cdbd2cSJim Jagielski     if ( m_xUICommandLabels.is() )
566*b1cdbd2cSJim Jagielski     {
567*b1cdbd2cSJim Jagielski         try
568*b1cdbd2cSJim Jagielski         {
569*b1cdbd2cSJim Jagielski             if ( aCmdURL.getLength() > 0 )
570*b1cdbd2cSJim Jagielski             {
571*b1cdbd2cSJim Jagielski                 rtl::OUString aStr;
572*b1cdbd2cSJim Jagielski                 uno::Sequence< beans::PropertyValue > aPropSeq;
573*b1cdbd2cSJim Jagielski                 uno::Any a( m_xUICommandLabels->getByName( aCmdURL ));
574*b1cdbd2cSJim Jagielski                 if ( a >>= aPropSeq )
575*b1cdbd2cSJim Jagielski                 {
576*b1cdbd2cSJim Jagielski                     for ( sal_Int32 i = 0; i < aPropSeq.getLength(); i++ )
577*b1cdbd2cSJim Jagielski                     {
578*b1cdbd2cSJim Jagielski                         if ( aPropSeq[i].Name.equalsAscii( "Label" ))
579*b1cdbd2cSJim Jagielski                         {
580*b1cdbd2cSJim Jagielski                             aPropSeq[i].Value >>= aStr;
581*b1cdbd2cSJim Jagielski                             break;
582*b1cdbd2cSJim Jagielski                         }
583*b1cdbd2cSJim Jagielski                     }
584*b1cdbd2cSJim Jagielski                 }
585*b1cdbd2cSJim Jagielski                 aLabel = aStr;
586*b1cdbd2cSJim Jagielski             }
587*b1cdbd2cSJim Jagielski         }
588*b1cdbd2cSJim Jagielski         catch ( uno::RuntimeException& )
589*b1cdbd2cSJim Jagielski         {
590*b1cdbd2cSJim Jagielski         }
591*b1cdbd2cSJim Jagielski         catch ( uno::Exception& )
592*b1cdbd2cSJim Jagielski         {
593*b1cdbd2cSJim Jagielski         }
594*b1cdbd2cSJim Jagielski     }
595*b1cdbd2cSJim Jagielski 
596*b1cdbd2cSJim Jagielski     return aLabel;
597*b1cdbd2cSJim Jagielski }
598*b1cdbd2cSJim Jagielski 
599*b1cdbd2cSJim Jagielski void
completeMenuProperties(Menu * pMenu)600*b1cdbd2cSJim Jagielski ContextMenuHelper::completeMenuProperties(
601*b1cdbd2cSJim Jagielski     Menu* pMenu )
602*b1cdbd2cSJim Jagielski {
603*b1cdbd2cSJim Jagielski     // Retrieve some settings necessary to display complete context
604*b1cdbd2cSJim Jagielski     // menu correctly.
605*b1cdbd2cSJim Jagielski     const StyleSettings& rSettings = Application::GetSettings().GetStyleSettings();
606*b1cdbd2cSJim Jagielski 	bool  bShowMenuImages( rSettings.GetUseImagesInMenus() );
607*b1cdbd2cSJim Jagielski 	bool  bIsHiContrast( rSettings.GetHighContrastMode() );
608*b1cdbd2cSJim Jagielski 
609*b1cdbd2cSJim Jagielski     if ( pMenu )
610*b1cdbd2cSJim Jagielski     {
611*b1cdbd2cSJim Jagielski         uno::Reference< frame::XFrame > xFrame( m_xWeakFrame );
612*b1cdbd2cSJim Jagielski         uno::Reference< frame::XDispatchProvider > xDispatchProvider( xFrame, uno::UNO_QUERY );
613*b1cdbd2cSJim Jagielski 
614*b1cdbd2cSJim Jagielski         if ( !m_xURLTransformer.is() )
615*b1cdbd2cSJim Jagielski         {
616*b1cdbd2cSJim Jagielski             m_xURLTransformer = uno::Reference< util::XURLTransformer >(
617*b1cdbd2cSJim Jagielski                 ::comphelper::getProcessServiceFactory()->createInstance(
618*b1cdbd2cSJim Jagielski                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
619*b1cdbd2cSJim Jagielski                         "com.sun.star.util.URLTransformer" ))),
620*b1cdbd2cSJim Jagielski                 uno::UNO_QUERY );
621*b1cdbd2cSJim Jagielski         }
622*b1cdbd2cSJim Jagielski 
623*b1cdbd2cSJim Jagielski         for ( sal_uInt16 nPos = 0; nPos < pMenu->GetItemCount(); nPos++ )
624*b1cdbd2cSJim Jagielski 	    {
625*b1cdbd2cSJim Jagielski 		    sal_uInt16 nId        = pMenu->GetItemId( nPos );
626*b1cdbd2cSJim Jagielski 		    PopupMenu* pPopupMenu = pMenu->GetPopupMenu( nId );
627*b1cdbd2cSJim Jagielski             if ( pPopupMenu )
628*b1cdbd2cSJim Jagielski                 completeMenuProperties( pPopupMenu );
629*b1cdbd2cSJim Jagielski             if ( pMenu->GetItemType( nPos ) != MENUITEM_SEPARATOR )
630*b1cdbd2cSJim Jagielski 		    {
631*b1cdbd2cSJim Jagielski                 ::rtl::OUString aCmdURL( pMenu->GetItemCommand( nId ));
632*b1cdbd2cSJim Jagielski 
633*b1cdbd2cSJim Jagielski                 if ( bShowMenuImages )
634*b1cdbd2cSJim Jagielski 			    {
635*b1cdbd2cSJim Jagielski 				    Image aImage;
636*b1cdbd2cSJim Jagielski                     if ( aCmdURL.getLength() > 0 )
637*b1cdbd2cSJim Jagielski 					    aImage = getImageFromCommandURL( aCmdURL, bIsHiContrast );
638*b1cdbd2cSJim Jagielski                     pMenu->SetItemImage( nId, aImage );
639*b1cdbd2cSJim Jagielski 			    }
640*b1cdbd2cSJim Jagielski 			    else
641*b1cdbd2cSJim Jagielski 				    pMenu->SetItemImage( nId, Image() );
642*b1cdbd2cSJim Jagielski 
643*b1cdbd2cSJim Jagielski                 if ( pMenu->GetItemText( nId ).Len() == 0 )
644*b1cdbd2cSJim Jagielski                 {
645*b1cdbd2cSJim Jagielski                     ::rtl::OUString aLabel( getLabelFromCommandURL( aCmdURL ));
646*b1cdbd2cSJim Jagielski                     pMenu->SetItemText( nId, aLabel );
647*b1cdbd2cSJim Jagielski                 }
648*b1cdbd2cSJim Jagielski 
649*b1cdbd2cSJim Jagielski                 // Use helper to retrieve state of the command URL
650*b1cdbd2cSJim Jagielski 				StateEventHelper* pHelper = new StateEventHelper(
651*b1cdbd2cSJim Jagielski 													xDispatchProvider,
652*b1cdbd2cSJim Jagielski 													m_xURLTransformer,
653*b1cdbd2cSJim Jagielski 													aCmdURL );
654*b1cdbd2cSJim Jagielski 
655*b1cdbd2cSJim Jagielski 				uno::Reference< frame::XStatusListener > xHelper( pHelper );
656*b1cdbd2cSJim Jagielski                 pMenu->EnableItem( nId, pHelper->isCommandEnabled() );
657*b1cdbd2cSJim Jagielski 		    }
658*b1cdbd2cSJim Jagielski 	    }
659*b1cdbd2cSJim Jagielski     }
660*b1cdbd2cSJim Jagielski }
661*b1cdbd2cSJim Jagielski 
662*b1cdbd2cSJim Jagielski 
IMPL_STATIC_LINK_NOINSTANCE(ContextMenuHelper,ExecuteHdl_Impl,ExecuteInfo *,pExecuteInfo)663*b1cdbd2cSJim Jagielski IMPL_STATIC_LINK_NOINSTANCE( ContextMenuHelper, ExecuteHdl_Impl, ExecuteInfo*, pExecuteInfo )
664*b1cdbd2cSJim Jagielski {
665*b1cdbd2cSJim Jagielski     // Release solar mutex to prevent deadlocks with clipboard thread
666*b1cdbd2cSJim Jagielski     const sal_uInt32 nRef = Application::ReleaseSolarMutex();
667*b1cdbd2cSJim Jagielski     try
668*b1cdbd2cSJim Jagielski     {
669*b1cdbd2cSJim Jagielski         // Asynchronous execution as this can lead to our own destruction while we are
670*b1cdbd2cSJim Jagielski         // on the stack. Stack unwinding would access the destroyed context menu.
671*b1cdbd2cSJim Jagielski         pExecuteInfo->xDispatch->dispatch( pExecuteInfo->aTargetURL, pExecuteInfo->aArgs );
672*b1cdbd2cSJim Jagielski     }
673*b1cdbd2cSJim Jagielski     catch ( uno::Exception& )
674*b1cdbd2cSJim Jagielski     {
675*b1cdbd2cSJim Jagielski     }
676*b1cdbd2cSJim Jagielski 
677*b1cdbd2cSJim Jagielski     // Acquire solar mutex again
678*b1cdbd2cSJim Jagielski     Application::AcquireSolarMutex( nRef );
679*b1cdbd2cSJim Jagielski     delete pExecuteInfo;
680*b1cdbd2cSJim Jagielski     return 0;
681*b1cdbd2cSJim Jagielski }
682*b1cdbd2cSJim Jagielski 
683*b1cdbd2cSJim Jagielski } // namespace svt
684