diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2014-12-03 21:27:46 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2014-12-03 21:37:12 +0100 |
commit | 1ef57521af0a53d03c68321817f9dadf7f4dd730 (patch) | |
tree | 6c0dac3557209841f8bb9035778b317bb250c0ce /writerfilter/source/dmapper/TableData.hxx | |
parent | 179810cdf254177197a3108e970d9555468cd265 (diff) |
writerfilter: only dmapper needs TableData
Change-Id: I4c2ead05d845eebe101d34ed8fe9284509beb752
Diffstat (limited to 'writerfilter/source/dmapper/TableData.hxx')
-rw-r--r-- | writerfilter/source/dmapper/TableData.hxx | 426 |
1 files changed, 426 insertions, 0 deletions
diff --git a/writerfilter/source/dmapper/TableData.hxx b/writerfilter/source/dmapper/TableData.hxx new file mode 100644 index 000000000000..7f8b406d3630 --- /dev/null +++ b/writerfilter/source/dmapper/TableData.hxx @@ -0,0 +1,426 @@ +/* -*- 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 . + */ + +#ifndef INCLUDED_WRITERFILTER_SOURCE_DMAPPER_RESOURCEMODEL_TABLEDATA_HXX +#define INCLUDED_WRITERFILTER_SOURCE_DMAPPER_RESOURCEMODEL_TABLEDATA_HXX + +#include <resourcemodel/WW8ResourceModel.hxx> + +#include <vector> +#include <boost/shared_ptr.hpp> + +namespace writerfilter +{ +namespace dmapper +{ + +template <typename T, typename PropertiesPointer> +/** + Class containing the data to describe a table cell. + */ +class CellData +{ + /** + Handle to start of cell. + */ + T mStart; + + /** + Handle to end of cell. + */ + T mEnd; + + /** + Pointer to properties of cell. + */ + PropertiesPointer mpProps; + + bool mbOpen; + +public: + typedef boost::shared_ptr<CellData> Pointer_t; + + CellData(T start, PropertiesPointer pProps) + : mStart(start), mEnd(start), mpProps(pProps), mbOpen(true) + { + } + + virtual ~CellData() {} + + /** + Set the start handle of the cell. + + @param start the start handle of the cell + */ + void setStart(T start) { mStart = start; } + + /** + Set the end handle of a cell. + + @param end the end handle of the cell + */ + void setEnd(T end) { mEnd = end; mbOpen = false; } + + /** + Set the properties of the cell. + + @param pProps the properties of the cell + */ + void setProperties(PropertiesPointer pProps) { mpProps = pProps; } + + /** + Adds properties to the cell. + + @param pProps the properties to add + */ + void insertProperties(PropertiesPointer pProps) + { + if( mpProps.get() ) + mpProps->InsertProps(pProps); + else + mpProps = pProps; + } + + /** + Return start handle of the cell. + */ + const T & getStart() { return mStart; } + + /** + Return end handle of the cell. + */ + const T & getEnd() { return mEnd; } + + /** + Return properties of the cell. + */ + PropertiesPointer getProperties() { return mpProps; } + + bool isOpen() const { return mbOpen; } +}; + +template <typename T, typename PropertiesPointer> +/** + Class to handle data of a table row. + */ +class RowData +{ + typedef typename CellData<T, PropertiesPointer>::Pointer_t + CellDataPointer_t; + typedef ::std::vector<CellDataPointer_t> Cells; + + /** + the cell data of the row + */ + Cells mCells; + + /** + the properties of the row + */ + mutable PropertiesPointer mpProperties; + +public: + typedef boost::shared_ptr<RowData <T, PropertiesPointer> > Pointer_t; + + RowData() {} + + RowData(const RowData<T, PropertiesPointer> & rRowData) + : mCells(rRowData.mCells), mpProperties(rRowData.mpProperties) + { + } + + virtual ~RowData() {} + + /** + Add a cell to the row. + + @param start the start handle of the cell + @param end the end handle of the cell + @param pProps the properties of the cell + */ + void addCell(const T & start, PropertiesPointer pProps) + { + CellDataPointer_t pCellData + (new CellData<T, PropertiesPointer>(start, pProps)); + mCells.push_back(pCellData); + } + + void endCell(const T & end) + { + if (mCells.size() > 0) + mCells.back()->setEnd(end); + } + + bool isCellOpen() const + { + return mCells.size() > 0 && mCells.back()->isOpen(); + } + + /** + Add properties to the row. + + @param pProperties the properties to set + */ + void insertProperties(PropertiesPointer pProperties) + { + if( pProperties.get() ) + { + if( !mpProperties.get() ) + mpProperties = pProperties; + else + mpProperties->InsertProps(pProperties); + } + } + + /** + Add properties to a cell of the row. + + @param i index of the cell + @param pProps the properties to add + */ + void insertCellProperties(unsigned int i, PropertiesPointer pProps) + { + mCells[i]->insertProperties(pProps); + } + + /** + Add properties to the last cell of the row. + */ + void insertCellProperties(PropertiesPointer pProps) + { + if (! mCells.empty()) + mCells.back()->insertProperties(pProps); + } + + /** + Return number of cells in the row. + */ + unsigned int getCellCount() + { + return mCells.size(); + } + + /** + Return start handle of a cell in the row. + + @param i index of the cell + */ + const T & getCellStart(unsigned int i) const + { + return mCells[i]->getStart(); + } + + /** + Return end handle of a cell in the row. + + @param i index of the cell + */ + const T & getCellEnd(unsigned int i) const + { + return mCells[i]->getEnd(); + } + + /** + Return the properties of a cell in the row. + + @param i index of the cell + */ + PropertiesPointer getCellProperties(unsigned int i) const + { + return mCells[i]->getProperties(); + } + + /** + Return properties of the row. + */ + PropertiesPointer getProperties() + { + return mpProperties; + } + + /** + Clear the row data. + */ + void clear() + { + mCells.clear(); + mpProperties.reset(); + } +}; + +template <typename T, typename PropertiesPointer> +/** + Class that holds the data of a table. + */ +class TableData +{ + typedef typename RowData<T, PropertiesPointer>::Pointer_t RowPointer_t; + typedef ::std::vector<RowPointer_t> Rows; + + /** + the table properties + */ + PropertiesPointer mpTableProps; + + /** + the data of the rows of the table + */ + Rows mRows; + + /** + pointer to the data of the current row (while building up the table data). + */ + RowPointer_t mpRow; + + /** + depth of the current table in a hierarchy of tables + */ + unsigned int mnDepth; + + /** + initialize mpRow + */ + void newRow() { mpRow = RowPointer_t(new RowData<T, PropertiesPointer>()); } + +public: + typedef boost::shared_ptr<TableData <T, PropertiesPointer> > Pointer_t; + + TableData(unsigned int nDepth) : mnDepth(nDepth) { newRow(); } + ~TableData() {} + + /** + End the current row. + + Sets properties of the current row and pushes the row to the + back of the rows currently contained in the table. + + @param pProperties properties of the row to be ended + */ + void endRow(PropertiesPointer pProperties) + { + mpRow->insertProperties(pProperties); + mRows.push_back(mpRow); + newRow(); + } + + /** + Add a cell to the current row. + + @param start start handle of the cell + @param end end handle of the cell + @param pProps properties of the cell + */ + void addCell(const T & start, PropertiesPointer pProps) + { + mpRow->addCell(start, pProps); + } + + /** + End the current cell of the current row. + + @parm end end handle of the cell + */ + void endCell(const T & end) + { + mpRow->endCell(end); + } + + /** + Return if the current cell of the current row is open. + */ + bool isCellOpen() const + { + return mpRow->isCellOpen(); + } + + /** + Insert properties to the current cell of the current row. + + @param pProps the properties to add + */ + void insertCellProperties(PropertiesPointer pProps) + { + mpRow->insertCellProperties(pProps); + } + + /** + Add properties to a cell of the current row. + + @param i index of the cell + @param pProps properties to add + */ + void insertCellProperties(unsigned int i, PropertiesPointer pProps) + { + mpRow->insertCellProperties(i, pProps); + } + + void insertTableProperties( PropertiesPointer pProps ) + { + if ( mpTableProps.get( ) ) + mpTableProps->insert( pProps ); + else + mpTableProps = pProps; + } + + /** + Return the table properties. + */ + PropertiesPointer getTableProperties( ) + { + return mpTableProps; + } + + /** + Return number of rows in the table. + */ + unsigned int getRowCount() + { + return mRows.size(); + } + + /** + Return depth of table in surrounding table hierarchy. + */ + unsigned int getDepth() + { + return mnDepth; + } + + /** + Return row data of a certain row. + + @param i index of the row + */ + const RowPointer_t getRow(unsigned int i) const + { + return mRows[i]; + } + + const RowPointer_t getCurrentRow() const + { + return mpRow; + } +}; + +} +} + +#endif // INCLUDED_WRITERFILTER_SOURCE_DMAPPER_RESOURCEMODEL_TABLEDATA_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |