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