diff options
-rw-r--r-- | include/oox/drawingml/drawingmltypes.hxx | 3 | ||||
-rw-r--r-- | include/oox/export/drawingml.hxx | 1 | ||||
-rw-r--r-- | oox/source/drawingml/drawingmltypes.cxx | 6 | ||||
-rw-r--r-- | oox/source/export/drawingml.cxx | 36 | ||||
-rw-r--r-- | sd/qa/unit/data/pptx/tdf79082.pptx | bin | 0 -> 24786 bytes | |||
-rw-r--r-- | sd/qa/unit/export-tests-ooxml2.cxx | 57 |
6 files changed, 103 insertions, 0 deletions
diff --git a/include/oox/drawingml/drawingmltypes.hxx b/include/oox/drawingml/drawingmltypes.hxx index 0aac648ad5a4..a0043d36e1b2 100644 --- a/include/oox/drawingml/drawingmltypes.hxx +++ b/include/oox/drawingml/drawingmltypes.hxx @@ -106,6 +106,9 @@ sal_Int32 GetCoordinate( sal_Int32 nValue ); /** converts an emu string into 1/100th mmm */ sal_Int32 GetCoordinate( const OUString& sValue ); +/** converts 1/100mm to EMU */ +sal_Int32 GetPointFromCoordinate( sal_Int32 nValue ); + /** converts a ST_Percentage % string into 1/1000th of % */ sal_Int32 GetPercent( const OUString& sValue ); diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx index aedd408abe28..27735af4cbd9 100644 --- a/include/oox/export/drawingml.hxx +++ b/include/oox/export/drawingml.hxx @@ -249,6 +249,7 @@ public: void WriteParagraphProperties(const css::uno::Reference< css::text::XTextContent >& rParagraph, float fFirstCharHeight); void WriteParagraphNumbering(const css::uno::Reference< css::beans::XPropertySet >& rXPropSet, float fFirstCharHeight, sal_Int16 nLevel ); + void WriteParagraphTabStops(const css::uno::Reference<css::beans::XPropertySet>& rXPropSet); void WriteRun( const css::uno::Reference< css::text::XTextRange >& rRun, bool& rbOverridingCharHeight, sal_Int32& rnCharHeight ); void WriteRunProperties( const css::uno::Reference< css::beans::XPropertySet >& rRun, bool bIsField, sal_Int32 nElement, bool bCheckDirect, diff --git a/oox/source/drawingml/drawingmltypes.cxx b/oox/source/drawingml/drawingmltypes.cxx index a6c8b66efba2..432ce7dc416c 100644 --- a/oox/source/drawingml/drawingmltypes.cxx +++ b/oox/source/drawingml/drawingmltypes.cxx @@ -53,6 +53,12 @@ sal_Int32 GetCoordinate( const OUString& sValue ) return GetCoordinate( nRet ); } +/** converts 1/100mm to EMU */ +sal_Int32 GetPointFromCoordinate( sal_Int32 nValue ) +{ + return nValue * 360; +} + /** converts a ST_Percentage % string into 1/1000th of % */ sal_Int32 GetPercent( const OUString& sValue ) { diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index 6655a21758cf..81bbcd76be07 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -2395,6 +2395,40 @@ void DrawingML::WriteParagraphNumbering(const Reference< XPropertySet >& rXPropS } } +void DrawingML::WriteParagraphTabStops(const Reference<XPropertySet>& rXPropSet) +{ + css::uno::Sequence<css::style::TabStop> aTabStops; + if (GetProperty(rXPropSet, "ParaTabStops")) + aTabStops = *o3tl::doAccess<css::uno::Sequence<css::style::TabStop>>(mAny); + + if (aTabStops.getLength() > 0) + mpFS->startElementNS(XML_a, XML_tabLst); + + for (const css::style::TabStop& rTabStop : std::as_const(aTabStops)) + { + OString sPosition = OString::number(GetPointFromCoordinate(rTabStop.Position)); + OString sAlignment; + switch (rTabStop.Alignment) + { + case css::style::TabAlign_DECIMAL: + sAlignment = "dec"; + break; + case css::style::TabAlign_RIGHT: + sAlignment = "r"; + break; + case css::style::TabAlign_CENTER: + sAlignment = "ctr"; + break; + case css::style::TabAlign_LEFT: + default: + sAlignment = "l"; + } + mpFS->singleElementNS(XML_a, XML_tab, XML_algn, sAlignment, XML_pos, sPosition); + } + if (aTabStops.getLength() > 0) + mpFS->endElementNS(XML_a, XML_tabLst); +} + bool DrawingML::IsGroupShape( const Reference< XShape >& rXShape ) { bool bRet = false; @@ -2597,6 +2631,8 @@ void DrawingML::WriteParagraphProperties( const Reference< XTextContent >& rPara WriteParagraphNumbering( rXPropSet, fFirstCharHeight, nLevel ); + WriteParagraphTabStops( rXPropSet ); + mpFS->endElementNS( XML_a, XML_pPr ); } diff --git a/sd/qa/unit/data/pptx/tdf79082.pptx b/sd/qa/unit/data/pptx/tdf79082.pptx Binary files differnew file mode 100644 index 000000000000..8dcf4ff0a9e0 --- /dev/null +++ b/sd/qa/unit/data/pptx/tdf79082.pptx diff --git a/sd/qa/unit/export-tests-ooxml2.cxx b/sd/qa/unit/export-tests-ooxml2.cxx index 7b0c9788e71b..07b340ba69f7 100644 --- a/sd/qa/unit/export-tests-ooxml2.cxx +++ b/sd/qa/unit/export-tests-ooxml2.cxx @@ -189,6 +189,7 @@ public: void testTdf127372(); void testTdf127379(); void testTdf98603(); + void testTdf79082(); void testTdf129372(); void testShapeGlowEffect(); void testTdf119087(); @@ -300,6 +301,7 @@ public: CPPUNIT_TEST(testTdf127372); CPPUNIT_TEST(testTdf127379); CPPUNIT_TEST(testTdf98603); + CPPUNIT_TEST(testTdf79082); CPPUNIT_TEST(testTdf129372); CPPUNIT_TEST(testShapeGlowEffect); CPPUNIT_TEST(testTdf119087); @@ -2778,6 +2780,61 @@ void SdOOXMLExportTest2::testTdf98603() CPPUNIT_ASSERT_EQUAL(OUString("IL"), aLocale.Country); } +void SdOOXMLExportTest2::testTdf79082() +{ + ::sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc("/sd/qa/unit/data/pptx/tdf79082.pptx"), PPTX); + utl::TempFile tempFile; + xDocShRef = saveAndReload( xDocShRef.get(), PPTX, &tempFile ); + + xmlDocPtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[1]", + "pos", + "360000"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[1]", + "algn", + "l"); + + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[2]", + "pos", + "756000"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[2]", + "algn", + "l"); + + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[3]", + "pos", + "1440000"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[3]", + "algn", + "ctr"); + + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[4]", + "pos", + "1800000"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[4]", + "algn", + "r"); + + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[5]", + "pos", + "3240000"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[5]", + "algn", + "dec"); + + xDocShRef->DoClose(); +} + void SdOOXMLExportTest2::testTdf129372() { //Without the fix in place, it would crash at import time |