xref: /trunk/main/sd/source/ui/inc/DrawController.hxx (revision 4d7c9de0)
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 #ifndef SD_DRAW_CONTROLLER_HXX
25 #define SD_DRAW_CONTROLLER_HXX
26 
27 #include "ViewShell.hxx"
28 
29 #include <osl/mutex.hxx>
30 #include <cppuhelper/propshlp.hxx>
31 #include <sfx2/sfxbasecontroller.hxx>
32 #include <com/sun/star/view/XSelectionSupplier.hpp>
33 #include <com/sun/star/view/XFormLayerAccess.hpp>
34 #include <com/sun/star/drawing/XDrawSubController.hpp>
35 #include <com/sun/star/drawing/XDrawView.hpp>
36 #include <com/sun/star/drawing/framework/XConfigurationController.hpp>
37 #include <com/sun/star/drawing/framework/XControllerManager.hpp>
38 #include <com/sun/star/drawing/framework/ModuleController.hpp>
39 #include <com/sun/star/lang/XServiceInfo.hpp>
40 #include <com/sun/star/lang/DisposedException.hpp>
41 #include <comphelper/uno3.hxx>
42 #include <cppuhelper/implbase7.hxx>
43 #include <tools/weakbase.hxx>
44 #include <memory>
45 #include <vector>
46 #include <boost/scoped_ptr.hpp>
47 #include <com/sun/star/drawing/XLayer.hpp>
48 
49 class SfxViewShell;
50 class SdXImpressDocument;
51 
52 namespace css = ::com::sun::star;
53 
54 namespace sd {
55 
56 typedef ::cppu::ImplInheritanceHelper7 <
57     SfxBaseController,
58     ::com::sun::star::view::XSelectionSupplier,
59     ::com::sun::star::lang::XServiceInfo,
60     ::com::sun::star::drawing::XDrawView,
61     ::com::sun::star::view::XSelectionChangeListener,
62     ::com::sun::star::view::XFormLayerAccess,
63     ::com::sun::star::drawing::framework::XControllerManager,
64     ::com::sun::star::lang::XUnoTunnel
65     > DrawControllerInterfaceBase;
66 
67 class BroadcastHelperOwner
68 {
69 public:
BroadcastHelperOwner(::osl::Mutex & rMutex)70     BroadcastHelperOwner (::osl::Mutex& rMutex) : maBroadcastHelper(rMutex) {};
71     ::cppu::OBroadcastHelper maBroadcastHelper;
72 };
73 
74 class DrawSubController;
75 class ViewShellBase;
76 class ViewShell;
77 class View;
78 
79 
80 /** The DrawController is the UNO controller for Impress and Draw.  It
81     relies objects that implement the DrawSubController interface for view
82     specific behaviour.  The life time of the DrawController is roughly that
83     of ViewShellBase but note that the DrawController can (in the case of a
84     reload) outlive the ViewShellBase.
85 
86     The implementation of the XControllerManager interface is not yet in its
87     final form.
88 */
89 class DrawController
90     : public DrawControllerInterfaceBase,
91       private BroadcastHelperOwner,
92       public ::cppu::OPropertySetHelper
93 {
94 public:
95     enum PropertyHandle {
96         PROPERTY_WORKAREA = 0,
97         PROPERTY_SUB_CONTROLLER = 1,
98         PROPERTY_CURRENTPAGE = 2,
99         PROPERTY_MASTERPAGEMODE = 3,
100         PROPERTY_LAYERMODE = 4,
101         PROPERTY_ACTIVE_LAYER = 5,
102         PROPERTY_ZOOMTYPE = 6,
103         PROPERTY_ZOOMVALUE = 7,
104         PROPERTY_VIEWOFFSET = 8,
105 		PROPERTY_DRAWVIEWMODE = 9
106 		,PROPERTY_UPDATEACC = 10
107 		,PROPERTY_PAGE_CHANGE = 11
108     };
109 
110     /** Create a new DrawController object for the given ViewShellBase.
111     */
112 	DrawController (ViewShellBase& rBase) throw();
113 
114 	virtual ~DrawController (void) throw();
115 
116     /** Replace the currently used sub controller with the given one.  This
117         new sub controller is used from now on for the view (that is the
118         main view shell to be precise) specific tasks.  Call this method
119         with a suitable sub controller whenever the view shell in the center
120         pane is exchanged.
121         @param pSubController
122             The ViewShell specific sub controller or NULL when (temporarily
123             while switching to another one) there is no ViewShell displayed
124             in the center pane.
125     */
126     void SetSubController (
127         const css::uno::Reference<css::drawing::XDrawSubController>& rxSubController);
128 
129     /** Call this method when the VisArea has changed.
130     */
131     void FireVisAreaChanged (const Rectangle& rVisArea) throw();
132 
133     /** Call this method when the selection has changed.
134     */
135 	void FireSelectionChangeListener (void) throw();
136 
137     /** Call this method when the edit mode has changed.
138     */
139     void FireChangeEditMode (bool bMasterPageMode) throw();
140 
141     /** Call this method when the layer mode has changed.
142     */
143 	void FireChangeLayerMode (bool bLayerMode) throw();
144 
145     /** Call this method when there is a new current page.
146     */
147 	void FireSwitchCurrentPage (SdPage* pCurrentPage) throw();
148 
149     /** Broadcast a sidebar context change that is caused by a view
150         switch.
151     */
152     void BroadcastContextChange (void) const;
153 	void NotifyAccUpdate();
154 	void fireChangeLayer( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XLayer>* pCurrentLayer ) throw();
155 	// change the parameter to int
156 	//void fireSwitchCurrentPage( String pageName) throw();
157 	void fireSwitchCurrentPage( sal_Int32 pageIndex) throw();
158 	::com::sun::star::uno::Reference< ::com::sun::star::drawing::XLayer>* mpCurrentLayer;
159 
160     /** Return a pointer to the ViewShellBase object that the DrawController
161         is connected to.
162         @return
163             The returned pointer is <NULL/> after a call to
164             ReleaseViewShellBase().
165     */
166     ViewShellBase* GetViewShellBase (void);
167 
168     /** This method is typically called from the destructor of ViewShellBase
169         to tell the DrawController that it and its members must not access
170         the ViewShellBase anymore.
171         After this call the DrawController is semi-disposed.
172     */
173     void ReleaseViewShellBase (void);
174 
175     static const ::com::sun::star::uno::Sequence<sal_Int8>& getUnoTunnelId (void);
176 
177     DECLARE_XINTERFACE()
178 	DECLARE_XTYPEPROVIDER()
179 
180 	// XComponent
181 	virtual void SAL_CALL dispose() throw( ::com::sun::star::uno::RuntimeException );
182     virtual void SAL_CALL addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
183     virtual void SAL_CALL removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& aListener ) throw (::com::sun::star::uno::RuntimeException);
184 
185 	// XController
186     virtual ::sal_Bool SAL_CALL suspend( ::sal_Bool Suspend ) throw (::com::sun::star::uno::RuntimeException);
187 
188 	// XServiceInfo
189     virtual ::rtl::OUString SAL_CALL getImplementationName() throw(::com::sun::star::uno::RuntimeException);
190     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw(::com::sun::star::uno::RuntimeException);
191     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException);
192 
193 	// XSelectionSupplier
194     virtual sal_Bool SAL_CALL select( const ::com::sun::star::uno::Any& aSelection ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
195     virtual ::com::sun::star::uno::Any SAL_CALL getSelection(  ) throw(::com::sun::star::uno::RuntimeException);
196     virtual void SAL_CALL addSelectionChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::view::XSelectionChangeListener >& xListener ) throw(::com::sun::star::uno::RuntimeException);
197     virtual void SAL_CALL removeSelectionChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::view::XSelectionChangeListener >& xListener ) throw(::com::sun::star::uno::RuntimeException);
198 
199 	// XPropertySet
200 	virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
201 
202     // XFormLayerAccess
203     virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > SAL_CALL getFormController( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& Form ) throw (::com::sun::star::uno::RuntimeException);
204     virtual ::sal_Bool SAL_CALL isFormDesignMode(  ) throw (::com::sun::star::uno::RuntimeException);
205     virtual void SAL_CALL setFormDesignMode( ::sal_Bool DesignMode ) throw (::com::sun::star::uno::RuntimeException);
206 
207     // XControlAccess
208     virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl > SAL_CALL getControl( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >& xModel ) throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException);
209 
210 	// XDrawView
211     virtual void SAL_CALL
212         setCurrentPage (
213             const ::com::sun::star::uno::Reference<
214             ::com::sun::star::drawing::XDrawPage >& xPage)
215         throw(::com::sun::star::uno::RuntimeException);
216 
217     virtual ::com::sun::star::uno::Reference<
218         ::com::sun::star::drawing::XDrawPage > SAL_CALL
219         getCurrentPage (void)
220         throw(::com::sun::star::uno::RuntimeException);
221 
222 
223     // lang::XEventListener
224     virtual void SAL_CALL
225         disposing (const ::com::sun::star::lang::EventObject& rEventObject)
226         throw (::com::sun::star::uno::RuntimeException);
227 
228 
229     // view::XSelectionChangeListener
230     virtual void  SAL_CALL
231         selectionChanged (const ::com::sun::star::lang::EventObject& rEvent)
232         throw (::com::sun::star::uno::RuntimeException);
233 
234 
235     // XControllerManager
236 
237     virtual css::uno::Reference<css::drawing::framework::XConfigurationController> SAL_CALL
238         getConfigurationController (void)
239         throw (::com::sun::star::uno::RuntimeException);
240 
241     virtual css::uno::Reference<css::drawing::framework::XModuleController> SAL_CALL
242         getModuleController (void)
243         throw (::com::sun::star::uno::RuntimeException);
244 
245 
246     // XUnoTunnel
247 
248     virtual sal_Int64 SAL_CALL getSomething (const com::sun::star::uno::Sequence<sal_Int8>& rId)
249         throw (com::sun::star::uno::RuntimeException);
250 
251 protected:
252 	/** This method must return the name to index table. This table
253 	    contains all property names and types of this object.
254 	 */
255 	virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper();
256 
257     virtual void FillPropertyTable (
258         ::std::vector< ::com::sun::star::beans::Property>& rProperties);
259 
260 	/**
261 	 * The same as getFastProperyValue, but return the value through
262 	 * rValue and nHandle is always valid.
263 	 */
264 	virtual void SAL_CALL getFastPropertyValue(
265 		::com::sun::star::uno::Any& rValue,
266 		sal_Int32 nHandle ) const;
267 
268 	/** Convert the value rValue and return the result in rConvertedValue and the
269         old value in rOldValue.
270         After this call the vetoable listeners are notified.
271 
272         @param rConvertedValue
273             The converted value. Only set if return is true.
274         @param rOldValue
275             The old value. Only set if return is true.
276         @param nHandle
277             The handle of the proberty.
278         @return
279             <TRUE/> if the value is converted successfully.
280         @throws IllegalArgumentException
281 	 */
282 	virtual sal_Bool SAL_CALL convertFastPropertyValue(
283 		::com::sun::star::uno::Any & rConvertedValue,
284 		::com::sun::star::uno::Any & rOldValue,
285 		sal_Int32 nHandle,
286 		const ::com::sun::star::uno::Any& rValue )
287 		throw (::com::sun::star::lang::IllegalArgumentException);
288 
289 	/** The same as setFastProperyValue, but no exception is thrown and nHandle
290         is always valid. You must not broadcast the changes in this method.
291 	 */
292 	virtual void SAL_CALL setFastPropertyValue_NoBroadcast(
293 		sal_Int32 nHandle,
294 		const ::com::sun::star::uno::Any& rValue )
295 		throw (::com::sun::star::uno::Exception);
296 
297     /** When the called object has been disposed already this method throws
298         a Disposed exception and does not return.
299     */
300     void ThrowIfDisposed (void) const
301         throw (::com::sun::star::lang::DisposedException);
302 
303 	using cppu::OPropertySetHelper::disposing;
304 	using cppu::OPropertySetHelper::getFastPropertyValue;
305 
306 private:
307     /** This pointer to the ViewShellBase can be NULL (after a call to
308         ReleaseViewShellBase()).
309     */
310     ViewShellBase* mpBase;
311 
312 	Rectangle maLastVisArea;
313     ::tools::WeakReference<SdrPage> mpCurrentPage;
314 	bool mbMasterPageMode;
315 	bool mbLayerMode;
316 
317     /** This flag indicates whether the called DrawController is being
318         disposed or already has been disposed.
319     */
320     bool mbDisposing;
321 
322     ::std::auto_ptr< ::cppu::IPropertyArrayHelper> mpPropertyArrayHelper;
323 
324     /** The current sub controller.  May be NULL.
325     */
326     css::uno::Reference<css::drawing::XDrawSubController> mxSubController;
327 
328     css::uno::Reference<
329         css::drawing::framework::XConfigurationController> mxConfigurationController;
330     css::uno::Reference<
331         css::drawing::framework::XModuleController> mxModuleController;
332 
333     /** Send an event to all relevant property listeners that a
334         property has changed its value.  The fire() method of the
335         OPropertySetHelper is wrapped by this method to handle
336         exceptions thrown by called listeners.
337     */
338     void FirePropertyChange (
339         sal_Int32 nHandle,
340         const ::com::sun::star::uno::Any& rNewValue,
341         const ::com::sun::star::uno::Any& rOldValue);
342 
343     void ProvideFrameworkControllers (void);
344     void DisposeFrameworkControllers (void);
345 };
346 
347 } // end of namespace sd
348 
349 #endif
350