/**************************************************************
 * 
 * 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 SC_DATAUNO_HXX
#define SC_DATAUNO_HXX

#include "global.hxx"
#include "queryparam.hxx"

#include <com/sun/star/sheet/TableFilterField.hpp>
#include <com/sun/star/sheet/GeneralFunction.hpp>
#include <com/sun/star/sheet/XCellRangeReferrer.hpp>
#include <com/sun/star/sheet/XSheetFilterDescriptor.hpp>
#include <com/sun/star/sheet/XConsolidationDescriptor.hpp>
#include <com/sun/star/sheet/XDatabaseRanges.hpp>
#include <com/sun/star/sheet/XDatabaseRange.hpp>
#include <com/sun/star/sheet/XSubTotalDescriptor.hpp>
#include <com/sun/star/sheet/XSubTotalField.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/container/XEnumerationAccess.hpp>
#include <com/sun/star/container/XIndexAccess.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/lang/XUnoTunnel.hpp>
#include <com/sun/star/container/XNamed.hpp>
#include <com/sun/star/util/XRefreshable.hpp>
#include <com/sun/star/sheet/XSheetFilterDescriptor2.hpp>
#include <cppuhelper/implbase2.hxx>
#include <cppuhelper/implbase3.hxx>
#include <cppuhelper/implbase4.hxx>
#include <cppuhelper/implbase5.hxx>
#include <cppuhelper/implbase6.hxx>
#include "svl/itemprop.hxx"
#include "svl/lstner.hxx"

class ScDBData;
class ScDocShell;

class ScSubTotalFieldObj;
class ScDatabaseRangeObj;
class ScDataPilotDescriptorBase;

struct ScSortParam;

typedef ::com::sun::star::uno::Reference<
			::com::sun::star::util::XRefreshListener >* XDBRefreshListenerPtr;
SV_DECL_PTRARR_DEL( XDBRefreshListenerArr_Impl, XDBRefreshListenerPtr, 4, 4 )

class ScDataUnoConversion
{
public:
	static ScSubTotalFunc	GeneralToSubTotal( com::sun::star::sheet::GeneralFunction eSummary );
	static com::sun::star::sheet::GeneralFunction SubTotalToGeneral( ScSubTotalFunc eSubTotal );
};


//	ImportDescriptor gibt's nicht mehr als Uno-Objekt, nur noch Property-Sequence

class ScImportDescriptor
{
public:
	static void	FillImportParam(
					ScImportParam& rParam,
					const com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>& rSeq );
	static void	FillProperties(
					com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>& rSeq,
					const ScImportParam& rParam );
	static long GetPropertyCount();
};

//	SortDescriptor gibt's nicht mehr als Uno-Objekt, nur noch Property-Sequence

class ScSortDescriptor
{
public:
	static void	FillSortParam(
					ScSortParam& rParam,
					const com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>& rSeq );
	static void	FillProperties(
					com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>& rSeq,
					const ScSortParam& rParam );
	static long GetPropertyCount();
};


//	ScSubTotalDescriptorBase - Basisklasse fuer SubTotalDescriptor alleine und im DB-Bereich

//	to uno, both look the same

class ScSubTotalDescriptorBase : public cppu::WeakImplHelper6<
										com::sun::star::sheet::XSubTotalDescriptor,
										com::sun::star::container::XEnumerationAccess,
										com::sun::star::container::XIndexAccess,
										com::sun::star::beans::XPropertySet,
										com::sun::star::lang::XUnoTunnel,
										com::sun::star::lang::XServiceInfo >
{
private:
	SfxItemPropertySet		aPropSet;

	ScSubTotalFieldObj*		GetObjectByIndex_Impl(sal_uInt16 nIndex);

public:
							ScSubTotalDescriptorBase();
	virtual					~ScSubTotalDescriptorBase();

							// in derived classes:
							// (Fields are within the range)
	virtual void			GetData( ScSubTotalParam& rParam ) const = 0;
	virtual void			PutData( const ScSubTotalParam& rParam ) = 0;

							// XSubTotalDescriptor
	virtual void SAL_CALL	addNew( const ::com::sun::star::uno::Sequence<
									::com::sun::star::sheet::SubTotalColumn >& aSubTotalColumns,
								sal_Int32 nGroupColumn )
									throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	clear() throw(::com::sun::star::uno::RuntimeException);

							// XIndexAccess
	virtual sal_Int32 SAL_CALL getCount() throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Any SAL_CALL getByIndex( sal_Int32 Index )
								throw(::com::sun::star::lang::IndexOutOfBoundsException,
									::com::sun::star::lang::WrappedTargetException,
									::com::sun::star::uno::RuntimeException);

							// XEnumerationAccess
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL
							createEnumeration() throw(::com::sun::star::uno::RuntimeException);

							// XElementAccess
	virtual ::com::sun::star::uno::Type SAL_CALL getElementType()
								throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL hasElements() throw(::com::sun::star::uno::RuntimeException);

							// XPropertySet
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >
							SAL_CALL getPropertySetInfo()
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setPropertyValue( const ::rtl::OUString& aPropertyName,
									const ::com::sun::star::uno::Any& aValue )
								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);
	virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue(
									const ::rtl::OUString& PropertyName )
								throw(::com::sun::star::beans::UnknownPropertyException,
									::com::sun::star::lang::WrappedTargetException,
									::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	addPropertyChangeListener( const ::rtl::OUString& aPropertyName,
									const ::com::sun::star::uno::Reference<
										::com::sun::star::beans::XPropertyChangeListener >& xListener )
								throw(::com::sun::star::beans::UnknownPropertyException,
									::com::sun::star::lang::WrappedTargetException,
									::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	removePropertyChangeListener( const ::rtl::OUString& aPropertyName,
									const ::com::sun::star::uno::Reference<
										::com::sun::star::beans::XPropertyChangeListener >& aListener )
								throw(::com::sun::star::beans::UnknownPropertyException,
									::com::sun::star::lang::WrappedTargetException,
									::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	addVetoableChangeListener( const ::rtl::OUString& PropertyName,
									const ::com::sun::star::uno::Reference<
										::com::sun::star::beans::XVetoableChangeListener >& aListener )
								throw(::com::sun::star::beans::UnknownPropertyException,
									::com::sun::star::lang::WrappedTargetException,
									::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	removeVetoableChangeListener( const ::rtl::OUString& PropertyName,
									const ::com::sun::star::uno::Reference<
										::com::sun::star::beans::XVetoableChangeListener >& aListener )
								throw(::com::sun::star::beans::UnknownPropertyException,
									::com::sun::star::lang::WrappedTargetException,
									::com::sun::star::uno::RuntimeException);

							// XUnoTunnel
	virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence<
									sal_Int8 >& aIdentifier )
								throw(::com::sun::star::uno::RuntimeException);

	static const com::sun::star::uno::Sequence<sal_Int8>& getUnoTunnelId();
	static ScSubTotalDescriptorBase* getImplementation( const com::sun::star::uno::Reference<
									com::sun::star::sheet::XSubTotalDescriptor> xObj );

							// XServiceInfo
	virtual ::rtl::OUString SAL_CALL getImplementationName()
								throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName )
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames()
								throw(::com::sun::star::uno::RuntimeException);
};


//	ScSubTotalDescriptor - dummer Container zur Benutzung mit XImportTarget

class ScSubTotalDescriptor : public ScSubTotalDescriptorBase
{
private:
	ScSubTotalParam			aStoredParam;

public:
							ScSubTotalDescriptor();
	virtual					~ScSubTotalDescriptor();

							// von ScSubTotalDescriptorBase:
	virtual void			GetData( ScSubTotalParam& rParam ) const;
	virtual void			PutData( const ScSubTotalParam& rParam );

							// Zugriff von aussen:
	void					SetParam( const ScSubTotalParam& rNew );
//	const ScSubTotalParam&	GetParam() const	{ return aStoredParam; }
};


//	ScRangeSubTotalDescriptor - SubTotalDescriptor eines Datenbank-Bereichs

class ScRangeSubTotalDescriptor : public ScSubTotalDescriptorBase
{
private:
	ScDatabaseRangeObj*		pParent;

public:
							ScRangeSubTotalDescriptor(ScDatabaseRangeObj* pPar);
	virtual					~ScRangeSubTotalDescriptor();

							// von ScSubTotalDescriptorBase:
	virtual void			GetData( ScSubTotalParam& rParam ) const;
	virtual void			PutData( const ScSubTotalParam& rParam );
};


class ScSubTotalFieldObj : public cppu::WeakImplHelper2<
								com::sun::star::sheet::XSubTotalField,
								com::sun::star::lang::XServiceInfo >
{
private:
	com::sun::star::uno::Reference<com::sun::star::sheet::XSubTotalDescriptor> xRef;
	ScSubTotalDescriptorBase&	rParent;
	sal_uInt16						nPos;

public:
							ScSubTotalFieldObj( ScSubTotalDescriptorBase* pDesc, sal_uInt16 nP );
	virtual					~ScSubTotalFieldObj();

							// XSubTotalField
	virtual sal_Int32 SAL_CALL getGroupColumn() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setGroupColumn( sal_Int32 nGroupColumn )
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::sheet::SubTotalColumn > SAL_CALL
							getSubTotalColumns() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setSubTotalColumns( const ::com::sun::star::uno::Sequence<
								::com::sun::star::sheet::SubTotalColumn >& aSubTotalColumns )
									throw(::com::sun::star::uno::RuntimeException);

							// XServiceInfo
	virtual ::rtl::OUString SAL_CALL getImplementationName()
								throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName )
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames()
								throw(::com::sun::star::uno::RuntimeException);
};


class ScConsolidationDescriptor : public cppu::WeakImplHelper2<
										com::sun::star::sheet::XConsolidationDescriptor,
										com::sun::star::lang::XServiceInfo >
{
private:
	ScConsolidateParam		aParam;

public:
							ScConsolidationDescriptor();
	virtual					~ScConsolidationDescriptor();

	void					SetParam( const ScConsolidateParam& rNew );
	const ScConsolidateParam& GetParam() const	{ return aParam; }

							// XConsolidationDescriptor
	virtual ::com::sun::star::sheet::GeneralFunction SAL_CALL getFunction()
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setFunction( ::com::sun::star::sheet::GeneralFunction nFunction )
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::table::CellRangeAddress > SAL_CALL
							getSources(  ) throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setSources( const ::com::sun::star::uno::Sequence<
								::com::sun::star::table::CellRangeAddress >& aSources )
									throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::table::CellAddress SAL_CALL getStartOutputPosition()
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setStartOutputPosition(
								const ::com::sun::star::table::CellAddress& aStartOutputPosition )
									throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL getUseColumnHeaders() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setUseColumnHeaders( sal_Bool bUseColumnHeaders )
								throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL getUseRowHeaders() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setUseRowHeaders( sal_Bool bUseRowHeaders )
								throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL getInsertLinks() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setInsertLinks( sal_Bool bInsertLinks )
								throw(::com::sun::star::uno::RuntimeException);

							// XServiceInfo
	virtual ::rtl::OUString SAL_CALL getImplementationName()
								throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName )
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames()
								throw(::com::sun::star::uno::RuntimeException);
};


//	ScFilterDescriptorBase - Basisklasse fuer FilterDescriptor
//							 alleine, im DB-Bereich und im DataPilot

//	to uno, all three look the same

class ScFilterDescriptorBase : public cppu::WeakImplHelper4<
									com::sun::star::sheet::XSheetFilterDescriptor,
                                    com::sun::star::sheet::XSheetFilterDescriptor2,
									com::sun::star::beans::XPropertySet,
									com::sun::star::lang::XServiceInfo >,
						       public SfxListener
{
private:
	SfxItemPropertySet		aPropSet;
    ScDocShell*             pDocSh;

public:
							ScFilterDescriptorBase(ScDocShell* pDocShell);
	virtual					~ScFilterDescriptorBase();

	virtual void			Notify( SfxBroadcaster& rBC, const SfxHint& rHint );

							// in den Ableitungen:
							// (nField[] hier innerhalb des Bereichs)
	virtual void			GetData( ScQueryParam& rParam ) const = 0;
	virtual void			PutData( const ScQueryParam& rParam ) = 0;

							// XSheetFilterDescriptor
	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::sheet::TableFilterField > SAL_CALL
							getFilterFields() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setFilterFields( const ::com::sun::star::uno::Sequence<
								::com::sun::star::sheet::TableFilterField >& aFilterFields )
									throw(::com::sun::star::uno::RuntimeException);

                            // XSheetFilterDescriptor2
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::sheet::TableFilterField2 > SAL_CALL
                            getFilterFields2() throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL	setFilterFields2( const ::com::sun::star::uno::Sequence<
                                ::com::sun::star::sheet::TableFilterField2 >& aFilterFields )
                                    throw(::com::sun::star::uno::RuntimeException);

							// XPropertySet
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >
							SAL_CALL getPropertySetInfo()
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setPropertyValue( const ::rtl::OUString& aPropertyName,
									const ::com::sun::star::uno::Any& aValue )
								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);
	virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue(
									const ::rtl::OUString& PropertyName )
								throw(::com::sun::star::beans::UnknownPropertyException,
									::com::sun::star::lang::WrappedTargetException,
									::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	addPropertyChangeListener( const ::rtl::OUString& aPropertyName,
									const ::com::sun::star::uno::Reference<
										::com::sun::star::beans::XPropertyChangeListener >& xListener )
								throw(::com::sun::star::beans::UnknownPropertyException,
									::com::sun::star::lang::WrappedTargetException,
									::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	removePropertyChangeListener( const ::rtl::OUString& aPropertyName,
									const ::com::sun::star::uno::Reference<
										::com::sun::star::beans::XPropertyChangeListener >& aListener )
								throw(::com::sun::star::beans::UnknownPropertyException,
									::com::sun::star::lang::WrappedTargetException,
									::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	addVetoableChangeListener( const ::rtl::OUString& PropertyName,
									const ::com::sun::star::uno::Reference<
										::com::sun::star::beans::XVetoableChangeListener >& aListener )
								throw(::com::sun::star::beans::UnknownPropertyException,
									::com::sun::star::lang::WrappedTargetException,
									::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	removeVetoableChangeListener( const ::rtl::OUString& PropertyName,
									const ::com::sun::star::uno::Reference<
										::com::sun::star::beans::XVetoableChangeListener >& aListener )
								throw(::com::sun::star::beans::UnknownPropertyException,
									::com::sun::star::lang::WrappedTargetException,
									::com::sun::star::uno::RuntimeException);

							// XServiceInfo
	virtual ::rtl::OUString SAL_CALL getImplementationName()
								throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName )
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames()
								throw(::com::sun::star::uno::RuntimeException);
};


//	ScFilterDescriptor - dummer Container zur Benutzung mit XFilterable

class ScFilterDescriptor : public ScFilterDescriptorBase
{
private:
	ScQueryParam			aStoredParam;		// nField[] hier innerhalb des Bereichs

public:
							ScFilterDescriptor(ScDocShell* pDocSh);
	virtual					~ScFilterDescriptor();

							// von ScFilterDescriptorBase:
	virtual void			GetData( ScQueryParam& rParam ) const;
	virtual void			PutData( const ScQueryParam& rParam );

							// Zugriff von aussen:
	void					SetParam( const ScQueryParam& rNew );
	const ScQueryParam&		GetParam() const	{ return aStoredParam; }
};


//	ScRangeFilterDescriptor - FilterDescriptor eines Datenbank-Bereichs

class ScRangeFilterDescriptor : public ScFilterDescriptorBase
{
private:
	ScDatabaseRangeObj*		pParent;

public:
							ScRangeFilterDescriptor(ScDocShell* pDocSh, ScDatabaseRangeObj* pPar);
	virtual					~ScRangeFilterDescriptor();

							// von ScFilterDescriptorBase:
	virtual void			GetData( ScQueryParam& rParam ) const;
	virtual void			PutData( const ScQueryParam& rParam );
};


//	ScDataPilotFilterDescriptor - FilterDescriptor eines DataPilotDescriptors

class ScDataPilotFilterDescriptor : public ScFilterDescriptorBase
{
private:
	ScDataPilotDescriptorBase*	pParent;

public:
							ScDataPilotFilterDescriptor(ScDocShell* pDocSh, ScDataPilotDescriptorBase* pPar);
	virtual					~ScDataPilotFilterDescriptor();

							// von ScFilterDescriptorBase:
	virtual void			GetData( ScQueryParam& rParam ) const;
	virtual void			PutData( const ScQueryParam& rParam );
};


class ScDatabaseRangeObj : public cppu::WeakImplHelper6<
								com::sun::star::sheet::XDatabaseRange,
    							com::sun::star::util::XRefreshable,
								com::sun::star::container::XNamed,
								com::sun::star::sheet::XCellRangeReferrer,
								com::sun::star::beans::XPropertySet,
								com::sun::star::lang::XServiceInfo >,
						   public SfxListener
{
private:
	ScDocShell*				pDocShell;
	String					aName;
	SfxItemPropertySet		aPropSet;
	XDBRefreshListenerArr_Impl aRefreshListeners;

private:
	ScDBData*				GetDBData_Impl() const;
	void					Refreshed_Impl();

public:
							ScDatabaseRangeObj(ScDocShell* pDocSh, const String& rNm);
	virtual					~ScDatabaseRangeObj();

	virtual void			Notify( SfxBroadcaster& rBC, const SfxHint& rHint );

							// nField[] hier innerhalb des Bereichs:
	void					GetQueryParam(ScQueryParam& rQueryParam) const;
	void					SetQueryParam(const ScQueryParam& rQueryParam);
	void					GetSubTotalParam(ScSubTotalParam& rSubTotalParam) const;
	void					SetSubTotalParam(const ScSubTotalParam& rSubTotalParam);

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

							// XDatabaseRange
    virtual ::com::sun::star::table::CellRangeAddress SAL_CALL getDataArea()
    							throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL	setDataArea( const ::com::sun::star::table::CellRangeAddress& aDataArea )
    							throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL
    						getSortDescriptor() throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetFilterDescriptor > SAL_CALL
    						getFilterDescriptor() throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSubTotalDescriptor > SAL_CALL
    						getSubTotalDescriptor() throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL
    						getImportDescriptor() throw(::com::sun::star::uno::RuntimeException);
// implemented for the XRefreshable Interface
//    virtual void SAL_CALL	refresh() throw(::com::sun::star::uno::RuntimeException);

							// XRefreshable
	virtual void SAL_CALL	refresh() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	addRefreshListener( const ::com::sun::star::uno::Reference<
									::com::sun::star::util::XRefreshListener >& l )
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	removeRefreshListener( const ::com::sun::star::uno::Reference<
									::com::sun::star::util::XRefreshListener >& l )
								throw(::com::sun::star::uno::RuntimeException);

							// XCellRangeReferrer
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange > SAL_CALL
							getReferredCells() throw(::com::sun::star::uno::RuntimeException);

							// XPropertySet
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >
							SAL_CALL getPropertySetInfo()
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setPropertyValue( const ::rtl::OUString& aPropertyName,
									const ::com::sun::star::uno::Any& aValue )
								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);
	virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue(
									const ::rtl::OUString& PropertyName )
								throw(::com::sun::star::beans::UnknownPropertyException,
									::com::sun::star::lang::WrappedTargetException,
									::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	addPropertyChangeListener( const ::rtl::OUString& aPropertyName,
									const ::com::sun::star::uno::Reference<
										::com::sun::star::beans::XPropertyChangeListener >& xListener )
								throw(::com::sun::star::beans::UnknownPropertyException,
									::com::sun::star::lang::WrappedTargetException,
									::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	removePropertyChangeListener( const ::rtl::OUString& aPropertyName,
									const ::com::sun::star::uno::Reference<
										::com::sun::star::beans::XPropertyChangeListener >& aListener )
								throw(::com::sun::star::beans::UnknownPropertyException,
									::com::sun::star::lang::WrappedTargetException,
									::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	addVetoableChangeListener( const ::rtl::OUString& PropertyName,
									const ::com::sun::star::uno::Reference<
										::com::sun::star::beans::XVetoableChangeListener >& aListener )
								throw(::com::sun::star::beans::UnknownPropertyException,
									::com::sun::star::lang::WrappedTargetException,
									::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	removeVetoableChangeListener( const ::rtl::OUString& PropertyName,
									const ::com::sun::star::uno::Reference<
										::com::sun::star::beans::XVetoableChangeListener >& aListener )
								throw(::com::sun::star::beans::UnknownPropertyException,
									::com::sun::star::lang::WrappedTargetException,
									::com::sun::star::uno::RuntimeException);

							// XServiceInfo
	virtual ::rtl::OUString SAL_CALL getImplementationName()
								throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName )
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames()
								throw(::com::sun::star::uno::RuntimeException);
};


class ScDatabaseRangesObj : public cppu::WeakImplHelper4<
								com::sun::star::sheet::XDatabaseRanges,
								com::sun::star::container::XEnumerationAccess,
								com::sun::star::container::XIndexAccess,
								com::sun::star::lang::XServiceInfo >,
						    public SfxListener
{
private:
	ScDocShell*				pDocShell;

	ScDatabaseRangeObj*		GetObjectByIndex_Impl(sal_uInt16 nIndex);
	ScDatabaseRangeObj*		GetObjectByName_Impl(const ::rtl::OUString& aName);

public:
							ScDatabaseRangesObj(ScDocShell* pDocSh);
	virtual					~ScDatabaseRangesObj();

	virtual void			Notify( SfxBroadcaster& rBC, const SfxHint& rHint );

							// XDatabaseRanges
	virtual void SAL_CALL	addNewByName( const ::rtl::OUString& aName,
								const ::com::sun::star::table::CellRangeAddress& aRange )
									throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	removeByName( const ::rtl::OUString& aName )
								throw(::com::sun::star::uno::RuntimeException);

							// XEnumerationAccess
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL
							createEnumeration() throw(::com::sun::star::uno::RuntimeException);

							// XIndexAccess
	virtual sal_Int32 SAL_CALL getCount() throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Any SAL_CALL getByIndex( sal_Int32 Index )
								throw(::com::sun::star::lang::IndexOutOfBoundsException,
									::com::sun::star::lang::WrappedTargetException,
									::com::sun::star::uno::RuntimeException);

							// XElementAccess
	virtual ::com::sun::star::uno::Type SAL_CALL getElementType()
								throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL hasElements() throw(::com::sun::star::uno::RuntimeException);

							// XNameAccess
	virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName )
								throw(::com::sun::star::container::NoSuchElementException,
									::com::sun::star::lang::WrappedTargetException,
									::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames()
								throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName )
								throw(::com::sun::star::uno::RuntimeException);

							// XServiceInfo
	virtual ::rtl::OUString SAL_CALL getImplementationName()
								throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName )
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames()
								throw(::com::sun::star::uno::RuntimeException);
};



#endif

