blob: 0872275071f10c65ab9697a91ac37c1595f6925a [file] [log] [blame]
/**************************************************************
*
* 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_XMLEXPORTITERATOR_HXX
#define SC_XMLEXPORTITERATOR_HXX
#include <vector>
#include <list>
#include <com/sun/star/sheet/XSpreadsheet.hpp>
#include <com/sun/star/table/CellAddress.hpp>
#include <com/sun/star/table/CellRangeAddress.hpp>
#include <com/sun/star/table/XCell.hpp>
#include <com/sun/star/text/XText.hpp>
#include <com/sun/star/sheet/XSheetAnnotation.hpp>
#include <com/sun/star/drawing/XShape.hpp>
#include "global.hxx"
#include "detfunc.hxx"
#include "detdata.hxx"
class ScHorizontalCellIterator;
struct ScMyCell;
class ScXMLExport;
class ScFormatRangeStyles;
class ScBaseCell;
//==============================================================================
class ScMyIteratorBase
{
protected:
virtual sal_Bool GetFirstAddress( ::com::sun::star::table::CellAddress& rCellAddress ) = 0;
public:
ScMyIteratorBase();
virtual ~ScMyIteratorBase();
virtual void SetCellData( ScMyCell& rMyCell ) = 0;
virtual void Sort() = 0;
virtual void UpdateAddress( ::com::sun::star::table::CellAddress& rCellAddress );
};
//==============================================================================
struct ScMyShape
{
ScAddress aAddress;
ScAddress aEndAddress;
com::sun::star::uno::Reference<com::sun::star::drawing::XShape> xShape;
sal_Bool operator<(const ScMyShape& aShape) const;
};
typedef std::list<ScMyShape> ScMyShapeList;
class ScMyShapesContainer : ScMyIteratorBase
{
private:
ScMyShapeList aShapeList;
protected:
virtual sal_Bool GetFirstAddress( ::com::sun::star::table::CellAddress& rCellAddress );
public:
ScMyShapesContainer();
virtual ~ScMyShapesContainer();
using ScMyIteratorBase::UpdateAddress;
void AddNewShape(const ScMyShape& aShape);
sal_Bool HasShapes() { return !aShapeList.empty(); }
const ScMyShapeList* GetShapes() { return &aShapeList; }
virtual void SetCellData( ScMyCell& rMyCell );
virtual void Sort();
void SkipTable(SCTAB nSkip);
};
struct ScMyNoteShape
{
com::sun::star::uno::Reference<com::sun::star::drawing::XShape> xShape;
ScAddress aPos;
sal_Bool operator<(const ScMyNoteShape& aNote) const;
};
typedef std::list<ScMyNoteShape> ScMyNoteShapeList;
class ScMyNoteShapesContainer : ScMyIteratorBase
{
private:
ScMyNoteShapeList aNoteShapeList;
protected:
virtual sal_Bool GetFirstAddress( ::com::sun::star::table::CellAddress& rCellAddress );
public:
ScMyNoteShapesContainer();
virtual ~ScMyNoteShapesContainer();
using ScMyIteratorBase::UpdateAddress;
void AddNewNote(const ScMyNoteShape& aNote);
sal_Bool HasNotes() { return !aNoteShapeList.empty(); }
const ScMyNoteShapeList* GetNotes() { return &aNoteShapeList; }
virtual void SetCellData( ScMyCell& rMyCell );
virtual void Sort();
void SkipTable(SCTAB nSkip);
};
//==============================================================================
struct ScMyMergedRange
{
com::sun::star::table::CellRangeAddress aCellRange;
sal_Int32 nRows;
sal_Bool bIsFirst;
sal_Bool operator<(const ScMyMergedRange& aRange) const;
};
typedef std::list<ScMyMergedRange> ScMyMergedRangeList;
class ScMyMergedRangesContainer : ScMyIteratorBase
{
private:
ScMyMergedRangeList aRangeList;
protected:
virtual sal_Bool GetFirstAddress( ::com::sun::star::table::CellAddress& rCellAddress );
public:
ScMyMergedRangesContainer();
virtual ~ScMyMergedRangesContainer();
void AddRange(const com::sun::star::table::CellRangeAddress aMergedRange);
using ScMyIteratorBase::UpdateAddress;
virtual void SetCellData( ScMyCell& rMyCell );
virtual void Sort(); // + remove doublets
void SkipTable(SCTAB nSkip);
};
//==============================================================================
struct ScMyAreaLink
{
::rtl::OUString sFilter;
::rtl::OUString sFilterOptions;
::rtl::OUString sURL;
::rtl::OUString sSourceStr;
::com::sun::star::table::CellRangeAddress aDestRange;
sal_Int32 nRefresh;
inline ScMyAreaLink() : nRefresh( 0 ) {}
inline sal_Int32 GetColCount() const { return aDestRange.EndColumn - aDestRange.StartColumn + 1; }
inline sal_Int32 GetRowCount() const { return aDestRange.EndRow - aDestRange.StartRow + 1; }
sal_Bool Compare( const ScMyAreaLink& rAreaLink ) const;
sal_Bool operator<(const ScMyAreaLink& rAreaLink ) const;
};
typedef ::std::list< ScMyAreaLink > ScMyAreaLinkList;
class ScMyAreaLinksContainer : ScMyIteratorBase
{
private:
ScMyAreaLinkList aAreaLinkList;
protected:
virtual sal_Bool GetFirstAddress( ::com::sun::star::table::CellAddress& rCellAddress );
public:
ScMyAreaLinksContainer();
virtual ~ScMyAreaLinksContainer();
inline void AddNewAreaLink( const ScMyAreaLink& rAreaLink )
{ aAreaLinkList.push_back( rAreaLink ); }
using ScMyIteratorBase::UpdateAddress;
virtual void SetCellData( ScMyCell& rMyCell );
virtual void Sort();
void SkipTable(SCTAB nSkip);
};
//==============================================================================
struct ScMyCellRangeAddress : com::sun::star::table::CellRangeAddress
{
ScMyCellRangeAddress(const com::sun::star::table::CellRangeAddress& rRange);
sal_Bool operator<(const ScMyCellRangeAddress& rCellRangeAddress ) const;
};
typedef std::list<ScMyCellRangeAddress> ScMyEmptyDatabaseRangeList;
class ScMyEmptyDatabaseRangesContainer : ScMyIteratorBase
{
private:
ScMyEmptyDatabaseRangeList aDatabaseList;
protected:
virtual sal_Bool GetFirstAddress( ::com::sun::star::table::CellAddress& rCellAddress );
public:
ScMyEmptyDatabaseRangesContainer();
virtual ~ScMyEmptyDatabaseRangesContainer();
void AddNewEmptyDatabaseRange(const com::sun::star::table::CellRangeAddress& aCellRangeAddress);
using ScMyIteratorBase::UpdateAddress;
virtual void SetCellData( ScMyCell& rMyCell );
virtual void Sort();
void SkipTable(SCTAB nSkip);
};
//==============================================================================
struct ScMyDetectiveObj
{
::com::sun::star::table::CellAddress aPosition;
::com::sun::star::table::CellRangeAddress aSourceRange;
ScDetectiveObjType eObjType;
sal_Bool bHasError;
sal_Bool operator<(const ScMyDetectiveObj& rDetObj) const;
};
typedef ::std::list< ScMyDetectiveObj > ScMyDetectiveObjList;
typedef ::std::vector< ScMyDetectiveObj > ScMyDetectiveObjVec;
class ScMyDetectiveObjContainer : ScMyIteratorBase
{
private:
ScMyDetectiveObjList aDetectiveObjList;
protected:
virtual sal_Bool GetFirstAddress( ::com::sun::star::table::CellAddress& rCellAddress );
public:
ScMyDetectiveObjContainer();
virtual ~ScMyDetectiveObjContainer();
void AddObject(
ScDetectiveObjType eObjType,
const SCTAB nSheet,
const ScAddress& rPosition,
const ScRange& rSourceRange,
sal_Bool bHasError );
using ScMyIteratorBase::UpdateAddress;
virtual void SetCellData( ScMyCell& rMyCell );
virtual void Sort();
void SkipTable(SCTAB nSkip);
};
//==============================================================================
struct ScMyDetectiveOp
{
::com::sun::star::table::CellAddress aPosition;
ScDetOpType eOpType;
sal_Int32 nIndex;
sal_Bool operator<(const ScMyDetectiveOp& rDetOp) const;
};
typedef ::std::list< ScMyDetectiveOp > ScMyDetectiveOpList;
typedef ::std::vector< ScMyDetectiveOp > ScMyDetectiveOpVec;
class ScMyDetectiveOpContainer : ScMyIteratorBase
{
private:
ScMyDetectiveOpList aDetectiveOpList;
protected:
virtual sal_Bool GetFirstAddress( ::com::sun::star::table::CellAddress& rCellAddress );
public:
ScMyDetectiveOpContainer();
virtual ~ScMyDetectiveOpContainer();
void AddOperation( ScDetOpType eOpType, const ScAddress& rPosition, sal_uInt32 nIndex );
using ScMyIteratorBase::UpdateAddress;
virtual void SetCellData( ScMyCell& rMyCell );
virtual void Sort();
void SkipTable(SCTAB nSkip);
};
//==============================================================================
// contains data to export for the current cell position
struct ScMyCell
{
// com::sun::star::uno::Reference<com::sun::star::table::XCell> xCell;
// com::sun::star::uno::Reference<com::sun::star::text::XText> xText;
com::sun::star::uno::Reference<com::sun::star::sheet::XSheetAnnotation> xAnnotation;
com::sun::star::uno::Reference<com::sun::star::drawing::XShape> xNoteShape;
com::sun::star::table::CellAddress aCellAddress;
com::sun::star::table::CellRangeAddress aMergeRange;
com::sun::star::table::CellRangeAddress aMatrixRange;
rtl::OUString sStringValue;
rtl::OUString sAnnotationText;
ScMyAreaLink aAreaLink;
ScMyShapeList aShapeList;
ScMyDetectiveObjVec aDetectiveObjVec;
ScMyDetectiveOpVec aDetectiveOpVec;
double fValue;
sal_Int32 nValidationIndex;
sal_Int32 nStyleIndex;
sal_Int32 nNumberFormat;
com::sun::star::table::CellContentType nType;
ScBaseCell* pBaseCell;
sal_Bool bIsAutoStyle;
sal_Bool bHasShape;
sal_Bool bIsMergedBase;
sal_Bool bIsCovered;
sal_Bool bHasAreaLink;
sal_Bool bHasEmptyDatabase;
sal_Bool bHasDetectiveObj;
sal_Bool bHasDetectiveOp;
sal_Bool bIsEditCell;
sal_Bool bKnowWhetherIsEditCell;
sal_Bool bHasStringValue;
sal_Bool bHasDoubleValue;
sal_Bool bHasXText;
sal_Bool bIsMatrixBase;
sal_Bool bIsMatrixCovered;
sal_Bool bHasAnnotation;
ScMyCell();
~ScMyCell();
};
//==============================================================================
struct ScMyExportAnnotation
{
com::sun::star::uno::Reference<com::sun::star::sheet::XSheetAnnotation> xAnnotation;
com::sun::star::table::CellAddress aCellAddress;
sal_Bool operator<(const ScMyExportAnnotation& rAnno) const;
};
typedef ::std::list< ScMyExportAnnotation > ScMyExportAnnotationList;
class ScMyNotEmptyCellsIterator
{
com::sun::star::uno::Reference<com::sun::star::sheet::XSpreadsheet> xTable;
com::sun::star::uno::Reference<com::sun::star::table::XCellRange> xCellRange;
com::sun::star::table::CellAddress aLastAddress;
ScMyExportAnnotationList aAnnotations;
ScMyShapesContainer* pShapes;
ScMyNoteShapesContainer* pNoteShapes;
ScMyEmptyDatabaseRangesContainer* pEmptyDatabaseRanges;
ScMyMergedRangesContainer* pMergedRanges;
ScMyAreaLinksContainer* pAreaLinks;
ScMyDetectiveObjContainer* pDetectiveObj;
ScMyDetectiveOpContainer* pDetectiveOp;
ScXMLExport& rExport;
ScHorizontalCellIterator* pCellItr;
SCCOL nCellCol;
SCROW nCellRow;
SCTAB nCurrentTable;
void UpdateAddress( ::com::sun::star::table::CellAddress& rAddress );
void SetCellData( ScMyCell& rMyCell, ::com::sun::star::table::CellAddress& rAddress );
void SetMatrixCellData( ScMyCell& rMyCell );
void HasAnnotation( ScMyCell& aCell );
public:
ScMyNotEmptyCellsIterator(ScXMLExport& rExport);
~ScMyNotEmptyCellsIterator();
void Clear();
inline void SetShapes(ScMyShapesContainer* pNewShapes)
{ pShapes = pNewShapes; }
inline void SetNoteShapes(ScMyNoteShapesContainer* pNewNoteShapes)
{ pNoteShapes = pNewNoteShapes; }
inline void SetEmptyDatabaseRanges(ScMyEmptyDatabaseRangesContainer* pNewEmptyDatabaseRanges)
{ pEmptyDatabaseRanges = pNewEmptyDatabaseRanges; }
inline void SetMergedRanges(ScMyMergedRangesContainer* pNewMergedRanges)
{ pMergedRanges = pNewMergedRanges; }
inline void SetAreaLinks(ScMyAreaLinksContainer* pNewAreaLinks)
{ pAreaLinks = pNewAreaLinks; }
inline void SetDetectiveObj(ScMyDetectiveObjContainer* pNewDetectiveObj)
{ pDetectiveObj = pNewDetectiveObj; }
inline void SetDetectiveOp(ScMyDetectiveOpContainer* pNewDetectiveOp)
{ pDetectiveOp = pNewDetectiveOp; }
void SetCurrentTable(const SCTAB nTable,
com::sun::star::uno::Reference<com::sun::star::sheet::XSpreadsheet>& rxTable);
void SkipTable(SCTAB nSkip);
sal_Bool GetNext(ScMyCell& aCell, ScFormatRangeStyles* pCellStyles);
};
#endif