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

#include "global.hxx"			// ScRange, ScAddress
#include "rangelst.hxx"			// ScRangeList

#include "formula/grammar.hxx"
#include <svl/lstner.hxx>
#include <svl/listener.hxx>
#include <svl/itemprop.hxx>
#include <com/sun/star/table/XTableChartsSupplier.hpp>
#include <com/sun/star/chart/XChartDataArray.hpp>
#include <com/sun/star/text/XTextFieldsSupplier.hpp>
#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
#include <com/sun/star/sheet/XSheetCellRange.hpp>
#include <com/sun/star/sheet/XFormulaQuery.hpp>
#include <com/sun/star/sheet/XCellRangeAddressable.hpp>
#include <com/sun/star/sheet/XSheetOperation.hpp>
#include <com/sun/star/sheet/XSheetCellRangeContainer.hpp>
#include <com/sun/star/sheet/XCellFormatRangesSupplier.hpp>
#include <com/sun/star/sheet/XUniqueCellFormatRangesSupplier.hpp>
#include <com/sun/star/sheet/XCellRangesQuery.hpp>
#include <com/sun/star/sheet/XSheetFilterableEx.hpp>
#include <com/sun/star/sheet/XSpreadsheet.hpp>
#include <com/sun/star/sheet/XSheetPageBreak.hpp>
#include <com/sun/star/sheet/XCellRangeMovement.hpp>
#include <com/sun/star/text/XText.hpp>
#include <com/sun/star/sheet/XPrintAreas.hpp>
#include <com/sun/star/sheet/XSheetLinkable.hpp>
#include <com/sun/star/sheet/XSubTotalCalculatable.hpp>
#include <com/sun/star/sheet/XArrayFormulaRange.hpp>
#include <com/sun/star/sheet/XCellRangeData.hpp>
#include <com/sun/star/sheet/XCellRangeFormula.hpp>
#include <com/sun/star/sheet/XCellSeries.hpp>
#include <com/sun/star/sheet/XMultipleOperation.hpp>
#include <com/sun/star/sheet/XFormulaTokens.hpp>
#include <com/sun/star/sheet/XArrayFormulaTokens.hpp>
#include <com/sun/star/sheet/XCellAddressable.hpp>
#include <com/sun/star/util/XReplaceable.hpp>
#include <com/sun/star/util/XIndent.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/container/XNameContainer.hpp>
#include <com/sun/star/util/XMergeable.hpp>
#include <com/sun/star/table/XAutoFormattable.hpp>
#include <com/sun/star/util/XSortable.hpp>
#include <com/sun/star/util/XImportable.hpp>
#include <com/sun/star/table/XColumnRowRange.hpp>
#include <com/sun/star/table/BorderLine.hpp>
#include <com/sun/star/table/TableBorder.hpp>
#include <com/sun/star/sheet/XDataPilotTablesSupplier.hpp>
#include <com/sun/star/sheet/XSheetAnnotationAnchor.hpp>
#include <com/sun/star/sheet/XScenariosSupplier.hpp>
#include <com/sun/star/sheet/XSheetAnnotationsSupplier.hpp>
#include <com/sun/star/sheet/XSheetAuditing.hpp>
#include <com/sun/star/sheet/XSheetOutline.hpp>
#include <com/sun/star/util/XProtectable.hpp>
#include <com/sun/star/sheet/XScenario.hpp>
#include <com/sun/star/sheet/XScenarioEnhanced.hpp>
#include <com/sun/star/util/XModifyBroadcaster.hpp>
#include <com/sun/star/beans/XPropertyState.hpp>
#include <com/sun/star/beans/XMultiPropertySet.hpp>
#include <com/sun/star/lang/XUnoTunnel.hpp>
#include <com/sun/star/document/XActionLockable.hpp>
#include <com/sun/star/beans/XTolerantMultiPropertySet.hpp>
#include <com/sun/star/sheet/XExternalSheetName.hpp>
#include <com/sun/star/document/XEventsSupplier.hpp>
#include <cppuhelper/implbase2.hxx>
#include <cppuhelper/implbase3.hxx>

#ifndef __SGI_STL_VECTOR
#include <vector>
#endif

class ScDocShell;
class ScMarkData;
class ScMemChart;
class ScPrintRangeSaver;
class ScAttrRectIterator;
class ScCellRangeObj;
class SvxUnoText;
class ScLinkListener;
class ScPatternAttr;
class SvxBorderLine;
class SvxBoxItem;
class SvxBoxInfoItem;
class SvxItemPropertySet;

class ScLinkListener : public SvtListener
{
	Link	aLink;
public:
					ScLinkListener(const Link& rL) : aLink(rL) {}
	virtual			~ScLinkListener();
	virtual void	Notify( SvtBroadcaster& rBC, const SfxHint& rHint );
};

typedef ::com::sun::star::uno::Reference<
			::com::sun::star::util::XModifyListener >* XModifyListenerPtr;
SV_DECL_PTRARR_DEL( XModifyListenerArr_Impl, XModifyListenerPtr, 4, 4 )

class ScNamedEntry;
typedef ScNamedEntry* ScNamedEntryPtr;
SV_DECL_PTRARR_DEL( ScNamedEntryArr_Impl, ScNamedEntryPtr, 4, 4 )


//	ScCellRangesBase - Basisklasse fuer ScCellRangesObj (mit Index-Access)
//									und ScCellRangeObj (ohne Index-Access)

//	XServiceInfo ist in den Ableitungen implementiert

class ScHelperFunctions
{
public:
    static const SvxBorderLine* GetBorderLine( SvxBorderLine& rLine, const com::sun::star::table::BorderLine& rStruct );
    static void FillBoxItems( SvxBoxItem& rOuter, SvxBoxInfoItem& rInner, const com::sun::star::table::TableBorder& rBorder );
    static void FillBorderLine( com::sun::star::table::BorderLine& rStruct, const SvxBorderLine* pLine );
    static void FillTableBorder( com::sun::star::table::TableBorder& rBorder,
							const SvxBoxItem& rOuter, const SvxBoxInfoItem& rInner );
    static void ApplyBorder( ScDocShell* pDocShell, const ScRangeList& rRanges,
						const SvxBoxItem& rOuter, const SvxBoxInfoItem& rInner );
};

namespace ooo
{
    namespace vba {
        namespace excel {
	class ScVbaCellRangeAccess;  // Vba Helper class
    }
    }
}

