summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/oox/drawingml/drawingmltypes.hxx3
-rw-r--r--include/oox/export/drawingml.hxx1
-rw-r--r--oox/source/drawingml/drawingmltypes.cxx6
-rw-r--r--oox/source/export/drawingml.cxx35
-rw-r--r--sd/qa/unit/data/pptx/tdf79082.pptxbin0 -> 24786 bytes
-rw-r--r--sd/qa/unit/export-tests-ooxml2.cxx57
6 files changed, 102 insertions, 0 deletions
diff --git a/include/oox/drawingml/drawingmltypes.hxx b/include/oox/drawingml/drawingmltypes.hxx
index 5e3517b58524..8b513d8c3f61 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 a3da6a3cb442..fb7b7877138c 100644
--- a/include/oox/export/drawingml.hxx
+++ b/include/oox/export/drawingml.hxx
@@ -247,6 +247,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 f341ff3f9587..9a5ddf3cc4b9 100644
--- a/oox/source/drawingml/drawingmltypes.cxx
+++ b/oox/source/drawingml/drawingmltypes.cxx
@@ -54,6 +54,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 468c89ad7b7e..4259feb2ae81 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -2393,6 +2393,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;
@@ -2593,6 +2627,7 @@ 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
new file mode 100644
index 000000000000..8dcf4ff0a9e0
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf79082.pptx
Binary files differ
diff --git a/sd/qa/unit/export-tests-ooxml2.cxx b/sd/qa/unit/export-tests-ooxml2.cxx
index 6bac3cca9584..7a188b885d08 100644
--- a/sd/qa/unit/export-tests-ooxml2.cxx
+++ b/sd/qa/unit/export-tests-ooxml2.cxx
@@ -182,6 +182,7 @@ public:
void testTdf127372();
void testTdf127379();
void testTdf98603();
+ void testTdf79082();
void testTdf119087();
void testTdf131554();
void testTdf132282();
@@ -285,6 +286,7 @@ public:
CPPUNIT_TEST(testTdf127372);
CPPUNIT_TEST(testTdf127379);
CPPUNIT_TEST(testTdf98603);
+ CPPUNIT_TEST(testTdf79082);
CPPUNIT_TEST(testTdf119087);
CPPUNIT_TEST(testTdf131554);
CPPUNIT_TEST(testTdf132282);
@@ -2639,6 +2641,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::testTdf119087()
{
::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("sd/qa/unit/data/pptx/tdf119087.pptx"), PPTX);