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

#include <xmloff/xmlexp.hxx>
#include <com/sun/star/sheet/XSpreadsheet.hpp>
#include <com/sun/star/sheet/XSpreadsheetDocument.hpp>
#include <com/sun/star/table/CellRangeAddress.hpp>
#include <com/sun/star/table/CellAddress.hpp>
#include <com/sun/star/drawing/XShapes.hpp>
#include <com/sun/star/table/XCellRange.hpp>

namespace com { namespace sun { namespace star {
	namespace beans { class XPropertySet; }
} } }

#include <hash_map>

class ScOutlineArray;
class SvXMLExportPropertyMapper;
class ScMyShapesContainer;
class ScMyMergedRangesContainer;
class ScMyValidationsContainer;
class ScMyNotEmptyCellsIterator;
class ScChangeTrackingExportHelper;
class ScColumnStyles;
class ScRowStyles;
class ScFormatRangeStyles;
class ScRowFormatRanges;
class ScMyOpenCloseColumnRowGroup;
class ScMyAreaLinksContainer;
class ScMyDetectiveOpContainer;
struct ScMyCell;
class ScDocument;
class ScMySharedData;
class ScMyDefaultStyles;
class XMLNumberFormatAttributesExportHelper;
class ScChartListener;
class SfxItemPool;
class ScAddress;
class ScBaseCell;

typedef std::vector< com::sun::star::uno::Reference < com::sun::star::drawing::XShapes > > ScMyXShapesVec;

class ScXMLExport : public SvXMLExport
{
	ScDocument*					pDoc;
	com::sun::star::uno::Reference <com::sun::star::sheet::XSpreadsheet> xCurrentTable;
    com::sun::star::uno::Reference <com::sun::star::table::XCellRange> xCurrentTableCellRange;

    com::sun::star::uno::Reference<com::sun::star::io::XInputStream> xSourceStream;
    sal_Int32                   nSourceStreamPos;

	UniReference < XMLPropertyHandlerFactory >	xScPropHdlFactory;
	UniReference < XMLPropertySetMapper >		xCellStylesPropertySetMapper;
	UniReference < XMLPropertySetMapper >		xColumnStylesPropertySetMapper;
	UniReference < XMLPropertySetMapper >		xRowStylesPropertySetMapper;
	UniReference < XMLPropertySetMapper >		xTableStylesPropertySetMapper;
	UniReference < SvXMLExportPropertyMapper >	xCellStylesExportPropertySetMapper;
	UniReference < SvXMLExportPropertyMapper >	xColumnStylesExportPropertySetMapper;
	UniReference < SvXMLExportPropertyMapper >	xRowStylesExportPropertySetMapper;
	UniReference < SvXMLExportPropertyMapper >	xTableStylesExportPropertySetMapper;
	XMLNumberFormatAttributesExportHelper* pNumberFormatAttributesExportHelper;
    typedef ::std::hash_map<sal_Int32, sal_Int32>  NumberFormatIndexMap;
    NumberFormatIndexMap                aNumFmtIndexMap;
	ScMySharedData*						pSharedData;
	ScColumnStyles*					pColumnStyles;
	ScRowStyles*					pRowStyles;
	ScFormatRangeStyles*				pCellStyles;
	ScRowFormatRanges*					pRowFormatRanges;
	std::vector<rtl::OUString>			aTableStyles;
	com::sun::star::table::CellRangeAddress	aRowHeaderRange;
	ScMyOpenCloseColumnRowGroup*		pGroupColumns;
	ScMyOpenCloseColumnRowGroup*		pGroupRows;
	ScMyDefaultStyles*					pDefaults;
	ScChartListener*					pChartListener;
    const ScMyCell*                     pCurrentCell;