class SC_DLLPUBLIC ScCellRangesBase : public com::sun::star::beans::XPropertySet,
						 public com::sun::star::beans::XMultiPropertySet,
						 public com::sun::star::beans::XPropertyState,
						 public com::sun::star::sheet::XSheetOperation,
						 public com::sun::star::chart::XChartDataArray,
						 public com::sun::star::util::XIndent,
						 public com::sun::star::sheet::XCellRangesQuery,
						 public com::sun::star::sheet::XFormulaQuery,
						 public com::sun::star::util::XReplaceable,
						 public com::sun::star::util::XModifyBroadcaster,
						 public com::sun::star::lang::XServiceInfo,
						 public com::sun::star::lang::XUnoTunnel,
						 public com::sun::star::lang::XTypeProvider,
                         public com::sun::star::beans::XTolerantMultiPropertySet,
						 public cppu::OWeakObject,
						 public SfxListener
{
	friend class ScTabViewObj;		// fuer select()
	friend class ScTableSheetObj;	// fuer createCursorByRange()
 	friend class ooo::vba::excel::ScVbaCellRangeAccess;

private:
	const SfxItemPropertySet* pPropSet;
	ScDocShell*				pDocShell;
	ScLinkListener*			pValueListener;
	ScPatternAttr*			pCurrentFlat;
	ScPatternAttr*			pCurrentDeep;
	SfxItemSet*				pCurrentDataSet;
	SfxItemSet*				pNoDfltCurrentDataSet;
	ScMarkData*				pMarkData;
	ScRangeList				aRanges;
    sal_Int64               nObjectId;
	sal_Bool					bChartColAsHdr;
	sal_Bool					bChartRowAsHdr;
	sal_Bool					bCursorOnly;
	sal_Bool					bGotDataChangedHint;
	XModifyListenerArr_Impl aValueListeners;

	DECL_LINK( ValueListenerHdl, SfxHint* );

private:
	void			PaintRanges_Impl( sal_uInt16 nPart );
	ScRangeListRef	GetLimitedChartRanges_Impl( long nDataColumns, long nDataRows ) const;
	void			ForceChartListener_Impl();
    ScMemChart*     CreateMemChart_Impl() const;

	const ScPatternAttr*	GetCurrentAttrsFlat();
	const ScPatternAttr*	GetCurrentAttrsDeep();
	SfxItemSet*				GetCurrentDataSet(bool bNoDflt = false);
    void                    ForgetMarkData();
	void					ForgetCurrentAttrs();

	com::sun::star::uno::Reference<com::sun::star::sheet::XSheetCellRanges>
							QueryDifferences_Impl(const com::sun::star::table::CellAddress& aCompare,
													sal_Bool bColumnDiff);
	com::sun::star::uno::Reference<com::sun::star::uno::XInterface>
							Find_Impl(const com::sun::star::uno::Reference<
										com::sun::star::util::XSearchDescriptor>& xDesc,
									const ScAddress* pLastPos);

protected:
    const ScMarkData*       GetMarkData();

	// GetItemPropertyMap for derived classes must contain all entries, including base class
	virtual const SfxItemPropertyMap* GetItemPropertyMap();
	virtual ::com::sun::star::beans::PropertyState GetOnePropertyState(
                                sal_uInt16 nItemWhich, const SfxItemPropertySimpleEntry* pEntry );
    virtual void            GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
								::com::sun::star::uno::Any& )
								throw(::com::sun::star::uno::RuntimeException);
    virtual void            SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
												const ::com::sun::star::uno::Any& aValue )
								throw(::com::sun::star::lang::IllegalArgumentException,
										::com::sun::star::uno::RuntimeException);

