xref: /aoo41x/main/svx/source/inc/formcontroller.hxx (revision cdf0e10c)
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