xref: /trunk/main/framework/inc/dispatch/menudispatcher.hxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef __FRAMEWORK_DISPATCH_MENUDISPATCHER_HXX_
29 #define __FRAMEWORK_DISPATCH_MENUDISPATCHER_HXX_
30 
31 //_________________________________________________________________________________________________________________
32 //  my own includes
33 //_________________________________________________________________________________________________________________
34 
35 #include <classes/taskcreator.hxx>
36 #include <services/frame.hxx>
37 #include <macros/generic.hxx>
38 #include <macros/xinterface.hxx>
39 #include <macros/xtypeprovider.hxx>
40 #include <macros/debug.hxx>
41 #include <threadhelp/threadhelpbase.hxx>
42 #include <classes/menumanager.hxx>
43 #include <general.h>
44 #include <stdtypes.h>
45 
46 //_________________________________________________________________________________________________________________
47 //  interface includes
48 //_________________________________________________________________________________________________________________
49 #include <com/sun/star/lang/XTypeProvider.hpp>
50 #include <com/sun/star/frame/XDispatch.hpp>
51 #include <com/sun/star/util/URL.hpp>
52 #include <com/sun/star/frame/DispatchDescriptor.hpp>
53 #include <com/sun/star/beans/PropertyValue.hpp>
54 #include <com/sun/star/frame/XStatusListener.hpp>
55 #include <com/sun/star/frame/XFrameLoader.hpp>
56 #include <com/sun/star/frame/XLoadEventListener.hpp>
57 #include <com/sun/star/frame/XDesktop.hpp>
58 #include <com/sun/star/frame/FeatureStateEvent.hpp>
59 #include <com/sun/star/frame/XFrameActionListener.hpp>
60 
61 //_________________________________________________________________________________________________________________
62 //  other includes
63 //_________________________________________________________________________________________________________________
64 #include <cppuhelper/weak.hxx>
65 #include <cppuhelper/weakref.hxx>
66 #include <cppuhelper/interfacecontainer.h>
67 
68 //_________________________________________________________________________________________________________________
69 //  namespace
70 //_________________________________________________________________________________________________________________
71 
72 namespace framework{
73 
74 
75 //_________________________________________________________________________________________________________________
76 //  exported const
77 //_________________________________________________________________________________________________________________
78 
79 //_________________________________________________________________________________________________________________
80 //  exported definitions
81 //_________________________________________________________________________________________________________________
82 
83 /*-************************************************************************************************************//**
84     We must save informations about our listener and URL for listening.
85     We implement this as a hashtable for strings.
86 *//*-*************************************************************************************************************/
87 
88 typedef ::cppu::OMultiTypeInterfaceContainerHelperVar<  ::rtl::OUString         ,
89                                                         OUStringHashCode        ,
90                                                         std::equal_to< ::rtl::OUString > > IMPL_ListenerHashContainer;
91 
92 
93 /*-************************************************************************************************************//**
94     @short          helper for desktop only(!) to create new tasks on demand for dispatches
95     @descr          Use this class as member only! Never use it as baseclass.
96                     XInterface will be ambigous and we hold a weakcss::uno::Reference to ouer OWNER - not to ouer SUPERCLASS!
97 
98     @implements     XInterface
99                     XDispatch
100                     XLoadEventListener
101                     XFrameActionListener
102                     XEventListener
103     @base           ThreadHelpBase
104                     OWeakObject
105 
106     @devstatus      ready to use
107 *//*-*************************************************************************************************************/
108 class MenuDispatcher   :   // interfaces
109                                 public css::lang::XTypeProvider         ,
110                                 public css::frame::XDispatch            ,
111                                 public css::frame::XFrameActionListener ,
112                                 // baseclasses
113                                 // Order is neccessary for right initialization!
114                                 public ThreadHelpBase                       ,
115                                 public cppu::OWeakObject
116 {
117     //-------------------------------------------------------------------------------------------------------------
118     //  public methods
119     //-------------------------------------------------------------------------------------------------------------
120 
121     public:
122 
123         //---------------------------------------------------------------------------------------------------------
124         //  constructor / destructor
125         //---------------------------------------------------------------------------------------------------------
126 
127         /*-****************************************************************************************************//**
128             @short      standard ctor
129             @descr      These initialize a new instance of ths class with needed informations for work.
130 
131             @seealso    using at owner
132 
133             @param      "xFactory"  , css::uno::Reference to servicemanager for creation of new services
134             @param      "xOwner"    , css::uno::Reference to our owner, the Desktop!!!
135             @return     -
136 
137             @onerror    -
138         *//*-*****************************************************************************************************/
139 
140         MenuDispatcher(    const   css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory    ,
141                             const   css::uno::Reference< css::frame::XFrame >&              xOwner      );
142 
143         //---------------------------------------------------------------------------------------------------------
144         //  XInterface
145         //---------------------------------------------------------------------------------------------------------
146 
147         FWK_DECLARE_XINTERFACE
148         FWK_DECLARE_XTYPEPROVIDER
149 
150         //---------------------------------------------------------------------------------------------------------
151         //  XDispatch
152         //---------------------------------------------------------------------------------------------------------
153 
154         /*-****************************************************************************************************//**
155             @short      dispatch URL with arguments
156             @descr      Every dispatch create a new task. If load of URL failed task will deleted automaticly!
157 
158             @seealso    -
159 
160             @param      "aURL"          , URL to dispatch.
161             @param      "seqArguments"  , list of optional arguments.
162             @return     -
163 
164             @onerror    -
165         *//*-*****************************************************************************************************/
166 
167         virtual void SAL_CALL dispatch( const   css::util::URL&                                     aURL            ,
168                                         const   css::uno::Sequence< css::beans::PropertyValue >&    seqProperties   ) throw( css::uno::RuntimeException );
169 
170         /*-****************************************************************************************************//**
171             @short      add listener for state events
172             @descr      You can add a listener to get information about status of dispatch: OK or Failed.
173 
174             @seealso    method loadFinished()
175             @seealso    method loadCancelled()
176 
177             @param      "xControl"  , css::uno::Reference to a valid listener for state events.
178             @param      "aURL"      , URL about listener will be informed, if something occured.
179             @return     -
180 
181             @onerror    -
182         *//*-*****************************************************************************************************/
183 
184         virtual void SAL_CALL addStatusListener(    const   css::uno::Reference< css::frame::XStatusListener >& xControl,
185                                                     const   css::util::URL&                                     aURL    ) throw( css::uno::RuntimeException );
186 
187         /*-****************************************************************************************************//**
188             @short      remove listener for state events
189             @descr      You can remove a listener if information of dispatch isn't important for you any longer.
190 
191             @seealso    method loadFinished()
192             @seealso    method loadCancelled()
193 
194             @param      "xControl"  , css::uno::Reference to a valid listener.
195             @param      "aURL"      , URL on which listener has registered.
196             @return     -
197 
198             @onerror    -
199         *//*-*****************************************************************************************************/
200 
201         virtual void SAL_CALL removeStatusListener( const   css::uno::Reference< css::frame::XStatusListener >& xControl,
202                                                     const   css::util::URL&                                     aURL    ) throw( css::uno::RuntimeException );
203 
204 
205         //---------------------------------------------------------------------------------------------------------
206         //   XFrameActionListener
207         //---------------------------------------------------------------------------------------------------------
208 
209         virtual void SAL_CALL frameAction( const css::frame::FrameActionEvent& aEvent ) throw ( css::uno::RuntimeException );
210 
211         //---------------------------------------------------------------------------------------------------------
212         //   XEventListener
213         //---------------------------------------------------------------------------------------------------------
214 
215         /*-****************************************************************************************************//**
216             @short      dispose current instance
217             @descr      If service helper isn't required any longer call this method to release all used ressources.
218 
219             @seealso    -
220 
221             @param      "aEvent", information about source of this event.
222             @return     -
223 
224             @onerror    -
225         *//*-*****************************************************************************************************/
226 
227         void SAL_CALL disposing( const EVENTOBJECT& aEvent ) throw( css::uno::RuntimeException );
228 
229     //-------------------------------------------------------------------------------------------------------------
230     //  protected methods
231     //-------------------------------------------------------------------------------------------------------------
232 
233     protected:
234 
235         /*-****************************************************************************************************//**
236             @short      standard destructor
237             @descr      This method destruct an instance of this class and clear some member.
238                         This method is protected, because its not allowed to use an instance of this class as a member!
239                         You MUST use a pointer.
240 
241             @seealso    -
242 
243             @param      -
244             @return     -
245 
246             @onerror    -
247         *//*-*****************************************************************************************************/
248 
249         virtual ~MenuDispatcher();
250 
251     //-------------------------------------------------------------------------------------------------------------
252     //  private methods
253     //-------------------------------------------------------------------------------------------------------------
254 
255     private:
256 
257         DECL_LINK( Close_Impl, void* );
258 
259         /*-****************************************************************************************************//**
260             @short      -
261             @descr      -
262 
263             @seealso    -
264 
265             @param      -
266             @return     -
267 
268             @onerror    -
269         *//*-*****************************************************************************************************/
270 
271         sal_Bool impl_setMenuBar( MenuBar* pMenuBar, sal_Bool bMenuFromResource = sal_False );
272 
273         /*-****************************************************************************************************//**
274             @short      -
275             @descr      -
276 
277             @seealso    -
278 
279             @param      -
280             @return     -
281 
282             @onerror    -
283         *//*-*****************************************************************************************************/
284 
285         void impl_setAccelerators( Menu* pMenu, const Accelerator& aAccel );
286 
287     //-------------------------------------------------------------------------------------------------------------
288     //  debug methods
289     //  (should be private everyway!)
290     //-------------------------------------------------------------------------------------------------------------
291 
292         /*-****************************************************************************************************//**
293             @short      debug-method to check incoming parameter of some other mehods of this class
294             @descr      The following methods are used to check parameters for other methods
295                         of this class. The return value is used directly for an ASSERT(...).
296 
297             @seealso    ASSERTs in implementation!
298 
299             @param      css::uno::References to checking variables
300             @return     sal_False on invalid parameter<BR>
301                         sal_True  otherway
302 
303             @onerror    -
304         *//*-*****************************************************************************************************/
305 
306     #ifdef ENABLE_ASSERTIONS
307 
308     private:
309 
310         static sal_Bool impldbg_checkParameter_MenuDispatcher      (   const   css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory        ,
311                                                                         const   css::uno::Reference< css::frame::XFrame >&              xOwner          );
312         static sal_Bool impldbg_checkParameter_addStatusListener    (   const   css::uno::Reference< css::frame::XStatusListener >&     xControl        ,
313                                                                         const   css::util::URL&                                         aURL            );
314         static sal_Bool impldbg_checkParameter_removeStatusListener (   const   css::uno::Reference< css::frame::XStatusListener >&     xControl        ,
315                                                                         const   css::util::URL&                                         aURL            );
316     #endif  // #ifdef ENABLE_ASSERTIONS
317 
318     //-------------------------------------------------------------------------------------------------------------
319     //  variables
320     //  (should be private everyway!)
321     //-------------------------------------------------------------------------------------------------------------
322 
323     private:
324 
325         css::uno::WeakReference< css::frame::XFrame >           m_xOwnerWeak        ;   /// css::uno::WeakReference to owner (Don't use a hard css::uno::Reference. Owner can't delete us then!)
326         css::uno::Reference< css::lang::XMultiServiceFactory >  m_xFactory          ;   /// factory shared with our owner to create new services!
327         IMPL_ListenerHashContainer                              m_aListenerContainer;   /// hash table for listener at specified URLs
328         sal_Bool                                                m_bAlreadyDisposed  ;   /// Protection against multiple disposing calls.
329         sal_Bool                                                m_bActivateListener ;   /// dispatcher is listener for frame activation
330         MenuManager*                                            m_pMenuManager      ;   /// menu manager controlling menu dispatches
331 
332 };      //  class MenuDispatcher
333 
334 }       //  namespace framework
335 
336 #endif  //  #ifndef __FRAMEWORK_DISPATCH_MENUDISPATCHER_HXX_
337