writerfilter/source/dmapper/DomainMapper_Impl.cxx | 11 ++++++++++- writerfilter/source/dmapper/DomainMapper_Impl.hxx | 1 + writerfilter/source/rtftok/rtfdocumentimpl.cxx | 20 ++++++++++++++++++-- writerfilter/source/rtftok/rtfdocumentimpl.hxx | 2 +- 4 files changed, 30 insertions(+), 4 deletions(-)
New commits: commit c7f809a0f4737dd39fc27405e550e3e2d9f2e53f Author: Miklos Vajna <vmik...@suse.cz> Date: Tue May 29 15:31:11 2012 +0200 fdo#50665 fdo#37063 rtftok: don't ignore character properties of text fields Also fixes: n#760764 (Cherry-picked from commits 9486851 and b9508dd.) Signed-off-by: Fridrich Å trba <fridrich.st...@bluewin.ch> diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index 5461a99..0a3ccb8 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -193,6 +193,7 @@ DomainMapper_Impl::DomainMapper_Impl( m_bIsInShape( false ), m_bRemovedLastAnchored( false ), m_pLastSectionContext( ), + m_pLastCharacterContext(), m_nCurrentTabStopIndex( 0 ), m_sCurrentParaStyleId(), m_bInStyleSheetImport( false ), @@ -358,6 +359,8 @@ void DomainMapper_Impl::PopProperties(ContextType eId) { m_pLastSectionContext = m_aPropertyStacks[eId].top( ); } + else if (eId == CONTEXT_CHARACTER) + m_pLastCharacterContext = m_aPropertyStacks[eId].top(); m_aPropertyStacks[eId].pop(); m_aContextStack.pop(); @@ -3163,7 +3166,13 @@ void DomainMapper_Impl::PopFieldContext() if( xToInsert.is() ) { uno::Reference< text::XTextAppendAndConvert > xTextAppendAndConvert( xTextAppend, uno::UNO_QUERY_THROW ); - xTextAppendAndConvert->appendTextContent( xToInsert, uno::Sequence< beans::PropertyValue >() ); + uno::Sequence<beans::PropertyValue> aValues; + // Character properties of the field show up here the + // last (always empty) run. Inherit character + // properties from there. + if (m_pLastCharacterContext.get()) + aValues = m_pLastCharacterContext->GetPropertyValues(); + xTextAppendAndConvert->appendTextContent(xToInsert, aValues); } else { diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index c4899cb..289b3c0 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -321,6 +321,7 @@ private: PropertyMapPtr m_pTopContext; PropertyMapPtr m_pLastSectionContext; + PropertyMapPtr m_pLastCharacterContext; ::std::vector<DeletableTabStop> m_aCurrentTabStops; sal_uInt32 m_nCurrentTabStopIndex; diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index f76e1e2..314acc4 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -887,12 +887,28 @@ bool RTFFrame::inFrame() || nY > 0; } -void RTFDocumentImpl::singleChar(sal_uInt8 nValue) +void RTFDocumentImpl::singleChar(sal_uInt8 nValue, bool bRunProps) { sal_uInt8 sValue[] = { nValue }; if (!m_pCurrentBuffer) { Mapper().startCharacterGroup(); + // Should we send run properties? + if (bRunProps) + { + if (!m_pCurrentBuffer) + { + writerfilter::Reference<Properties>::Pointer_t const pProperties( + new RTFReferenceProperties(m_aStates.top().aCharacterAttributes, m_aStates.top().aCharacterSprms) + ); + Mapper().props(pProperties); + } + else + { + RTFValue::Pointer_t pValue(new RTFValue(m_aStates.top().aCharacterAttributes, m_aStates.top().aCharacterSprms)); + m_pCurrentBuffer->push_back(make_pair(BUFFER_PROPS, pValue)); + } + } Mapper().text(sValue, 1); Mapper().endCharacterGroup(); } @@ -1616,7 +1632,7 @@ int RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword) OUString aStr(RTL_CONSTASCII_USTRINGPARAM("PAGE")); singleChar(0x13); text(aStr); - singleChar(0x14); + singleChar(0x14, true); singleChar(0x15); } break; diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx index fa21c81..9d097bc 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx @@ -400,7 +400,7 @@ namespace writerfilter { void text(rtl::OUString& rString); // Sends a single character to dmapper, taking care of buffering. - void singleChar(sal_uInt8 nValue); + void singleChar(sal_uInt8 nValue, bool bRunProps = false); void parBreak(); void tableBreak(); void checkNeedPap();
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits