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

Reply via email to