/************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2008 by Sun Microsystems, Inc. * * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: TableData.hxx,v $ * $Revision: 1.3 $ * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ #ifndef INCLUDED_TABLE_DATA #define INCLUDED_TABLE_DATA #ifndef INCLUDED_WW8_RESOURCE_MODEL_HXX #include #endif #include #include namespace writerfilter { template /** Class containing the data to describe a table cell. */ class WRITERFILTER_DLLPUBLIC 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 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->insert(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 /** Class to handle data of a table row. */ class WRITERFILTER_DLLPUBLIC RowData { typedef typename CellData::Pointer_t CellDataPointer_t; typedef ::std::vector Cells; /** the cell data of the row */ Cells mCells; /** the properties of the row */ mutable PropertiesPointer mpProperties; public: typedef boost::shared_ptr > Pointer_t; RowData() {} RowData(const RowData & 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(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->insert( 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); } /** 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 /** Class that holds the data of a table. */ class WRITERFILTER_DLLPUBLIC TableData { typedef typename RowData::Pointer_t RowPointer_t; typedef ::std::vector Rows; /** 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()); } public: typedef boost::shared_ptr > 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); } void endCell(const T & end) { mpRow->endCell(end); } bool isCellOpen() const { return mpRow->isCellOpen(); } /** 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); } /** 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]; } }; } #endif // INCLUDED_TABLE_DATA