| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| #ifndef _FORMS_FORMCOMPONENT_HXX_ |
| #define _FORMS_FORMCOMPONENT_HXX_ |
| |
| #include "cloneable.hxx" |
| #include "ids.hxx" |
| #include "property.hrc" |
| #include "property.hxx" |
| #include "propertybaghelper.hxx" |
| #include "resettable.hxx" |
| #include "services.hxx" |
| #include "windowstateguard.hxx" |
| |
| /** === begin UNO includes === **/ |
| #include <com/sun/star/awt/XControl.hpp> |
| #include <com/sun/star/beans/XPropertyAccess.hpp> |
| #include <com/sun/star/beans/XPropertyContainer.hpp> |
| #include <com/sun/star/container/XChild.hpp> |
| #include <com/sun/star/container/XNamed.hpp> |
| #include <com/sun/star/form/binding/XBindableValue.hpp> |
| #include <com/sun/star/form/FormComponentType.hpp> |
| #include <com/sun/star/form/validation/XValidatableFormComponent.hpp> |
| #include <com/sun/star/form/validation/XValidityConstraintListener.hpp> |
| #include <com/sun/star/form/XBoundComponent.hpp> |
| #include <com/sun/star/form/XBoundControl.hpp> |
| #include <com/sun/star/form/XFormComponent.hpp> |
| #include <com/sun/star/form/XLoadListener.hpp> |
| #include <com/sun/star/form/XReset.hpp> |
| #include <com/sun/star/io/XMarkableStream.hpp> |
| #include <com/sun/star/io/XPersistObject.hpp> |
| #include <com/sun/star/lang/DisposedException.hpp> |
| #include <com/sun/star/lang/XEventListener.hpp> |
| #include <com/sun/star/lang/XMultiServiceFactory.hpp> |
| #include <com/sun/star/lang/XServiceInfo.hpp> |
| #include <com/sun/star/sdb/XColumn.hpp> |
| #include <com/sun/star/sdb/XColumnUpdate.hpp> |
| #include <com/sun/star/sdb/XRowSetChangeListener.hpp> |
| #include <com/sun/star/sdbc/XRowSet.hpp> |
| #include <com/sun/star/sdbcx/XColumnsSupplier.hpp> |
| #include <com/sun/star/uno/XAggregation.hpp> |
| #include <com/sun/star/util/XCloneable.hpp> |
| #include <com/sun/star/util/XModifyListener.hpp> |
| #include <com/sun/star/form/XLoadable.hpp> |
| /** === end UNO includes === **/ |
| |
| #include <comphelper/componentcontext.hxx> |
| #include <comphelper/propagg.hxx> |
| #include <comphelper/propertybag.hxx> |
| #include <comphelper/propmultiplex.hxx> |
| #include <comphelper/sequence.hxx> |
| #include <comphelper/uno3.hxx> |
| #include <cppuhelper/component.hxx> |
| #include <cppuhelper/implbase1.hxx> |
| #include <cppuhelper/implbase2.hxx> |
| #include <cppuhelper/implbase3.hxx> |
| #include <cppuhelper/implbase4.hxx> |
| #include <cppuhelper/implbase7.hxx> |
| #include <osl/mutex.hxx> |
| #include <rtl/ustring.hxx> |
| |
| #include <memory> |
| |
| //......................................................................... |
| namespace frm |
| { |
| //......................................................................... |
| |
| // default tab index for components |
| const sal_Int16 FRM_DEFAULT_TABINDEX = 0; |
| |
| // macros for quickly declaring/implementing XServiceInfo |
| #define DECLARE_XPERSISTOBJECT() \ |
| virtual ::rtl::OUString SAL_CALL getServiceName() throw(::com::sun::star::uno::RuntimeException); \ |
| 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); \ |
| 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); \ |
| |
| // old macro for quickly implementing XServiceInfo::getImplementationName |
| #define IMPLEMENTATION_NAME(ImplName) \ |
| virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw(::com::sun::star::uno::RuntimeException) \ |
| { return ::rtl::OUString::createFromAscii("com.sun.star.comp.forms.") + ::rtl::OUString::createFromAscii(#ImplName); } |
| |
| class OControlModel; |
| |
| //========================================================================= |
| //= ControlModelLock |
| //========================================================================= |
| /** class whose instances lock a OControlModel |
| |
| Locking here merely means locking the OControlModel's mutex. |
| |
| In addition to the locking facility, the class is also able to fire property |
| change notifications. This happens when the last ControlModelLock instance on a stack |
| dies. |
| */ |
| class ControlModelLock |
| { |
| public: |
| ControlModelLock( OControlModel& _rModel ) |
| :m_rModel( _rModel ) |
| ,m_bLocked( false ) |
| { |
| acquire(); |
| } |
| |
| ~ControlModelLock() |
| { |
| if ( m_bLocked ) |
| release(); |
| } |
| inline void acquire(); |
| inline void release(); |
| |
| inline OControlModel& getModel() const { return m_rModel; }; |
| |
| /** adds a property change notification, which is to be fired when the last lock on the model |
| (in the current thread) is released. |
| */ |
| void addPropertyNotification( |
| const sal_Int32 _nHandle, |
| const ::com::sun::star::uno::Any& _rOldValue, |
| const ::com::sun::star::uno::Any& _rNewValue |
| ); |
| |
| private: |
| void impl_notifyAll_nothrow(); |
| |
| private: |
| OControlModel& m_rModel; |
| bool m_bLocked; |
| ::com::sun::star::uno::Sequence< sal_Int32 > m_aHandles; |
| ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > m_aOldValues; |
| ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > m_aNewValues; |
| |
| private: |
| ControlModelLock(); // never implemented |
| ControlModelLock( const ControlModelLock& ); // never implemented |
| ControlModelLock& operator=( const ControlModelLock& ); // never implemented |
| }; |
| |
| //========================================================================= |
| //= OControl |
| //= base class for form layer controls |
| //========================================================================= |
| typedef ::cppu::ImplHelper3 < ::com::sun::star::awt::XControl |
| , ::com::sun::star::lang::XEventListener |
| , ::com::sun::star::lang::XServiceInfo |
| > OControl_BASE; |
| |
| class OControl :public ::cppu::OComponentHelper |
| ,public OControl_BASE |
| { |
| protected: |
| ::osl::Mutex m_aMutex; |
| OImplementationIdsRef m_aHoldIdHelper; |
| ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl > |
| m_xControl; |
| ::com::sun::star::uno::Reference< ::com::sun::star::uno::XAggregation> |
| m_xAggregate; |
| |
| ::comphelper::ComponentContext m_aContext; |
| WindowStateGuard m_aWindowStateGuard; |
| |
| public: |
| /** constructs a control |
| |
| @param _rFactory |
| the service factory for this control |
| @param _rAggregateService |
| the service name of the component to aggregate |
| @param _bSetDelegator |
| set this to <FALSE/> if you don't want the constructor to set the delegator at |
| the aggregate. In this case, you <em>have</em> to call doSetDelegator within your |
| own constructor. |
| |
| This is helpfull, if your derived class wants to cache an interface of the aggregate. |
| In this case, the aggregate needs to be queried for this interface <b>before</b> the |
| <member scope="com::sun::star::uno">XAggregation::setDelegator</member> call. |
| |
| In such a case, pass <FALSE/> to this parameter. Then, cache the aggregate's interface(s) |
| as needed. Afterwards, call <member>doSetDelegator</member>. |
| |
| In your destructor, you need to call <member>doResetDelegator</member> before |
| resetting the cached interfaces. This will reset the aggregates delegator to <NULL/>, |
| which will ensure that the <member scope="com::sun::star::uno">XInterface::release</member> |
| calls on the cached interfaces are really applied to the aggregate, instead of |
| the <type>OControl</type> itself. |
| */ |
| OControl( |
| const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rFactory, |
| const ::rtl::OUString& _rAggregateService, |
| const sal_Bool _bSetDelegator = sal_True |
| ); |
| |
| /** initializes the given peer with various settings necessary for form controls |
| */ |
| static void initFormControlPeer( |
| const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer >& _rxPeer ); |
| |
| protected: |
| virtual ~OControl(); |
| |
| /** sets the control as delegator at the aggregate |
| |
| This has to be called from within your derived class' constructor, if and only |
| if you passed <FALSE/> to the <arg>_bSetDelegator</arg> parameter of the |
| <type>OControl</type> constructor. |
| */ |
| void doSetDelegator(); |
| void doResetDelegator(); |
| |
| // UNO |
| DECLARE_UNO3_AGG_DEFAULTS(OControl, OComponentHelper); |
| virtual ::com::sun::star::uno::Any SAL_CALL queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(::com::sun::star::uno::RuntimeException); |
| |
| // XTypeProvider |
| virtual ::com::sun::star::uno::Sequence<sal_Int8> SAL_CALL getImplementationId() throw(::com::sun::star::uno::RuntimeException); |
| virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type> SAL_CALL getTypes() throw(::com::sun::star::uno::RuntimeException); |
| |
| // OComponentHelper |
| virtual void SAL_CALL disposing(); |
| |
| // XComponent (as base of XControl) |
| virtual void SAL_CALL dispose( ) throw(::com::sun::star::uno::RuntimeException) |
| { OComponentHelper::dispose(); } |
| virtual void SAL_CALL addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener>& _rxListener) throw(::com::sun::star::uno::RuntimeException) |
| { OComponentHelper::addEventListener(_rxListener); } |
| virtual void SAL_CALL removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener>& _rxListener) throw(::com::sun::star::uno::RuntimeException) |
| { OComponentHelper::removeEventListener(_rxListener); } |
| |
| // XEventListener |
| virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw (::com::sun::star::uno::RuntimeException); |
| |
| // XServiceInfo |
| virtual sal_Bool SAL_CALL supportsService(const ::rtl::OUString& ServiceName) throw (::com::sun::star::uno::RuntimeException); |
| virtual StringSequence SAL_CALL getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException); |
| virtual ::rtl::OUString SAL_CALL getImplementationName() throw(::com::sun::star::uno::RuntimeException) = 0; |
| |
| // XServiceInfo - static version |
| static StringSequence SAL_CALL getSupportedServiceNames_Static() throw(::com::sun::star::uno::RuntimeException); |
| |
| // XControl |
| virtual void SAL_CALL setContext(const InterfaceRef& Context) throw (::com::sun::star::uno::RuntimeException); |
| virtual InterfaceRef SAL_CALL getContext() throw (::com::sun::star::uno::RuntimeException); |
| 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); |
| virtual ::com::sun::star::uno::Reference<starawt::XWindowPeer> SAL_CALL getPeer() throw (::com::sun::star::uno::RuntimeException); |
| virtual sal_Bool SAL_CALL setModel(const ::com::sun::star::uno::Reference<starawt::XControlModel>& Model) throw (::com::sun::star::uno::RuntimeException); |
| virtual ::com::sun::star::uno::Reference<starawt::XControlModel> SAL_CALL getModel() throw (::com::sun::star::uno::RuntimeException); |
| virtual ::com::sun::star::uno::Reference<starawt::XView> SAL_CALL getView() throw (::com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL setDesignMode(sal_Bool bOn) throw (::com::sun::star::uno::RuntimeException); |
| virtual sal_Bool SAL_CALL isDesignMode() throw (::com::sun::star::uno::RuntimeException); |
| virtual sal_Bool SAL_CALL isTransparent() throw (::com::sun::star::uno::RuntimeException); |
| |
| protected: |
| virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type> _getTypes(); |
| // overwrite this and call the base class if you have additional types |
| |
| ::com::sun::star::uno::Sequence< ::rtl::OUString > getAggregateServiceNames(); |
| |
| private: |
| void impl_resetStateGuard_nothrow(); |
| }; |
| |
| //================================================================== |
| //= OBoundControl |
| //= a form control implementing the XBoundControl interface |
| //================================================================== |
| typedef ::cppu::ImplHelper1 < ::com::sun::star::form::XBoundControl |
| > OBoundControl_BASE; |
| class OBoundControl :public OControl |
| ,public OBoundControl_BASE |
| { |
| protected: |
| sal_Bool m_bLocked : 1; |
| |
| ::rtl::OUString m_sOriginalHelpText; // as long as the text/value is invalid, we change the help text of our peer |
| ::com::sun::star::awt::FontDescriptor |
| m_aOriginalFont; // as long as the text/value is invalid, we also change the font |
| sal_Int32 m_nOriginalTextLineColor; // (we add red underlining) |
| |
| public: |
| OBoundControl( |
| const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory, |
| const ::rtl::OUString& _rAggregateService, |
| const sal_Bool _bSetDelegator = sal_True |
| ); |
| |
| virtual ~OBoundControl(); |
| |
| DECLARE_UNO3_AGG_DEFAULTS(OBoundControl, OControl); |
| virtual ::com::sun::star::uno::Any SAL_CALL queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(::com::sun::star::uno::RuntimeException); |
| |
| // XBoundControl |
| virtual sal_Bool SAL_CALL getLock() throw(::com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL setLock(sal_Bool _bLock) throw(::com::sun::star::uno::RuntimeException); |
| // default implementation just disables the controls, overwrite _setLock to change this behaviour |
| |
| // XControl |
| virtual sal_Bool SAL_CALL setModel(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >& Model) throw (::com::sun::star::uno::RuntimeException); |
| |
| // XEventListener |
| virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw (::com::sun::star::uno::RuntimeException); |
| |
| // OComponentHelper |
| virtual void SAL_CALL disposing(); |
| |
| protected: |
| virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type> _getTypes(); |
| // implement the lock setting |
| virtual void _setLock(sal_Bool _bLock); |
| }; |
| |
| //================================================================== |
| //= OControlModel |
| //= model of a form layer control |
| //================================================================== |
| //added for exporting OCX control |
| #define INVALID_OBJ_ID_IN_MSO 0xFFFF |
| |
| typedef ::cppu::ImplHelper7 < ::com::sun::star::form::XFormComponent |
| , ::com::sun::star::io::XPersistObject |
| , ::com::sun::star::container::XNamed |
| , ::com::sun::star::lang::XServiceInfo |
| , ::com::sun::star::util::XCloneable |
| , ::com::sun::star::beans::XPropertyContainer |
| , ::com::sun::star::beans::XPropertyAccess |
| > OControlModel_BASE; |
| |
| class OControlModel :public ::cppu::OComponentHelper |
| ,public OPropertySetAggregationHelper |
| ,public OControlModel_BASE |
| ,public OCloneableAggregation |
| ,public IPropertyBagHelperContext |
| { |
| |
| protected: |
| ::comphelper::ComponentContext m_aContext; |
| |
| ::osl::Mutex m_aMutex; |
| oslInterlockedCount m_lockCount; |
| |
| InterfaceRef m_xParent; // ParentComponent |
| OImplementationIdsRef m_aHoldIdHelper; |
| PropertyBagHelper m_aPropertyBagHelper; |
| |
| const ::comphelper::ComponentContext& |
| getContext() const { return m_aContext; } |
| |
| // <properties> |
| ::rtl::OUString m_aName; // name of the control |
| ::rtl::OUString m_aTag; // tag for additional data |
| sal_Int16 m_nTabIndex; // index within the taborder |
| sal_Int16 m_nClassId; // type of the control |
| sal_Bool m_bNativeLook; // should the control use the native platform look? |
| //added for exporting OCX control |
| sal_Int16 m_nControlTypeinMSO; //keep the MS office control type for exporting to MS binarary file |
| sal_uInt16 m_nObjIDinMSO; //keep the OCX control obj id for exporting to MS binarary file |
| // </properties> |
| |
| |
| protected: |
| OControlModel( |
| const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rFactory, // factory to create the aggregate with |
| const ::rtl::OUString& _rUnoControlModelTypeName, // service name of te model to aggregate |
| const ::rtl::OUString& rDefault = ::rtl::OUString(), // service name of the default control |
| const sal_Bool _bSetDelegator = sal_True // set to sal_False if you want to call setDelegator later (after returning from this ctor) |
| ); |
| OControlModel( |
| const OControlModel* _pOriginal, // the original object to clone |
| const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rFactory, // factory to create the aggregate with |
| const sal_Bool _bCloneAggregate = sal_True, // should the aggregate of the original be cloned, too? |
| const sal_Bool _bSetDelegator = sal_True // set to sal_False if you want to call setDelegator later (after returning from this ctor) |
| ); |
| virtual ~OControlModel(); |
| |
| /** to be called after a OBoundControlModel (a derivee, respectively) has been cloned |
| |
| <p>This method contains late initializations which cannot be done in the |
| constructor of this base class, since the virtual method of derived classes do |
| not yet work there.</p> |
| */ |
| virtual void clonedFrom( const OControlModel* _pOriginal ); |
| |
| using OComponentHelper::rBHelper; |
| |
| virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type> _getTypes(); |
| |
| void readHelpTextCompatibly(const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectInputStream >& _rxInStream); |
| void writeHelpTextCompatibly(const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectOutputStream >& _rxOutStream); |
| |
| void doSetDelegator(); |
| void doResetDelegator(); |
| |
| ::com::sun::star::uno::Sequence< ::rtl::OUString > getAggregateServiceNames(); |
| |
| public: |
| DECLARE_UNO3_AGG_DEFAULTS(OControl, OComponentHelper); |
| virtual ::com::sun::star::uno::Any SAL_CALL queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw (::com::sun::star::uno::RuntimeException); |
| |
| // XTypeProvider |
| virtual ::com::sun::star::uno::Sequence<sal_Int8> SAL_CALL getImplementationId() throw(::com::sun::star::uno::RuntimeException); |
| virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type> SAL_CALL getTypes() throw(::com::sun::star::uno::RuntimeException); |
| |
| // OComponentHelper |
| virtual void SAL_CALL disposing(); |
| |
| // XNamed |
| virtual ::rtl::OUString SAL_CALL getName() throw(::com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL setName(const ::rtl::OUString& aName) throw(::com::sun::star::uno::RuntimeException); |
| |
| // XServiceInfo |
| virtual sal_Bool SAL_CALL supportsService(const ::rtl::OUString& ServiceName) throw (::com::sun::star::uno::RuntimeException); |
| virtual StringSequence SAL_CALL getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException); |
| virtual ::rtl::OUString SAL_CALL getImplementationName() throw(::com::sun::star::uno::RuntimeException) = 0; |
| |
| // XSericeInfo - static version(s) |
| static StringSequence SAL_CALL getSupportedServiceNames_Static() throw(::com::sun::star::uno::RuntimeException); |
| |
| // XPersistObject |
| virtual ::rtl::OUString SAL_CALL getServiceName() throw(::com::sun::star::uno::RuntimeException) = 0; |
| 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); |
| 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); |
| |
| // XChild (base of XFormComponent) |
| virtual InterfaceRef SAL_CALL getParent() throw(::com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL setParent(const InterfaceRef& Parent) throw(::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException); |
| |
| // XEventListener |
| virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw (::com::sun::star::uno::RuntimeException); |
| |
| // XPropertySet |
| virtual void SAL_CALL getFastPropertyValue(::com::sun::star::uno::Any& rValue, sal_Int32 nHandle) const; |
| virtual sal_Bool SAL_CALL convertFastPropertyValue( |
| ::com::sun::star::uno::Any& _rConvertedValue, ::com::sun::star::uno::Any& _rOldValue, sal_Int32 _nHandle, const ::com::sun::star::uno::Any& _rValue ) |
| throw (::com::sun::star::lang::IllegalArgumentException); |
| virtual void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue ) |
| throw (::com::sun::star::uno::Exception); |
| using ::cppu::OPropertySetHelper::getFastPropertyValue; |
| |
| // ::com::sun::star::beans::XPropertyState |
| virtual ::com::sun::star::beans::PropertyState getPropertyStateByHandle(sal_Int32 nHandle); |
| virtual void setPropertyToDefaultByHandle(sal_Int32 nHandle); |
| virtual ::com::sun::star::uno::Any getPropertyDefaultByHandle( sal_Int32 nHandle ) const; |
| |
| // XCloneable |
| virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloneable > SAL_CALL createClone( ) throw (::com::sun::star::uno::RuntimeException) = 0; |
| |
| // XPropertyContainer |
| 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); |
| 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); |
| |
| // XPropertyAccess |
| virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL getPropertyValues( ) throw (::com::sun::star::uno::RuntimeException); |
| 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); |
| |
| protected: |
| using OPropertySetAggregationHelper::setPropertyValues; |
| using OPropertySetAggregationHelper::getPropertyValues; |
| |
| protected: |
| virtual void writeAggregate( const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectOutputStream >& _rxOutStream ) const; |
| virtual void readAggregate( const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectInputStream >& _rxInStream ); |
| |
| protected: |
| // XPropertySet |
| virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo> SAL_CALL getPropertySetInfo() throw( ::com::sun::star::uno::RuntimeException); |
| // OPropertySetHelper |
| virtual cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper(); |
| |
| /** describes the properties provided by this class, or its respective |
| derived class |
| |
| Derived classes usually call the base class first, and then append own properties. |
| */ |
| virtual void describeFixedProperties( |
| ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >& /* [out] */ _rProps |
| ) const; |
| |
| // IPropertyBagHelperContext |
| virtual ::osl::Mutex& getMutex(); |
| virtual void describeFixedAndAggregateProperties( |
| ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >& _out_rFixedProperties, |
| ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >& _out_rAggregateProperties |
| ) const; |
| virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XMultiPropertySet > |
| getPropertiesInterface(); |
| |
| /** describes the properties of our aggregate |
| |
| The default implementation simply asks m_xAggregateSet for its properties. |
| |
| You usually only need to overload this method if you want to filter the aggregate |
| properties. |
| */ |
| virtual void describeAggregateProperties( |
| ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >& /* [out] */ _rAggregateProps |
| ) const; |
| |
| public: |
| struct LockAccess { friend class ControlModelLock; private: LockAccess() { } }; |
| |
| void lockInstance( LockAccess ); |
| oslInterlockedCount unlockInstance( LockAccess ); |
| |
| void firePropertyChanges( |
| const ::com::sun::star::uno::Sequence< sal_Int32 >& _rHandles, |
| const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& _rOldValues, |
| const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& _rNewValues, |
| LockAccess |
| ); |
| |
| inline ::osl::Mutex& |
| getInstanceMutex() { return m_aMutex; } |
| }; |
| |
| //================================================================== |
| // simple destructor |
| #define DECLARE_DEFAULT_DTOR( classname ) \ |
| ~classname() \ |
| |
| // constructor for cloning a class |
| #define DECLARE_DEFAULT_CLONE_CTOR( classname ) \ |
| classname( \ |
| const classname* _pOriginal, \ |
| const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rxFactory \ |
| ); \ |
| |
| // all xtors for an inner class of the object hierarchy |
| #define DECLARE_DEFAULT_XTOR( classname ) \ |
| classname( \ |
| const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rxFactory, \ |
| const ::rtl::OUString& _rUnoControlModelTypeName, \ |
| const ::rtl::OUString& _rDefault \ |
| ); \ |
| DECLARE_DEFAULT_CLONE_CTOR( classname ) \ |
| DECLARE_DEFAULT_DTOR( classname ) \ |
| |
| // all xtors for an inner class of the object hierarchy which is *bound* |
| #define DECLARE_DEFAULT_BOUND_XTOR( classname ) \ |
| classname( \ |
| const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rxFactory, \ |
| const ::rtl::OUString& _rUnoControlModelTypeName, \ |
| const ::rtl::OUString& _rDefault, \ |
| const sal_Bool _bSupportExternalBinding, \ |
| const sal_Bool _bSupportsValidation \ |
| ); \ |
| DECLARE_DEFAULT_CLONE_CTOR( classname ) \ |
| DECLARE_DEFAULT_DTOR( classname ) \ |
| |
| // all xtors for a leas class of the object hierarchy |
| #define DECLARE_DEFAULT_LEAF_XTOR( classname ) \ |
| classname( \ |
| const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rxFactory \ |
| ); \ |
| classname( \ |
| const classname* _pOriginal, \ |
| const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rxFactory \ |
| ); \ |
| DECLARE_DEFAULT_DTOR( classname ) \ |
| |
| //================================================================== |
| // XCloneable |
| #define DECLARE_XCLONEABLE( ) \ |
| virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloneable > SAL_CALL createClone( ) throw (::com::sun::star::uno::RuntimeException) |
| |
| #define IMPLEMENT_DEFAULT_CLONING( classname ) \ |
| ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloneable > SAL_CALL classname::createClone( ) throw (::com::sun::star::uno::RuntimeException) \ |
| { \ |
| classname* pClone = new classname( this, getContext().getLegacyServiceFactory() ); \ |
| pClone->clonedFrom( this ); \ |
| return pClone; \ |
| } |
| |
| //================================================================== |
| //= OBoundControlModel |
| //= model of a form layer control which is bound to a data source field |
| //================================================================== |
| typedef ::cppu::ImplHelper4 < ::com::sun::star::form::XLoadListener |
| , ::com::sun::star::form::XReset |
| , ::com::sun::star::beans::XPropertyChangeListener |
| , ::com::sun::star::sdb::XRowSetChangeListener |
| > OBoundControlModel_BASE1; |
| |
| // separated into an own base class since derivees can disable the support for this |
| // interface, thus we want to easily exclude it in the queryInterface and getTypes |
| typedef ::cppu::ImplHelper1 < ::com::sun::star::form::XBoundComponent |
| > OBoundControlModel_COMMITTING; |
| |
| // dito |
| typedef ::cppu::ImplHelper2 < ::com::sun::star::form::binding::XBindableValue |
| , ::com::sun::star::util::XModifyListener |
| > OBoundControlModel_BINDING; |
| |
| // dito |
| typedef ::cppu::ImplHelper2 < ::com::sun::star::form::validation::XValidityConstraintListener |
| , ::com::sun::star::form::validation::XValidatableFormComponent |
| > OBoundControlModel_VALIDATION; |
| |
| class OBoundControlModel :public OControlModel |
| ,public OBoundControlModel_BASE1 |
| ,public OBoundControlModel_COMMITTING |
| ,public OBoundControlModel_BINDING |
| ,public OBoundControlModel_VALIDATION |
| ,public ::comphelper::OPropertyChangeListener |
| { |
| protected: |
| enum ValueChangeInstigator |
| { |
| eDbColumnBinding, |
| eExternalBinding, |
| eOther |
| }; |
| |
| private: |
| ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > |
| m_xField; |
| // the form which controls supplies the field we bind to. |
| ::com::sun::star::uno::Reference< ::com::sun::star::form::XLoadable > |
| m_xAmbientForm; |
| |
| ::rtl::OUString m_sValuePropertyName; |
| sal_Int32 m_nValuePropertyAggregateHandle; |
| sal_Int32 m_nFieldType; |
| ::com::sun::star::uno::Type m_aValuePropertyType; |
| bool m_bValuePropertyMayBeVoid; |
| |
| ResetHelper m_aResetHelper; |
| ::cppu::OInterfaceContainerHelper m_aUpdateListeners; |
| ::cppu::OInterfaceContainerHelper m_aFormComponentListeners; |
| |
| ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XValueBinding > |
| m_xExternalBinding; |
| ::com::sun::star::uno::Reference< ::com::sun::star::form::validation::XValidator > |
| m_xValidator; |
| ::com::sun::star::uno::Type m_aExternalValueType; |
| |
| // <properties> |
| ::rtl::OUString m_aControlSource; // Datenquelle, Name des Feldes |
| ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > |
| m_xLabelControl; // reference to a sibling control (model) which is our label |
| sal_Bool m_bInputRequired; |
| // </properties> |
| |
| ::comphelper::OPropertyChangeMultiplexer* |
| m_pAggPropMultiplexer; |
| |
| bool m_bFormListening : 1; // are we currently a XLoadListener at our ambient form? |
| sal_Bool m_bLoaded : 1; |
| sal_Bool m_bRequired : 1; |
| const sal_Bool m_bCommitable : 1; // do we support XBoundComponent? |
| const sal_Bool m_bSupportsExternalBinding : 1; // do we support XBindableValue? |
| const sal_Bool m_bSupportsValidation : 1; // do we support XValidatable? |
| sal_Bool m_bForwardValueChanges : 1; // do we currently handle changes in the bound database field? |
| sal_Bool m_bTransferingValue : 1; // true if we're currently transfering our value to an external binding |
| sal_Bool m_bIsCurrentValueValid : 1; // flag specifying whether our current value is valid, relative to our external validator |
| sal_Bool m_bBindingControlsRO : 1; // is our ReadOnly property currently controlled by our external binding? |
| sal_Bool m_bBindingControlsEnable : 1; // is our Enabled property currently controlled by our external binding? |
| |
| ValueChangeInstigator m_eControlValueChangeInstigator; |
| |
| protected: |
| ::rtl::OUString m_aLabelServiceName; |
| // when setting the label for our control (property FM_PROP_CONTROLLABEL, member m_xLabelControl), |
| // we accept only objects supporting an XControlModel interface, an XServiceInfo interface and |
| // support for a service (XServiceInfo::supportsService) determined by this string. |
| // Any other arguments will throw an IllegalArgumentException. |
| // The default value is FM_COMPONENT_FIXEDTEXT. |
| |
| ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet > |
| m_xCursor; |
| ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumnUpdate > |
| m_xColumnUpdate; |
| ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn > |
| m_xColumn; |
| |
| protected: |
| inline const ::rtl::OUString& getValuePropertyName( ) const { return m_sValuePropertyName; } |
| inline sal_Int32 getValuePropertyAggHandle( ) const { return m_nValuePropertyAggregateHandle; } |
| inline const ::rtl::OUString& getControlSource( ) const { return m_aControlSource; } |
| inline sal_Bool isRequired() const { return m_bRequired; } |
| inline sal_Bool isLoaded() const { return m_bLoaded; } |
| |
| protected: |
| |
| OBoundControlModel( |
| const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rFactory, |
| // factory to create the aggregate with |
| const ::rtl::OUString& _rUnoControlModelTypeName, // service name of te model to aggregate |
| const ::rtl::OUString& _rDefault, // service name of the default control |
| const sal_Bool _bCommitable, // is the control (model) commitable ? |
| const sal_Bool _bSupportExternalBinding, // set to sal_True if you want to support XBindableValue |
| const sal_Bool _bSupportsValidation // set to sal_True if you want to support XValidatable |
| ); |
| OBoundControlModel( |
| const OBoundControlModel* _pOriginal, // the original object to clone |
| const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rFactory |
| // factory to create the aggregate with |
| ); |
| virtual ~OBoundControlModel(); |
| |
| /// late ctor after cloning |
| virtual void clonedFrom( const OControlModel* _pOriginal ); |
| |
| /** initializes the part of the class which is related to the control value. |
| |
| <p>Kind of late ctor, to be called for derivees which have a dedicated value property.<br/> |
| The value property is the property which's value is synced with either the database |
| column the object is bound to, or with the external value binding, if present.<br/> |
| E.g. for a text control model, this property will most probably be "Text".</p> |
| |
| <p>Derived classes are stronly recommend to call this method - at least the |
| "DataFieldProperty" (exposed in getFastPropertyValue) relies on the information |
| given herein, and needs to be supplied otherwise else.</p> |
| |
| <p>If this method has been called properly, then <member>setControlValue</member> |
| does not need to be overridden - it will simply set the property value at the |
| aggregate then.</p> |
| |
| @precond |
| The method has not be called before during the life time of the object. |
| |
| @param _rValuePropertyName |
| the name of the value property |
| @param _nValuePropertyExternalHandle |
| the handle of the property, as exposed to external components.<br/> |
| Normally, this information can be obtained dynamically (e.g. from describeFixedProperties), |
| but since this method is to be called from within the constructor of derived classes, |
| we prefer to be on the *really* safe side here .... |
| |
| @see setControlValue |
| @see suspendValueListening |
| @see resumeValueListening |
| @see describeFixedProperties |
| */ |
| void initValueProperty( |
| const ::rtl::OUString& _rValuePropertyName, |
| sal_Int32 _nValuePropertyExternalHandle |
| ); |
| |
| /** initializes the part of the class which is related to the control value. |
| |
| <p>In opposite to ->initValueProperty, this method is to be used for value properties which are <em>not</em> |
| implemented by our aggregate, but by ourselves.</p> |
| |
| <p>Certain functionality is not available when using own value properties. This includes binding to an external |
| value and external validation. (This is not a conceptual limit, but simply missing implementation.)</p> |
| */ |
| void initOwnValueProperty( |
| const ::rtl::OUString& i_rValuePropertyName |
| ); |
| |
| /** suspends listening at the value property |
| |
| <p>As long as this listening is suspended, changes in the value property will not be |
| recognized and not be handled.</p> |
| |
| @see initValueProperty |
| @see resumeValueListening |
| */ |
| void suspendValueListening( ); |
| |
| /** resumes listening at the value property |
| |
| <p>As long as this listening is suspended, changes in the value property will not be |
| recognized and not be handled.</p> |
| |
| @precond |
| listening at the value property is currently suspended |
| |
| @see initValueProperty |
| @see resumeValueListening |
| */ |
| void resumeValueListening( ); |
| |
| /** (to be) called when the value property changed |
| |
| Normally, this is done automatically, since the value property is a property of our aggregate, and we're |
| a listener at this property. |
| However, in some cases the value property might not be an aggregate property, but a property of the |
| delegator instance. In this case, you'll need to call <code>onValuePropertyChange</code> whenever this |
| property changes. |
| */ |
| void onValuePropertyChange( ControlModelLock& i_rControLock ); |
| |
| /** starts listening at the aggregate, for changes in the given property |
| |
| <p>The OBoundControlModel automatically registers a multiplexer which listens for |
| changes in the aggregate property values. By default, only the control value property |
| is observed. You may add additional properties to be observed with this method.</p> |
| |
| @see initValueProperty |
| @see _propertyChanged |
| */ |
| void startAggregatePropertyListening( const ::rtl::OUString& _rPropertyName ); |
| |
| /** returns the default which should be used when resetting the control |
| |
| <p>The default implementation returns an empty Any.</p> |
| |
| @see resetNoBroadcast |
| */ |
| virtual ::com::sun::star::uno::Any |
| getDefaultForReset() const; |
| |
| /** translates a db column value into a control value. |
| |
| <p>Must transform the very current value of the database column we're bound to |
| (<member>m_xColumn</member>) into a value which can be used as current value |
| for the control.</p> |
| |
| @see setControlValue |
| @pure |
| */ |
| virtual ::com::sun::star::uno::Any |
| translateDbColumnToControlValue( ) = 0; |
| |
| /** returns the data types which the control could use to exchange data with |
| an external value binding |
| |
| The types returned here are completely independent from the concrete value binding, |
| they're just candidates which depend on the control type, and possible the concrete state |
| of the control (i.e. some property value). |
| |
| If a control implementation supports multiple types, the ordering in the returned |
| sequence indicates preference: Preferred types are mentioned first. |
| |
| The default implementation returns the type of our value property. |
| */ |
| virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > |
| getSupportedBindingTypes(); |
| |
| /** translates the given value, which was obtained from the current external value binding, |
| to a value which can be used in setControlValue |
| |
| <p>The default implementation returns the value itself, exception when it is VOID, and |
| our value property is not allowed to be void - in this case, the returned value is a |
| default-constructed value of the type required by our value property. |
| |
| @see hasExternalValueBinding |
| @see getExternalValueType |
| */ |
| virtual ::com::sun::star::uno::Any |
| translateExternalValueToControlValue( const ::com::sun::star::uno::Any& _rExternalValue ) const; |
| |
| /** commits the current control value to our external value binding |
| |
| <p>The default implementation simply calls getControlValue.</p> |
| |
| @see hasExternalValueBinding |
| @see initValueProperty |
| */ |
| virtual ::com::sun::star::uno::Any |
| translateControlValueToExternalValue( ) const; |
| |
| /** commits the current control value to the database column we're bound to |
| @precond |
| we're properly bound to a database column, especially <member>m_xColumnUpdate</member> |
| is not <NULL/> |
| @param _bPostReset |
| <TRUE/> if and only if the current control value results from a reset (<member>getDefaultForReset</member>) |
| @pure |
| */ |
| virtual sal_Bool commitControlValueToDbColumn( |
| bool _bPostReset |
| ) = 0; |
| |
| /** sets the given value as new current value for the control |
| |
| Besides some administrative work (such as caring for <member>m_eControlValueChangeInstigator</member>), |
| this method simply calls <member>doSetControlValue</member>. |
| |
| @precond |
| Our own mutex is locked. |
| @param _rValue |
| The value to set. This value is guaranteed to be created by |
| <member>translateDbColumnToControlValue</member> or |
| <member>translateExternalValueToControlValue</member> |
| @param _eInstigator |
| the instigator of the value change |
| */ |
| void setControlValue( |
| const ::com::sun::star::uno::Any& _rValue, |
| ValueChangeInstigator _eInstigator |
| ); |
| /** |
| <p>The default implementation will forward the given value to the aggregate, using |
| m_nValuePropertyAggregateHandle and/or m_sValuePropertyName.</p> |
| |
| @precond |
| Our own mutex is locked. |
| @param _rValue |
| The value to set. This value is guaranteed to be created by |
| <member>translateDbColumnToControlValue</member> or |
| <member>translateExternalValueToControlValue</member> |
| */ |
| virtual void doSetControlValue( |
| const ::com::sun::star::uno::Any& _rValue |
| ); |
| |
| /** retrieves the current value of the control |
| |
| <p>The default implementation will ask the aggregate for the property value |
| determined by either m_nValuePropertyAggregateHandle and/or m_sValuePropertyName.</p> |
| |
| @precond |
| Our own mutex is locked. |
| */ |
| virtual ::com::sun::star::uno::Any |
| getControlValue( ) const; |
| |
| /** called whenever a connection to a database column has been established |
| */ |
| virtual void onConnectedDbColumn( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxForm ); |
| /** called whenever a connection to a database column has been suspended |
| */ |
| virtual void onDisconnectedDbColumn(); |
| |
| /** called whenever a connection to an external supplier of values (XValueBinding) has been established |
| @see m_xExternalBinding |
| */ |
| virtual void onConnectedExternalValue( ); |
| /** called whenever a connection to an external supplier of values (XValueBinding) has been suspended |
| */ |
| virtual void onDisconnectedExternalValue(); |
| |
| /** called whenever an external validator has been registered |
| */ |
| virtual void onConnectedValidator( ); |
| /** called whenever an external validator has been revoked |
| */ |
| virtual void onDisconnectedValidator( ); |
| |
| /** nFieldType ist der Typ des Feldes, an das das Model gebunden werden soll. |
| Das Binden erfolgt genau dann, wenn Rueckgabewert sal_True. |
| Die Standard-Implementation erlaubt alles ausser den drei binary-Typen und |
| FieldType_OTHER. |
| */ |
| virtual sal_Bool approveDbColumnType(sal_Int32 _nColumnType); |
| |
| /** retrieves the current value of the control, in a shape which can be used with our |
| external validator. |
| |
| The default implementation simply calls <member>>translateControlValueToExternalValue</member>. |
| |
| @precond |
| Our own mutex is locked. |
| */ |
| virtual ::com::sun::star::uno::Any |
| translateControlValueToValidatableValue( ) const; |
| |
| /** retrieves the current value of the form component |
| |
| This is the implementation method for XValidatableFormComponent::getCurrentValue. The default implementation |
| calls translateControlValueToValidatableValue if a validator is present, otherwise getControlValue. |
| |
| @precond |
| our mutex is locked when this method is called |
| */ |
| virtual ::com::sun::star::uno::Any |
| getCurrentFormComponentValue() const; |
| |
| /** We can't write (new) common properties in this base class, as the file format doesn't allow this |
| (unfortunally). So derived classes may use the following to methods. They secure the written |
| data with marks, so any new common properties in newer versions will be skipped by older ones. |
| */ |
| void writeCommonProperties(const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectOutputStream>& _rxOutStream); |
| void readCommonProperties(const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectInputStream>& _rxInStream); |
| // the next method may be used in derived classes's read when an unknown version is encountered |
| void defaultCommonProperties(); |
| |
| /** called to reset the control to some kind of default. |
| |
| <p>The semantics of "default" is finally defined by the derived class (in particular, |
| by <member>getDefaultForReset</member>).</p> |
| |
| <p>No listener notification needs to be done in the derived class.</p> |
| |
| <p>Normally, you won't override this method, but <member>getDefaultForReset</member> instead.</p> |
| |
| @see getDefaultForReset |
| */ |
| virtual void resetNoBroadcast(); |
| |
| virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type> _getTypes(); |
| |
| /// sets m_xField to the given new value, without notifying our listeners |
| void impl_setField_noNotify( |
| const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _rxField |
| ); |
| inline bool hasField() const |
| { |
| return m_xField.is(); |
| } |
| inline sal_Int32 getFieldType() const |
| { |
| return m_nFieldType; |
| } |
| |
| // OControlModel's property handling |
| virtual void describeFixedProperties( |
| ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >& /* [out] */ _rProps |
| ) const; |
| |
| public: |
| inline const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& getField() const |
| { |
| return m_xField; |
| } |
| |
| public: |
| // UNO Anbindung |
| DECLARE_UNO3_AGG_DEFAULTS(OBoundControlModel, OControlModel); |
| virtual ::com::sun::star::uno::Any SAL_CALL queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw (::com::sun::star::uno::RuntimeException); |
| |
| // OComponentHelper |
| virtual void SAL_CALL disposing(); |
| |
| // XReset |
| virtual void SAL_CALL reset( ) throw(::com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL addResetListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XResetListener >& aListener ) throw(::com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL removeResetListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XResetListener >& aListener ) throw(::com::sun::star::uno::RuntimeException); |
| |
| // XServiceInfo |
| virtual StringSequence SAL_CALL getSupportedServiceNames( ) throw(::com::sun::star::uno::RuntimeException); |
| |
| // XServiceInfo - static version |
| static StringSequence SAL_CALL getSupportedServiceNames_Static() throw(::com::sun::star::uno::RuntimeException); |
| |
| // XChild |
| 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); |
| |
| // XPersistObject |
| 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); |
| 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); |
| |
| // XBoundComponent |
| virtual sal_Bool SAL_CALL commit() throw(::com::sun::star::uno::RuntimeException); |
| |
| // XUpdateBroadcaster (base of XBoundComponent) |
| virtual void SAL_CALL addUpdateListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XUpdateListener >& aListener ) throw(::com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL removeUpdateListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XUpdateListener >& aListener ) throw(::com::sun::star::uno::RuntimeException); |
| |
| // XPropertySet |
| virtual void SAL_CALL getFastPropertyValue(::com::sun::star::uno::Any& rValue, sal_Int32 nHandle) const; |
| virtual sal_Bool SAL_CALL convertFastPropertyValue( |
| ::com::sun::star::uno::Any& _rConvertedValue, ::com::sun::star::uno::Any& _rOldValue, sal_Int32 _nHandle, const ::com::sun::star::uno::Any& _rValue ) |
| throw (::com::sun::star::lang::IllegalArgumentException); |
| virtual void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue ) |
| throw (::com::sun::star::uno::Exception); |
| using ::cppu::OPropertySetHelper::getFastPropertyValue; |
| |
| // ::com::sun::star::beans::XPropertyState |
| virtual ::com::sun::star::uno::Any getPropertyDefaultByHandle( sal_Int32 nHandle ) const; |
| |
| // XEventListener |
| virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw (::com::sun::star::uno::RuntimeException); |
| |
| // XPropertyChangeListener |
| virtual void SAL_CALL propertyChange( const ::com::sun::star::beans::PropertyChangeEvent& evt ) throw(::com::sun::star::uno::RuntimeException); |
| |
| // XRowSetChangeListener |
| virtual void SAL_CALL onRowSetChanged( const ::com::sun::star::lang::EventObject& i_Event ) throw (::com::sun::star::uno::RuntimeException); |
| |
| // XLoadListener |
| virtual void SAL_CALL loaded( const ::com::sun::star::lang::EventObject& aEvent ) throw(::com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL unloading( const ::com::sun::star::lang::EventObject& aEvent ) throw(::com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL unloaded( const ::com::sun::star::lang::EventObject& aEvent ) throw(::com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL reloading( const ::com::sun::star::lang::EventObject& aEvent ) throw(::com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL reloaded( const ::com::sun::star::lang::EventObject& aEvent ) throw(::com::sun::star::uno::RuntimeException); |
| |
| private: |
| // XBindableValue |
| 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); |
| virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XValueBinding > SAL_CALL getValueBinding( ) throw (::com::sun::star::uno::RuntimeException); |
| |
| // XModifyListener |
| virtual void SAL_CALL modified( const ::com::sun::star::lang::EventObject& _rEvent ) throw (::com::sun::star::uno::RuntimeException); |
| |
| // XValidatable |
| 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); |
| virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::validation::XValidator > SAL_CALL getValidator( ) throw (::com::sun::star::uno::RuntimeException); |
| |
| // XValidityConstraintListener |
| virtual void SAL_CALL validityConstraintChanged( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException); |
| |
| // XValidatableFormComponent |
| virtual sal_Bool SAL_CALL isValid( ) throw (::com::sun::star::uno::RuntimeException); |
| virtual ::com::sun::star::uno::Any SAL_CALL getCurrentValue( ) throw (::com::sun::star::uno::RuntimeException); |
| 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); |
| 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); |
| |
| protected: |
| // OPropertyChangeListener |
| virtual void |
| _propertyChanged( const ::com::sun::star::beans::PropertyChangeEvent& _rEvt ) throw ( ::com::sun::star::uno::RuntimeException ); |
| |
| /// checks whether we currently have an external value binding in place |
| inline bool hasExternalValueBinding() const { return m_xExternalBinding.is(); } |
| |
| // checks whether we currently have an external validator |
| inline bool hasValidator() const { return m_xValidator.is(); } |
| |
| /** transfers the very current value of the db column we're bound to the control |
| @precond |
| our own mutex is locked |
| @precond |
| we don't have an external binding in place |
| */ |
| void transferDbValueToControl( ); |
| |
| /** transfers the current value of the active external binding to the control |
| @precond |
| we do have an active external binding in place |
| */ |
| void transferExternalValueToControl( ControlModelLock& _rInstanceLock ); |
| |
| /** transfers the control value to the external binding |
| @precond |
| our own mutex is locked, and _rInstanceLock is the guard locking it |
| @precond |
| we do have an active external binding in place |
| */ |
| void transferControlValueToExternal( ControlModelLock& _rInstanceLock ); |
| |
| /** calculates the type which is to be used to communicate with the current external binding, |
| and stores it in m_aExternalValueType |
| |
| The method checks the possible type candidates as returned by getSupportedBindingTypes, |
| and the types supported by the current external binding, if any. |
| */ |
| void calculateExternalValueType(); |
| |
| /** returns the type which should be used to exchange data with our external value binding |
| |
| @see initValueProperty |
| */ |
| const ::com::sun::star::uno::Type& |
| getExternalValueType() const { return m_aExternalValueType; } |
| |
| /** initializes the control from m_xField |
| |
| Basically, this method calls transferDbValueToControl - but only if our cursor is positioned |
| on a valid row. Otherwise, the control is reset. |
| |
| @precond |
| m_xField is not <NULL/> |
| */ |
| void initFromField( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet>& _rxForm ); |
| |
| private: |
| sal_Bool connectToField( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet>& _rxForm ); |
| void resetField(); |
| |
| /** does a new validation of the control value |
| |
| If necessary, our <member>m_bIsCurrentValueValid</member> member will be adjusted, |
| and changes will be notified. |
| |
| Note that it's not necessary that we're connected to a validator. If we are not, |
| it's assumed that our value is valid, and this is handled appropriately. |
| |
| Use this method if there is a potential that <b>only</b> the validity flag changed. If |
| any of the other aspects (our current value, or our current text) changed, then |
| pass <TRUE/> for <member>_bForceNotification</member>. |
| |
| @param _bForceNotification |
| if <TRUE/>, then the validity listeners will be notified, not matter whether the validity |
| changed. |
| */ |
| void recheckValidity( bool _bForceNotification ); |
| |
| /// initializes m_pAggPropMultiplexer |
| void implInitAggMultiplexer( ); |
| |
| /// initializes listening at the value property |
| void implInitValuePropertyListening( ) const; |
| |
| /** adds or removes the component as load listener to/from our form, and (if necessary) as RowSetChange listener at |
| our parent. |
| |
| @precond there must no external value binding be in place |
| */ |
| void doFormListening( const bool _bStart ); |
| |
| inline bool isFormListening() const { return m_bFormListening; } |
| |
| /** determines the new value of m_xAmbientForm |
| */ |
| void impl_determineAmbientForm_nothrow(); |
| |
| /** connects to a value supplier which is an database column. |
| |
| The column is take from our parent, which must be a database form respectively row set. |
| |
| @precond The control does not have an external value supplier |
| |
| @param _bFromReload |
| Determines whether the connection is made after the row set has been loaded (<FALSE/>) |
| or reloaded (<TRUE/>) |
| |
| @see impl_disconnectDatabaseColumn_noNotify |
| */ |
| void impl_connectDatabaseColumn_noNotify( |
| bool _bFromReload |
| ); |
| |
| /** disconnects from a value supplier which is an database column |
| |
| @precond The control does not have an external value supplier |
| @see impl_connectDatabaseColumn_noNotify |
| */ |
| void impl_disconnectDatabaseColumn_noNotify(); |
| |
| /** connects to an external value binding |
| |
| <p>Note that by definition, external data bindings superseede the SQL data binding which |
| is defined by our RowSet-column-related properties. This means that in case we're currently |
| connected to a database column when this is called, this connection is suspended.</p> |
| |
| @precond |
| the new external binding has already been approved (see <member>impl_approveValueBinding_nolock</member>) |
| @precond |
| there currently is no external binding in place |
| */ |
| void connectExternalValueBinding( |
| const ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XValueBinding >& _rxBinding, |
| ControlModelLock& _rInstanceLock |
| ); |
| |
| /** disconnects from an external value binding |
| |
| @precond |
| there currently is an external binding in place |
| */ |
| void disconnectExternalValueBinding( ); |
| |
| /** connects the component to an external validator |
| |
| @precond |
| there currently is no active validator |
| @precond |
| our mutex is currently locked exactly once |
| */ |
| void connectValidator( |
| const ::com::sun::star::uno::Reference< ::com::sun::star::form::validation::XValidator >& _rxValidator |
| ); |
| |
| /** disconnects the component from it's current an external validator |
| |
| @precond |
| there currently is an active validator |
| @precond |
| our mutex is currently locked exactly once |
| */ |
| void disconnectValidator( ); |
| |
| /** called from within <member scope="com::sun::star:::form::binding">XBindableValue::setValueBinding</member> |
| to approve the new binding |
| |
| The default implementation approves the binding if and only if it is not <NULL/>, and supports |
| the type returned by getExternalValueType. |
| |
| @param _rxBinding |
| the binding which applies for being responsible for our value, Must not be |
| <NULL/> |
| @return |
| <TRUE/> if and only if the given binding can supply values in the proper type |
| |
| @seealso getExternalValueType |
| */ |
| sal_Bool impl_approveValueBinding_nolock( |
| const ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XValueBinding >& _rxBinding |
| ); |
| }; |
| |
| //========================================================================= |
| //= inlines |
| //========================================================================= |
| inline void ControlModelLock::acquire() |
| { |
| m_rModel.lockInstance( OControlModel::LockAccess() ); |
| m_bLocked = true; |
| } |
| inline void ControlModelLock::release() |
| { |
| OSL_ENSURE( m_bLocked, "ControlModelLock::release: not locked!" ); |
| m_bLocked = false; |
| |
| if ( 0 == m_rModel.unlockInstance( OControlModel::LockAccess() ) ) |
| impl_notifyAll_nothrow(); |
| } |
| |
| //......................................................................... |
| } |
| //......................................................................... |
| |
| #endif // _FORMS_FORMCOMPONENT_HXX_ |
| |