diff options
Diffstat (limited to 'oox/source/xls/richstring.cxx')
-rw-r--r-- | oox/source/xls/richstring.cxx | 94 |
1 files changed, 62 insertions, 32 deletions
diff --git a/oox/source/xls/richstring.cxx b/oox/source/xls/richstring.cxx index 5c79373b09b2..859280ddd548 100644 --- a/oox/source/xls/richstring.cxx +++ b/oox/source/xls/richstring.cxx @@ -52,6 +52,11 @@ namespace { const sal_uInt8 BIFF12_STRINGFLAG_FONTS = 0x01; const sal_uInt8 BIFF12_STRINGFLAG_PHONETICS = 0x02; +inline bool lclNeedsRichTextFormat( const Font* pFont ) +{ + return pFont && pFont->needsRichTextFormat(); +} + } // namespace // ============================================================================ @@ -86,18 +91,27 @@ void RichStringPortion::finalizeImport() mxFont = getStyles().getFont( mnFontId ); } -void RichStringPortion::convert( const Reference< XText >& rxText, sal_Int32 nXfId ) +void RichStringPortion::convert( const Reference< XText >& rxText, const Font* pFont, bool bReplace ) { - Reference< XTextRange > xRange = rxText->getEnd(); - xRange->setString( maText ); - if( mxFont.get() ) - { - PropertySet aPropSet( xRange ); - mxFont->writeToPropertySet( aPropSet, FONT_PROPTYPE_TEXT ); - } - if( const Font* pFont = getStyles().getFontFromCellXf( nXfId ).get() ) + Reference< XTextRange > xRange; + if( bReplace ) + xRange.set( rxText, UNO_QUERY ); + else + xRange = rxText->getEnd(); + OSL_ENSURE( xRange.is(), "RichStringPortion::convert - cannot get text range interface" ); + + if( xRange.is() ) { - if( pFont->needsRichTextFormat() ) + xRange->setString( maText ); + if( mxFont.get() ) + { + PropertySet aPropSet( xRange ); + mxFont->writeToPropertySet( aPropSet, FONT_PROPTYPE_TEXT ); + } + + /* Some font attributes cannot be set to cell formattiing in Calc but + require to use rich formatting, e.g. font escapement. */ + if( lclNeedsRichTextFormat( pFont ) ) { PropertySet aPropSet( xRange ); pFont->writeToPropertySet( aPropSet, FONT_PROPTYPE_TEXT ); @@ -391,7 +405,7 @@ void RichString::importString( SequenceInputStream& rStrm, bool bRich ) { FontPortionModelList aPortions; aPortions.importPortions( rStrm ); - createFontPortions( aBaseText, aPortions ); + createTextPortions( aBaseText, aPortions ); } else { @@ -408,7 +422,12 @@ void RichString::importString( SequenceInputStream& rStrm, bool bRich ) } } -void RichString::importByteString( BiffInputStream& rStrm, rtl_TextEncoding eDefaultTextEnc, BiffStringFlags nFlags ) +void RichString::importCharArray( BiffInputStream& rStrm, sal_uInt16 nChars, rtl_TextEncoding eTextEnc ) +{ + createPortion()->setText( rStrm.readCharArrayUC( nChars, eTextEnc ) ); +} + +void RichString::importByteString( BiffInputStream& rStrm, rtl_TextEncoding eTextEnc, BiffStringFlags nFlags ) { OSL_ENSURE( !getFlag( nFlags, BIFF_STR_KEEPFONTS ), "RichString::importString - keep fonts not implemented" ); OSL_ENSURE( !getFlag( nFlags, static_cast< BiffStringFlags >( ~(BIFF_STR_8BITLENGTH | BIFF_STR_EXTRAFONTS) ) ), "RichString::importByteString - unknown flag" ); @@ -420,11 +439,11 @@ void RichString::importByteString( BiffInputStream& rStrm, rtl_TextEncoding eDef { FontPortionModelList aPortions; aPortions.importPortions( rStrm, false ); - createFontPortions( aBaseText, eDefaultTextEnc, aPortions ); + createTextPortions( aBaseText, eTextEnc, aPortions ); } else { - createPortion()->setText( OStringToOUString( aBaseText, eDefaultTextEnc ) ); + createPortion()->setText( OStringToOUString( aBaseText, eTextEnc ) ); } } @@ -454,7 +473,7 @@ void RichString::importUniString( BiffInputStream& rStrm, BiffStringFlags nFlags { FontPortionModelList aPortions; aPortions.importPortions( rStrm, nFontCount, BIFF_FONTPORTION_16BIT ); - createFontPortions( aBaseText, aPortions ); + createTextPortions( aBaseText, aPortions ); } else { @@ -488,23 +507,34 @@ void RichString::importUniString( BiffInputStream& rStrm, BiffStringFlags nFlags void RichString::finalizeImport() { - maFontPortions.forEachMem( &RichStringPortion::finalizeImport ); + maTextPortions.forEachMem( &RichStringPortion::finalizeImport ); } -OUString RichString::getPlainText() const +bool RichString::extractPlainString( OUString& orString, const Font* pFirstPortionFont ) const { - OUStringBuffer aBuffer; - for( PortionVec::const_iterator aIt = maFontPortions.begin(), aEnd = maFontPortions.end(); aIt != aEnd; ++aIt ) - aBuffer.append( (*aIt)->getText() ); - return aBuffer.makeStringAndClear(); + if( !maPhonPortions.empty() ) + return false; + if( maTextPortions.empty() ) + { + orString = OUString(); + return true; + } + if( (maTextPortions.size() == 1) && !maTextPortions.front()->hasFont() && !lclNeedsRichTextFormat( pFirstPortionFont ) ) + { + orString = maTextPortions.front()->getText(); + return true; + } + return false; } -void RichString::convert( const Reference< XText >& rxText, sal_Int32 nXfId ) const +void RichString::convert( const Reference< XText >& rxText, const Font* pFirstPortionFont ) const { - for( PortionVec::const_iterator aIt = maFontPortions.begin(), aEnd = maFontPortions.end(); aIt != aEnd; ++aIt ) + bool bReplace = true; + for( PortionVector::const_iterator aIt = maTextPortions.begin(), aEnd = maTextPortions.end(); aIt != aEnd; ++aIt ) { - (*aIt)->convert( rxText, nXfId ); - nXfId = -1; // use passed XF identifier for first portion only + (*aIt)->convert( rxText, pFirstPortionFont, bReplace ); + pFirstPortionFont = 0; // use passed font for first portion only + bReplace = false; // do not replace first portion text with following portions } } @@ -513,7 +543,7 @@ void RichString::convert( const Reference< XText >& rxText, sal_Int32 nXfId ) co RichStringPortionRef RichString::createPortion() { RichStringPortionRef xPortion( new RichStringPortion( *this ) ); - maFontPortions.push_back( xPortion ); + maTextPortions.push_back( xPortion ); return xPortion; } @@ -524,9 +554,9 @@ RichStringPhoneticRef RichString::createPhonetic() return xPhonetic; } -void RichString::createFontPortions( const OString& rText, rtl_TextEncoding eDefaultTextEnc, FontPortionModelList& rPortions ) +void RichString::createTextPortions( const OString& rText, rtl_TextEncoding eTextEnc, FontPortionModelList& rPortions ) { - maFontPortions.clear(); + maTextPortions.clear(); sal_Int32 nStrLen = rText.getLength(); if( nStrLen > 0 ) { @@ -544,8 +574,8 @@ void RichString::createFontPortions( const OString& rText, rtl_TextEncoding eDef { // convert byte string to unicode string, using current font encoding FontRef xFont = getStyles().getFont( aIt->mnFontId ); - rtl_TextEncoding eTextEnc = xFont.get() ? xFont->getFontEncoding() : eDefaultTextEnc; - OUString aUniStr = OStringToOUString( rText.copy( aIt->mnPos, nPortionLen ), eTextEnc ); + rtl_TextEncoding eFontEnc = xFont.get() ? xFont->getFontEncoding() : eTextEnc; + OUString aUniStr = OStringToOUString( rText.copy( aIt->mnPos, nPortionLen ), eFontEnc ); // create string portion RichStringPortionRef xPortion = createPortion(); xPortion->setText( aUniStr ); @@ -555,9 +585,9 @@ void RichString::createFontPortions( const OString& rText, rtl_TextEncoding eDef } } -void RichString::createFontPortions( const OUString& rText, FontPortionModelList& rPortions ) +void RichString::createTextPortions( const OUString& rText, FontPortionModelList& rPortions ) { - maFontPortions.clear(); + maTextPortions.clear(); sal_Int32 nStrLen = rText.getLength(); if( nStrLen > 0 ) { |