fdo#64956: editeng: fix RTF color table export

The editengine RTF export produces this:
{\colortbl\red255\green255\blue255;;}

... and then it proceeds to map COL_AUTO to \cf0 i.e. the "white" entry
that is the result of erroneously writing out the 0th entry regardless
of whether it is COL_AUTO or not.

Fix the color table export to always put COL_AUTO first (as the Writer
RTF export already does), and simplify the code a bit.

Change-Id: Ia8ce19f387e3627a1b4a26bcc723edcf5b1ffdf8
This commit is contained in:
Michael Stahl 2014-05-31 00:03:44 +02:00
parent 7d376ae64c
commit 55070972b3
4 changed files with 29 additions and 70 deletions

View file

@ -2958,45 +2958,6 @@ bool CharAttribList::DbgCheckAttribs() const
#endif
SvxColorList::SvxColorList()
{
}
SvxColorList::~SvxColorList()
{
for ( sal_Int32 i = 0, n = aColorList.size(); i < n; ++i )
delete aColorList[ i ];
aColorList.clear();
}
sal_Int32 SvxColorList::GetId( const SvxColorItem& rColorItem )
{
for ( sal_Int32 i = 0, n = aColorList.size(); i < n; ++i )
if ( *aColorList[ i ] == rColorItem )
return i;
DBG_WARNING( "Color not found: GetId()" );
return 0;
}
void SvxColorList::Insert( SvxColorItem* pItem, sal_Int32 nIndex )
{
if ( nIndex >= (sal_Int32)aColorList.size() )
{
aColorList.push_back( pItem );
}
else
{
DummyColorList::iterator it = aColorList.begin();
::std::advance( it, nIndex );
aColorList.insert( it, pItem );
}
}
SvxColorItem* SvxColorList::GetObject( sal_Int32 nIndex )
{
return ( nIndex >= (sal_Int32)aColorList.size() ) ? NULL : aColorList[ nIndex ];
}
EditEngineItemPool::EditEngineItemPool( bool bPersistenRefCounts )
: SfxItemPool( "EditEngineItemPool", EE_ITEMS_START, EE_ITEMS_END,
aItemInfos, 0, bPersistenRefCounts )

View file

@ -131,22 +131,7 @@ public:
// class SvxColorList
class SvxColorList
{
private:
typedef std::vector<SvxColorItem*> DummyColorList;
DummyColorList aColorList;
public:
SvxColorList();
~SvxColorList();
sal_Int32 GetId( const SvxColorItem& rColor );
sal_Int32 Count() { return aColorList.size(); };
void Insert( SvxColorItem* pItem, sal_Int32 nIndex );
SvxColorItem* GetObject( sal_Int32 nIndex );
};
typedef std::vector<Color> SvxColorList;
// class ItemList

View file

@ -74,7 +74,6 @@
class EditView;
class EditEngine;
class SvxColorList;
class SvxSearchItem;
class SvxLRSpaceItem;

View file

@ -415,30 +415,40 @@ sal_uInt32 ImpEditEngine::WriteRTF( SvStream& rOutput, EditSelection aSel )
// Write out ColorList ...
SvxColorList aColorList;
// COL_AUTO should be the default color, always put it first
aColorList.push_back(COL_AUTO);
SvxColorItem const& rDefault(static_cast<SvxColorItem const&>(
aEditDoc.GetItemPool().GetDefaultItem(EE_CHAR_COLOR)));
if (rDefault.GetValue() != COL_AUTO) // is the default always AUTO?
{
aColorList.push_back(rDefault.GetValue());
}
sal_uInt32 i = 0;
SvxColorItem* pColorItem = (SvxColorItem*)aEditDoc.GetItemPool().GetItem2( EE_CHAR_COLOR, i );
SvxColorItem const* pColorItem = static_cast<SvxColorItem const*>(
aEditDoc.GetItemPool().GetItem2( EE_CHAR_COLOR, i));
while ( pColorItem )
{
sal_uInt32 nPos = i;
if ( pColorItem->GetValue() == COL_AUTO )
nPos = 0;
aColorList.Insert( new SvxColorItem( *pColorItem ), nPos );
pColorItem = (SvxColorItem*)aEditDoc.GetItemPool().GetItem2( EE_CHAR_COLOR, ++i );
++i;
if ( pColorItem->GetValue() != COL_AUTO )
{
aColorList.push_back(pColorItem->GetValue());
}
pColorItem = static_cast<SvxColorItem const*>(
aEditDoc.GetItemPool().GetItem2(EE_CHAR_COLOR, i));
}
aColorList.Insert( new SvxColorItem( (const SvxColorItem&)aEditDoc.GetItemPool().GetDefaultItem( EE_CHAR_COLOR) ), i );
rOutput.WriteChar( '{' ).WriteCharPtr( OOO_STRING_SVTOOLS_RTF_COLORTBL );
for ( j = 0; j < aColorList.Count(); j++ )
for ( j = 0; j < aColorList.size(); j++ )
{
pColorItem = aColorList.GetObject( j );
if ( !j || ( pColorItem->GetValue() != COL_AUTO ) )
Color const color = aColorList[j];
if (color != COL_AUTO) // auto is represented by "empty" element
{
rOutput.WriteCharPtr( OOO_STRING_SVTOOLS_RTF_RED );
rOutput.WriteNumber( static_cast<sal_uInt32>(pColorItem->GetValue().GetRed()) );
rOutput.WriteNumber( static_cast<sal_uInt32>(color.GetRed()) );
rOutput.WriteCharPtr( OOO_STRING_SVTOOLS_RTF_GREEN );
rOutput.WriteNumber( static_cast<sal_uInt32>(pColorItem->GetValue().GetGreen()) );
rOutput.WriteNumber( static_cast<sal_uInt32>(color.GetGreen()) );
rOutput.WriteCharPtr( OOO_STRING_SVTOOLS_RTF_BLUE );
rOutput.WriteNumber( static_cast<sal_uInt32>(pColorItem->GetValue().GetBlue()) );
rOutput.WriteNumber( static_cast<sal_uInt32>(color.GetBlue()) );
}
rOutput.WriteChar( ';' );
}
@ -784,7 +794,11 @@ void ImpEditEngine::WriteItemAsRTF( const SfxPoolItem& rItem, SvStream& rOutput,
break;
case EE_CHAR_COLOR:
{
sal_uInt32 n = rColorList.GetId( (const SvxColorItem&)rItem );
SvxColorList::const_iterator const iter = ::std::find(
rColorList.begin(), rColorList.end(),
static_cast<SvxColorItem const&>(rItem).GetValue());
assert(iter != rColorList.end());
sal_uInt32 const n = iter - rColorList.begin();
rOutput.WriteCharPtr( OOO_STRING_SVTOOLS_RTF_CF );
rOutput.WriteNumber( n );
}