diff options
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); } } } |