|  | /************************************************************** | 
|  | * | 
|  | * Licensed to the Apache Software Foundation (ASF) under one | 
|  | * or more contributor license agreements.  See the NOTICE file | 
|  | * distributed with this work for additional information | 
|  | * regarding copyright ownership.  The ASF licenses this file | 
|  | * to you under the Apache License, Version 2.0 (the | 
|  | * "License"); you may not use this file except in compliance | 
|  | * with the License.  You may obtain a copy of the License at | 
|  | * | 
|  | *   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, | 
|  | * software distributed under the License is distributed on an | 
|  | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | * KIND, either express or implied.  See the License for the | 
|  | * specific language governing permissions and limitations | 
|  | * under the License. | 
|  | * | 
|  | *************************************************************/ | 
|  |  | 
|  |  | 
|  |  | 
|  | // MARKER(update_precomp.py): autogen include statement, do not remove | 
|  | #include "precompiled_cui.hxx" | 
|  |  | 
|  | #include <com/sun/star/uno/Sequence.hxx> | 
|  | // header for SvStream | 
|  | #include <tools/stream.hxx> | 
|  | // header for SAL_STATIC_CAST | 
|  | #include <sal/types.h> | 
|  | #include "cfgchart.hxx" | 
|  | #include <dialmgr.hxx> | 
|  | #include <cuires.hrc> | 
|  |  | 
|  | #define ROW_COLOR_COUNT 12 | 
|  |  | 
|  | using namespace com::sun::star; | 
|  |  | 
|  | TYPEINIT1( SvxChartColorTableItem, SfxPoolItem ); | 
|  |  | 
|  | SvxChartColorTable::SvxChartColorTable() | 
|  | {} | 
|  |  | 
|  | SvxChartColorTable::SvxChartColorTable( const SvxChartColorTable & _rSource ) : | 
|  | m_aColorEntries( _rSource.m_aColorEntries ) | 
|  | {} | 
|  |  | 
|  | // accessors | 
|  | size_t SvxChartColorTable::size() const | 
|  | { | 
|  | return m_aColorEntries.size(); | 
|  | } | 
|  |  | 
|  | const XColorEntry & SvxChartColorTable::operator[]( size_t _nIndex ) const | 
|  | { | 
|  | if ( _nIndex >= m_aColorEntries.size() ) | 
|  | { | 
|  | DBG_ERRORFILE( "SvxChartColorTable::[] invalid index" ); | 
|  | return m_aColorEntries[ 0 ]; | 
|  | } | 
|  |  | 
|  | return m_aColorEntries[ _nIndex ]; | 
|  | } | 
|  |  | 
|  | ColorData SvxChartColorTable::getColorData( size_t _nIndex ) const | 
|  | { | 
|  | if ( _nIndex >= m_aColorEntries.size() ) | 
|  | { | 
|  | DBG_ERRORFILE( "SvxChartColorTable::getColorData invalid index" ); | 
|  | return COL_BLACK; | 
|  | } | 
|  |  | 
|  | // GetColor should be const but unfortunately isn't | 
|  | return const_cast< XColorEntry & >( m_aColorEntries[ _nIndex ] ).GetColor().GetRGBColor(); | 
|  | } | 
|  |  | 
|  | // mutators | 
|  | void SvxChartColorTable::clear() | 
|  | { | 
|  | m_aColorEntries.clear(); | 
|  | } | 
|  |  | 
|  | void SvxChartColorTable::append( const XColorEntry & _rEntry ) | 
|  | { | 
|  | m_aColorEntries.push_back( _rEntry ); | 
|  | } | 
|  |  | 
|  | void SvxChartColorTable::replace( size_t _nIndex, const XColorEntry & _rEntry ) | 
|  | { | 
|  | DBG_ASSERT( _nIndex <= m_aColorEntries.size(), | 
|  | "SvxChartColorTable::replace invalid index" ); | 
|  |  | 
|  | Color aCol1 = m_aColorEntries[ _nIndex ].GetColor(), aCol2; | 
|  | m_aColorEntries[ _nIndex ] = _rEntry; | 
|  | aCol2 = m_aColorEntries[ _nIndex ].GetColor(); | 
|  | if ( aCol2 != const_cast< XColorEntry& >( _rEntry ).GetColor() ) | 
|  | { | 
|  | DBG_ERRORFILE( "wrong color" ); | 
|  | } | 
|  | } | 
|  |  | 
|  | void SvxChartColorTable::useDefault() | 
|  | { | 
|  | ColorData aColors[] = { | 
|  | RGB_COLORDATA( 0x00, 0x45, 0x86 ), | 
|  | RGB_COLORDATA( 0xff, 0x42, 0x0e ), | 
|  | RGB_COLORDATA( 0xff, 0xd3, 0x20 ), | 
|  | RGB_COLORDATA( 0x57, 0x9d, 0x1c ), | 
|  | RGB_COLORDATA( 0x7e, 0x00, 0x21 ), | 
|  | RGB_COLORDATA( 0x83, 0xca, 0xff ), | 
|  | RGB_COLORDATA( 0x31, 0x40, 0x04 ), | 
|  | RGB_COLORDATA( 0xae, 0xcf, 0x00 ), | 
|  | RGB_COLORDATA( 0x4b, 0x1f, 0x6f ), | 
|  | RGB_COLORDATA( 0xff, 0x95, 0x0e ), | 
|  | RGB_COLORDATA( 0xc5, 0x00, 0x0b ), | 
|  | RGB_COLORDATA( 0x00, 0x84, 0xd1 ) | 
|  | }; | 
|  |  | 
|  | clear(); | 
|  |  | 
|  | String aResName( CUI_RES( RID_SVXSTR_DIAGRAM_ROW ) ); | 
|  | String aPrefix, aPostfix, aName; | 
|  | xub_StrLen nPos = aResName.SearchAscii( "$(ROW)" ); | 
|  | if( nPos != STRING_NOTFOUND ) | 
|  | { | 
|  | aPrefix = String( aResName, 0, nPos ); | 
|  | aPostfix = String( aResName, nPos + sizeof( "$(ROW)" ) - 1, STRING_LEN ); | 
|  | } | 
|  | else | 
|  | aPrefix = aResName; | 
|  |  | 
|  | for( sal_Int32 i=0; i<ROW_COLOR_COUNT; i++ ) | 
|  | { | 
|  | aName = aPrefix; | 
|  | aName.Append( String::CreateFromInt32( i + 1 )); | 
|  | aName.Append( aPostfix ); | 
|  |  | 
|  | append( XColorEntry( aColors[ i % sizeof( aColors ) ], aName )); | 
|  | } | 
|  | } | 
|  |  | 
|  | // comparison | 
|  | bool SvxChartColorTable::operator==( const SvxChartColorTable & _rOther ) const | 
|  | { | 
|  | // note: XColorEntry has no operator == | 
|  | bool bEqual = ( this->m_aColorEntries.size() == _rOther.m_aColorEntries.size() ); | 
|  |  | 
|  | if( bEqual ) | 
|  | { | 
|  | for( size_t i = 0; i < m_aColorEntries.size(); ++i ) | 
|  | { | 
|  | if( getColorData( i ) != _rOther.getColorData( i )) | 
|  | { | 
|  | bEqual = false; | 
|  | break; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | return bEqual; | 
|  | } | 
|  |  | 
|  | // ==================== | 
|  | // class SvxChartOptions | 
|  | // ==================== | 
|  |  | 
|  | SvxChartOptions::SvxChartOptions() : | 
|  | ::utl::ConfigItem( rtl::OUString::createFromAscii( "Office.Chart" )), | 
|  | mbIsInitialized( sal_False ) | 
|  | { | 
|  | maPropertyNames.realloc( 1 ); | 
|  | maPropertyNames[ 0 ] = ::rtl::OUString::createFromAscii( "DefaultColor/Series" ); | 
|  | } | 
|  |  | 
|  | SvxChartOptions::~SvxChartOptions() | 
|  | { | 
|  | } | 
|  |  | 
|  | const SvxChartColorTable& SvxChartOptions::GetDefaultColors() | 
|  | { | 
|  | if ( !mbIsInitialized ) | 
|  | mbIsInitialized = RetrieveOptions(); | 
|  | return maDefColors; | 
|  | } | 
|  |  | 
|  | void SvxChartOptions::SetDefaultColors( const SvxChartColorTable& aCol ) | 
|  | { | 
|  | maDefColors = aCol; | 
|  | SetModified(); | 
|  | } | 
|  |  | 
|  | sal_Bool SvxChartOptions::RetrieveOptions() | 
|  | { | 
|  | // get sequence containing all properties | 
|  |  | 
|  | uno::Sequence< ::rtl::OUString > aNames = GetPropertyNames(); | 
|  | uno::Sequence< uno::Any > aProperties( aNames.getLength()); | 
|  | aProperties = GetProperties( aNames ); | 
|  |  | 
|  | if( aProperties.getLength() == aNames.getLength()) | 
|  | { | 
|  | // 1. default colors for series | 
|  | maDefColors.clear(); | 
|  | uno::Sequence< sal_Int64 > aColorSeq; | 
|  | aProperties[ 0 ] >>= aColorSeq; | 
|  |  | 
|  | sal_Int32 nCount = aColorSeq.getLength(); | 
|  | Color aCol; | 
|  |  | 
|  | // create strings for entry names | 
|  | String aResName( CUI_RES( RID_SVXSTR_DIAGRAM_ROW ) ); | 
|  | String aPrefix, aPostfix, aName; | 
|  | xub_StrLen nPos = aResName.SearchAscii( "$(ROW)" ); | 
|  | if( nPos != STRING_NOTFOUND ) | 
|  | { | 
|  | aPrefix = String( aResName, 0, nPos ); | 
|  | aPostfix = String( aResName, nPos + sizeof( "$(ROW)" ) - 1, STRING_LEN ); | 
|  | } | 
|  | else | 
|  | aPrefix = aResName; | 
|  |  | 
|  | // set color values | 
|  | for( sal_Int32 i=0; i < nCount; i++ ) | 
|  | { | 
|  | aCol.SetColor( SAL_STATIC_CAST( ColorData, aColorSeq[ i ] )); | 
|  |  | 
|  | aName = aPrefix; | 
|  | aName.Append( String::CreateFromInt32( i + 1 )); | 
|  | aName.Append( aPostfix ); | 
|  |  | 
|  | maDefColors.append( XColorEntry( aCol, aName )); | 
|  | } | 
|  | return sal_True; | 
|  | } | 
|  | return sal_False; | 
|  | } | 
|  |  | 
|  | void SvxChartOptions::Commit() | 
|  | { | 
|  | uno::Sequence< ::rtl::OUString > aNames = GetPropertyNames(); | 
|  | uno::Sequence< uno::Any > aValues( aNames.getLength()); | 
|  |  | 
|  | if( aValues.getLength() >= 1 ) | 
|  | { | 
|  | // 1. default colors for series | 
|  | // convert list to sequence | 
|  | const size_t nCount = maDefColors.size(); | 
|  | uno::Sequence< sal_Int64 > aColors( nCount ); | 
|  | for( size_t i=0; i < nCount; i++ ) | 
|  | { | 
|  | ColorData aData = maDefColors.getColorData( i ); | 
|  | aColors[ i ] = aData; | 
|  | } | 
|  |  | 
|  | aValues[ 0 ] <<= aColors; | 
|  | } | 
|  |  | 
|  | PutProperties( aNames, aValues ); | 
|  | } | 
|  |  | 
|  | void SvxChartOptions::Notify( const com::sun::star::uno::Sequence< rtl::OUString >& ) | 
|  | { | 
|  | } | 
|  |  | 
|  | // -------------------- | 
|  | // class SvxChartColorTableItem | 
|  | // -------------------- | 
|  |  | 
|  | SvxChartColorTableItem::SvxChartColorTableItem( sal_uInt16 nWhich_, const SvxChartColorTable& aTable ) : | 
|  | SfxPoolItem( nWhich_ ), | 
|  | m_aColorTable( aTable ) | 
|  | { | 
|  | } | 
|  |  | 
|  | SvxChartColorTableItem::SvxChartColorTableItem( const SvxChartColorTableItem& rOther ) : | 
|  | SfxPoolItem( rOther ), | 
|  | m_aColorTable( rOther.m_aColorTable ) | 
|  | { | 
|  | } | 
|  |  | 
|  | SfxPoolItem* __EXPORT SvxChartColorTableItem::Clone( SfxItemPool * ) const | 
|  | { | 
|  | return new SvxChartColorTableItem( *this ); | 
|  | } | 
|  |  | 
|  | int __EXPORT SvxChartColorTableItem::operator==( const SfxPoolItem& rAttr ) const | 
|  | { | 
|  | DBG_ASSERT( SfxPoolItem::operator==( rAttr ), "SvxChartColorTableItem::operator== : types differ" ); | 
|  |  | 
|  | const SvxChartColorTableItem * rCTItem( dynamic_cast< const SvxChartColorTableItem * >( & rAttr )); | 
|  | if( rCTItem ) | 
|  | { | 
|  | return (this->m_aColorTable == rCTItem->GetColorTable()); | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | void __EXPORT SvxChartColorTableItem::SetOptions( SvxChartOptions* pOpts ) const | 
|  | { | 
|  | if ( pOpts ) | 
|  | pOpts->SetDefaultColors( m_aColorTable ); | 
|  | } | 
|  |  | 
|  |  | 
|  | SvxChartColorTable & SvxChartColorTableItem::GetColorTable() | 
|  | { | 
|  | return m_aColorTable; | 
|  | } | 
|  |  | 
|  | const SvxChartColorTable & SvxChartColorTableItem::GetColorTable() const | 
|  | { | 
|  | return m_aColorTable; | 
|  | } | 
|  |  | 
|  | void SvxChartColorTableItem::ReplaceColorByIndex( size_t _nIndex, const XColorEntry & _rEntry ) | 
|  | { | 
|  | m_aColorTable.replace( _nIndex, _rEntry ); | 
|  | } |