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 _DBA_COREDATAACCESS_DOCUMENTDEFINITION_HXX_ 29 #define _DBA_COREDATAACCESS_DOCUMENTDEFINITION_HXX_ 30 31 #ifndef _CPPUHELPER_PROPSHLP_HXX 32 #include <cppuhelper/propshlp.hxx> 33 #endif 34 #ifndef _CPPUHELPER_IMPLBASE4_HXX_ 35 #include <cppuhelper/implbase4.hxx> 36 #endif 37 #ifndef DBA_CONTENTHELPER_HXX 38 #include "ContentHelper.hxx" 39 #endif 40 #ifndef COMPHELPER_PROPERTYSTATECONTAINER_HXX 41 #include <comphelper/propertystatecontainer.hxx> 42 #endif 43 #ifndef _COMPHELPER_PROPERTY_ARRAY_HELPER_HXX_ 44 #include <comphelper/proparrhlp.hxx> 45 #endif 46 #ifndef _DBASHARED_APITOOLS_HXX_ 47 #include "apitools.hxx" 48 #endif 49 #ifndef _COMPHELPER_UNO3_HXX_ 50 #include <comphelper/uno3.hxx> 51 #endif 52 #ifndef _COM_SUN_STAR_SDBC_XCONNECTION_HPP_ 53 #include <com/sun/star/sdbc/XConnection.hpp> 54 #endif 55 #ifndef _COM_SUN_STAR_FRAME_XCOMPONENTLOADER_HPP_ 56 #include <com/sun/star/frame/XComponentLoader.hpp> 57 #endif 58 #ifndef _COM_SUN_STAR_FRAME_XCONTROLLER_HPP_ 59 #include <com/sun/star/frame/XController.hpp> 60 #endif 61 #ifndef _COM_SUN_STAR_EMBED_XSTATECHANGELISTENER_HPP_ 62 #include <com/sun/star/embed/XStateChangeListener.hpp> 63 #endif 64 #include <com/sun/star/sdb/XSubDocument.hpp> 65 #include <com/sun/star/util/XCloseListener.hpp> 66 #include <com/sun/star/container/XHierarchicalName.hpp> 67 68 namespace comphelper 69 { 70 class NamedValueCollection; 71 } 72 73 //........................................................................ 74 namespace dbaccess 75 { 76 //........................................................................ 77 78 class OInterceptor; 79 class OEmbeddedClientHelper; 80 //========================================================================== 81 //= ODocumentDefinition - a database "document" which is simply a link to a real 82 //= document 83 //========================================================================== 84 85 typedef ::cppu::ImplHelper4 < ::com::sun::star::embed::XComponentSupplier 86 , ::com::sun::star::sdb::XSubDocument 87 , ::com::sun::star::util::XCloseListener 88 , ::com::sun::star::container::XHierarchicalName 89 > ODocumentDefinition_Base; 90 91 class ODocumentDefinition 92 :public OContentHelper 93 ,public ::comphelper::OPropertyStateContainer 94 ,public ::comphelper::OPropertyArrayUsageHelper< ODocumentDefinition > 95 ,public ODocumentDefinition_Base 96 { 97 ::com::sun::star::uno::Reference< ::com::sun::star::embed::XEmbeddedObject> m_xEmbeddedObject; 98 ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStateChangeListener > m_xListener; 99 ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > m_xLastKnownConnection; 100 101 OInterceptor* m_pInterceptor; 102 sal_Bool m_bForm; // <TRUE/> if it is a form 103 sal_Bool m_bOpenInDesign; 104 sal_Bool m_bInExecute; 105 sal_Bool m_bRemoveListener; 106 OEmbeddedClientHelper* m_pClientHelper; 107 108 protected: 109 virtual ~ODocumentDefinition(); 110 111 public: 112 113 ODocumentDefinition( 114 const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxContainer, 115 const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >&, 116 const TContentPtr& _pImpl, 117 sal_Bool _bForm 118 ); 119 120 void initialLoad( 121 const ::com::sun::star::uno::Sequence< sal_Int8 >& i_rClassID, 122 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& i_rCreationArgs, 123 const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& i_rConnection 124 ); 125 126 // com::sun::star::lang::XTypeProvider 127 DECLARE_TYPEPROVIDER( ); 128 129 // ::com::sun::star::uno::XInterface 130 DECLARE_XINTERFACE( ) 131 132 // ::com::sun::star::lang::XServiceInfo 133 DECLARE_SERVICE_INFO_STATIC(); 134 135 // ::com::sun::star::beans::XPropertySet 136 virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException); 137 138 // OPropertySetHelper 139 virtual void SAL_CALL getFastPropertyValue( 140 ::com::sun::star::uno::Any& o_rValue, 141 sal_Int32 i_nHandle 142 ) const; 143 144 // XComponentSupplier 145 virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseable > SAL_CALL getComponent( ) throw (::com::sun::star::uno::RuntimeException); 146 147 // XSubDocument 148 virtual ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > SAL_CALL open( ) throw (::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); 149 virtual ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > SAL_CALL openDesign( ) throw (::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); 150 virtual void SAL_CALL store( ) throw (::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); 151 virtual ::sal_Bool SAL_CALL close( ) throw (::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); 152 153 // XHierarchicalName 154 virtual ::rtl::OUString SAL_CALL getHierarchicalName( ) throw (::com::sun::star::uno::RuntimeException); 155 virtual ::rtl::OUString SAL_CALL composeHierarchicalName( const ::rtl::OUString& aRelativeName ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException); 156 157 // OPropertySetHelper 158 virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper(); 159 160 // XCommandProcessor 161 virtual ::com::sun::star::uno::Any SAL_CALL execute( const ::com::sun::star::ucb::Command& aCommand, sal_Int32 CommandId, const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XCommandEnvironment >& Environment ) throw (::com::sun::star::uno::Exception, ::com::sun::star::ucb::CommandAbortedException, ::com::sun::star::uno::RuntimeException) ; 162 163 // XRename 164 virtual void SAL_CALL rename( const ::rtl::OUString& newName ) throw (::com::sun::star::sdbc::SQLException, ::com::sun::star::container::ElementExistException, ::com::sun::star::uno::RuntimeException); 165 166 // XCloseListener 167 virtual void SAL_CALL queryClosing( const ::com::sun::star::lang::EventObject& Source, ::sal_Bool GetsOwnership ) throw (::com::sun::star::util::CloseVetoException, ::com::sun::star::uno::RuntimeException); 168 virtual void SAL_CALL notifyClosing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException); 169 170 // XEventListener 171 virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException); 172 173 /** returns the forms/reports container storage, depending on m_bForm. Our own storage 174 inside this container storage is the one with the name as indicated by m_pImpl->m_aProps.sPersistentName. 175 */ 176 ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > 177 getContainerStorage() const; 178 179 sal_Bool save(sal_Bool _bApprove); 180 sal_Bool saveAs(); 181 void closeObject(); 182 sal_Bool isModified(); 183 inline sal_Bool isNewReport() const { return !m_bForm && !m_pImpl->m_aProps.bAsTemplate; } 184 185 static void fillReportData( 186 const ::comphelper::ComponentContext& _rContext, 187 const ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseable >& _rxComponent, 188 const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxActiveConnection 189 ); 190 191 const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& 192 getConnection() const { return m_xLastKnownConnection; } 193 194 /** prepares closing the document component 195 196 The method suspends the controller associated with the document, and saves the document 197 if necessary. 198 199 @return 200 <TRUE/> if and only if the document component can be closed 201 */ 202 bool prepareClose(); 203 204 static ::com::sun::star::uno::Sequence< sal_Int8 > getDefaultDocumentTypeClassId(); 205 206 static ::rtl::OUString GetDocumentServiceFromMediaType( 207 const ::rtl::OUString& _rMediaType, 208 const ::comphelper::ComponentContext& _rContext, 209 ::com::sun::star::uno::Sequence< sal_Int8 >& _rClassId 210 ); 211 static ::rtl::OUString GetDocumentServiceFromMediaType( 212 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxContainerStorage, 213 const ::rtl::OUString& _rEntityName, 214 const ::comphelper::ComponentContext& _rContext, 215 ::com::sun::star::uno::Sequence< sal_Int8 >& _rClassId 216 ); 217 218 struct NotifierAccess { friend class NameChangeNotifier; private: NotifierAccess() { } }; 219 const ::rtl::OUString& getCurrentName() const { return m_pImpl->m_aProps.aTitle; } 220 void firePropertyChange( 221 sal_Int32 i_nHandle, 222 const ::com::sun::star::uno::Any& i_rNewValue, 223 const ::com::sun::star::uno::Any& i_rOldValue, 224 sal_Bool i_bVetoable, 225 const NotifierAccess 226 ); 227 228 private: 229 /** does necessary initializations after our embedded object has been switched to ACTIVE 230 */ 231 void impl_onActivateEmbeddedObject_nothrow( const bool i_bReactivated ); 232 233 /** initializes a newly created view/controller of a form which is displaying our embedded object 234 235 Has only to be called if the respective embedded object has been loaded for design (and 236 not for data entry) 237 238 @param _rxController 239 the controller which belongs to the XModel of our (active) embedded object 240 */ 241 static void impl_initFormEditView( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController >& _rxController ); 242 243 /** removes the given frame from the desktop's frame collection 244 @raises ::com::sun::star::uno::RuntimeException 245 */ 246 static void impl_removeFrameFromDesktop_throw( 247 const ::comphelper::ComponentContext& _rContxt, 248 const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& _rxFrame 249 ); 250 251 /** opens the UI for this sub document 252 */ 253 ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > 254 impl_openUI_nolck_throw( bool _bForEditing ); 255 256 /** stores our document, if it's already loaded 257 */ 258 void impl_store_throw(); 259 260 /** closes our document, if it's open 261 */ 262 bool impl_close_throw(); 263 264 /** returns our component, creates it if necessary 265 */ 266 ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseable > 267 impl_getComponent_throw( const bool i_ForceCreate = true ); 268 269 /** shows or hides our component 270 271 The embedded object must exist, and be in state LOADED, at least. 272 */ 273 void impl_showOrHideComponent_throw( const bool i_bShow ); 274 275 // OPropertyArrayUsageHelper 276 virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const; 277 278 virtual void getPropertyDefaultByHandle( sal_Int32 _nHandle, ::com::sun::star::uno::Any& _rDefault ) const; 279 280 // helper 281 virtual void SAL_CALL disposing(); 282 283 // OContentHelper overridables 284 virtual ::rtl::OUString determineContentType() const; 285 286 /** fills the load arguments 287 */ 288 ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > 289 fillLoadArgs( 290 const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _xConnection, 291 const bool _bSuppressMacros, 292 const bool _bReadOnly, 293 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& i_rOpenCommandArguments, 294 ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& _out_rEmbeddedObjectDescriptor 295 ); 296 297 /** splits the given arguments to an "open*" command into arguments for loading the document, and arguments to be 298 put into the EmbeddedObjectDescriptor 299 300 Any values already present in <code>o_rDocumentLoadArgs</code> and <code>o_rEmbeddedObjectDescriptor</code> 301 will be overwritten by values from <code>i_rOpenCommandArguments</code>, if applicable, otherwise they will 302 be preserved. 303 304 @param i_rOpenCommandArguments 305 the arguments passed to the "open*" command at the content 306 @param o_rDocumentLoadArgs 307 the arguments to be passed when actually loading the embedded document. 308 @param o_rEmbeddedObjectDescriptor 309 the EmbeddedObjectDescriptor to be passed when initializing the embedded object 310 */ 311 void separateOpenCommandArguments( 312 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& i_rOpenCommandArguments, 313 ::comphelper::NamedValueCollection& o_rDocumentLoadArgs, 314 ::comphelper::NamedValueCollection& o_rEmbeddedObjectDescriptor 315 ); 316 317 /** loads the EmbeddedObject if not already loaded 318 @param _aClassID 319 If set, it will be used to create the embedded object. 320 */ 321 void loadEmbeddedObject( 322 const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _xConnection, 323 const ::com::sun::star::uno::Sequence< sal_Int8 >& _aClassID, 324 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& _rAdditionalArgs, 325 const bool _bSuppressMacros, 326 const bool _bReadOnly 327 ); 328 329 /** loads the embedded object, if not already loaded. No new object can be created with this method. 330 */ 331 void loadEmbeddedObject( bool _bSuppressMacros = false ) 332 { 333 loadEmbeddedObject( 334 NULL, 335 ::com::sun::star::uno::Sequence< sal_Int8 >(), 336 ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >(), 337 _bSuppressMacros, 338 false 339 ); 340 } 341 342 /** loads the embedded object for preview. Macros will be suppressed, and the document will 343 be read-only. 344 */ 345 void loadEmbeddedObjectForPreview() 346 { 347 loadEmbeddedObject( 348 NULL, 349 ::com::sun::star::uno::Sequence< sal_Int8 >(), 350 ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >(), 351 true, 352 true 353 ); 354 } 355 356 /** searches for read-only flag in the args of the model and sets it to the given value, 357 if the value was not found, it will be appended. 358 @param _bReadOnly 359 If <TRUE/> the document will be switched to readonly mode 360 */ 361 void updateDocumentTitle(); 362 363 void registerProperties(); 364 365 /** determines whether the document we represent supports embedded scripts and macros 366 */ 367 sal_Bool objectSupportsEmbeddedScripts() const; 368 369 //------------------------------------------------------------------------- 370 //- commands 371 //------------------------------------------------------------------------- 372 373 void onCommandGetDocumentProperties( ::com::sun::star::uno::Any& _rProps ); 374 void onCommandInsert( const ::rtl::OUString& _sURL, const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XCommandEnvironment >& Environment ) throw( ::com::sun::star::uno::Exception ); 375 void onCommandPreview( ::com::sun::star::uno::Any& _rImage ); 376 ::com::sun::star::uno::Any 377 onCommandOpenSomething( 378 const ::com::sun::star::uno::Any& _rArgument, 379 const bool _bActivate, 380 const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XCommandEnvironment >& _rxEnvironment 381 ); 382 private: 383 using ::cppu::OPropertySetHelper::getFastPropertyValue; 384 }; 385 386 class NameChangeNotifier 387 { 388 public: 389 NameChangeNotifier( 390 ODocumentDefinition& i_rDocumentDefinition, 391 const ::rtl::OUString& i_rNewName, 392 ::osl::ResettableMutexGuard& i_rClearForNotify 393 ); 394 ~NameChangeNotifier(); 395 396 private: 397 ODocumentDefinition& m_rDocumentDefinition; 398 const ::com::sun::star::uno::Any m_aOldValue; 399 const ::com::sun::star::uno::Any m_aNewValue; 400 mutable ::osl::ResettableMutexGuard& m_rClearForNotify; 401 402 void impl_fireEvent_throw( const sal_Bool i_bVetoable ); 403 }; 404 405 //........................................................................ 406 } // namespace dbaccess 407 //........................................................................ 408 409 #endif // _DBA_COREDATAACCESS_DOCUMENTDEFINITION_HXX_ 410 411