summaryrefslogtreecommitdiff
path: root/writerfilter/inc/resourcemodel/TableManager.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'writerfilter/inc/resourcemodel/TableManager.hxx')
-rw-r--r--writerfilter/inc/resourcemodel/TableManager.hxx1099
1 files changed, 1099 insertions, 0 deletions
diff --git a/writerfilter/inc/resourcemodel/TableManager.hxx b/writerfilter/inc/resourcemodel/TableManager.hxx
new file mode 100644
index 000000000000..fe43694d25d2
--- /dev/null
+++ b/writerfilter/inc/resourcemodel/TableManager.hxx
@@ -0,0 +1,1099 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * 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
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_TABLE_MANAGER_HXX
+#define INCLUDED_TABLE_MANAGER_HXX
+
+#ifndef INCLUDED_TABLE_DATA_HXX
+#include <resourcemodel/TableData.hxx>
+#endif
+
+#ifndef INCLUDED_WW8_RESOURCE_MODEL_HXX
+#include <resourcemodel/WW8ResourceModel.hxx>
+#endif
+
+#ifndef INCLUDED_SPRMIDS_HXX
+#include <doctok/sprmids.hxx>
+#endif
+
+#include <boost/shared_ptr.hpp>
+#include <stack>
+#include "util.hxx"
+#include "TagLogger.hxx"
+
+namespace writerfilter
+{
+
+using namespace ::std;
+
+template <typename T, typename PropertiesPointer>
+/**
+ Class to handle events generated by TableManager::resolveCurrentTable
+ */
+class WRITERFILTER_DLLPUBLIC TableDataHandler
+{
+public:
+ typedef boost::shared_ptr<TableDataHandler> Pointer_t;
+
+ /**
+ Handle start of table.
+
+ @param nRows number of rows in the table
+ @param nDepth depth of the table in surrounding table hierarchy
+ @param pProps properties of the table
+ */
+ virtual void startTable(unsigned int nRows, unsigned int nDepth,
+ PropertiesPointer pProps) = 0;
+
+ /**
+ Handle end of table.
+ */
+ virtual void endTable() = 0;
+
+ /**
+ Handle start of row.
+
+ @param nCols number of columns in the table
+ @param pProps properties of the row
+ */
+ virtual void startRow(unsigned int nCols,
+ PropertiesPointer pProps) = 0;
+
+ /**
+ Handle end of row.
+ */
+ virtual void endRow() = 0;
+
+ /**
+ Handle start of cell.
+
+ @param rT start handle of the cell
+ @param pProps properties of the cell
+ */
+ virtual void startCell(const T & rT, PropertiesPointer pProps) = 0;
+
+ /**
+ Handle end of cell.
+
+ @param rT end handle of cell
+ */
+ virtual void endCell(const T & rT) = 0;
+};
+
+template <typename T, typename PropertiesPointer>
+/**
+ The table manager.
+
+ This class gets forwarded events from the tokenizer. It gathers the
+ table data and after ending the table generates events for the
+ table structure. The events have to be handles by a TableDataHandler.
+
+ */
+class TableManager
+{
+#ifdef DEBUG_TABLE
+ TagLogger::Pointer_t mpTableLogger;
+#endif
+
+ class TableManagerState
+ {
+ /**
+ properties at the current point in document
+ */
+ PropertiesPointer mpProps;
+
+ /**
+ properties of the current cell
+ */
+ PropertiesPointer mpCellProps;
+
+ /**
+ properties of the current row
+ */
+ PropertiesPointer mpRowProps;
+
+ /**
+ properties of the current table
+ */
+ stack<PropertiesPointer> mTableProps;
+
+ /**
+ true if at the end of a row
+ */
+ bool mbRowEnd;
+
+ /**
+ true when in a cell
+ */
+ bool mbInCell;
+
+ /**
+ true when at the end of a cell
+ */
+ bool mbCellEnd;
+
+ public:
+ /**
+ Constructor
+ */
+ TableManagerState()
+ : mbRowEnd(false), mbInCell(false), mbCellEnd(false)
+ {
+ }
+
+ virtual ~TableManagerState()
+ {
+ }
+
+ void startLevel()
+ {
+ PropertiesPointer pProps;
+ mTableProps.push(pProps);
+ }
+
+ void endLevel()
+ {
+ mTableProps.pop();
+ }
+
+ /**
+ Reset to initial state at beginning of row.
+ */
+ void resetCellSpecifics()
+ {
+ mbRowEnd = false;
+ mbInCell = false;
+ mbCellEnd = false;
+ }
+
+ void resetProps()
+ {
+ mpProps.reset();
+ }
+
+ void setProps(PropertiesPointer pProps)
+ {
+ mpProps = pProps;
+ }
+
+ PropertiesPointer getProps()
+ {
+ return mpProps;
+ }
+
+ void resetCellProps()
+ {
+ mpCellProps.reset();
+ }
+
+ void setCellProps(PropertiesPointer pProps)
+ {
+ mpCellProps = pProps;
+ }
+
+ PropertiesPointer getCellProps()
+ {
+ return mpCellProps;
+ }
+
+ void resetRowProps()
+ {
+ mpCellProps.reset();
+ }
+
+ void setRowProps(PropertiesPointer pProps)
+ {
+ mpRowProps = pProps;
+ }
+
+ PropertiesPointer getRowProps()
+ {
+ return mpRowProps;
+ }
+
+ void resetTableProps()
+ {
+ if (mTableProps.size() > 0)
+ mTableProps.top().reset();
+ }
+
+ void setTableProps(PropertiesPointer pProps)
+ {
+ if (mTableProps.size() > 0)
+ mTableProps.top() = pProps;
+ }
+
+ PropertiesPointer getTableProps()
+ {
+ PropertiesPointer pResult;
+
+ if (mTableProps.size() > 0)
+ pResult = mTableProps.top();
+
+ return pResult;
+ }
+
+ void setInCell(bool bInCell)
+ {
+ mbInCell = bInCell;
+ }
+
+ bool isInCell() const
+ {
+ return mbInCell;
+ }
+
+ void setCellEnd(bool bCellEnd)
+ {
+ mbCellEnd = bCellEnd;
+ }
+
+ bool isCellEnd() const
+ {
+ return mbCellEnd;
+ }
+
+ void setRowEnd(bool bRowEnd)
+ {
+ mbRowEnd = bRowEnd;
+ }
+
+ bool isRowEnd() const
+ {
+ return mbRowEnd;
+ }
+ };
+
+ /**
+ handle for the current position in document
+ */
+ T mCurHandle;
+
+ TableManagerState mState;
+
+protected:
+ PropertiesPointer getProps()
+ {
+ return mState.getProps();
+ }
+
+ void setProps(PropertiesPointer pProps)
+ {
+ mState.setProps(pProps);
+ }
+
+ void resetProps()
+ {
+ mState.resetProps();
+ }
+
+ PropertiesPointer getCellProps()
+ {
+ return mState.getCellProps();
+ }
+
+ void setCellProps(PropertiesPointer pProps)
+ {
+ mState.setCellProps(pProps);
+ }
+
+ void resetCellProps()
+ {
+ mState.resetCellProps();
+ }
+
+ PropertiesPointer getRowProps()
+ {
+ return mState.getRowProps();
+ }
+
+ void setRowProps(PropertiesPointer pProps)
+ {
+ mState.setRowProps(pProps);
+ }
+
+ void resetRowProps()
+ {
+ mState.resetRowProps();
+ }
+
+ void setInCell(bool bInCell)
+ {
+ mState.setInCell(bInCell);
+ }
+
+ bool isInCell() const
+ {
+ return mState.isInCell();
+ }
+
+ void setCellEnd(bool bCellEnd)
+ {
+ mState.setCellEnd(bCellEnd);
+ }
+
+ bool isCellEnd() const
+ {
+ return mState.isCellEnd();
+ }
+
+ void setRowEnd(bool bRowEnd)
+ {
+ mState.setRowEnd(bRowEnd);
+ }
+
+ bool isRowEnd() const
+ {
+ return mState.isRowEnd();
+ }
+
+ PropertiesPointer getTableProps()
+ {
+ return mState.getTableProps();
+ }
+
+ void setTableProps(PropertiesPointer pProps)
+ {
+ mState.setTableProps(pProps);
+ }
+
+ void resetTableProps()
+ {
+ mState.resetTableProps();
+ }
+
+ T getHandle()
+ {
+ return mCurHandle;
+ }
+
+ void setHandle(const T & rHandle)
+ {
+ mCurHandle = rHandle;
+ }
+
+private:
+ typedef boost::shared_ptr<T> T_p;
+
+ /**
+ depth of the current cell
+ */
+ sal_uInt32 mnTableDepthNew;
+
+ /**
+ depth of the previous cell
+ */
+ sal_uInt32 mnTableDepth;
+
+ /**
+ stack of table data
+
+ for each level of nested tables there is one frame in the stack
+ */
+ stack<typename TableData<T, PropertiesPointer>::Pointer_t > mTableDataStack;
+
+ typedef typename TableDataHandler<T, PropertiesPointer>::Pointer_t TableDataHandlerPointer_t;
+
+ /**
+ handler for resolveCurrentTable
+ */
+ TableDataHandlerPointer_t mpTableDataHandler;
+
+ /**
+ Set flag which indicates the current handle is in a cell.
+ */
+ void inCell();
+
+ /**
+ Set flag which indicate the current handle is at the end of a cell.
+ */
+ void endCell();
+
+ /**
+ Set the table depth of the current cell.
+
+ @param nDepth the cell depth
+ */
+ void cellDepth(sal_uInt32 nDepth);
+
+ /**
+ Set flag indication the current handle is at the end of a row.
+ */
+ void endRow();
+
+ /**
+ Resolve the current table to the TableDataHandler.
+ */
+ void resolveCurrentTable();
+
+ /**
+ Open a cell at current level.
+ */
+
+ void openCell(const T & handle, PropertiesPointer pProps);
+
+ /**
+ Close a cell at current level.
+ */
+ void closeCell(const T & handle);
+
+ /**
+ Ensure a cell is open at the current level.
+ */
+ void ensureOpenCell(PropertiesPointer pProps);
+
+protected:
+
+ /**
+ Return current table depth.
+ */
+ sal_uInt32 getTableDepthNew() { return mnTableDepthNew; }
+
+ /**
+ Action to be carried out at the end of the last paragraph of a
+ cell.
+ */
+ virtual void endOfCellAction();
+
+ /**
+ Action to be carried out at the end of the "table row"
+ paragraph.
+ */
+ virtual void endOfRowAction();
+ /** let the derived class clear their table related data
+ */
+ virtual void clearData();
+
+
+public:
+ TableManager();
+ virtual ~TableManager(){}
+
+ /**
+ Set handler for resolveCurrentTable.
+
+ @param pTableDataHandler the handler
+ */
+ void setHandler(TableDataHandlerPointer_t pTableDataHandler);
+
+ /**
+ Set the current handle.
+
+ @param rHandle the handle
+ */
+ virtual void handle(const T & rHandle);
+
+ /**
+ Start a new table level.
+
+ A new context is pushed onto the table data stack,
+ */
+ virtual void startLevel();
+
+ /**
+ End a table level.
+
+ The current table is resolved and the context is popped from
+ the stack.
+ */
+ virtual void endLevel();
+
+ /**
+ Handle the start of a paragraph group.
+ */
+ virtual void startParagraphGroup();
+
+ /**
+ Handle the end of a paragraph group.
+ */
+ virtual void endParagraphGroup();
+
+ /**
+ Handle an SPRM at curent handle.
+
+ @param rSprm the SPRM
+ */
+ virtual bool sprm(Sprm & rSprm);
+
+ /**
+ Handle properties at current handle.
+
+ @param pProps the properites
+ */
+ virtual void props(PropertiesPointer pProps);
+
+ /**
+ Handle occurance of character 0x7.
+ */
+ virtual void handle0x7();
+
+ /**
+ Handle 8 bit text at current handle.
+
+ @param data array of characters
+ @param len number of characters to handle
+ */
+ virtual void text(const sal_uInt8 * data, size_t len);
+
+ /**
+ Handle 16 bit text at current handle.
+
+ @param data array of characters
+ @param len number of characters to handle
+ */
+ virtual void utext(const sal_uInt8 * data, size_t len);
+
+ /**
+ Handle properties of the current cell.
+
+ @param pProps the properties
+ */
+ virtual void cellProps(PropertiesPointer pProps);
+
+ /**
+ Handle properties of a certain cell in the current row.
+
+ @paran i index of the cell in the current row
+ @param pProps the properties
+ */
+ virtual void cellPropsByCell(unsigned int i, PropertiesPointer pProps);
+
+ /**
+ Handle properties of the current row.
+
+ @param pProps the properties
+ */
+ virtual void insertRowProps(PropertiesPointer pProps);
+
+ /**
+ Handle properties of the current table.
+
+ @param pProps the properties
+ */
+ virtual void insertTableProps(PropertiesPointer pProps);
+
+ /**
+ Return if table manager has detected paragraph to ignore.
+
+ If this function returns true the current paragraph contains
+ only control information, e.g. end of row.
+ */
+ virtual bool isIgnore() const;
+
+
+#ifdef DEBUG_TABLE
+ void setTagLogger(TagLogger::Pointer_t _tagLogger)
+ {
+ mpTableLogger = _tagLogger;
+ }
+#endif
+};
+
+template <typename T, typename PropertiesPointer>
+TableManager<T, PropertiesPointer>::TableManager()
+: mnTableDepthNew(0), mnTableDepth(0)
+{
+ setRowEnd(false);
+ setInCell(false);
+ setCellEnd(false);
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::cellDepth(sal_uInt32 nDepth)
+{
+#ifdef DEBUG_TABLE
+ if (mpTableLogger.get() != NULL)
+ {
+ mpTableLogger->startElement("tablemanager.cellDepth");
+ mpTableLogger->attribute("depth", nDepth);
+ mpTableLogger->endElement("tablemanager.cellDepth");
+ }
+#endif
+
+ mnTableDepthNew = nDepth;
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::inCell()
+{
+#ifdef DEBUG_TABLE
+ if (mpTableLogger.get() != NULL)
+ mpTableLogger->element("tablemanager.inCell");
+#endif
+ setInCell(true);
+
+ if (mnTableDepthNew < 1)
+ mnTableDepthNew = 1;
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::endCell()
+{
+#ifdef DEBUG_TABLE
+ if (mpTableLogger.get() != NULL)
+ mpTableLogger->element("tablemanager.endCell");
+#endif
+
+ setCellEnd(true);
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::endRow()
+{
+#ifdef DEBUG_TABLE
+ if (mpTableLogger.get() != NULL)
+ mpTableLogger->element("tablemanager.endRow");
+#endif
+
+ setRowEnd(true);
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::setHandler
+(typename TableDataHandler<T, PropertiesPointer>::Pointer_t pTableDataHandler)
+{
+ mpTableDataHandler = pTableDataHandler;
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::handle(const T & rHandle)
+{
+#ifdef DEBUG_TABLE
+ if (mpTableLogger.get())
+ {
+ mpTableLogger->startElement("tablemanager.handle");
+ mpTableLogger->chars(toString(rHandle));
+ mpTableLogger->endElement("tablemanager.handle");
+ }
+#endif
+
+ setHandle(rHandle);
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::startLevel()
+{
+#ifdef DEBUG_TABLE
+ if (mpTableLogger.get() != NULL)
+ {
+ typename TableData<T, PropertiesPointer>::Pointer_t pTableData;
+
+ if (mTableDataStack.size() > 0)
+ pTableData = mTableDataStack.top();
+
+ mpTableLogger->startElement("tablemanager.startLevel");
+ mpTableLogger->attribute("level", mTableDataStack.size());
+
+ if (pTableData.get() != NULL)
+ mpTableLogger->attribute("openCell",
+ pTableData->isCellOpen() ? "yes" : "no");
+
+ mpTableLogger->endElement("tablemanager.startLevel");
+ }
+#endif
+
+ typename TableData<T, PropertiesPointer>::Pointer_t pTableData
+ (new TableData<T, PropertiesPointer>(mTableDataStack.size()));
+
+ mTableDataStack.push(pTableData);
+ mState.startLevel();
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::endLevel()
+{
+ if (mpTableDataHandler.get() != NULL)
+ resolveCurrentTable();
+
+ mState.endLevel();
+ mTableDataStack.pop();
+
+#ifdef DEBUG_TABLE
+ if (mpTableLogger.get() != NULL)
+ {
+ typename TableData<T, PropertiesPointer>::Pointer_t pTableData;
+
+ if (mTableDataStack.size() > 0)
+ pTableData = mTableDataStack.top();
+
+ mpTableLogger->startElement("tablemanager.endLevel");
+ mpTableLogger->attribute("level", mTableDataStack.size());
+
+ if (pTableData.get() != NULL)
+ mpTableLogger->attribute("openCell",
+ pTableData->isCellOpen() ? "yes" : "no");
+
+ mpTableLogger->endElement("tablemanager.endLevel");
+ }
+#endif
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::startParagraphGroup()
+{
+ mState.resetCellSpecifics();
+ mnTableDepthNew = 0;
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::endParagraphGroup()
+{
+ sal_Int32 nTableDepthDifference = mnTableDepthNew - mnTableDepth;
+
+ PropertiesPointer pEmptyProps;
+
+ while (nTableDepthDifference > 0)
+ {
+ ensureOpenCell(pEmptyProps);
+ startLevel();
+
+ --nTableDepthDifference;
+ }
+ while (nTableDepthDifference < 0)
+ {
+ endLevel();
+
+ ++nTableDepthDifference;
+ }
+
+ mnTableDepth = mnTableDepthNew;
+
+ if (mnTableDepth > 0)
+ {
+ typename TableData<T, PropertiesPointer>::Pointer_t pTableData =
+ mTableDataStack.top();
+
+ if (isRowEnd())
+ {
+ endOfRowAction();
+ pTableData->endRow(getRowProps());
+ resetRowProps();
+ }
+
+ else if (isInCell())
+ {
+ ensureOpenCell(getCellProps());
+
+ if (isCellEnd())
+ {
+ endOfCellAction();
+ closeCell(getHandle());
+ }
+ }
+ resetCellProps();
+ }
+}
+
+template <typename T, typename PropertiesPointer>
+bool TableManager<T, PropertiesPointer>::sprm(Sprm & rSprm)
+{
+ bool bRet = true;
+ switch (rSprm.getId())
+ {
+ case NS_sprm::LN_PTableDepth:
+ {
+ Value::Pointer_t pValue = rSprm.getValue();
+
+ cellDepth(pValue->getInt());
+ }
+ break;
+ case NS_sprm::LN_PFInTable:
+ inCell();
+ break;
+ case NS_sprm::LN_PCell:
+ endCell();
+ break;
+ case NS_sprm::LN_PFTtp:
+ case NS_sprm::LN_PRow:
+ endRow();
+ break;
+ default:
+ bRet = false;
+ }
+ return bRet;
+}
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::props(PropertiesPointer pProps)
+{
+ setProps(pProps);
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::handle0x7()
+{
+#ifdef DEBUG_TABLE
+ if (mpTableLogger.get() != NULL)
+ mpTableLogger->startElement("tablemanager.handle0x7");
+#endif
+
+ if (mnTableDepthNew < 1)
+ mnTableDepthNew = 1;
+
+ if (isInCell())
+ endCell();
+ else
+ endRow();
+
+#ifdef DEBUG_TABLE
+ if (mpTableLogger.get() != NULL)
+ mpTableLogger->endElement("tablemanager.handle0x7");
+#endif
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::text(const sal_uInt8 * data, size_t len)
+{
+ // optimization: cell/row end characters are the last characters in a run
+ if (len > 0)
+ {
+ if (data[len - 1] == 0x7)
+ handle0x7();
+ }
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::utext(const sal_uInt8 * data, size_t len)
+{
+ // optimization: cell/row end characters are the last characters in a run
+
+ if (len > 0)
+ {
+ sal_Unicode nChar = data[(len - 1) * 2] + (data[(len - 1) * 2 + 1] << 8);
+ if (nChar == 0x7)
+ handle0x7();
+ }
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::cellProps(PropertiesPointer pProps)
+{
+#ifdef DEBUG_TABLE
+ if (mpTableLogger.get() != NULL)
+ mpTableLogger->startElement("tablemanager.cellProps");
+#endif
+
+ if(getCellProps().get())
+ getCellProps()->insert( pProps );
+ else
+ setCellProps(pProps);
+
+#ifdef DEBUG_TABLE
+ if (mpTableLogger.get() != NULL)
+ mpTableLogger->endElement("tablemanager.cellProps");
+#endif
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::cellPropsByCell
+(unsigned int i, PropertiesPointer pProps)
+{
+#ifdef DEBUG_TABLE
+ if (mpTableLogger.get() != NULL)
+ mpTableLogger->startElement("tablemanager.cellPropsByCell");
+#endif
+
+ mTableDataStack.top()->insertCellProperties(i, pProps);
+
+#ifdef DEBUG_TABLE
+ if (mpTableLogger.get() != NULL)
+ mpTableLogger->endElement("tablemanager.cellPropsByCell");
+#endif
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::insertRowProps(PropertiesPointer pProps)
+{
+#ifdef DEBUG_TABLE
+ if (mpTableLogger.get() != NULL)
+ mpTableLogger->startElement("tablemanager.insertRowProps");
+#endif
+
+ if( getRowProps().get() )
+ getRowProps()->insert( pProps );
+ else
+ setRowProps(pProps);
+
+#ifdef DEBUG_TABLE
+ if (mpTableLogger.get() != NULL)
+ mpTableLogger->endElement("tablemanager.insertRowProps");
+#endif
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::insertTableProps(PropertiesPointer pProps)
+{
+#ifdef DEBUG_TABLE
+ if (mpTableLogger.get() != NULL)
+ mpTableLogger->startElement("tablemanager.insertTableProps");
+#endif
+
+ if( getTableProps().get() )
+ getTableProps()->insert( pProps );
+ else
+ setTableProps(pProps);
+
+#ifdef DEBUG_TABLE
+ if (mpTableLogger.get() != NULL)
+ mpTableLogger->endElement("tablemanager.insertTableProps");
+#endif
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::resolveCurrentTable()
+{
+#ifdef DEBUG_TABLE
+ if (mpTableLogger.get() != NULL)
+ mpTableLogger->startElement("tablemanager.resolveCurrentTable");
+#endif
+
+ if (mpTableDataHandler.get() != NULL)
+ {
+ typename TableData<T, PropertiesPointer>::Pointer_t
+ pTableData = mTableDataStack.top();
+
+ unsigned int nRows = pTableData->getRowCount();
+
+ mpTableDataHandler->startTable(nRows, pTableData->getDepth(), getTableProps());
+
+ for (unsigned int nRow = 0; nRow < nRows; ++nRow)
+ {
+ typename RowData<T, PropertiesPointer>::Pointer_t pRowData = pTableData->getRow(nRow);
+
+ unsigned int nCells = pRowData->getCellCount();
+
+ mpTableDataHandler->startRow(nCells, pRowData->getProperties());
+
+ for (unsigned int nCell = 0; nCell < nCells; ++nCell)
+ {
+ mpTableDataHandler->startCell
+ (pRowData->getCellStart(nCell),
+ pRowData->getCellProperties(nCell));
+
+ mpTableDataHandler->endCell(pRowData->getCellEnd(nCell));
+ }
+
+ mpTableDataHandler->endRow();
+ }
+
+ mpTableDataHandler->endTable();
+ }
+ resetTableProps();
+ clearData();
+
+#ifdef DEBUG_TABLE
+ if (mpTableLogger.get() != NULL)
+ mpTableLogger->endElement("tablemanager.resolveCurrentTable");
+#endif
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::endOfCellAction()
+{
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::endOfRowAction()
+{
+}
+
+template <typename T, typename PropertiesPointer>
+bool TableManager<T, PropertiesPointer>::isIgnore() const
+{
+ return isRowEnd();
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::clearData()
+{
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::openCell
+(const T & rHandle, PropertiesPointer pProps)
+{
+#ifdef DEBUG_TABLE
+ mpTableLogger->startElement("tablemanager.openCell");
+ mpTableLogger->chars(toString(rHandle));
+ mpTableLogger->endElement("tablemanager.openCell");
+#endif
+
+ if (mTableDataStack.size() > 0)
+ {
+ typename TableData<T, PropertiesPointer>::Pointer_t
+ pTableData = mTableDataStack.top();
+
+ pTableData->addCell(rHandle, pProps);
+ }
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::closeCell
+(const T & rHandle)
+{
+#ifdef DEBUG_TABLE
+ mpTableLogger->startElement("tablemanager.closeCell");
+ mpTableLogger->chars(toString(rHandle));
+ mpTableLogger->endElement("tablemanager.closeCell");
+#endif
+
+ if (mTableDataStack.size() > 0)
+ {
+ typename TableData<T, PropertiesPointer>::Pointer_t
+ pTableData = mTableDataStack.top();
+
+ pTableData->endCell(rHandle);
+ }
+}
+
+template <typename T, typename PropertiesPointer>
+void TableManager<T, PropertiesPointer>::ensureOpenCell(PropertiesPointer pProps)
+{
+#ifdef DEBUG_TABLE
+ mpTableLogger->startElement("tablemanager.ensureOpenCell");
+#endif
+
+ if (mTableDataStack.size() > 0)
+ {
+ typename TableData<T, PropertiesPointer>::Pointer_t
+ pTableData = mTableDataStack.top();
+
+ if (pTableData.get() != NULL)
+ {
+ if (!pTableData->isCellOpen())
+ openCell(getHandle(), pProps);
+ else
+ pTableData->insertCellProperties(pProps);
+ }
+ }
+#ifdef DEBUG_TABLE
+ mpTableLogger->endElement("tablemanager.ensureOpenCell");
+#endif
+}
+
+}
+
+#endif // INCLUDED_TABLE_MANAGER_HXX