/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/



#include "errorbroadcaster.hxx"
#include "FormComponent.hxx"
#include "formcontrolfont.hxx"
#include "InterfaceContainer.hxx"

/** === begin UNO includes === **/
#include <com/sun/star/form/XGridColumnFactory.hpp>
#include <com/sun/star/form/XLoadable.hpp>
#include <com/sun/star/sdb/XRowSetSupplier.hpp>
#include <com/sun/star/sdb/XRowSetChangeBroadcaster.hpp>
#include <com/sun/star/view/XSelectionSupplier.hpp>
/** === end UNO includes === **/

#include <comphelper/proparrhlp.hxx>
#include <cppuhelper/implbase7.hxx>
#include <tools/link.hxx>

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

class OGridColumn;

//==================================================================
// ColumnDescription
//==================================================================

	struct ColumnDescription : public ElementDescription
	{
	public:
		OGridColumn*				pColumn;		// not owned by this instance! only to prevent duplicate XUnoTunnel usage
	};

//==================================================================
// OGridControlModel
//==================================================================
typedef ::cppu::ImplHelper7 <	::com::sun::star::awt::XControlModel
							,	::com::sun::star::form::XGridColumnFactory
							,	::com::sun::star::form::XReset
							,	::com::sun::star::view::XSelectionSupplier
							,	::com::sun::star::sdb::XSQLErrorListener
                            ,   ::com::sun::star::sdb::XRowSetSupplier
                            ,   ::com::sun::star::sdb::XRowSetChangeBroadcaster
							>	OGridControlModel_BASE;
 
class OGridControlModel :public OControlModel
						,public OInterfaceContainer
						,public OErrorBroadcaster
                        ,public FontControlModel
						,public OGridControlModel_BASE
{
	::cppu::OInterfaceContainerHelper		m_aSelectListeners,
											m_aResetListeners,
                                            m_aRowSetChangeListeners;

// [properties]
	::com::sun::star::uno::Any				m_aRowHeight;			// Zeilenhoehe
	::com::sun::star::uno::Any				m_aTabStop;
	::com::sun::star::uno::Any				m_aBackgroundColor;
	::com::sun::star::uno::Any				m_aCursorColor; 			// transient
    ::com::sun::star::uno::Any              m_aBorderColor;
	::rtl::OUString 						m_aDefaultControl;
	::rtl::OUString 						m_sHelpText;
// [properties]

	::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >		m_xSelection;

// [properties]
	::rtl::OUString 			m_sHelpURL; 				// URL
	sal_Int16					m_nBorder;
    sal_Int16                   m_nWritingMode;
    sal_Int16                   m_nContextWritingMode;
	sal_Bool					m_bEnableVisible	: 1;
	sal_Bool					m_bEnable			: 1;
	sal_Bool					m_bNavigation		: 1;
	sal_Bool					m_bRecordMarker 	: 1;
	sal_Bool					m_bPrintable		: 1;
	sal_Bool					m_bAlwaysShowCursor : 1;    // transient
	sal_Bool					m_bDisplaySynchron	: 1;    // transient
// [properties]

protected:
	void _reset();

public:
	DECLARE_DEFAULT_LEAF_XTOR( OGridControlModel );

    // UNO Anbindung
	DECLARE_UNO3_AGG_DEFAULTS(OGridControlModel, OControlModel);
	virtual ::com::sun::star::uno::Any SAL_CALL queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw (::com::sun::star::uno::RuntimeException);

    // XChild
	virtual void SAL_CALL setParent(const InterfaceRef& Parent) throw(::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException);

    // XServiceInfo
	IMPLEMENTATION_NAME(OGridControlModel);
	virtual StringSequence SAL_CALL getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException);

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

    // XEventListener
	virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& _rSource) throw(::com::sun::star::uno::RuntimeException);

    // 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>& _rxListener) throw ( ::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL removeResetListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XResetListener>& _rxListener) throw ( ::com::sun::star::uno::RuntimeException);

    // XSelectionSupplier
	virtual sal_Bool SAL_CALL select(const ::com::sun::star::uno::Any& aElement) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Any SAL_CALL getSelection() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL addSelectionChangeListener(const ::com::sun::star::uno::Reference< ::com::sun::star::view::XSelectionChangeListener >& xListener) throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL removeSelectionChangeListener(const ::com::sun::star::uno::Reference< ::com::sun::star::view::XSelectionChangeListener >& xListener) throw(::com::sun::star::uno::RuntimeException);

    // XGridColumnFactory
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet> SAL_CALL createColumn(const ::rtl::OUString& ColumnType) throw ( :: com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
	virtual StringSequence SAL_CALL getColumnTypes() throw ( ::com::sun::star::uno::RuntimeException);

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

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

    // XPropertyState
	virtual ::com::sun::star::uno::Any getPropertyDefaultByHandle( sal_Int32 nHandle ) const;

    // XSQLErrorListener
	virtual void SAL_CALL errorOccured( const ::com::sun::star::sdb::SQLErrorEvent& _rEvent ) throw (::com::sun::star::uno::RuntimeException);

    // XRowSetSupplier
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet > SAL_CALL getRowSet(  ) throw (::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setRowSet( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet >& xDataSource ) throw (::com::sun::star::uno::RuntimeException);

    // XRowSetChangeBroadcaster
    virtual void SAL_CALL addRowSetChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XRowSetChangeListener >& i_Listener ) throw (::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeRowSetChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XRowSetChangeListener >& i_Listener ) throw (::com::sun::star::uno::RuntimeException);

    // OControlModel's property handling
	virtual void describeFixedProperties(
		::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >& /* [out] */ _rProps
    ) const;

    // prevent method hiding
    using OControlModel::disposing;
    using OControlModel::getFastPropertyValue;

protected:
	DECLARE_XCLONEABLE();

protected:
	virtual void approveNewElement(
			const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxObject,
			ElementDescription* _pElement
		);

	::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>  createColumn(sal_Int32 nTypeId) const;

	OGridColumn* getColumnImplementation(const InterfaceRef& _rxIFace) const;

	virtual ElementDescription* createElementMetaData( );

protected:
	virtual void implRemoved(const InterfaceRef& _rxObject);
	virtual void implInserted( const ElementDescription* _pElement );
	virtual void impl_replacedElement(
                    const ::com::sun::star::container::ContainerEvent& _rEvent,
                    ::osl::ClearableMutexGuard& _rInstanceLock
                );

	void gotColumn(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxColumn);
	void lostColumn(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxColumn);

	void cloneColumns( const OGridControlModel* _pOriginalContainer );
};

//.........................................................................
}	// namespace frm
//.........................................................................


