diff options
author | Pierre-Eric Pelloux-Prayer <pierre-eric@lanedo.com> | 2012-09-20 11:49:29 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@suse.cz> | 2012-09-28 15:40:10 +0200 |
commit | d5529ab1e4d2c26c7e609251e2ef2530ab56be73 (patch) | |
tree | 9d4f7e4d3b318d3458a72b953b131718f1e5e8dc | |
parent | cefa651967578a6b56ad017272bf62d600b213e2 (diff) |
docx import: position table using tblInd OR tblCellMar
Previously cell-margin was unconditionnaly used to compute table position.
Office only does so on top-level tables and if tblInd is missing.
Change-Id: I183647bcf090d5822b3f2e04e097c8bbd277168d
5 files changed, 29 insertions, 9 deletions
diff --git a/writerfilter/inc/resourcemodel/TableManager.hxx b/writerfilter/inc/resourcemodel/TableManager.hxx index 5e2af023b606..651cf40d796c 100644 --- a/writerfilter/inc/resourcemodel/TableManager.hxx +++ b/writerfilter/inc/resourcemodel/TableManager.hxx @@ -71,7 +71,7 @@ public: /** Handle end of table. */ - virtual void endTable() = 0; + virtual void endTable(unsigned int nestedTableLevel) = 0; /** Handle start of row. @@ -1003,7 +1003,7 @@ void TableManager<T, PropertiesPointer>::resolveCurrentTable() mpTableDataHandler->endRow(); } - mpTableDataHandler->endTable(); + mpTableDataHandler->endTable(mTableDataStack.size() - 1); } catch (uno::Exception const& e) { diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx index 1e65802387f9..91d652d3b3e4 100644 --- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx +++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx @@ -272,6 +272,7 @@ struct WRITERFILTER_DLLPRIVATE TableInfo sal_Int32 nRightBorderDistance; sal_Int32 nTopBorderDistance; sal_Int32 nBottomBorderDistance; + sal_Int32 nNestLevel; PropertyMapPtr pTableDefaults; PropertyMapPtr pTableBorders; TableStyleSheetEntry* pTableStyle; @@ -282,6 +283,7 @@ struct WRITERFILTER_DLLPRIVATE TableInfo , nRightBorderDistance(DEF_BORDER_DIST) , nTopBorderDistance(0) , nBottomBorderDistance(0) + , nNestLevel(0) , pTableDefaults(new PropertyMap) , pTableBorders(new PropertyMap) , pTableStyle(NULL) @@ -443,7 +445,24 @@ TableStyleSheetEntry * DomainMapperTableHandler::endTableGetTableStyle(TableInfo lcl_debug_TableBorder(aTableBorder); #endif - m_aTableProperties->Insert( PROP_LEFT_MARGIN, false, uno::makeAny( nLeftMargin - nGapHalf - rInfo.nLeftBorderDistance)); + // Mimic Office behavior : if tlbInd is defined, use it place table. + // Otherwise, top-level table's position depends w:tblCellMar attribute (but not nested tables) + if (nLeftMargin) + { + m_aTableProperties->Insert( PROP_LEFT_MARGIN, false, uno::makeAny( nLeftMargin - nGapHalf)); + } + else + { + // TODO: top-level position depends on w:tblCellMar attribute, not w:cellMar + if (rInfo.nNestLevel > 1) + { + m_aTableProperties->Insert( PROP_LEFT_MARGIN, false, uno::makeAny( - nGapHalf)); + } + else + { + m_aTableProperties->Insert( PROP_LEFT_MARGIN, false, uno::makeAny( - nGapHalf - rInfo.nLeftBorderDistance)); + } + } m_aTableProperties->getValue( TablePropertyMap::TABLE_WIDTH, nTableWidth ); if( nTableWidth > 0 ) @@ -682,13 +701,14 @@ RowPropertyValuesSeq_t DomainMapperTableHandler::endTableGetRowProperties() return aRowProperties; } -void DomainMapperTableHandler::endTable() +void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel) { #ifdef DEBUG_DMAPPER_TABLE_HANDLER dmapper_logger->startElement("tablehandler.endTable"); #endif TableInfo aTableInfo; + aTableInfo.nNestLevel = nestedTableLevel; aTableInfo.pTableStyle = endTableGetTableStyle(aTableInfo); // expands to uno::Sequence< Sequence< beans::PropertyValues > > diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx b/writerfilter/source/dmapper/DomainMapperTableHandler.hxx index e4e770cfd1d1..689ceee030dd 100644 --- a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx +++ b/writerfilter/source/dmapper/DomainMapperTableHandler.hxx @@ -87,7 +87,7 @@ public: virtual void startTable(unsigned int nRows, unsigned int nDepth, TablePropertyMapPtr pProps); - virtual void endTable(); + virtual void endTable(unsigned int nestedTableLevel); virtual void startRow(unsigned int nCells, TablePropertyMapPtr pProps); virtual void endRow(); virtual void startCell(const Handle_t & start, TablePropertyMapPtr pProps); diff --git a/writerfilter/source/doctok/WW8ResourceModelImpl.cxx b/writerfilter/source/doctok/WW8ResourceModelImpl.cxx index 60eff4586c2e..1ecb25839bae 100644 --- a/writerfilter/source/doctok/WW8ResourceModelImpl.cxx +++ b/writerfilter/source/doctok/WW8ResourceModelImpl.cxx @@ -53,7 +53,7 @@ public: typedef boost::shared_ptr<WW8TableDataHandler> Pointer_t; virtual void startTable(unsigned int nRows, unsigned int nDepth, TablePropsPointer_t pProps); - virtual void endTable(); + virtual void endTable(unsigned int nestedTableLevel); virtual void startRow(unsigned int nCols, TablePropsPointer_t pProps); virtual void endRow(); @@ -77,7 +77,7 @@ void WW8TableDataHandler::startTable(unsigned int nRows, unsigned int nDepth, output.addItem(tmpStr); } -void WW8TableDataHandler::endTable() +void WW8TableDataHandler::endTable(unsigned int /*nestedTableLevel*/) { output.addItem("</tabledata.table>"); } diff --git a/writerfilter/source/resourcemodel/resourcemodel.cxx b/writerfilter/source/resourcemodel/resourcemodel.cxx index 017fa667d8bf..d0594b13a888 100644 --- a/writerfilter/source/resourcemodel/resourcemodel.cxx +++ b/writerfilter/source/resourcemodel/resourcemodel.cxx @@ -110,7 +110,7 @@ public: typedef boost::shared_ptr<WW8TableDataHandler> Pointer_t; virtual void startTable(unsigned int nRows, unsigned int nDepth, TablePropsRef_t pProps); - virtual void endTable(); + virtual void endTable(unsigned int nestedTableLevel); virtual void startRow(unsigned int nCols, TablePropsRef_t pProps); virtual void endRow(); @@ -134,7 +134,7 @@ void WW8TableDataHandler::startTable(unsigned int nRows, unsigned int nDepth, output.addItem(tmpStr); } -void WW8TableDataHandler::endTable() +void WW8TableDataHandler::endTable(unsigned int /*nestedTableLevel*/) { output.addItem("</tabledata.table>"); } |