	ScMyMergedRangesContainer*	pMergedRangesContainer;
	ScMyValidationsContainer*	pValidationsContainer;
	ScMyNotEmptyCellsIterator*	pCellsItr;
	ScChangeTrackingExportHelper*	pChangeTrackingExportHelper;
	const rtl::OUString			sLayerID;
	const rtl::OUString			sCaptionShape;
    rtl::OUString               sExternalRefTabStyleName;
    rtl::OUString               sAttrName;
    rtl::OUString               sAttrStyleName;
    rtl::OUString               sAttrColumnsRepeated;
    rtl::OUString               sAttrFormula;
    rtl::OUString               sAttrValueType;
    rtl::OUString               sAttrStringValue;
    rtl::OUString               sElemCell;
    rtl::OUString               sElemCoveredCell;
    rtl::OUString               sElemCol;
    rtl::OUString               sElemRow;
    rtl::OUString               sElemTab;
    rtl::OUString               sElemP;
    sal_Int32					nOpenRow;
    sal_Int32                   nProgressCount;
	sal_uInt16					nCurrentTable;
	sal_Bool					bHasRowHeader;
	sal_Bool					bRowHeaderOpen;
	sal_Bool					mbShowProgress;

    sal_Int32       GetNumberFormatStyleIndex(sal_Int32 nNumFmt) const;
	sal_Bool		HasDrawPages(com::sun::star::uno::Reference <com::sun::star::sheet::XSpreadsheetDocument>& xDoc);
	void			CollectSharedData(sal_Int32& nTableCount, sal_Int32& nShapesCount, const sal_Int32 nCellCount);
	void			CollectShapesAutoStyles(const sal_Int32 nTableCount);
	void			WriteTablesView(const com::sun::star::uno::Any& aTableView);
	void			WriteView(const com::sun::star::uno::Any& aView);
	virtual void _ExportFontDecls();
	virtual void _ExportStyles( sal_Bool bUsed );
	virtual void _ExportAutoStyles();
	virtual void _ExportMasterStyles();
	virtual void SetBodyAttributes();
	virtual void _ExportContent();
	virtual void _ExportMeta();

	void CollectInternalShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape );

	com::sun::star::table::CellRangeAddress GetEndAddress(const com::sun::star::uno::Reference<com::sun::star::sheet::XSpreadsheet>& xTable,
														const sal_Int32 nTable);
//	ScMyEmptyDatabaseRangesContainer GetEmptyDatabaseRanges();
	void GetAreaLinks( com::sun::star::uno::Reference< com::sun::star::sheet::XSpreadsheetDocument>& xSpreadDoc, ScMyAreaLinksContainer& rAreaLinks );
	void GetDetectiveOpList( ScMyDetectiveOpContainer& rDetOp );
	void WriteSingleColumn(const sal_Int32 nRepeatColumns, const sal_Int32 nStyleIndex,
		const sal_Int32 nIndex, const sal_Bool bIsAutoStyle, const sal_Bool bIsVisible);
	void WriteColumn(const sal_Int32 nColumn, const sal_Int32 nRepeatColumns,
		const sal_Int32 nStyleIndex, const sal_Bool bIsVisible);
	void OpenHeaderColumn();
	void CloseHeaderColumn();
	void ExportColumns(const sal_Int32 nTable, const com::sun::star::table::CellRangeAddress& aColumnHeaderRange, const sal_Bool bHasColumnHeader);
    void ExportExternalRefCacheStyles();
	void ExportFormatRanges(const sal_Int32 nStartCol, const sal_Int32 nStartRow,
		const sal_Int32 nEndCol, const sal_Int32 nEndRow, const sal_Int32 nSheet);
	void WriteRowContent();
	void WriteRowStartTag(sal_Int32 nRow, const sal_Int32 nIndex, const sal_Int8 nFlag, const sal_Int32 nEmptyRows);
	void OpenHeaderRows();
	void CloseHeaderRows();
	void OpenNewRow(const sal_Int32 nIndex, const sal_Int8 nFlag, const sal_Int32 nStartRow, const sal_Int32 nEmptyRows);
	void OpenAndCloseRow(const sal_Int32 nIndex, const sal_Int8 nFlag,
		const sal_Int32 nStartRow, const sal_Int32 nEmptyRows);
	void OpenRow(const sal_Int32 nTable, const sal_Int32 nStartRow, const sal_Int32 nRepeatRow);
	void CloseRow(const sal_Int32 nRow);
	void GetColumnRowHeader(sal_Bool& bHasColumnHeader, com::sun::star::table::CellRangeAddress& aColumnHeaderRange,
        sal_Bool& bHasRowHeader, com::sun::star::table::CellRangeAddress& aRowHeaderRange,
        rtl::OUString& rPrintRanges) const;
	void FillFieldGroup(ScOutlineArray* pFields, ScMyOpenCloseColumnRowGroup* pGroups);
	void FillColumnRowGroups();

