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