blob: 6fad93719cdfabc7da389f5da089e3213e18e22d [file] [log] [blame]
/**************************************************************
*
* 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_DATA
#define INCLUDED_TABLE_DATA
#ifndef INCLUDED_WW8_RESOURCE_MODEL_HXX
#include <resourcemodel/WW8ResourceModel.hxx>
#endif
#include <vector>
#include <boost/shared_ptr.hpp>
namespace writerfilter
{
template <typename T, typename PropertiesPointer>
/**
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<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->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 <typename T, typename PropertiesPointer>
/**
Class to handle data of a table row.
*/
class WRITERFILTER_DLLPUBLIC 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->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);
}
/**
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 WRITERFILTER_DLLPUBLIC 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];
}
};
}
#endif // INCLUDED_TABLE_DATA