diff options
author | Mark Hung <marklh9@gmail.com> | 2019-11-02 14:28:57 +0800 |
---|---|---|
committer | Mark Hung <marklh9@gmail.com> | 2019-11-10 12:32:24 +0100 |
commit | 2971f6bbabe5871e9ef462e94239c652db3aede0 (patch) | |
tree | 70f9b2b85430e7431cfa2c17a8027fa344821f03 /oox | |
parent | 4438e7dcbfd78b117b704fd4d15b2e445c3db0b0 (diff) |
tdf#106638 oox: reset font settings if necessary.
Direct formatting was used when symbols were inserted.
However when there wasn't any direct formatting of Latin
fonts in the following runs, it didn't know how to reset
the font. Get the default font with XPropertyState and
try to reset to the default value if symbol fonts are set.
Change-Id: I83c9317ba61a96375128f1cc3ed478d958ddaa5c
Reviewed-on: https://gerrit.libreoffice.org/81956
Tested-by: Jenkins
Reviewed-by: Mark Hung <marklh9@gmail.com>
Diffstat (limited to 'oox')
-rw-r--r-- | oox/source/drawingml/textrun.cxx | 95 |
1 files changed, 45 insertions, 50 deletions
diff --git a/oox/source/drawingml/textrun.cxx b/oox/source/drawingml/textrun.cxx index 45290aab3386..3f66c7a852e4 100644 --- a/oox/source/drawingml/textrun.cxx +++ b/oox/source/drawingml/textrun.cxx @@ -22,6 +22,7 @@ #include <com/sun/star/text/ControlCharacter.hpp> #include <com/sun/star/beans/XMultiPropertySet.hpp> #include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/beans/XPropertyState.hpp> #include <com/sun/star/lang/XMultiServiceFactory.hpp> #include <com/sun/star/text/XTextField.hpp> @@ -62,6 +63,11 @@ sal_Int32 TextRun::insertAt( Reference< XTextRange > xStart = xAt; PropertySet aPropSet( xStart ); + Reference<XPropertyState> xState(xStart, UNO_QUERY); + Any aOldFontName = xState->getPropertyDefault("CharFontName"); + Any aOldFontPitch = xState->getPropertyDefault("CharFontPitch"); + Any aOldFontFamily = xState->getPropertyDefault("CharFontFamily"); + TextCharacterProperties aTextCharacterProps( rTextCharacterStyle ); aTextCharacterProps.assignUsed( maTextCharacterProperties ); if ( aTextCharacterProps.moHeight.has() ) @@ -78,61 +84,50 @@ sal_Int32 TextRun::insertAt( SAL_WARN("oox", "OOX: TextRun::insertAt() insert line break" ); xText->insertControlCharacter( xStart, ControlCharacter::LINE_BREAK, false ); } - else + else if (!getText().isEmpty()) { - OUString aSymbolFontName; - sal_Int16 nSymbolFontFamily = 0, nSymbolFontPitch = 0; - - if ( !aTextCharacterProps.maSymbolFont.getFontData( aSymbolFontName, nSymbolFontPitch, nSymbolFontFamily, rFilterBase ) ) - xText->insertString( xStart, getText(), false ); - else if ( !getText().isEmpty() ) + sal_Int32 nIndex = 0; + sal_Int32 nMax = getText().getLength(); + while(true) { - // #i113673 - OUString aLatinFontName; - sal_Int16 nLatinFontPitch = 0, nLatinFontFamily = 0; - bool bLatinOk = aTextCharacterProps.maLatinFont.getFontData( aLatinFontName, nLatinFontPitch, nLatinFontFamily, rFilterBase ); + bool bSymbol = (getText()[nIndex] & 0xff00) == 0xf000; + sal_Int32 nCount = 1; + while(nIndex + nCount < nMax + && ((getText()[nIndex + nCount] & 0xff00) == 0xf000) == bSymbol) + ++nCount; + + OUString aFontName; + sal_Int16 nFontFamily = 0, nFontPitch = 0; + bool bReset = false; + + // Direct formatting for symbols. + if (bSymbol && aTextCharacterProps.maSymbolFont.getFontData(aFontName, nFontPitch, nFontFamily, rFilterBase)) + + { + aPropSet.setAnyProperty(PROP_CharFontName, Any(aFontName)); + aPropSet.setAnyProperty(PROP_CharFontPitch, Any(nFontPitch)); + aPropSet.setAnyProperty(PROP_CharFontFamily, Any(nFontFamily)); + bReset = true; + } + + OUString aSubString(getText().copy(nIndex, nCount)); + xText->insertString(xStart, aSubString, false); - sal_Int32 nIndex = 0; - while ( true ) + aPropSet = PropertySet(xStart); + // Reset to whatever it was. + if (bReset) { - sal_Int32 nCount = 0; - bool bSymbol = ( getText()[ nIndex ] & 0xff00 ) == 0xf000; - if ( bSymbol ) - { - do - { - nCount++; - } - while( ( ( nCount + nIndex ) < getText().getLength() ) && ( ( getText()[ nCount + nIndex ] & 0xff00 ) == 0xf000 ) ); - aPropSet.setAnyProperty( PROP_CharFontName, Any( aSymbolFontName ) ); - aPropSet.setAnyProperty( PROP_CharFontPitch, Any( nSymbolFontPitch ) ); - aPropSet.setAnyProperty( PROP_CharFontFamily, Any( nSymbolFontFamily ) ); - } - else - { - do - { - nCount++; - } - while( ( ( nCount + nIndex ) < getText().getLength() ) && ( ( getText()[ nCount + nIndex ] & 0xff00 ) != 0xf000 ) ); - if (bLatinOk) - { - aPropSet.setAnyProperty( PROP_CharFontName, Any( aLatinFontName ) ); - aPropSet.setAnyProperty( PROP_CharFontPitch, Any( nLatinFontPitch ) ); - aPropSet.setAnyProperty( PROP_CharFontFamily, Any( nLatinFontFamily ) ); - } - } - OUString aSubString( getText().copy( nIndex, nCount ) ); - xText->insertString( xStart, aSubString, false ); - nIndex += nCount; - - if ( nIndex >= getText().getLength() ) - break; - - xStart = xAt; - aPropSet = PropertySet( xStart ); - aTextCharacterProps.pushToPropSet( aPropSet, rFilterBase ); + aPropSet.setAnyProperty(PROP_CharFontName, aOldFontName); + aPropSet.setAnyProperty(PROP_CharFontPitch, aOldFontPitch); + aPropSet.setAnyProperty(PROP_CharFontFamily, aOldFontFamily); } + + nIndex += nCount; + + if (nIndex >= nMax) + break; + + aTextCharacterProps.pushToPropSet(aPropSet, rFilterBase); } } } |