diff options
Diffstat (limited to 'sc/source/filter/xml/XMLExportIterator.hxx')
-rw-r--r-- | sc/source/filter/xml/XMLExportIterator.hxx | 374 |
1 files changed, 374 insertions, 0 deletions
diff --git a/sc/source/filter/xml/XMLExportIterator.hxx b/sc/source/filter/xml/XMLExportIterator.hxx new file mode 100644 index 000000000..33a0dfa88 --- /dev/null +++ b/sc/source/filter/xml/XMLExportIterator.hxx @@ -0,0 +1,374 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * 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 . + */ + +#pragma once + +#include <vector> +#include <list> +#include <com/sun/star/table/CellContentType.hpp> +#include <detfunc.hxx> +#include <detdata.hxx> +#include <cellvalue.hxx> + +#include <memory> + +namespace com::sun::star::drawing { class XShape; } +namespace com::sun::star::sheet { class XSpreadsheet; } +namespace com::sun::star::table { class XCellRange; } +namespace com::sun::star::table { struct CellRangeAddress; } + +class ScPostIt; +class ScHorizontalCellIterator; +struct ScMyCell; +class ScXMLExport; +class ScFormatRangeStyles; + +class ScMyIteratorBase +{ +protected: + virtual bool GetFirstAddress( ScAddress& rCellAddress ) = 0; + +public: + ScMyIteratorBase(); + virtual ~ScMyIteratorBase(); + + ScMyIteratorBase(ScMyIteratorBase const &) = default; + ScMyIteratorBase(ScMyIteratorBase &&) = default; + ScMyIteratorBase & operator =(ScMyIteratorBase const &) = default; + ScMyIteratorBase & operator =(ScMyIteratorBase &&) = default; + + virtual void SetCellData( ScMyCell& rMyCell ) = 0; + virtual void Sort() = 0; + + void UpdateAddress( ScAddress& rCellAddress ); +}; + +struct ScMyShape +{ + ScAddress aAddress; + ScAddress aEndAddress; + sal_Int32 nEndX; + sal_Int32 nEndY; + bool bResizeWithCell; + css::uno::Reference<css::drawing::XShape> xShape; + + bool operator<(const ScMyShape& aShape) const; +}; + +typedef std::list<ScMyShape> ScMyShapeList; + +class ScMyShapesContainer : public ScMyIteratorBase +{ +private: + ScMyShapeList aShapeList; +protected: + virtual bool GetFirstAddress( ScAddress& rCellAddress ) override; +public: + ScMyShapesContainer(); + virtual ~ScMyShapesContainer() override; + + using ScMyIteratorBase::UpdateAddress; + void AddNewShape(const ScMyShape& aShape); + bool HasShapes() const { return !aShapeList.empty(); } + const ScMyShapeList& GetShapes() const { return aShapeList; } + virtual void SetCellData( ScMyCell& rMyCell ) override; + virtual void Sort() override; + void SkipTable(SCTAB nSkip); +}; + +struct ScMyNoteShape +{ + css::uno::Reference<css::drawing::XShape> xShape; + ScAddress aPos; + + bool operator<(const ScMyNoteShape& aNote) const; +}; + +typedef std::list<ScMyNoteShape> ScMyNoteShapeList; + +class ScMyNoteShapesContainer : public ScMyIteratorBase +{ +private: + ScMyNoteShapeList aNoteShapeList; +protected: + virtual bool GetFirstAddress( ScAddress& rCellAddress ) override; +public: + ScMyNoteShapesContainer(); + virtual ~ScMyNoteShapesContainer() override; + + using ScMyIteratorBase::UpdateAddress; + void AddNewNote(const ScMyNoteShape& aNote); + const ScMyNoteShapeList& GetNotes() const { return aNoteShapeList; } + virtual void SetCellData( ScMyCell& rMyCell ) override; + virtual void Sort() override; + void SkipTable(SCTAB nSkip); +}; + +struct ScMyMergedRange +{ + ScRange aCellRange; + sal_Int32 nRows; + bool bIsFirst; + bool operator<(const ScMyMergedRange& aRange) const; +}; + +typedef std::list<ScMyMergedRange> ScMyMergedRangeList; + +class ScMyMergedRangesContainer : public ScMyIteratorBase +{ +private: + ScMyMergedRangeList aRangeList; +protected: + virtual bool GetFirstAddress( ScAddress& rCellAddress ) override; +public: + ScMyMergedRangesContainer(); + virtual ~ScMyMergedRangesContainer() override; + void AddRange(const ScRange& rMergedRange); + + using ScMyIteratorBase::UpdateAddress; + virtual void SetCellData( ScMyCell& rMyCell ) override; + virtual void Sort() override; // + remove doublets + void SkipTable(SCTAB nSkip); +}; + +struct ScMyAreaLink +{ + OUString sFilter; + OUString sFilterOptions; + OUString sURL; + OUString sSourceStr; + ScRange aDestRange; + sal_Int32 nRefreshDelaySeconds; + + ScMyAreaLink() : nRefreshDelaySeconds( 0 ) {} + + sal_Int32 GetColCount() const { return aDestRange.aEnd.Col() - aDestRange.aStart.Col() + 1; } + sal_Int32 GetRowCount() const { return aDestRange.aEnd.Row() - aDestRange.aStart.Row() + 1; } + + bool Compare( const ScMyAreaLink& rAreaLink ) const; + bool operator<(const ScMyAreaLink& rAreaLink ) const; +}; + +typedef ::std::list< ScMyAreaLink > ScMyAreaLinkList; + +class ScMyAreaLinksContainer : public ScMyIteratorBase +{ +private: + ScMyAreaLinkList aAreaLinkList; +protected: + virtual bool GetFirstAddress( ScAddress& rCellAddress ) override; +public: + ScMyAreaLinksContainer(); + virtual ~ScMyAreaLinksContainer() override; + + void AddNewAreaLink( const ScMyAreaLink& rAreaLink ) + { aAreaLinkList.push_back( rAreaLink ); } + + using ScMyIteratorBase::UpdateAddress; + virtual void SetCellData( ScMyCell& rMyCell ) override; + virtual void Sort() override; + void SkipTable(SCTAB nSkip); +}; + +typedef std::list<ScRange> ScMyEmptyDatabaseRangeList; + +class ScMyEmptyDatabaseRangesContainer : public ScMyIteratorBase +{ +private: + ScMyEmptyDatabaseRangeList aDatabaseList; +protected: + virtual bool GetFirstAddress( ScAddress& rCellAddress ) override; +public: + ScMyEmptyDatabaseRangesContainer(); + virtual ~ScMyEmptyDatabaseRangesContainer() override; + + ScMyEmptyDatabaseRangesContainer(ScMyEmptyDatabaseRangesContainer const &) = default; + ScMyEmptyDatabaseRangesContainer(ScMyEmptyDatabaseRangesContainer &&) = default; + ScMyEmptyDatabaseRangesContainer & operator =(ScMyEmptyDatabaseRangesContainer const &) = default; + ScMyEmptyDatabaseRangesContainer & operator =(ScMyEmptyDatabaseRangesContainer &&) = default; + + void AddNewEmptyDatabaseRange(const css::table::CellRangeAddress& aCellRangeAddress); + + using ScMyIteratorBase::UpdateAddress; + virtual void SetCellData( ScMyCell& rMyCell ) override; + virtual void Sort() override; + void SkipTable(SCTAB nSkip); +}; + +struct ScMyDetectiveObj +{ + ScAddress aPosition; + ScRange aSourceRange; + ScDetectiveObjType eObjType; + bool bHasError; + bool operator<(const ScMyDetectiveObj& rDetObj) const; +}; + +typedef ::std::list< ScMyDetectiveObj > ScMyDetectiveObjList; +typedef ::std::vector< ScMyDetectiveObj > ScMyDetectiveObjVec; + +class ScMyDetectiveObjContainer : public ScMyIteratorBase +{ +private: + ScMyDetectiveObjList aDetectiveObjList; +protected: + virtual bool GetFirstAddress( ScAddress& rCellAddress ) override; +public: + ScMyDetectiveObjContainer(); + virtual ~ScMyDetectiveObjContainer() override; + + void AddObject( + ScDetectiveObjType eObjType, + const SCTAB nSheet, + const ScAddress& rPosition, + const ScRange& rSourceRange, + bool bHasError ); + + using ScMyIteratorBase::UpdateAddress; + virtual void SetCellData( ScMyCell& rMyCell ) override; + virtual void Sort() override; + void SkipTable(SCTAB nSkip); +}; + +struct ScMyDetectiveOp +{ + ScAddress aPosition; + ScDetOpType eOpType; + sal_Int32 nIndex; + bool operator<(const ScMyDetectiveOp& rDetOp) const; +}; + +typedef ::std::list< ScMyDetectiveOp > ScMyDetectiveOpList; +typedef ::std::vector< ScMyDetectiveOp > ScMyDetectiveOpVec; + +class ScMyDetectiveOpContainer : public ScMyIteratorBase +{ +private: + ScMyDetectiveOpList aDetectiveOpList; +protected: + virtual bool GetFirstAddress( ScAddress& rCellAddress ) override; +public: + ScMyDetectiveOpContainer(); + virtual ~ScMyDetectiveOpContainer() override; + + void AddOperation( ScDetOpType eOpType, const ScAddress& rPosition, sal_uInt32 nIndex ); + + using ScMyIteratorBase::UpdateAddress; + virtual void SetCellData( ScMyCell& rMyCell ) override; + virtual void Sort() override; + void SkipTable(SCTAB nSkip); +}; + +// contains data to export for the current cell position +struct ScMyCell +{ + ScAddress maCellAddress; /// Use this instead of the UNO one. + + ScAddress aCellAddress; + ScRange aMergeRange; + ScRange aMatrixRange; + + ScMyAreaLink aAreaLink; + ScMyShapeList aShapeList; + ScMyDetectiveObjVec aDetectiveObjVec; + ScMyDetectiveOpVec aDetectiveOpVec; + + ScPostIt* pNote; + + sal_Int32 nValidationIndex; + sal_Int32 nStyleIndex; + sal_Int32 nNumberFormat; + css::table::CellContentType nType; + + ScRefCellValue maBaseCell; + + bool bIsAutoStyle; + + bool bHasShape; + bool bIsMergedBase; + bool bIsCovered; + bool bHasAreaLink; + bool bHasEmptyDatabase; + bool bHasDetectiveObj; + bool bHasDetectiveOp; + + bool bIsMatrixBase; + bool bIsMatrixCovered; + bool bHasAnnotation; + + ScMyCell(); +}; + +class ScMyNotEmptyCellsIterator +{ + ScMyNotEmptyCellsIterator(const ScMyNotEmptyCellsIterator&) = delete; + const ScMyNotEmptyCellsIterator& operator=(const ScMyNotEmptyCellsIterator&) = delete; + + css::uno::Reference<css::sheet::XSpreadsheet> xTable; + css::uno::Reference<css::table::XCellRange> xCellRange; + ScAddress aLastAddress; + + ScMyShapesContainer* pShapes; + ScMyNoteShapesContainer* pNoteShapes; + ScMyEmptyDatabaseRangesContainer* pEmptyDatabaseRanges; + ScMyMergedRangesContainer* pMergedRanges; + ScMyAreaLinksContainer* pAreaLinks; + ScMyDetectiveObjContainer* pDetectiveObj; + ScMyDetectiveOpContainer* pDetectiveOp; + + ScXMLExport& rExport; + std::unique_ptr<ScHorizontalCellIterator> mpCellItr; + + SCCOL nCellCol; + SCROW nCellRow; + SCTAB nCurrentTable; + + void UpdateAddress( ScAddress& rAddress ); + void SetCellData( ScMyCell& rMyCell, const ScAddress& rAddress ); + + void HasAnnotation( ScMyCell& aCell ); +public: + explicit ScMyNotEmptyCellsIterator(ScXMLExport& rExport); + ~ScMyNotEmptyCellsIterator(); + + void Clear(); + + void SetShapes(ScMyShapesContainer* pNewShapes) + { pShapes = pNewShapes; } + void SetNoteShapes(ScMyNoteShapesContainer* pNewNoteShapes) + { pNoteShapes = pNewNoteShapes; } + void SetEmptyDatabaseRanges(ScMyEmptyDatabaseRangesContainer* pNewEmptyDatabaseRanges) + { pEmptyDatabaseRanges = pNewEmptyDatabaseRanges; } + void SetMergedRanges(ScMyMergedRangesContainer* pNewMergedRanges) + { pMergedRanges = pNewMergedRanges; } + void SetAreaLinks(ScMyAreaLinksContainer* pNewAreaLinks) + { pAreaLinks = pNewAreaLinks; } + void SetDetectiveObj(ScMyDetectiveObjContainer* pNewDetectiveObj) + { pDetectiveObj = pNewDetectiveObj; } + void SetDetectiveOp(ScMyDetectiveOpContainer* pNewDetectiveOp) + { pDetectiveOp = pNewDetectiveOp; } + + void SetCurrentTable(const SCTAB nTable, + const css::uno::Reference<css::sheet::XSpreadsheet>& rxTable); + void SkipTable(SCTAB nSkip); + + bool GetNext(ScMyCell& aCell, ScFormatRangeStyles* pCellStyles); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |