diff options
Diffstat (limited to 'sw/source/filter/ww8/docxsdrexport.cxx')
-rw-r--r-- | sw/source/filter/ww8/docxsdrexport.cxx | 552 |
1 files changed, 552 insertions, 0 deletions
diff --git a/sw/source/filter/ww8/docxsdrexport.cxx b/sw/source/filter/ww8/docxsdrexport.cxx new file mode 100644 index 000000000000..57affcf91cde --- /dev/null +++ b/sw/source/filter/ww8/docxsdrexport.cxx @@ -0,0 +1,552 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <com/sun/star/drawing/XShape.hpp> +#include <com/sun/star/xml/dom/XDocument.hpp> +#include <com/sun/star/xml/sax/XSAXSerializable.hpp> +#include <com/sun/star/xml/sax/Writer.hpp> +#include <editeng/lrspitem.hxx> +#include <editeng/ulspitem.hxx> +#include <editeng/opaqitem.hxx> +#include <editeng/shaditem.hxx> +#include <editeng/unoprnms.hxx> +#include <svx/svdobj.hxx> +#include <svx/svdmodel.hxx> +#include <svx/svdogrp.hxx> +#include <oox/token/tokens.hxx> +#include <oox/export/drawingml.hxx> +#include <oox/export/utils.hxx> +#include <oox/export/vmlexport.hxx> + +#include <frmatr.hxx> +#include <frmfmt.hxx> +#include <fmtanchr.hxx> +#include <fmtornt.hxx> +#include <fmtsrnd.hxx> + +#include <docxsdrexport.hxx> +#include <docxexport.hxx> +#include <docxexportfilter.hxx> + +using namespace com::sun::star; +using namespace oox; + +/// Holds data used by DocxSdrExport only. +struct DocxSdrExport::Impl +{ + DocxSdrExport& m_rSdrExport; + DocxExport& m_rExport; + sax_fastparser::FSHelperPtr m_pSerializer; + oox::drawingml::DrawingML* m_pDrawingML; + + Impl(DocxSdrExport& rSdrExport, DocxExport& rExport, sax_fastparser::FSHelperPtr pSerializer, oox::drawingml::DrawingML* pDrawingML) + : m_rSdrExport(rSdrExport), + m_rExport(rExport), + m_pSerializer(pSerializer), + m_pDrawingML(pDrawingML) + { + } + /// Writes wp wrapper code around an SdrObject, which itself is written using drawingML syntax. + void writeDMLDrawing(const SdrObject* pSdrObj, const SwFrmFmt* pFrmFmt, int nAnchorId); +}; + +DocxSdrExport::DocxSdrExport(DocxExport& rExport, sax_fastparser::FSHelperPtr pSerializer, oox::drawingml::DrawingML* pDrawingML) + : m_pImpl(new Impl(*this, rExport, pSerializer, pDrawingML)) +{ +} + +DocxSdrExport::~DocxSdrExport() +{ +} + +void DocxSdrExport::setSerializer(sax_fastparser::FSHelperPtr pSerializer) +{ + m_pImpl->m_pSerializer = pSerializer; +} + +void DocxSdrExport::startDMLAnchorInline(const SwFrmFmt* pFrmFmt, const Size& rSize) +{ + m_pImpl->m_pSerializer->startElementNS(XML_w, XML_drawing, FSEND); + + const SvxLRSpaceItem pLRSpaceItem = pFrmFmt->GetLRSpace(false); + const SvxULSpaceItem pULSpaceItem = pFrmFmt->GetULSpace(false); + + bool isAnchor = pFrmFmt->GetAnchor().GetAnchorId() != FLY_AS_CHAR; + if (isAnchor) + { + ::sax_fastparser::FastAttributeList* attrList = m_pImpl->m_pSerializer->createAttrList(); + attrList->add(XML_behindDoc, pFrmFmt->GetOpaque().GetValue() ? "0" : "1"); + attrList->add(XML_distT, OString::number(TwipsToEMU(pULSpaceItem.GetUpper())).getStr()); + attrList->add(XML_distB, OString::number(TwipsToEMU(pULSpaceItem.GetLower())).getStr()); + attrList->add(XML_distL, OString::number(TwipsToEMU(pLRSpaceItem.GetLeft())).getStr()); + attrList->add(XML_distR, OString::number(TwipsToEMU(pLRSpaceItem.GetRight())).getStr()); + attrList->add(XML_simplePos, "0"); + attrList->add(XML_locked, "0"); + attrList->add(XML_layoutInCell, "1"); + attrList->add(XML_allowOverlap, "1"); // TODO + if (const SdrObject* pObj = pFrmFmt->FindRealSdrObject()) + attrList->add(XML_relativeHeight, OString::number(pObj->GetOrdNum())); + sax_fastparser::XFastAttributeListRef xAttrList(attrList); + m_pImpl->m_pSerializer->startElementNS(XML_wp, XML_anchor, xAttrList); + m_pImpl->m_pSerializer->singleElementNS(XML_wp, XML_simplePos, XML_x, "0", XML_y, "0", FSEND); // required, unused + const char* relativeFromH; + const char* relativeFromV; + const char* alignH = NULL; + const char* alignV = NULL; + switch (pFrmFmt->GetVertOrient().GetRelationOrient()) + { + case text::RelOrientation::PAGE_PRINT_AREA: + relativeFromV = "margin"; + break; + case text::RelOrientation::PAGE_FRAME: + relativeFromV = "page"; + break; + case text::RelOrientation::FRAME: + relativeFromV = "paragraph"; + break; + case text::RelOrientation::TEXT_LINE: + default: + relativeFromV = "line"; + break; + } + switch (pFrmFmt->GetVertOrient().GetVertOrient()) + { + case text::VertOrientation::TOP: + case text::VertOrientation::CHAR_TOP: + case text::VertOrientation::LINE_TOP: + if (pFrmFmt->GetVertOrient().GetRelationOrient() == text::RelOrientation::TEXT_LINE) + alignV = "bottom"; + else + alignV = "top"; + break; + case text::VertOrientation::BOTTOM: + case text::VertOrientation::CHAR_BOTTOM: + case text::VertOrientation::LINE_BOTTOM: + if (pFrmFmt->GetVertOrient().GetRelationOrient() == text::RelOrientation::TEXT_LINE) + alignV = "top"; + else + alignV = "bottom"; + break; + case text::VertOrientation::CENTER: + case text::VertOrientation::CHAR_CENTER: + case text::VertOrientation::LINE_CENTER: + alignV = "center"; + break; + default: + break; + } + switch (pFrmFmt->GetHoriOrient().GetRelationOrient()) + { + case text::RelOrientation::PAGE_PRINT_AREA: + relativeFromH = "margin"; + break; + case text::RelOrientation::PAGE_FRAME: + relativeFromH = "page"; + break; + case text::RelOrientation::CHAR: + relativeFromH = "character"; + break; + case text::RelOrientation::FRAME: + default: + relativeFromH = "column"; + break; + } + switch (pFrmFmt->GetHoriOrient().GetHoriOrient()) + { + case text::HoriOrientation::LEFT: + alignH = "left"; + break; + case text::HoriOrientation::RIGHT: + alignH = "right"; + break; + case text::HoriOrientation::CENTER: + alignH = "center"; + break; + case text::HoriOrientation::INSIDE: + alignH = "inside"; + break; + case text::HoriOrientation::OUTSIDE: + alignH = "outside"; + break; + default: + break; + } + m_pImpl->m_pSerializer->startElementNS(XML_wp, XML_positionH, XML_relativeFrom, relativeFromH, FSEND); + if (alignH != NULL) + { + m_pImpl->m_pSerializer->startElementNS(XML_wp, XML_align, FSEND); + m_pImpl->m_pSerializer->write(alignH); + m_pImpl->m_pSerializer->endElementNS(XML_wp, XML_align); + } + else + { + m_pImpl->m_pSerializer->startElementNS(XML_wp, XML_posOffset, FSEND); + m_pImpl->m_pSerializer->write(TwipsToEMU(pFrmFmt->GetHoriOrient().GetPos())); + m_pImpl->m_pSerializer->endElementNS(XML_wp, XML_posOffset); + } + m_pImpl->m_pSerializer->endElementNS(XML_wp, XML_positionH); + m_pImpl->m_pSerializer->startElementNS(XML_wp, XML_positionV, XML_relativeFrom, relativeFromV, FSEND); + if (alignV != NULL) + { + m_pImpl->m_pSerializer->startElementNS(XML_wp, XML_align, FSEND); + m_pImpl->m_pSerializer->write(alignV); + m_pImpl->m_pSerializer->endElementNS(XML_wp, XML_align); + } + else + { + m_pImpl->m_pSerializer->startElementNS(XML_wp, XML_posOffset, FSEND); + m_pImpl->m_pSerializer->write(TwipsToEMU(pFrmFmt->GetVertOrient().GetPos())); + m_pImpl->m_pSerializer->endElementNS(XML_wp, XML_posOffset); + } + m_pImpl->m_pSerializer->endElementNS(XML_wp, XML_positionV); + } + else + { + m_pImpl->m_pSerializer->startElementNS(XML_wp, XML_inline, + XML_distT, OString::number(TwipsToEMU(pULSpaceItem.GetUpper())).getStr(), + XML_distB, OString::number(TwipsToEMU(pULSpaceItem.GetLower())).getStr(), + XML_distL, OString::number(TwipsToEMU(pLRSpaceItem.GetLeft())).getStr(), + XML_distR, OString::number(TwipsToEMU(pLRSpaceItem.GetRight())).getStr(), + FSEND); + } + + // now the common parts + // extent of the image + OString aWidth(OString::number(TwipsToEMU(rSize.Width()))); + OString aHeight(OString::number(TwipsToEMU(rSize.Height()))); + m_pImpl->m_pSerializer->singleElementNS(XML_wp, XML_extent, + XML_cx, aWidth.getStr(), + XML_cy, aHeight.getStr(), + FSEND); + + // effectExtent, extent including the effect (shadow only for now) + SvxShadowItem aShadowItem = pFrmFmt->GetShadow(); + OString aLeftExt("0"), aRightExt("0"), aTopExt("0"), aBottomExt("0"); + if (aShadowItem.GetLocation() != SVX_SHADOW_NONE) + { + OString aShadowWidth(OString::number(TwipsToEMU(aShadowItem.GetWidth()))); + switch (aShadowItem.GetLocation()) + { + case SVX_SHADOW_TOPLEFT: + aTopExt = aLeftExt = aShadowWidth; + break; + case SVX_SHADOW_TOPRIGHT: + aTopExt = aRightExt = aShadowWidth; + break; + case SVX_SHADOW_BOTTOMLEFT: + aBottomExt = aLeftExt = aShadowWidth; + break; + case SVX_SHADOW_BOTTOMRIGHT: + aBottomExt = aRightExt = aShadowWidth; + break; + case SVX_SHADOW_NONE: + case SVX_SHADOW_END: + break; + } + } + + m_pImpl->m_pSerializer->singleElementNS(XML_wp, XML_effectExtent, + XML_l, aLeftExt, + XML_t, aTopExt, + XML_r, aRightExt, + XML_b, aBottomExt, + FSEND); + + if (isAnchor) + { + switch (pFrmFmt->GetSurround().GetValue()) + { + case SURROUND_NONE: + m_pImpl->m_pSerializer->singleElementNS(XML_wp, XML_wrapTopAndBottom, FSEND); + break; + case SURROUND_THROUGHT: + m_pImpl->m_pSerializer->singleElementNS(XML_wp, XML_wrapNone, FSEND); + break; + case SURROUND_PARALLEL: + m_pImpl->m_pSerializer->singleElementNS(XML_wp, XML_wrapSquare, + XML_wrapText, "bothSides", FSEND); + break; + case SURROUND_IDEAL: + default: + m_pImpl->m_pSerializer->singleElementNS(XML_wp, XML_wrapSquare, + XML_wrapText, "largest", FSEND); + break; + } + } +} + +void DocxSdrExport::endDMLAnchorInline(const SwFrmFmt* pFrmFmt) +{ + bool isAnchor = pFrmFmt->GetAnchor().GetAnchorId() != FLY_AS_CHAR; + m_pImpl->m_pSerializer->endElementNS(XML_wp, isAnchor ? XML_anchor : XML_inline); + + m_pImpl->m_pSerializer->endElementNS(XML_w, XML_drawing); +} + +void DocxSdrExport::writeVMLDrawing(const SdrObject* sdrObj, const SwFrmFmt& rFrmFmt,const Point& rNdTopLeft) +{ + bool bSwapInPage = false; + if (!(sdrObj)->GetPage()) + { + if (SdrModel* pModel = m_pImpl->m_rExport.pDoc->GetDrawModel()) + { + if (SdrPage* pPage = pModel->GetPage(0)) + { + bSwapInPage = true; + const_cast< SdrObject* >(sdrObj)->SetPage(pPage); + } + } + } + + m_pImpl->m_pSerializer->startElementNS(XML_w, XML_pict, FSEND); + m_pImpl->m_pDrawingML->SetFS(m_pImpl->m_pSerializer); + // See WinwordAnchoring::SetAnchoring(), these are not part of the SdrObject, have to be passed around manually. + + SwFmtHoriOrient rHoriOri = (rFrmFmt).GetHoriOrient(); + SwFmtVertOrient rVertOri = (rFrmFmt).GetVertOrient(); + m_pImpl->m_rExport.VMLExporter().AddSdrObject(*(sdrObj), + rHoriOri.GetHoriOrient(), rVertOri.GetVertOrient(), + rHoriOri.GetRelationOrient(), + rVertOri.GetRelationOrient(), (&rNdTopLeft), true); + m_pImpl->m_pSerializer->endElementNS(XML_w, XML_pict); + + if (bSwapInPage) + const_cast< SdrObject* >(sdrObj)->SetPage(0); +} + +void DocxSdrExport::Impl::writeDMLDrawing(const SdrObject* pSdrObject, const SwFrmFmt* pFrmFmt, int nAnchorId) +{ + sax_fastparser::FSHelperPtr pFS = m_pSerializer; + Size aSize(pSdrObject->GetSnapRect().GetWidth(), pSdrObject->GetSnapRect().GetHeight()); + m_rSdrExport.startDMLAnchorInline(pFrmFmt, aSize); + + sax_fastparser::FastAttributeList* pDocPrAttrList = pFS->createAttrList(); + pDocPrAttrList->add(XML_id, OString::number(nAnchorId).getStr()); + pDocPrAttrList->add(XML_name, OUStringToOString(pSdrObject->GetName(), RTL_TEXTENCODING_UTF8).getStr()); + sax_fastparser::XFastAttributeListRef xDocPrAttrListRef(pDocPrAttrList); + pFS->singleElementNS(XML_wp, XML_docPr, xDocPrAttrListRef); + + pFS->startElementNS(XML_a, XML_graphic, + FSNS(XML_xmlns, XML_a), "http://schemas.openxmlformats.org/drawingml/2006/main", + FSEND); + const SdrObjGroup* pObjGroup = PTR_CAST(SdrObjGroup, pSdrObject); + pFS->startElementNS(XML_a, XML_graphicData, + XML_uri, (pObjGroup ? "http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" : "http://schemas.microsoft.com/office/word/2010/wordprocessingShape"), + FSEND); + + uno::Reference<drawing::XShape> xShape(const_cast<SdrObject*>(pSdrObject)->getUnoShape(), uno::UNO_QUERY_THROW); + m_rExport.OutputDML(xShape); + + pFS->endElementNS(XML_a, XML_graphicData); + pFS->endElementNS(XML_a, XML_graphic); + + m_rSdrExport.endDMLAnchorInline(pFrmFmt); +} + +void DocxSdrExport::writeDMLAndVMLDrawing(const SdrObject* sdrObj, const SwFrmFmt& rFrmFmt,const Point& rNdTopLeft, int nAnchorId) +{ + m_pImpl->m_pSerializer->startElementNS(XML_mc, XML_AlternateContent, FSEND); + + const SdrObjGroup* pObjGroup = PTR_CAST(SdrObjGroup, sdrObj); + m_pImpl->m_pSerializer->startElementNS(XML_mc, XML_Choice, + XML_Requires, (pObjGroup ? "wpg" : "wps"), + FSEND); + m_pImpl->writeDMLDrawing(sdrObj, &rFrmFmt, nAnchorId); + m_pImpl->m_pSerializer->endElementNS(XML_mc, XML_Choice); + + m_pImpl->m_pSerializer->startElementNS(XML_mc, XML_Fallback, FSEND); + writeVMLDrawing(sdrObj, rFrmFmt, rNdTopLeft); + m_pImpl->m_pSerializer->endElementNS(XML_mc, XML_Fallback); + + m_pImpl->m_pSerializer->endElementNS(XML_mc, XML_AlternateContent); +} + +void DocxSdrExport::writeDiagram(const SdrObject* sdrObject, const Size& size) +{ + sax_fastparser::FSHelperPtr pFS = m_pImpl->m_pSerializer; + uno::Reference< drawing::XShape > xShape(((SdrObject*)sdrObject)->getUnoShape(), uno::UNO_QUERY); + uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY); + + uno::Reference<xml::dom::XDocument> dataDom; + uno::Reference<xml::dom::XDocument> layoutDom; + uno::Reference<xml::dom::XDocument> styleDom; + uno::Reference<xml::dom::XDocument> colorDom; + uno::Reference<xml::dom::XDocument> drawingDom; + + // retrieve the doms from the GrabBag + OUString pName = UNO_NAME_MISC_OBJ_INTEROPGRABBAG; + uno::Sequence< beans::PropertyValue > propList; + xPropSet->getPropertyValue(pName) >>= propList; + for (sal_Int32 nProp=0; nProp < propList.getLength(); ++nProp) + { + OUString propName = propList[nProp].Name; + if (propName == "OOXData") + propList[nProp].Value >>= dataDom; + else if (propName == "OOXLayout") + propList[nProp].Value >>= layoutDom; + else if (propName == "OOXStyle") + propList[nProp].Value >>= styleDom; + else if (propName == "OOXColor") + propList[nProp].Value >>= colorDom; + else if (propName == "OOXDrawing") + propList[nProp].Value >>= drawingDom; + } + + // check that we have the 4 mandatory XDocuments + // if not, there was an error importing and we won't output anything + if (!dataDom.is() || !layoutDom.is() || !styleDom.is() || !colorDom.is()) + return; + + // write necessary tags to document.xml + pFS->startElementNS(XML_w, XML_drawing, + FSEND); + pFS->startElementNS(XML_wp, XML_inline, + XML_distT, "0", XML_distB, "0", XML_distL, "0", XML_distR, "0", + FSEND); + + OString aWidth(OString::number(TwipsToEMU(size.Width()))); + OString aHeight(OString::number(TwipsToEMU(size.Height()))); + pFS->singleElementNS(XML_wp, XML_extent, + XML_cx, aWidth.getStr(), + XML_cy, aHeight.getStr(), + FSEND); + // TODO - the right effectExtent, extent including the effect + pFS->singleElementNS(XML_wp, XML_effectExtent, + XML_l, "0", XML_t, "0", XML_r, "0", XML_b, "0", + FSEND); + + // generate an unique id + static sal_Int32 diagramCount = 0; + diagramCount++; + OUString sName = "Diagram" + OUString::number(diagramCount); + + pFS->singleElementNS(XML_wp, XML_docPr, + XML_id, I32S(diagramCount), + XML_name, USS(sName), + FSEND); + + pFS->singleElementNS(XML_wp, XML_cNvGraphicFramePr, + FSEND); + + pFS->startElementNS(XML_a, XML_graphic, + FSNS(XML_xmlns, XML_a), "http://schemas.openxmlformats.org/drawingml/2006/main", + FSEND); + + pFS->startElementNS(XML_a, XML_graphicData, + XML_uri, "http://schemas.openxmlformats.org/drawingml/2006/diagram", + FSEND); + + // add data relation + OUString dataFileName = "diagrams/data" + OUString::number(diagramCount) + ".xml"; + OString dataRelId = OUStringToOString(m_pImpl->m_rExport.GetFilter().addRelation(pFS->getOutputStream(), + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/diagramData", + dataFileName, false), RTL_TEXTENCODING_UTF8); + + // add layout relation + OUString layoutFileName = "diagrams/layout" + OUString::number(diagramCount) + ".xml"; + OString layoutRelId = OUStringToOString(m_pImpl->m_rExport.GetFilter().addRelation(pFS->getOutputStream(), + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/diagramLayout", + layoutFileName, false), RTL_TEXTENCODING_UTF8); + + // add style relation + OUString styleFileName = "diagrams/quickStyle" + OUString::number(diagramCount) + ".xml"; + OString styleRelId = OUStringToOString(m_pImpl->m_rExport.GetFilter().addRelation(pFS->getOutputStream(), + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/diagramQuickStyle", + styleFileName , false), RTL_TEXTENCODING_UTF8); + + // add color relation + OUString colorFileName = "diagrams/colors" + OUString::number(diagramCount) + ".xml"; + OString colorRelId = OUStringToOString(m_pImpl->m_rExport.GetFilter().addRelation(pFS->getOutputStream(), + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/diagramColors", + colorFileName, false), RTL_TEXTENCODING_UTF8); + + OUString drawingFileName; + if (drawingDom.is()) + { + // add drawing relation + drawingFileName = "diagrams/drawing" + OUString::number(diagramCount) + ".xml"; + OUString drawingRelId = m_pImpl->m_rExport.GetFilter().addRelation(pFS->getOutputStream(), + "http://schemas.microsoft.com/office/2007/relationships/diagramDrawing", + drawingFileName , false); + + // the data dom contains a reference to the drawing relation. We need to update it with the new generated + // relation value before writing the dom to a file + + // Get the dsp:damaModelExt node from the dom + uno::Reference< xml::dom::XNodeList > nodeList = + dataDom->getElementsByTagNameNS("http://schemas.microsoft.com/office/drawing/2008/diagram", "dataModelExt"); + + // There must be one element only so get it + uno::Reference< xml::dom::XNode > node = nodeList->item(0); + + // Get the list of attributes of the node + uno::Reference< xml::dom::XNamedNodeMap > nodeMap = node->getAttributes(); + + // Get the node with the relId attribute and set its new value + uno::Reference< xml::dom::XNode > relIdNode = nodeMap->getNamedItem("relId"); + relIdNode->setNodeValue(drawingRelId); + } + + pFS->singleElementNS(XML_dgm, XML_relIds, + FSNS(XML_xmlns, XML_dgm), "http://schemas.openxmlformats.org/drawingml/2006/diagram", + FSNS(XML_xmlns, XML_r), "http://schemas.openxmlformats.org/officeDocument/2006/relationships", + FSNS(XML_r, XML_dm), dataRelId.getStr(), + FSNS(XML_r, XML_lo), layoutRelId.getStr(), + FSNS(XML_r, XML_qs), styleRelId.getStr(), + FSNS(XML_r, XML_cs), colorRelId.getStr(), + FSEND); + + pFS->endElementNS(XML_a, XML_graphicData); + pFS->endElementNS(XML_a, XML_graphic); + pFS->endElementNS(XML_wp, XML_inline); + pFS->endElementNS(XML_w, XML_drawing); + + uno::Reference< xml::sax::XSAXSerializable > serializer; + uno::Reference< xml::sax::XWriter > writer = xml::sax::Writer::create(comphelper::getProcessComponentContext()); + + // write data file + serializer.set(dataDom, uno::UNO_QUERY); + writer->setOutputStream(m_pImpl->m_rExport.GetFilter().openFragmentStream("word/" + dataFileName, + "application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml")); + serializer->serialize(uno::Reference< xml::sax::XDocumentHandler >(writer, uno::UNO_QUERY_THROW), + uno::Sequence< beans::StringPair >()); + + // write layout file + serializer.set(layoutDom, uno::UNO_QUERY); + writer->setOutputStream(m_pImpl->m_rExport.GetFilter().openFragmentStream("word/" + layoutFileName, + "application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml")); + serializer->serialize(uno::Reference< xml::sax::XDocumentHandler >(writer, uno::UNO_QUERY_THROW), + uno::Sequence< beans::StringPair >()); + + // write style file + serializer.set(styleDom, uno::UNO_QUERY); + writer->setOutputStream(m_pImpl->m_rExport.GetFilter().openFragmentStream("word/" + styleFileName, + "application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml")); + serializer->serialize(uno::Reference< xml::sax::XDocumentHandler >(writer, uno::UNO_QUERY_THROW), + uno::Sequence< beans::StringPair >()); + + // write color file + serializer.set(colorDom, uno::UNO_QUERY); + writer->setOutputStream(m_pImpl->m_rExport.GetFilter().openFragmentStream("word/" + colorFileName, + "application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml")); + serializer->serialize(uno::Reference< xml::sax::XDocumentHandler >(writer, uno::UNO_QUERY_THROW), + uno::Sequence< beans::StringPair >()); + + // write drawing file + if (drawingDom.is()) + { + serializer.set(drawingDom, uno::UNO_QUERY); + writer->setOutputStream(m_pImpl->m_rExport.GetFilter().openFragmentStream("word/" + drawingFileName, + "application/vnd.openxmlformats-officedocument.drawingml.diagramDrawing+xml")); + serializer->serialize(uno::Reference< xml::sax::XDocumentHandler >(writer, uno::UNO_QUERY_THROW), + uno::Sequence< beans::StringPair >()); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |