summaryrefslogtreecommitdiff
path: root/oox
diff options
context:
space:
mode:
authorMark Hung <marklh9@gmail.com>2019-11-02 14:28:57 +0800
committerMark Hung <marklh9@gmail.com>2019-11-10 12:32:24 +0100
commit2971f6bbabe5871e9ef462e94239c652db3aede0 (patch)
tree70f9b2b85430e7431cfa2c17a8027fa344821f03 /oox
parent4438e7dcbfd78b117b704fd4d15b2e445c3db0b0 (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.cxx95
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);
}
}
}