diff options
author | Andreas Brandner <Andreas.Brandner@cib.de> | 2017-11-05 20:41:31 +0100 |
---|---|---|
committer | Thorsten Behrens <Thorsten.Behrens@CIB.de> | 2017-11-09 00:47:46 +0100 |
commit | e4ccf5f597d84f5745d73d306e83594f665024bb (patch) | |
tree | 60f37ad1efb476d89dc664b65e0a511e0ddf862d | |
parent | 65d69d95e88de25bcb59486231d92ace6be5feed (diff) |
tdf#66401 don't lose docx-combined-characters' font props on roundtrip
Change-Id: Idbdb5bf3066e2ed86b494255d72d66eebf72f755
Reviewed-on: https://gerrit.libreoffice.org/44336
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Tested-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.cxx | 22 | ||||
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.hxx | 2 | ||||
-rw-r--r-- | sw/source/filter/ww8/wrtw8nds.cxx | 4 | ||||
-rw-r--r-- | sw/source/filter/ww8/wrtww8.hxx | 4 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8atr.cxx | 18 |
5 files changed, 40 insertions, 10 deletions
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index d844268dbff3..1ab6cde62852 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -1747,12 +1747,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'); @@ -1836,7 +1842,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) { @@ -1866,7 +1872,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 7a09130e23e5..76bfc1a98af0 100644 --- a/sw/source/filter/ww8/docxattributeoutput.hxx +++ b/sw/source/filter/ww8/docxattributeoutput.hxx @@ -732,7 +732,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( rtl::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 23208e90a8fc..663036af6b70 100644 --- a/sw/source/filter/ww8/wrtw8nds.cxx +++ b/sw/source/filter/ww8/wrtw8nds.cxx @@ -379,7 +379,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( mbCharIsRTL, GetScript() ); @@ -484,7 +484,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 c96dcd8299b0..31ccbeba4554 100644 --- a/sw/source/filter/ww8/wrtww8.hxx +++ b/sw/source/filter/ww8/wrtww8.hxx @@ -588,7 +588,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 ); @@ -1495,7 +1495,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 51ef08a2a21e..9bc93b67fcfa 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 } -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 ); + } } } } |