1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #ifndef _FORMS_FORMCOMPONENT_HXX_
25*b1cdbd2cSJim Jagielski #define _FORMS_FORMCOMPONENT_HXX_
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "cloneable.hxx"
28*b1cdbd2cSJim Jagielski #include "ids.hxx"
29*b1cdbd2cSJim Jagielski #include "property.hrc"
30*b1cdbd2cSJim Jagielski #include "property.hxx"
31*b1cdbd2cSJim Jagielski #include "propertybaghelper.hxx"
32*b1cdbd2cSJim Jagielski #include "resettable.hxx"
33*b1cdbd2cSJim Jagielski #include "services.hxx"
34*b1cdbd2cSJim Jagielski #include "windowstateguard.hxx"
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski /** === begin UNO includes === **/
37*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XControl.hpp>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertyAccess.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertyContainer.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XChild.hpp>
41*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNamed.hpp>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/form/binding/XBindableValue.hpp>
43*b1cdbd2cSJim Jagielski #include <com/sun/star/form/FormComponentType.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/form/validation/XValidatableFormComponent.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/form/validation/XValidityConstraintListener.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/form/XBoundComponent.hpp>
47*b1cdbd2cSJim Jagielski #include <com/sun/star/form/XBoundControl.hpp>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/form/XFormComponent.hpp>
49*b1cdbd2cSJim Jagielski #include <com/sun/star/form/XLoadListener.hpp>
50*b1cdbd2cSJim Jagielski #include <com/sun/star/form/XReset.hpp>
51*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XMarkableStream.hpp>
52*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XPersistObject.hpp>
53*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/DisposedException.hpp>
54*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XEventListener.hpp>
55*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiServiceFactory.hpp>
56*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XServiceInfo.hpp>
57*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/XColumn.hpp>
58*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/XColumnUpdate.hpp>
59*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/XRowSetChangeListener.hpp>
60*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/XRowSet.hpp>
61*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
62*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/XAggregation.hpp>
63*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XCloneable.hpp>
64*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XModifyListener.hpp>
65*b1cdbd2cSJim Jagielski #include <com/sun/star/form/XLoadable.hpp>
66*b1cdbd2cSJim Jagielski /** === end UNO includes === **/
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski #include <comphelper/componentcontext.hxx>
69*b1cdbd2cSJim Jagielski #include <comphelper/propagg.hxx>
70*b1cdbd2cSJim Jagielski #include <comphelper/propertybag.hxx>
71*b1cdbd2cSJim Jagielski #include <comphelper/propmultiplex.hxx>
72*b1cdbd2cSJim Jagielski #include <comphelper/sequence.hxx>
73*b1cdbd2cSJim Jagielski #include <comphelper/uno3.hxx>
74*b1cdbd2cSJim Jagielski #include <cppuhelper/component.hxx>
75*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase1.hxx>
76*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase2.hxx>
77*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase3.hxx>
78*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase4.hxx>
79*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase7.hxx>
80*b1cdbd2cSJim Jagielski #include <osl/mutex.hxx>
81*b1cdbd2cSJim Jagielski #include <rtl/ustring.hxx>
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski #include <memory>
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski //.........................................................................
86*b1cdbd2cSJim Jagielski namespace frm
87*b1cdbd2cSJim Jagielski {
88*b1cdbd2cSJim Jagielski //.........................................................................
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski     // default tab index for components
91*b1cdbd2cSJim Jagielski     const sal_Int16 FRM_DEFAULT_TABINDEX = 0;
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski     // macros for quickly declaring/implementing XServiceInfo
94*b1cdbd2cSJim Jagielski     #define DECLARE_XPERSISTOBJECT() \
95*b1cdbd2cSJim Jagielski     virtual ::rtl::OUString SAL_CALL getServiceName() throw(::com::sun::star::uno::RuntimeException);    \
96*b1cdbd2cSJim Jagielski     virtual void SAL_CALL write(const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectOutputStream>& _rxOutStream) throw(::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException);    \
97*b1cdbd2cSJim Jagielski     virtual void SAL_CALL read(const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectInputStream>& _rxInStream) throw(::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException);   \
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski     // old macro for quickly implementing XServiceInfo::getImplementationName
100*b1cdbd2cSJim Jagielski     #define IMPLEMENTATION_NAME(ImplName)										\
101*b1cdbd2cSJim Jagielski     virtual ::rtl::OUString SAL_CALL getImplementationName(  ) throw(::com::sun::star::uno::RuntimeException) \
102*b1cdbd2cSJim Jagielski 		{ return ::rtl::OUString::createFromAscii("com.sun.star.comp.forms.") + ::rtl::OUString::createFromAscii(#ImplName); }
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski     class OControlModel;
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski     //=========================================================================
107*b1cdbd2cSJim Jagielski     //= ControlModelLock
108*b1cdbd2cSJim Jagielski     //=========================================================================
109*b1cdbd2cSJim Jagielski     /** class whose instances lock a OControlModel
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski         Locking here merely means locking the OControlModel's mutex.
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski         In addition to the locking facility, the class is also able to fire property
114*b1cdbd2cSJim Jagielski         change notifications. This happens when the last ControlModelLock instance on a stack
115*b1cdbd2cSJim Jagielski         dies.
116*b1cdbd2cSJim Jagielski     */
117*b1cdbd2cSJim Jagielski     class ControlModelLock
118*b1cdbd2cSJim Jagielski     {
119*b1cdbd2cSJim Jagielski     public:
ControlModelLock(OControlModel & _rModel)120*b1cdbd2cSJim Jagielski         ControlModelLock( OControlModel& _rModel )
121*b1cdbd2cSJim Jagielski             :m_rModel( _rModel )
122*b1cdbd2cSJim Jagielski             ,m_bLocked( false )
123*b1cdbd2cSJim Jagielski         {
124*b1cdbd2cSJim Jagielski             acquire();
125*b1cdbd2cSJim Jagielski         }
126*b1cdbd2cSJim Jagielski 
~ControlModelLock()127*b1cdbd2cSJim Jagielski         ~ControlModelLock()
128*b1cdbd2cSJim Jagielski         {
129*b1cdbd2cSJim Jagielski             if ( m_bLocked )
130*b1cdbd2cSJim Jagielski                 release();
131*b1cdbd2cSJim Jagielski         }
132*b1cdbd2cSJim Jagielski         inline void acquire();
133*b1cdbd2cSJim Jagielski         inline void release();
134*b1cdbd2cSJim Jagielski 
getModel() const135*b1cdbd2cSJim Jagielski         inline OControlModel& getModel() const { return m_rModel; };
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski         /** adds a property change notification, which is to be fired when the last lock on the model
138*b1cdbd2cSJim Jagielski             (in the current thread) is released.
139*b1cdbd2cSJim Jagielski         */
140*b1cdbd2cSJim Jagielski         void    addPropertyNotification(
141*b1cdbd2cSJim Jagielski                     const sal_Int32 _nHandle,
142*b1cdbd2cSJim Jagielski                     const ::com::sun::star::uno::Any& _rOldValue,
143*b1cdbd2cSJim Jagielski                     const ::com::sun::star::uno::Any& _rNewValue
144*b1cdbd2cSJim Jagielski                 );
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski     private:
147*b1cdbd2cSJim Jagielski         void    impl_notifyAll_nothrow();
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski     private:
150*b1cdbd2cSJim Jagielski         OControlModel&                                                  m_rModel;
151*b1cdbd2cSJim Jagielski         bool                                                            m_bLocked;
152*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Sequence< sal_Int32 >                    m_aHandles;
153*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >   m_aOldValues;
154*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >   m_aNewValues;
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski     private:
157*b1cdbd2cSJim Jagielski         ControlModelLock();                                     // never implemented
158*b1cdbd2cSJim Jagielski         ControlModelLock( const ControlModelLock& );            // never implemented
159*b1cdbd2cSJim Jagielski         ControlModelLock& operator=( const ControlModelLock& ); // never implemented
160*b1cdbd2cSJim Jagielski     };
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski //=========================================================================
163*b1cdbd2cSJim Jagielski //= OControl
164*b1cdbd2cSJim Jagielski //= base class for form layer controls
165*b1cdbd2cSJim Jagielski //=========================================================================
166*b1cdbd2cSJim Jagielski typedef ::cppu::ImplHelper3	<	::com::sun::star::awt::XControl
167*b1cdbd2cSJim Jagielski 							,	::com::sun::star::lang::XEventListener
168*b1cdbd2cSJim Jagielski 							,	::com::sun::star::lang::XServiceInfo
169*b1cdbd2cSJim Jagielski 							> OControl_BASE;
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski class OControl	:public ::cppu::OComponentHelper
172*b1cdbd2cSJim Jagielski 				,public OControl_BASE
173*b1cdbd2cSJim Jagielski {
174*b1cdbd2cSJim Jagielski protected:
175*b1cdbd2cSJim Jagielski     ::osl::Mutex                                m_aMutex;
176*b1cdbd2cSJim Jagielski 	OImplementationIdsRef						m_aHoldIdHelper;
177*b1cdbd2cSJim Jagielski 	::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >
178*b1cdbd2cSJim Jagielski 												m_xControl;
179*b1cdbd2cSJim Jagielski 	::com::sun::star::uno::Reference< ::com::sun::star::uno::XAggregation>
180*b1cdbd2cSJim Jagielski 												m_xAggregate;
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski     ::comphelper::ComponentContext              m_aContext;
183*b1cdbd2cSJim Jagielski     WindowStateGuard                            m_aWindowStateGuard;
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski public:
186*b1cdbd2cSJim Jagielski     /** constructs a control
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski         @param _rFactory
189*b1cdbd2cSJim Jagielski             the service factory for this control
190*b1cdbd2cSJim Jagielski         @param _rAggregateService
191*b1cdbd2cSJim Jagielski             the service name of the component to aggregate
192*b1cdbd2cSJim Jagielski         @param _bSetDelegator
193*b1cdbd2cSJim Jagielski             set this to <FALSE/> if you don't want the constructor to set the delegator at
194*b1cdbd2cSJim Jagielski             the aggregate. In this case, you <em>have</em> to call doSetDelegator within your
195*b1cdbd2cSJim Jagielski             own constructor.
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski             This is helpfull, if your derived class wants to cache an interface of the aggregate.
198*b1cdbd2cSJim Jagielski             In this case, the aggregate needs to be queried for this interface <b>before</b> the
199*b1cdbd2cSJim Jagielski             <member scope="com::sun::star::uno">XAggregation::setDelegator</member> call.
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski             In such a case, pass <FALSE/> to this parameter. Then, cache the aggregate's interface(s)
202*b1cdbd2cSJim Jagielski             as needed. Afterwards, call <member>doSetDelegator</member>.
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski             In your destructor, you need to call <member>doResetDelegator</member> before
205*b1cdbd2cSJim Jagielski             resetting the cached interfaces. This will reset the aggregates delegator to <NULL/>,
206*b1cdbd2cSJim Jagielski             which will ensure that the <member scope="com::sun::star::uno">XInterface::release</member>
207*b1cdbd2cSJim Jagielski             calls on the cached interfaces are really applied to the aggregate, instead of
208*b1cdbd2cSJim Jagielski             the <type>OControl</type> itself.
209*b1cdbd2cSJim Jagielski     */
210*b1cdbd2cSJim Jagielski 	OControl(
211*b1cdbd2cSJim Jagielski         const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rFactory,
212*b1cdbd2cSJim Jagielski         const ::rtl::OUString& _rAggregateService,
213*b1cdbd2cSJim Jagielski         const sal_Bool _bSetDelegator = sal_True
214*b1cdbd2cSJim Jagielski     );
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski     /** initializes the given peer with various settings necessary for form controls
217*b1cdbd2cSJim Jagielski     */
218*b1cdbd2cSJim Jagielski     static  void    initFormControlPeer(
219*b1cdbd2cSJim Jagielski         const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer >& _rxPeer );
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski protected:
222*b1cdbd2cSJim Jagielski 	virtual ~OControl();
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski     /** sets the control as delegator at the aggregate
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski         This has to be called from within your derived class' constructor, if and only
227*b1cdbd2cSJim Jagielski         if you passed <FALSE/> to the <arg>_bSetDelegator</arg> parameter of the
228*b1cdbd2cSJim Jagielski         <type>OControl</type> constructor.
229*b1cdbd2cSJim Jagielski     */
230*b1cdbd2cSJim Jagielski 	void	doSetDelegator();
231*b1cdbd2cSJim Jagielski 	void	doResetDelegator();
232*b1cdbd2cSJim Jagielski 
233*b1cdbd2cSJim Jagielski // UNO
234*b1cdbd2cSJim Jagielski 	DECLARE_UNO3_AGG_DEFAULTS(OControl, OComponentHelper);
235*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Any SAL_CALL queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(::com::sun::star::uno::RuntimeException);
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski // XTypeProvider
238*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Sequence<sal_Int8>			SAL_CALL getImplementationId() throw(::com::sun::star::uno::RuntimeException);
239*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type>	SAL_CALL getTypes() throw(::com::sun::star::uno::RuntimeException);
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski // OComponentHelper
242*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL disposing();
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski // XComponent (as base of XControl)
dispose()245*b1cdbd2cSJim Jagielski     virtual void SAL_CALL dispose(  ) throw(::com::sun::star::uno::RuntimeException)
246*b1cdbd2cSJim Jagielski 		{ OComponentHelper::dispose(); }
addEventListener(const::com::sun::star::uno::Reference<::com::sun::star::lang::XEventListener> & _rxListener)247*b1cdbd2cSJim Jagielski     virtual void SAL_CALL addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener>& _rxListener) throw(::com::sun::star::uno::RuntimeException)
248*b1cdbd2cSJim Jagielski 		{ OComponentHelper::addEventListener(_rxListener); }
removeEventListener(const::com::sun::star::uno::Reference<::com::sun::star::lang::XEventListener> & _rxListener)249*b1cdbd2cSJim Jagielski     virtual void SAL_CALL removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener>& _rxListener) throw(::com::sun::star::uno::RuntimeException)
250*b1cdbd2cSJim Jagielski 		{ OComponentHelper::removeEventListener(_rxListener); }
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski // XEventListener
253*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw (::com::sun::star::uno::RuntimeException);
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski // XServiceInfo
256*b1cdbd2cSJim Jagielski 	virtual sal_Bool SAL_CALL			supportsService(const ::rtl::OUString& ServiceName) throw (::com::sun::star::uno::RuntimeException);
257*b1cdbd2cSJim Jagielski 	virtual StringSequence SAL_CALL		getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException);
258*b1cdbd2cSJim Jagielski     virtual ::rtl::OUString SAL_CALL	getImplementationName() throw(::com::sun::star::uno::RuntimeException) = 0;
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski // XServiceInfo - static version
261*b1cdbd2cSJim Jagielski 	static  StringSequence SAL_CALL		getSupportedServiceNames_Static() throw(::com::sun::star::uno::RuntimeException);
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski // XControl
264*b1cdbd2cSJim Jagielski 	virtual void										SAL_CALL setContext(const InterfaceRef& Context) throw (::com::sun::star::uno::RuntimeException);
265*b1cdbd2cSJim Jagielski 	virtual InterfaceRef								SAL_CALL getContext() throw (::com::sun::star::uno::RuntimeException);
266*b1cdbd2cSJim Jagielski 	virtual void										SAL_CALL createPeer(const ::com::sun::star::uno::Reference<starawt::XToolkit>& Toolkit, const ::com::sun::star::uno::Reference<starawt::XWindowPeer>& Parent) throw (::com::sun::star::uno::RuntimeException);
267*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Reference<starawt::XWindowPeer>	SAL_CALL getPeer() throw (::com::sun::star::uno::RuntimeException);
268*b1cdbd2cSJim Jagielski 	virtual sal_Bool									SAL_CALL setModel(const ::com::sun::star::uno::Reference<starawt::XControlModel>& Model) throw (::com::sun::star::uno::RuntimeException);
269*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Reference<starawt::XControlModel>	SAL_CALL getModel() throw (::com::sun::star::uno::RuntimeException);
270*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Reference<starawt::XView>			SAL_CALL getView() throw (::com::sun::star::uno::RuntimeException);
271*b1cdbd2cSJim Jagielski 	virtual void										SAL_CALL setDesignMode(sal_Bool bOn) throw (::com::sun::star::uno::RuntimeException);
272*b1cdbd2cSJim Jagielski 	virtual sal_Bool									SAL_CALL isDesignMode() throw (::com::sun::star::uno::RuntimeException);
273*b1cdbd2cSJim Jagielski 	virtual sal_Bool									SAL_CALL isTransparent() throw (::com::sun::star::uno::RuntimeException);
274*b1cdbd2cSJim Jagielski 
275*b1cdbd2cSJim Jagielski protected:
276*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type>	_getTypes();
277*b1cdbd2cSJim Jagielski 		// overwrite this and call the base class if you have additional types
278*b1cdbd2cSJim Jagielski 
279*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Sequence< ::rtl::OUString > getAggregateServiceNames();
280*b1cdbd2cSJim Jagielski 
281*b1cdbd2cSJim Jagielski private:
282*b1cdbd2cSJim Jagielski     void    impl_resetStateGuard_nothrow();
283*b1cdbd2cSJim Jagielski };
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski //==================================================================
286*b1cdbd2cSJim Jagielski //= OBoundControl
287*b1cdbd2cSJim Jagielski //= a form control implementing the XBoundControl interface
288*b1cdbd2cSJim Jagielski //==================================================================
289*b1cdbd2cSJim Jagielski typedef ::cppu::ImplHelper1 <   ::com::sun::star::form::XBoundControl
290*b1cdbd2cSJim Jagielski                             >  OBoundControl_BASE;
291*b1cdbd2cSJim Jagielski class OBoundControl	:public OControl
292*b1cdbd2cSJim Jagielski 					,public OBoundControl_BASE
293*b1cdbd2cSJim Jagielski {
294*b1cdbd2cSJim Jagielski protected:
295*b1cdbd2cSJim Jagielski 	sal_Bool	m_bLocked : 1;
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski     ::rtl::OUString m_sOriginalHelpText;                // as long as the text/value is invalid, we change the help text of our peer
298*b1cdbd2cSJim Jagielski     ::com::sun::star::awt::FontDescriptor
299*b1cdbd2cSJim Jagielski                     m_aOriginalFont;                    // as long as the text/value is invalid, we also change the font
300*b1cdbd2cSJim Jagielski     sal_Int32       m_nOriginalTextLineColor;           // (we add red underlining)
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski public:
303*b1cdbd2cSJim Jagielski     OBoundControl(
304*b1cdbd2cSJim Jagielski         const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory,
305*b1cdbd2cSJim Jagielski         const ::rtl::OUString& _rAggregateService,
306*b1cdbd2cSJim Jagielski         const sal_Bool _bSetDelegator = sal_True
307*b1cdbd2cSJim Jagielski     );
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski 	virtual ~OBoundControl();
310*b1cdbd2cSJim Jagielski 
311*b1cdbd2cSJim Jagielski 	DECLARE_UNO3_AGG_DEFAULTS(OBoundControl, OControl);
312*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Any SAL_CALL queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(::com::sun::star::uno::RuntimeException);
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski     // XBoundControl
315*b1cdbd2cSJim Jagielski     virtual sal_Bool SAL_CALL	getLock() throw(::com::sun::star::uno::RuntimeException);
316*b1cdbd2cSJim Jagielski     virtual void SAL_CALL		setLock(sal_Bool _bLock) throw(::com::sun::star::uno::RuntimeException);
317*b1cdbd2cSJim Jagielski 		// default implementation just disables the controls, overwrite _setLock to change this behaviour
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski     // XControl
320*b1cdbd2cSJim Jagielski 	virtual sal_Bool SAL_CALL setModel(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >& Model) throw (::com::sun::star::uno::RuntimeException);
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski     // XEventListener
323*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw (::com::sun::star::uno::RuntimeException);
324*b1cdbd2cSJim Jagielski 
325*b1cdbd2cSJim Jagielski     // OComponentHelper
326*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL disposing();
327*b1cdbd2cSJim Jagielski 
328*b1cdbd2cSJim Jagielski protected:
329*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type>	_getTypes();
330*b1cdbd2cSJim Jagielski 	// implement the lock setting
331*b1cdbd2cSJim Jagielski 	virtual void		 _setLock(sal_Bool _bLock);
332*b1cdbd2cSJim Jagielski };
333*b1cdbd2cSJim Jagielski 
334*b1cdbd2cSJim Jagielski //==================================================================
335*b1cdbd2cSJim Jagielski //= OControlModel
336*b1cdbd2cSJim Jagielski //= model of a form layer control
337*b1cdbd2cSJim Jagielski //==================================================================
338*b1cdbd2cSJim Jagielski //added for exporting OCX control
339*b1cdbd2cSJim Jagielski #define INVALID_OBJ_ID_IN_MSO     0xFFFF
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski typedef ::cppu::ImplHelper7	<	::com::sun::star::form::XFormComponent
342*b1cdbd2cSJim Jagielski 							,	::com::sun::star::io::XPersistObject
343*b1cdbd2cSJim Jagielski 							,	::com::sun::star::container::XNamed
344*b1cdbd2cSJim Jagielski 							,	::com::sun::star::lang::XServiceInfo
345*b1cdbd2cSJim Jagielski 							,	::com::sun::star::util::XCloneable
346*b1cdbd2cSJim Jagielski 							,	::com::sun::star::beans::XPropertyContainer
347*b1cdbd2cSJim Jagielski 							,	::com::sun::star::beans::XPropertyAccess
348*b1cdbd2cSJim Jagielski 							>	OControlModel_BASE;
349*b1cdbd2cSJim Jagielski 
350*b1cdbd2cSJim Jagielski class OControlModel	:public ::cppu::OComponentHelper
351*b1cdbd2cSJim Jagielski 					,public OPropertySetAggregationHelper
352*b1cdbd2cSJim Jagielski 					,public OControlModel_BASE
353*b1cdbd2cSJim Jagielski 					,public OCloneableAggregation
354*b1cdbd2cSJim Jagielski                     ,public IPropertyBagHelperContext
355*b1cdbd2cSJim Jagielski {
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski protected:
358*b1cdbd2cSJim Jagielski     ::comphelper::ComponentContext  m_aContext;
359*b1cdbd2cSJim Jagielski 
360*b1cdbd2cSJim Jagielski     ::osl::Mutex                    m_aMutex;
361*b1cdbd2cSJim Jagielski     oslInterlockedCount             m_lockCount;
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski 	InterfaceRef					m_xParent;					// ParentComponent
364*b1cdbd2cSJim Jagielski 	OImplementationIdsRef			m_aHoldIdHelper;
365*b1cdbd2cSJim Jagielski     PropertyBagHelper               m_aPropertyBagHelper;
366*b1cdbd2cSJim Jagielski 
367*b1cdbd2cSJim Jagielski     const ::comphelper::ComponentContext&
getContext() const368*b1cdbd2cSJim Jagielski         getContext() const { return m_aContext; }
369*b1cdbd2cSJim Jagielski 
370*b1cdbd2cSJim Jagielski // <properties>
371*b1cdbd2cSJim Jagielski 	::rtl::OUString					m_aName;					// name of the control
372*b1cdbd2cSJim Jagielski 	::rtl::OUString					m_aTag;						// tag for additional data
373*b1cdbd2cSJim Jagielski 	sal_Int16						m_nTabIndex;				// index within the taborder
374*b1cdbd2cSJim Jagielski 	sal_Int16						m_nClassId;					// type of the control
375*b1cdbd2cSJim Jagielski     sal_Bool                        m_bNativeLook;              // should the control use the native platform look?
376*b1cdbd2cSJim Jagielski     //added for exporting OCX control
377*b1cdbd2cSJim Jagielski     sal_Int16						m_nControlTypeinMSO;		//keep the MS office control type for exporting to MS binarary file
378*b1cdbd2cSJim Jagielski     sal_uInt16						m_nObjIDinMSO;				//keep the OCX control obj id for exporting to MS binarary file
379*b1cdbd2cSJim Jagielski // </properties>
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski protected:
383*b1cdbd2cSJim Jagielski 	OControlModel(
384*b1cdbd2cSJim Jagielski 		const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rFactory,	// factory to create the aggregate with
385*b1cdbd2cSJim Jagielski 		const ::rtl::OUString& _rUnoControlModelTypeName,						// service name of te model to aggregate
386*b1cdbd2cSJim Jagielski 		const ::rtl::OUString& rDefault = ::rtl::OUString(),					// service name of the default control
387*b1cdbd2cSJim Jagielski 		const sal_Bool _bSetDelegator = sal_True								// set to sal_False if you want to call setDelegator later (after returning from this ctor)
388*b1cdbd2cSJim Jagielski 	);
389*b1cdbd2cSJim Jagielski 	OControlModel(
390*b1cdbd2cSJim Jagielski 		const OControlModel* _pOriginal,										// the original object to clone
391*b1cdbd2cSJim Jagielski 		const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rFactory,	// factory to create the aggregate with
392*b1cdbd2cSJim Jagielski         const sal_Bool _bCloneAggregate = sal_True,                             // should the aggregate of the original be cloned, too?
393*b1cdbd2cSJim Jagielski 		const sal_Bool _bSetDelegator = sal_True								// set to sal_False if you want to call setDelegator later (after returning from this ctor)
394*b1cdbd2cSJim Jagielski 	);
395*b1cdbd2cSJim Jagielski 	virtual ~OControlModel();
396*b1cdbd2cSJim Jagielski 
397*b1cdbd2cSJim Jagielski     /** to be called after a OBoundControlModel (a derivee, respectively) has been cloned
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski         <p>This method contains late initializations which cannot be done in the
400*b1cdbd2cSJim Jagielski         constructor of this base class, since the virtual method of derived classes do
401*b1cdbd2cSJim Jagielski         not yet work there.</p>
402*b1cdbd2cSJim Jagielski     */
403*b1cdbd2cSJim Jagielski     virtual void clonedFrom( const OControlModel* _pOriginal );
404*b1cdbd2cSJim Jagielski 
405*b1cdbd2cSJim Jagielski 	using OComponentHelper::rBHelper;
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type>	_getTypes();
408*b1cdbd2cSJim Jagielski 
409*b1cdbd2cSJim Jagielski 	void	readHelpTextCompatibly(const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectInputStream >& _rxInStream);
410*b1cdbd2cSJim Jagielski 	void	writeHelpTextCompatibly(const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectOutputStream >& _rxOutStream);
411*b1cdbd2cSJim Jagielski 
412*b1cdbd2cSJim Jagielski 	void	doSetDelegator();
413*b1cdbd2cSJim Jagielski 	void	doResetDelegator();
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski 	::com::sun::star::uno::Sequence< ::rtl::OUString > getAggregateServiceNames();
416*b1cdbd2cSJim Jagielski 
417*b1cdbd2cSJim Jagielski public:
418*b1cdbd2cSJim Jagielski 	DECLARE_UNO3_AGG_DEFAULTS(OControl, OComponentHelper);
419*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Any SAL_CALL queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw (::com::sun::star::uno::RuntimeException);
420*b1cdbd2cSJim Jagielski 
421*b1cdbd2cSJim Jagielski // XTypeProvider
422*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Sequence<sal_Int8>			SAL_CALL getImplementationId() throw(::com::sun::star::uno::RuntimeException);
423*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type>	SAL_CALL getTypes() throw(::com::sun::star::uno::RuntimeException);
424*b1cdbd2cSJim Jagielski 
425*b1cdbd2cSJim Jagielski // OComponentHelper
426*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL disposing();
427*b1cdbd2cSJim Jagielski 
428*b1cdbd2cSJim Jagielski // XNamed
429*b1cdbd2cSJim Jagielski 	virtual ::rtl::OUString SAL_CALL	getName() throw(::com::sun::star::uno::RuntimeException);
430*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL				setName(const ::rtl::OUString& aName) throw(::com::sun::star::uno::RuntimeException);
431*b1cdbd2cSJim Jagielski 
432*b1cdbd2cSJim Jagielski // XServiceInfo
433*b1cdbd2cSJim Jagielski 	virtual sal_Bool SAL_CALL			supportsService(const ::rtl::OUString& ServiceName) throw (::com::sun::star::uno::RuntimeException);
434*b1cdbd2cSJim Jagielski 	virtual StringSequence SAL_CALL		getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException);
435*b1cdbd2cSJim Jagielski     virtual ::rtl::OUString SAL_CALL	getImplementationName() throw(::com::sun::star::uno::RuntimeException) = 0;
436*b1cdbd2cSJim Jagielski 
437*b1cdbd2cSJim Jagielski // XSericeInfo - static version(s)
438*b1cdbd2cSJim Jagielski 	static  StringSequence SAL_CALL		getSupportedServiceNames_Static() throw(::com::sun::star::uno::RuntimeException);
439*b1cdbd2cSJim Jagielski 
440*b1cdbd2cSJim Jagielski // XPersistObject
441*b1cdbd2cSJim Jagielski     virtual ::rtl::OUString SAL_CALL	getServiceName() throw(::com::sun::star::uno::RuntimeException) = 0;
442*b1cdbd2cSJim Jagielski     virtual void SAL_CALL
443*b1cdbd2cSJim Jagielski 		write(const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectOutputStream>& _rxOutStream) throw(::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException);
444*b1cdbd2cSJim Jagielski     virtual void SAL_CALL
445*b1cdbd2cSJim Jagielski 		read(const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectInputStream>& _rxInStream) throw(::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException);
446*b1cdbd2cSJim Jagielski 
447*b1cdbd2cSJim Jagielski // XChild (base of XFormComponent)
448*b1cdbd2cSJim Jagielski     virtual InterfaceRef SAL_CALL	getParent() throw(::com::sun::star::uno::RuntimeException);
449*b1cdbd2cSJim Jagielski     virtual void SAL_CALL			setParent(const InterfaceRef& Parent) throw(::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException);
450*b1cdbd2cSJim Jagielski 
451*b1cdbd2cSJim Jagielski // XEventListener
452*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw (::com::sun::star::uno::RuntimeException);
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski // XPropertySet
455*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL getFastPropertyValue(::com::sun::star::uno::Any& rValue, sal_Int32 nHandle) const;
456*b1cdbd2cSJim Jagielski 	virtual sal_Bool SAL_CALL convertFastPropertyValue(
457*b1cdbd2cSJim Jagielski 				::com::sun::star::uno::Any& _rConvertedValue, ::com::sun::star::uno::Any& _rOldValue, sal_Int32 _nHandle, const ::com::sun::star::uno::Any& _rValue )
458*b1cdbd2cSJim Jagielski 				throw (::com::sun::star::lang::IllegalArgumentException);
459*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue )
460*b1cdbd2cSJim Jagielski 				throw (::com::sun::star::uno::Exception);
461*b1cdbd2cSJim Jagielski     using ::cppu::OPropertySetHelper::getFastPropertyValue;
462*b1cdbd2cSJim Jagielski 
463*b1cdbd2cSJim Jagielski // ::com::sun::star::beans::XPropertyState
464*b1cdbd2cSJim Jagielski 	virtual	::com::sun::star::beans::PropertyState getPropertyStateByHandle(sal_Int32 nHandle);
465*b1cdbd2cSJim Jagielski 	virtual	void setPropertyToDefaultByHandle(sal_Int32 nHandle);
466*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Any getPropertyDefaultByHandle( sal_Int32 nHandle ) const;
467*b1cdbd2cSJim Jagielski 
468*b1cdbd2cSJim Jagielski // XCloneable
469*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloneable > SAL_CALL createClone(  ) throw (::com::sun::star::uno::RuntimeException) = 0;
470*b1cdbd2cSJim Jagielski 
471*b1cdbd2cSJim Jagielski // XPropertyContainer
472*b1cdbd2cSJim Jagielski     virtual void SAL_CALL addProperty( const ::rtl::OUString& Name, ::sal_Int16 Attributes, const ::com::sun::star::uno::Any& DefaultValue ) throw (::com::sun::star::beans::PropertyExistException, ::com::sun::star::beans::IllegalTypeException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
473*b1cdbd2cSJim Jagielski     virtual void SAL_CALL removeProperty( const ::rtl::OUString& Name ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::NotRemoveableException, ::com::sun::star::uno::RuntimeException);
474*b1cdbd2cSJim Jagielski 
475*b1cdbd2cSJim Jagielski // XPropertyAccess
476*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL getPropertyValues(  ) throw (::com::sun::star::uno::RuntimeException);
477*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setPropertyValues( const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aProps ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
478*b1cdbd2cSJim Jagielski 
479*b1cdbd2cSJim Jagielski protected:
480*b1cdbd2cSJim Jagielski     using OPropertySetAggregationHelper::setPropertyValues;
481*b1cdbd2cSJim Jagielski     using OPropertySetAggregationHelper::getPropertyValues;
482*b1cdbd2cSJim Jagielski 
483*b1cdbd2cSJim Jagielski protected:
484*b1cdbd2cSJim Jagielski     virtual void writeAggregate( const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectOutputStream >& _rxOutStream ) const;
485*b1cdbd2cSJim Jagielski     virtual void readAggregate( const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectInputStream >& _rxInStream );
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski protected:
488*b1cdbd2cSJim Jagielski 	// XPropertySet
489*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo> SAL_CALL getPropertySetInfo() throw( ::com::sun::star::uno::RuntimeException);
490*b1cdbd2cSJim Jagielski     // OPropertySetHelper
491*b1cdbd2cSJim Jagielski 	virtual cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper();
492*b1cdbd2cSJim Jagielski 
493*b1cdbd2cSJim Jagielski     /** describes the properties provided by this class, or its respective
494*b1cdbd2cSJim Jagielski         derived class
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski         Derived classes usually call the base class first, and then append own properties.
497*b1cdbd2cSJim Jagielski     */
498*b1cdbd2cSJim Jagielski 	virtual void describeFixedProperties(
499*b1cdbd2cSJim Jagielski 		::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >& /* [out] */ _rProps
500*b1cdbd2cSJim Jagielski     ) const;
501*b1cdbd2cSJim Jagielski 
502*b1cdbd2cSJim Jagielski     // IPropertyBagHelperContext
503*b1cdbd2cSJim Jagielski     virtual ::osl::Mutex&   getMutex();
504*b1cdbd2cSJim Jagielski     virtual void            describeFixedAndAggregateProperties(
505*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >& _out_rFixedProperties,
506*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >& _out_rAggregateProperties
507*b1cdbd2cSJim Jagielski     ) const;
508*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XMultiPropertySet >
509*b1cdbd2cSJim Jagielski                             getPropertiesInterface();
510*b1cdbd2cSJim Jagielski 
511*b1cdbd2cSJim Jagielski     /** describes the properties of our aggregate
512*b1cdbd2cSJim Jagielski 
513*b1cdbd2cSJim Jagielski         The default implementation simply asks m_xAggregateSet for its properties.
514*b1cdbd2cSJim Jagielski 
515*b1cdbd2cSJim Jagielski         You usually only need to overload this method if you want to filter the aggregate
516*b1cdbd2cSJim Jagielski         properties.
517*b1cdbd2cSJim Jagielski     */
518*b1cdbd2cSJim Jagielski     virtual void describeAggregateProperties(
519*b1cdbd2cSJim Jagielski 		::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >& /* [out] */ _rAggregateProps
520*b1cdbd2cSJim Jagielski     ) const;
521*b1cdbd2cSJim Jagielski 
522*b1cdbd2cSJim Jagielski public:
LockAccessfrm::OControlModel::LockAccess523*b1cdbd2cSJim Jagielski     struct LockAccess { friend class ControlModelLock; private: LockAccess() { } };
524*b1cdbd2cSJim Jagielski 
525*b1cdbd2cSJim Jagielski     void                lockInstance( LockAccess );
526*b1cdbd2cSJim Jagielski     oslInterlockedCount unlockInstance( LockAccess );
527*b1cdbd2cSJim Jagielski 
528*b1cdbd2cSJim Jagielski     void                firePropertyChanges(
529*b1cdbd2cSJim Jagielski                             const ::com::sun::star::uno::Sequence< sal_Int32 >& _rHandles,
530*b1cdbd2cSJim Jagielski                             const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& _rOldValues,
531*b1cdbd2cSJim Jagielski                             const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& _rNewValues,
532*b1cdbd2cSJim Jagielski                             LockAccess
533*b1cdbd2cSJim Jagielski                         );
534*b1cdbd2cSJim Jagielski 
535*b1cdbd2cSJim Jagielski     inline ::osl::Mutex&
getInstanceMutex()536*b1cdbd2cSJim Jagielski                         getInstanceMutex() { return m_aMutex; }
537*b1cdbd2cSJim Jagielski };
538*b1cdbd2cSJim Jagielski 
539*b1cdbd2cSJim Jagielski //==================================================================
540*b1cdbd2cSJim Jagielski // simple destructor
541*b1cdbd2cSJim Jagielski #define DECLARE_DEFAULT_DTOR( classname )	\
542*b1cdbd2cSJim Jagielski 	~classname() \
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski // constructor for cloning a class
545*b1cdbd2cSJim Jagielski #define DECLARE_DEFAULT_CLONE_CTOR( classname )  \
546*b1cdbd2cSJim Jagielski 	classname( \
547*b1cdbd2cSJim Jagielski 		const classname* _pOriginal, \
548*b1cdbd2cSJim Jagielski 		const	::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rxFactory \
549*b1cdbd2cSJim Jagielski 	); \
550*b1cdbd2cSJim Jagielski 
551*b1cdbd2cSJim Jagielski // all xtors for an inner class of the object hierarchy
552*b1cdbd2cSJim Jagielski #define DECLARE_DEFAULT_XTOR( classname )	\
553*b1cdbd2cSJim Jagielski 	classname( \
554*b1cdbd2cSJim Jagielski 		const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rxFactory, \
555*b1cdbd2cSJim Jagielski 		const ::rtl::OUString& _rUnoControlModelTypeName, \
556*b1cdbd2cSJim Jagielski 		const ::rtl::OUString& _rDefault \
557*b1cdbd2cSJim Jagielski 	); \
558*b1cdbd2cSJim Jagielski     DECLARE_DEFAULT_CLONE_CTOR( classname )  \
559*b1cdbd2cSJim Jagielski     DECLARE_DEFAULT_DTOR( classname )   \
560*b1cdbd2cSJim Jagielski 
561*b1cdbd2cSJim Jagielski // all xtors for an inner class of the object hierarchy which is *bound*
562*b1cdbd2cSJim Jagielski #define DECLARE_DEFAULT_BOUND_XTOR( classname )	\
563*b1cdbd2cSJim Jagielski 	classname( \
564*b1cdbd2cSJim Jagielski 		const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rxFactory, \
565*b1cdbd2cSJim Jagielski 		const ::rtl::OUString& _rUnoControlModelTypeName, \
566*b1cdbd2cSJim Jagielski 		const ::rtl::OUString& _rDefault, \
567*b1cdbd2cSJim Jagielski         const sal_Bool _bSupportExternalBinding, \
568*b1cdbd2cSJim Jagielski         const sal_Bool _bSupportsValidation \
569*b1cdbd2cSJim Jagielski 	); \
570*b1cdbd2cSJim Jagielski     DECLARE_DEFAULT_CLONE_CTOR( classname )  \
571*b1cdbd2cSJim Jagielski     DECLARE_DEFAULT_DTOR( classname )   \
572*b1cdbd2cSJim Jagielski 
573*b1cdbd2cSJim Jagielski // all xtors for a leas class of the object hierarchy
574*b1cdbd2cSJim Jagielski #define DECLARE_DEFAULT_LEAF_XTOR( classname )	\
575*b1cdbd2cSJim Jagielski 	classname( \
576*b1cdbd2cSJim Jagielski 		const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rxFactory \
577*b1cdbd2cSJim Jagielski 	); \
578*b1cdbd2cSJim Jagielski 	classname( \
579*b1cdbd2cSJim Jagielski 		const classname* _pOriginal, \
580*b1cdbd2cSJim Jagielski 		const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rxFactory \
581*b1cdbd2cSJim Jagielski 	); \
582*b1cdbd2cSJim Jagielski     DECLARE_DEFAULT_DTOR( classname )   \
583*b1cdbd2cSJim Jagielski 
584*b1cdbd2cSJim Jagielski //==================================================================
585*b1cdbd2cSJim Jagielski // XCloneable
586*b1cdbd2cSJim Jagielski #define DECLARE_XCLONEABLE( ) \
587*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloneable > SAL_CALL createClone(  ) throw (::com::sun::star::uno::RuntimeException)
588*b1cdbd2cSJim Jagielski 
589*b1cdbd2cSJim Jagielski #define IMPLEMENT_DEFAULT_CLONING( classname ) \
590*b1cdbd2cSJim Jagielski 	::com::sun::star::uno::Reference< ::com::sun::star::util::XCloneable > SAL_CALL classname::createClone( ) throw (::com::sun::star::uno::RuntimeException) \
591*b1cdbd2cSJim Jagielski 	{ \
592*b1cdbd2cSJim Jagielski         classname* pClone = new classname( this, getContext().getLegacyServiceFactory() ); \
593*b1cdbd2cSJim Jagielski         pClone->clonedFrom( this ); \
594*b1cdbd2cSJim Jagielski         return pClone; \
595*b1cdbd2cSJim Jagielski 	}
596*b1cdbd2cSJim Jagielski 
597*b1cdbd2cSJim Jagielski //==================================================================
598*b1cdbd2cSJim Jagielski //= OBoundControlModel
599*b1cdbd2cSJim Jagielski //= model of a form layer control which is bound to a data source field
600*b1cdbd2cSJim Jagielski //==================================================================
601*b1cdbd2cSJim Jagielski typedef ::cppu::ImplHelper4 <	::com::sun::star::form::XLoadListener
602*b1cdbd2cSJim Jagielski 						    ,   ::com::sun::star::form::XReset
603*b1cdbd2cSJim Jagielski 							,	::com::sun::star::beans::XPropertyChangeListener
604*b1cdbd2cSJim Jagielski 							,	::com::sun::star::sdb::XRowSetChangeListener
605*b1cdbd2cSJim Jagielski                             >	OBoundControlModel_BASE1;
606*b1cdbd2cSJim Jagielski 
607*b1cdbd2cSJim Jagielski // separated into an own base class since derivees can disable the support for this
608*b1cdbd2cSJim Jagielski // interface, thus we want to easily exclude it in the queryInterface and getTypes
609*b1cdbd2cSJim Jagielski typedef ::cppu::ImplHelper1 <   ::com::sun::star::form::XBoundComponent
610*b1cdbd2cSJim Jagielski                             >   OBoundControlModel_COMMITTING;
611*b1cdbd2cSJim Jagielski 
612*b1cdbd2cSJim Jagielski // dito
613*b1cdbd2cSJim Jagielski typedef ::cppu::ImplHelper2 <   ::com::sun::star::form::binding::XBindableValue
614*b1cdbd2cSJim Jagielski                             ,   ::com::sun::star::util::XModifyListener
615*b1cdbd2cSJim Jagielski                             >   OBoundControlModel_BINDING;
616*b1cdbd2cSJim Jagielski 
617*b1cdbd2cSJim Jagielski // dito
618*b1cdbd2cSJim Jagielski typedef ::cppu::ImplHelper2 <   ::com::sun::star::form::validation::XValidityConstraintListener
619*b1cdbd2cSJim Jagielski                             ,   ::com::sun::star::form::validation::XValidatableFormComponent
620*b1cdbd2cSJim Jagielski                             >   OBoundControlModel_VALIDATION;
621*b1cdbd2cSJim Jagielski 
622*b1cdbd2cSJim Jagielski class OBoundControlModel	:public OControlModel
623*b1cdbd2cSJim Jagielski 							,public OBoundControlModel_BASE1
624*b1cdbd2cSJim Jagielski 							,public OBoundControlModel_COMMITTING
625*b1cdbd2cSJim Jagielski 							,public OBoundControlModel_BINDING
626*b1cdbd2cSJim Jagielski                             ,public OBoundControlModel_VALIDATION
627*b1cdbd2cSJim Jagielski                             ,public ::comphelper::OPropertyChangeListener
628*b1cdbd2cSJim Jagielski {
629*b1cdbd2cSJim Jagielski protected:
630*b1cdbd2cSJim Jagielski     enum ValueChangeInstigator
631*b1cdbd2cSJim Jagielski     {
632*b1cdbd2cSJim Jagielski         eDbColumnBinding,
633*b1cdbd2cSJim Jagielski         eExternalBinding,
634*b1cdbd2cSJim Jagielski         eOther
635*b1cdbd2cSJim Jagielski     };
636*b1cdbd2cSJim Jagielski 
637*b1cdbd2cSJim Jagielski private:
638*b1cdbd2cSJim Jagielski 	::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
639*b1cdbd2cSJim Jagielski                                         m_xField;
640*b1cdbd2cSJim Jagielski     // the form which controls supplies the field we bind to.
641*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Reference< ::com::sun::star::form::XLoadable >
642*b1cdbd2cSJim Jagielski                                         m_xAmbientForm;
643*b1cdbd2cSJim Jagielski 
644*b1cdbd2cSJim Jagielski 	::rtl::OUString					    m_sValuePropertyName;
645*b1cdbd2cSJim Jagielski     sal_Int32                           m_nValuePropertyAggregateHandle;
646*b1cdbd2cSJim Jagielski     sal_Int32                           m_nFieldType;
647*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Type         m_aValuePropertyType;
648*b1cdbd2cSJim Jagielski     bool                                m_bValuePropertyMayBeVoid;
649*b1cdbd2cSJim Jagielski 
650*b1cdbd2cSJim Jagielski     ResetHelper                         m_aResetHelper;
651*b1cdbd2cSJim Jagielski     ::cppu::OInterfaceContainerHelper   m_aUpdateListeners;
652*b1cdbd2cSJim Jagielski     ::cppu::OInterfaceContainerHelper   m_aFormComponentListeners;
653*b1cdbd2cSJim Jagielski 
654*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XValueBinding >
655*b1cdbd2cSJim Jagielski                                         m_xExternalBinding;
656*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Reference< ::com::sun::star::form::validation::XValidator >
657*b1cdbd2cSJim Jagielski                                         m_xValidator;
658*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Type         m_aExternalValueType;
659*b1cdbd2cSJim Jagielski 
660*b1cdbd2cSJim Jagielski // <properties>
661*b1cdbd2cSJim Jagielski 	::rtl::OUString						m_aControlSource;			// Datenquelle, Name des Feldes
662*b1cdbd2cSJim Jagielski 	::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
663*b1cdbd2cSJim Jagielski                                         m_xLabelControl;			// reference to a sibling control (model) which is our label
664*b1cdbd2cSJim Jagielski     sal_Bool                            m_bInputRequired;
665*b1cdbd2cSJim Jagielski // </properties>
666*b1cdbd2cSJim Jagielski 
667*b1cdbd2cSJim Jagielski     ::comphelper::OPropertyChangeMultiplexer*
668*b1cdbd2cSJim Jagielski                                 m_pAggPropMultiplexer;
669*b1cdbd2cSJim Jagielski 
670*b1cdbd2cSJim Jagielski     bool                        m_bFormListening            : 1;    // are we currently a XLoadListener at our ambient form?
671*b1cdbd2cSJim Jagielski 	sal_Bool					m_bLoaded		            : 1;
672*b1cdbd2cSJim Jagielski 	sal_Bool					m_bRequired		            : 1;
673*b1cdbd2cSJim Jagielski 	const sal_Bool              m_bCommitable	            : 1;    // do we support XBoundComponent?
674*b1cdbd2cSJim Jagielski     const sal_Bool              m_bSupportsExternalBinding  : 1;    // do we support XBindableValue?
675*b1cdbd2cSJim Jagielski     const sal_Bool			    m_bSupportsValidation       : 1;    // do we support XValidatable?
676*b1cdbd2cSJim Jagielski 	sal_Bool					m_bForwardValueChanges      : 1;    // do we currently handle changes in the bound database field?
677*b1cdbd2cSJim Jagielski     sal_Bool			        m_bTransferingValue         : 1;    // true if we're currently transfering our value to an external binding
678*b1cdbd2cSJim Jagielski     sal_Bool                    m_bIsCurrentValueValid      : 1;    // flag specifying whether our current value is valid, relative to our external validator
679*b1cdbd2cSJim Jagielski     sal_Bool                    m_bBindingControlsRO        : 1;    // is our ReadOnly property currently controlled by our external binding?
680*b1cdbd2cSJim Jagielski     sal_Bool                    m_bBindingControlsEnable    : 1;    // is our Enabled property currently controlled by our external binding?
681*b1cdbd2cSJim Jagielski 
682*b1cdbd2cSJim Jagielski     ValueChangeInstigator       m_eControlValueChangeInstigator;
683*b1cdbd2cSJim Jagielski 
684*b1cdbd2cSJim Jagielski protected:
685*b1cdbd2cSJim Jagielski 	::rtl::OUString					    m_aLabelServiceName;
686*b1cdbd2cSJim Jagielski 		// when setting the label for our control (property FM_PROP_CONTROLLABEL, member m_xLabelControl),
687*b1cdbd2cSJim Jagielski 		// we accept only objects supporting an XControlModel interface, an XServiceInfo interface and
688*b1cdbd2cSJim Jagielski 		// support for a service (XServiceInfo::supportsService) determined by this string.
689*b1cdbd2cSJim Jagielski 		// Any other arguments will throw an IllegalArgumentException.
690*b1cdbd2cSJim Jagielski 		// The default value is FM_COMPONENT_FIXEDTEXT.
691*b1cdbd2cSJim Jagielski 
692*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet >
693*b1cdbd2cSJim Jagielski                                         m_xCursor;
694*b1cdbd2cSJim Jagielski 	::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumnUpdate >
695*b1cdbd2cSJim Jagielski                                         m_xColumnUpdate;
696*b1cdbd2cSJim Jagielski 	::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >
697*b1cdbd2cSJim Jagielski                                         m_xColumn;
698*b1cdbd2cSJim Jagielski 
699*b1cdbd2cSJim Jagielski protected:
getValuePropertyName() const700*b1cdbd2cSJim Jagielski     inline const ::rtl::OUString&   getValuePropertyName( ) const       { return m_sValuePropertyName; }
getValuePropertyAggHandle() const701*b1cdbd2cSJim Jagielski     inline sal_Int32                getValuePropertyAggHandle( ) const  { return m_nValuePropertyAggregateHandle; }
getControlSource() const702*b1cdbd2cSJim Jagielski     inline const ::rtl::OUString&   getControlSource( ) const           { return m_aControlSource; }
isRequired() const703*b1cdbd2cSJim Jagielski     inline sal_Bool                 isRequired() const                  { return m_bRequired; }
isLoaded() const704*b1cdbd2cSJim Jagielski     inline sal_Bool                 isLoaded() const                    { return m_bLoaded; }
705*b1cdbd2cSJim Jagielski 
706*b1cdbd2cSJim Jagielski protected:
707*b1cdbd2cSJim Jagielski 
708*b1cdbd2cSJim Jagielski 	OBoundControlModel(
709*b1cdbd2cSJim Jagielski 		const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rFactory,
710*b1cdbd2cSJim Jagielski                                                             // factory to create the aggregate with
711*b1cdbd2cSJim Jagielski 		const ::rtl::OUString& _rUnoControlModelTypeName,	// service name of te model to aggregate
712*b1cdbd2cSJim Jagielski 		const ::rtl::OUString& _rDefault,					// service name of the default control
713*b1cdbd2cSJim Jagielski 		const sal_Bool _bCommitable,						// is the control (model) commitable ?
714*b1cdbd2cSJim Jagielski         const sal_Bool _bSupportExternalBinding,            // set to sal_True if you want to support XBindableValue
715*b1cdbd2cSJim Jagielski         const sal_Bool _bSupportsValidation                 // set to sal_True if you want to support XValidatable
716*b1cdbd2cSJim Jagielski 	);
717*b1cdbd2cSJim Jagielski 	OBoundControlModel(
718*b1cdbd2cSJim Jagielski 		const OBoundControlModel* _pOriginal,				// the original object to clone
719*b1cdbd2cSJim Jagielski 		const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rFactory
720*b1cdbd2cSJim Jagielski                                                             // factory to create the aggregate with
721*b1cdbd2cSJim Jagielski 	);
722*b1cdbd2cSJim Jagielski 	virtual ~OBoundControlModel();
723*b1cdbd2cSJim Jagielski 
724*b1cdbd2cSJim Jagielski     /// late ctor after cloning
725*b1cdbd2cSJim Jagielski     virtual void clonedFrom( const OControlModel* _pOriginal );
726*b1cdbd2cSJim Jagielski 
727*b1cdbd2cSJim Jagielski     /** initializes the part of the class which is related to the control value.
728*b1cdbd2cSJim Jagielski 
729*b1cdbd2cSJim Jagielski         <p>Kind of late ctor, to be called for derivees which have a dedicated value property.<br/>
730*b1cdbd2cSJim Jagielski         The value property is the property which's value is synced with either the database
731*b1cdbd2cSJim Jagielski         column the object is bound to, or with the external value binding, if present.<br/>
732*b1cdbd2cSJim Jagielski         E.g. for a text control model, this property will most probably be "Text".</p>
733*b1cdbd2cSJim Jagielski 
734*b1cdbd2cSJim Jagielski         <p>Derived classes are stronly recommend to call this method - at least the
735*b1cdbd2cSJim Jagielski         "DataFieldProperty" (exposed in getFastPropertyValue) relies on the information
736*b1cdbd2cSJim Jagielski         given herein, and needs to be supplied otherwise else.</p>
737*b1cdbd2cSJim Jagielski 
738*b1cdbd2cSJim Jagielski         <p>If this method has been called properly, then <member>setControlValue</member>
739*b1cdbd2cSJim Jagielski         does not need to be overridden - it will simply set the property value at the
740*b1cdbd2cSJim Jagielski         aggregate then.</p>
741*b1cdbd2cSJim Jagielski 
742*b1cdbd2cSJim Jagielski         @precond
743*b1cdbd2cSJim Jagielski             The method has not be called before during the life time of the object.
744*b1cdbd2cSJim Jagielski 
745*b1cdbd2cSJim Jagielski         @param _rValuePropertyName
746*b1cdbd2cSJim Jagielski             the name of the value property
747*b1cdbd2cSJim Jagielski         @param _nValuePropertyExternalHandle
748*b1cdbd2cSJim Jagielski             the handle of the property, as exposed to external components.<br/>
749*b1cdbd2cSJim Jagielski             Normally, this information can be obtained dynamically (e.g. from describeFixedProperties),
750*b1cdbd2cSJim Jagielski             but since this method is to be called from within the constructor of derived classes,
751*b1cdbd2cSJim Jagielski             we prefer to be on the *really* safe side here ....
752*b1cdbd2cSJim Jagielski 
753*b1cdbd2cSJim Jagielski         @see setControlValue
754*b1cdbd2cSJim Jagielski         @see suspendValueListening
755*b1cdbd2cSJim Jagielski         @see resumeValueListening
756*b1cdbd2cSJim Jagielski         @see describeFixedProperties
757*b1cdbd2cSJim Jagielski     */
758*b1cdbd2cSJim Jagielski     void                    initValueProperty(
759*b1cdbd2cSJim Jagielski                                 const ::rtl::OUString& _rValuePropertyName,
760*b1cdbd2cSJim Jagielski                                 sal_Int32 _nValuePropertyExternalHandle
761*b1cdbd2cSJim Jagielski                             );
762*b1cdbd2cSJim Jagielski 
763*b1cdbd2cSJim Jagielski     /** initializes the part of the class which is related to the control value.
764*b1cdbd2cSJim Jagielski 
765*b1cdbd2cSJim Jagielski         <p>In opposite to ->initValueProperty, this method is to be used for value properties which are <em>not</em>
766*b1cdbd2cSJim Jagielski         implemented by our aggregate, but by ourselves.</p>
767*b1cdbd2cSJim Jagielski 
768*b1cdbd2cSJim Jagielski         <p>Certain functionality is not available when using own value properties. This includes binding to an external
769*b1cdbd2cSJim Jagielski         value and external validation. (This is not a conceptual limit, but simply missing implementation.)</p>
770*b1cdbd2cSJim Jagielski     */
771*b1cdbd2cSJim Jagielski     void                    initOwnValueProperty(
772*b1cdbd2cSJim Jagielski                                 const ::rtl::OUString& i_rValuePropertyName
773*b1cdbd2cSJim Jagielski                             );
774*b1cdbd2cSJim Jagielski 
775*b1cdbd2cSJim Jagielski     /** suspends listening at the value property
776*b1cdbd2cSJim Jagielski 
777*b1cdbd2cSJim Jagielski         <p>As long as this listening is suspended, changes in the value property will not be
778*b1cdbd2cSJim Jagielski         recognized and not be handled.</p>
779*b1cdbd2cSJim Jagielski 
780*b1cdbd2cSJim Jagielski         @see initValueProperty
781*b1cdbd2cSJim Jagielski         @see resumeValueListening
782*b1cdbd2cSJim Jagielski     */
783*b1cdbd2cSJim Jagielski     void                    suspendValueListening( );
784*b1cdbd2cSJim Jagielski 
785*b1cdbd2cSJim Jagielski     /** resumes listening at the value property
786*b1cdbd2cSJim Jagielski 
787*b1cdbd2cSJim Jagielski         <p>As long as this listening is suspended, changes in the value property will not be
788*b1cdbd2cSJim Jagielski         recognized and not be handled.</p>
789*b1cdbd2cSJim Jagielski 
790*b1cdbd2cSJim Jagielski         @precond
791*b1cdbd2cSJim Jagielski             listening at the value property is currently suspended
792*b1cdbd2cSJim Jagielski 
793*b1cdbd2cSJim Jagielski         @see initValueProperty
794*b1cdbd2cSJim Jagielski         @see resumeValueListening
795*b1cdbd2cSJim Jagielski     */
796*b1cdbd2cSJim Jagielski     void                    resumeValueListening( );
797*b1cdbd2cSJim Jagielski 
798*b1cdbd2cSJim Jagielski     /** (to be) called when the value property changed
799*b1cdbd2cSJim Jagielski 
800*b1cdbd2cSJim Jagielski         Normally, this is done automatically, since the value property is a property of our aggregate, and we're
801*b1cdbd2cSJim Jagielski         a listener at this property.
802*b1cdbd2cSJim Jagielski         However, in some cases the value property might not be an aggregate property, but a property of the
803*b1cdbd2cSJim Jagielski         delegator instance. In this case, you'll need to call <code>onValuePropertyChange</code> whenever this
804*b1cdbd2cSJim Jagielski         property changes.
805*b1cdbd2cSJim Jagielski     */
806*b1cdbd2cSJim Jagielski     void                    onValuePropertyChange( ControlModelLock& i_rControLock );
807*b1cdbd2cSJim Jagielski 
808*b1cdbd2cSJim Jagielski     /** starts listening at the aggregate, for changes in the given property
809*b1cdbd2cSJim Jagielski 
810*b1cdbd2cSJim Jagielski         <p>The OBoundControlModel automatically registers a multiplexer which listens for
811*b1cdbd2cSJim Jagielski         changes in the aggregate property values. By default, only the control value property
812*b1cdbd2cSJim Jagielski         is observed. You may add additional properties to be observed with this method.</p>
813*b1cdbd2cSJim Jagielski 
814*b1cdbd2cSJim Jagielski         @see initValueProperty
815*b1cdbd2cSJim Jagielski         @see _propertyChanged
816*b1cdbd2cSJim Jagielski     */
817*b1cdbd2cSJim Jagielski     void                    startAggregatePropertyListening( const ::rtl::OUString& _rPropertyName );
818*b1cdbd2cSJim Jagielski 
819*b1cdbd2cSJim Jagielski     /** returns the default which should be used when resetting the control
820*b1cdbd2cSJim Jagielski 
821*b1cdbd2cSJim Jagielski         <p>The default implementation returns an empty Any.</p>
822*b1cdbd2cSJim Jagielski 
823*b1cdbd2cSJim Jagielski         @see resetNoBroadcast
824*b1cdbd2cSJim Jagielski     */
825*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Any
826*b1cdbd2cSJim Jagielski                             getDefaultForReset() const;
827*b1cdbd2cSJim Jagielski 
828*b1cdbd2cSJim Jagielski     /** translates a db column value into a control value.
829*b1cdbd2cSJim Jagielski 
830*b1cdbd2cSJim Jagielski         <p>Must transform the very current value of the database column we're bound to
831*b1cdbd2cSJim Jagielski         (<member>m_xColumn</member>) into a value which can be used as current value
832*b1cdbd2cSJim Jagielski         for the control.</p>
833*b1cdbd2cSJim Jagielski 
834*b1cdbd2cSJim Jagielski         @see setControlValue
835*b1cdbd2cSJim Jagielski         @pure
836*b1cdbd2cSJim Jagielski     */
837*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Any
838*b1cdbd2cSJim Jagielski                             translateDbColumnToControlValue( ) = 0;
839*b1cdbd2cSJim Jagielski 
840*b1cdbd2cSJim Jagielski     /** returns the data types which the control could use to exchange data with
841*b1cdbd2cSJim Jagielski         an external value binding
842*b1cdbd2cSJim Jagielski 
843*b1cdbd2cSJim Jagielski         The types returned here are completely independent from the concrete value binding,
844*b1cdbd2cSJim Jagielski         they're just candidates which depend on the control type, and possible the concrete state
845*b1cdbd2cSJim Jagielski         of the control (i.e. some property value).
846*b1cdbd2cSJim Jagielski 
847*b1cdbd2cSJim Jagielski         If a control implementation supports multiple types, the ordering in the returned
848*b1cdbd2cSJim Jagielski         sequence indicates preference: Preferred types are mentioned first.
849*b1cdbd2cSJim Jagielski 
850*b1cdbd2cSJim Jagielski         The default implementation returns the type of our value property.
851*b1cdbd2cSJim Jagielski     */
852*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type >
853*b1cdbd2cSJim Jagielski                             getSupportedBindingTypes();
854*b1cdbd2cSJim Jagielski 
855*b1cdbd2cSJim Jagielski     /** translates the given value, which was obtained from the current external value binding,
856*b1cdbd2cSJim Jagielski         to a value which can be used in setControlValue
857*b1cdbd2cSJim Jagielski 
858*b1cdbd2cSJim Jagielski         <p>The default implementation returns the value itself, exception when it is VOID, and
859*b1cdbd2cSJim Jagielski         our value property is not allowed to be void - in this case, the returned value is a
860*b1cdbd2cSJim Jagielski         default-constructed value of the type required by our value property.
861*b1cdbd2cSJim Jagielski 
862*b1cdbd2cSJim Jagielski         @see hasExternalValueBinding
863*b1cdbd2cSJim Jagielski         @see getExternalValueType
864*b1cdbd2cSJim Jagielski     */
865*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Any
866*b1cdbd2cSJim Jagielski                             translateExternalValueToControlValue( const ::com::sun::star::uno::Any& _rExternalValue ) const;
867*b1cdbd2cSJim Jagielski 
868*b1cdbd2cSJim Jagielski     /** commits the current control value to our external value binding
869*b1cdbd2cSJim Jagielski 
870*b1cdbd2cSJim Jagielski         <p>The default implementation simply calls getControlValue.</p>
871*b1cdbd2cSJim Jagielski 
872*b1cdbd2cSJim Jagielski         @see hasExternalValueBinding
873*b1cdbd2cSJim Jagielski         @see initValueProperty
874*b1cdbd2cSJim Jagielski     */
875*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Any
876*b1cdbd2cSJim Jagielski                             translateControlValueToExternalValue( ) const;
877*b1cdbd2cSJim Jagielski 
878*b1cdbd2cSJim Jagielski     /** commits the current control value to the database column we're bound to
879*b1cdbd2cSJim Jagielski         @precond
880*b1cdbd2cSJim Jagielski             we're properly bound to a database column, especially <member>m_xColumnUpdate</member>
881*b1cdbd2cSJim Jagielski             is not <NULL/>
882*b1cdbd2cSJim Jagielski         @param _bPostReset
883*b1cdbd2cSJim Jagielski             <TRUE/> if and only if the current control value results from a reset (<member>getDefaultForReset</member>)
884*b1cdbd2cSJim Jagielski         @pure
885*b1cdbd2cSJim Jagielski     */
886*b1cdbd2cSJim Jagielski     virtual sal_Bool        commitControlValueToDbColumn(
887*b1cdbd2cSJim Jagielski                                 bool _bPostReset
888*b1cdbd2cSJim Jagielski                             ) = 0;
889*b1cdbd2cSJim Jagielski 
890*b1cdbd2cSJim Jagielski     /** sets the given value as new current value for the control
891*b1cdbd2cSJim Jagielski 
892*b1cdbd2cSJim Jagielski         Besides some administrative work (such as caring for <member>m_eControlValueChangeInstigator</member>),
893*b1cdbd2cSJim Jagielski         this method simply calls <member>doSetControlValue</member>.
894*b1cdbd2cSJim Jagielski 
895*b1cdbd2cSJim Jagielski         @precond
896*b1cdbd2cSJim Jagielski             Our own mutex is locked.
897*b1cdbd2cSJim Jagielski         @param _rValue
898*b1cdbd2cSJim Jagielski             The value to set. This value is guaranteed to be created by
899*b1cdbd2cSJim Jagielski             <member>translateDbColumnToControlValue</member> or
900*b1cdbd2cSJim Jagielski             <member>translateExternalValueToControlValue</member>
901*b1cdbd2cSJim Jagielski         @param _eInstigator
902*b1cdbd2cSJim Jagielski             the instigator of the value change
903*b1cdbd2cSJim Jagielski     */
904*b1cdbd2cSJim Jagielski             void            setControlValue(
905*b1cdbd2cSJim Jagielski                                 const ::com::sun::star::uno::Any& _rValue,
906*b1cdbd2cSJim Jagielski                                 ValueChangeInstigator _eInstigator
907*b1cdbd2cSJim Jagielski                             );
908*b1cdbd2cSJim Jagielski     /**
909*b1cdbd2cSJim Jagielski         <p>The default implementation will forward the given value to the aggregate, using
910*b1cdbd2cSJim Jagielski         m_nValuePropertyAggregateHandle and/or m_sValuePropertyName.</p>
911*b1cdbd2cSJim Jagielski 
912*b1cdbd2cSJim Jagielski         @precond
913*b1cdbd2cSJim Jagielski             Our own mutex is locked.
914*b1cdbd2cSJim Jagielski         @param _rValue
915*b1cdbd2cSJim Jagielski             The value to set. This value is guaranteed to be created by
916*b1cdbd2cSJim Jagielski             <member>translateDbColumnToControlValue</member> or
917*b1cdbd2cSJim Jagielski             <member>translateExternalValueToControlValue</member>
918*b1cdbd2cSJim Jagielski     */
919*b1cdbd2cSJim Jagielski     virtual void            doSetControlValue(
920*b1cdbd2cSJim Jagielski                                 const ::com::sun::star::uno::Any& _rValue
921*b1cdbd2cSJim Jagielski                             );
922*b1cdbd2cSJim Jagielski 
923*b1cdbd2cSJim Jagielski     /** retrieves the current value of the control
924*b1cdbd2cSJim Jagielski 
925*b1cdbd2cSJim Jagielski         <p>The default implementation will ask the aggregate for the property value
926*b1cdbd2cSJim Jagielski         determined by either m_nValuePropertyAggregateHandle and/or m_sValuePropertyName.</p>
927*b1cdbd2cSJim Jagielski 
928*b1cdbd2cSJim Jagielski         @precond
929*b1cdbd2cSJim Jagielski             Our own mutex is locked.
930*b1cdbd2cSJim Jagielski     */
931*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Any
932*b1cdbd2cSJim Jagielski                             getControlValue( ) const;
933*b1cdbd2cSJim Jagielski 
934*b1cdbd2cSJim Jagielski     /** called whenever a connection to a database column has been established
935*b1cdbd2cSJim Jagielski     */
936*b1cdbd2cSJim Jagielski 	virtual void            onConnectedDbColumn( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxForm );
937*b1cdbd2cSJim Jagielski     /** called whenever a connection to a database column has been suspended
938*b1cdbd2cSJim Jagielski     */
939*b1cdbd2cSJim Jagielski 	virtual void            onDisconnectedDbColumn();
940*b1cdbd2cSJim Jagielski 
941*b1cdbd2cSJim Jagielski     /** called whenever a connection to an external supplier of values (XValueBinding) has been established
942*b1cdbd2cSJim Jagielski         @see m_xExternalBinding
943*b1cdbd2cSJim Jagielski     */
944*b1cdbd2cSJim Jagielski 	virtual void            onConnectedExternalValue( );
945*b1cdbd2cSJim Jagielski     /** called whenever a connection to an external supplier of values (XValueBinding) has been suspended
946*b1cdbd2cSJim Jagielski     */
947*b1cdbd2cSJim Jagielski 	virtual void            onDisconnectedExternalValue();
948*b1cdbd2cSJim Jagielski 
949*b1cdbd2cSJim Jagielski     /** called whenever an external validator has been registered
950*b1cdbd2cSJim Jagielski     */
951*b1cdbd2cSJim Jagielski 	virtual void            onConnectedValidator( );
952*b1cdbd2cSJim Jagielski     /** called whenever an external validator has been revoked
953*b1cdbd2cSJim Jagielski     */
954*b1cdbd2cSJim Jagielski 	virtual void            onDisconnectedValidator( );
955*b1cdbd2cSJim Jagielski 
956*b1cdbd2cSJim Jagielski 	/**	nFieldType ist der Typ des Feldes, an das das Model gebunden werden soll.
957*b1cdbd2cSJim Jagielski 		Das Binden erfolgt genau dann, wenn Rueckgabewert sal_True.
958*b1cdbd2cSJim Jagielski 		Die Standard-Implementation erlaubt alles ausser den drei binary-Typen und
959*b1cdbd2cSJim Jagielski 		FieldType_OTHER.
960*b1cdbd2cSJim Jagielski 	*/
961*b1cdbd2cSJim Jagielski 	virtual sal_Bool		approveDbColumnType(sal_Int32 _nColumnType);
962*b1cdbd2cSJim Jagielski 
963*b1cdbd2cSJim Jagielski     /** retrieves the current value of the control, in a shape which can be used with our
964*b1cdbd2cSJim Jagielski         external validator.
965*b1cdbd2cSJim Jagielski 
966*b1cdbd2cSJim Jagielski         The default implementation simply calls <member>>translateControlValueToExternalValue</member>.
967*b1cdbd2cSJim Jagielski 
968*b1cdbd2cSJim Jagielski         @precond
969*b1cdbd2cSJim Jagielski             Our own mutex is locked.
970*b1cdbd2cSJim Jagielski     */
971*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Any
972*b1cdbd2cSJim Jagielski                             translateControlValueToValidatableValue( ) const;
973*b1cdbd2cSJim Jagielski 
974*b1cdbd2cSJim Jagielski     /** retrieves the current value of the form component
975*b1cdbd2cSJim Jagielski 
976*b1cdbd2cSJim Jagielski         This is the implementation method for XValidatableFormComponent::getCurrentValue. The default implementation
977*b1cdbd2cSJim Jagielski         calls translateControlValueToValidatableValue if a validator is present, otherwise getControlValue.
978*b1cdbd2cSJim Jagielski 
979*b1cdbd2cSJim Jagielski         @precond
980*b1cdbd2cSJim Jagielski             our mutex is locked when this method is called
981*b1cdbd2cSJim Jagielski     */
982*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Any
983*b1cdbd2cSJim Jagielski                             getCurrentFormComponentValue() const;
984*b1cdbd2cSJim Jagielski 
985*b1cdbd2cSJim Jagielski 	/** We can't write (new) common properties in this base class, as the file format doesn't allow this
986*b1cdbd2cSJim Jagielski 	    (unfortunally). So derived classes may use the following to methods. They secure the written
987*b1cdbd2cSJim Jagielski 	    data with marks, so any new common properties in newer versions will be skipped by older ones.
988*b1cdbd2cSJim Jagielski     */
989*b1cdbd2cSJim Jagielski 	void	writeCommonProperties(const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectOutputStream>& _rxOutStream);
990*b1cdbd2cSJim Jagielski 	void	readCommonProperties(const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectInputStream>& _rxInStream);
991*b1cdbd2cSJim Jagielski 	// the next method may be used in derived classes's read when an unknown version is encountered
992*b1cdbd2cSJim Jagielski 	void	defaultCommonProperties();
993*b1cdbd2cSJim Jagielski 
994*b1cdbd2cSJim Jagielski     /** called to reset the control to some kind of default.
995*b1cdbd2cSJim Jagielski 
996*b1cdbd2cSJim Jagielski         <p>The semantics of "default" is finally defined by the derived class (in particular,
997*b1cdbd2cSJim Jagielski         by <member>getDefaultForReset</member>).</p>
998*b1cdbd2cSJim Jagielski 
999*b1cdbd2cSJim Jagielski         <p>No listener notification needs to be done in the derived class.</p>
1000*b1cdbd2cSJim Jagielski 
1001*b1cdbd2cSJim Jagielski         <p>Normally, you won't override this method, but <member>getDefaultForReset</member> instead.</p>
1002*b1cdbd2cSJim Jagielski 
1003*b1cdbd2cSJim Jagielski         @see getDefaultForReset
1004*b1cdbd2cSJim Jagielski     */
1005*b1cdbd2cSJim Jagielski 	virtual void            resetNoBroadcast();
1006*b1cdbd2cSJim Jagielski 
1007*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type>	_getTypes();
1008*b1cdbd2cSJim Jagielski 
1009*b1cdbd2cSJim Jagielski     /// sets m_xField to the given new value, without notifying our listeners
1010*b1cdbd2cSJim Jagielski 	void    impl_setField_noNotify(
1011*b1cdbd2cSJim Jagielski                 const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _rxField
1012*b1cdbd2cSJim Jagielski             );
hasField() const1013*b1cdbd2cSJim Jagielski     inline bool hasField() const
1014*b1cdbd2cSJim Jagielski     {
1015*b1cdbd2cSJim Jagielski         return m_xField.is();
1016*b1cdbd2cSJim Jagielski     }
getFieldType() const1017*b1cdbd2cSJim Jagielski     inline sal_Int32 getFieldType() const
1018*b1cdbd2cSJim Jagielski     {
1019*b1cdbd2cSJim Jagielski         return m_nFieldType;
1020*b1cdbd2cSJim Jagielski     }
1021*b1cdbd2cSJim Jagielski 
1022*b1cdbd2cSJim Jagielski     // OControlModel's property handling
1023*b1cdbd2cSJim Jagielski 	virtual void describeFixedProperties(
1024*b1cdbd2cSJim Jagielski 		::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >& /* [out] */ _rProps
1025*b1cdbd2cSJim Jagielski     ) const;
1026*b1cdbd2cSJim Jagielski 
1027*b1cdbd2cSJim Jagielski public:
getField() const1028*b1cdbd2cSJim Jagielski 	inline const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& getField() const
1029*b1cdbd2cSJim Jagielski 	{
1030*b1cdbd2cSJim Jagielski 		return m_xField;
1031*b1cdbd2cSJim Jagielski 	}
1032*b1cdbd2cSJim Jagielski 
1033*b1cdbd2cSJim Jagielski public:
1034*b1cdbd2cSJim Jagielski 	// UNO Anbindung
1035*b1cdbd2cSJim Jagielski 	DECLARE_UNO3_AGG_DEFAULTS(OBoundControlModel, OControlModel);
1036*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Any SAL_CALL queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw (::com::sun::star::uno::RuntimeException);
1037*b1cdbd2cSJim Jagielski 
1038*b1cdbd2cSJim Jagielski     // OComponentHelper
1039*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL disposing();
1040*b1cdbd2cSJim Jagielski 
1041*b1cdbd2cSJim Jagielski     // XReset
1042*b1cdbd2cSJim Jagielski     virtual void SAL_CALL reset(  ) throw(::com::sun::star::uno::RuntimeException);
1043*b1cdbd2cSJim Jagielski     virtual void SAL_CALL addResetListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XResetListener >& aListener ) throw(::com::sun::star::uno::RuntimeException);
1044*b1cdbd2cSJim Jagielski     virtual void SAL_CALL removeResetListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XResetListener >& aListener ) throw(::com::sun::star::uno::RuntimeException);
1045*b1cdbd2cSJim Jagielski 
1046*b1cdbd2cSJim Jagielski     // XServiceInfo
1047*b1cdbd2cSJim Jagielski     virtual StringSequence SAL_CALL getSupportedServiceNames(  ) throw(::com::sun::star::uno::RuntimeException);
1048*b1cdbd2cSJim Jagielski 
1049*b1cdbd2cSJim Jagielski     // XServiceInfo - static version
1050*b1cdbd2cSJim Jagielski 	static  StringSequence SAL_CALL	getSupportedServiceNames_Static() throw(::com::sun::star::uno::RuntimeException);
1051*b1cdbd2cSJim Jagielski 
1052*b1cdbd2cSJim Jagielski     // XChild
1053*b1cdbd2cSJim Jagielski     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);
1054*b1cdbd2cSJim Jagielski 
1055*b1cdbd2cSJim Jagielski     // XPersistObject
1056*b1cdbd2cSJim Jagielski     virtual void SAL_CALL write( const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectOutputStream >& OutStream ) throw(::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException);
1057*b1cdbd2cSJim Jagielski     virtual void SAL_CALL read( const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectInputStream >& InStream ) throw(::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException);
1058*b1cdbd2cSJim Jagielski 
1059*b1cdbd2cSJim Jagielski     // XBoundComponent
1060*b1cdbd2cSJim Jagielski     virtual sal_Bool SAL_CALL commit() throw(::com::sun::star::uno::RuntimeException);
1061*b1cdbd2cSJim Jagielski 
1062*b1cdbd2cSJim Jagielski     // XUpdateBroadcaster (base of XBoundComponent)
1063*b1cdbd2cSJim Jagielski     virtual void SAL_CALL addUpdateListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XUpdateListener >& aListener ) throw(::com::sun::star::uno::RuntimeException);
1064*b1cdbd2cSJim Jagielski     virtual void SAL_CALL removeUpdateListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XUpdateListener >& aListener ) throw(::com::sun::star::uno::RuntimeException);
1065*b1cdbd2cSJim Jagielski 
1066*b1cdbd2cSJim Jagielski     // XPropertySet
1067*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL getFastPropertyValue(::com::sun::star::uno::Any& rValue, sal_Int32 nHandle) const;
1068*b1cdbd2cSJim Jagielski 	virtual sal_Bool SAL_CALL convertFastPropertyValue(
1069*b1cdbd2cSJim Jagielski 				::com::sun::star::uno::Any& _rConvertedValue, ::com::sun::star::uno::Any& _rOldValue, sal_Int32 _nHandle, const ::com::sun::star::uno::Any& _rValue )
1070*b1cdbd2cSJim Jagielski 				throw (::com::sun::star::lang::IllegalArgumentException);
1071*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue )
1072*b1cdbd2cSJim Jagielski 				throw (::com::sun::star::uno::Exception);
1073*b1cdbd2cSJim Jagielski     using ::cppu::OPropertySetHelper::getFastPropertyValue;
1074*b1cdbd2cSJim Jagielski 
1075*b1cdbd2cSJim Jagielski // ::com::sun::star::beans::XPropertyState
1076*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Any getPropertyDefaultByHandle( sal_Int32 nHandle ) const;
1077*b1cdbd2cSJim Jagielski 
1078*b1cdbd2cSJim Jagielski // XEventListener
1079*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw (::com::sun::star::uno::RuntimeException);
1080*b1cdbd2cSJim Jagielski 
1081*b1cdbd2cSJim Jagielski // XPropertyChangeListener
1082*b1cdbd2cSJim Jagielski     virtual void SAL_CALL propertyChange( const ::com::sun::star::beans::PropertyChangeEvent& evt ) throw(::com::sun::star::uno::RuntimeException);
1083*b1cdbd2cSJim Jagielski 
1084*b1cdbd2cSJim Jagielski     // XRowSetChangeListener
1085*b1cdbd2cSJim Jagielski     virtual void SAL_CALL onRowSetChanged( const ::com::sun::star::lang::EventObject& i_Event ) throw (::com::sun::star::uno::RuntimeException);
1086*b1cdbd2cSJim Jagielski 
1087*b1cdbd2cSJim Jagielski // XLoadListener
1088*b1cdbd2cSJim Jagielski     virtual void SAL_CALL loaded( const ::com::sun::star::lang::EventObject& aEvent ) throw(::com::sun::star::uno::RuntimeException);
1089*b1cdbd2cSJim Jagielski     virtual void SAL_CALL unloading( const ::com::sun::star::lang::EventObject& aEvent ) throw(::com::sun::star::uno::RuntimeException);
1090*b1cdbd2cSJim Jagielski     virtual void SAL_CALL unloaded( const ::com::sun::star::lang::EventObject& aEvent ) throw(::com::sun::star::uno::RuntimeException);
1091*b1cdbd2cSJim Jagielski     virtual void SAL_CALL reloading( const ::com::sun::star::lang::EventObject& aEvent ) throw(::com::sun::star::uno::RuntimeException);
1092*b1cdbd2cSJim Jagielski     virtual void SAL_CALL reloaded( const ::com::sun::star::lang::EventObject& aEvent ) throw(::com::sun::star::uno::RuntimeException);
1093*b1cdbd2cSJim Jagielski 
1094*b1cdbd2cSJim Jagielski private:
1095*b1cdbd2cSJim Jagielski     // XBindableValue
1096*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setValueBinding( const ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XValueBinding >& _rxBinding ) throw (::com::sun::star::form::binding::IncompatibleTypesException, ::com::sun::star::uno::RuntimeException);
1097*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XValueBinding > SAL_CALL getValueBinding(  ) throw (::com::sun::star::uno::RuntimeException);
1098*b1cdbd2cSJim Jagielski 
1099*b1cdbd2cSJim Jagielski     // XModifyListener
1100*b1cdbd2cSJim Jagielski     virtual void SAL_CALL modified( const ::com::sun::star::lang::EventObject& _rEvent ) throw (::com::sun::star::uno::RuntimeException);
1101*b1cdbd2cSJim Jagielski 
1102*b1cdbd2cSJim Jagielski     // XValidatable
1103*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setValidator( const ::com::sun::star::uno::Reference< ::com::sun::star::form::validation::XValidator >& Validator ) throw (::com::sun::star::util::VetoException, ::com::sun::star::uno::RuntimeException);
1104*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::validation::XValidator > SAL_CALL getValidator(  ) throw (::com::sun::star::uno::RuntimeException);
1105*b1cdbd2cSJim Jagielski 
1106*b1cdbd2cSJim Jagielski     // XValidityConstraintListener
1107*b1cdbd2cSJim Jagielski     virtual void SAL_CALL validityConstraintChanged( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException);
1108*b1cdbd2cSJim Jagielski 
1109*b1cdbd2cSJim Jagielski     // XValidatableFormComponent
1110*b1cdbd2cSJim Jagielski     virtual sal_Bool SAL_CALL isValid(  ) throw (::com::sun::star::uno::RuntimeException);
1111*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Any SAL_CALL getCurrentValue(  ) throw (::com::sun::star::uno::RuntimeException);
1112*b1cdbd2cSJim Jagielski     virtual void SAL_CALL addFormComponentValidityListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::validation::XFormComponentValidityListener >& Listener ) throw (::com::sun::star::lang::NullPointerException, ::com::sun::star::uno::RuntimeException);
1113*b1cdbd2cSJim Jagielski     virtual void SAL_CALL removeFormComponentValidityListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::validation::XFormComponentValidityListener >& Listener ) throw (::com::sun::star::lang::NullPointerException, ::com::sun::star::uno::RuntimeException);
1114*b1cdbd2cSJim Jagielski 
1115*b1cdbd2cSJim Jagielski protected:
1116*b1cdbd2cSJim Jagielski     // OPropertyChangeListener
1117*b1cdbd2cSJim Jagielski 	virtual void
1118*b1cdbd2cSJim Jagielski                 _propertyChanged( const ::com::sun::star::beans::PropertyChangeEvent& _rEvt ) throw ( ::com::sun::star::uno::RuntimeException );
1119*b1cdbd2cSJim Jagielski 
1120*b1cdbd2cSJim Jagielski     /// checks whether we currently have an external value binding in place
hasExternalValueBinding() const1121*b1cdbd2cSJim Jagielski     inline  bool    hasExternalValueBinding() const { return m_xExternalBinding.is(); }
1122*b1cdbd2cSJim Jagielski 
1123*b1cdbd2cSJim Jagielski     // checks whether we currently have an external validator
hasValidator() const1124*b1cdbd2cSJim Jagielski     inline  bool    hasValidator() const { return m_xValidator.is(); }
1125*b1cdbd2cSJim Jagielski 
1126*b1cdbd2cSJim Jagielski     /** transfers the very current value of the db column we're bound to the control
1127*b1cdbd2cSJim Jagielski         @precond
1128*b1cdbd2cSJim Jagielski             our own mutex is locked
1129*b1cdbd2cSJim Jagielski         @precond
1130*b1cdbd2cSJim Jagielski             we don't have an external binding in place
1131*b1cdbd2cSJim Jagielski     */
1132*b1cdbd2cSJim Jagielski     void        transferDbValueToControl( );
1133*b1cdbd2cSJim Jagielski 
1134*b1cdbd2cSJim Jagielski     /** transfers the current value of the active external binding to the control
1135*b1cdbd2cSJim Jagielski         @precond
1136*b1cdbd2cSJim Jagielski             we do have an active external binding in place
1137*b1cdbd2cSJim Jagielski     */
1138*b1cdbd2cSJim Jagielski     void        transferExternalValueToControl( ControlModelLock& _rInstanceLock );
1139*b1cdbd2cSJim Jagielski 
1140*b1cdbd2cSJim Jagielski     /** transfers the control value to the external binding
1141*b1cdbd2cSJim Jagielski         @precond
1142*b1cdbd2cSJim Jagielski             our own mutex is locked, and _rInstanceLock is the guard locking it
1143*b1cdbd2cSJim Jagielski         @precond
1144*b1cdbd2cSJim Jagielski             we do have an active external binding in place
1145*b1cdbd2cSJim Jagielski     */
1146*b1cdbd2cSJim Jagielski     void        transferControlValueToExternal( ControlModelLock& _rInstanceLock );
1147*b1cdbd2cSJim Jagielski 
1148*b1cdbd2cSJim Jagielski     /** calculates the type which is to be used to communicate with the current external binding,
1149*b1cdbd2cSJim Jagielski         and stores it in m_aExternalValueType
1150*b1cdbd2cSJim Jagielski 
1151*b1cdbd2cSJim Jagielski         The method checks the possible type candidates as returned by getSupportedBindingTypes,
1152*b1cdbd2cSJim Jagielski         and the types supported by the current external binding, if any.
1153*b1cdbd2cSJim Jagielski     */
1154*b1cdbd2cSJim Jagielski     void        calculateExternalValueType();
1155*b1cdbd2cSJim Jagielski 
1156*b1cdbd2cSJim Jagielski     /** returns the type which should be used to exchange data with our external value binding
1157*b1cdbd2cSJim Jagielski 
1158*b1cdbd2cSJim Jagielski         @see initValueProperty
1159*b1cdbd2cSJim Jagielski     */
1160*b1cdbd2cSJim Jagielski     const ::com::sun::star::uno::Type&
getExternalValueType() const1161*b1cdbd2cSJim Jagielski                 getExternalValueType() const { return m_aExternalValueType; }
1162*b1cdbd2cSJim Jagielski 
1163*b1cdbd2cSJim Jagielski     /** initializes the control from m_xField
1164*b1cdbd2cSJim Jagielski 
1165*b1cdbd2cSJim Jagielski         Basically, this method calls transferDbValueToControl - but only if our cursor is positioned
1166*b1cdbd2cSJim Jagielski         on a valid row. Otherwise, the control is reset.
1167*b1cdbd2cSJim Jagielski 
1168*b1cdbd2cSJim Jagielski         @precond
1169*b1cdbd2cSJim Jagielski             m_xField is not <NULL/>
1170*b1cdbd2cSJim Jagielski     */
1171*b1cdbd2cSJim Jagielski     void        initFromField( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet>& _rxForm );
1172*b1cdbd2cSJim Jagielski 
1173*b1cdbd2cSJim Jagielski private:
1174*b1cdbd2cSJim Jagielski 	sal_Bool    connectToField( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet>& _rxForm );
1175*b1cdbd2cSJim Jagielski 	void        resetField();
1176*b1cdbd2cSJim Jagielski 
1177*b1cdbd2cSJim Jagielski     /** does a new validation of the control value
1178*b1cdbd2cSJim Jagielski 
1179*b1cdbd2cSJim Jagielski         If necessary, our <member>m_bIsCurrentValueValid</member> member will be adjusted,
1180*b1cdbd2cSJim Jagielski         and changes will be notified.
1181*b1cdbd2cSJim Jagielski 
1182*b1cdbd2cSJim Jagielski         Note that it's not necessary that we're connected to a validator. If we are not,
1183*b1cdbd2cSJim Jagielski         it's assumed that our value is valid, and this is handled appropriately.
1184*b1cdbd2cSJim Jagielski 
1185*b1cdbd2cSJim Jagielski         Use this method if there is a potential that <b>only</b> the validity flag changed. If
1186*b1cdbd2cSJim Jagielski         any of the other aspects (our current value, or our current text) changed, then
1187*b1cdbd2cSJim Jagielski         pass <TRUE/> for <member>_bForceNotification</member>.
1188*b1cdbd2cSJim Jagielski 
1189*b1cdbd2cSJim Jagielski         @param _bForceNotification
1190*b1cdbd2cSJim Jagielski             if <TRUE/>, then the validity listeners will be notified, not matter whether the validity
1191*b1cdbd2cSJim Jagielski             changed.
1192*b1cdbd2cSJim Jagielski     */
1193*b1cdbd2cSJim Jagielski     void        recheckValidity( bool _bForceNotification );
1194*b1cdbd2cSJim Jagielski 
1195*b1cdbd2cSJim Jagielski     /// initializes m_pAggPropMultiplexer
1196*b1cdbd2cSJim Jagielski     void        implInitAggMultiplexer( );
1197*b1cdbd2cSJim Jagielski 
1198*b1cdbd2cSJim Jagielski     /// initializes listening at the value property
1199*b1cdbd2cSJim Jagielski     void        implInitValuePropertyListening( ) const;
1200*b1cdbd2cSJim Jagielski 
1201*b1cdbd2cSJim Jagielski     /** adds or removes the component as load listener to/from our form, and (if necessary) as RowSetChange listener at
1202*b1cdbd2cSJim Jagielski         our parent.
1203*b1cdbd2cSJim Jagielski 
1204*b1cdbd2cSJim Jagielski         @precond there must no external value binding be in place
1205*b1cdbd2cSJim Jagielski     */
1206*b1cdbd2cSJim Jagielski     void        doFormListening( const bool _bStart );
1207*b1cdbd2cSJim Jagielski 
isFormListening() const1208*b1cdbd2cSJim Jagielski     inline bool isFormListening() const { return m_bFormListening; }
1209*b1cdbd2cSJim Jagielski 
1210*b1cdbd2cSJim Jagielski     /** determines the new value of m_xAmbientForm
1211*b1cdbd2cSJim Jagielski     */
1212*b1cdbd2cSJim Jagielski     void        impl_determineAmbientForm_nothrow();
1213*b1cdbd2cSJim Jagielski 
1214*b1cdbd2cSJim Jagielski     /** connects to a value supplier which is an database column.
1215*b1cdbd2cSJim Jagielski 
1216*b1cdbd2cSJim Jagielski         The column is take from our parent, which must be a database form respectively row set.
1217*b1cdbd2cSJim Jagielski 
1218*b1cdbd2cSJim Jagielski         @precond The control does not have an external value supplier
1219*b1cdbd2cSJim Jagielski 
1220*b1cdbd2cSJim Jagielski         @param _bFromReload
1221*b1cdbd2cSJim Jagielski             Determines whether the connection is made after the row set has been loaded (<FALSE/>)
1222*b1cdbd2cSJim Jagielski             or reloaded (<TRUE/>)
1223*b1cdbd2cSJim Jagielski 
1224*b1cdbd2cSJim Jagielski         @see impl_disconnectDatabaseColumn_noNotify
1225*b1cdbd2cSJim Jagielski     */
1226*b1cdbd2cSJim Jagielski     void        impl_connectDatabaseColumn_noNotify(
1227*b1cdbd2cSJim Jagielski                     bool  _bFromReload
1228*b1cdbd2cSJim Jagielski                 );
1229*b1cdbd2cSJim Jagielski 
1230*b1cdbd2cSJim Jagielski     /** disconnects from a value supplier which is an database column
1231*b1cdbd2cSJim Jagielski 
1232*b1cdbd2cSJim Jagielski         @precond The control does not have an external value supplier
1233*b1cdbd2cSJim Jagielski         @see impl_connectDatabaseColumn_noNotify
1234*b1cdbd2cSJim Jagielski     */
1235*b1cdbd2cSJim Jagielski     void        impl_disconnectDatabaseColumn_noNotify();
1236*b1cdbd2cSJim Jagielski 
1237*b1cdbd2cSJim Jagielski     /** connects to an external value binding
1238*b1cdbd2cSJim Jagielski 
1239*b1cdbd2cSJim Jagielski         <p>Note that by definition, external data bindings superseede the SQL data binding which
1240*b1cdbd2cSJim Jagielski         is defined by our RowSet-column-related properties. This means that in case we're currently
1241*b1cdbd2cSJim Jagielski         connected to a database column when this is called, this connection is suspended.</p>
1242*b1cdbd2cSJim Jagielski 
1243*b1cdbd2cSJim Jagielski         @precond
1244*b1cdbd2cSJim Jagielski                 the new external binding has already been approved (see <member>impl_approveValueBinding_nolock</member>)
1245*b1cdbd2cSJim Jagielski         @precond
1246*b1cdbd2cSJim Jagielski                 there currently is no external binding in place
1247*b1cdbd2cSJim Jagielski     */
1248*b1cdbd2cSJim Jagielski     void        connectExternalValueBinding(
1249*b1cdbd2cSJim Jagielski                     const ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XValueBinding >& _rxBinding,
1250*b1cdbd2cSJim Jagielski                     ControlModelLock& _rInstanceLock
1251*b1cdbd2cSJim Jagielski                 );
1252*b1cdbd2cSJim Jagielski 
1253*b1cdbd2cSJim Jagielski     /** disconnects from an external value binding
1254*b1cdbd2cSJim Jagielski 
1255*b1cdbd2cSJim Jagielski         @precond
1256*b1cdbd2cSJim Jagielski                 there currently is an external binding in place
1257*b1cdbd2cSJim Jagielski     */
1258*b1cdbd2cSJim Jagielski     void        disconnectExternalValueBinding( );
1259*b1cdbd2cSJim Jagielski 
1260*b1cdbd2cSJim Jagielski     /** connects the component to an external validator
1261*b1cdbd2cSJim Jagielski 
1262*b1cdbd2cSJim Jagielski         @precond
1263*b1cdbd2cSJim Jagielski             there currently is no active validator
1264*b1cdbd2cSJim Jagielski         @precond
1265*b1cdbd2cSJim Jagielski             our mutex is currently locked exactly once
1266*b1cdbd2cSJim Jagielski     */
1267*b1cdbd2cSJim Jagielski     void        connectValidator(
1268*b1cdbd2cSJim Jagielski                     const ::com::sun::star::uno::Reference< ::com::sun::star::form::validation::XValidator >& _rxValidator
1269*b1cdbd2cSJim Jagielski                 );
1270*b1cdbd2cSJim Jagielski 
1271*b1cdbd2cSJim Jagielski     /** disconnects the component from it's current an external validator
1272*b1cdbd2cSJim Jagielski 
1273*b1cdbd2cSJim Jagielski         @precond
1274*b1cdbd2cSJim Jagielski             there currently is an active validator
1275*b1cdbd2cSJim Jagielski         @precond
1276*b1cdbd2cSJim Jagielski             our mutex is currently locked exactly once
1277*b1cdbd2cSJim Jagielski     */
1278*b1cdbd2cSJim Jagielski     void        disconnectValidator( );
1279*b1cdbd2cSJim Jagielski 
1280*b1cdbd2cSJim Jagielski     /** called from within <member scope="com::sun::star:::form::binding">XBindableValue::setValueBinding</member>
1281*b1cdbd2cSJim Jagielski         to approve the new binding
1282*b1cdbd2cSJim Jagielski 
1283*b1cdbd2cSJim Jagielski         The default implementation approves the binding if and only if it is not <NULL/>, and supports
1284*b1cdbd2cSJim Jagielski         the type returned by getExternalValueType.
1285*b1cdbd2cSJim Jagielski 
1286*b1cdbd2cSJim Jagielski         @param _rxBinding
1287*b1cdbd2cSJim Jagielski             the binding which applies for being responsible for our value, Must not be
1288*b1cdbd2cSJim Jagielski             <NULL/>
1289*b1cdbd2cSJim Jagielski         @return
1290*b1cdbd2cSJim Jagielski             <TRUE/> if and only if the given binding can supply values in the proper type
1291*b1cdbd2cSJim Jagielski 
1292*b1cdbd2cSJim Jagielski         @seealso getExternalValueType
1293*b1cdbd2cSJim Jagielski     */
1294*b1cdbd2cSJim Jagielski     sal_Bool    impl_approveValueBinding_nolock(
1295*b1cdbd2cSJim Jagielski                     const ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XValueBinding >& _rxBinding
1296*b1cdbd2cSJim Jagielski                 );
1297*b1cdbd2cSJim Jagielski };
1298*b1cdbd2cSJim Jagielski 
1299*b1cdbd2cSJim Jagielski     //=========================================================================
1300*b1cdbd2cSJim Jagielski     //= inlines
1301*b1cdbd2cSJim Jagielski     //=========================================================================
acquire()1302*b1cdbd2cSJim Jagielski     inline void ControlModelLock::acquire()
1303*b1cdbd2cSJim Jagielski     {
1304*b1cdbd2cSJim Jagielski         m_rModel.lockInstance( OControlModel::LockAccess() );
1305*b1cdbd2cSJim Jagielski         m_bLocked = true;
1306*b1cdbd2cSJim Jagielski     }
release()1307*b1cdbd2cSJim Jagielski     inline void ControlModelLock::release()
1308*b1cdbd2cSJim Jagielski     {
1309*b1cdbd2cSJim Jagielski         OSL_ENSURE( m_bLocked, "ControlModelLock::release: not locked!" );
1310*b1cdbd2cSJim Jagielski         m_bLocked = false;
1311*b1cdbd2cSJim Jagielski 
1312*b1cdbd2cSJim Jagielski         if ( 0 == m_rModel.unlockInstance( OControlModel::LockAccess() ) )
1313*b1cdbd2cSJim Jagielski             impl_notifyAll_nothrow();
1314*b1cdbd2cSJim Jagielski     }
1315*b1cdbd2cSJim Jagielski 
1316*b1cdbd2cSJim Jagielski //.........................................................................
1317*b1cdbd2cSJim Jagielski }
1318*b1cdbd2cSJim Jagielski //.........................................................................
1319*b1cdbd2cSJim Jagielski 
1320*b1cdbd2cSJim Jagielski #endif // _FORMS_FORMCOMPONENT_HXX_
1321*b1cdbd2cSJim Jagielski 
1322