diff options
author | Michael Stahl <mstahl@redhat.com> | 2016-01-15 15:26:43 +0100 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2016-01-15 16:45:45 +0100 |
commit | cb890ae43bacd2be24bc74fad2e2e5cce8910995 (patch) | |
tree | 858c951d037b4582948a3d180e7b3b29407bdf1f /oox | |
parent | f5ccfd60c2c5dab392d58870fbd079a6286bc239 (diff) |
oox: export Math objects to PPTX files
These hit the assert in lcl_StoreOwnAsOOXML now so better implement some
export.
Change-Id: I10c005a547e8a85f2a82198a49f9a03fc46a61d7
Diffstat (limited to 'oox')
-rw-r--r-- | oox/source/export/shapes.cxx | 67 |
1 files changed, 64 insertions, 3 deletions
diff --git a/oox/source/export/shapes.cxx b/oox/source/export/shapes.cxx index 8320aad9ee27..0facbf16db3f 100644 --- a/oox/source/export/shapes.cxx +++ b/oox/source/export/shapes.cxx @@ -93,6 +93,7 @@ #include <editeng/svxenum.hxx> #include <svx/unoapi.hxx> #include <oox/export/chartexport.hxx> +#include <oox/mathml/export.hxx> using namespace ::css; using namespace ::css::beans; @@ -1578,13 +1579,64 @@ ShapeExport& ShapeExport::WriteTextShape( Reference< XShape > xShape ) return *this; } +void ShapeExport::WriteMathShape(Reference<XShape> const& xShape) +{ + Reference<XPropertySet> const xPropSet(xShape, UNO_QUERY); + assert(xPropSet.is()); + Reference<XModel> xMathModel; + xPropSet->getPropertyValue("Model") >>= xMathModel; + assert(xMathModel.is()); + assert(GetDocumentType() != DOCUMENT_DOCX); // should be written in DocxAttributeOutput + SAL_WARN_IF(GetDocumentType() == DOCUMENT_XLSX, "oox", "Math export to XLSX isn't tested, should it happen here?"); + + // ECMA standard does not actually allow oMath outside of + // WordProcessingML so write a MCE like PPT 2010 does + mpFS->startElementNS(XML_mc, XML_AlternateContent, FSEND); + mpFS->startElementNS(XML_mc, XML_Choice, + FSNS(XML_xmlns, XML_a14), "http://schemas.microsoft.com/office/drawing/2010/main", + XML_Requires, "a14", + FSEND); + mpFS->startElementNS(mnXmlNamespace, XML_sp, FSEND); + mpFS->startElementNS(mnXmlNamespace, XML_nvSpPr, FSEND); + mpFS->singleElementNS(mnXmlNamespace, XML_cNvPr, + XML_id, OString::number(GetNewShapeID(xShape)).getStr(), + XML_name, OString("Formula " + OString::number(mnShapeIdMax++)).getStr(), + FSEND); + mpFS->singleElementNS(mnXmlNamespace, XML_cNvSpPr, XML_txBox, "1", FSEND); + mpFS->singleElementNS(mnXmlNamespace, XML_nvPr, FSEND); + mpFS->endElementNS(mnXmlNamespace, XML_nvSpPr); + mpFS->startElementNS(mnXmlNamespace, XML_spPr, FSEND); + WriteShapeTransformation(xShape, XML_a); + WritePresetShape("rect"); + mpFS->endElementNS(mnXmlNamespace, XML_spPr); + mpFS->startElementNS(mnXmlNamespace, XML_txBody, FSEND); + mpFS->startElementNS(XML_a, XML_bodyPr, FSEND); + mpFS->endElementNS(XML_a, XML_bodyPr); + mpFS->startElementNS(XML_a, XML_p, FSEND); + mpFS->startElementNS(XML_a14, XML_m, FSEND); + + oox::FormulaExportBase *const pMagic(dynamic_cast<oox::FormulaExportBase*>(xMathModel.get())); + assert(pMagic); + pMagic->writeFormulaOoxml(GetFS(), GetFB()->getVersion(), GetDocumentType()); + + mpFS->endElementNS(XML_a14, XML_m); + mpFS->endElementNS(XML_a, XML_p); + mpFS->endElementNS(mnXmlNamespace, XML_txBody); + mpFS->endElementNS(mnXmlNamespace, XML_sp); + mpFS->endElementNS(XML_mc, XML_Choice); + mpFS->startElementNS(XML_mc, XML_Fallback, FSEND); + // TODO: export bitmap shape as fallback + mpFS->endElementNS(XML_mc, XML_Fallback); + mpFS->endElementNS(XML_mc, XML_AlternateContent); +} + ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape ) { Reference< XPropertySet > xPropSet( xShape, UNO_QUERY ); if (!xPropSet.is()) return *this; - bool bIsChart(false); + enum { CHART, MATH, OTHER } eType(OTHER); OUString clsid; xPropSet->getPropertyValue("CLSID") >>= clsid; if (!clsid.isEmpty()) @@ -1592,10 +1644,13 @@ ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape ) SvGlobalName aClassID; bool const isValid = aClassID.MakeId(clsid); assert(isValid); (void)isValid; - bIsChart = SotExchange::IsChart(aClassID); + if (SotExchange::IsChart(aClassID)) + eType = CHART; + else if (SotExchange::IsMath(aClassID)) + eType = MATH; } - if (bIsChart) + if (CHART == eType) { Reference< XChartDocument > xChartDoc; xPropSet->getPropertyValue("Model") >>= xChartDoc; @@ -1608,6 +1663,12 @@ ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape ) return *this; } + if (MATH == eType) + { + WriteMathShape(xShape); + return *this; + } + uno::Reference<embed::XEmbeddedObject> const xObj( xPropSet->getPropertyValue("EmbeddedObject"), uno::UNO_QUERY); |