//UNUSED2008-05  sal_Bool GetMerge (const com::sun::star::uno::Reference <com::sun::star::sheet::XSpreadsheet>& xTable,
//UNUSED2008-05                     sal_Int32 nCol, sal_Int32 nRow,
//UNUSED2008-05                     com::sun::star::table::CellRangeAddress& aCellAddress);

	sal_Bool GetMerged (const com::sun::star::table::CellRangeAddress* pCellRange,
		const com::sun::star::uno::Reference <com::sun::star::sheet::XSpreadsheet>& xTable);

	sal_Bool GetCellText (ScMyCell& rMyCell, const ScAddress& aPos) const;

    void WriteCell(ScMyCell& aCell, sal_Int32 nEqualCellCount);
	void WriteAreaLink(const ScMyCell& rMyCell);
	void WriteAnnotation(ScMyCell& rMyCell);
	void WriteDetective(const ScMyCell& rMyCell);
	void ExportShape(const com::sun::star::uno::Reference < com::sun::star::drawing::XShape >& xShape, com::sun::star::awt::Point* pPoint);
	void WriteShapes(const ScMyCell& rMyCell);
	void WriteTableShapes();
    void SetRepeatAttribute(sal_Int32 nEqualCellCount, bool bIncProgress);

	sal_Bool IsCellTypeEqual (const ScMyCell& aCell1, const ScMyCell& aCell2) const;
 	sal_Bool IsEditCell(const com::sun::star::table::CellAddress& aAddress, ScMyCell* pMyCell = NULL) const;
//UNUSED2008-05  sal_Bool IsEditCell(const com::sun::star::uno::Reference <com::sun::star::table::XCell>& xCell) const;
	sal_Bool IsEditCell(ScMyCell& rCell) const;
    sal_Bool IsMultiLineFormulaCell(ScMyCell& rCell) const;
//UNUSED2008-05  sal_Bool IsAnnotationEqual(const com::sun::star::uno::Reference<com::sun::star::table::XCell>& xCell1,
//UNUSED2008-05                             const com::sun::star::uno::Reference<com::sun::star::table::XCell>& xCell2);
	sal_Bool IsCellEqual (ScMyCell& aCell1, ScMyCell& aCell2);

	void WriteCalculationSettings(const com::sun::star::uno::Reference <com::sun::star::sheet::XSpreadsheetDocument>& xSpreadDoc);
	void WriteTableSource();
	void WriteScenario();	// core implementation
	void WriteTheLabelRanges(const com::sun::star::uno::Reference< com::sun::star::sheet::XSpreadsheetDocument >& xSpreadDoc);
	void WriteLabelRanges( const com::sun::star::uno::Reference< com::sun::star::container::XIndexAccess >& xRangesIAccess, sal_Bool bColumn );
	void WriteNamedExpressions(const com::sun::star::uno::Reference <com::sun::star::sheet::XSpreadsheetDocument>& xSpreadDoc, sal_Int16 nWhichTable);
    void WriteExternalRefCaches();
	void WriteConsolidation();	// core implementation

	void CollectUserDefinedNamespaces(const SfxItemPool* pPool, sal_uInt16 nAttrib);

    void AddStyleFromCells(
        const com::sun::star::uno::Reference< com::sun::star::beans::XPropertySet >& xProperties,
        const com::sun::star::uno::Reference< com::sun::star::sheet::XSpreadsheet >& xTable,
        sal_Int32 nTable, const rtl::OUString* pOldName );
    void AddStyleFromColumn(
        const com::sun::star::uno::Reference< com::sun::star::beans::XPropertySet >& xColumnProperties,
        const rtl::OUString* pOldName, sal_Int32& rIndex, sal_Bool& rIsVisible );
    void AddStyleFromRow(
        const com::sun::star::uno::Reference< com::sun::star::beans::XPropertySet >& xRowProperties,
        const rtl::OUString* pOldName, sal_Int32& rIndex );

    void IncrementProgressBar(sal_Bool bEditCell, sal_Int32 nInc = 1);

    void CopySourceStream( sal_Int32 nStartOffset, sal_Int32 nEndOffset, sal_Int32& rNewStart, sal_Int32& rNewEnd );

