1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_framework.hxx"
26 
27 #ifndef __FRAMEWORK_UIELEMENT_BUTTONTOOLBARCONTROLLER_HXX
28 #include "uielement/buttontoolbarcontroller.hxx"
29 #endif
30 
31 //_________________________________________________________________________________________________________________
32 //  my own includes
33 //_________________________________________________________________________________________________________________
34 
35 #ifndef __FRAMEWORK_TOOLBAR_HXX_
36 #include "uielement/toolbar.hxx"
37 #endif
38 
39 //_________________________________________________________________________________________________________________
40 //  interface includes
41 //_________________________________________________________________________________________________________________
42 #include <com/sun/star/util/XURLTransformer.hpp>
43 #include <com/sun/star/frame/XDispatchProvider.hpp>
44 #include <com/sun/star/beans/PropertyValue.hpp>
45 #include <com/sun/star/lang/DisposedException.hpp>
46 #include "com/sun/star/util/XMacroExpander.hpp"
47 #include "com/sun/star/uno/XComponentContext.hpp"
48 #include "com/sun/star/beans/XPropertySet.hpp"
49 
50 //_________________________________________________________________________________________________________________
51 //  other includes
52 //_________________________________________________________________________________________________________________
53 
54 #include <rtl/uri.hxx>
55 #include <vos/mutex.hxx>
56 #include <comphelper/processfactory.hxx>
57 #include <unotools/ucbstreamhelper.hxx>
58 #include <tools/urlobj.hxx>
59 #include <vcl/svapp.hxx>
60 #include <vcl/mnemonic.hxx>
61 #include <vcl/window.hxx>
62 #include <vcl/graph.hxx>
63 #include <vcl/bitmap.hxx>
64 #include <svtools/filter.hxx>
65 #include <svtools/miscopt.hxx>
66 #include <dispatch/uieventloghelper.hxx>
67 
68 using namespace ::com::sun::star;
69 using namespace ::com::sun::star::awt;
70 using namespace ::com::sun::star::uno;
71 using namespace ::com::sun::star::beans;
72 using namespace ::com::sun::star::lang;
73 using namespace ::com::sun::star::frame;
74 using namespace ::com::sun::star::util;
75 
76 namespace framework
77 {
78 
ButtonToolbarController(const uno::Reference<lang::XMultiServiceFactory> & rServiceManager,ToolBox * pToolBar,const rtl::OUString & aCommand)79 ButtonToolbarController::ButtonToolbarController(
80     const uno::Reference< lang::XMultiServiceFactory >& rServiceManager,
81     ToolBox*                                            pToolBar,
82     const rtl::OUString&                                aCommand ) :
83     cppu::OWeakObject(),
84     m_bInitialized( sal_False ),
85     m_bDisposed( sal_False ),
86     m_aCommandURL( aCommand ),
87     m_xServiceManager( rServiceManager ),
88     m_pToolbar( pToolBar )
89 {
90 }
91 
~ButtonToolbarController()92 ButtonToolbarController::~ButtonToolbarController()
93 {
94 }
95 
96         // XInterface
queryInterface(const uno::Type & rType)97 uno::Any SAL_CALL ButtonToolbarController::queryInterface( const uno::Type& rType )
98 throw (::com::sun::star::uno::RuntimeException)
99 {
100     Any a = ::cppu::queryInterface(
101                 rType ,
102                 static_cast< frame::XStatusListener* >( this ),
103                 static_cast< frame::XToolbarController* >( this ),
104                 static_cast< lang::XInitialization* >( this ),
105                 static_cast< lang::XComponent* >( this ),
106                 static_cast< util::XUpdatable* >( this ));
107 
108     if ( a.hasValue() )
109         return a;
110 
111     return cppu::OWeakObject::queryInterface( rType );
112 }
113 
acquire()114 void SAL_CALL ButtonToolbarController::acquire() throw ()
115 {
116     cppu::OWeakObject::acquire();
117 }
118 
release()119 void SAL_CALL ButtonToolbarController::release() throw ()
120 {
121     cppu::OWeakObject::release();
122 }
123 
124 // XInitialization
initialize(const::com::sun::star::uno::Sequence<::com::sun::star::uno::Any> & aArguments)125 void SAL_CALL ButtonToolbarController::initialize(
126     const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments )
127 throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException)
128 {
129     const rtl::OUString aFrameName( RTL_CONSTASCII_USTRINGPARAM( "Frame" ));
130     const rtl::OUString aCommandURLName( RTL_CONSTASCII_USTRINGPARAM( "CommandURL" ));
131     const rtl::OUString aServiceManagerName( RTL_CONSTASCII_USTRINGPARAM( "ServiceManager" ));
132 
133     bool bInitialized( true );
134 
135     {
136         vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
137 
138         if ( m_bDisposed )
139             throw DisposedException();
140 
141         bInitialized = m_bInitialized;
142     }
143 
144     if ( !bInitialized )
145     {
146         vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
147         m_bInitialized = sal_True;
148 
149         PropertyValue aPropValue;
150         for ( int i = 0; i < aArguments.getLength(); i++ )
151         {
152             if ( aArguments[i] >>= aPropValue )
153             {
154                 if ( aPropValue.Name.equalsAscii( "Frame" ))
155                     m_xFrame.set(aPropValue.Value,UNO_QUERY);
156                 else if ( aPropValue.Name.equalsAscii( "CommandURL" ))
157                     aPropValue.Value >>= m_aCommandURL;
158                 else if ( aPropValue.Name.equalsAscii( "ServiceManager" ))
159                     m_xServiceManager.set(aPropValue.Value,UNO_QUERY);
160             }
161         }
162     }
163 }
164 
165 // XComponent
dispose()166 void SAL_CALL ButtonToolbarController::dispose() throw (::com::sun::star::uno::RuntimeException)
167 {
168     Reference< XComponent > xThis( static_cast< OWeakObject* >(this), UNO_QUERY );
169 
170     {
171         vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
172         if ( m_bDisposed )
173             throw DisposedException();
174 
175         m_xServiceManager.clear();
176         m_xURLTransformer.clear();
177         m_xFrame.clear();
178         m_pToolbar = 0;
179         m_bDisposed = sal_True;
180     }
181 }
182 
addEventListener(const::com::sun::star::uno::Reference<::com::sun::star::lang::XEventListener> &)183 void SAL_CALL ButtonToolbarController::addEventListener(
184     const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& )
185 throw (::com::sun::star::uno::RuntimeException)
186 {
187     // do nothing
188 }
189 
removeEventListener(const::com::sun::star::uno::Reference<::com::sun::star::lang::XEventListener> &)190 void SAL_CALL ButtonToolbarController::removeEventListener(
191     const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& )
192 throw (::com::sun::star::uno::RuntimeException)
193 {
194     // do nothing
195 }
196 
197 // XUpdatable
update()198 void SAL_CALL ButtonToolbarController::update()
199 throw (::com::sun::star::uno::RuntimeException)
200 {
201     vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
202     if ( m_bDisposed )
203         throw DisposedException();
204 }
205 
206 // XEventListener
disposing(const com::sun::star::lang::EventObject & Source)207 void SAL_CALL ButtonToolbarController::disposing(
208     const com::sun::star::lang::EventObject& Source )
209 throw ( ::com::sun::star::uno::RuntimeException )
210 {
211     uno::Reference< uno::XInterface > xSource( Source.Source );
212 
213     vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
214 
215     if ( m_bDisposed )
216         return;
217 
218     uno::Reference< uno::XInterface > xIfac( m_xFrame, uno::UNO_QUERY );
219     if ( xIfac == xSource )
220         m_xFrame.clear();
221 }
222 
statusChanged(const::com::sun::star::frame::FeatureStateEvent &)223 void SAL_CALL ButtonToolbarController::statusChanged( const ::com::sun::star::frame::FeatureStateEvent& )
224 throw ( ::com::sun::star::uno::RuntimeException )
225 {
226     // do nothing
227     if ( m_bDisposed )
228         throw DisposedException();
229 }
230 
231 // XToolbarController
execute(sal_Int16 KeyModifier)232 void SAL_CALL ButtonToolbarController::execute( sal_Int16 KeyModifier )
233 throw (::com::sun::star::uno::RuntimeException)
234 {
235     uno::Reference< frame::XDispatch >      xDispatch;
236     uno::Reference< frame::XFrame >         xFrame;
237     uno::Reference< util::XURLTransformer > xURLTransformer;
238     rtl::OUString                           aCommandURL;
239     ::com::sun::star::util::URL             aTargetURL;
240 
241     {
242         vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
243 
244         if ( m_bDisposed )
245             throw DisposedException();
246 
247         if ( m_bInitialized &&
248              m_xFrame.is() &&
249              m_xServiceManager.is() &&
250              m_aCommandURL.getLength() )
251         {
252             if ( !m_xURLTransformer.is() )
253             {
254                 m_xURLTransformer = uno::Reference< util::XURLTransformer >(
255                     m_xServiceManager->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.util.URLTransformer" ))),
256                     uno::UNO_QUERY_THROW );
257             }
258 
259             xFrame          = m_xFrame;
260             aCommandURL     = m_aCommandURL;
261             xURLTransformer = m_xURLTransformer;
262         }
263     }
264 
265     uno::Reference< frame::XDispatchProvider > xDispatchProvider( xFrame, uno::UNO_QUERY );
266     if ( xDispatchProvider.is() )
267     {
268         aTargetURL.Complete = aCommandURL;
269         xURLTransformer->parseStrict( aTargetURL );
270         xDispatch = xDispatchProvider->queryDispatch( aTargetURL, ::rtl::OUString(), 0 );
271     }
272 
273     if ( xDispatch.is() )
274     {
275         try
276         {
277             Sequence<PropertyValue>   aArgs( 1 );
278 
279             // Provide key modifier information to dispatch function
280             aArgs[0].Name   = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "KeyModifier" ));
281             aArgs[0].Value  <<= KeyModifier;
282 
283             if(::comphelper::UiEventsLogger::isEnabled()) //#i88653#
284                 UiEventLogHelper(::rtl::OUString::createFromAscii("ButtonToolbarController")).log(m_xServiceManager, m_xFrame, aTargetURL, aArgs);
285             xDispatch->dispatch( aTargetURL, aArgs );
286         }
287         catch ( DisposedException& )
288         {
289         }
290     }
291 }
292 
click()293 void SAL_CALL ButtonToolbarController::click()
294 throw (::com::sun::star::uno::RuntimeException)
295 {
296     vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
297 
298     if ( m_bDisposed )
299         throw DisposedException();
300 
301     sal_Int16   nKeyModifier( (sal_Int16)m_pToolbar->GetModifier() );
302     execute( nKeyModifier );
303 }
304 
doubleClick()305 void SAL_CALL ButtonToolbarController::doubleClick()
306 throw (::com::sun::star::uno::RuntimeException)
307 {
308     // do nothing
309     if ( m_bDisposed )
310         throw DisposedException();
311 }
312 
createPopupWindow()313 uno::Reference< awt::XWindow > SAL_CALL ButtonToolbarController::createPopupWindow()
314 throw (::com::sun::star::uno::RuntimeException)
315 {
316     if ( m_bDisposed )
317         throw DisposedException();
318 
319     return uno::Reference< awt::XWindow >();
320 }
321 
createItemWindow(const::com::sun::star::uno::Reference<::com::sun::star::awt::XWindow> &)322 uno::Reference< awt::XWindow > SAL_CALL ButtonToolbarController::createItemWindow(
323     const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow >& )
324 throw (::com::sun::star::uno::RuntimeException)
325 {
326     if ( m_bDisposed )
327         throw DisposedException();
328 
329     return uno::Reference< awt::XWindow >();
330 }
331 
332 } // namespace
333 
334