/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
 *
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * Copyright 2000, 2010 Oracle and/or its affiliates.
 *
 * OpenOffice.org - a multi-platform office productivity suite
 *
 * This file is part of OpenOffice.org.
 *
 * OpenOffice.org is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License version 3
 * only, as published by the Free Software Foundation.
 *
 * OpenOffice.org is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License version 3 for more details
 * (a copy is included in the LICENSE file that accompanied this code).
 *
 * You should have received a copy of the GNU Lesser General Public License
 * version 3 along with OpenOffice.org.  If not, see
 * <http://www.openoffice.org/license.html>
 * for a copy of the LGPLv3 License.
 *
 ************************************************************************/

#ifndef _FORMS_FORMCOMPONENT_HXX_
#define _FORMS_FORMCOMPONENT_HXX_

#include <cppuhelper/component.hxx>
#include <cppuhelper/implbase3.hxx>
#include <cppuhelper/implbase5.hxx>
#include <com/sun/star/awt/XControl.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/form/XBoundControl.hpp>
#include <com/sun/star/container/XNamed.hpp>
#include <com/sun/star/form/XFormComponent.hpp>
#include <com/sun/star/form/XBoundComponent.hpp>
#include <com/sun/star/form/XLoadListener.hpp>
#include <com/sun/star/form/XReset.hpp>
#include <com/sun/star/sdbc/XRowSet.hpp>
#include <com/sun/star/sdb/XColumn.hpp>
#include <com/sun/star/sdb/XColumnUpdate.hpp>
#include <com/sun/star/util/XCloneable.hpp>

#include <comphelper/uno3.hxx>
#include <comphelper/guarding.hxx>
#include <comphelper/basicio.hxx>

#include "property.hrc"
#include "property.hxx"
#include "ids.hxx"
#include "cloneable.hxx"
namespace binfilter {

    using namespace ::comphelper;


//.........................................................................
namespace frm
{
//.........................................................................

// default tab index for components
const sal_Int16 FRM_DEFAULT_TABINDEX = 0;

// 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( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.forms." )) + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(#ImplName)); }

// macro for overriding the getInfoServive method of OAggregationArrayUsageHelper
#define IMPLEMENT_INFO_SERVICE()    \
    virtual IPropertyInfoService* getInfoService() const { return &s_aPropInfos; }

//==================================================================
//= substitutions for the xxx_AGGREGATION_PROPERTY_HELPER-macros
//==================================================================
#define FRM_BEGIN_PROP_HELPER(count)    \
    BEGIN_AGGREGATION_PROPERTY_HELPER(count, m_xAggregateSet)   \

#define FRM_END_PROP_HELPER()   \
    END_AGGREGATION_PROPERTY_HELPER();  \

//=========================================================================
//= 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;
    ::rtl::OUString                             m_aService;

    ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >
                                                m_xServiceFactory;

public:
    OControl(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rFactory, const ::rtl::OUString& _sService);

    virtual ~OControl();

// 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;

// 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
};

//==================================================================
//= 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;

public:
    OBoundControl(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rxFactory, const ::rtl::OUString& _sService);
    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

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
//==================================================================
typedef ::cppu::ImplHelper5 <   ::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
                            >   OControlModel_BASE;


class OControlModel :public ::cppu::OComponentHelper
                    ,public OPropertySetAggregationHelper
                    ,public OControlModel_BASE
                    ,public OCloneableAggregation
{

protected:
    ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory> m_xServiceFactory;

    ::osl::Mutex            m_aMutex;
        // we use this kind of mutex to check the correct using of MutexRelease
        // (in the product version OCountedMutex is defined as OMutex)

    InterfaceRef                    m_xParent;                  // ParentComponent
    OImplementationIdsRef           m_aHoldIdHelper;

    static ConcretInfoService s_aPropInfos;

    const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >&
        getORB( ) const { return m_xServiceFactory; }

// <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
// </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 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 _bSetDelegator = sal_True                                // set to FALSE if you want to call setDelegator later (after returning from this ctor)
    );
    virtual ~OControlModel();

    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();

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;

// 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;
};

//==================================================================
#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, \
        const sal_Bool _bSetDelegator = sal_True \
    ); \
    classname( \
        const classname* _pOriginal, \
        const   ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rxFactory, \
        const sal_Bool _bSetDelegator = sal_True \
    ); \
    ~classname() \

#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 \
    ); \
    ~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) \
    { \
        return new classname( this, getORB() ); \
    }

//==================================================================
//= OBoundControlModel
//= model of a form layer control which is bound to a data source field
//==================================================================
typedef ::cppu::ImplHelper3<    ::com::sun::star::form::XLoadListener,
                                ::com::sun::star::form::XReset,
                                ::com::sun::star::beans::XPropertyChangeListener >  OBoundControlModel_BASE1;
typedef ::cppu::ImplHelper1<    ::com::sun::star::form::XBoundComponent>            OBoundControlModel_BASE2;

class OBoundControlModel    :public OControlModel
                            ,public OBoundControlModel_BASE1
                            ,public OBoundControlModel_BASE2
{
private:
    ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>        m_xField;
protected:
    cppu::OInterfaceContainerHelper m_aUpdateListeners;
    cppu::OInterfaceContainerHelper m_aResetListeners;

    ::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;


    ::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.
    ::rtl::OUString                 m_sDataFieldConnectivityProperty;

// <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
// </properties>

    sal_Bool                    m_bLoaded       : 1;
    sal_Bool                    m_bRequired     : 1;
    sal_Bool                    m_bCommitable   : 1;
    sal_Bool                    m_bForwardValueChanges : 1;

    sal_Bool                    m_bResetting    : 1;    // sal_True while in ::reset

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 = ::rtl::OUString(),                   // service name of the default control
        const sal_Bool _bCommitable = sal_True,                                 // is the control (model) commitable ?
        const sal_Bool _bSetDelegator = sal_True                                // set to FALSE if you want to call setDelegator later (after returning from this ctor)
    );
    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
        const sal_Bool _bCommitable = sal_True,                                 // is the control (model) commitable ?
        const sal_Bool _bSetDelegator = sal_True                                // set to FALSE if you want to call setDelegator later (after returning from this ctor)
    );
    virtual ~OBoundControlModel();

    /** 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        _approve(sal_Int32 _nColumnType);

    // 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 secured 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();

    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type>   _getTypes();

    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);

// 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;

// 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);

// 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:
    void resetField() { m_xColumnUpdate = NULL; m_xColumn = NULL; m_xField = NULL; }
};

//.........................................................................
}
//.........................................................................

}//end of namespace binfilter
#endif // _FORMS_FORMCOMPONENT_HXX_

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
