summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2014-09-16 16:59:18 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2014-09-16 18:02:05 +0200
commit35545d3dd29086014484bf5dea902a2e9acb8cb3 (patch)
tree6c3ff569db9478f6fd111714b9020cf882dd650b /writerfilter
parent851b5a973e04c0c9dda585dbe5ef290b78cc3951 (diff)
DOCX import: handle w:sdt around w:r followed by a field
Change-Id: Ic0cf71efc8d57a98e7cff050ce68a0c4303ca6b1
Diffstat (limited to 'writerfilter')
-rw-r--r--writerfilter/source/dmapper/DomainMapper.cxx14
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.cxx9
2 files changed, 19 insertions, 4 deletions
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index b0d4f82f9b70..7c4fe8a4a3f1 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 60a893206a7b..378fbc372aeb 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
{