diff options
Diffstat (limited to 'oox/source/drawingml/table/tableproperties.cxx')
-rw-r--r-- | oox/source/drawingml/table/tableproperties.cxx | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/oox/source/drawingml/table/tableproperties.cxx b/oox/source/drawingml/table/tableproperties.cxx index 527b65829d17..8f8993ad0035 100644 --- a/oox/source/drawingml/table/tableproperties.cxx +++ b/oox/source/drawingml/table/tableproperties.cxx @@ -19,6 +19,8 @@ #include <drawingml/table/tableproperties.hxx> #include <drawingml/table/tablestylelist.hxx> +#include <drawingml/textbody.hxx> +#include <drawingml/textparagraph.hxx> #include <oox/drawingml/drawingmltypes.hxx> #include <com/sun/star/table/XTable.hpp> #include <com/sun/star/container/XNameContainer.hpp> @@ -311,6 +313,52 @@ void TableProperties::pushToPropSet( const ::oox::core::XmlFilterBase& rFilterBa delete pTableStyleToDelete; } +void TableProperties::pullFromTextBody(oox::drawingml::TextBodyPtr pTextBody, sal_Int32 nShapeWidth) +{ + // Create table grid and a single row. + sal_Int32 nNumCol = pTextBody->getTextProperties().mnNumCol; + std::vector<sal_Int32>& rTableGrid(getTableGrid()); + sal_Int32 nColWidth = nShapeWidth / nNumCol; + for (sal_Int32 nCol = 0; nCol < nNumCol; ++nCol) + rTableGrid.push_back(nColWidth); + std::vector<drawingml::table::TableRow>& rTableRows(getTableRows()); + rTableRows.emplace_back(); + oox::drawingml::table::TableRow& rTableRow = rTableRows.back(); + std::vector<oox::drawingml::table::TableCell>& rTableCells = rTableRow.getTableCells(); + + // Create the cells and distribute the paragraphs from pTextBody. + sal_Int32 nNumPara = pTextBody->getParagraphs().size(); + sal_Int32 nParaPerCol = std::ceil(double(nNumPara) / nNumCol); + // Font scale of text body will be applied at a text run level. + sal_Int32 nFontScale = pTextBody->getTextProperties().mnFontScale; + size_t nPara = 0; + for (sal_Int32 nCol = 0; nCol < nNumCol; ++nCol) + { + rTableCells.emplace_back(); + oox::drawingml::table::TableCell& rTableCell = rTableCells.back(); + TextBodyPtr pCellTextBody(new TextBody); + rTableCell.setTextBody(pCellTextBody); + + // Copy properties provided by <a:lstStyle>. + pCellTextBody->getTextListStyle() = pTextBody->getTextListStyle(); + + for (sal_Int32 nParaInCol = 0; nParaInCol < nParaPerCol; ++nParaInCol) + { + if (nPara < pTextBody->getParagraphs().size()) + { + std::shared_ptr<oox::drawingml::TextParagraph> pParagraph + = pTextBody->getParagraphs()[nPara]; + if (nFontScale != 100000) + { + for (auto& pRun : pParagraph->getRuns()) + pRun->getTextCharacterProperties().moFontScale = nFontScale; + } + pCellTextBody->appendParagraph(pParagraph); + } + ++nPara; + } + } +} } } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |