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 #ifndef _SVX_FMCTRLER_HXX 28 #define _SVX_FMCTRLER_HXX 29 30 #include "delayedevent.hxx" 31 #include "formdispatchinterceptor.hxx" 32 #include "sqlparserclient.hxx" 33 34 /** === begin UNO includes === **/ 35 #include <com/sun/star/awt/XControl.hpp> 36 #include <com/sun/star/awt/XControlModel.hpp> 37 #include <com/sun/star/awt/XFocusListener.hpp> 38 #include <com/sun/star/awt/XItemListener.hpp> 39 #include <com/sun/star/awt/XMouseListener.hpp> 40 #include <com/sun/star/awt/XTabController.hpp> 41 #include <com/sun/star/awt/XTextComponent.hpp> 42 #include <com/sun/star/container/XContainerListener.hpp> 43 #include <com/sun/star/container/XEnumerationAccess.hpp> 44 #include <com/sun/star/container/XIndexContainer.hpp> 45 #include <com/sun/star/form/DatabaseDeleteEvent.hpp> 46 #include <com/sun/star/form/DatabaseParameterEvent.hpp> 47 #include <com/sun/star/form/ErrorEvent.hpp> 48 #include <com/sun/star/form/validation/XFormComponentValidityListener.hpp> 49 #include <com/sun/star/form/XConfirmDeleteBroadcaster.hpp> 50 #include <com/sun/star/form/XConfirmDeleteListener.hpp> 51 #include <com/sun/star/form/XDatabaseParameterBroadcaster2.hpp> 52 #include <com/sun/star/form/XDatabaseParameterListener.hpp> 53 #include <com/sun/star/form/runtime/XFormController.hpp> 54 #include <com/sun/star/form/runtime/XFilterController.hpp> 55 #include <com/sun/star/form/XFormControllerListener.hpp> 56 #include <com/sun/star/form/XGridControlListener.hpp> 57 #include <com/sun/star/form/XLoadListener.hpp> 58 #include <com/sun/star/form/XResetListener.hpp> 59 #include <com/sun/star/frame/DispatchDescriptor.hpp> 60 #include <com/sun/star/frame/XDispatch.hpp> 61 #include <com/sun/star/frame/XDispatchProvider.hpp> 62 #include <com/sun/star/frame/XDispatchProviderInterception.hpp> 63 #include <com/sun/star/frame/XDispatchProviderInterceptor.hpp> 64 #include <com/sun/star/frame/XModel.hpp> 65 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 66 #include <com/sun/star/lang/XServiceInfo.hpp> 67 #include <com/sun/star/script/XEventAttacherManager.hpp> 68 #include <com/sun/star/sdb/XRowSetApproveBroadcaster.hpp> 69 #include <com/sun/star/sdb/XRowSetApproveListener.hpp> 70 #include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp> 71 #include <com/sun/star/sdb/XSQLErrorBroadcaster.hpp> 72 #include <com/sun/star/sdb/XSQLErrorListener.hpp> 73 #include <com/sun/star/sdbc/XRowSetListener.hpp> 74 #include <com/sun/star/task/XInteractionHandler.hpp> 75 #include <com/sun/star/util/XModeSelector.hpp> 76 #include <com/sun/star/util/XModifyBroadcaster.hpp> 77 #include <com/sun/star/util/XModifyListener.hpp> 78 /** === end UNO includes === **/ 79 80 #include <comphelper/broadcasthelper.hxx> 81 #include <comphelper/componentcontext.hxx> 82 #include <comphelper/proparrhlp.hxx> 83 #include <comphelper/stl_types.hxx> 84 #include <connectivity/sqlparse.hxx> 85 #include <cppuhelper/propshlp.hxx> 86 #include <tools/debug.hxx> 87 #include <vcl/timer.hxx> 88 89 #if ! defined(INCLUDED_COMPHELPER_IMPLBASE_VAR_HXX_22) 90 #define INCLUDED_COMPHELPER_IMPLBASE_VAR_HXX_22 91 #define COMPHELPER_IMPLBASE_INTERFACE_NUMBER 22 92 #include <comphelper/implbase_var.hxx> 93 #endif 94 95 struct FmXTextComponentLess : public ::std::binary_function< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent >, ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent> , sal_Bool> 96 { 97 sal_Bool operator() (const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent >& x, const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent >& y) const 98 { 99 return reinterpret_cast<sal_Int64>(x.get()) < reinterpret_cast<sal_Int64>(y.get()); 100 } 101 }; 102 103 typedef ::std::map< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent >, ::rtl::OUString, FmXTextComponentLess> FmFilterRow; 104 typedef ::std::vector< FmFilterRow > FmFilterRows; 105 typedef ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > > FmFormControllers; 106 107 class FmFormView; 108 class Window; 109 110 namespace svxform 111 { 112 typedef ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent > > FilterComponents; 113 class ControlBorderManager; 114 struct FmFieldInfo; 115 116 typedef ::comphelper::WeakComponentImplHelper22 < ::com::sun::star::form::runtime::XFormController 117 , ::com::sun::star::form::runtime::XFilterController 118 , ::com::sun::star::awt::XFocusListener 119 , ::com::sun::star::form::XLoadListener 120 , ::com::sun::star::beans::XPropertyChangeListener 121 , ::com::sun::star::awt::XTextListener 122 , ::com::sun::star::awt::XItemListener 123 , ::com::sun::star::container::XContainerListener 124 , ::com::sun::star::util::XModifyListener 125 , ::com::sun::star::form::XConfirmDeleteListener 126 , ::com::sun::star::sdb::XSQLErrorListener 127 , ::com::sun::star::sdbc::XRowSetListener 128 , ::com::sun::star::sdb::XRowSetApproveListener 129 , ::com::sun::star::form::XDatabaseParameterListener 130 , ::com::sun::star::lang::XServiceInfo 131 , ::com::sun::star::form::XResetListener 132 , ::com::sun::star::frame::XDispatch 133 , ::com::sun::star::awt::XMouseListener 134 , ::com::sun::star::form::validation::XFormComponentValidityListener 135 , ::com::sun::star::task::XInteractionHandler 136 , ::com::sun::star::form::XGridControlListener 137 , ::com::sun::star::form::runtime::XFeatureInvalidation 138 > FormController_BASE; 139 140 //================================================================== 141 // FormController 142 //================================================================== 143 class ColumnInfoCache; 144 class SAL_DLLPRIVATE FormController :public ::comphelper::OBaseMutex 145 ,public FormController_BASE 146 ,public ::cppu::OPropertySetHelper 147 ,public DispatchInterceptor 148 ,public ::comphelper::OAggregationArrayUsageHelper< FormController > 149 ,public ::svxform::OSQLParserClient 150 { 151 typedef ::std::map < sal_Int16, 152 ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch > 153 > DispatcherContainer; 154 155 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XAggregation> m_xAggregate; 156 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTabController> m_xTabController; 157 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl> m_xActiveControl, m_xCurrentControl; 158 ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess> m_xModelAsIndex; 159 ::com::sun::star::uno::Reference< ::com::sun::star::script::XEventAttacherManager> m_xModelAsManager; 160 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface> m_xParent; 161 ::comphelper::ComponentContext m_aContext; 162 // Composer used for checking filter conditions 163 ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSingleSelectQueryComposer > m_xComposer; 164 ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler > m_xInteractionHandler; 165 ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormControllerContext > m_xContext; 166 167 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl> > m_aControls; 168 ::cppu::OInterfaceContainerHelper 169 m_aActivateListeners, 170 m_aModifyListeners, 171 m_aErrorListeners, 172 m_aDeleteListeners, 173 m_aRowSetApproveListeners, 174 m_aParameterListeners, 175 m_aFilterListeners; 176 177 FmFormControllers m_aChilds; 178 FilterComponents m_aFilterComponents; 179 FmFilterRows m_aFilterRows; 180 181 Timer m_aTabActivationTimer; 182 Timer m_aFeatureInvalidationTimer; 183 184 ::svxform::ControlBorderManager* 185 m_pControlBorderManager; 186 187 ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormOperations > 188 m_xFormOperations; 189 DispatcherContainer m_aFeatureDispatchers; 190 ::std::set< sal_Int16 > m_aInvalidFeatures; // for asynchronous feature invalidation 191 192 ::rtl::OUString m_aMode; 193 194 ::svxform::DelayedEvent m_aLoadEvent; 195 ::svxform::DelayedEvent m_aToggleEvent; 196 ::svxform::DelayedEvent m_aActivationEvent; 197 ::svxform::DelayedEvent m_aDeactivationEvent; 198 199 ::std::auto_ptr< ColumnInfoCache > 200 m_pColumnInfoCache; 201 202 sal_Int32 m_nCurrentFilterPosition; // current level for filtering (or-criteria) 203 204 sal_Bool m_bCurrentRecordModified : 1; 205 sal_Bool m_bCurrentRecordNew : 1; 206 sal_Bool m_bLocked : 1; 207 sal_Bool m_bDBConnection : 1; // Focuslistener nur fuer Datenbankformulare 208 sal_Bool m_bCycle : 1; 209 sal_Bool m_bCanInsert : 1; 210 sal_Bool m_bCanUpdate : 1; 211 sal_Bool m_bCommitLock : 1; // lock the committing of controls see focusGained 212 sal_Bool m_bModified : 1; // ist der Inhalt eines Controls modifiziert ? 213 sal_Bool m_bControlsSorted : 1; 214 sal_Bool m_bFiltering : 1; 215 sal_Bool m_bAttachEvents : 1; 216 sal_Bool m_bDetachEvents : 1; 217 bool m_bAttemptedHandlerCreation : 1; 218 bool m_bSuspendFilterTextListening; // no bit field, passed around as reference 219 220 // as we want to intercept dispatches of _all_ controls we're responsible for, and an object implementing 221 // the ::com::sun::star::frame::XDispatchProviderInterceptor interface can intercept only _one_ objects dispatches, we need a helper class 222 DECLARE_STL_VECTOR(DispatchInterceptionMultiplexer*, Interceptors); 223 Interceptors m_aControlDispatchInterceptors; 224 225 public: 226 FormController( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & _rxORB ); 227 228 protected: 229 ~FormController(); 230 231 // XInterface 232 virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& type) throw ( ::com::sun::star::uno::RuntimeException ); 233 virtual void SAL_CALL acquire() throw (); 234 virtual void SAL_CALL release() throw (); 235 236 // XTypeProvider 237 virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() throw(::com::sun::star::uno::RuntimeException); 238 virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw(::com::sun::star::uno::RuntimeException); 239 240 // XDispatch 241 virtual void SAL_CALL dispatch( const ::com::sun::star::util::URL& _rURL, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& _rArgs ) throw (::com::sun::star::uno::RuntimeException); 242 virtual void SAL_CALL addStatusListener( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XStatusListener >& _rxListener, const ::com::sun::star::util::URL& _rURL ) throw (::com::sun::star::uno::RuntimeException); 243 virtual void SAL_CALL removeStatusListener( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XStatusListener >& _rxListener, const ::com::sun::star::util::URL& _rURL ) throw (::com::sun::star::uno::RuntimeException); 244 245 // ::com::sun::star::container::XChild 246 virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface> SAL_CALL getParent(void) throw( ::com::sun::star::uno::RuntimeException ); 247 virtual void SAL_CALL setParent(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface>& Parent) throw( ::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException ); 248 249 // ::com::sun::star::lang::XEventListener 250 virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw( ::com::sun::star::uno::RuntimeException ); 251 252 // OComponentHelper 253 virtual void SAL_CALL disposing(); 254 255 // OPropertySetHelper 256 virtual sal_Bool SAL_CALL convertFastPropertyValue( ::com::sun::star::uno::Any & rConvertedValue, ::com::sun::star::uno::Any & rOldValue, 257 sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue ) 258 throw( ::com::sun::star::lang::IllegalArgumentException ); 259 260 virtual void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue ) throw( ::com::sun::star::uno::Exception ); 261 virtual void SAL_CALL getFastPropertyValue( ::com::sun::star::uno::Any& rValue, sal_Int32 nHandle ) const; 262 263 virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo> SAL_CALL getPropertySetInfo() throw( ::com::sun::star::uno::RuntimeException ); 264 virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper(); 265 266 using OPropertySetHelper::getFastPropertyValue; 267 268 // XFilterController 269 virtual ::sal_Int32 SAL_CALL getFilterComponents() throw (::com::sun::star::uno::RuntimeException); 270 virtual ::sal_Int32 SAL_CALL getDisjunctiveTerms() throw (::com::sun::star::uno::RuntimeException); 271 virtual void SAL_CALL addFilterControllerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFilterControllerListener >& _Listener ) throw( ::com::sun::star::uno::RuntimeException ); 272 virtual void SAL_CALL removeFilterControllerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFilterControllerListener >& _Listener ) throw( ::com::sun::star::uno::RuntimeException ); 273 virtual void SAL_CALL setPredicateExpression( ::sal_Int32 _Component, ::sal_Int32 _Term, const ::rtl::OUString& _PredicateExpression ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); 274 virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl > SAL_CALL getFilterComponent( ::sal_Int32 _Component ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); 275 virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::rtl::OUString > > SAL_CALL getPredicateExpressions() throw( ::com::sun::star::uno::RuntimeException ); 276 virtual void SAL_CALL removeDisjunctiveTerm( ::sal_Int32 _Term ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); 277 virtual void SAL_CALL appendEmptyDisjunctiveTerm() throw (::com::sun::star::uno::RuntimeException); 278 virtual ::sal_Int32 SAL_CALL getActiveTerm() throw (::com::sun::star::uno::RuntimeException); 279 virtual void SAL_CALL setActiveTerm( ::sal_Int32 _ActiveTerm ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); 280 281 // XElementAccess 282 virtual ::com::sun::star::uno::Type SAL_CALL getElementType(void) throw( ::com::sun::star::uno::RuntimeException ); 283 virtual sal_Bool SAL_CALL hasElements(void) throw( ::com::sun::star::uno::RuntimeException ); 284 285 // ::com::sun::star::container::XEnumerationAccess 286 virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration> SAL_CALL createEnumeration(void) throw( ::com::sun::star::uno::RuntimeException ); 287 288 // ::com::sun::star::container::XContainerListener 289 virtual void SAL_CALL elementInserted(const ::com::sun::star::container::ContainerEvent& rEvent) throw( ::com::sun::star::uno::RuntimeException ); 290 virtual void SAL_CALL elementReplaced(const ::com::sun::star::container::ContainerEvent& rEvent) throw( ::com::sun::star::uno::RuntimeException ); 291 virtual void SAL_CALL elementRemoved(const ::com::sun::star::container::ContainerEvent& rEvent) throw( ::com::sun::star::uno::RuntimeException ); 292 293 // XLoadListener 294 virtual void SAL_CALL loaded(const ::com::sun::star::lang::EventObject& rEvent) throw( ::com::sun::star::uno::RuntimeException ); 295 virtual void SAL_CALL unloaded(const ::com::sun::star::lang::EventObject& rEvent) throw( ::com::sun::star::uno::RuntimeException ); 296 virtual void SAL_CALL unloading(const ::com::sun::star::lang::EventObject& aEvent) throw( ::com::sun::star::uno::RuntimeException ); 297 virtual void SAL_CALL reloading(const ::com::sun::star::lang::EventObject& aEvent) throw( ::com::sun::star::uno::RuntimeException ); 298 virtual void SAL_CALL reloaded(const ::com::sun::star::lang::EventObject& aEvent) throw( ::com::sun::star::uno::RuntimeException ); 299 300 // XModeSelector 301 virtual void SAL_CALL setMode(const ::rtl::OUString& Mode) throw( ::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException ); 302 virtual ::rtl::OUString SAL_CALL getMode(void) throw( ::com::sun::star::uno::RuntimeException ); 303 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedModes(void) throw( ::com::sun::star::uno::RuntimeException ); 304 virtual sal_Bool SAL_CALL supportsMode(const ::rtl::OUString& Mode) throw( ::com::sun::star::uno::RuntimeException ); 305 306 // ::com::sun::star::container::XIndexAccess 307 virtual sal_Int32 SAL_CALL getCount(void) throw( ::com::sun::star::uno::RuntimeException ); 308 virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 Index) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException ); 309 310 // XModifyBroadcaster 311 virtual void SAL_CALL addModifyListener(const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener>& l) throw( ::com::sun::star::uno::RuntimeException ); 312 virtual void SAL_CALL removeModifyListener(const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener>& l) throw( ::com::sun::star::uno::RuntimeException ); 313 314 // XFocusListener 315 virtual void SAL_CALL focusGained(const ::com::sun::star::awt::FocusEvent& e) throw( ::com::sun::star::uno::RuntimeException ); 316 virtual void SAL_CALL focusLost(const ::com::sun::star::awt::FocusEvent& e) throw( ::com::sun::star::uno::RuntimeException ); 317 318 // XMouseListener 319 virtual void SAL_CALL mousePressed( const ::com::sun::star::awt::MouseEvent& _rEvent ) throw (::com::sun::star::uno::RuntimeException); 320 virtual void SAL_CALL mouseReleased( const ::com::sun::star::awt::MouseEvent& _rEvent ) throw (::com::sun::star::uno::RuntimeException); 321 virtual void SAL_CALL mouseEntered( const ::com::sun::star::awt::MouseEvent& _rEvent ) throw (::com::sun::star::uno::RuntimeException); 322 virtual void SAL_CALL mouseExited( const ::com::sun::star::awt::MouseEvent& _rEvent ) throw (::com::sun::star::uno::RuntimeException); 323 324 // XFormComponentValidityListener 325 virtual void SAL_CALL componentValidityChanged( const ::com::sun::star::lang::EventObject& _rSource ) throw (::com::sun::star::uno::RuntimeException); 326 327 // XInteractionHandler 328 virtual void SAL_CALL handle( const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionRequest >& Request ) throw (::com::sun::star::uno::RuntimeException); 329 330 // XGridControlListener 331 virtual void SAL_CALL columnChanged( const ::com::sun::star::lang::EventObject& _event ) throw (::com::sun::star::uno::RuntimeException); 332 333 // ::com::sun::star::beans::XPropertyChangeListener -> aenderung der stati 334 virtual void SAL_CALL propertyChange(const ::com::sun::star::beans::PropertyChangeEvent& evt) throw( ::com::sun::star::uno::RuntimeException ); 335 336 // XTextListener -> modify setzen 337 virtual void SAL_CALL textChanged(const ::com::sun::star::awt::TextEvent& rEvent) throw( ::com::sun::star::uno::RuntimeException ); 338 339 // XItemListener -> modify setzen 340 virtual void SAL_CALL itemStateChanged(const ::com::sun::star::awt::ItemEvent& rEvent) throw( ::com::sun::star::uno::RuntimeException ); 341 342 // XModifyListener -> modify setzen 343 virtual void SAL_CALL modified(const ::com::sun::star::lang::EventObject& rEvent) throw( ::com::sun::star::uno::RuntimeException ); 344 345 // XFormController 346 virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormOperations > SAL_CALL getFormOperations() throw (::com::sun::star::uno::RuntimeException); 347 virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl> SAL_CALL getCurrentControl(void) throw( ::com::sun::star::uno::RuntimeException ); 348 virtual void SAL_CALL addActivateListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormControllerListener>& l) throw( ::com::sun::star::uno::RuntimeException ); 349 virtual void SAL_CALL removeActivateListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormControllerListener>& l) throw( ::com::sun::star::uno::RuntimeException ); 350 virtual void SAL_CALL addChildController( const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController >& _ChildController ) throw( ::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::IllegalArgumentException ); 351 352 virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormControllerContext > SAL_CALL getContext() throw (::com::sun::star::uno::RuntimeException); 353 virtual void SAL_CALL setContext( const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormControllerContext >& _context ) throw (::com::sun::star::uno::RuntimeException); 354 virtual ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler > SAL_CALL getInteractionHandler() throw (::com::sun::star::uno::RuntimeException); 355 virtual void SAL_CALL setInteractionHandler( const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& _interactionHandler ) throw (::com::sun::star::uno::RuntimeException); 356 357 // XTabController 358 virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl> > SAL_CALL getControls(void) throw( ::com::sun::star::uno::RuntimeException ); 359 360 virtual void SAL_CALL setModel(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTabControllerModel>& Model) throw( ::com::sun::star::uno::RuntimeException ); 361 virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTabControllerModel> SAL_CALL getModel() throw( ::com::sun::star::uno::RuntimeException ); 362 363 virtual void SAL_CALL setContainer(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer>& Container) throw( ::com::sun::star::uno::RuntimeException ); 364 virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer> SAL_CALL getContainer() throw( ::com::sun::star::uno::RuntimeException ); 365 366 virtual void SAL_CALL autoTabOrder() throw( ::com::sun::star::uno::RuntimeException ); 367 virtual void SAL_CALL activateTabOrder() throw( ::com::sun::star::uno::RuntimeException ); 368 369 virtual void SAL_CALL activateFirst() throw( ::com::sun::star::uno::RuntimeException ); 370 virtual void SAL_CALL activateLast() throw( ::com::sun::star::uno::RuntimeException ); 371 372 // com::sun::star::sdbc::XRowSetListener 373 virtual void SAL_CALL cursorMoved(const ::com::sun::star::lang::EventObject& event) throw( ::com::sun::star::uno::RuntimeException ); 374 virtual void SAL_CALL rowChanged(const ::com::sun::star::lang::EventObject& event) throw( ::com::sun::star::uno::RuntimeException ); 375 virtual void SAL_CALL rowSetChanged(const ::com::sun::star::lang::EventObject& event) throw( ::com::sun::star::uno::RuntimeException ); 376 377 // XRowSetApproveListener 378 virtual sal_Bool SAL_CALL approveCursorMove(const ::com::sun::star::lang::EventObject& event) throw( ::com::sun::star::uno::RuntimeException ); 379 virtual sal_Bool SAL_CALL approveRowChange(const ::com::sun::star::sdb::RowChangeEvent& event) throw( ::com::sun::star::uno::RuntimeException ); 380 virtual sal_Bool SAL_CALL approveRowSetChange(const ::com::sun::star::lang::EventObject& event) throw( ::com::sun::star::uno::RuntimeException ); 381 382 // XRowSetApproveBroadcaster 383 virtual void SAL_CALL addRowSetApproveListener(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XRowSetApproveListener>& listener) throw( ::com::sun::star::uno::RuntimeException ); 384 virtual void SAL_CALL removeRowSetApproveListener(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XRowSetApproveListener>& listener) throw( ::com::sun::star::uno::RuntimeException ); 385 386 // XSQLErrorBroadcaster 387 virtual void SAL_CALL errorOccured(const ::com::sun::star::sdb::SQLErrorEvent& aEvent) throw( ::com::sun::star::uno::RuntimeException ); 388 389 // XSQLErrorListener 390 virtual void SAL_CALL addSQLErrorListener(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSQLErrorListener>& _rListener) throw( ::com::sun::star::uno::RuntimeException ); 391 virtual void SAL_CALL removeSQLErrorListener(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSQLErrorListener>& _rListener) throw( ::com::sun::star::uno::RuntimeException ); 392 393 // XDatabaseParameterBroadcaster2 394 virtual void SAL_CALL addDatabaseParameterListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener>& aListener) throw( ::com::sun::star::uno::RuntimeException ); 395 virtual void SAL_CALL removeDatabaseParameterListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener>& aListener) throw( ::com::sun::star::uno::RuntimeException ); 396 397 // XDatabaseParameterBroadcaster 398 virtual void SAL_CALL addParameterListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener>& aListener) throw( ::com::sun::star::uno::RuntimeException ); 399 virtual void SAL_CALL removeParameterListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener>& aListener) throw( ::com::sun::star::uno::RuntimeException ); 400 401 // XDatabaseParameterListener 402 virtual sal_Bool SAL_CALL approveParameter(const ::com::sun::star::form::DatabaseParameterEvent& aEvent) throw( ::com::sun::star::uno::RuntimeException ); 403 404 // XConfirmDeleteBroadcaster 405 virtual void SAL_CALL addConfirmDeleteListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XConfirmDeleteListener>& aListener) throw( ::com::sun::star::uno::RuntimeException ); 406 virtual void SAL_CALL removeConfirmDeleteListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XConfirmDeleteListener>& aListener) throw( ::com::sun::star::uno::RuntimeException ); 407 408 // XConfirmDeleteListener 409 virtual sal_Bool SAL_CALL confirmDelete(const ::com::sun::star::sdb::RowChangeEvent& aEvent) throw( ::com::sun::star::uno::RuntimeException ); 410 411 // XServiceInfo 412 virtual sal_Bool SAL_CALL supportsService(const ::rtl::OUString& ServiceName) throw(::com::sun::star::uno::RuntimeException); 413 virtual ::rtl::OUString SAL_CALL getImplementationName() throw(::com::sun::star::uno::RuntimeException); 414 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw(::com::sun::star::uno::RuntimeException); 415 416 // XResetListener 417 virtual sal_Bool SAL_CALL approveReset(const ::com::sun::star::lang::EventObject& rEvent) throw( ::com::sun::star::uno::RuntimeException ); 418 virtual void SAL_CALL resetted(const ::com::sun::star::lang::EventObject& rEvent) throw( ::com::sun::star::uno::RuntimeException ); 419 420 // XFeatureInvalidation 421 virtual void SAL_CALL invalidateFeatures( const ::com::sun::star::uno::Sequence< ::sal_Int16 >& Features ) throw (::com::sun::star::uno::RuntimeException); 422 virtual void SAL_CALL invalidateAllFeatures( ) throw (::com::sun::star::uno::RuntimeException); 423 424 // method for registration 425 static ::com::sun::star::uno::Sequence< ::rtl::OUString > getSupportedServiceNames_Static(void); 426 427 // comphelper::OPropertyArrayUsageHelper 428 virtual void fillProperties( 429 ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >& /* [out] */ _rProps, 430 ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >& /* [out] */ _rAggregateProps 431 ) const; 432 433 protected: 434 // DispatchInterceptor 435 virtual ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch> 436 interceptedQueryDispatch( 437 const ::com::sun::star::util::URL& aURL, 438 const ::rtl::OUString& aTargetFrameName, 439 sal_Int32 nSearchFlags 440 ) throw( ::com::sun::star::uno::RuntimeException ); 441 442 virtual ::osl::Mutex* getInterceptorMutex() { return &m_aMutex; } 443 444 /// update all our dispatchers 445 void updateAllDispatchers() const; 446 447 /** disposes all dispatchers in m_aFeatureDispatchers, and empties m_aFeatureDispatchers 448 */ 449 void disposeAllFeaturesAndDispatchers() SAL_THROW(()); 450 451 void startFiltering(); 452 void stopFiltering(); 453 void setFilter(::std::vector<FmFieldInfo>&); 454 void startListening(); 455 void stopListening(); 456 457 /** ensures that we have an interaction handler, if possible 458 459 If an interaction handler was provided at creation time (<member>initialize</member>), this 460 one will be used. Else, an attempt is made to create an <type scope="com::sun::star::sdb">InteractionHandler</type> 461 is made. 462 463 @return <TRUE/> 464 if and only if <member>m_xInteractionHandler</member> is valid when the method returns 465 */ 466 bool ensureInteractionHandler(); 467 468 /** replaces one of our controls with another one 469 470 Upon successful replacing, the old control will be disposed. Also, internal members pointing 471 to the current or active control will be adjusted. Yet more, if the replaced control was 472 the active control, the new control will be made active. 473 474 @param _rxExistentControl 475 The control to replace. Must be one of the controls in our ControlContainer. 476 @param _rxNewControl 477 The control which should replace the existent control. 478 @return 479 <TRUE/> if and only if the control was successfully replaced 480 */ 481 bool replaceControl( 482 const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >& _rxExistentControl, 483 const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >& _rxNewControl 484 ); 485 486 // we're listening at all bound controls for modifications 487 void startControlModifyListening(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl); 488 void stopControlModifyListening(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl); 489 490 void setLocks(); 491 void setControlLock(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl); 492 void addToEventAttacher(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl); 493 void removeFromEventAttacher(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl); 494 void toggleAutoFields(sal_Bool bAutoFields); 495 void unload() throw( ::com::sun::star::uno::RuntimeException ); 496 void removeBoundFieldListener(); 497 498 void startFormListening( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxForm, sal_Bool _bPropertiesOnly ); 499 void stopFormListening( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxForm, sal_Bool _bPropertiesOnly ); 500 501 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl> findControl( ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl> >& rCtrls, const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel>& rxCtrlModel, sal_Bool _bRemove, sal_Bool _bOverWrite ) const; 502 503 void insertControl(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl); 504 void removeControl(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl); 505 506 /// called when a new control is to be handled by the controller 507 void implControlInserted( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& _rxControl, bool _bAddToEventAttacher ); 508 /// called when a control is not to be handled by the controller anymore 509 void implControlRemoved( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& _rxControl, bool _bRemoveFromEventAttacher ); 510 511 /** sets m_xCurrentControl, plus does administrative tasks depending on it 512 */ 513 void implSetCurrentControl( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >& _rxControl ); 514 515 /** invalidates the FormFeatures which depend on the current control 516 */ 517 void implInvalidateCurrentControlDependentFeatures(); 518 519 bool impl_isDisposed_nofail() const { return FormController_BASE::rBHelper.bDisposed; } 520 void impl_checkDisposed_throw() const; 521 522 void impl_onModify(); 523 524 /** adds the given filter row to m_aFilterRows, setting m_nCurrentFilterPosition to 0 if the newly added 525 row is the first one. 526 527 @precond 528 our mutex is locked 529 */ 530 void impl_addFilterRow( const FmFilterRow& _row ); 531 532 /** adds an empty filter row to m_aFilterRows, and notifies our listeners 533 */ 534 void impl_appendEmptyFilterRow( ::osl::ClearableMutexGuard& _rClearBeforeNotify ); 535 536 sal_Bool isLocked() const {return m_bLocked;} 537 sal_Bool determineLockState() const; 538 539 Window* getDialogParentWindow(); 540 // returns the window which should be used as parent window for dialogs 541 542 ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProviderInterceptor> createInterceptor(const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProviderInterception>& _xInterception); 543 // create a new interceptor, register it on the given object 544 void deleteInterceptor(const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProviderInterception>& _xInterception); 545 // if createInterceptor was called for the given object the according interceptor will be removed 546 // from the objects interceptor chain and released 547 548 /** checks all form controls belonging to our form for validity 549 550 If a form control supports the XValidatableFormComponent interface, this is used to determine 551 the validity of the control. If the interface is not supported, the control is supposed to be 552 valid. 553 554 @param _rFirstInvalidityExplanation 555 if the method returns <FALSE/> (i.e. if there is an invalid control), this string contains 556 the explanation for the invalidity, as obtained from the validator. 557 558 @param _rxFirstInvalidModel 559 if the method returns <FALSE/> (i.e. if there is an invalid control), this contains 560 the control model 561 562 @return 563 <TRUE/> if and only if all controls belonging to our form are valid 564 */ 565 bool checkFormComponentValidity( 566 ::rtl::OUString& /* [out] */ _rFirstInvalidityExplanation, 567 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >& /* [out] */ _rxFirstInvalidModel 568 ) SAL_THROW(()); 569 570 /** locates the control which belongs to a given model 571 */ 572 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl > 573 locateControl( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >& _rxModel ) SAL_THROW(()); 574 575 // set the text for all filters 576 void impl_setTextOnAllFilter_throw(); 577 578 // in filter mode we do not listen for changes 579 sal_Bool isListeningForChanges() const {return m_bDBConnection && !m_bFiltering && !isLocked();} 580 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl> isInList(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer>& xPeer) const; 581 582 DECL_LINK( OnActivateTabOrder, void* ); 583 DECL_LINK( OnInvalidateFeatures, void* ); 584 DECL_LINK( OnLoad, void* ); 585 DECL_LINK( OnToggleAutoFields, void* ); 586 DECL_LINK( OnActivated, void* ); 587 DECL_LINK( OnDeactivated, void* ); 588 }; 589 590 } // namespace svxform 591 592 #endif // _SVX_FMCTRLER_HXX 593 594