sw/qa/extras/ooxmlexport/data/sdt-before-field.docx |binary
 sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx       |    9 +++++++++
 writerfilter/source/dmapper/DomainMapper.cxx        |   14 +++++++++++++-
 writerfilter/source/dmapper/DomainMapper_Impl.cxx   |    9 ++++++---
 4 files changed, 28 insertions(+), 4 deletions(-)

New commits:
commit 35545d3dd29086014484bf5dea902a2e9acb8cb3
Author: Miklos Vajna <vmik...@collabora.co.uk>
Date:   Tue Sep 16 16:59:18 2014 +0200

    DOCX import: handle w:sdt around w:r followed by a field
    
    Change-Id: Ic0cf71efc8d57a98e7cff050ce68a0c4303ca6b1

diff --git a/sw/qa/extras/ooxmlexport/data/sdt-before-field.docx 
b/sw/qa/extras/ooxmlexport/data/sdt-before-field.docx
new file mode 100644
index 0000000..a83a768
Binary files /dev/null and 
b/sw/qa/extras/ooxmlexport/data/sdt-before-field.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx
index 3eec094..923a82f 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx
@@ -599,6 +599,15 @@ DECLARE_OOXMLEXPORT_TEST(testfdo82123, "fdo82123.docx")
     assertXPath(pXmlDoc, 
"/w:document/w:body/w:tbl/w:tr/w:tc[2]/w:p/w:sdt[1]/w:sdtContent/w:r",1);
 }
 
+DECLARE_OOXMLEXPORT_TEST(testSdtBeforeField, "sdt-before-field.docx")
+{
+    if (xmlDocPtr pXmlDoc = parseExport("word/document.xml"))
+    {
+        // Make sure the field doesn't sneak inside the SDT: the SDT should 
contain only a single run (there were 6 ones).
+        assertXPath(pXmlDoc, "//w:sdt/w:sdtContent/w:r", 1);
+    }
+}
+
 DECLARE_OOXMLEXPORT_TEST(testfdo81946, "fdo81946.docx")
 {
     xmlDocPtr pXmlDoc = parseExport("word/header1.xml");
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx 
b/writerfilter/source/dmapper/DomainMapper.cxx
index b0d4f82..7c4fe8a 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -2830,8 +2830,9 @@ void DomainMapper::lcl_startCharacterGroup()
         m_pImpl->GetTopContext()->Insert(PROP_CHAR_ROTATION, 
uno::makeAny(sal_Int16(900)));
     if (m_pImpl->isSdtEndDeferred())
     {
+        // Fields have an empty character group before the real one, so don't
+        // call setSdtEndDeferred(false) here, that will happen only in 
lcl_utext().
         m_pImpl->GetTopContext()->Insert(PROP_SDT_END_BEFORE, 
uno::makeAny(true), true, CHAR_GRAB_BAG);
-        m_pImpl->setSdtEndDeferred(false);
     }
 
     // Remember formatting of the date control as it only supports plain 
strings natively.
@@ -2937,6 +2938,17 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, 
size_t len)
     aBuffer.append( (const sal_Unicode *) data_, len);
     sText = aBuffer.makeStringAndClear();
 
+    if (m_pImpl->isSdtEndDeferred())
+    {
+        // In case we have a field context, then save the property there, so
+        // SDT's ending right before a field start are handled as well.
+        PropertyMapPtr pContext = m_pImpl->GetTopContext();
+        if (m_pImpl->IsOpenField())
+            pContext = m_pImpl->GetTopFieldContext()->getProperties();
+        pContext->Insert(PROP_SDT_END_BEFORE, uno::makeAny(true), true, 
CHAR_GRAB_BAG);
+        m_pImpl->setSdtEndDeferred(false);
+    }
+
     if (!m_pImpl->m_pSdtHelper->getDropDownItems().empty())
     {
         m_pImpl->m_pSdtHelper->getSdtTexts().append(sText);
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx 
b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 60a8932..378fbc3 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -4231,13 +4231,16 @@ void DomainMapper_Impl::PopFieldContext()
                         xToInsert = uno::Reference< text::XTextContent 
>(pContext->GetTextField(), uno::UNO_QUERY);
                     if( xToInsert.is() && !m_bStartTOC && !m_bStartIndex && 
!m_bStartBibliography)
                     {
-                        uno::Sequence<beans::PropertyValue> aValues;
+                        PropertyMap aMap;
                         // Character properties of the field show up here the
                         // last (always empty) run. Inherit character
                         // properties from there.
+                        // Also merge in the properties from the field context,
+                        // e.g. SdtEndBefore.
                         if (m_pLastCharacterContext.get())
-                            aValues = 
m_pLastCharacterContext->GetPropertyValues();
-                        appendTextContent(xToInsert, aValues);
+                            aMap.InsertProps(m_pLastCharacterContext);
+                        aMap.InsertProps(m_aFieldStack.top()->getProperties());
+                        appendTextContent(xToInsert, aMap.GetPropertyValues());
                     }
                     else
                     {
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to