diff options
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 | 7 | ||||
-rw-r--r-- | oox/source/drawingml/textcharacterproperties.cxx | 3 | ||||
-rw-r--r-- | oox/source/ppt/pptshape.cxx | 18 |
5 files changed, 79 insertions, 2 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: */ diff --git a/oox/source/drawingml/textbody.cxx b/oox/source/drawingml/textbody.cxx index eb27bda831ac..72b7ef752c07 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 13c50aa1b07a..1a15c6c77b62 100644 --- a/oox/source/drawingml/textbodypropertiescontext.cxx +++ b/oox/source/drawingml/textbodypropertiescontext.cxx @@ -73,7 +73,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 ); @@ -111,7 +111,7 @@ TextBodyPropertiesContext::TextBodyPropertiesContext( ContextHandler2Helper cons mrTextBodyProp.maPropertyMap.setProperty( PROP_TextFitToSize, drawing::TextFitToSizeType_NONE); } -ContextHandlerRef TextBodyPropertiesContext::onCreateContext( sal_Int32 aElementToken, const AttributeList& /*rAttribs*/) +ContextHandlerRef TextBodyPropertiesContext::onCreateContext( sal_Int32 aElementToken, const AttributeList& rAttribs) { switch( aElementToken ) { @@ -125,9 +125,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 b389d74c225f..ed110a1e3005 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) |