diff options
Diffstat (limited to 'sc/source/filter/excel/xlchart.cxx')
-rw-r--r-- | sc/source/filter/excel/xlchart.cxx | 1351 |
1 files changed, 0 insertions, 1351 deletions
diff --git a/sc/source/filter/excel/xlchart.cxx b/sc/source/filter/excel/xlchart.cxx deleted file mode 100644 index 2ae195e97..000000000 --- a/sc/source/filter/excel/xlchart.cxx +++ /dev/null @@ -1,1351 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -#include "xlchart.hxx" - -#include <com/sun/star/container/XNameContainer.hpp> -#include <com/sun/star/awt/Size.hpp> -#include <com/sun/star/awt/Gradient.hpp> -#include <com/sun/star/drawing/Hatch.hpp> -#include <com/sun/star/drawing/LineDash.hpp> -#include <com/sun/star/drawing/LineStyle.hpp> -#include <com/sun/star/drawing/FillStyle.hpp> -#include <com/sun/star/drawing/BitmapMode.hpp> -#include <com/sun/star/chart/DataLabelPlacement.hpp> -#include <com/sun/star/chart/XAxisXSupplier.hpp> -#include <com/sun/star/chart/XAxisYSupplier.hpp> -#include <com/sun/star/chart/XAxisZSupplier.hpp> -#include <com/sun/star/chart/XChartDocument.hpp> -#include <com/sun/star/chart/XSecondAxisTitleSupplier.hpp> -#include <com/sun/star/chart2/Symbol.hpp> - -#include <sal/macros.h> -#include <rtl/math.hxx> -#include <svl/itemset.hxx> -#include <svx/xfillit0.hxx> -#include <svx/xflclit.hxx> -#include <svx/xfltrit.hxx> -#include <svx/xflgrit.hxx> -#include <svx/xbtmpit.hxx> -#include <svx/unomid.hxx> -#include <filter/msfilter/escherex.hxx> -#include <editeng/memberids.hrc> -#include "global.hxx" -#include "xlroot.hxx" -#include "xlstyle.hxx" - -using ::rtl::OUString; -using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::UNO_QUERY; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::lang::XMultiServiceFactory; -using ::com::sun::star::chart2::XChartDocument; -using ::com::sun::star::drawing::XShape; - -namespace cssc = ::com::sun::star::chart; - -// Common ===================================================================== - -XclChRectangle::XclChRectangle() : - mnX( 0 ), - mnY( 0 ), - mnWidth( 0 ), - mnHeight( 0 ) -{ -} - -// ---------------------------------------------------------------------------- - -XclChDataPointPos::XclChDataPointPos( sal_uInt16 nSeriesIdx, sal_uInt16 nPointIdx ) : - mnSeriesIdx( nSeriesIdx ), - mnPointIdx( nPointIdx ) -{ -} - -bool operator<( const XclChDataPointPos& rL, const XclChDataPointPos& rR ) -{ - return (rL.mnSeriesIdx < rR.mnSeriesIdx) || - ((rL.mnSeriesIdx == rR.mnSeriesIdx) && (rL.mnPointIdx < rR.mnPointIdx)); -} - -// ---------------------------------------------------------------------------- - -XclChFrBlock::XclChFrBlock( sal_uInt16 nType ) : - mnType( nType ), - mnContext( 0 ), - mnValue1( 0 ), - mnValue2( 0 ) -{ -} - -// Frame formatting =========================================================== - -XclChFramePos::XclChFramePos() : - mnTLMode( EXC_CHFRAMEPOS_PARENT ), - mnBRMode( EXC_CHFRAMEPOS_PARENT ) -{ -} - -// ---------------------------------------------------------------------------- - -XclChLineFormat::XclChLineFormat() : - maColor( COL_BLACK ), - mnPattern( EXC_CHLINEFORMAT_SOLID ), - mnWeight( EXC_CHLINEFORMAT_SINGLE ), - mnFlags( EXC_CHLINEFORMAT_AUTO ) -{ -} - -// ---------------------------------------------------------------------------- - -XclChAreaFormat::XclChAreaFormat() : - maPattColor( COL_WHITE ), - maBackColor( COL_BLACK ), - mnPattern( EXC_PATT_SOLID ), - mnFlags( EXC_CHAREAFORMAT_AUTO ) -{ -} - -// ---------------------------------------------------------------------------- - -XclChEscherFormat::XclChEscherFormat() -{ -} - -XclChEscherFormat::~XclChEscherFormat() -{ -} - -// ---------------------------------------------------------------------------- - -XclChPicFormat::XclChPicFormat() : - mnBmpMode( EXC_CHPICFORMAT_NONE ), - mnFormat( EXC_CHPICFORMAT_DEFAULT ), - mnFlags( EXC_CHPICFORMAT_DEFAULTFLAGS ), - mfScale( 0.5 ) -{ -} - -// ---------------------------------------------------------------------------- - -XclChFrame::XclChFrame() : - mnFormat( EXC_CHFRAME_STANDARD ), - mnFlags( EXC_CHFRAME_AUTOSIZE | EXC_CHFRAME_AUTOPOS ) -{ -} - -// Source links =============================================================== - -XclChSourceLink::XclChSourceLink() : - mnDestType( EXC_CHSRCLINK_TITLE ), - mnLinkType( EXC_CHSRCLINK_DEFAULT ), - mnFlags( 0 ), - mnNumFmtIdx( 0 ) -{ -} - -// Text ======================================================================= - -XclChObjectLink::XclChObjectLink() : - mnTarget( EXC_CHOBJLINK_NONE ) -{ -} - -// ---------------------------------------------------------------------------- - -XclChFrLabelProps::XclChFrLabelProps() : - mnFlags( 0 ) -{ -} - -// ---------------------------------------------------------------------------- - -XclChText::XclChText() : - maTextColor( COL_BLACK ), - mnHAlign( EXC_CHTEXT_ALIGN_CENTER ), - mnVAlign( EXC_CHTEXT_ALIGN_CENTER ), - mnBackMode( EXC_CHTEXT_TRANSPARENT ), - mnFlags( EXC_CHTEXT_AUTOCOLOR | EXC_CHTEXT_AUTOFILL ), - mnFlags2( EXC_CHTEXT_POS_DEFAULT ), - mnRotation( EXC_ROT_NONE ) -{ -} - -// Data series ================================================================ - -XclChMarkerFormat::XclChMarkerFormat() : - maLineColor( COL_BLACK ), - maFillColor( COL_WHITE ), - mnMarkerSize( EXC_CHMARKERFORMAT_SINGLESIZE ), - mnMarkerType( EXC_CHMARKERFORMAT_NOSYMBOL ), - mnFlags( EXC_CHMARKERFORMAT_AUTO ) -{ -}; - -// ---------------------------------------------------------------------------- - -XclCh3dDataFormat::XclCh3dDataFormat() : - mnBase( EXC_CH3DDATAFORMAT_RECT ), - mnTop( EXC_CH3DDATAFORMAT_STRAIGHT ) -{ -} - -// ---------------------------------------------------------------------------- - -XclChDataFormat::XclChDataFormat() : - mnFormatIdx( EXC_CHDATAFORMAT_DEFAULT ), - mnFlags( 0 ) -{ -} - -// ---------------------------------------------------------------------------- - -XclChSerTrendLine::XclChSerTrendLine() : - mfForecastFor( 0.0 ), - mfForecastBack( 0.0 ), - mnLineType( EXC_CHSERTREND_POLYNOMIAL ), - mnOrder( 1 ), - mnShowEquation( 0 ), - mnShowRSquared( 0 ) -{ - /* Set all bits in mfIntercept to 1 (that is -1.#NAN) to indicate that - there is no interception point. Cannot use ::rtl::math::setNan() here - cause it misses the sign bit. */ - sal_math_Double* pDouble = reinterpret_cast< sal_math_Double* >( &mfIntercept ); - pDouble->w32_parts.msw = pDouble->w32_parts.lsw = 0xFFFFFFFF; -} - -// ---------------------------------------------------------------------------- - -XclChSerErrorBar::XclChSerErrorBar() : - mfValue( 0.0 ), - mnValueCount( 1 ), - mnBarType( EXC_CHSERERR_NONE ), - mnSourceType( EXC_CHSERERR_FIXED ), - mnLineEnd( EXC_CHSERERR_END_TSHAPE ) -{ -} - -// ---------------------------------------------------------------------------- - -XclChSeries::XclChSeries() : - mnCategType( EXC_CHSERIES_NUMERIC ), - mnValueType( EXC_CHSERIES_NUMERIC ), - mnBubbleType( EXC_CHSERIES_NUMERIC ), - mnCategCount( 0 ), - mnValueCount( 0 ), - mnBubbleCount( 0 ) -{ -} - -// Chart type groups ========================================================== - -XclChType::XclChType() : - mnOverlap( 0 ), - mnGap( 150 ), - mnRotation( 0 ), - mnPieHole( 0 ), - mnBubbleSize( 100 ), - mnBubbleType( EXC_CHSCATTER_AREA ), - mnFlags( 0 ) -{ -} - -// ---------------------------------------------------------------------------- - -XclChChart3d::XclChChart3d() : - mnRotation( 20 ), - mnElevation( 15 ), - mnEyeDist( 30 ), - mnRelHeight( 100 ), - mnRelDepth( 100 ), - mnDepthGap( 150 ), - mnFlags( EXC_CHCHART3D_AUTOHEIGHT ) -{ -} - -// ---------------------------------------------------------------------------- - -XclChLegend::XclChLegend() : - mnDockMode( EXC_CHLEGEND_RIGHT ), - mnSpacing( EXC_CHLEGEND_MEDIUM ), - mnFlags( EXC_CHLEGEND_DOCKED | EXC_CHLEGEND_AUTOSERIES | - EXC_CHLEGEND_AUTOPOSX | EXC_CHLEGEND_AUTOPOSY | EXC_CHLEGEND_STACKED ) -{ -} - -// ---------------------------------------------------------------------------- - -XclChTypeGroup::XclChTypeGroup() : - mnFlags( 0 ), - mnGroupIdx( EXC_CHSERGROUP_NONE ) -{ -} - -// ---------------------------------------------------------------------------- - -XclChProperties::XclChProperties() : - mnFlags( 0 ), - mnEmptyMode( EXC_CHPROPS_EMPTY_SKIP ) -{ -} - -// Axes ======================================================================= - -XclChLabelRange::XclChLabelRange() : - mnCross( 1 ), - mnLabelFreq( 1 ), - mnTickFreq( 1 ), - mnFlags( 0 ) -{ -} - -// ---------------------------------------------------------------------------- - -XclChDateRange::XclChDateRange() : - mnMinDate( 0 ), - mnMaxDate( 0 ), - mnMajorStep( 0 ), - mnMajorUnit( EXC_CHDATERANGE_DAYS ), - mnMinorStep( 0 ), - mnMinorUnit( EXC_CHDATERANGE_DAYS ), - mnBaseUnit( EXC_CHDATERANGE_DAYS ), - mnCross( 0 ), - mnFlags( EXC_CHDATERANGE_AUTOMIN | EXC_CHDATERANGE_AUTOMAX | - EXC_CHDATERANGE_AUTOMAJOR | EXC_CHDATERANGE_AUTOMINOR | - EXC_CHDATERANGE_AUTOBASE | EXC_CHDATERANGE_AUTOCROSS | - EXC_CHDATERANGE_AUTODATE ) -{ -} - -// ---------------------------------------------------------------------------- - -XclChValueRange::XclChValueRange() : - mfMin( 0.0 ), - mfMax( 0.0 ), - mfMajorStep( 0.0 ), - mfMinorStep( 0.0 ), - mfCross( 0.0 ), - mnFlags( EXC_CHVALUERANGE_AUTOMIN | EXC_CHVALUERANGE_AUTOMAX | - EXC_CHVALUERANGE_AUTOMAJOR | EXC_CHVALUERANGE_AUTOMINOR | - EXC_CHVALUERANGE_AUTOCROSS | EXC_CHVALUERANGE_BIT8 ) -{ -} - -// ---------------------------------------------------------------------------- - -XclChTick::XclChTick() : - maTextColor( COL_BLACK ), - mnMajor( EXC_CHTICK_INSIDE | EXC_CHTICK_OUTSIDE ), - mnMinor( 0 ), - mnLabelPos( EXC_CHTICK_NEXT ), - mnBackMode( EXC_CHTICK_TRANSPARENT ), - mnFlags( EXC_CHTICK_AUTOCOLOR | EXC_CHTICK_AUTOROT ), - mnRotation( EXC_ROT_NONE ) -{ -} - -// ---------------------------------------------------------------------------- - -XclChAxis::XclChAxis() : - mnType( EXC_CHAXIS_NONE ) -{ -} - -sal_Int32 XclChAxis::GetApiAxisDimension() const -{ - sal_Int32 nApiAxisDim = EXC_CHART_AXIS_NONE; - switch( mnType ) - { - case EXC_CHAXIS_X: nApiAxisDim = EXC_CHART_AXIS_X; break; - case EXC_CHAXIS_Y: nApiAxisDim = EXC_CHART_AXIS_Y; break; - case EXC_CHAXIS_Z: nApiAxisDim = EXC_CHART_AXIS_Z; break; - } - return nApiAxisDim; -} - -// ---------------------------------------------------------------------------- - -XclChAxesSet::XclChAxesSet() : - mnAxesSetId( EXC_CHAXESSET_PRIMARY ) -{ -} - -sal_Int32 XclChAxesSet::GetApiAxesSetIndex() const -{ - sal_Int32 nApiAxesSetIdx = EXC_CHART_AXESSET_NONE; - switch( mnAxesSetId ) - { - case EXC_CHAXESSET_PRIMARY: nApiAxesSetIdx = EXC_CHART_AXESSET_PRIMARY; break; - case EXC_CHAXESSET_SECONDARY: nApiAxesSetIdx = EXC_CHART_AXESSET_SECONDARY; break; - } - return nApiAxesSetIdx; -} - -// Static helper functions ==================================================== - -sal_uInt16 XclChartHelper::GetSeriesLineAutoColorIdx( sal_uInt16 nFormatIdx ) -{ - static const sal_uInt16 spnLineColors[] = - { - 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 8, - 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 63 - }; - return spnLineColors[ nFormatIdx % SAL_N_ELEMENTS( spnLineColors ) ]; -} - -sal_uInt16 XclChartHelper::GetSeriesFillAutoColorIdx( sal_uInt16 nFormatIdx ) -{ - static const sal_uInt16 spnFillColors[] = - { - 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, - 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23 - }; - return spnFillColors[ nFormatIdx % SAL_N_ELEMENTS( spnFillColors ) ]; -} - -sal_uInt8 XclChartHelper::GetSeriesFillAutoTransp( sal_uInt16 nFormatIdx ) -{ - static const sal_uInt8 spnTrans[] = { 0x00, 0x40, 0x20, 0x60, 0x70 }; - return spnTrans[ (nFormatIdx / 56) % SAL_N_ELEMENTS( spnTrans ) ]; -} - -sal_uInt16 XclChartHelper::GetAutoMarkerType( sal_uInt16 nFormatIdx ) -{ - static const sal_uInt16 spnSymbols[] = { - EXC_CHMARKERFORMAT_DIAMOND, EXC_CHMARKERFORMAT_SQUARE, EXC_CHMARKERFORMAT_TRIANGLE, - EXC_CHMARKERFORMAT_CROSS, EXC_CHMARKERFORMAT_STAR, EXC_CHMARKERFORMAT_CIRCLE, - EXC_CHMARKERFORMAT_PLUS, EXC_CHMARKERFORMAT_DOWJ, EXC_CHMARKERFORMAT_STDDEV }; - return spnSymbols[ nFormatIdx % SAL_N_ELEMENTS( spnSymbols ) ]; -} - -bool XclChartHelper::HasMarkerFillColor( sal_uInt16 nMarkerType ) -{ - static const bool spbFilled[] = { - false, true, true, true, false, false, false, false, true, false }; - return (nMarkerType < SAL_N_ELEMENTS( spbFilled )) && spbFilled[ nMarkerType ]; -} - -OUString XclChartHelper::GetErrorBarValuesRole( sal_uInt8 nBarType ) -{ - switch( nBarType ) - { - case EXC_CHSERERR_XPLUS: return EXC_CHPROP_ROLE_ERRORBARS_POSX; - case EXC_CHSERERR_XMINUS: return EXC_CHPROP_ROLE_ERRORBARS_NEGX; - case EXC_CHSERERR_YPLUS: return EXC_CHPROP_ROLE_ERRORBARS_POSY; - case EXC_CHSERERR_YMINUS: return EXC_CHPROP_ROLE_ERRORBARS_NEGY; - default: OSL_FAIL( "XclChartHelper::GetErrorBarValuesRole - unknown bar type" ); - } - return OUString(); -} - -// Chart formatting info provider ============================================= - -namespace { - -static const XclChFormatInfo spFmtInfos[] = -{ - // object type property mode auto line color auto line weight auto pattern color missing frame type create delete isframe - { EXC_CHOBJTYPE_BACKGROUND, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, true, true, true }, - { EXC_CHOBJTYPE_PLOTFRAME, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, true, true, true }, - { EXC_CHOBJTYPE_WALL3D, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_AUTO, true, false, true }, - { EXC_CHOBJTYPE_FLOOR3D, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, 23, EXC_CHFRAMETYPE_AUTO, true, false, true }, - { EXC_CHOBJTYPE_TEXT, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, false, true, true }, - { EXC_CHOBJTYPE_LEGEND, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_AUTO, true, true, true }, - { EXC_CHOBJTYPE_LINEARSERIES, EXC_CHPROPMODE_LINEARSERIES, 0xFFFF, EXC_CHLINEFORMAT_SINGLE, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_AUTO, false, false, false }, - { EXC_CHOBJTYPE_FILLEDSERIES, EXC_CHPROPMODE_FILLEDSERIES, EXC_COLOR_CHBORDERAUTO, EXC_CHLINEFORMAT_SINGLE, 0xFFFF, EXC_CHFRAMETYPE_AUTO, false, false, true }, - { EXC_CHOBJTYPE_AXISLINE, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_AUTO, false, false, false }, - { EXC_CHOBJTYPE_GRIDLINE, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, false, true, false }, - { EXC_CHOBJTYPE_TRENDLINE, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_DOUBLE, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, false, false, false }, - { EXC_CHOBJTYPE_ERRORBAR, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_SINGLE, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, false, false, false }, - { EXC_CHOBJTYPE_CONNECTLINE, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, false, false, false }, - { EXC_CHOBJTYPE_HILOLINE, EXC_CHPROPMODE_LINEARSERIES, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, false, false, false }, - { EXC_CHOBJTYPE_WHITEDROPBAR, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, false, false, true }, - { EXC_CHOBJTYPE_BLACKDROPBAR, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWTEXT, EXC_CHFRAMETYPE_INVISIBLE, false, false, true } -}; - -} - -// ---------------------------------------------------------------------------- - -XclChFormatInfoProvider::XclChFormatInfoProvider() -{ - const XclChFormatInfo* pEnd = STATIC_TABLE_END( spFmtInfos ); - for( const XclChFormatInfo* pIt = spFmtInfos; pIt != pEnd; ++pIt ) - maInfoMap[ pIt->meObjType ] = pIt; -} - -const XclChFormatInfo& XclChFormatInfoProvider::GetFormatInfo( XclChObjectType eObjType ) const -{ - XclFmtInfoMap::const_iterator aIt = maInfoMap.find( eObjType ); - OSL_ENSURE( aIt != maInfoMap.end(), "XclChFormatInfoProvider::GetFormatInfo - unknown object type" ); - return (aIt == maInfoMap.end()) ? *spFmtInfos : *aIt->second; -} - -// Chart type info provider =================================================== - -namespace { - -// chart type service names -const sal_Char SERVICE_CHART2_AREA[] = "com.sun.star.chart2.AreaChartType"; -const sal_Char SERVICE_CHART2_CANDLE[] = "com.sun.star.chart2.CandleStickChartType"; -const sal_Char SERVICE_CHART2_COLUMN[] = "com.sun.star.chart2.ColumnChartType"; -const sal_Char SERVICE_CHART2_LINE[] = "com.sun.star.chart2.LineChartType"; -const sal_Char SERVICE_CHART2_NET[] = "com.sun.star.chart2.NetChartType"; -const sal_Char SERVICE_CHART2_FILLEDNET[] = "com.sun.star.chart2.FilledNetChartType"; -const sal_Char SERVICE_CHART2_PIE[] = "com.sun.star.chart2.PieChartType"; -const sal_Char SERVICE_CHART2_SCATTER[] = "com.sun.star.chart2.ScatterChartType"; -const sal_Char SERVICE_CHART2_BUBBLE[] = "com.sun.star.chart2.BubbleChartType"; -const sal_Char SERVICE_CHART2_SURFACE[] = "com.sun.star.chart2.ColumnChartType"; // Todo - -namespace csscd = cssc::DataLabelPlacement; - -static const XclChTypeInfo spTypeInfos[] = -{ - // chart type chart type category record id service varied point color def label pos comb2d 3d polar area2d area3d 1stvis xcateg swap stack revers betw - { EXC_CHTYPEID_BAR, EXC_CHTYPECATEG_BAR, EXC_ID_CHBAR, SERVICE_CHART2_COLUMN, EXC_CHVARPOINT_SINGLE, csscd::OUTSIDE, true, true, false, true, true, false, true, false, true, false, true }, - { EXC_CHTYPEID_HORBAR, EXC_CHTYPECATEG_BAR, EXC_ID_CHBAR, SERVICE_CHART2_COLUMN, EXC_CHVARPOINT_SINGLE, csscd::OUTSIDE, false, true, false, true, true, false, true, true, true, false, true }, - { EXC_CHTYPEID_LINE, EXC_CHTYPECATEG_LINE, EXC_ID_CHLINE, SERVICE_CHART2_LINE, EXC_CHVARPOINT_SINGLE, csscd::RIGHT, true, true, false, false, true, false, true, false, true, false, false }, - { EXC_CHTYPEID_AREA, EXC_CHTYPECATEG_LINE, EXC_ID_CHAREA, SERVICE_CHART2_AREA, EXC_CHVARPOINT_NONE, csscd::CENTER, true, true, false, true, true, false, true, false, true, true, false }, - { EXC_CHTYPEID_STOCK, EXC_CHTYPECATEG_LINE, EXC_ID_CHLINE, SERVICE_CHART2_CANDLE, EXC_CHVARPOINT_NONE, csscd::RIGHT, true, false, false, false, false, false, true, false, true, false, false }, - { EXC_CHTYPEID_RADARLINE, EXC_CHTYPECATEG_RADAR, EXC_ID_CHRADARLINE, SERVICE_CHART2_NET, EXC_CHVARPOINT_SINGLE, csscd::TOP, false, false, true, false, true, false, true, false, false, false, false }, - { EXC_CHTYPEID_RADARAREA, EXC_CHTYPECATEG_RADAR, EXC_ID_CHRADARAREA, SERVICE_CHART2_FILLEDNET, EXC_CHVARPOINT_NONE, csscd::TOP, false, false, true, true, true, false, true, false, false, true, false }, - { EXC_CHTYPEID_PIE, EXC_CHTYPECATEG_PIE, EXC_ID_CHPIE, SERVICE_CHART2_PIE, EXC_CHVARPOINT_MULTI, csscd::AVOID_OVERLAP, false, true, true, true, true, true, true, false, false, false, false }, - { EXC_CHTYPEID_DONUT, EXC_CHTYPECATEG_PIE, EXC_ID_CHPIE, SERVICE_CHART2_PIE, EXC_CHVARPOINT_MULTI, csscd::AVOID_OVERLAP, false, true, true, true, true, false, true, false, false, true, false }, - { EXC_CHTYPEID_PIEEXT, EXC_CHTYPECATEG_PIE, EXC_ID_CHPIEEXT, SERVICE_CHART2_PIE, EXC_CHVARPOINT_MULTI, csscd::AVOID_OVERLAP, false, false, true, true, true, true, true, false, false, false, false }, - { EXC_CHTYPEID_SCATTER, EXC_CHTYPECATEG_SCATTER, EXC_ID_CHSCATTER, SERVICE_CHART2_SCATTER, EXC_CHVARPOINT_SINGLE, csscd::RIGHT, true, false, false, false, true, false, false, false, false, false, false }, - { EXC_CHTYPEID_BUBBLES, EXC_CHTYPECATEG_SCATTER, EXC_ID_CHSCATTER, SERVICE_CHART2_BUBBLE, EXC_CHVARPOINT_SINGLE, csscd::RIGHT, false, false, false, true, true, false, false, false, false, false, false }, - { EXC_CHTYPEID_SURFACE, EXC_CHTYPECATEG_SURFACE, EXC_ID_CHSURFACE, SERVICE_CHART2_SURFACE, EXC_CHVARPOINT_NONE, csscd::RIGHT, false, true, false, true, true, false, true, false, false, false, false }, - { EXC_CHTYPEID_UNKNOWN, EXC_CHTYPECATEG_BAR, EXC_ID_CHBAR, SERVICE_CHART2_COLUMN, EXC_CHVARPOINT_SINGLE, csscd::OUTSIDE, true, true, false, true, true, false, true, false, true, false, true } -}; - -} // namespace - -XclChExtTypeInfo::XclChExtTypeInfo( const XclChTypeInfo& rTypeInfo ) : - XclChTypeInfo( rTypeInfo ), - mb3dChart( false ), - mbSpline( false ) -{ -} - -void XclChExtTypeInfo::Set( const XclChTypeInfo& rTypeInfo, bool b3dChart, bool bSpline ) -{ - static_cast< XclChTypeInfo& >( *this ) = rTypeInfo; - mb3dChart = mbSupports3d && b3dChart; - mbSpline = bSpline; -} - -// ---------------------------------------------------------------------------- - -XclChTypeInfoProvider::XclChTypeInfoProvider() -{ - const XclChTypeInfo* pEnd = STATIC_TABLE_END( spTypeInfos ); - for( const XclChTypeInfo* pIt = spTypeInfos; pIt != pEnd; ++pIt ) - maInfoMap[ pIt->meTypeId ] = pIt; -} - -const XclChTypeInfo& XclChTypeInfoProvider::GetTypeInfo( XclChTypeId eTypeId ) const -{ - XclChTypeInfoMap::const_iterator aIt = maInfoMap.find( eTypeId ); - OSL_ENSURE( aIt != maInfoMap.end(), "XclChTypeInfoProvider::GetTypeInfo - unknown chart type" ); - return (aIt == maInfoMap.end()) ? *maInfoMap.rbegin()->second : *aIt->second; -} - -const XclChTypeInfo& XclChTypeInfoProvider::GetTypeInfoFromRecId( sal_uInt16 nRecId ) const -{ - const XclChTypeInfo* pEnd = STATIC_TABLE_END( spTypeInfos ); - for( const XclChTypeInfo* pIt = spTypeInfos; pIt != pEnd; ++pIt ) - if( pIt->mnRecId == nRecId ) - return *pIt; - OSL_FAIL( "XclChTypeInfoProvider::GetTypeInfoFromRecId - unknown record id" ); - return GetTypeInfo( EXC_CHTYPEID_UNKNOWN ); -} - -const XclChTypeInfo& XclChTypeInfoProvider::GetTypeInfoFromService( const OUString& rServiceName ) const -{ - const XclChTypeInfo* pEnd = STATIC_TABLE_END( spTypeInfos ); - for( const XclChTypeInfo* pIt = spTypeInfos; pIt != pEnd; ++pIt ) - if( rServiceName.equalsAscii( pIt->mpcServiceName ) ) - return *pIt; - OSL_FAIL( "XclChTypeInfoProvider::GetTypeInfoFromService - unknown service name" ); - return GetTypeInfo( EXC_CHTYPEID_UNKNOWN ); -} - -// Property helpers =========================================================== - -XclChObjectTable::XclChObjectTable( Reference< XMultiServiceFactory > xFactory, - const OUString& rServiceName, const OUString& rObjNameBase ) : - mxFactory( xFactory ), - maServiceName( rServiceName ), - maObjNameBase( rObjNameBase ), - mnIndex( 0 ) -{ -} - -Any XclChObjectTable::GetObject( const OUString& rObjName ) -{ - // get object table - if( !mxContainer.is() ) - mxContainer.set( ScfApiHelper::CreateInstance( mxFactory, maServiceName ), UNO_QUERY ); - OSL_ENSURE( mxContainer.is(), "XclChObjectTable::GetObject - container not found" ); - - Any aObj; - if( mxContainer.is() ) - { - // get object from container - try - { - aObj = mxContainer->getByName( rObjName ); - } - catch( Exception& ) - { - OSL_FAIL( "XclChObjectTable::GetObject - object not found" ); - } - } - return aObj; -} - -OUString XclChObjectTable::InsertObject( const Any& rObj ) -{ - - // create object table - if( !mxContainer.is() ) - mxContainer.set( ScfApiHelper::CreateInstance( mxFactory, maServiceName ), UNO_QUERY ); - OSL_ENSURE( mxContainer.is(), "XclChObjectTable::InsertObject - container not found" ); - - OUString aObjName; - if( mxContainer.is() ) - { - // create new unused identifier - do - { - aObjName = maObjNameBase + OUString::valueOf( ++mnIndex ); - } - while( mxContainer->hasByName( aObjName ) ); - - // insert object - try - { - mxContainer->insertByName( aObjName, rObj ); - } - catch( Exception& ) - { - OSL_FAIL( "XclChObjectTable::InsertObject - cannot insert object" ); - aObjName = OUString(); - } - } - return aObjName; -} - -// Property names ------------------------------------------------------------- - -namespace { - -/** Property names for line style in common objects. */ -const sal_Char* const sppcLineNamesCommon[] = - { "LineStyle", "LineWidth", "LineColor", "LineTransparence", "LineDashName", 0 }; -/** Property names for line style in linear series objects. */ -const sal_Char* const sppcLineNamesLinear[] = - { "LineStyle", "LineWidth", "Color", "Transparency", "LineDashName", 0 }; -/** Property names for line style in filled series objects. */ -const sal_Char* const sppcLineNamesFilled[] = - { "BorderStyle", "BorderWidth", "BorderColor", "BorderTransparency", "BorderDashName", 0 }; - -/** Property names for solid area style in common objects. */ -const sal_Char* const sppcAreaNamesCommon[] = { "FillStyle", "FillColor", "FillTransparence", 0 }; -/** Property names for solid area style in filled series objects. */ -const sal_Char* const sppcAreaNamesFilled[] = { "FillStyle", "Color", "Transparency", 0 }; -/** Property names for gradient area style in common objects. */ -const sal_Char* const sppcGradNamesCommon[] = { "FillStyle", "FillGradientName", 0 }; -/** Property names for gradient area style in filled series objects. */ -const sal_Char* const sppcGradNamesFilled[] = { "FillStyle", "GradientName", 0 }; -/** Property names for hatch area style in common objects. */ -const sal_Char* const sppcHatchNamesCommon[] = { "FillStyle", "FillHatchName", "FillColor", "FillBackground", 0 }; -/** Property names for hatch area style in filled series objects. */ -const sal_Char* const sppcHatchNamesFilled[] = { "FillStyle", "HatchName", "Color", "FillBackground", 0 }; -/** Property names for bitmap area style. */ -const sal_Char* const sppcBitmapNames[] = { "FillStyle", "FillBitmapName", "FillBitmapMode", 0 }; - -} // namespace - -// ---------------------------------------------------------------------------- - -XclChPropSetHelper::XclChPropSetHelper() : - maLineHlpCommon( sppcLineNamesCommon ), - maLineHlpLinear( sppcLineNamesLinear ), - maLineHlpFilled( sppcLineNamesFilled ), - maAreaHlpCommon( sppcAreaNamesCommon ), - maAreaHlpFilled( sppcAreaNamesFilled ), - maGradHlpCommon( sppcGradNamesCommon ), - maGradHlpFilled( sppcGradNamesFilled ), - maHatchHlpCommon( sppcHatchNamesCommon ), - maHatchHlpFilled( sppcHatchNamesFilled ), - maBitmapHlp( sppcBitmapNames ) -{ -} - -// read properties ------------------------------------------------------------ - -void XclChPropSetHelper::ReadLineProperties( - XclChLineFormat& rLineFmt, XclChObjectTable& rDashTable, - const ScfPropertySet& rPropSet, XclChPropertyMode ePropMode ) -{ - namespace cssd = ::com::sun::star::drawing; - - // read properties from property set - cssd::LineStyle eApiStyle = cssd::LineStyle_NONE; - sal_Int32 nApiWidth = 0; - sal_Int16 nApiTrans = 0; - Any aDashNameAny; - - ScfPropSetHelper& rLineHlp = GetLineHelper( ePropMode ); - rLineHlp.ReadFromPropertySet( rPropSet ); - rLineHlp >> eApiStyle >> nApiWidth >> rLineFmt.maColor >> nApiTrans >> aDashNameAny; - - // clear automatic flag - ::set_flag( rLineFmt.mnFlags, EXC_CHLINEFORMAT_AUTO, false ); - - // line width - if( nApiWidth <= 0 ) rLineFmt.mnWeight = EXC_CHLINEFORMAT_HAIR; - else if( nApiWidth <= 35 ) rLineFmt.mnWeight = EXC_CHLINEFORMAT_SINGLE; - else if( nApiWidth <= 70 ) rLineFmt.mnWeight = EXC_CHLINEFORMAT_DOUBLE; - else rLineFmt.mnWeight = EXC_CHLINEFORMAT_TRIPLE; - - // line style - switch( eApiStyle ) - { - case cssd::LineStyle_NONE: - rLineFmt.mnPattern = EXC_CHLINEFORMAT_NONE; - break; - case cssd::LineStyle_SOLID: - { - if( nApiTrans < 13 ) rLineFmt.mnPattern = EXC_CHLINEFORMAT_SOLID; - else if( nApiTrans < 38 ) rLineFmt.mnPattern = EXC_CHLINEFORMAT_DARKTRANS; - else if( nApiTrans < 63 ) rLineFmt.mnPattern = EXC_CHLINEFORMAT_MEDTRANS; - else if( nApiTrans < 100 ) rLineFmt.mnPattern = EXC_CHLINEFORMAT_LIGHTTRANS; - else rLineFmt.mnPattern = EXC_CHLINEFORMAT_NONE; - } - break; - case cssd::LineStyle_DASH: - { - rLineFmt.mnPattern = EXC_CHLINEFORMAT_SOLID; - OUString aDashName; - cssd::LineDash aApiDash; - if( (aDashNameAny >>= aDashName) && (rDashTable.GetObject( aDashName ) >>= aApiDash) ) - { - // reorder dashes that are shorter than dots - if( (aApiDash.Dashes == 0) || (aApiDash.DashLen < aApiDash.DotLen) ) - { - ::std::swap( aApiDash.Dashes, aApiDash.Dots ); - ::std::swap( aApiDash.DashLen, aApiDash.DotLen ); - } - // ignore dots that are nearly equal to dashes - if( aApiDash.DotLen * 3 > aApiDash.DashLen * 2 ) - aApiDash.Dots = 0; - - // convert line dash to predefined Excel dash types - if( (aApiDash.Dashes == 1) && (aApiDash.Dots >= 1) ) - // one dash and one or more dots - rLineFmt.mnPattern = (aApiDash.Dots == 1) ? - EXC_CHLINEFORMAT_DASHDOT : EXC_CHLINEFORMAT_DASHDOTDOT; - else if( aApiDash.Dashes >= 1 ) - // one or more dashes and no dots (also: dash-dash-dot) - rLineFmt.mnPattern = (aApiDash.DashLen < 250) ? - EXC_CHLINEFORMAT_DOT : EXC_CHLINEFORMAT_DASH; - } - } - break; - default: - OSL_FAIL( "XclChPropSetHelper::ReadLineProperties - unknown line style" ); - rLineFmt.mnPattern = EXC_CHLINEFORMAT_SOLID; - } -} - -bool XclChPropSetHelper::ReadAreaProperties( XclChAreaFormat& rAreaFmt, - const ScfPropertySet& rPropSet, XclChPropertyMode ePropMode ) -{ - namespace cssd = ::com::sun::star::drawing; - - // read properties from property set - cssd::FillStyle eApiStyle = cssd::FillStyle_NONE; - sal_Int16 nTransparency = 0; - - ScfPropSetHelper& rAreaHlp = GetAreaHelper( ePropMode ); - rAreaHlp.ReadFromPropertySet( rPropSet ); - rAreaHlp >> eApiStyle >> rAreaFmt.maPattColor >> nTransparency; - - // clear automatic flag - ::set_flag( rAreaFmt.mnFlags, EXC_CHAREAFORMAT_AUTO, false ); - - // set fill style transparent or solid (set solid for anything but transparent) - rAreaFmt.mnPattern = (eApiStyle == cssd::FillStyle_NONE) ? EXC_PATT_NONE : EXC_PATT_SOLID; - - // return true to indicate complex fill (gradient, bitmap, solid transparency) - return (eApiStyle != cssd::FillStyle_NONE) && ((eApiStyle != cssd::FillStyle_SOLID) || (nTransparency > 0)); -} - -void XclChPropSetHelper::ReadEscherProperties( - XclChEscherFormat& rEscherFmt, XclChPicFormat& rPicFmt, - XclChObjectTable& rGradientTable, XclChObjectTable& rHatchTable, XclChObjectTable& rBitmapTable, - const ScfPropertySet& rPropSet, XclChPropertyMode ePropMode ) -{ - namespace cssd = ::com::sun::star::drawing; - namespace cssa = ::com::sun::star::awt; - - // read style and transparency properties from property set - cssd::FillStyle eApiStyle = cssd::FillStyle_NONE; - Color aColor; - sal_Int16 nTransparency = 0; - - ScfPropSetHelper& rAreaHlp = GetAreaHelper( ePropMode ); - rAreaHlp.ReadFromPropertySet( rPropSet ); - rAreaHlp >> eApiStyle >> aColor >> nTransparency; - - switch( eApiStyle ) - { - case cssd::FillStyle_SOLID: - { - OSL_ENSURE( nTransparency > 0, "XclChPropSetHelper::ReadEscherProperties - unexpected solid area without transparency" ); - if( (0 < nTransparency) && (nTransparency <= 100) ) - { - // convert to Escher properties - sal_uInt32 nEscherColor = 0x02000000; - ::insert_value( nEscherColor, aColor.GetBlue(), 16, 8 ); - ::insert_value( nEscherColor, aColor.GetGreen(), 8, 8 ); - ::insert_value( nEscherColor, aColor.GetRed(), 0, 8 ); - sal_uInt32 nEscherOpacity = static_cast< sal_uInt32 >( (100 - nTransparency) * 655.36 ); - rEscherFmt.mxEscherSet.reset( new EscherPropertyContainer ); - rEscherFmt.mxEscherSet->AddOpt( ESCHER_Prop_fillType, ESCHER_FillSolid ); - rEscherFmt.mxEscherSet->AddOpt( ESCHER_Prop_fillColor, nEscherColor ); - rEscherFmt.mxEscherSet->AddOpt( ESCHER_Prop_fillOpacity, nEscherOpacity ); - rEscherFmt.mxEscherSet->AddOpt( ESCHER_Prop_fillBackColor, 0x02FFFFFF ); - rEscherFmt.mxEscherSet->AddOpt( ESCHER_Prop_fillBackOpacity, 0x00010000 ); - rEscherFmt.mxEscherSet->AddOpt( ESCHER_Prop_fNoFillHitTest, 0x001F001C ); - } - } - break; - case cssd::FillStyle_GRADIENT: - { - // extract gradient from global gradient table - OUString aGradientName; - ScfPropSetHelper& rGradHlp = GetGradientHelper( ePropMode ); - rGradHlp.ReadFromPropertySet( rPropSet ); - rGradHlp >> eApiStyle >> aGradientName; - cssa::Gradient aGradient; - if( rGradientTable.GetObject( aGradientName ) >>= aGradient ) - { - // convert to Escher properties - rEscherFmt.mxEscherSet.reset( new EscherPropertyContainer ); - rEscherFmt.mxEscherSet->CreateGradientProperties( aGradient ); - } - } - break; - case cssd::FillStyle_HATCH: - { - // extract hatch from global hatch table - OUString aHatchName; - bool bFillBackground; - ScfPropSetHelper& rHatchHlp = GetHatchHelper( ePropMode ); - rHatchHlp.ReadFromPropertySet( rPropSet ); - rHatchHlp >> eApiStyle >> aHatchName >> aColor >> bFillBackground; - cssd::Hatch aHatch; - if( rHatchTable.GetObject( aHatchName ) >>= aHatch ) - { - // convert to Escher properties - rEscherFmt.mxEscherSet.reset( new EscherPropertyContainer ); - rEscherFmt.mxEscherSet->CreateEmbeddedHatchProperties( aHatch, aColor, bFillBackground ); - rPicFmt.mnBmpMode = EXC_CHPICFORMAT_STACK; - } - } - break; - case cssd::FillStyle_BITMAP: - { - // extract bitmap URL from global bitmap table - OUString aBitmapName; - cssd::BitmapMode eApiBmpMode; - maBitmapHlp.ReadFromPropertySet( rPropSet ); - maBitmapHlp >> eApiStyle >> aBitmapName >> eApiBmpMode; - OUString aBitmapUrl; - if( rBitmapTable.GetObject( aBitmapName ) >>= aBitmapUrl ) - { - // convert to Escher properties - rEscherFmt.mxEscherSet.reset( new EscherPropertyContainer ); - rEscherFmt.mxEscherSet->CreateEmbeddedBitmapProperties( aBitmapUrl, eApiBmpMode ); - rPicFmt.mnBmpMode = (eApiBmpMode == cssd::BitmapMode_REPEAT) ? - EXC_CHPICFORMAT_STACK : EXC_CHPICFORMAT_STRETCH; - } - } - break; - default: - OSL_FAIL( "XclChPropSetHelper::ReadEscherProperties - unknown fill style" ); - } -} - -void XclChPropSetHelper::ReadMarkerProperties( - XclChMarkerFormat& rMarkerFmt, const ScfPropertySet& rPropSet, sal_uInt16 nFormatIdx ) -{ - namespace cssc = ::com::sun::star::chart2; - namespace cssa = ::com::sun::star::awt; - cssc::Symbol aApiSymbol; - if( rPropSet.GetProperty( aApiSymbol, EXC_CHPROP_SYMBOL ) ) - { - // clear automatic flag - ::set_flag( rMarkerFmt.mnFlags, EXC_CHMARKERFORMAT_AUTO, false ); - - // symbol style - switch( aApiSymbol.Style ) - { - case cssc::SymbolStyle_NONE: - rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_NOSYMBOL; - break; - case cssc::SymbolStyle_STANDARD: - switch( aApiSymbol.StandardSymbol ) - { - case 0: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_SQUARE; break; // square - case 1: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_DIAMOND; break; // diamond - case 2: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_STDDEV; break; // arrow down - case 3: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_TRIANGLE; break; // arrow up - case 4: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_CIRCLE; break; // arrow right - case 5: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_PLUS; break; // arrow left - case 6: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_CROSS; break; // bow tie - case 7: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_STAR; break; // sand glass - default: rMarkerFmt.mnMarkerType = XclChartHelper::GetAutoMarkerType( nFormatIdx ); - } - break; - default: - rMarkerFmt.mnMarkerType = XclChartHelper::GetAutoMarkerType( nFormatIdx ); - } - bool bHasFillColor = XclChartHelper::HasMarkerFillColor( rMarkerFmt.mnMarkerType ); - ::set_flag( rMarkerFmt.mnFlags, EXC_CHMARKERFORMAT_NOFILL, !bHasFillColor ); - - // symbol size - sal_Int32 nApiSize = (aApiSymbol.Size.Width + aApiSymbol.Size.Height + 1) / 2; - rMarkerFmt.mnMarkerSize = XclTools::GetTwipsFromHmm( nApiSize ); - - // symbol colors - rMarkerFmt.maLineColor = ScfApiHelper::ConvertFromApiColor( aApiSymbol.BorderColor ); - rMarkerFmt.maFillColor = ScfApiHelper::ConvertFromApiColor( aApiSymbol.FillColor ); - } -} - -sal_uInt16 XclChPropSetHelper::ReadRotationProperties( const ScfPropertySet& rPropSet, bool bSupportsStacked ) -{ - // chart2 handles rotation as double in the range [0,360) - double fAngle = 0.0; - rPropSet.GetProperty( fAngle, EXC_CHPROP_TEXTROTATION ); - bool bStacked = bSupportsStacked && rPropSet.GetBoolProperty( EXC_CHPROP_STACKCHARACTERS ); - return bStacked ? EXC_ROT_STACKED : - XclTools::GetXclRotation( static_cast< sal_Int32 >( fAngle * 100.0 + 0.5 ) ); -} - -// write properties ----------------------------------------------------------- - -void XclChPropSetHelper::WriteLineProperties( - ScfPropertySet& rPropSet, XclChObjectTable& rDashTable, - const XclChLineFormat& rLineFmt, XclChPropertyMode ePropMode ) -{ - namespace cssd = ::com::sun::star::drawing; - - // line width - sal_Int32 nApiWidth = 0; // 0 is the width of a hair line - switch( rLineFmt.mnWeight ) - { - case EXC_CHLINEFORMAT_SINGLE: nApiWidth = 35; break; - case EXC_CHLINEFORMAT_DOUBLE: nApiWidth = 70; break; - case EXC_CHLINEFORMAT_TRIPLE: nApiWidth = 105; break; - } - - // line style - cssd::LineStyle eApiStyle = cssd::LineStyle_NONE; - sal_Int16 nApiTrans = 0; - sal_Int32 nDotLen = ::std::min< sal_Int32 >( rLineFmt.mnWeight + 105, 210 ); - cssd::LineDash aApiDash( cssd::DashStyle_RECT, 0, nDotLen, 0, 4 * nDotLen, nDotLen ); - - switch( rLineFmt.mnPattern ) - { - case EXC_CHLINEFORMAT_SOLID: - eApiStyle = cssd::LineStyle_SOLID; - break; - case EXC_CHLINEFORMAT_DARKTRANS: - eApiStyle = cssd::LineStyle_SOLID; nApiTrans = 25; - break; - case EXC_CHLINEFORMAT_MEDTRANS: - eApiStyle = cssd::LineStyle_SOLID; nApiTrans = 50; - break; - case EXC_CHLINEFORMAT_LIGHTTRANS: - eApiStyle = cssd::LineStyle_SOLID; nApiTrans = 75; - break; - case EXC_CHLINEFORMAT_DASH: - eApiStyle = cssd::LineStyle_DASH; aApiDash.Dashes = 1; - break; - case EXC_CHLINEFORMAT_DOT: - eApiStyle = cssd::LineStyle_DASH; aApiDash.Dots = 1; - break; - case EXC_CHLINEFORMAT_DASHDOT: - eApiStyle = cssd::LineStyle_DASH; aApiDash.Dashes = aApiDash.Dots = 1; - break; - case EXC_CHLINEFORMAT_DASHDOTDOT: - eApiStyle = cssd::LineStyle_DASH; aApiDash.Dashes = 1; aApiDash.Dots = 2; - break; - } - - // line color - sal_Int32 nApiColor = ScfApiHelper::ConvertToApiColor( rLineFmt.maColor ); - - // try to insert the dash style and receive its name - Any aDashNameAny; - if( eApiStyle == cssd::LineStyle_DASH ) - { - OUString aDashName = rDashTable.InsertObject( ::com::sun::star::uno::makeAny( aApiDash ) ); - if( aDashName.getLength() ) - aDashNameAny <<= aDashName; - } - - // write the properties - ScfPropSetHelper& rLineHlp = GetLineHelper( ePropMode ); - rLineHlp.InitializeWrite(); - rLineHlp << eApiStyle << nApiWidth << nApiColor << nApiTrans << aDashNameAny; - rLineHlp.WriteToPropertySet( rPropSet ); -} - -void XclChPropSetHelper::WriteAreaProperties( ScfPropertySet& rPropSet, - const XclChAreaFormat& rAreaFmt, XclChPropertyMode ePropMode ) -{ - namespace cssd = ::com::sun::star::drawing; - cssd::FillStyle eFillStyle = cssd::FillStyle_NONE; - Color aColor; - sal_Int16 nTransparency = 0; - - // fill color - if( rAreaFmt.mnPattern != EXC_PATT_NONE ) - { - eFillStyle = cssd::FillStyle_SOLID; - aColor = XclTools::GetPatternColor( rAreaFmt.maPattColor, rAreaFmt.maBackColor, rAreaFmt.mnPattern ); - } - - // write the properties - ScfPropSetHelper& rAreaHlp = GetAreaHelper( ePropMode ); - rAreaHlp.InitializeWrite(); - rAreaHlp << eFillStyle << aColor << nTransparency; - rAreaHlp.WriteToPropertySet( rPropSet ); -} - -void XclChPropSetHelper::WriteEscherProperties( ScfPropertySet& rPropSet, - XclChObjectTable& rGradientTable, XclChObjectTable& /*rHatchTable*/, XclChObjectTable& rBitmapTable, - const XclChEscherFormat& rEscherFmt, const XclChPicFormat& rPicFmt, - XclChPropertyMode ePropMode ) -{ - if( rEscherFmt.mxItemSet ) - { - if( const XFillStyleItem* pStyleItem = static_cast< const XFillStyleItem* >( rEscherFmt.mxItemSet->GetItem( XATTR_FILLSTYLE, false ) ) ) - { - switch( pStyleItem->GetValue() ) - { - case XFILL_SOLID: - // #i84812# Excel 2007 writes Escher properties for solid fill - if( const XFillColorItem* pColorItem = static_cast< const XFillColorItem* >( rEscherFmt.mxItemSet->GetItem( XATTR_FILLCOLOR, false ) ) ) - { - namespace cssd = ::com::sun::star::drawing; - // get solid transparence too - const XFillTransparenceItem* pTranspItem = static_cast< const XFillTransparenceItem* >( rEscherFmt.mxItemSet->GetItem( XATTR_FILLTRANSPARENCE, false ) ); - sal_uInt16 nTransp = pTranspItem ? pTranspItem->GetValue() : 0; - ScfPropSetHelper& rAreaHlp = GetAreaHelper( ePropMode ); - rAreaHlp.InitializeWrite(); - rAreaHlp << cssd::FillStyle_SOLID << pColorItem->GetColorValue() << static_cast< sal_Int16 >( nTransp ); - rAreaHlp.WriteToPropertySet( rPropSet ); - } - break; - case XFILL_GRADIENT: - if( const XFillGradientItem* pGradItem = static_cast< const XFillGradientItem* >( rEscherFmt.mxItemSet->GetItem( XATTR_FILLGRADIENT, false ) ) ) - { - Any aGradientAny; - if( pGradItem->QueryValue( aGradientAny, MID_FILLGRADIENT ) ) - { - OUString aGradName = rGradientTable.InsertObject( aGradientAny ); - if( aGradName.getLength() ) - { - namespace cssd = ::com::sun::star::drawing; - ScfPropSetHelper& rGradHlp = GetGradientHelper( ePropMode ); - rGradHlp.InitializeWrite(); - rGradHlp << cssd::FillStyle_GRADIENT << aGradName; - rGradHlp.WriteToPropertySet( rPropSet ); - } - } - } - break; - case XFILL_BITMAP: - if( const XFillBitmapItem* pBmpItem = static_cast< const XFillBitmapItem* >( rEscherFmt.mxItemSet->GetItem( XATTR_FILLBITMAP, false ) ) ) - { - Any aBitmapAny; - if( pBmpItem->QueryValue( aBitmapAny, MID_GRAFURL ) ) - { - OUString aBmpName = rBitmapTable.InsertObject( aBitmapAny ); - if( aBmpName.getLength() ) - { - namespace cssd = ::com::sun::star::drawing; - cssd::BitmapMode eApiBmpMode = (rPicFmt.mnBmpMode == EXC_CHPICFORMAT_STRETCH) ? - cssd::BitmapMode_STRETCH : cssd::BitmapMode_REPEAT; - maBitmapHlp.InitializeWrite(); - maBitmapHlp << cssd::FillStyle_BITMAP << aBmpName << eApiBmpMode; - maBitmapHlp.WriteToPropertySet( rPropSet ); - } - } - } - break; - default: - OSL_FAIL( "XclChPropSetHelper::WriteEscherProperties - unknown fill mode" ); - } - } - } -} - -void XclChPropSetHelper::WriteMarkerProperties( - ScfPropertySet& rPropSet, const XclChMarkerFormat& rMarkerFmt ) -{ - namespace cssc = ::com::sun::star::chart2; - namespace cssa = ::com::sun::star::awt; - - // symbol style - cssc::Symbol aApiSymbol; - aApiSymbol.Style = cssc::SymbolStyle_STANDARD; - switch( rMarkerFmt.mnMarkerType ) - { - case EXC_CHMARKERFORMAT_NOSYMBOL: aApiSymbol.Style = cssc::SymbolStyle_NONE; break; - case EXC_CHMARKERFORMAT_SQUARE: aApiSymbol.StandardSymbol = 0; break; // square - case EXC_CHMARKERFORMAT_DIAMOND: aApiSymbol.StandardSymbol = 1; break; // diamond - case EXC_CHMARKERFORMAT_TRIANGLE: aApiSymbol.StandardSymbol = 3; break; // arrow up - case EXC_CHMARKERFORMAT_CROSS: aApiSymbol.StandardSymbol = 6; break; // bow tie - case EXC_CHMARKERFORMAT_STAR: aApiSymbol.StandardSymbol = 7; break; // sand glass - case EXC_CHMARKERFORMAT_DOWJ: aApiSymbol.StandardSymbol = 4; break; // arrow right - case EXC_CHMARKERFORMAT_STDDEV: aApiSymbol.StandardSymbol = 2; break; // arrow down - case EXC_CHMARKERFORMAT_CIRCLE: aApiSymbol.StandardSymbol = 4; break; // arrow right - case EXC_CHMARKERFORMAT_PLUS: aApiSymbol.StandardSymbol = 5; break; // arrow left - } - - // symbol size - sal_Int32 nApiSize = XclTools::GetHmmFromTwips( rMarkerFmt.mnMarkerSize ); - aApiSymbol.Size = cssa::Size( nApiSize, nApiSize ); - - // symbol colors - aApiSymbol.FillColor = ScfApiHelper::ConvertToApiColor( rMarkerFmt.maFillColor ); - aApiSymbol.BorderColor = ::get_flag( rMarkerFmt.mnFlags, EXC_CHMARKERFORMAT_NOLINE ) ? - aApiSymbol.FillColor : ScfApiHelper::ConvertToApiColor( rMarkerFmt.maLineColor ); - - // set the property - rPropSet.SetProperty( EXC_CHPROP_SYMBOL, aApiSymbol ); -} - -void XclChPropSetHelper::WriteRotationProperties( - ScfPropertySet& rPropSet, sal_uInt16 nRotation, bool bSupportsStacked ) -{ - if( nRotation != EXC_CHART_AUTOROTATION ) - { - // chart2 handles rotation as double in the range [0,360) - double fAngle = XclTools::GetScRotation( nRotation, 0 ) / 100.0; - rPropSet.SetProperty( EXC_CHPROP_TEXTROTATION, fAngle ); - if( bSupportsStacked ) - rPropSet.SetProperty( EXC_CHPROP_STACKCHARACTERS, nRotation == EXC_ROT_STACKED ); - } -} - -// private -------------------------------------------------------------------- - -ScfPropSetHelper& XclChPropSetHelper::GetLineHelper( XclChPropertyMode ePropMode ) -{ - switch( ePropMode ) - { - case EXC_CHPROPMODE_COMMON: return maLineHlpCommon; - case EXC_CHPROPMODE_LINEARSERIES: return maLineHlpLinear; - case EXC_CHPROPMODE_FILLEDSERIES: return maLineHlpFilled; - default: OSL_FAIL( "XclChPropSetHelper::GetLineHelper - unknown property mode" ); - } - return maLineHlpCommon; -} - -ScfPropSetHelper& XclChPropSetHelper::GetAreaHelper( XclChPropertyMode ePropMode ) -{ - switch( ePropMode ) - { - case EXC_CHPROPMODE_COMMON: return maAreaHlpCommon; - case EXC_CHPROPMODE_FILLEDSERIES: return maAreaHlpFilled; - default: OSL_FAIL( "XclChPropSetHelper::GetAreaHelper - unknown property mode" ); - } - return maAreaHlpCommon; -} - -ScfPropSetHelper& XclChPropSetHelper::GetGradientHelper( XclChPropertyMode ePropMode ) -{ - switch( ePropMode ) - { - case EXC_CHPROPMODE_COMMON: return maGradHlpCommon; - case EXC_CHPROPMODE_FILLEDSERIES: return maGradHlpFilled; - default: OSL_FAIL( "XclChPropSetHelper::GetGradientHelper - unknown property mode" ); - } - return maGradHlpCommon; -} - -ScfPropSetHelper& XclChPropSetHelper::GetHatchHelper( XclChPropertyMode ePropMode ) -{ - switch( ePropMode ) - { - case EXC_CHPROPMODE_COMMON: return maHatchHlpCommon; - case EXC_CHPROPMODE_FILLEDSERIES: return maHatchHlpFilled; - default: OSL_FAIL( "XclChPropSetHelper::GetHatchHelper - unknown property mode" ); - } - return maHatchHlpCommon; -} - -// ============================================================================ - -namespace { - -/* The following local functions implement getting the XShape interface of all - supported title objects (chart and axes). This needs some effort due to the - design of the old Chart1 API used to access these objects. */ - -/** A code fragment that returns a shape object from the passed shape supplier - using the specified interface function. Checks a boolean property first. */ -#define EXC_FRAGMENT_GETTITLESHAPE( shape_supplier, supplier_func, property_name ) \ - ScfPropertySet aPropSet( shape_supplier ); \ - if( shape_supplier.is() && aPropSet.GetBoolProperty( CREATE_OUSTRING( #property_name ) ) ) \ - return shape_supplier->supplier_func(); \ - return Reference< XShape >(); \ - -/** Implements a function returning the drawing shape of an axis title, if - existing, using the specified API interface and its function. */ -#define EXC_DEFINEFUNC_GETAXISTITLESHAPE( func_name, interface_type, supplier_func, property_name ) \ -Reference< XShape > func_name( const Reference< cssc::XChartDocument >& rxChart1Doc ) \ -{ \ - Reference< cssc::interface_type > xAxisSupp( rxChart1Doc->getDiagram(), UNO_QUERY ); \ - EXC_FRAGMENT_GETTITLESHAPE( xAxisSupp, supplier_func, property_name ) \ -} - -/** Returns the drawing shape of the main title, if existing. */ -Reference< XShape > lclGetMainTitleShape( const Reference< cssc::XChartDocument >& rxChart1Doc ) -{ - EXC_FRAGMENT_GETTITLESHAPE( rxChart1Doc, getTitle, HasMainTitle ) -} - -EXC_DEFINEFUNC_GETAXISTITLESHAPE( lclGetXAxisTitleShape, XAxisXSupplier, getXAxisTitle, HasXAxisTitle ) -EXC_DEFINEFUNC_GETAXISTITLESHAPE( lclGetYAxisTitleShape, XAxisYSupplier, getYAxisTitle, HasYAxisTitle ) -EXC_DEFINEFUNC_GETAXISTITLESHAPE( lclGetZAxisTitleShape, XAxisZSupplier, getZAxisTitle, HasZAxisTitle ) -EXC_DEFINEFUNC_GETAXISTITLESHAPE( lclGetSecXAxisTitleShape, XSecondAxisTitleSupplier, getSecondXAxisTitle, HasSecondaryXAxisTitle ) -EXC_DEFINEFUNC_GETAXISTITLESHAPE( lclGetSecYAxisTitleShape, XSecondAxisTitleSupplier, getSecondYAxisTitle, HasSecondaryYAxisTitle ) - -#undef EXC_DEFINEFUNC_GETAXISTITLESHAPE -#undef EXC_IMPLEMENT_GETTITLESHAPE - -} // namespace - -// ---------------------------------------------------------------------------- - -XclChRootData::XclChRootData() : - mxTypeInfoProv( new XclChTypeInfoProvider ), - mxFmtInfoProv( new XclChFormatInfoProvider ), - mnBorderGapX( 0 ), - mnBorderGapY( 0 ) -{ - // remember some title shape getter functions - maGetShapeFuncs[ XclChTextKey( EXC_CHTEXTTYPE_TITLE ) ] = lclGetMainTitleShape; - maGetShapeFuncs[ XclChTextKey( EXC_CHTEXTTYPE_AXISTITLE, EXC_CHAXESSET_PRIMARY, EXC_CHAXIS_X ) ] = lclGetXAxisTitleShape; - maGetShapeFuncs[ XclChTextKey( EXC_CHTEXTTYPE_AXISTITLE, EXC_CHAXESSET_PRIMARY, EXC_CHAXIS_Y ) ] = lclGetYAxisTitleShape; - maGetShapeFuncs[ XclChTextKey( EXC_CHTEXTTYPE_AXISTITLE, EXC_CHAXESSET_PRIMARY, EXC_CHAXIS_Z ) ] = lclGetZAxisTitleShape; - maGetShapeFuncs[ XclChTextKey( EXC_CHTEXTTYPE_AXISTITLE, EXC_CHAXESSET_SECONDARY, EXC_CHAXIS_X ) ] = lclGetSecXAxisTitleShape; - maGetShapeFuncs[ XclChTextKey( EXC_CHTEXTTYPE_AXISTITLE, EXC_CHAXESSET_SECONDARY, EXC_CHAXIS_Y ) ] = lclGetSecYAxisTitleShape; -} - -XclChRootData::~XclChRootData() -{ -} - -void XclChRootData::InitConversion( const XclRoot& rRoot, const Reference< XChartDocument >& rxChartDoc, const Rectangle& rChartRect ) -{ - // remember chart document reference and chart shape position/size - OSL_ENSURE( rxChartDoc.is(), "XclChRootData::InitConversion - missing chart document" ); - mxChartDoc = rxChartDoc; - maChartRect = rChartRect; - - // Excel excludes a border of 5 pixels in each direction from chart area - mnBorderGapX = rRoot.GetHmmFromPixelX( 5.0 ); - mnBorderGapY = rRoot.GetHmmFromPixelY( 5.0 ); - - // size of a chart unit in 1/100 mm - mfUnitSizeX = ::std::max< double >( maChartRect.GetWidth() - 2 * mnBorderGapX, mnBorderGapX ) / EXC_CHART_TOTALUNITS; - mfUnitSizeY = ::std::max< double >( maChartRect.GetHeight() - 2 * mnBorderGapY, mnBorderGapY ) / EXC_CHART_TOTALUNITS; - - // create object tables - Reference< XMultiServiceFactory > xFactory( mxChartDoc, UNO_QUERY ); - mxLineDashTable.reset( new XclChObjectTable( - xFactory, SERVICE_DRAWING_DASHTABLE, CREATE_OUSTRING( "Excel line dash " ) ) ); - mxGradientTable.reset( new XclChObjectTable( - xFactory, SERVICE_DRAWING_GRADIENTTABLE, CREATE_OUSTRING( "Excel gradient " ) ) ); - mxHatchTable.reset( new XclChObjectTable( - xFactory, SERVICE_DRAWING_HATCHTABLE, CREATE_OUSTRING( "Excel hatch " ) ) ); - mxBitmapTable.reset( new XclChObjectTable( - xFactory, SERVICE_DRAWING_BITMAPTABLE, CREATE_OUSTRING( "Excel bitmap " ) ) ); -} - -void XclChRootData::FinishConversion() -{ - // forget formatting object tables - mxBitmapTable.reset(); - mxHatchTable.reset(); - mxGradientTable.reset(); - mxLineDashTable.reset(); - // forget chart document reference - mxChartDoc.clear(); -} - -Reference< XShape > XclChRootData::GetTitleShape( const XclChTextKey& rTitleKey ) const -{ - XclChGetShapeFuncMap::const_iterator aIt = maGetShapeFuncs.find( rTitleKey ); - OSL_ENSURE( aIt != maGetShapeFuncs.end(), "XclChRootData::GetTitleShape - invalid title key" ); - Reference< cssc::XChartDocument > xChart1Doc( mxChartDoc, UNO_QUERY ); - Reference< XShape > xTitleShape; - if( xChart1Doc.is() && (aIt != maGetShapeFuncs.end()) ) - xTitleShape = (aIt->second)( xChart1Doc ); - return xTitleShape; -} - -// ============================================================================ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |