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