diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2018-09-21 11:50:57 +0200 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2018-10-02 21:04:01 +0200 |
commit | ff28de400ecf0e367d98a58285f3f82a8e85df6f (patch) | |
tree | 0bbb7d9fdf03643c14aa0fd4bf7c871d234ddbbd /oox/source | |
parent | 2c2ecb7eaa448f33162ce60154af207228ac05a8 (diff) |
tdf#120028 PPTX import: map shapes with multiple columns to table shapes
This is a combination of 3 commits.
1st commit:
Longer term the core Impress shape has to be improved so that it can have
text in multiple columns.
Shorter term, map text with multiple columns to table shapes, that gives
correct layout in many cases and requires changes to the import filter
only.
(cherry picked from commit aef569ed83a3ccc02639e5b2a1c7cc131ba262fc)
Commit #2:
Related: tdf#120028 PPTX import: fix font size of multi-col shape text
Normal shapes have a TextFitToSize property for this, but table cell
content has to be scaled manually, as the rendering has no automatic
support for them. Luckily the file format has the info we need to scale
at import time.
(cherry picked from commit c8b2849d140677f7b35523096eb2bc715b3dc507)
Commit #3:
Related: tdf#120028 PPTX import: fix font color of multi-col shape text
Not just font color, anything defined via list styles were not imported.
(cherry picked from commit 800bf1071a30955ff70373b2fb5886eadce59dee)
Change-Id: Id7942b16882ab1f083ded2f0e577e8c9e128697c
Reviewed-on: https://gerrit.libreoffice.org/61243
Tested-by: Jenkins
Reviewed-by: Andras Timar <andras.timar@collabora.com>
Diffstat (limited to 'oox/source')
-rw-r--r-- | oox/source/drawingml/table/tableproperties.cxx | 48 | ||||
-rw-r--r-- | oox/source/drawingml/textbody.cxx | 5 | ||||
-rw-r--r-- | oox/source/drawingml/textbodypropertiescontext.cxx | 5 | ||||
-rw-r--r-- | oox/source/drawingml/textcharacterproperties.cxx | 3 | ||||
-rw-r--r-- | oox/source/ppt/pptshape.cxx | 18 |
5 files changed, 78 insertions, 1 deletions
diff --git a/oox/source/drawingml/table/tableproperties.cxx b/oox/source/drawingml/table/tableproperties.cxx index 2c92390772e8..5f1495166b39 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> @@ -307,6 +309,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: */ diff --git a/oox/source/drawingml/textbody.cxx b/oox/source/drawingml/textbody.cxx index 43efe6c3989b..7730ef03dcd9 100644 --- a/oox/source/drawingml/textbody.cxx +++ b/oox/source/drawingml/textbody.cxx @@ -54,6 +54,11 @@ TextParagraph& TextBody::addParagraph() return *xPara; } +void TextBody::appendParagraph(std::shared_ptr<TextParagraph> pTextParagraph) +{ + maParagraphs.push_back(pTextParagraph); +} + void TextBody::insertAt( const ::oox::core::XmlFilterBase& rFilterBase, const Reference < XText > & xText, diff --git a/oox/source/drawingml/textbodypropertiescontext.cxx b/oox/source/drawingml/textbodypropertiescontext.cxx index 6de4a0764cbd..702685ed4126 100644 --- a/oox/source/drawingml/textbodypropertiescontext.cxx +++ b/oox/source/drawingml/textbodypropertiescontext.cxx @@ -90,7 +90,7 @@ TextBodyPropertiesContext::TextBodyPropertiesContext( ContextHandler2Helper cons // sal_Int32 nVertOverflow = rAttribs.getToken( XML_vertOverflow, XML_overflow ); // ST_TextColumnCount -// sal_Int32 nNumCol = rAttribs.getInteger( XML_numCol, 1 ); + mrTextBodyProp.mnNumCol = rAttribs.getInteger( XML_numCol, 1 ); // ST_Angle mrTextBodyProp.moRotation = rAttribs.getInteger( XML_rot ); @@ -155,9 +155,12 @@ ContextHandlerRef TextBodyPropertiesContext::onCreateContext( sal_Int32 aElement mrTextBodyProp.maPropertyMap.setProperty( PROP_TextAutoGrowHeight, false); // CT_TextNoAutofit break; case A_TOKEN( normAutofit ): // CT_TextNormalAutofit + { mrTextBodyProp.maPropertyMap.setProperty( PROP_TextFitToSize, TextFitToSizeType_AUTOFIT); mrTextBodyProp.maPropertyMap.setProperty( PROP_TextAutoGrowHeight, false); + mrTextBodyProp.mnFontScale = rAttribs.getInteger(XML_fontScale, 100000); break; + } case A_TOKEN( spAutoFit ): { const sal_Int32 tVert = mrTextBodyProp.moVert.get( XML_horz ); diff --git a/oox/source/drawingml/textcharacterproperties.cxx b/oox/source/drawingml/textcharacterproperties.cxx index 77ab07b50423..01236700bc56 100644 --- a/oox/source/drawingml/textcharacterproperties.cxx +++ b/oox/source/drawingml/textcharacterproperties.cxx @@ -52,6 +52,7 @@ void TextCharacterProperties::assignUsed( const TextCharacterProperties& rSource maHighlightColor.assignIfUsed( rSourceProps.maHighlightColor ); maUnderlineColor.assignIfUsed( rSourceProps.maUnderlineColor ); moHeight.assignIfUsed( rSourceProps.moHeight ); + moFontScale.assignIfUsed(rSourceProps.moFontScale); moSpacing.assignIfUsed( rSourceProps.moSpacing ); moUnderline.assignIfUsed( rSourceProps.moUnderline ); moBaseline.assignIfUsed( rSourceProps.moBaseline ); @@ -117,6 +118,8 @@ void TextCharacterProperties::pushToPropMap( PropertyMap& rPropMap, const XmlFil if( moHeight.has() ) { float fHeight = GetFontHeight( moHeight.get() ); + if (moFontScale.has()) + fHeight *= (moFontScale.get() / 100000); rPropMap.setProperty( PROP_CharHeight, fHeight); rPropMap.setProperty( PROP_CharHeightAsian, fHeight); rPropMap.setProperty( PROP_CharHeightComplex, fHeight); diff --git a/oox/source/ppt/pptshape.cxx b/oox/source/ppt/pptshape.cxx index e0cea6729fc2..1657e2a18a95 100644 --- a/oox/source/ppt/pptshape.cxx +++ b/oox/source/ppt/pptshape.cxx @@ -20,6 +20,7 @@ #include <oox/ppt/pptshape.hxx> #include <oox/core/xmlfilterbase.hxx> #include <drawingml/textbody.hxx> +#include <drawingml/table/tableproperties.hxx> #include <com/sun/star/awt/Rectangle.hpp> #include <com/sun/star/container/XNamed.hpp> @@ -223,6 +224,23 @@ void PPTShape::addShape( } } + if (sServiceName != "com.sun.star.drawing.TableShape") + { + if (TextBodyPtr pTextBody = getTextBody()) + { + sal_Int32 nNumCol = pTextBody->getTextProperties().mnNumCol; + if (nNumCol > 1) + { + // This shape is not a table, but has multiple columns, + // represent that as a table. + sServiceName = "com.sun.star.drawing.TableShape"; + oox::drawingml::table::TablePropertiesPtr pTableProperties = getTableProperties(); + pTableProperties->pullFromTextBody(pTextBody, maSize.Width); + setTextBody(nullptr); + } + } + } + SAL_INFO("oox.ppt","shape service: " << sServiceName); if (mnSubType && getSubTypeIndex().has() && meShapeLocation == Layout) |