public:
							ScCellRangesBase();		// fuer SMART_REFLECTION Krempel
							ScCellRangesBase(ScDocShell* pDocSh, const ScRange& rR);
							ScCellRangesBase(ScDocShell* pDocSh, const ScRangeList& rR);
	virtual					~ScCellRangesBase();

	virtual ::com::sun::star::uno::Any SAL_CALL queryInterface(
								const ::com::sun::star::uno::Type & rType )
									throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	acquire() throw();
	virtual void SAL_CALL	release() throw();

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

							// aus Ableitungen, aber auch per getImplementation
	ScDocShell*				GetDocShell() const		{ return pDocShell; }
	ScDocument*				GetDocument() const;
	const ScRangeList&		GetRangeList() const	{ return aRanges; }
	void					AddRange(const ScRange& rRange, const sal_Bool bMergeRanges);

							// per Service erzeugtes Objekt zum Leben erwecken:
	void					InitInsertRange(ScDocShell* pDocSh, const ScRange& rR);

	void					SetNewRange(const ScRange& rNew);	// fuer Cursor
	void					SetNewRanges(const ScRangeList& rNew);

	void					SetCursorOnly(sal_Bool bSet);
	sal_Bool					IsCursorOnly() const			{ return bCursorOnly; }

							// XSheetOperation
	virtual double SAL_CALL	computeFunction( ::com::sun::star::sheet::GeneralFunction nFunction )
								throw(::com::sun::star::uno::Exception,
										::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	clearContents( sal_Int32 nContentFlags )
								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);

							// XMultiPropertySet
	virtual void SAL_CALL	setPropertyValues( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyNames,
									const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aValues )
								throw (::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::Sequence< ::com::sun::star::uno::Any > SAL_CALL
							getPropertyValues( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyNames )
								throw (::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL addPropertiesChangeListener( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyNames,
									const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertiesChangeListener >& xListener )
								throw (::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL removePropertiesChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertiesChangeListener >& xListener )
								throw (::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL firePropertiesChangeEvent( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyNames,
									const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertiesChangeListener >& xListener )
								throw (::com::sun::star::uno::RuntimeException);

                            // XTolerantMultiPropertySet
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::SetPropertyTolerantFailed > SAL_CALL
        setPropertyValuesTolerant( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyNames,
                                    const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aValues )
                                    throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::GetPropertyTolerantResult > SAL_CALL
        getPropertyValuesTolerant( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyNames )
                                    throw (::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::GetDirectPropertyTolerantResult > SAL_CALL
        getDirectPropertyValuesTolerant( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyNames )
                                    throw (::com::sun::star::uno::RuntimeException);

							// XPropertyState
	virtual ::com::sun::star::beans::PropertyState SAL_CALL getPropertyState(
									const ::rtl::OUString& PropertyName )
								throw(::com::sun::star::beans::UnknownPropertyException,
									::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyState > SAL_CALL
							getPropertyStates( const ::com::sun::star::uno::Sequence<
										::rtl::OUString >& aPropertyName )
								throw(::com::sun::star::beans::UnknownPropertyException,
									::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setPropertyToDefault( const ::rtl::OUString& PropertyName )
								throw(::com::sun::star::beans::UnknownPropertyException,
									::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Any SAL_CALL getPropertyDefault(
									const ::rtl::OUString& aPropertyName )
								throw(::com::sun::star::beans::UnknownPropertyException,
									::com::sun::star::lang::WrappedTargetException,
									::com::sun::star::uno::RuntimeException);

							// XIndent
	virtual void SAL_CALL	decrementIndent() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	incrementIndent() throw(::com::sun::star::uno::RuntimeException);

							// XChartData
	virtual void SAL_CALL	addChartDataChangeEventListener(
								const ::com::sun::star::uno::Reference<
									::com::sun::star::chart::XChartDataChangeEventListener >& aListener )
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	removeChartDataChangeEventListener( const ::com::sun::star::uno::Reference<
									::com::sun::star::chart::XChartDataChangeEventListener >& aListener )
								throw(::com::sun::star::uno::RuntimeException);
	virtual double SAL_CALL	getNotANumber() throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL isNotANumber( double nNumber )
								throw(::com::sun::star::uno::RuntimeException);

							// XChartDataArray
	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< double > > SAL_CALL
							getData() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setData( const ::com::sun::star::uno::Sequence<
								::com::sun::star::uno::Sequence< double > >& aData )
									throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getRowDescriptions()
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL setRowDescriptions( const ::com::sun::star::uno::Sequence<
								::rtl::OUString >& aRowDescriptions )
									throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getColumnDescriptions()
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setColumnDescriptions( const ::com::sun::star::uno::Sequence<
								::rtl::OUString >& aColumnDescriptions )
									throw(::com::sun::star::uno::RuntimeException);

							// XCellRangesQuery
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetCellRanges > SAL_CALL
							queryVisibleCells() throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetCellRanges > SAL_CALL
							queryEmptyCells() throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetCellRanges > SAL_CALL
							queryContentCells( sal_Int16 nContentFlags )
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetCellRanges > SAL_CALL
							queryFormulaCells( sal_Int32 nResultFlags )
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetCellRanges > SAL_CALL
							queryColumnDifferences(
								const ::com::sun::star::table::CellAddress& aCompare )
									throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetCellRanges > SAL_CALL
							queryRowDifferences(
								const ::com::sun::star::table::CellAddress& aCompare )
									throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetCellRanges > SAL_CALL
							queryIntersection(
								const ::com::sun::star::table::CellRangeAddress& aRange )
									throw(::com::sun::star::uno::RuntimeException);

							// XFormulaQuery
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetCellRanges > SAL_CALL
							queryDependents( sal_Bool bRecursive )
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetCellRanges > SAL_CALL
							queryPrecedents( sal_Bool bRecursive )
								throw(::com::sun::star::uno::RuntimeException);

							// XSearchable
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XSearchDescriptor > SAL_CALL
							createSearchDescriptor()
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > SAL_CALL
							findAll( const ::com::sun::star::uno::Reference<
								::com::sun::star::util::XSearchDescriptor >& xDesc )
									throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL
							findFirst( const ::com::sun::star::uno::Reference<
								::com::sun::star::util::XSearchDescriptor >& xDesc )
									throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL
							findNext( const ::com::sun::star::uno::Reference<
										::com::sun::star::uno::XInterface >& xStartAt,
									  const ::com::sun::star::uno::Reference<
										::com::sun::star::util::XSearchDescriptor >& xDesc )
									throw(::com::sun::star::uno::RuntimeException);

							// XReplaceable
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XReplaceDescriptor > SAL_CALL
							createReplaceDescriptor() throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Int32 SAL_CALL replaceAll( const ::com::sun::star::uno::Reference<
								::com::sun::star::util::XSearchDescriptor >& xDesc )
									throw(::com::sun::star::uno::RuntimeException);

							// XModifyBroadcaster
	virtual void SAL_CALL	addModifyListener( const ::com::sun::star::uno::Reference<
									::com::sun::star::util::XModifyListener >& aListener )
								throw (::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	removeModifyListener( const ::com::sun::star::uno::Reference<
									::com::sun::star::util::XModifyListener >& aListener )
								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);

							// 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 ScCellRangesBase* getImplementation( const com::sun::star::uno::Reference<
									com::sun::star::uno::XInterface> xObj );

							// XTypeProvider
	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes()
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId()
								throw(::com::sun::star::uno::RuntimeException);
};


class SC_DLLPUBLIC ScCellRangesObj : public ScCellRangesBase,
						public com::sun::star::sheet::XSheetCellRangeContainer,
						public com::sun::star::container::XNameContainer,
						public com::sun::star::container::XEnumerationAccess
{
private:
	ScNamedEntryArr_Impl	aNamedEntries;

    ScCellRangeObj*         GetObjectByIndex_Impl(sal_Int32 nIndex) const;

public:
							ScCellRangesObj(ScDocShell* pDocSh, const ScRangeList& rR);
	virtual					~ScCellRangesObj();

	virtual ::com::sun::star::uno::Any SAL_CALL queryInterface(
								const ::com::sun::star::uno::Type & rType )
									throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	acquire() throw();
	virtual void SAL_CALL	release() throw();

	virtual void			RefChanged();

							// XSheetCellRanges
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumerationAccess > SAL_CALL
							getCells() throw(::com::sun::star::uno::RuntimeException);
	virtual ::rtl::OUString SAL_CALL getRangeAddressesAsString()
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::table::CellRangeAddress > SAL_CALL
							getRangeAddresses() throw(::com::sun::star::uno::RuntimeException);

							// XSheetCellRangeContainer
	virtual void SAL_CALL	addRangeAddress( const ::com::sun::star::table::CellRangeAddress& rRange,
										sal_Bool bMergeRanges )
									throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	removeRangeAddress( const ::com::sun::star::table::CellRangeAddress& rRange )
								throw(::com::sun::star::container::NoSuchElementException,
									::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	addRangeAddresses( const ::com::sun::star::uno::Sequence<
										::com::sun::star::table::CellRangeAddress >& rRanges,
										sal_Bool bMergeRanges )
									throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	removeRangeAddresses( const ::com::sun::star::uno::Sequence<
										::com::sun::star::table::CellRangeAddress >& rRanges )
								throw(::com::sun::star::container::NoSuchElementException,
									::com::sun::star::uno::RuntimeException);

							// XNameContainer
	virtual void SAL_CALL	insertByName( const ::rtl::OUString& aName,
								const ::com::sun::star::uno::Any& aElement )
									throw(::com::sun::star::lang::IllegalArgumentException,
										::com::sun::star::container::ElementExistException,
										::com::sun::star::lang::WrappedTargetException,
										::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	removeByName( const ::rtl::OUString& Name )
								throw(::com::sun::star::container::NoSuchElementException,
									::com::sun::star::lang::WrappedTargetException,
									::com::sun::star::uno::RuntimeException);

							// XNameReplace
	virtual void SAL_CALL	replaceByName( const ::rtl::OUString& aName,
								const ::com::sun::star::uno::Any& aElement )
									throw(::com::sun::star::lang::IllegalArgumentException,
										::com::sun::star::container::NoSuchElementException,
										::com::sun::star::lang::WrappedTargetException,
										::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);

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

							// XEnumerationAccess
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL
							createEnumeration() 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);

							// XTypeProvider
	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes()
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId()
								throw(::com::sun::star::uno::RuntimeException);
};


class SC_DLLPUBLIC ScCellRangeObj : public ScCellRangesBase,
					   public com::sun::star::sheet::XCellRangeAddressable,
					   public com::sun::star::sheet::XSheetCellRange,
					   public com::sun::star::sheet::XArrayFormulaRange,
					   public com::sun::star::sheet::XArrayFormulaTokens,
					   public com::sun::star::sheet::XCellRangeData,
					   public com::sun::star::sheet::XCellRangeFormula,
					   public com::sun::star::sheet::XMultipleOperation,
					   public com::sun::star::util::XMergeable,
					   public com::sun::star::sheet::XCellSeries,
					   public com::sun::star::table::XAutoFormattable,
					   public com::sun::star::util::XSortable,
					   public com::sun::star::sheet::XSheetFilterableEx,
					   public com::sun::star::sheet::XSubTotalCalculatable,
					   public com::sun::star::util::XImportable,
					   public com::sun::star::sheet::XCellFormatRangesSupplier,
					   public com::sun::star::sheet::XUniqueCellFormatRangesSupplier,
					   public com::sun::star::table::XColumnRowRange
{
private:
	const SfxItemPropertySet*		pRangePropSet;
	ScRange					aRange;

protected:
	const ScRange&			GetRange() const	{ return aRange; }
	virtual const SfxItemPropertyMap* GetItemPropertyMap();
    virtual void GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
								::com::sun::star::uno::Any& )
								throw(::com::sun::star::uno::RuntimeException);
    virtual void            SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
												const ::com::sun::star::uno::Any& aValue )
								throw(::com::sun::star::lang::IllegalArgumentException,
										::com::sun::star::uno::RuntimeException);

	::com::sun::star::uno::Reference< ::com::sun::star::table::XCell >
							GetCellByPosition_Impl( sal_Int32 nColumn, sal_Int32 nRow )
								throw(::com::sun::star::lang::IndexOutOfBoundsException,
									::com::sun::star::uno::RuntimeException);

            void            SetArrayFormula_Impl( const rtl::OUString& rFormula,
                                const rtl::OUString& rFormulaNmsp,
                                const formula::FormulaGrammar::Grammar eGrammar )
                                    throw(::com::sun::star::uno::RuntimeException);

public:
							ScCellRangeObj(ScDocShell* pDocSh, const ScRange& rR);
	virtual					~ScCellRangeObj();

							// uses ObjectShell from document, if set (returns NULL otherwise)
	static com::sun::star::uno::Reference<com::sun::star::table::XCellRange>
							CreateRangeFromDoc( ScDocument* pDoc, const ScRange& rR );

	virtual ::com::sun::star::uno::Any SAL_CALL queryInterface(
								const ::com::sun::star::uno::Type & rType )
									throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	acquire() throw();
	virtual void SAL_CALL	release() throw();

	virtual void			RefChanged();

                            // via getImplementation()
    virtual void            SetArrayFormulaWithGrammar( const ::rtl::OUString& rFormula,
                                    const ::rtl::OUString& rFormulaNmsp,
                                    const formula::FormulaGrammar::Grammar )
                                throw(::com::sun::star::uno::RuntimeException);

	// XCellRange ist Basisklasse von XSheetCellRange und XSheetOperation
//	operator XCellRangeRef() const	{ return (XSheetCellRange*)this; }

							// XCellRangeAddressable
	virtual ::com::sun::star::table::CellRangeAddress SAL_CALL getRangeAddress()
								throw(::com::sun::star::uno::RuntimeException);

							// XSheetCellRange
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheet > SAL_CALL
							getSpreadsheet() throw(::com::sun::star::uno::RuntimeException);

							// XArrayFormulaRange
	virtual ::rtl::OUString SAL_CALL getArrayFormula() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL 	setArrayFormula( const ::rtl::OUString& aFormula )
								throw(::com::sun::star::uno::RuntimeException);

                            // XArrayFormulaTokens
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::sheet::FormulaToken > SAL_CALL getArrayTokens()
                                throw (::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL   setArrayTokens( const ::com::sun::star::uno::Sequence<
                                    ::com::sun::star::sheet::FormulaToken >& aTokens )
                                throw (::com::sun::star::uno::RuntimeException);

							// XCellRangeData
	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence<
							::com::sun::star::uno::Any > > SAL_CALL getDataArray()
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setDataArray( const ::com::sun::star::uno::Sequence<
								::com::sun::star::uno::Sequence<
									::com::sun::star::uno::Any > >& aArray )
								throw(::com::sun::star::uno::RuntimeException);

							// XCellRangeFormula
	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence<
							::rtl::OUString > > SAL_CALL getFormulaArray()
								throw (::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setFormulaArray( const ::com::sun::star::uno::Sequence<
								::com::sun::star::uno::Sequence< ::rtl::OUString > >& aArray )
								throw (::com::sun::star::uno::RuntimeException);

							// XMultipleOperation
	virtual void SAL_CALL	setTableOperation(
								const ::com::sun::star::table::CellRangeAddress& aFormulaRange,
								::com::sun::star::sheet::TableOperationMode nMode,
								const ::com::sun::star::table::CellAddress& aColumnCell,
								const ::com::sun::star::table::CellAddress& aRowCell )
									throw(::com::sun::star::uno::RuntimeException);

							// XMergeable
	virtual void SAL_CALL	merge( sal_Bool bMerge ) throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL getIsMerged() throw(::com::sun::star::uno::RuntimeException);

							// XCellSeries
	virtual void SAL_CALL	fillSeries( ::com::sun::star::sheet::FillDirection nFillDirection,
								::com::sun::star::sheet::FillMode nFillMode,
								::com::sun::star::sheet::FillDateMode nFillDateMode,
								double fStep, double fEndValue )
									throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	fillAuto( ::com::sun::star::sheet::FillDirection nFillDirection,
								sal_Int32 nSourceCount )
									throw(::com::sun::star::uno::RuntimeException);

							// XAutoFormattable
	virtual void SAL_CALL	autoFormat( const ::rtl::OUString& aName )
								throw(::com::sun::star::lang::IllegalArgumentException,
									::com::sun::star::uno::RuntimeException);

							// XSortable
	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL
							createSortDescriptor() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	sort( const ::com::sun::star::uno::Sequence<
								::com::sun::star::beans::PropertyValue >& xDescriptor )
									throw(::com::sun::star::uno::RuntimeException);

							// XSheetFilterableEx
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetFilterDescriptor > SAL_CALL
							createFilterDescriptorByObject( const ::com::sun::star::uno::Reference<
								::com::sun::star::sheet::XSheetFilterable >& xObject )
									throw(::com::sun::star::uno::RuntimeException);

							// XSheetFilterable
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetFilterDescriptor > SAL_CALL
							createFilterDescriptor( sal_Bool bEmpty )
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	filter( const ::com::sun::star::uno::Reference<
								::com::sun::star::sheet::XSheetFilterDescriptor >& xDescriptor )
									throw(::com::sun::star::uno::RuntimeException);

							// XSubTotalCalculatable
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSubTotalDescriptor > SAL_CALL
							createSubTotalDescriptor( sal_Bool bEmpty )
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	applySubTotals( const ::com::sun::star::uno::Reference<
								::com::sun::star::sheet::XSubTotalDescriptor >& xDescriptor,
								sal_Bool bReplace ) throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	removeSubTotals() throw(::com::sun::star::uno::RuntimeException);

							// XImportable
	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL
							createImportDescriptor( sal_Bool bEmpty )
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	doImport( const ::com::sun::star::uno::Sequence<
								::com::sun::star::beans::PropertyValue >& aDescriptor )
									throw(::com::sun::star::uno::RuntimeException);

							// XCellFormatRangesSupplier
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > SAL_CALL
							getCellFormatRanges() throw(::com::sun::star::uno::RuntimeException);

							// XUniqueCellFormatRangesSupplier
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > SAL_CALL
							getUniqueCellFormatRanges() throw(::com::sun::star::uno::RuntimeException);

							// XColumnRowRange
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::table::XTableColumns > SAL_CALL
							getColumns() throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::table::XTableRows > SAL_CALL
							getRows() throw(::com::sun::star::uno::RuntimeException);

							// XCellRange
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell > SAL_CALL
							getCellByPosition( sal_Int32 nColumn, sal_Int32 nRow )
								throw(::com::sun::star::lang::IndexOutOfBoundsException,
									::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange > SAL_CALL
							getCellRangeByPosition( sal_Int32 nLeft, sal_Int32 nTop,
								sal_Int32 nRight, sal_Int32 nBottom )
									throw(::com::sun::star::lang::IndexOutOfBoundsException,
										::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange > SAL_CALL
							getCellRangeByName( const ::rtl::OUString& aRange )
								throw(::com::sun::star::uno::RuntimeException);
	::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange >
							getCellRangeByName( const ::rtl::OUString& aRange,  const ScAddress::Details& rDetails )
								throw(::com::sun::star::uno::RuntimeException);

							// XPropertySet ueberladen wegen Range-Properties
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >
							SAL_CALL getPropertySetInfo()
								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);

							// XTypeProvider
	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes()
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId()
								throw(::com::sun::star::uno::RuntimeException);
};


//!	really derive cell from range?

class SC_DLLPUBLIC ScCellObj : public ScCellRangeObj,
				  public com::sun::star::text::XText,
				  public com::sun::star::container::XEnumerationAccess,
				  public com::sun::star::table::XCell,
                  public com::sun::star::sheet::XFormulaTokens,
				  public com::sun::star::sheet::XCellAddressable,
				  public com::sun::star::sheet::XSheetAnnotationAnchor,
				  public com::sun::star::text::XTextFieldsSupplier,
					public com::sun::star::document::XActionLockable
{
private:
	SvxUnoText*				pUnoText;
	const SfxItemPropertySet*	pCellPropSet;
	ScAddress				aCellPos;
	sal_Int16				nActionLockCount;

private:
	String		GetInputString_Impl(sal_Bool bEnglish) const;
	String		GetOutputString_Impl() const;
	void		SetString_Impl(const String& rString, sal_Bool bInterpret, sal_Bool bEnglish);
	double		GetValue_Impl() const;
	void		SetValue_Impl(double fValue);
	com::sun::star::table::CellContentType GetResultType_Impl();

protected:
	virtual const SfxItemPropertyMap* GetItemPropertyMap();
    virtual void GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
								::com::sun::star::uno::Any& )
								throw(::com::sun::star::uno::RuntimeException);
    virtual void            SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
												const ::com::sun::star::uno::Any& aValue )
								throw(::com::sun::star::lang::IllegalArgumentException,
										::com::sun::star::uno::RuntimeException);

public:
    static const SvxItemPropertySet* GetEditPropertySet();
    static const SfxItemPropertyMap* GetCellPropertyMap();

							ScCellObj(ScDocShell* pDocSh, const ScAddress& rP);
	virtual					~ScCellObj();

	virtual ::com::sun::star::uno::Any SAL_CALL queryInterface(
								const ::com::sun::star::uno::Type & rType )
									throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	acquire() throw();
	virtual void SAL_CALL	release() throw();

	virtual void			RefChanged();

	SvxUnoText&				GetUnoText();

							// XML import needs to set results at formula cells,
							// not meant for any other purpose.
	void					SetFormulaResultString( const ::rtl::OUString& rResult );
	void					SetFormulaResultDouble( double fResult );
    void                    SetFormulaWithGrammar( const ::rtl::OUString& rFormula,
                                const ::rtl::OUString& rFormulaNmsp, const formula::FormulaGrammar::Grammar );
	const ScAddress&		GetPosition() const { return aCellPos; }

    void                    InputEnglishString( const ::rtl::OUString& rText );

							// XText
	virtual void SAL_CALL	insertTextContent( const ::com::sun::star::uno::Reference<
									::com::sun::star::text::XTextRange >& xRange,
								const ::com::sun::star::uno::Reference<
									::com::sun::star::text::XTextContent >& xContent,
								sal_Bool bAbsorb )
									throw(::com::sun::star::lang::IllegalArgumentException,
									::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	removeTextContent( const ::com::sun::star::uno::Reference<
								::com::sun::star::text::XTextContent >& xContent )
									throw(::com::sun::star::container::NoSuchElementException,
											::com::sun::star::uno::RuntimeException);

							// XSimpleText
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor > SAL_CALL
							createTextCursor() throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor > SAL_CALL
							createTextCursorByRange( const ::com::sun::star::uno::Reference<
										::com::sun::star::text::XTextRange >& aTextPosition )
									throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	insertString( const ::com::sun::star::uno::Reference<
										::com::sun::star::text::XTextRange >& xRange,
										const ::rtl::OUString& aString, sal_Bool bAbsorb )
									throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	insertControlCharacter( const ::com::sun::star::uno::Reference<
										::com::sun::star::text::XTextRange >& xRange,
										sal_Int16 nControlCharacter, sal_Bool bAbsorb )
									throw(::com::sun::star::lang::IllegalArgumentException,
										::com::sun::star::uno::RuntimeException);

							// XTextRange
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XText > SAL_CALL
							getText() throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL
							getStart() throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL
							getEnd() throw(::com::sun::star::uno::RuntimeException);
	virtual ::rtl::OUString SAL_CALL getString() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setString( const ::rtl::OUString& aString )
									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);

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

							// XCell
	virtual ::rtl::OUString SAL_CALL getFormula() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setFormula( const ::rtl::OUString& aFormula )
								throw(::com::sun::star::uno::RuntimeException);
	virtual double SAL_CALL getValue() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setValue( double nValue ) throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::table::CellContentType SAL_CALL getType()
								throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Int32 SAL_CALL getError() throw(::com::sun::star::uno::RuntimeException);

                            // XFormulaTokens
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::sheet::FormulaToken > SAL_CALL getTokens()
                                throw (::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL   setTokens( const ::com::sun::star::uno::Sequence<
                                    ::com::sun::star::sheet::FormulaToken >& aTokens )
                                throw (::com::sun::star::uno::RuntimeException);

							// XCellAddressable
	virtual ::com::sun::star::table::CellAddress SAL_CALL getCellAddress()
								throw(::com::sun::star::uno::RuntimeException);

							// XSheetAnnotationAnchor
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetAnnotation > SAL_CALL
							getAnnotation() throw(::com::sun::star::uno::RuntimeException);

							// XTextFieldsSupplier
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumerationAccess > SAL_CALL
							getTextFields() throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL
							getTextFieldMasters() throw(::com::sun::star::uno::RuntimeException);

							// XPropertySet ueberladen wegen Zell-Properties
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >
							SAL_CALL getPropertySetInfo()
								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);

							// XTypeProvider
	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes()
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId()
								throw(::com::sun::star::uno::RuntimeException);

							// XActionLockable
	virtual sal_Bool SAL_CALL isActionLocked() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	addActionLock() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	removeActionLock() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setActionLocks( sal_Int16 nLock )
								throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Int16 SAL_CALL resetActionLocks() throw(::com::sun::star::uno::RuntimeException);

	static String		GetOutputString_Impl(ScDocument* pDoc, const ScAddress& aPos);
};


class ScTableSheetObj : public ScCellRangeObj,
						public com::sun::star::sheet::XSpreadsheet,
						public com::sun::star::container::XNamed,
						public com::sun::star::sheet::XSheetPageBreak,
						public com::sun::star::sheet::XCellRangeMovement,
						public com::sun::star::table::XTableChartsSupplier,
						public com::sun::star::sheet::XDataPilotTablesSupplier,
						public com::sun::star::sheet::XScenariosSupplier,
						public com::sun::star::sheet::XSheetAnnotationsSupplier,
						public com::sun::star::drawing::XDrawPageSupplier,
						public com::sun::star::sheet::XPrintAreas,
						public com::sun::star::sheet::XSheetLinkable,
						public com::sun::star::sheet::XSheetAuditing,
						public com::sun::star::sheet::XSheetOutline,
						public com::sun::star::util::XProtectable,
						public com::sun::star::sheet::XScenario,
						public com::sun::star::sheet::XScenarioEnhanced,
                        public com::sun::star::sheet::XExternalSheetName,
                        public com::sun::star::document::XEventsSupplier
{
	friend class ScTableSheetsObj;		// fuer insertByName()

private:
	const SfxItemPropertySet*		pSheetPropSet;

	SCTAB					GetTab_Impl() const;
	void					PrintAreaUndo_Impl( ScPrintRangeSaver* pOldRanges );

protected:
	virtual const SfxItemPropertyMap* GetItemPropertyMap();
    virtual void GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
								::com::sun::star::uno::Any& )
								throw(::com::sun::star::uno::RuntimeException);
    virtual void            SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
												const ::com::sun::star::uno::Any& aValue )
								throw(::com::sun::star::lang::IllegalArgumentException,
										::com::sun::star::uno::RuntimeException);

public:
							ScTableSheetObj(ScDocShell* pDocSh, SCTAB nTab);
	virtual					~ScTableSheetObj();

	void					InitInsertSheet(ScDocShell* pDocSh, SCTAB nTab);

	virtual ::com::sun::star::uno::Any SAL_CALL queryInterface(
								const ::com::sun::star::uno::Type & rType )
									throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	acquire() throw();
	virtual void SAL_CALL	release() throw();

							// XSpreadsheet
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetCellCursor >
							SAL_CALL createCursor() throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetCellCursor > SAL_CALL
							createCursorByRange( const ::com::sun::star::uno::Reference<
								::com::sun::star::sheet::XSheetCellRange >& aRange )
									throw(::com::sun::star::uno::RuntimeException);

							// XSheetCellRange
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheet > SAL_CALL
							getSpreadsheet() throw(::com::sun::star::uno::RuntimeException);

							// XCellRange
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell > SAL_CALL
							getCellByPosition( sal_Int32 nColumn, sal_Int32 nRow )
								throw(::com::sun::star::lang::IndexOutOfBoundsException,
									::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange > SAL_CALL
							getCellRangeByPosition( sal_Int32 nLeft, sal_Int32 nTop,
								sal_Int32 nRight, sal_Int32 nBottom )
									throw(::com::sun::star::lang::IndexOutOfBoundsException,
										::com::sun::star::uno::RuntimeException);
    using ScCellRangeObj::getCellRangeByName;
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange > SAL_CALL
							getCellRangeByName( const ::rtl::OUString& aRange )
								throw(::com::sun::star::uno::RuntimeException);

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

							// XSheetPageBreak
	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::sheet::TablePageBreakData > SAL_CALL
							getColumnPageBreaks() throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::sheet::TablePageBreakData > SAL_CALL
							getRowPageBreaks() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	removeAllManualPageBreaks() throw(::com::sun::star::uno::RuntimeException);

							// XCellRangeMovement
	virtual void SAL_CALL	insertCells( const ::com::sun::star::table::CellRangeAddress& aRange,
								::com::sun::star::sheet::CellInsertMode nMode )
									throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	removeRange( const ::com::sun::star::table::CellRangeAddress& aRange,
								::com::sun::star::sheet::CellDeleteMode nMode )
									throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	moveRange( const ::com::sun::star::table::CellAddress& aDestination,
								const ::com::sun::star::table::CellRangeAddress& aSource )
									throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	copyRange( const ::com::sun::star::table::CellAddress& aDestination,
								const ::com::sun::star::table::CellRangeAddress& aSource )
									throw(::com::sun::star::uno::RuntimeException);

							// XTableChartsSupplier
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::table::XTableCharts > SAL_CALL
							getCharts() throw(::com::sun::star::uno::RuntimeException);

							// XDataPilotTablesSupplier
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XDataPilotTables > SAL_CALL
							getDataPilotTables() throw(::com::sun::star::uno::RuntimeException);

							// XScenariosSupplier
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XScenarios > SAL_CALL
							getScenarios() throw(::com::sun::star::uno::RuntimeException);

							// XSheetAnnotationsSupplier
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetAnnotations > SAL_CALL
							getAnnotations() throw(::com::sun::star::uno::RuntimeException);

							// XDrawPageSupplier
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage > SAL_CALL
							getDrawPage() throw(::com::sun::star::uno::RuntimeException);

							// XPrintAreas
	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::table::CellRangeAddress > SAL_CALL
							getPrintAreas() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL setPrintAreas( const ::com::sun::star::uno::Sequence<
								::com::sun::star::table::CellRangeAddress >& aPrintAreas )
									throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL getPrintTitleColumns() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setPrintTitleColumns( sal_Bool bPrintTitleColumns )
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::table::CellRangeAddress SAL_CALL getTitleColumns()
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setTitleColumns(
								const ::com::sun::star::table::CellRangeAddress& aTitleColumns )
									throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL getPrintTitleRows() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setPrintTitleRows( sal_Bool bPrintTitleRows )
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::table::CellRangeAddress SAL_CALL getTitleRows()
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setTitleRows(
								const ::com::sun::star::table::CellRangeAddress& aTitleRows )
									throw(::com::sun::star::uno::RuntimeException);

							// XSheetLinkable
	virtual ::com::sun::star::sheet::SheetLinkMode SAL_CALL getLinkMode()
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setLinkMode( ::com::sun::star::sheet::SheetLinkMode nLinkMode )
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::rtl::OUString SAL_CALL getLinkUrl() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setLinkUrl( const ::rtl::OUString& aLinkUrl )
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::rtl::OUString SAL_CALL getLinkSheetName() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setLinkSheetName( const ::rtl::OUString& aLinkSheetName )
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	link( const ::rtl::OUString& aUrl,
								const ::rtl::OUString& aSheetName,
								const ::rtl::OUString& aFilterName,
								const ::rtl::OUString& aFilterOptions,
								::com::sun::star::sheet::SheetLinkMode nMode )
									throw(::com::sun::star::uno::RuntimeException);

							// XSheetAuditing
	virtual sal_Bool SAL_CALL hideDependents( const ::com::sun::star::table::CellAddress& aPosition )
								throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL hidePrecedents( const ::com::sun::star::table::CellAddress& aPosition )
								throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL showDependents( const ::com::sun::star::table::CellAddress& aPosition )
								throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL showPrecedents( const ::com::sun::star::table::CellAddress& aPosition )
								throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL showErrors( const ::com::sun::star::table::CellAddress& aPosition )
								throw(::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL showInvalid() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	clearArrows() throw(::com::sun::star::uno::RuntimeException);

							// XSheetOutline
	virtual void SAL_CALL	group( const ::com::sun::star::table::CellRangeAddress& aRange,
								::com::sun::star::table::TableOrientation nOrientation )
									throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	ungroup( const ::com::sun::star::table::CellRangeAddress& aRange,
								::com::sun::star::table::TableOrientation nOrientation )
									throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	autoOutline( const ::com::sun::star::table::CellRangeAddress& aRange )
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	clearOutline() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	hideDetail( const ::com::sun::star::table::CellRangeAddress& aRange )
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	showDetail( const ::com::sun::star::table::CellRangeAddress& aRange )
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	showLevel( sal_Int16 nLevel,
								::com::sun::star::table::TableOrientation nOrientation )
									throw(::com::sun::star::uno::RuntimeException);

							// XProtectable
	virtual void SAL_CALL	protect( const ::rtl::OUString& aPassword )
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	unprotect( const ::rtl::OUString& aPassword )
								throw(::com::sun::star::lang::IllegalArgumentException,
									::com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL isProtected() throw(::com::sun::star::uno::RuntimeException);

							// XScenario
	virtual sal_Bool SAL_CALL getIsScenario() throw(::com::sun::star::uno::RuntimeException);
	virtual ::rtl::OUString SAL_CALL getScenarioComment() throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	setScenarioComment( const ::rtl::OUString& aScenarioComment )
								throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	addRanges( const ::com::sun::star::uno::Sequence<
								::com::sun::star::table::CellRangeAddress >& aRanges )
									throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	apply() throw(::com::sun::star::uno::RuntimeException);
							// XScenarioEnhanced
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::table::CellRangeAddress > SAL_CALL
                            getRanges(  )
                                    throw(::com::sun::star::uno::RuntimeException);

                            // XExternalSheetName
    virtual void SAL_CALL   setExternalName( const ::rtl::OUString& aUrl, const ::rtl::OUString& aSheetName )
                                throw (::com::sun::star::container::ElementExistException,
                                       ::com::sun::star::uno::RuntimeException);

                            // XEventsSupplier
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameReplace > SAL_CALL getEvents()
                                throw (::com::sun::star::uno::RuntimeException);

							// XPropertySet ueberladen wegen Sheet-Properties
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >
							SAL_CALL getPropertySetInfo()
								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);

							// 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 ScTableSheetObj* getImplementation( const com::sun::star::uno::Reference<
									com::sun::star::uno::XInterface> xObj );

							// XTypeProvider
	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes()
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId()
								throw(::com::sun::star::uno::RuntimeException);
};


class ScTableColumnObj : public ScCellRangeObj,
						 public com::sun::star::container::XNamed
{
private:
	const SfxItemPropertySet*		pColPropSet;

protected:
	virtual const SfxItemPropertyMap* GetItemPropertyMap();
    virtual void GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
								::com::sun::star::uno::Any& )
								throw(::com::sun::star::uno::RuntimeException);
    virtual void            SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
												const ::com::sun::star::uno::Any& aValue )
								throw(::com::sun::star::lang::IllegalArgumentException,
										::com::sun::star::uno::RuntimeException);

public:
							ScTableColumnObj(ScDocShell* pDocSh, SCCOL nCol, SCTAB nTab);
	virtual					~ScTableColumnObj();

	virtual ::com::sun::star::uno::Any SAL_CALL queryInterface(
								const ::com::sun::star::uno::Type & rType )
									throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL	acquire() throw();
	virtual void SAL_CALL	release() throw();

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

							// XPropertySet ueberladen wegen Spalten-Properties
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >
							SAL_CALL getPropertySetInfo()
								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);

							// XTypeProvider
	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes()
								throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId()
								throw(::com::sun::star::uno::RuntimeException);
};


class ScTableRowObj : public ScCellRangeObj
{
private:
	const SfxItemPropertySet*		pRowPropSet;

protected:
	virtual const SfxItemPropertyMap* GetItemPropertyMap();
    virtual void GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
								::com::sun::star::uno::Any& )
								throw(::com::sun::star::uno::RuntimeException);
    virtual void            SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
												const ::com::sun::star::uno::Any& aValue )
								throw(::com::sun::star::lang::IllegalArgumentException,
										::com::sun::star::uno::RuntimeException);

