From bb21f53e6c9b6b3f4a2d8c5e55ebc3a08caa69ba Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Thu, 18 Sep 2014 15:47:59 +0200 Subject: [PATCH] DOCX import: fix handling of dropdown SDT around cell There were two problems here: 1) The CT_SdtContentCell handlers didn't emit the usual NS_ooxml::LN_CT_SdtBlock_sdtContent / NS_ooxml::LN_CT_SdtBlock_sdtEndContent tokens, so the dropdown control was not created (and then was created with the wrong anchor). 2) In case the SDT was around the cell, the newline character was also added to the text of the currently selected entry, resulting in an invalid argument of SwXText::convertToTable(), so no table was created. (cherry picked from commit 419054c0f19acb323a0e51c7ef49a1a2d9f42ac8) Conflicts: sw/qa/extras/ooxmlexport/ooxmlexport.cxx writerfilter/source/dmapper/DomainMapper.cxx writerfilter/source/ooxml/model.xml Change-Id: I4806626181f40c6d26ff7b25f5dbb863967d8077 --- sw/qa/extras/ooxmlexport/ooxmlexport.cxx | 9 --------- writerfilter/source/dmapper/DomainMapper.cxx | 14 +++++++++++--- writerfilter/source/ooxml/model.xml | 5 ++++- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx index a443d58..24459d1 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx @@ -3566,15 +3566,6 @@ DECLARE_OOXMLEXPORT_TEST(testfdo79822, "fdo79822.docx") return; } -DECLARE_OOXMLEXPORT_TEST(testfdo79817,"fdo79817.docx") -{ - xmlDocPtr pXmlDoc = parseExport("word/document.xml"); - if (!pXmlDoc) - return; - assertXPath ( pXmlDoc, "/w:document/w:body/w:p[3]/w:sdt/w:sdtPr/w:dataBinding", "storeItemID","{9222E47B-A68B-4AEB-9855-21C912B9D3D2}"); - assertXPath ( pXmlDoc, "/w:document/w:body/w:p[3]/w:sdt/w:sdtPr/w:dataBinding", "xpath","/ns0:properties[1]/documentManagement[1]/ns2:Responsible_x0020_Officer_x0020_Title[1]"); -} - DECLARE_OOXMLEXPORT_TEST(testfdo80522,"fdo80522.docx") { xmlDocPtr pXmlDoc = parseExport("[Content_Types].xml"); diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index 44efb59..baf91d9 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -2768,10 +2768,18 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len) aBuffer.append( (const sal_Unicode *) data_, len); sText = aBuffer.makeStringAndClear(); + + bool bNewLine = len == 1 && (sText[0] == 0x0d || sText[0] == 0x07); if (!m_pImpl->m_pSdtHelper->getDropDownItems().empty()) { - m_pImpl->m_pSdtHelper->getSdtTexts().append(sText); - return; + if (bNewLine) + // Dropdown control has single-line texts, so in case of newline, create the control. + m_pImpl->m_pSdtHelper->createDropDownControl(); + else + { + m_pImpl->m_pSdtHelper->getSdtTexts().append(sText); + return; + } } else if (!m_pImpl->m_pSdtHelper->getDateFormat().isEmpty()) { @@ -2814,7 +2822,7 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len) { m_pImpl->getTableManager().utext(data_, len); - if(len == 1 && (sText[0] == 0x0d || sText[0] == 0x07)) + if (bNewLine) { if (m_pImpl->m_bIgnoreNextPara) { diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml index 69ac296..3f4e71c 100644 --- a/writerfilter/source/ooxml/model.xml +++ b/writerfilter/source/ooxml/model.xml @@ -25033,7 +25033,10 @@ - + + + + -- 2.1.0