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