summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@suse.cz>2012-05-29 15:31:11 +0200
committerFridrich Štrba <fridrich.strba@bluewin.ch>2012-06-18 11:05:14 +0200
commitc7f809a0f4737dd39fc27405e550e3e2d9f2e53f (patch)
tree75d88f68745a04108246c6c34548ee0b078637ba
parent1b0d64e7ac9225826368126d67a1381f823e3ed3 (diff)
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.strba@bluewin.ch>
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.cxx11
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.hxx1
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.cxx20
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.hxx2
4 files changed, 30 insertions, 4 deletions
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 5461a99cd27e..0a3ccb8de8c3 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 c4899cb0c20e..289b3c0be10d 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 f76e1e21c7e6..314acc49efec 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 fa21c81e2f2f..9d097bc09629 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();