/**************************************************************
 * 
 * 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 INCLUDED_TABLE_MANAGER_HXX
#define INCLUDED_TABLE_MANAGER_HXX

#include <resourcemodel/TableData.hxx>
#include <resourcemodel/WW8ResourceModel.hxx>
#include <doctok/sprmids.hxx>

#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(
        const unsigned int nDepth ) = 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()
        {
            mpRowProps.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();


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();

        const 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( pTableData->getDepth() );
    }
    resetTableProps();

#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>::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