public:
							ScTableRowObj(ScDocShell* pDocSh, SCROW nRow, SCTAB nTab);
	virtual					~ScTableRowObj();

							// XPropertySet ueberladen wegen Zeilen-Properties
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >
							SAL_CALL getPropertySetInfo()
								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 ScCellsObj : public cppu::WeakImplHelper2<
							com::sun::star::container::XEnumerationAccess,
							com::sun::star::lang::XServiceInfo >,
						public SfxListener
{
private:
	ScDocShell*				pDocShell;
	ScRangeList				aRanges;

public:
							ScCellsObj(ScDocShell* pDocSh, const ScRangeList& rR);
	virtual					~ScCellsObj();

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

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

							// 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 ScCellsEnumeration : public cppu::WeakImplHelper2<
								com::sun::star::container::XEnumeration,
								com::sun::star::lang::XServiceInfo >,
							public SfxListener
{
private:
	ScDocShell*				pDocShell;
	ScRangeList				aRanges;
	ScAddress				aPos;
	ScMarkData*				pMark;
	sal_Bool					bAtEnd;

private:
	void					Advance_Impl();
	void					CheckPos_Impl();

public:
							ScCellsEnumeration(ScDocShell* pDocSh, const ScRangeList& rR);
	virtual					~ScCellsEnumeration();

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

							// XEnumeration
	virtual sal_Bool SAL_CALL hasMoreElements() throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Any SAL_CALL nextElement()
								throw(::com::sun::star::container::NoSuchElementException,
										::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 ScCellFormatsObj : public cppu::WeakImplHelper3<
							com::sun::star::container::XIndexAccess,
							com::sun::star::container::XEnumerationAccess,
							com::sun::star::lang::XServiceInfo >,
						public SfxListener
{
private:
	ScDocShell*				pDocShell;
	ScRange					aTotalRange;

private:
	ScCellRangeObj*			GetObjectByIndex_Impl(long nIndex) const;

public:
							ScCellFormatsObj(ScDocShell* pDocSh, const ScRange& rR);
	virtual					~ScCellFormatsObj();

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

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

							// 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 ScCellFormatsEnumeration : public cppu::WeakImplHelper2<
									com::sun::star::container::XEnumeration,
									com::sun::star::lang::XServiceInfo >,
								 public SfxListener
{
private:
	ScDocShell*				pDocShell;
	SCTAB					nTab;
	ScAttrRectIterator*		pIter;
	ScRange					aNext;
	sal_Bool					bAtEnd;
	sal_Bool					bDirty;

private:
	void					Advance_Impl();
	ScCellRangeObj*			NextObject_Impl();

public:
							ScCellFormatsEnumeration(ScDocShell* pDocSh, const ScRange& rR);
	virtual					~ScCellFormatsEnumeration();

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

							// XEnumeration
	virtual sal_Bool SAL_CALL hasMoreElements() throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Any SAL_CALL nextElement()
								throw(::com::sun::star::container::NoSuchElementException,
										::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);
};

typedef std::vector< ScRangeList > ScMyRangeLists;

class ScUniqueCellFormatsObj : public cppu::WeakImplHelper3<
							com::sun::star::container::XIndexAccess,
							com::sun::star::container::XEnumerationAccess,
							com::sun::star::lang::XServiceInfo >,
						public SfxListener
{
private:
	ScDocShell*						pDocShell;
	ScRange							aTotalRange;
	ScMyRangeLists					aRangeLists;

private:
	void							GetObjects_Impl();

public:
							ScUniqueCellFormatsObj(ScDocShell* pDocSh, const ScRange& rR);
	virtual					~ScUniqueCellFormatsObj();

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

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

							// 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 ScUniqueCellFormatsEnumeration : public cppu::WeakImplHelper2<
									com::sun::star::container::XEnumeration,
									com::sun::star::lang::XServiceInfo >,
								 public SfxListener
{
private:
	ScMyRangeLists					aRangeLists;
	ScDocShell*						pDocShell;
	sal_Int32						nCurrentPosition;

public:
							ScUniqueCellFormatsEnumeration(ScDocShell* pDocShell, const ScMyRangeLists& rRangeLists);
	virtual					~ScUniqueCellFormatsEnumeration();

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

							// XEnumeration
	virtual sal_Bool SAL_CALL hasMoreElements() throw(::com::sun::star::uno::RuntimeException);
	virtual ::com::sun::star::uno::Any SAL_CALL nextElement()
								throw(::com::sun::star::container::NoSuchElementException,
										::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);
};


#endif

