summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2014-08-18 15:14:31 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2014-08-18 15:51:16 +0200
commitf6b681a1360d953ec7a9f2f4f843c0d76d478c2a (patch)
tree0a79b7d29081cf342643e3492bd3fd42ee52f23c
parentaa1d3d5eeaa795f6b913bbcd55bd31dc6802a4fe (diff)
DOCX export: don't forget to close SDT elements inside the TextBoxes of shapes
A usual problem with SDT is that in case it should end after the last paragrah of a container, there is no "next" paragraph that could have the relevant "EndSdtBefore" property. This is usually handled by closing the SDT tag before the container is closed. The problem here was that DocxAttributeOutput::WriteSdtBlock() did not notify DocxSdrExport about opening the SDT, as it thought there is no draw export in progress. This is because in case of "shape with a TextBox", the common writeDMLAndVMLDrawing() method is not called, instead the separate writeDMLTextFrame() and writeVMLTextFrame() methods are invoked. Fix the problem by adjusting these methods to writeDMLAndVMLDrawing(), so that they also set m_bDMLAndVMLDrawingOpen to true during the TextBox export. Change-Id: Ie08b0b955cd2d6a645970da3d485e447abfd6495
-rw-r--r--sw/qa/core/exportdata/ooxml/fail/.gitignore0
-rw-r--r--sw/qa/core/exportdata/ooxml/indeterminate/.gitignore0
-rw-r--r--sw/qa/core/exportdata/ooxml/pass/sdt-in-shape-with-textbox.docxbin0 -> 17960 bytes
-rw-r--r--sw/qa/core/filters-test.cxx9
-rw-r--r--sw/source/filter/ww8/docxsdrexport.cxx9
5 files changed, 18 insertions, 0 deletions
diff --git a/sw/qa/core/exportdata/ooxml/fail/.gitignore b/sw/qa/core/exportdata/ooxml/fail/.gitignore
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/sw/qa/core/exportdata/ooxml/fail/.gitignore
diff --git a/sw/qa/core/exportdata/ooxml/indeterminate/.gitignore b/sw/qa/core/exportdata/ooxml/indeterminate/.gitignore
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/sw/qa/core/exportdata/ooxml/indeterminate/.gitignore
diff --git a/sw/qa/core/exportdata/ooxml/pass/sdt-in-shape-with-textbox.docx b/sw/qa/core/exportdata/ooxml/pass/sdt-in-shape-with-textbox.docx
new file mode 100644
index 000000000000..be033f156643
--- /dev/null
+++ b/sw/qa/core/exportdata/ooxml/pass/sdt-in-shape-with-textbox.docx
Binary files differ
diff --git a/sw/qa/core/filters-test.cxx b/sw/qa/core/filters-test.cxx
index 2a80f3efb242..8c128c35a84f 100644
--- a/sw/qa/core/filters-test.cxx
+++ b/sw/qa/core/filters-test.cxx
@@ -188,6 +188,15 @@ void SwFiltersTest::testCVEs()
0,
0,
/*bExport=*/true);
+
+ testDir("MS Word 2007 XML",
+ getURLFromSrc("/sw/qa/core/exportdata/ooxml/"),
+ OUString(),
+ SFX_FILTER_STARONEFILTER,
+ 0,
+ 0,
+ /*bExport=*/true);
+
}
void SwFiltersTest::setUp()
diff --git a/sw/source/filter/ww8/docxsdrexport.cxx b/sw/source/filter/ww8/docxsdrexport.cxx
index bd34f04596b7..b1aa91070b7a 100644
--- a/sw/source/filter/ww8/docxsdrexport.cxx
+++ b/sw/source/filter/ww8/docxsdrexport.cxx
@@ -1314,6 +1314,9 @@ void DocxSdrExport::writeOnlyTextOfFrame(sw::Frame* pParentFrame)
void DocxSdrExport::writeDMLTextFrame(sw::Frame* pParentFrame, int nAnchorId, bool bTextBoxOnly)
{
+ bool bDMLAndVMLDrawingOpen = m_pImpl->m_bDMLAndVMLDrawingOpen;
+ m_pImpl->m_bDMLAndVMLDrawingOpen = true;
+
sax_fastparser::FSHelperPtr pFS = m_pImpl->m_pSerializer;
const SwFrmFmt& rFrmFmt = pParentFrame->GetFrmFmt();
const SwNodeIndex* pNodeIndex = rFrmFmt.GetCntnt().GetCntntIdx();
@@ -1542,10 +1545,14 @@ void DocxSdrExport::writeDMLTextFrame(sw::Frame* pParentFrame, int nAnchorId, bo
endDMLAnchorInline(&rFrmFmt);
}
+ m_pImpl->m_bDMLAndVMLDrawingOpen = bDMLAndVMLDrawingOpen;
}
void DocxSdrExport::writeVMLTextFrame(sw::Frame* pParentFrame, bool bTextBoxOnly)
{
+ bool bDMLAndVMLDrawingOpen = m_pImpl->m_bDMLAndVMLDrawingOpen;
+ m_pImpl->m_bDMLAndVMLDrawingOpen = true;
+
sax_fastparser::FSHelperPtr pFS = m_pImpl->m_pSerializer;
const SwFrmFmt& rFrmFmt = pParentFrame->GetFrmFmt();
const SwNodeIndex* pNodeIndex = rFrmFmt.GetCntnt().GetCntntIdx();
@@ -1633,6 +1640,8 @@ void DocxSdrExport::writeVMLTextFrame(sw::Frame* pParentFrame, bool bTextBoxOnly
pFS->endElementNS(XML_w, XML_pict);
}
m_pImpl->m_bFrameBtLr = false;
+
+ m_pImpl->m_bDMLAndVMLDrawingOpen = bDMLAndVMLDrawingOpen;
}
bool DocxSdrExport::checkFrameBtlr(SwNode* pStartNode, sax_fastparser::FastAttributeList* pTextboxAttrList)