summaryrefslogtreecommitdiff
path: root/oox/source/xls/richstring.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'oox/source/xls/richstring.cxx')
-rw-r--r--oox/source/xls/richstring.cxx94
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 )
{