[Libreoffice-commits] core.git: Branch 'private/swe/libreoffice-5-2+backports' - sw/source

Andreas Brandner Andreas.Brandner at cib.de
Wed Nov 8 23:51:08 UTC 2017


 sw/source/filter/ww8/docxattributeoutput.cxx |   22 +++++++++++++++++++---
 sw/source/filter/ww8/docxattributeoutput.hxx |    2 +-
 sw/source/filter/ww8/wrtw8nds.cxx            |    4 ++--
 sw/source/filter/ww8/wrtww8.hxx              |    4 ++--
 sw/source/filter/ww8/ww8atr.cxx              |   18 ++++++++++++++++--
 5 files changed, 40 insertions(+), 10 deletions(-)

New commits:
commit a3dbed366cdebac4e8cad5ecab6e735cd4b4efe3
Author: Andreas Brandner <Andreas.Brandner at cib.de>
Date:   Sun Nov 5 20:41:31 2017 +0100

    tdf#66401 don't lose docx-combined-characters' font props on roundtrip
    
    - font-size will now get halfed, if exported within a combined-characters-field in docx
    - font-property will get exported for every run in a field, this redundancy is required by MS Word
    
    Change-Id: Idbdb5bf3066e2ed86b494255d72d66eebf72f755
    Reviewed-on: https://gerrit.libreoffice.org/44509
    Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
    Tested-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>

diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 467177d013fa..e8cdfc86182c 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -1740,12 +1740,18 @@ void DocxAttributeOutput::DoWriteCmd( const OUString& rCmd )
 
 void DocxAttributeOutput::CmdField_Impl( const SwTextNode* pNode, sal_Int32 nPos, FieldInfos const & rInfos, bool bWriteRun )
 {
+    bool bWriteCombChars(false);
+
     // Write the Field instruction
     {
         if ( bWriteRun )
         {
             m_pSerializer->startElementNS( XML_w, XML_r, FSEND );
-            DoWriteFieldRunProperties( pNode, nPos );
+
+            if (rInfos.eType == ww::eEQ)
+                bWriteCombChars = true;
+
+            DoWriteFieldRunProperties( pNode, nPos, bWriteCombChars );
         }
 
         sal_Int32 nNbToken = comphelper::string::getTokenCount(rInfos.sCmd, '\t');
@@ -1829,7 +1835,7 @@ void DocxAttributeOutput::CmdField_Impl( const SwTextNode* pNode, sal_Int32 nPos
 ///         <w:fldChar w:fldCharType="end" />
 ///     </w:r>
 /// See, tdf#38778
-void DocxAttributeOutput::DoWriteFieldRunProperties( const SwTextNode * pNode, sal_Int32 nPos )
+void DocxAttributeOutput::DoWriteFieldRunProperties( const SwTextNode * pNode, sal_Int32 nPos, bool bWriteCombChars)
 {
     if (! pNode)
     {
@@ -1859,7 +1865,17 @@ void DocxAttributeOutput::DoWriteFieldRunProperties( const SwTextNode * pNode, s
 
         // 3. output all other character properties
         SwWW8AttrIter aAttrIt( m_rExport, *pNode );
-        aAttrIt.OutAttr( nPos, false );
+        aAttrIt.OutAttr( nPos, false, bWriteCombChars );
+
+        // 4. explicitly write the font-properties, to ensure all runs in the field have them
+        // see tdf#66401
+        if ( m_pFontsAttrList.is() )
+        {
+            XFastAttributeListRef xAttrList( m_pFontsAttrList.get() );
+            m_pFontsAttrList.clear();
+
+            m_pSerializer->singleElementNS( XML_w, XML_rFonts, xAttrList );
+        }
 
         m_pSerializer->endElementNS( XML_w, XML_rPr );
 
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx
index 4c41f83d2f30..64fa4238e617 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -729,7 +729,7 @@ private:
     void DoWriteCmd( const OUString& rCmd );
     void CmdField_Impl( const SwTextNode* pNode, sal_Int32 nPos, FieldInfos const & rInfos, bool bWriteRun );
     void EndField_Impl( const SwTextNode* pNode, sal_Int32 nPos, FieldInfos& rInfos );
-    void DoWriteFieldRunProperties( const SwTextNode* pNode, sal_Int32 nPos );
+    void DoWriteFieldRunProperties( const SwTextNode* pNode, sal_Int32 nPos, bool bWriteCombChars = false );
     virtual void GenerateBookmarksForSequenceField(const SwTextNode& rNode, SwWW8AttrIter& rAttrIter) override;
 
     static void AddToAttrList( css::uno::Reference<sax_fastparser::FastAttributeList>& pAttrList, sal_Int32 nAttrName, const sal_Char* sAttrValue );
diff --git a/sw/source/filter/ww8/wrtw8nds.cxx b/sw/source/filter/ww8/wrtw8nds.cxx
index e9ba18f40d6f..33b67ea5e627 100644
--- a/sw/source/filter/ww8/wrtw8nds.cxx
+++ b/sw/source/filter/ww8/wrtw8nds.cxx
@@ -382,7 +382,7 @@ static bool lcl_isFontsizeItem( const SfxPoolItem& rItem )
             rItem.Which( ) == RES_CHRATR_CTL_FONTSIZE );
 }
 
-void SwWW8AttrIter::OutAttr( sal_Int32 nSwPos, bool bRuby )
+void SwWW8AttrIter::OutAttr( sal_Int32 nSwPos, bool bRuby , bool bWriteCombChars)
 {
     m_rExport.AttrOutput().RTLAndCJKState( IsCharRTL(), GetScript() );
 
@@ -488,7 +488,7 @@ void SwWW8AttrIter::OutAttr( sal_Int32 nSwPos, bool bRuby )
         // tdf#38778 Fix output of the font in DOC run for fields
         const SvxFontItem * pFontToOutput = ( rParentFont != *pFont )? pFont : nullptr;
 
-        m_rExport.ExportPoolItemsToCHP( aExportItems, GetScript(), pFontToOutput );
+        m_rExport.ExportPoolItemsToCHP( aExportItems, GetScript(), pFontToOutput, bWriteCombChars );
 
         // HasTextItem only allowed in the above range
         m_rExport.m_aCurrentCharPropStarts.pop();
diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx
index dafffeaafd44..ff25dedd1c3e 100644
--- a/sw/source/filter/ww8/wrtww8.hxx
+++ b/sw/source/filter/ww8/wrtww8.hxx
@@ -584,7 +584,7 @@ public:
     void WriteSpecialText( sal_uLong nStart, sal_uLong nEnd, sal_uInt8 nTTyp );
 
     /// Export the pool items to attributes (through an attribute output class).
-    void ExportPoolItemsToCHP( ww8::PoolItems &rItems, sal_uInt16 nScript, const SvxFontItem *pFont );
+    void ExportPoolItemsToCHP( ww8::PoolItems &rItems, sal_uInt16 nScript, const SvxFontItem *pFont, bool bWriteCombChars = false );
 
     /// Return the numeric id of the numbering rule
     sal_uInt16 GetId( const SwNumRule& rNumRule );
@@ -1490,7 +1490,7 @@ public:
 
     void NextPos() { if ( nAktSwPos < SAL_MAX_INT32 ) nAktSwPos = SearchNext( nAktSwPos + 1 ); }
 
-    void OutAttr( sal_Int32 nSwPos, bool bRuby = false );
+    void OutAttr( sal_Int32 nSwPos, bool bRuby = false, bool bWriteCombinedChars = false );
     virtual const SfxPoolItem* HasTextItem( sal_uInt16 nWhich ) const override;
     virtual const SfxPoolItem& GetItem( sal_uInt16 nWhich ) const override;
     int OutAttrWithRange(const SwTextNode& rNode, sal_Int32 nPos);
diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx
index fbb763a1459a..3250808165a8 100644
--- a/sw/source/filter/ww8/ww8atr.cxx
+++ b/sw/source/filter/ww8/ww8atr.cxx
@@ -204,7 +204,7 @@ bool WW8Export::CollapseScriptsforWordOk( sal_uInt16 nScript, sal_uInt16 nWhich
 
 //  Hilfsroutinen fuer Styles
 
-void MSWordExportBase::ExportPoolItemsToCHP( ww8::PoolItems &rItems, sal_uInt16 nScript, const SvxFontItem *pFont )
+void MSWordExportBase::ExportPoolItemsToCHP( ww8::PoolItems &rItems, sal_uInt16 nScript, const SvxFontItem *pFont, bool bWriteCombChars )
 {
     ww8::cPoolItemIter aEnd = rItems.end();
     for ( ww8::cPoolItemIter aI = rItems.begin(); aI != aEnd; ++aI )
@@ -228,7 +228,21 @@ void MSWordExportBase::ExportPoolItemsToCHP( ww8::PoolItems &rItems, sal_uInt16
                  AttrOutput().OutputItem( *pFont );
              }
 
-             AttrOutput().OutputItem( *pItem );
+             // tdf#66401 For Combined Characters in docx, MS Word uses half the normal font-size for the field's
+             // font-size, but only for <w:sz>. Therefore, we check if we are currently writing a field of type
+             // Combined Characters and if so, we half the font size.
+             if (bWriteCombChars &&
+                 nWhich == RES_CHRATR_FONTSIZE)
+             {
+                SvxFontHeightItem fontHeight(item_cast<SvxFontHeightItem>( *pItem ));
+                fontHeight.SetHeight( fontHeight.GetHeight() / 2 );
+
+                AttrOutput().OutputItem( fontHeight );
+             }
+             else
+             {
+                AttrOutput().OutputItem( *pItem );
+             }
         }
     }
 }


More information about the Libreoffice-commits mailing list