summaryrefslogtreecommitdiff
path: root/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'writerfilter/source/dmapper/DomainMapperTableHandler.cxx')
-rw-r--r--writerfilter/source/dmapper/DomainMapperTableHandler.cxx842
1 files changed, 842 insertions, 0 deletions
diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
new file mode 100644
index 000000000000..958a96fbff7d
--- /dev/null
+++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
@@ -0,0 +1,842 @@
+/*************************************************************************
+ *
+ * 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.
+ *
+ ************************************************************************/
+#include <DomainMapperTableHandler.hxx>
+#include <DomainMapper_Impl.hxx>
+#include <StyleSheetTable.hxx>
+#include <com/sun/star/table/TableBorderDistances.hpp>
+#include <com/sun/star/table/TableBorder.hpp>
+#include <com/sun/star/text/HoriOrientation.hpp>
+#include <dmapperLoggers.hxx>
+
+#ifdef DEBUG_DOMAINMAPPER
+#include <PropertyMapHelper.hxx>
+#endif
+
+namespace writerfilter {
+namespace dmapper {
+
+using namespace ::com::sun::star;
+using namespace ::std;
+
+#define DEF_BORDER_DIST 190 //0,19cm
+#define DEFAULT_CELL_MARGIN 108 //default cell margin, not documented
+
+#ifdef DEBUG_DOMAINMAPPER
+static void lcl_printProperties( PropertyMapPtr pProps )
+{
+ if( pProps.get() )
+ {
+ dmapper_logger->startElement("properties");
+
+ PropertyMap::const_iterator aMapIter = pProps->begin();
+ PropertyMap::const_iterator aEndIter = pProps->end();
+ PropertyNameSupplier& rPropSupplier = PropertyNameSupplier::GetPropertyNameSupplier();
+ for( ; aMapIter != aEndIter; ++aMapIter )
+ {
+ rtl::OUString aOUStr = rPropSupplier.GetName( aMapIter->first.eId );
+ rtl::OString aOStr(aOUStr.getStr(), aOUStr.getLength(), RTL_TEXTENCODING_ASCII_US );
+ clog << aOStr.getStr();
+
+ table::BorderLine aLine;
+ sal_Int32 nColor;
+ if ( aMapIter->second >>= aLine )
+ {
+ dmapper_logger->startElement("borderline");
+ dmapper_logger->attribute("color", aLine.Color);
+ dmapper_logger->attribute("inner", aLine.InnerLineWidth);
+ dmapper_logger->attribute("outer", aLine.OuterLineWidth);
+ dmapper_logger->endElement("borderline");
+ }
+ else if ( aMapIter->second >>= nColor )
+ {
+ dmapper_logger->startElement("color");
+ dmapper_logger->attribute("number", nColor);
+ dmapper_logger->endElement("color");
+ }
+ }
+
+ dmapper_logger->endElement("properties");
+ }
+}
+#endif
+
+DomainMapperTableHandler::DomainMapperTableHandler(TextReference_t xText, DomainMapper_Impl& rDMapper_Impl)
+ : m_xText(xText),
+ m_rDMapper_Impl( rDMapper_Impl ),
+ m_nCellIndex(0),
+ m_nRowIndex(0)
+{
+}
+
+DomainMapperTableHandler::~DomainMapperTableHandler()
+{
+}
+
+void DomainMapperTableHandler::startTable(unsigned int nRows,
+ unsigned int /*nDepth*/,
+ TablePropertyMapPtr pProps)
+{
+ m_aTableProperties = pProps;
+ m_pTableSeq = TableSequencePointer_t(new TableSequence_t(nRows));
+ m_nRowIndex = 0;
+
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->startElement("tablehandler.table");
+ dmapper_logger->attribute("rows", nRows);
+
+ if (pProps.get() != NULL)
+ dmapper_logger->addTag(pProps->toTag());
+#endif
+}
+
+/*-- 22.02.2008 10:18:37---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+PropertyMapPtr lcl_SearchParentStyleSheetAndMergeProperties(const StyleSheetEntryPtr pStyleSheet, StyleSheetTablePtr pStyleSheetTable)
+{
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->startElement("lcl_SearchParentStyleSheetAndMergeProperties");
+ dmapper_logger->addTag(pStyleSheet->toTag());
+#endif
+
+ PropertyMapPtr pRet;
+ if( pStyleSheet->sBaseStyleIdentifier.getLength())
+ {
+ const StyleSheetEntryPtr pParentStyleSheet = pStyleSheetTable->FindStyleSheetByISTD( pStyleSheet->sBaseStyleIdentifier );
+ pRet = lcl_SearchParentStyleSheetAndMergeProperties( pParentStyleSheet, pStyleSheetTable );
+ }
+ else
+ {
+ pRet.reset( new PropertyMap );
+ }
+
+ pRet->insert( pStyleSheet->pProperties, true );
+
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->endElement("lcl_SearchParentStyleSheetAndMergeProperties");
+#endif
+
+ return pRet;
+}
+
+void lcl_mergeBorder( PropertyIds nId, PropertyMapPtr pOrig, PropertyMapPtr pDest )
+{
+ PropertyDefinition aDef( nId, false );
+ PropertyMap::iterator pOrigIt = pOrig->find( aDef );
+
+ if ( pOrigIt != pOrig->end( ) )
+ {
+ pDest->Insert( nId, false, pOrigIt->second, false );
+ }
+}
+
+void lcl_computeCellBorders( PropertyMapPtr pTableBorders, PropertyMapPtr pCellProps,
+ sal_Int32 nCell, sal_Int32 nRow, bool bIsEndCol, bool bIsEndRow )
+{
+ PropertyDefinition aVertPDef( META_PROP_VERTICAL_BORDER, false );
+ PropertyDefinition aHorizPDef( META_PROP_HORIZONTAL_BORDER, false );
+
+ PropertyMap::iterator aVerticalIter = pCellProps->find( aVertPDef );
+ PropertyMap::iterator aHorizontalIter = pCellProps->find( aHorizPDef );
+
+ // Handle the vertical and horizontal borders
+ bool bHasVert = ( aVerticalIter != pCellProps->end( ) );
+ uno::Any aVertProp;
+ if ( !bHasVert )
+ {
+ aVerticalIter = pTableBorders->find( aVertPDef );
+ bHasVert = ( aVerticalIter != pTableBorders->end( ) );
+ if ( bHasVert )
+ aVertProp = aVerticalIter->second;
+ }
+ else
+ {
+ aVertProp = aVerticalIter->second;
+ pCellProps->erase( aVerticalIter );
+ }
+
+ bool bHasHoriz = ( aHorizontalIter != pCellProps->end( ) );
+ uno::Any aHorizProp;
+ if ( !bHasHoriz )
+ {
+ aHorizontalIter = pTableBorders->find( aHorizPDef );
+ bHasHoriz = ( aHorizontalIter != pTableBorders->end( ) );
+ if ( bHasHoriz )
+ aHorizProp = aHorizontalIter->second;
+ }
+ else
+ {
+ aHorizProp = aHorizontalIter->second;
+ pCellProps->erase( aHorizontalIter );
+ }
+
+ if ( nCell == 0 )
+ {
+ lcl_mergeBorder( PROP_LEFT_BORDER, pTableBorders, pCellProps );
+ if ( bHasVert )
+ pCellProps->Insert( PROP_RIGHT_BORDER, false, aVertProp, false );
+ }
+
+ if ( bIsEndCol )
+ {
+ lcl_mergeBorder( PROP_RIGHT_BORDER, pTableBorders, pCellProps );
+ if ( bHasVert )
+ pCellProps->Insert( PROP_LEFT_BORDER, false, aVertProp, false );
+ }
+
+ if ( nCell > 0 && !bIsEndCol )
+ {
+ if ( bHasVert )
+ {
+ pCellProps->Insert( PROP_RIGHT_BORDER, false, aVertProp, false );
+ pCellProps->Insert( PROP_LEFT_BORDER, false, aVertProp, false );
+ }
+ }
+
+ if ( nRow == 0 )
+ {
+ lcl_mergeBorder( PROP_TOP_BORDER, pTableBorders, pCellProps );
+ if ( bHasHoriz )
+ pCellProps->Insert( PROP_BOTTOM_BORDER, false, aHorizProp, false );
+ }
+
+ if ( bIsEndRow )
+ {
+ lcl_mergeBorder( PROP_BOTTOM_BORDER, pTableBorders, pCellProps );
+ if ( bHasHoriz )
+ pCellProps->Insert( PROP_TOP_BORDER, false, aHorizProp, false );
+ }
+
+ if ( nRow > 0 && !bIsEndRow )
+ {
+ if ( bHasHoriz )
+ {
+ pCellProps->Insert( PROP_TOP_BORDER, false, aHorizProp, false );
+ pCellProps->Insert( PROP_BOTTOM_BORDER, false, aHorizProp, false );
+ }
+ }
+}
+
+#ifdef DEBUG_DOMAINMAPPER
+
+void lcl_debug_BorderLine(table::BorderLine & rLine)
+{
+ dmapper_logger->startElement("BorderLine");
+ dmapper_logger->attribute("Color", rLine.Color);
+ dmapper_logger->attribute("InnerLineWidth", rLine.InnerLineWidth);
+ dmapper_logger->attribute("OuterLineWidth", rLine.OuterLineWidth);
+ dmapper_logger->attribute("LineDistance", rLine.LineDistance);
+ dmapper_logger->endElement("BorderLine");
+}
+
+void lcl_debug_TableBorder(table::TableBorder & rBorder)
+{
+ dmapper_logger->startElement("TableBorder");
+ lcl_debug_BorderLine(rBorder.TopLine);
+ dmapper_logger->attribute("IsTopLineValid", rBorder.IsTopLineValid);
+ lcl_debug_BorderLine(rBorder.BottomLine);
+ dmapper_logger->attribute("IsBottomLineValid", rBorder.IsBottomLineValid);
+ lcl_debug_BorderLine(rBorder.LeftLine);
+ dmapper_logger->attribute("IsLeftLineValid", rBorder.IsLeftLineValid);
+ lcl_debug_BorderLine(rBorder.RightLine);
+ dmapper_logger->attribute("IsRightLineValid", rBorder.IsRightLineValid);
+ lcl_debug_BorderLine(rBorder.VerticalLine);
+ dmapper_logger->attribute("IsVerticalLineValid", rBorder.IsVerticalLineValid);
+ lcl_debug_BorderLine(rBorder.HorizontalLine);
+ dmapper_logger->attribute("IsHorizontalLineValid", rBorder.IsHorizontalLineValid);
+ dmapper_logger->attribute("Distance", rBorder.Distance);
+ dmapper_logger->attribute("IsDistanceValid", rBorder.IsDistanceValid);
+ dmapper_logger->endElement("TableBorder");
+}
+#endif
+
+struct WRITERFILTER_DLLPRIVATE TableInfo
+{
+ sal_Int32 nLeftBorderDistance;
+ sal_Int32 nRightBorderDistance;
+ sal_Int32 nTopBorderDistance;
+ sal_Int32 nBottomBorderDistance;
+ PropertyMapPtr pTableDefaults;
+ PropertyMapPtr pTableBorders;
+ TableStyleSheetEntry* pTableStyle;
+ TablePropertyValues_t aTableProperties;
+
+ TableInfo()
+ : nLeftBorderDistance(DEF_BORDER_DIST)
+ , nRightBorderDistance(DEF_BORDER_DIST)
+ , nTopBorderDistance(0)
+ , nBottomBorderDistance(0)
+ , pTableDefaults(new PropertyMap)
+ , pTableBorders(new PropertyMap)
+ , pTableStyle(NULL)
+ {
+ }
+
+};
+
+TableStyleSheetEntry * DomainMapperTableHandler::endTableGetTableStyle(TableInfo & rInfo)
+{
+ // will receive the table style if any
+ TableStyleSheetEntry* pTableStyle = NULL;
+
+ if( m_aTableProperties.get() )
+ {
+ //create properties from the table attributes
+ //...pPropMap->Insert( PROP_LEFT_MARGIN, false, uno::makeAny( m_nLeftMargin - m_nGapHalf ));
+ //pPropMap->Insert( PROP_HORI_ORIENT, false, uno::makeAny( text::HoriOrientation::RIGHT ));
+ sal_Int32 nGapHalf = 0;
+ sal_Int32 nLeftMargin = 0;
+ sal_Int32 nTableWidth = 0;
+
+ PropertyMap::iterator aTableStyleIter =
+ m_aTableProperties->find( PropertyDefinition( META_PROP_TABLE_STYLE_NAME, false ) );
+ if(aTableStyleIter != m_aTableProperties->end())
+ {
+ // Apply table style properties recursively
+ ::rtl::OUString sTableStyleName;
+ aTableStyleIter->second >>= sTableStyleName;
+ StyleSheetTablePtr pStyleSheetTable = m_rDMapper_Impl.GetStyleSheetTable();
+ const StyleSheetEntryPtr pStyleSheet = pStyleSheetTable->FindStyleSheetByISTD( sTableStyleName );
+ pTableStyle = dynamic_cast<TableStyleSheetEntry*>( pStyleSheet.get( ) );
+ m_aTableProperties->erase( aTableStyleIter );
+
+ if( pStyleSheet )
+ {
+ // First get the style properties, then the table ones
+ PropertyMapPtr pTableProps( m_aTableProperties );
+ TablePropertyMapPtr pEmptyProps( new TablePropertyMap );
+
+ m_aTableProperties = pEmptyProps;
+
+ PropertyMapPtr pMergedProperties = lcl_SearchParentStyleSheetAndMergeProperties(pStyleSheet, pStyleSheetTable);
+
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->startElement("mergedProps");
+ dmapper_logger->addTag(pMergedProperties->toTag());
+ dmapper_logger->endElement("mergedProps");
+#endif
+
+ m_aTableProperties->insert( pMergedProperties );
+ m_aTableProperties->insert( pTableProps );
+
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->startElement("TableProperties");
+ dmapper_logger->addTag(m_aTableProperties->toTag());
+ dmapper_logger->endElement("TableProperties");
+#endif
+ }
+ }
+
+ // Set the table default attributes for the cells
+ rInfo.pTableDefaults->insert( m_aTableProperties );
+
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->startElement("TableDefaults");
+ dmapper_logger->addTag(rInfo.pTableDefaults->toTag());
+ dmapper_logger->endElement("TableDefaults");
+#endif
+
+ m_aTableProperties->getValue( TablePropertyMap::GAP_HALF, nGapHalf );
+ m_aTableProperties->getValue( TablePropertyMap::LEFT_MARGIN, nLeftMargin );
+
+ m_aTableProperties->getValue( TablePropertyMap::CELL_MAR_LEFT,
+ rInfo.nLeftBorderDistance );
+ m_aTableProperties->getValue( TablePropertyMap::CELL_MAR_RIGHT,
+ rInfo.nRightBorderDistance );
+ m_aTableProperties->getValue( TablePropertyMap::CELL_MAR_TOP,
+ rInfo.nTopBorderDistance );
+ m_aTableProperties->getValue( TablePropertyMap::CELL_MAR_BOTTOM,
+ rInfo.nBottomBorderDistance );
+
+ table::TableBorderDistances aDistances;
+ aDistances.IsTopDistanceValid =
+ aDistances.IsBottomDistanceValid =
+ aDistances.IsLeftDistanceValid =
+ aDistances.IsRightDistanceValid = sal_True;
+ aDistances.TopDistance = static_cast<sal_Int16>( rInfo.nTopBorderDistance );
+ aDistances.BottomDistance = static_cast<sal_Int16>( rInfo.nBottomBorderDistance );
+ aDistances.LeftDistance = static_cast<sal_Int16>( rInfo.nLeftBorderDistance );
+ aDistances.RightDistance = static_cast<sal_Int16>( rInfo.nRightBorderDistance );
+
+ m_aTableProperties->Insert( PROP_TABLE_BORDER_DISTANCES, false, uno::makeAny( aDistances ) );
+
+ //table border settings
+ table::TableBorder aTableBorder;
+
+ PropertyMap::iterator aTblBorderIter = m_aTableProperties->find( PropertyDefinition(PROP_TOP_BORDER, false) );
+ if( aTblBorderIter != m_aTableProperties->end() )
+ {
+ aTblBorderIter->second >>= aTableBorder.TopLine;
+ aTableBorder.IsTopLineValid = true;
+ m_aTableProperties->erase( aTblBorderIter );
+
+ rInfo.pTableBorders->Insert( PROP_TOP_BORDER, false,
+ uno::makeAny( aTableBorder.TopLine ) );
+ PropertyMap::iterator pIt = rInfo.pTableDefaults->find( PropertyDefinition( PROP_TOP_BORDER, false ) );
+ if ( pIt != rInfo.pTableDefaults->end( ) )
+ rInfo.pTableDefaults->erase( pIt );
+ }
+ aTblBorderIter = m_aTableProperties->find( PropertyDefinition(PROP_BOTTOM_BORDER, false) );
+ if( aTblBorderIter != m_aTableProperties->end() )
+ {
+ aTblBorderIter->second >>= aTableBorder.BottomLine;
+ aTableBorder.IsBottomLineValid = true;
+ m_aTableProperties->erase( aTblBorderIter );
+
+ rInfo.pTableBorders->Insert( PROP_BOTTOM_BORDER, false,
+ uno::makeAny( aTableBorder.BottomLine));
+ PropertyMap::iterator pIt = rInfo.pTableDefaults->find( PropertyDefinition( PROP_BOTTOM_BORDER, false ) );
+ if ( pIt != rInfo.pTableDefaults->end( ) )
+ rInfo.pTableDefaults->erase( pIt );
+ }
+ aTblBorderIter = m_aTableProperties->find( PropertyDefinition(PROP_LEFT_BORDER, false) );
+ if( aTblBorderIter != m_aTableProperties->end() )
+ {
+ aTblBorderIter->second >>= aTableBorder.LeftLine;
+ aTableBorder.IsLeftLineValid = true;
+ m_aTableProperties->erase( aTblBorderIter );
+
+ rInfo.pTableBorders->Insert( PROP_LEFT_BORDER, false,
+ uno::makeAny( aTableBorder.LeftLine ) );
+ PropertyMap::iterator pIt = rInfo.pTableDefaults->find( PropertyDefinition( PROP_LEFT_BORDER, false ) );
+ if ( pIt != rInfo.pTableDefaults->end( ) )
+ rInfo.pTableDefaults->erase( pIt );
+ }
+ aTblBorderIter = m_aTableProperties->find( PropertyDefinition(PROP_RIGHT_BORDER, false) );
+ if( aTblBorderIter != m_aTableProperties->end() )
+ {
+ aTblBorderIter->second >>= aTableBorder.RightLine;
+ aTableBorder.IsRightLineValid = true;
+ m_aTableProperties->erase( aTblBorderIter );
+
+ rInfo.pTableBorders->Insert( PROP_RIGHT_BORDER, false,
+ uno::makeAny( aTableBorder.RightLine ) );
+ PropertyMap::iterator pIt = rInfo.pTableDefaults->find( PropertyDefinition( PROP_RIGHT_BORDER, false ) );
+ if ( pIt != rInfo.pTableDefaults->end( ) )
+ rInfo.pTableDefaults->erase( pIt );
+ }
+ aTblBorderIter = m_aTableProperties->find( PropertyDefinition(META_PROP_HORIZONTAL_BORDER, false) );
+ if( aTblBorderIter != m_aTableProperties->end() )
+ {
+ aTblBorderIter->second >>= aTableBorder.HorizontalLine;
+ aTableBorder.IsHorizontalLineValid = true;
+ m_aTableProperties->erase( aTblBorderIter );
+
+ rInfo.pTableBorders->Insert
+ (META_PROP_HORIZONTAL_BORDER, false,
+ uno::makeAny( aTableBorder.HorizontalLine ) );
+ PropertyMap::iterator pIt = rInfo.pTableDefaults->find( PropertyDefinition( META_PROP_HORIZONTAL_BORDER, false ) );
+ if ( pIt != rInfo.pTableDefaults->end( ) )
+ rInfo.pTableDefaults->erase( pIt );
+ }
+ aTblBorderIter = m_aTableProperties->find( PropertyDefinition(META_PROP_VERTICAL_BORDER, false) );
+ if( aTblBorderIter != m_aTableProperties->end() )
+ {
+ aTblBorderIter->second >>= aTableBorder.VerticalLine;
+ aTableBorder.IsVerticalLineValid = true;
+ m_aTableProperties->erase( aTblBorderIter );
+
+ rInfo.pTableBorders->Insert
+ (META_PROP_VERTICAL_BORDER, false,
+ uno::makeAny( aTableBorder.VerticalLine ) );
+ PropertyMap::iterator pIt = rInfo.pTableDefaults->find( PropertyDefinition( META_PROP_VERTICAL_BORDER, false ) );
+ if ( pIt != rInfo.pTableDefaults->end( ) )
+ rInfo.pTableDefaults->erase( pIt );
+ }
+ aTableBorder.Distance = 0;
+ aTableBorder.IsDistanceValid = false;
+
+ m_aTableProperties->Insert( PROP_TABLE_BORDER, false, uno::makeAny( aTableBorder ) );
+
+#ifdef DEBUG_DOMAINMAPPER
+ lcl_debug_TableBorder(aTableBorder);
+#endif
+
+ m_aTableProperties->Insert( PROP_LEFT_MARGIN, false, uno::makeAny( nLeftMargin - nGapHalf - rInfo.nLeftBorderDistance));
+
+ m_aTableProperties->getValue( TablePropertyMap::TABLE_WIDTH, nTableWidth );
+ if( nTableWidth > 0 )
+ m_aTableProperties->Insert( PROP_WIDTH, false, uno::makeAny( nTableWidth ));
+
+ sal_Int32 nHoriOrient = text::HoriOrientation::LEFT_AND_WIDTH;
+ m_aTableProperties->getValue( TablePropertyMap::HORI_ORIENT, nHoriOrient ) ;
+ m_aTableProperties->Insert( PROP_HORI_ORIENT, false, uno::makeAny( sal_Int16(nHoriOrient) ) );
+
+ //fill default value - if not available
+ const PropertyMap::const_iterator aRepeatIter =
+ m_aTableProperties->find( PropertyDefinition( PROP_HEADER_ROW_COUNT, false ) );
+ if( aRepeatIter == m_aTableProperties->end() )
+ m_aTableProperties->Insert( PROP_HEADER_ROW_COUNT, false, uno::makeAny( (sal_Int32)0 ));
+
+ // Remove the PROP_HEADER_ROW_COUNT from the table default to avoid
+ // propagating it to the cells
+ PropertyMap::iterator aDefaultRepeatIt =
+ rInfo.pTableDefaults->find( PropertyDefinition( PROP_HEADER_ROW_COUNT, false ) );
+ if ( aDefaultRepeatIt != rInfo.pTableDefaults->end( ) )
+ rInfo.pTableDefaults->erase( aDefaultRepeatIt );
+
+ rInfo.aTableProperties = m_aTableProperties->GetPropertyValues();
+
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->startElement("debug.tableprops");
+ dmapper_logger->addTag(m_aTableProperties->toTag());
+ dmapper_logger->endElement("debug.tableprops");
+#endif
+
+ }
+
+ return pTableStyle;
+}
+
+CellPropertyValuesSeq_t DomainMapperTableHandler::endTableGetCellProperties(TableInfo & rInfo)
+{
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->startElement("getCellProperties");
+#endif
+
+ CellPropertyValuesSeq_t aCellProperties( m_aCellProperties.size() );
+
+ // std::vector< std::vector<PropertyMapPtr> > m_aCellProperties
+ PropertyMapVector2::const_iterator aRowOfCellsIterator = m_aCellProperties.begin();
+ PropertyMapVector2::const_iterator aRowOfCellsIteratorEnd = m_aCellProperties.end();
+ PropertyMapVector2::const_iterator aLastRowIterator = m_aCellProperties.end() - 1;
+ sal_Int32 nRow = 0;
+
+ //it's a uno::Sequence< beans::PropertyValues >*
+ RowPropertyValuesSeq_t* pCellProperties = aCellProperties.getArray();
+ while( aRowOfCellsIterator != aRowOfCellsIteratorEnd )
+ {
+ //aRowOfCellsIterator points to a vector of PropertyMapPtr
+ PropertyMapVector1::const_iterator aCellIterator = aRowOfCellsIterator->begin();
+ PropertyMapVector1::const_iterator aCellIteratorEnd = aRowOfCellsIterator->end();
+ PropertyMapVector1::const_iterator aLastCellIterator = aRowOfCellsIterator->end() - 1;
+
+ // Get the row style properties
+ sal_Int32 nRowStyleMask = sal_Int32( 0 );
+ PropertyMapPtr pRowProps = m_aRowProperties[nRow];
+ if ( pRowProps.get( ) )
+ {
+ PropertyMap::iterator pTcCnfStyleIt = pRowProps->find( PropertyDefinition( PROP_CNF_STYLE, true ) );
+ if ( pTcCnfStyleIt != pRowProps->end( ) )
+ {
+ if ( rInfo.pTableStyle )
+ {
+ rtl::OUString sMask;
+ pTcCnfStyleIt->second >>= sMask;
+ nRowStyleMask = sMask.toInt32( 2 );
+ }
+ pRowProps->erase( pTcCnfStyleIt );
+ }
+ }
+
+ sal_Int32 nCell = 0;
+ pCellProperties[nRow].realloc( aRowOfCellsIterator->size() );
+ beans::PropertyValues* pSingleCellProperties = pCellProperties[nRow].getArray();
+ while( aCellIterator != aCellIteratorEnd )
+ {
+ PropertyMapPtr pAllCellProps( new PropertyMap );
+
+ bool bIsEndCol = aCellIterator == aLastCellIterator;
+ bool bIsEndRow = aRowOfCellsIterator == aLastRowIterator;
+
+ //aCellIterator points to a PropertyMapPtr;
+ if( aCellIterator->get() )
+ {
+ if ( rInfo.pTableDefaults->size( ) )
+ pAllCellProps->insert( rInfo.pTableDefaults );
+
+ // Fill the cell properties with the ones of the style
+ sal_Int32 nCellStyleMask = 0;
+ const PropertyMap::iterator aCnfStyleIter =
+ aCellIterator->get()->find( PropertyDefinition( PROP_CNF_STYLE, false ) );
+ if ( aCnfStyleIter != aCellIterator->get( )->end( ) )
+ {
+ if ( rInfo.pTableStyle ) {
+ rtl::OUString sMask;
+ aCnfStyleIter->second >>= sMask;
+ nCellStyleMask = sMask.toInt32( 2 );
+ }
+ aCellIterator->get( )->erase( aCnfStyleIter );
+ }
+
+ if ( rInfo.pTableStyle )
+ {
+ PropertyMapPtr pStyleProps = rInfo.pTableStyle->GetProperties( nCellStyleMask + nRowStyleMask );
+ pAllCellProps->insert( pStyleProps );
+ }
+
+ // Then add the cell properties
+ pAllCellProps->insert( *aCellIterator );
+ aCellIterator->get( )->swap( *pAllCellProps.get( ) );
+
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->startElement("cell");
+ dmapper_logger->attribute("cell", nCell);
+ dmapper_logger->attribute("row", nRow);
+#endif
+
+ lcl_computeCellBorders( rInfo.pTableBorders, *aCellIterator, nCell, nRow, bIsEndCol, bIsEndRow );
+
+ //now set the default left+right border distance TODO: there's an sprm containing the default distance!
+ const PropertyMap::const_iterator aLeftDistanceIter =
+ aCellIterator->get()->find( PropertyDefinition(PROP_LEFT_BORDER_DISTANCE, false) );
+ if( aLeftDistanceIter == aCellIterator->get()->end() )
+ aCellIterator->get()->Insert( PROP_LEFT_BORDER_DISTANCE, false,
+ uno::makeAny(rInfo.nLeftBorderDistance ) );
+ const PropertyMap::const_iterator aRightDistanceIter =
+ aCellIterator->get()->find( PropertyDefinition(PROP_RIGHT_BORDER_DISTANCE, false) );
+ if( aRightDistanceIter == aCellIterator->get()->end() )
+ aCellIterator->get()->Insert( PROP_RIGHT_BORDER_DISTANCE, false,
+ uno::makeAny((sal_Int32) rInfo.nRightBorderDistance ) );
+
+ const PropertyMap::const_iterator aTopDistanceIter =
+ aCellIterator->get()->find( PropertyDefinition(PROP_TOP_BORDER_DISTANCE, false) );
+ if( aTopDistanceIter == aCellIterator->get()->end() )
+ aCellIterator->get()->Insert( PROP_TOP_BORDER_DISTANCE, false,
+ uno::makeAny((sal_Int32) rInfo.nTopBorderDistance ) );
+
+ const PropertyMap::const_iterator aBottomDistanceIter =
+ aCellIterator->get()->find( PropertyDefinition(PROP_BOTTOM_BORDER_DISTANCE, false) );
+ if( aBottomDistanceIter == aCellIterator->get()->end() )
+ aCellIterator->get()->Insert( PROP_BOTTOM_BORDER_DISTANCE, false,
+ uno::makeAny((sal_Int32) rInfo.nBottomBorderDistance ) );
+
+ pSingleCellProperties[nCell] = aCellIterator->get()->GetPropertyValues();
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->endElement("cell");
+#endif
+ }
+ ++nCell;
+ ++aCellIterator;
+ }
+#ifdef DEBUG_DOMAINMAPPER
+ //-->debug cell properties
+ {
+ ::rtl::OUString sNames;
+ const uno::Sequence< beans::PropertyValues > aDebugCurrentRow = aCellProperties[nRow];
+ sal_Int32 nDebugCells = aDebugCurrentRow.getLength();
+ (void) nDebugCells;
+ for( sal_Int32 nDebugCell = 0; nDebugCell < nDebugCells; ++nDebugCell)
+ {
+ const uno::Sequence< beans::PropertyValue >& aDebugCellProperties = aDebugCurrentRow[nDebugCell];
+ sal_Int32 nDebugCellProperties = aDebugCellProperties.getLength();
+ for( sal_Int32 nDebugProperty = 0; nDebugProperty < nDebugCellProperties; ++nDebugProperty)
+ {
+ const ::rtl::OUString sName = aDebugCellProperties[nDebugProperty].Name;
+ sNames += sName;
+ sNames += ::rtl::OUString('-');
+ }
+ sNames += ::rtl::OUString('\n');
+ }
+ (void)sNames;
+ }
+ //--<
+#endif
+ ++nRow;
+ ++aRowOfCellsIterator;
+ }
+
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->endElement("getCellProperties");
+#endif
+
+ return aCellProperties;
+}
+
+RowPropertyValuesSeq_t DomainMapperTableHandler::endTableGetRowProperties()
+{
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->startElement("getRowProperties");
+#endif
+
+ RowPropertyValuesSeq_t aRowProperties( m_aRowProperties.size() );
+ PropertyMapVector1::const_iterator aRowIter = m_aRowProperties.begin();
+ PropertyMapVector1::const_iterator aRowIterEnd = m_aRowProperties.end();
+ sal_Int32 nRow = 0;
+ while( aRowIter != aRowIterEnd )
+ {
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->startElement("rowProps.row");
+#endif
+ if( aRowIter->get() )
+ {
+ //set default to 'break across pages"
+ if( aRowIter->get()->find( PropertyDefinition( PROP_IS_SPLIT_ALLOWED, false )) == aRowIter->get()->end())
+ aRowIter->get()->Insert( PROP_IS_SPLIT_ALLOWED, false, uno::makeAny(sal_True ) );
+
+ aRowProperties[nRow] = (*aRowIter)->GetPropertyValues();
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->addTag((*aRowIter)->toTag());
+ dmapper_logger->addTag(lcl_PropertyValuesToTag(aRowProperties[nRow]));
+#endif
+ }
+ ++nRow;
+ ++aRowIter;
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->endElement("rowProps.row");
+#endif
+ }
+
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->endElement("getRowProperties");
+#endif
+
+ return aRowProperties;
+}
+
+void DomainMapperTableHandler::endTable()
+{
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->startElement("tablehandler.endTable");
+#endif
+
+ TableInfo aTableInfo;
+ aTableInfo.pTableStyle = endTableGetTableStyle(aTableInfo);
+ // expands to uno::Sequence< Sequence< beans::PropertyValues > >
+
+ CellPropertyValuesSeq_t aCellProperties = endTableGetCellProperties(aTableInfo);
+
+ RowPropertyValuesSeq_t aRowProperties = endTableGetRowProperties();
+
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->addTag(lcl_PropertyValueSeqToTag(aRowProperties));
+#endif
+
+ if (m_pTableSeq->getLength() > 0)
+ {
+ try
+ {
+ uno::Reference<text::XTextTable> xTable = m_xText->convertToTable(*m_pTableSeq,
+ aCellProperties,
+ aRowProperties,
+ aTableInfo.aTableProperties);
+
+ m_xTableRange = xTable->getAnchor( );
+ }
+ catch (lang::IllegalArgumentException e)
+ {
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->chars("failed to import table!");
+#endif
+ }
+#ifdef DEBUG_DOMAINMAPPER
+ catch ( uno::Exception e )
+ {
+ dmapper_logger->startElement("exception");
+ dmapper_logger->chars(rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr( ));
+ dmapper_logger->endElement("exeception");
+ }
+#endif
+ }
+
+ m_aTableProperties.reset();
+ m_aCellProperties.clear();
+ m_aRowProperties.clear();
+
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->endElement("tablehandler.endTable");
+ dmapper_logger->endElement("tablehandler.table");
+#endif
+}
+
+void DomainMapperTableHandler::startRow(unsigned int nCells,
+ TablePropertyMapPtr pProps)
+{
+ m_aRowProperties.push_back( pProps );
+ m_aCellProperties.push_back( PropertyMapVector1() );
+
+#if DEBUG_DOMAINMAPPER
+ dmapper_logger->startElement("table.row");
+ dmapper_logger->attribute("cells", nCells);
+ if (pProps != NULL)
+ dmapper_logger->addTag(pProps->toTag());
+#endif
+
+ m_pRowSeq = RowSequencePointer_t(new RowSequence_t(nCells));
+ m_nCellIndex = 0;
+}
+
+void DomainMapperTableHandler::endRow()
+{
+ (*m_pTableSeq)[m_nRowIndex] = *m_pRowSeq;
+ ++m_nRowIndex;
+ m_nCellIndex = 0;
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->endElement("table.row");
+#endif
+}
+
+void DomainMapperTableHandler::startCell(const Handle_t & start,
+ TablePropertyMapPtr pProps )
+{
+ sal_uInt32 nRow = m_aRowProperties.size();
+ if ( pProps.get( ) )
+ m_aCellProperties[nRow - 1].push_back( pProps );
+ else
+ {
+ // Adding an empty cell properties map to be able to get
+ // the table defaults properties
+ TablePropertyMapPtr pEmptyProps( new TablePropertyMap( ) );
+ m_aCellProperties[nRow - 1].push_back( pEmptyProps );
+ }
+
+#if DEBUG_DOMAINMAPPER
+ dmapper_logger->startElement("table.cell");
+ dmapper_logger->startElement("table.cell.start");
+ dmapper_logger->chars(toString(start));
+ dmapper_logger->endElement("table.cell.start");
+ lcl_printProperties( pProps );
+#endif
+
+ //add a new 'row' of properties
+// if( m_pCellProperties.size() <= sal::static_int_cast< sal_uInt32, sal_Int32>(m_nRowIndex) )
+// m_pCellProperties.push_back( RowProperties_t() );
+// m_pCellProperties[m_nRowIndex].push_back( pProps );
+ m_pCellSeq = CellSequencePointer_t(new CellSequence_t(2));
+ if (!start.get())
+ return;
+ (*m_pCellSeq)[0] = start->getStart();
+}
+
+void DomainMapperTableHandler::endCell(const Handle_t & end)
+{
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->startElement("table.cell.end");
+ dmapper_logger->chars(toString(end));
+ dmapper_logger->endElement("table.cell.end");
+ dmapper_logger->endElement("table.cell");
+ clog << "</table.cell>" << endl;
+#endif
+
+ if (!end.get())
+ return;
+ (*m_pCellSeq)[1] = end->getEnd();
+ (*m_pRowSeq)[m_nCellIndex] = *m_pCellSeq;
+ ++m_nCellIndex;
+}
+
+}}