protected:
	virtual SvXMLAutoStylePoolP* CreateAutoStylePool();
	virtual XMLPageExport* CreatePageExport();
	virtual XMLShapeExport* CreateShapeExport();
	virtual XMLFontAutoStylePool* CreateFontAutoStylePool();
public:
	// #110680#
	ScXMLExport(
		const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xServiceFactory,
		const sal_uInt16 nExportFlag);

	virtual ~ScXMLExport();

	static sal_Int16 GetFieldUnit();
	inline ScDocument*			GetDocument()			{ return pDoc; }
	inline const ScDocument*	GetDocument() const		{ return pDoc; }
//UNUSED2008-05  sal_Bool IsMatrix (const com::sun::star::uno::Reference <com::sun::star::table::XCellRange>& xCellRange,
//UNUSED2008-05                     const com::sun::star::uno::Reference <com::sun::star::sheet::XSpreadsheet>& xTable,
//UNUSED2008-05                     const sal_Int32 nCol, const sal_Int32 nRow,
//UNUSED2008-05                     com::sun::star::table::CellRangeAddress& aCellAddress, sal_Bool& bIsFirst) const;
	sal_Bool IsMatrix (const ScAddress& aCell,
		com::sun::star::table::CellRangeAddress& aCellAddress, sal_Bool& bIsFirst) const;

	UniReference < XMLPropertySetMapper > GetCellStylesPropertySetMapper() { return xCellStylesPropertySetMapper; }
	UniReference < XMLPropertySetMapper > GetTableStylesPropertySetMapper() { return xTableStylesPropertySetMapper; }

    void SetSourceStream( const com::sun::star::uno::Reference<com::sun::star::io::XInputStream>& xNewStream );

	void GetChangeTrackViewSettings(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>& rProps);
	virtual void GetViewSettings(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>& rProps);
	virtual void GetConfigurationSettings(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>& rProps);

    virtual void exportAnnotationMeta( const com::sun::star::uno::Reference < com::sun::star::drawing::XShape >& xShape);

	void CreateSharedData(const sal_Int32 nTableCount);
	void SetSharedData(ScMySharedData* pTemp) { pSharedData = pTemp; }
	ScMySharedData* GetSharedData() { return pSharedData; }
	XMLNumberFormatAttributesExportHelper* GetNumberFormatAttributesExportHelper();

	// Export the document.
	virtual sal_uInt32 exportDoc( enum ::xmloff::token::XMLTokenEnum eClass = ::xmloff::token::XML_TOKEN_INVALID );

	// XExporter
	virtual void SAL_CALL setSourceDocument( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent >& xDoc ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);

	// XFilter
    virtual sal_Bool SAL_CALL filter( const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aDescriptor ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL cancel() throw(::com::sun::star::uno::RuntimeException);

	// XInitialization
    virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments ) throw(::com::sun::star::uno::Exception, ::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);

    virtual void DisposingModel();
};

#endif

