LCOV - code coverage report
Current view: top level - sc/source/filter/excel - xlchart.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 352 519 67.8 %
Date: 2015-06-13 12:38:46 Functions: 68 80 85.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "xlchart.hxx"
      21             : 
      22             : #include <com/sun/star/container/XNameContainer.hpp>
      23             : #include <com/sun/star/awt/Size.hpp>
      24             : #include <com/sun/star/awt/Gradient.hpp>
      25             : #include <com/sun/star/drawing/Hatch.hpp>
      26             : #include <com/sun/star/drawing/LineDash.hpp>
      27             : #include <com/sun/star/drawing/LineStyle.hpp>
      28             : #include <com/sun/star/drawing/FillStyle.hpp>
      29             : #include <com/sun/star/drawing/BitmapMode.hpp>
      30             : #include <com/sun/star/chart/DataLabelPlacement.hpp>
      31             : #include <com/sun/star/chart/XAxisXSupplier.hpp>
      32             : #include <com/sun/star/chart/XAxisYSupplier.hpp>
      33             : #include <com/sun/star/chart/XAxisZSupplier.hpp>
      34             : #include <com/sun/star/chart/XChartDocument.hpp>
      35             : #include <com/sun/star/chart/XSecondAxisTitleSupplier.hpp>
      36             : #include <com/sun/star/chart2/Symbol.hpp>
      37             : 
      38             : #include <sal/macros.h>
      39             : #include <rtl/math.hxx>
      40             : #include <svl/itemset.hxx>
      41             : #include <svx/xfillit0.hxx>
      42             : #include <svx/xflclit.hxx>
      43             : #include <svx/xfltrit.hxx>
      44             : #include <svx/xflgrit.hxx>
      45             : #include <svx/xbtmpit.hxx>
      46             : #include <svx/unomid.hxx>
      47             : #include <filter/msfilter/escherex.hxx>
      48             : #include <editeng/memberids.hrc>
      49             : #include "global.hxx"
      50             : #include "xlroot.hxx"
      51             : #include "xlstyle.hxx"
      52             : 
      53             : using namespace com::sun::star;
      54             : using ::com::sun::star::uno::Any;
      55             : using ::com::sun::star::uno::Reference;
      56             : using ::com::sun::star::uno::UNO_QUERY;
      57             : using ::com::sun::star::uno::Exception;
      58             : using ::com::sun::star::lang::XMultiServiceFactory;
      59             : using ::com::sun::star::chart2::XChartDocument;
      60             : using ::com::sun::star::drawing::XShape;
      61             : 
      62             : namespace cssc = ::com::sun::star::chart;
      63             : 
      64             : // Common =====================================================================
      65             : 
      66        1093 : XclChRectangle::XclChRectangle() :
      67             :     mnX( 0 ),
      68             :     mnY( 0 ),
      69             :     mnWidth( 0 ),
      70        1093 :     mnHeight( 0 )
      71             : {
      72        1093 : }
      73             : 
      74         597 : XclChDataPointPos::XclChDataPointPos( sal_uInt16 nSeriesIdx, sal_uInt16 nPointIdx ) :
      75             :     mnSeriesIdx( nSeriesIdx ),
      76         597 :     mnPointIdx( nPointIdx )
      77             : {
      78         597 : }
      79             : 
      80         252 : bool operator<( const XclChDataPointPos& rL, const XclChDataPointPos& rR )
      81             : {
      82         656 :     return (rL.mnSeriesIdx < rR.mnSeriesIdx) ||
      83         715 :         ((rL.mnSeriesIdx == rR.mnSeriesIdx) && (rL.mnPointIdx < rR.mnPointIdx));
      84             : }
      85             : 
      86         550 : XclChFrBlock::XclChFrBlock( sal_uInt16 nType ) :
      87             :     mnType( nType ),
      88             :     mnContext( 0 ),
      89             :     mnValue1( 0 ),
      90         550 :     mnValue2( 0 )
      91             : {
      92         550 : }
      93             : 
      94             : // Frame formatting ===========================================================
      95             : 
      96         331 : XclChFramePos::XclChFramePos() :
      97             :     mnTLMode( EXC_CHFRAMEPOS_PARENT ),
      98         331 :     mnBRMode( EXC_CHFRAMEPOS_PARENT )
      99             : {
     100         331 : }
     101             : 
     102         931 : XclChLineFormat::XclChLineFormat() :
     103             :     maColor( COL_BLACK ),
     104             :     mnPattern( EXC_CHLINEFORMAT_SOLID ),
     105             :     mnWeight( EXC_CHLINEFORMAT_SINGLE ),
     106         931 :     mnFlags( EXC_CHLINEFORMAT_AUTO )
     107             : {
     108         931 : }
     109             : 
     110         619 : XclChAreaFormat::XclChAreaFormat() :
     111             :     maPattColor( COL_WHITE ),
     112             :     maBackColor( COL_BLACK ),
     113             :     mnPattern( EXC_PATT_SOLID ),
     114         619 :     mnFlags( EXC_CHAREAFORMAT_AUTO )
     115             : {
     116         619 : }
     117             : 
     118          98 : XclChEscherFormat::XclChEscherFormat()
     119             : {
     120          98 : }
     121             : 
     122          98 : XclChEscherFormat::~XclChEscherFormat()
     123             : {
     124          98 : }
     125             : 
     126          98 : XclChPicFormat::XclChPicFormat() :
     127             :     mnBmpMode( EXC_CHPICFORMAT_NONE ),
     128             :     mnFlags( EXC_CHPICFORMAT_TOPBOTTOM | EXC_CHPICFORMAT_FRONTBACK | EXC_CHPICFORMAT_LEFTRIGHT ),
     129          98 :     mfScale( 0.5 )
     130             : {
     131          98 : }
     132             : 
     133         383 : XclChFrame::XclChFrame() :
     134             :     mnFormat( EXC_CHFRAME_STANDARD ),
     135         383 :     mnFlags( EXC_CHFRAME_AUTOSIZE | EXC_CHFRAME_AUTOPOS )
     136             : {
     137         383 : }
     138             : 
     139             : // Source links ===============================================================
     140             : 
     141         631 : XclChSourceLink::XclChSourceLink() :
     142             :     mnDestType( EXC_CHSRCLINK_TITLE ),
     143             :     mnLinkType( EXC_CHSRCLINK_DEFAULT ),
     144             :     mnFlags( 0 ),
     145         631 :     mnNumFmtIdx( 0 )
     146             : {
     147         631 : }
     148             : 
     149             : // Text =======================================================================
     150             : 
     151         286 : XclChObjectLink::XclChObjectLink() :
     152         286 :     mnTarget( EXC_CHOBJLINK_NONE )
     153             : {
     154         286 : }
     155             : 
     156           1 : XclChFrLabelProps::XclChFrLabelProps() :
     157           1 :     mnFlags( 0 )
     158             : {
     159           1 : }
     160             : 
     161         349 : XclChText::XclChText() :
     162             :     maTextColor( COL_BLACK ),
     163             :     mnHAlign( EXC_CHTEXT_ALIGN_CENTER ),
     164             :     mnVAlign( EXC_CHTEXT_ALIGN_CENTER ),
     165             :     mnBackMode( EXC_CHTEXT_TRANSPARENT ),
     166             :     mnFlags( EXC_CHTEXT_AUTOCOLOR | EXC_CHTEXT_AUTOFILL ),
     167             :     mnFlags2( EXC_CHTEXT_POS_DEFAULT ),
     168         349 :     mnRotation( EXC_ROT_NONE )
     169             : {
     170         349 : }
     171             : 
     172             : // Data series ================================================================
     173             : 
     174         149 : XclChMarkerFormat::XclChMarkerFormat() :
     175             :     maLineColor( COL_BLACK ),
     176             :     maFillColor( COL_WHITE ),
     177             :     mnMarkerSize( EXC_CHMARKERFORMAT_SINGLESIZE ),
     178             :     mnMarkerType( EXC_CHMARKERFORMAT_NOSYMBOL ),
     179         149 :     mnFlags( EXC_CHMARKERFORMAT_AUTO )
     180             : {
     181         149 : };
     182             : 
     183         117 : XclCh3dDataFormat::XclCh3dDataFormat() :
     184             :     mnBase( EXC_CH3DDATAFORMAT_RECT ),
     185         117 :     mnTop( EXC_CH3DDATAFORMAT_STRAIGHT )
     186             : {
     187         117 : }
     188             : 
     189         180 : XclChDataFormat::XclChDataFormat() :
     190             :     mnFormatIdx( EXC_CHDATAFORMAT_DEFAULT ),
     191         180 :     mnFlags( 0 )
     192             : {
     193         180 : }
     194             : 
     195           9 : XclChSerTrendLine::XclChSerTrendLine() :
     196             :     mfForecastFor( 0.0 ),
     197             :     mfForecastBack( 0.0 ),
     198             :     mnLineType( EXC_CHSERTREND_POLYNOMIAL ),
     199             :     mnOrder( 1 ),
     200             :     mnShowEquation( 0 ),
     201           9 :     mnShowRSquared( 0 )
     202             : {
     203             :     /*  Set all bits in mfIntercept to 1 (that is -1.#NAN) to indicate that
     204             :         there is no interception point. Cannot use ::rtl::math::setNan() here
     205             :         cause it misses the sign bit. */
     206           9 :     sal_math_Double* pDouble = reinterpret_cast< sal_math_Double* >( &mfIntercept );
     207           9 :     pDouble->w32_parts.msw = pDouble->w32_parts.lsw = 0xFFFFFFFF;
     208           9 : }
     209             : 
     210           2 : XclChSerErrorBar::XclChSerErrorBar() :
     211             :     mfValue( 0.0 ),
     212             :     mnValueCount( 1 ),
     213             :     mnBarType( EXC_CHSERERR_NONE ),
     214             :     mnSourceType( EXC_CHSERERR_FIXED ),
     215           2 :     mnLineEnd( EXC_CHSERERR_END_TSHAPE )
     216             : {
     217           2 : }
     218             : 
     219         104 : XclChSeries::XclChSeries() :
     220             :     mnCategType( EXC_CHSERIES_NUMERIC ),
     221             :     mnValueType( EXC_CHSERIES_NUMERIC ),
     222             :     mnBubbleType( EXC_CHSERIES_NUMERIC ),
     223             :     mnCategCount( 0 ),
     224             :     mnValueCount( 0 ),
     225         104 :     mnBubbleCount( 0 )
     226             : {
     227         104 : }
     228             : 
     229             : // Chart type groups ==========================================================
     230             : 
     231         100 : XclChType::XclChType() :
     232             :     mnOverlap( 0 ),
     233             :     mnGap( 150 ),
     234             :     mnRotation( 0 ),
     235             :     mnPieHole( 0 ),
     236             :     mnBubbleSize( 100 ),
     237             :     mnBubbleType( EXC_CHSCATTER_AREA ),
     238         100 :     mnFlags( 0 )
     239             : {
     240         100 : }
     241             : 
     242           0 : XclChChart3d::XclChChart3d() :
     243             :     mnRotation( 20 ),
     244             :     mnElevation( 15 ),
     245             :     mnEyeDist( 30 ),
     246             :     mnRelHeight( 100 ),
     247             :     mnRelDepth( 100 ),
     248             :     mnDepthGap( 150 ),
     249           0 :     mnFlags( EXC_CHCHART3D_AUTOHEIGHT )
     250             : {
     251           0 : }
     252             : 
     253          44 : XclChLegend::XclChLegend() :
     254             :     mnDockMode( EXC_CHLEGEND_RIGHT ),
     255             :     mnSpacing( EXC_CHLEGEND_MEDIUM ),
     256             :     mnFlags( EXC_CHLEGEND_DOCKED | EXC_CHLEGEND_AUTOSERIES |
     257          44 :         EXC_CHLEGEND_AUTOPOSX | EXC_CHLEGEND_AUTOPOSY | EXC_CHLEGEND_STACKED )
     258             : {
     259          44 : }
     260             : 
     261         100 : XclChTypeGroup::XclChTypeGroup() :
     262             :     mnFlags( 0 ),
     263         100 :     mnGroupIdx( EXC_CHSERGROUP_NONE )
     264             : {
     265         100 : }
     266             : 
     267          72 : XclChProperties::XclChProperties() :
     268             :     mnFlags( 0 ),
     269          72 :     mnEmptyMode( EXC_CHPROPS_EMPTY_SKIP )
     270             : {
     271          72 : }
     272             : 
     273             : // Axes =======================================================================
     274             : 
     275         113 : XclChLabelRange::XclChLabelRange() :
     276             :     mnCross( 1 ),
     277             :     mnLabelFreq( 1 ),
     278             :     mnTickFreq( 1 ),
     279         113 :     mnFlags( 0 )
     280             : {
     281         113 : }
     282             : 
     283         113 : XclChDateRange::XclChDateRange() :
     284             :     mnMinDate( 0 ),
     285             :     mnMaxDate( 0 ),
     286             :     mnMajorStep( 0 ),
     287             :     mnMajorUnit( EXC_CHDATERANGE_DAYS ),
     288             :     mnMinorStep( 0 ),
     289             :     mnMinorUnit( EXC_CHDATERANGE_DAYS ),
     290             :     mnBaseUnit( EXC_CHDATERANGE_DAYS ),
     291             :     mnCross( 0 ),
     292             :     mnFlags( EXC_CHDATERANGE_AUTOMIN | EXC_CHDATERANGE_AUTOMAX |
     293             :         EXC_CHDATERANGE_AUTOMAJOR | EXC_CHDATERANGE_AUTOMINOR |
     294             :         EXC_CHDATERANGE_AUTOBASE | EXC_CHDATERANGE_AUTOCROSS |
     295         113 :         EXC_CHDATERANGE_AUTODATE )
     296             : {
     297         113 : }
     298             : 
     299         133 : XclChValueRange::XclChValueRange() :
     300             :     mfMin( 0.0 ),
     301             :     mfMax( 0.0 ),
     302             :     mfMajorStep( 0.0 ),
     303             :     mfMinorStep( 0.0 ),
     304             :     mfCross( 0.0 ),
     305             :     mnFlags( EXC_CHVALUERANGE_AUTOMIN | EXC_CHVALUERANGE_AUTOMAX |
     306             :         EXC_CHVALUERANGE_AUTOMAJOR | EXC_CHVALUERANGE_AUTOMINOR |
     307         133 :         EXC_CHVALUERANGE_AUTOCROSS | EXC_CHVALUERANGE_BIT8 )
     308             : {
     309         133 : }
     310             : 
     311         150 : XclChTick::XclChTick() :
     312             :     maTextColor( COL_BLACK ),
     313             :     mnMajor( EXC_CHTICK_INSIDE | EXC_CHTICK_OUTSIDE ),
     314             :     mnMinor( 0 ),
     315             :     mnLabelPos( EXC_CHTICK_NEXT ),
     316             :     mnBackMode( EXC_CHTICK_TRANSPARENT ),
     317             :     mnFlags( EXC_CHTICK_AUTOCOLOR | EXC_CHTICK_AUTOROT ),
     318         150 :     mnRotation( EXC_ROT_NONE )
     319             : {
     320         150 : }
     321             : 
     322         150 : XclChAxis::XclChAxis() :
     323         150 :     mnType( EXC_CHAXIS_NONE )
     324             : {
     325         150 : }
     326             : 
     327         150 : sal_Int32 XclChAxis::GetApiAxisDimension() const
     328             : {
     329         150 :     sal_Int32 nApiAxisDim = EXC_CHART_AXIS_NONE;
     330         150 :     switch( mnType )
     331             :     {
     332          75 :         case EXC_CHAXIS_X:  nApiAxisDim = EXC_CHART_AXIS_X; break;
     333          75 :         case EXC_CHAXIS_Y:  nApiAxisDim = EXC_CHART_AXIS_Y; break;
     334           0 :         case EXC_CHAXIS_Z:  nApiAxisDim = EXC_CHART_AXIS_Z; break;
     335             :     }
     336         150 :     return nApiAxisDim;
     337             : }
     338             : 
     339         192 : XclChAxesSet::XclChAxesSet() :
     340         192 :     mnAxesSetId( EXC_CHAXESSET_PRIMARY )
     341             : {
     342         192 : }
     343             : 
     344         250 : sal_Int32 XclChAxesSet::GetApiAxesSetIndex() const
     345             : {
     346         250 :     sal_Int32 nApiAxesSetIdx = EXC_CHART_AXESSET_NONE;
     347         250 :     switch( mnAxesSetId )
     348             :     {
     349         216 :         case EXC_CHAXESSET_PRIMARY:     nApiAxesSetIdx = EXC_CHART_AXESSET_PRIMARY;     break;
     350          34 :         case EXC_CHAXESSET_SECONDARY:   nApiAxesSetIdx = EXC_CHART_AXESSET_SECONDARY;   break;
     351             :     }
     352         250 :     return nApiAxesSetIdx;
     353             : }
     354             : 
     355             : // Static helper functions ====================================================
     356             : 
     357           2 : sal_uInt16 XclChartHelper::GetSeriesLineAutoColorIdx( sal_uInt16 nFormatIdx )
     358             : {
     359             :     static const sal_uInt16 spnLineColors[] =
     360             :     {
     361             :         32, 33, 34, 35, 36, 37, 38, 39,
     362             :         40, 41, 42, 43, 44, 45, 46, 47,
     363             :         48, 49, 50, 51, 52, 53, 54, 55,
     364             :         56, 57, 58, 59, 60, 61, 62,  8,
     365             :          9, 10, 11, 12, 13, 14, 15, 16,
     366             :         17, 18, 19, 20, 21, 22, 23, 24,
     367             :         25, 26, 27, 28, 29, 30, 31, 63
     368             :     };
     369           2 :     return spnLineColors[ nFormatIdx % SAL_N_ELEMENTS( spnLineColors ) ];
     370             : }
     371             : 
     372           2 : sal_uInt16 XclChartHelper::GetSeriesFillAutoColorIdx( sal_uInt16 nFormatIdx )
     373             : {
     374             :     static const sal_uInt16 spnFillColors[] =
     375             :     {
     376             :         24, 25, 26, 27, 28, 29, 30, 31,
     377             :         32, 33, 34, 35, 36, 37, 38, 39,
     378             :         40, 41, 42, 43, 44, 45, 46, 47,
     379             :         48, 49, 50, 51, 52, 53, 54, 55,
     380             :         56, 57, 58, 59, 60, 61, 62, 63,
     381             :          8,  9, 10, 11, 12, 13, 14, 15,
     382             :         16, 17, 18, 19, 20, 21, 22, 23
     383             :     };
     384           2 :     return spnFillColors[ nFormatIdx % SAL_N_ELEMENTS( spnFillColors ) ];
     385             : }
     386             : 
     387           2 : sal_uInt8 XclChartHelper::GetSeriesFillAutoTransp( sal_uInt16 nFormatIdx )
     388             : {
     389             :     static const sal_uInt8 spnTrans[] = { 0x00, 0x40, 0x20, 0x60, 0x70 };
     390           2 :     return spnTrans[ (nFormatIdx / 56) % SAL_N_ELEMENTS( spnTrans ) ];
     391             : }
     392             : 
     393           3 : sal_uInt16 XclChartHelper::GetAutoMarkerType( sal_uInt16 nFormatIdx )
     394             : {
     395             :     static const sal_uInt16 spnSymbols[] = {
     396             :         EXC_CHMARKERFORMAT_DIAMOND, EXC_CHMARKERFORMAT_SQUARE, EXC_CHMARKERFORMAT_TRIANGLE,
     397             :         EXC_CHMARKERFORMAT_CROSS, EXC_CHMARKERFORMAT_STAR, EXC_CHMARKERFORMAT_CIRCLE,
     398             :         EXC_CHMARKERFORMAT_PLUS, EXC_CHMARKERFORMAT_DOWJ, EXC_CHMARKERFORMAT_STDDEV };
     399           3 :     return spnSymbols[ nFormatIdx % SAL_N_ELEMENTS( spnSymbols ) ];
     400             : }
     401             : 
     402          22 : bool XclChartHelper::HasMarkerFillColor( sal_uInt16 nMarkerType )
     403             : {
     404             :     static const bool spbFilled[] = {
     405             :         false, true, true, true, false, false, false, false, true, false };
     406          22 :     return (nMarkerType < SAL_N_ELEMENTS( spbFilled )) && spbFilled[ nMarkerType ];
     407             : }
     408             : 
     409           0 : OUString XclChartHelper::GetErrorBarValuesRole( sal_uInt8 nBarType )
     410             : {
     411           0 :     switch( nBarType )
     412             :     {
     413           0 :         case EXC_CHSERERR_XPLUS:    return OUString( EXC_CHPROP_ROLE_ERRORBARS_POSX );
     414           0 :         case EXC_CHSERERR_XMINUS:   return OUString( EXC_CHPROP_ROLE_ERRORBARS_NEGX );
     415           0 :         case EXC_CHSERERR_YPLUS:    return OUString( EXC_CHPROP_ROLE_ERRORBARS_POSY );
     416           0 :         case EXC_CHSERERR_YMINUS:   return OUString( EXC_CHPROP_ROLE_ERRORBARS_NEGY );
     417             :         default:    OSL_FAIL( "XclChartHelper::GetErrorBarValuesRole - unknown bar type" );
     418             :     }
     419           0 :     return OUString();
     420             : }
     421             : 
     422             : // Chart formatting info provider =============================================
     423             : 
     424             : namespace {
     425             : 
     426             : static const XclChFormatInfo spFmtInfos[] =
     427             : {
     428             :     // object type                  property mode                auto line color         auto line weight         auto pattern color      missing frame type         create delete isframe
     429             :     { EXC_CHOBJTYPE_BACKGROUND,     EXC_CHPROPMODE_COMMON,       EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR,   EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, true,  true,  true  },
     430             :     { EXC_CHOBJTYPE_PLOTFRAME,      EXC_CHPROPMODE_COMMON,       EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR,   EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, true,  true,  true  },
     431             :     { EXC_CHOBJTYPE_WALL3D,         EXC_CHPROPMODE_COMMON,       EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR,   EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_AUTO,      true,  false, true  },
     432             :     { EXC_CHOBJTYPE_FLOOR3D,        EXC_CHPROPMODE_COMMON,       EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR,   23,                     EXC_CHFRAMETYPE_AUTO,      true,  false, true  },
     433             :     { EXC_CHOBJTYPE_TEXT,           EXC_CHPROPMODE_COMMON,       EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR,   EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, false, true,  true  },
     434             :     { EXC_CHOBJTYPE_LEGEND,         EXC_CHPROPMODE_COMMON,       EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR,   EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_AUTO,      true,  true,  true  },
     435             :     { EXC_CHOBJTYPE_LINEARSERIES,   EXC_CHPROPMODE_LINEARSERIES, 0xFFFF,                 EXC_CHLINEFORMAT_SINGLE, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_AUTO,      false, false, false },
     436             :     { EXC_CHOBJTYPE_FILLEDSERIES,   EXC_CHPROPMODE_FILLEDSERIES, EXC_COLOR_CHBORDERAUTO, EXC_CHLINEFORMAT_SINGLE, 0xFFFF,                 EXC_CHFRAMETYPE_AUTO,      false, false, true  },
     437             :     { EXC_CHOBJTYPE_AXISLINE,       EXC_CHPROPMODE_COMMON,       EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR,   EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_AUTO,      false, false, false },
     438             :     { EXC_CHOBJTYPE_GRIDLINE,       EXC_CHPROPMODE_COMMON,       EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR,   EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, false, true,  false  },
     439             :     { EXC_CHOBJTYPE_TRENDLINE,      EXC_CHPROPMODE_COMMON,       EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_DOUBLE, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, false, false, false },
     440             :     { EXC_CHOBJTYPE_ERRORBAR,       EXC_CHPROPMODE_COMMON,       EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_SINGLE, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, false, false, false },
     441             :     { EXC_CHOBJTYPE_CONNECTLINE,    EXC_CHPROPMODE_COMMON,       EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR,   EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, false, false, false },
     442             :     { EXC_CHOBJTYPE_HILOLINE,       EXC_CHPROPMODE_LINEARSERIES, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR,   EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, false, false, false },
     443             :     { EXC_CHOBJTYPE_WHITEDROPBAR,   EXC_CHPROPMODE_COMMON,       EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR,   EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, false, false, true  },
     444             :     { EXC_CHOBJTYPE_BLACKDROPBAR,   EXC_CHPROPMODE_COMMON,       EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR,   EXC_COLOR_CHWINDOWTEXT, EXC_CHFRAMETYPE_INVISIBLE, false, false, true  }
     445             : };
     446             : 
     447             : }
     448             : 
     449          72 : XclChFormatInfoProvider::XclChFormatInfoProvider()
     450             : {
     451          72 :     const XclChFormatInfo* pEnd = STATIC_ARRAY_END( spFmtInfos );
     452        1224 :     for( const XclChFormatInfo* pIt = spFmtInfos; pIt != pEnd; ++pIt )
     453        1152 :         maInfoMap[ pIt->meObjType ] = pIt;
     454          72 : }
     455             : 
     456        1863 : const XclChFormatInfo& XclChFormatInfoProvider::GetFormatInfo( XclChObjectType eObjType ) const
     457             : {
     458        1863 :     XclFmtInfoMap::const_iterator aIt = maInfoMap.find( eObjType );
     459             :     OSL_ENSURE( aIt != maInfoMap.end(), "XclChFormatInfoProvider::GetFormatInfo - unknown object type" );
     460        1863 :     return (aIt == maInfoMap.end()) ? *spFmtInfos : *aIt->second;
     461             : }
     462             : 
     463             : // Chart type info provider ===================================================
     464             : 
     465             : namespace {
     466             : 
     467             : // chart type service names
     468             : const sal_Char SERVICE_CHART2_AREA[]      = "com.sun.star.chart2.AreaChartType";
     469             : const sal_Char SERVICE_CHART2_CANDLE[]    = "com.sun.star.chart2.CandleStickChartType";
     470             : const sal_Char SERVICE_CHART2_COLUMN[]    = "com.sun.star.chart2.ColumnChartType";
     471             : const sal_Char SERVICE_CHART2_LINE[]      = "com.sun.star.chart2.LineChartType";
     472             : const sal_Char SERVICE_CHART2_NET[]       = "com.sun.star.chart2.NetChartType";
     473             : const sal_Char SERVICE_CHART2_FILLEDNET[] = "com.sun.star.chart2.FilledNetChartType";
     474             : const sal_Char SERVICE_CHART2_PIE[]       = "com.sun.star.chart2.PieChartType";
     475             : const sal_Char SERVICE_CHART2_SCATTER[]   = "com.sun.star.chart2.ScatterChartType";
     476             : const sal_Char SERVICE_CHART2_BUBBLE[]    = "com.sun.star.chart2.BubbleChartType";
     477             : const sal_Char SERVICE_CHART2_SURFACE[]   = "com.sun.star.chart2.ColumnChartType";    // Todo
     478             : 
     479             : namespace csscd = cssc::DataLabelPlacement;
     480             : 
     481             : static const XclChTypeInfo spTypeInfos[] =
     482             : {
     483             :     // 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
     484             :     { 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  },
     485             :     { 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  },
     486             :     { 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 },
     487             :     { 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 },
     488             :     { 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 },
     489             :     { 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 },
     490             :     { 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 },
     491             :     { 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 },
     492             :     { 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, false, false },
     493             :     { 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 },
     494             :     { 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 },
     495             :     { 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 },
     496             :     { 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 },
     497             :     { 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  }
     498             : };
     499             : 
     500             : } // namespace
     501             : 
     502         100 : XclChExtTypeInfo::XclChExtTypeInfo( const XclChTypeInfo& rTypeInfo ) :
     503             :     XclChTypeInfo( rTypeInfo ),
     504             :     mb3dChart( false ),
     505         100 :     mbSpline( false )
     506             : {
     507         100 : }
     508             : 
     509         100 : void XclChExtTypeInfo::Set( const XclChTypeInfo& rTypeInfo, bool b3dChart, bool bSpline )
     510             : {
     511         100 :     static_cast< XclChTypeInfo& >( *this ) = rTypeInfo;
     512         100 :     mb3dChart = mbSupports3d && b3dChart;
     513         100 :     mbSpline = bSpline;
     514         100 : }
     515             : 
     516          72 : XclChTypeInfoProvider::XclChTypeInfoProvider()
     517             : {
     518          72 :     const XclChTypeInfo* pEnd = STATIC_ARRAY_END( spTypeInfos );
     519        1080 :     for( const XclChTypeInfo* pIt = spTypeInfos; pIt != pEnd; ++pIt )
     520        1008 :         maInfoMap[ pIt->meTypeId ] = pIt;
     521          72 : }
     522             : 
     523         170 : const XclChTypeInfo& XclChTypeInfoProvider::GetTypeInfo( XclChTypeId eTypeId ) const
     524             : {
     525         170 :     XclChTypeInfoMap::const_iterator aIt = maInfoMap.find( eTypeId );
     526             :     OSL_ENSURE( aIt != maInfoMap.end(), "XclChTypeInfoProvider::GetTypeInfo - unknown chart type" );
     527         170 :     return (aIt == maInfoMap.end()) ? *maInfoMap.rbegin()->second : *aIt->second;
     528             : }
     529             : 
     530           1 : const XclChTypeInfo& XclChTypeInfoProvider::GetTypeInfoFromRecId( sal_uInt16 nRecId ) const
     531             : {
     532           1 :     const XclChTypeInfo* pEnd = STATIC_ARRAY_END( spTypeInfos );
     533          15 :     for( const XclChTypeInfo* pIt = spTypeInfos; pIt != pEnd; ++pIt )
     534          14 :         if( pIt->mnRecId == nRecId )
     535           0 :             return *pIt;
     536             :     OSL_FAIL( "XclChTypeInfoProvider::GetTypeInfoFromRecId - unknown record id" );
     537           1 :     return GetTypeInfo( EXC_CHTYPEID_UNKNOWN );
     538             : }
     539             : 
     540          52 : const XclChTypeInfo& XclChTypeInfoProvider::GetTypeInfoFromService( const OUString& rServiceName ) const
     541             : {
     542          52 :     const XclChTypeInfo* pEnd = STATIC_ARRAY_END( spTypeInfos );
     543         258 :     for( const XclChTypeInfo* pIt = spTypeInfos; pIt != pEnd; ++pIt )
     544         258 :         if( rServiceName.equalsAscii( pIt->mpcServiceName ) )
     545          52 :             return *pIt;
     546             :     OSL_FAIL( "XclChTypeInfoProvider::GetTypeInfoFromService - unknown service name" );
     547           0 :     return GetTypeInfo( EXC_CHTYPEID_UNKNOWN );
     548             : }
     549             : 
     550             : // Property helpers ===========================================================
     551             : 
     552         288 : XclChObjectTable::XclChObjectTable( Reference< XMultiServiceFactory > xFactory,
     553             :         const OUString& rServiceName, const OUString& rObjNameBase ) :
     554             :     mxFactory( xFactory ),
     555             :     maServiceName( rServiceName ),
     556             :     maObjNameBase( rObjNameBase ),
     557         288 :     mnIndex( 0 )
     558             : {
     559         288 : }
     560             : 
     561           0 : Any XclChObjectTable::GetObject( const OUString& rObjName )
     562             : {
     563             :     // get object table
     564           0 :     if( !mxContainer.is() )
     565           0 :         mxContainer.set( ScfApiHelper::CreateInstance( mxFactory, maServiceName ), UNO_QUERY );
     566             :     OSL_ENSURE( mxContainer.is(), "XclChObjectTable::GetObject - container not found" );
     567             : 
     568           0 :     Any aObj;
     569           0 :     if( mxContainer.is() )
     570             :     {
     571             :         // get object from container
     572             :         try
     573             :         {
     574           0 :             aObj = mxContainer->getByName( rObjName );
     575             :         }
     576           0 :         catch( Exception& )
     577             :         {
     578             :             OSL_FAIL( "XclChObjectTable::GetObject - object not found" );
     579             :         }
     580             :     }
     581           0 :     return aObj;
     582             : }
     583             : 
     584           0 : OUString XclChObjectTable::InsertObject( const Any& rObj )
     585             : {
     586             : 
     587             :     // create object table
     588           0 :     if( !mxContainer.is() )
     589           0 :         mxContainer.set( ScfApiHelper::CreateInstance( mxFactory, maServiceName ), UNO_QUERY );
     590             :     OSL_ENSURE( mxContainer.is(), "XclChObjectTable::InsertObject - container not found" );
     591             : 
     592           0 :     OUString aObjName;
     593           0 :     if( mxContainer.is() )
     594             :     {
     595             :         // create new unused identifier
     596           0 :         do
     597             :         {
     598           0 :             aObjName = maObjNameBase + OUString::number( ++mnIndex );
     599             :         }
     600           0 :         while( mxContainer->hasByName( aObjName ) );
     601             : 
     602             :         // insert object
     603             :         try
     604             :         {
     605           0 :             mxContainer->insertByName( aObjName, rObj );
     606             :         }
     607           0 :         catch( Exception& )
     608             :         {
     609             :             OSL_FAIL( "XclChObjectTable::InsertObject - cannot insert object" );
     610           0 :             aObjName.clear();
     611             :         }
     612             :     }
     613           0 :     return aObjName;
     614             : }
     615             : 
     616             : // Property names -------------------------------------------------------------
     617             : 
     618             : namespace {
     619             : 
     620             : /** Property names for line style in common objects. */
     621             : const sal_Char* const sppcLineNamesCommon[] =
     622             :     { "LineStyle", "LineWidth", "LineColor", "LineTransparence", "LineDashName", 0 };
     623             : /** Property names for line style in linear series objects. */
     624             : const sal_Char* const sppcLineNamesLinear[] =
     625             :     { "LineStyle", "LineWidth", "Color", "Transparency", "LineDashName", 0 };
     626             : /** Property names for line style in filled series objects. */
     627             : const sal_Char* const sppcLineNamesFilled[] =
     628             :     { "BorderStyle", "BorderWidth", "BorderColor", "BorderTransparency", "BorderDashName", 0 };
     629             : 
     630             : /** Property names for solid area style in common objects. */
     631             : const sal_Char* const sppcAreaNamesCommon[] = { "FillStyle", "FillColor", "FillTransparence", 0 };
     632             : /** Property names for solid area style in filled series objects. */
     633             : const sal_Char* const sppcAreaNamesFilled[] = { "FillStyle", "Color", "Transparency", 0 };
     634             : /** Property names for gradient area style in common objects. */
     635             : const sal_Char* const sppcGradNamesCommon[] = {  "FillStyle", "FillGradientName", 0 };
     636             : /** Property names for gradient area style in filled series objects. */
     637             : const sal_Char* const sppcGradNamesFilled[] = {  "FillStyle", "GradientName", 0 };
     638             : /** Property names for hatch area style in common objects. */
     639             : const sal_Char* const sppcHatchNamesCommon[] = { "FillStyle", "FillHatchName", "FillColor", "FillBackground", 0 };
     640             : /** Property names for hatch area style in filled series objects. */
     641             : const sal_Char* const sppcHatchNamesFilled[] = { "FillStyle", "HatchName", "Color", "FillBackground", 0 };
     642             : /** Property names for bitmap area style. */
     643             : const sal_Char* const sppcBitmapNames[] = { "FillStyle", "FillBitmapName", "FillBitmapMode", 0 };
     644             : 
     645             : } // namespace
     646             : 
     647         156 : XclChPropSetHelper::XclChPropSetHelper() :
     648             :     maLineHlpCommon( sppcLineNamesCommon ),
     649             :     maLineHlpLinear( sppcLineNamesLinear ),
     650             :     maLineHlpFilled( sppcLineNamesFilled ),
     651             :     maAreaHlpCommon( sppcAreaNamesCommon ),
     652             :     maAreaHlpFilled( sppcAreaNamesFilled ),
     653             :     maGradHlpCommon( sppcGradNamesCommon ),
     654             :     maGradHlpFilled( sppcGradNamesFilled ),
     655             :     maHatchHlpCommon( sppcHatchNamesCommon ),
     656             :     maHatchHlpFilled( sppcHatchNamesFilled ),
     657         156 :     maBitmapHlp( sppcBitmapNames )
     658             : {
     659         156 : }
     660             : 
     661             : // read properties ------------------------------------------------------------
     662             : 
     663         226 : void XclChPropSetHelper::ReadLineProperties(
     664             :         XclChLineFormat& rLineFmt, XclChObjectTable& rDashTable,
     665             :         const ScfPropertySet& rPropSet, XclChPropertyMode ePropMode )
     666             : {
     667             :     namespace cssd = ::com::sun::star::drawing;
     668             : 
     669             :     // read properties from property set
     670         226 :     cssd::LineStyle eApiStyle = cssd::LineStyle_NONE;
     671         226 :     sal_Int32 nApiWidth = 0;
     672         226 :     sal_Int16 nApiTrans = 0;
     673         226 :     Any aDashNameAny;
     674             : 
     675         226 :     ScfPropSetHelper& rLineHlp = GetLineHelper( ePropMode );
     676         226 :     rLineHlp.ReadFromPropertySet( rPropSet );
     677         226 :     rLineHlp >> eApiStyle >> nApiWidth >> rLineFmt.maColor >> nApiTrans >> aDashNameAny;
     678             : 
     679             :     // clear automatic flag
     680         226 :     ::set_flag( rLineFmt.mnFlags, EXC_CHLINEFORMAT_AUTO, false );
     681             : 
     682             :     // line width
     683         226 :     if( nApiWidth <= 0 )        rLineFmt.mnWeight = EXC_CHLINEFORMAT_HAIR;
     684         106 :     else if( nApiWidth <= 35 )  rLineFmt.mnWeight = EXC_CHLINEFORMAT_SINGLE;
     685          30 :     else if( nApiWidth <= 70 )  rLineFmt.mnWeight = EXC_CHLINEFORMAT_DOUBLE;
     686          22 :     else                        rLineFmt.mnWeight = EXC_CHLINEFORMAT_TRIPLE;
     687             : 
     688             :     // line style
     689         226 :     switch( eApiStyle )
     690             :     {
     691             :         case cssd::LineStyle_NONE:
     692         107 :             rLineFmt.mnPattern = EXC_CHLINEFORMAT_NONE;
     693         107 :         break;
     694             :         case cssd::LineStyle_SOLID:
     695             :         {
     696         119 :             if( nApiTrans < 13 )        rLineFmt.mnPattern = EXC_CHLINEFORMAT_SOLID;
     697           0 :             else if( nApiTrans < 38 )   rLineFmt.mnPattern = EXC_CHLINEFORMAT_DARKTRANS;
     698           0 :             else if( nApiTrans < 63 )   rLineFmt.mnPattern = EXC_CHLINEFORMAT_MEDTRANS;
     699           0 :             else if( nApiTrans < 100 )  rLineFmt.mnPattern = EXC_CHLINEFORMAT_LIGHTTRANS;
     700           0 :             else                        rLineFmt.mnPattern = EXC_CHLINEFORMAT_NONE;
     701             :         }
     702         119 :         break;
     703             :         case cssd::LineStyle_DASH:
     704             :         {
     705           0 :             rLineFmt.mnPattern = EXC_CHLINEFORMAT_SOLID;
     706           0 :             OUString aDashName;
     707           0 :             cssd::LineDash aApiDash;
     708           0 :             if( (aDashNameAny >>= aDashName) && (rDashTable.GetObject( aDashName ) >>= aApiDash) )
     709             :             {
     710             :                 // reorder dashes that are shorter than dots
     711           0 :                 if( (aApiDash.Dashes == 0) || (aApiDash.DashLen < aApiDash.DotLen) )
     712             :                 {
     713           0 :                     ::std::swap( aApiDash.Dashes, aApiDash.Dots );
     714           0 :                     ::std::swap( aApiDash.DashLen, aApiDash.DotLen );
     715             :                 }
     716             :                 // ignore dots that are nearly equal to dashes
     717           0 :                 if( aApiDash.DotLen * 3 > aApiDash.DashLen * 2 )
     718           0 :                     aApiDash.Dots = 0;
     719             : 
     720             :                 // convert line dash to predefined Excel dash types
     721           0 :                 if( (aApiDash.Dashes == 1) && (aApiDash.Dots >= 1) )
     722             :                     // one dash and one or more dots
     723           0 :                     rLineFmt.mnPattern = (aApiDash.Dots == 1) ?
     724           0 :                         EXC_CHLINEFORMAT_DASHDOT : EXC_CHLINEFORMAT_DASHDOTDOT;
     725           0 :                 else if( aApiDash.Dashes >= 1 )
     726             :                     // one or more dashes and no dots (also: dash-dash-dot)
     727           0 :                     rLineFmt.mnPattern = (aApiDash.DashLen < 250) ?
     728           0 :                         EXC_CHLINEFORMAT_DOT : EXC_CHLINEFORMAT_DASH;
     729           0 :             }
     730             :         }
     731           0 :         break;
     732             :         default:
     733             :             OSL_FAIL( "XclChPropSetHelper::ReadLineProperties - unknown line style" );
     734           0 :             rLineFmt.mnPattern = EXC_CHLINEFORMAT_SOLID;
     735         226 :     }
     736         226 : }
     737             : 
     738         113 : bool XclChPropSetHelper::ReadAreaProperties( XclChAreaFormat& rAreaFmt,
     739             :         const ScfPropertySet& rPropSet, XclChPropertyMode ePropMode )
     740             : {
     741             :     namespace cssd = ::com::sun::star::drawing;
     742             : 
     743             :     // read properties from property set
     744         113 :     cssd::FillStyle eApiStyle = cssd::FillStyle_NONE;
     745         113 :     sal_Int16 nTransparency = 0;
     746             : 
     747         113 :     ScfPropSetHelper& rAreaHlp = GetAreaHelper( ePropMode );
     748         113 :     rAreaHlp.ReadFromPropertySet( rPropSet );
     749         113 :     rAreaHlp >> eApiStyle >> rAreaFmt.maPattColor >> nTransparency;
     750             : 
     751             :     // clear automatic flag
     752         113 :     ::set_flag( rAreaFmt.mnFlags, EXC_CHAREAFORMAT_AUTO, false );
     753             : 
     754             :     // set fill style transparent or solid (set solid for anything but transparent)
     755         113 :     rAreaFmt.mnPattern = (eApiStyle == cssd::FillStyle_NONE) ? EXC_PATT_NONE : EXC_PATT_SOLID;
     756             : 
     757             :     // return true to indicate complex fill (gradient, bitmap, solid transparency)
     758         113 :     return (eApiStyle != cssd::FillStyle_NONE) && ((eApiStyle != cssd::FillStyle_SOLID) || (nTransparency > 0));
     759             : }
     760             : 
     761           3 : void XclChPropSetHelper::ReadEscherProperties(
     762             :         XclChEscherFormat& rEscherFmt, XclChPicFormat& rPicFmt,
     763             :         XclChObjectTable& rGradientTable, XclChObjectTable& rHatchTable, XclChObjectTable& rBitmapTable,
     764             :         const ScfPropertySet& rPropSet, XclChPropertyMode ePropMode )
     765             : {
     766             :     namespace cssd = ::com::sun::star::drawing;
     767             :     namespace cssa = ::com::sun::star::awt;
     768             : 
     769             :     // read style and transparency properties from property set
     770           3 :     cssd::FillStyle eApiStyle = cssd::FillStyle_NONE;
     771           3 :     Color aColor;
     772           3 :     sal_Int16 nTransparency = 0;
     773             : 
     774           3 :     ScfPropSetHelper& rAreaHlp = GetAreaHelper( ePropMode );
     775           3 :     rAreaHlp.ReadFromPropertySet( rPropSet );
     776           3 :     rAreaHlp >> eApiStyle >> aColor >> nTransparency;
     777             : 
     778           3 :     switch( eApiStyle )
     779             :     {
     780             :         case cssd::FillStyle_SOLID:
     781             :         {
     782             :             OSL_ENSURE( nTransparency > 0, "XclChPropSetHelper::ReadEscherProperties - unexpected solid area without transparency" );
     783           3 :             if( (0 < nTransparency) && (nTransparency <= 100) )
     784             :             {
     785             :                 // convert to Escher properties
     786           3 :                 sal_uInt32 nEscherColor = 0x02000000;
     787           3 :                 ::insert_value( nEscherColor, aColor.GetBlue(), 16, 8 );
     788           3 :                 ::insert_value( nEscherColor, aColor.GetGreen(), 8, 8 );
     789           3 :                 ::insert_value( nEscherColor, aColor.GetRed(), 0, 8 );
     790           3 :                 sal_uInt32 nEscherOpacity = static_cast< sal_uInt32 >( (100 - nTransparency) * 655.36 );
     791           3 :                 rEscherFmt.mxEscherSet.reset( new EscherPropertyContainer );
     792           3 :                 rEscherFmt.mxEscherSet->AddOpt( ESCHER_Prop_fillType, ESCHER_FillSolid );
     793           3 :                 rEscherFmt.mxEscherSet->AddOpt( ESCHER_Prop_fillColor, nEscherColor );
     794           3 :                 rEscherFmt.mxEscherSet->AddOpt( ESCHER_Prop_fillOpacity, nEscherOpacity );
     795           3 :                 rEscherFmt.mxEscherSet->AddOpt( ESCHER_Prop_fillBackColor, 0x02FFFFFF );
     796           3 :                 rEscherFmt.mxEscherSet->AddOpt( ESCHER_Prop_fillBackOpacity, 0x00010000 );
     797           3 :                 rEscherFmt.mxEscherSet->AddOpt( ESCHER_Prop_fNoFillHitTest, 0x001F001C );
     798             :             }
     799             :         }
     800           3 :         break;
     801             :         case cssd::FillStyle_GRADIENT:
     802             :         {
     803             :             // extract gradient from global gradient table
     804           0 :             OUString aGradientName;
     805           0 :             ScfPropSetHelper& rGradHlp = GetGradientHelper( ePropMode );
     806           0 :             rGradHlp.ReadFromPropertySet( rPropSet );
     807           0 :             rGradHlp >> eApiStyle >> aGradientName;
     808           0 :             cssa::Gradient aGradient;
     809           0 :             if( rGradientTable.GetObject( aGradientName ) >>= aGradient )
     810             :             {
     811             :                 // convert to Escher properties
     812           0 :                 rEscherFmt.mxEscherSet.reset( new EscherPropertyContainer );
     813           0 :                 rEscherFmt.mxEscherSet->CreateGradientProperties( aGradient );
     814           0 :             }
     815             :         }
     816           0 :         break;
     817             :         case cssd::FillStyle_HATCH:
     818             :         {
     819             :             // extract hatch from global hatch table
     820           0 :             OUString aHatchName;
     821             :             bool bFillBackground;
     822           0 :             ScfPropSetHelper& rHatchHlp = GetHatchHelper( ePropMode );
     823           0 :             rHatchHlp.ReadFromPropertySet( rPropSet );
     824           0 :             rHatchHlp >> eApiStyle >> aHatchName >> aColor >> bFillBackground;
     825           0 :             cssd::Hatch aHatch;
     826           0 :             if( rHatchTable.GetObject( aHatchName ) >>= aHatch )
     827             :             {
     828             :                 // convert to Escher properties
     829           0 :                 rEscherFmt.mxEscherSet.reset( new EscherPropertyContainer );
     830           0 :                 rEscherFmt.mxEscherSet->CreateEmbeddedHatchProperties( aHatch, aColor, bFillBackground );
     831           0 :                 rPicFmt.mnBmpMode = EXC_CHPICFORMAT_STACK;
     832           0 :             }
     833             :         }
     834           0 :         break;
     835             :         case cssd::FillStyle_BITMAP:
     836             :         {
     837             :             // extract bitmap URL from global bitmap table
     838           0 :             OUString aBitmapName;
     839             :             cssd::BitmapMode eApiBmpMode;
     840           0 :             maBitmapHlp.ReadFromPropertySet( rPropSet );
     841           0 :             maBitmapHlp >> eApiStyle >> aBitmapName >> eApiBmpMode;
     842           0 :             OUString aBitmapUrl;
     843           0 :             if( rBitmapTable.GetObject( aBitmapName ) >>= aBitmapUrl )
     844             :             {
     845             :                 // convert to Escher properties
     846           0 :                 rEscherFmt.mxEscherSet.reset( new EscherPropertyContainer );
     847           0 :                 rEscherFmt.mxEscherSet->CreateEmbeddedBitmapProperties( aBitmapUrl, eApiBmpMode );
     848           0 :                 rPicFmt.mnBmpMode = (eApiBmpMode == cssd::BitmapMode_REPEAT) ?
     849           0 :                     EXC_CHPICFORMAT_STACK : EXC_CHPICFORMAT_STRETCH;
     850           0 :             }
     851             :         }
     852           0 :         break;
     853             :         default:
     854             :             OSL_FAIL( "XclChPropSetHelper::ReadEscherProperties - unknown fill style" );
     855             :     }
     856           3 : }
     857             : 
     858          22 : void XclChPropSetHelper::ReadMarkerProperties(
     859             :         XclChMarkerFormat& rMarkerFmt, const ScfPropertySet& rPropSet, sal_uInt16 nFormatIdx )
     860             : {
     861             :     namespace cssc = ::com::sun::star::chart2;
     862             :     namespace cssa = ::com::sun::star::awt;
     863          22 :     cssc::Symbol aApiSymbol;
     864          22 :     if( rPropSet.GetProperty( aApiSymbol, EXC_CHPROP_SYMBOL ) )
     865             :     {
     866             :         // clear automatic flag
     867          22 :         ::set_flag( rMarkerFmt.mnFlags, EXC_CHMARKERFORMAT_AUTO, false );
     868             : 
     869             :         // symbol style
     870          22 :         switch( aApiSymbol.Style )
     871             :         {
     872             :             case cssc::SymbolStyle_NONE:
     873          10 :                 rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_NOSYMBOL;
     874          10 :             break;
     875             :             case cssc::SymbolStyle_STANDARD:
     876          10 :                 switch( aApiSymbol.StandardSymbol )
     877             :                 {
     878           4 :                     case 0:     rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_SQUARE;    break;  // square
     879           2 :                     case 1:     rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_DIAMOND;   break;  // diamond
     880           0 :                     case 2:     rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_STDDEV;    break;  // arrow down
     881           0 :                     case 3:     rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_TRIANGLE;  break;  // arrow up
     882           0 :                     case 4:     rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_DOWJ;      break;  // arrow right, same as import
     883           0 :                     case 5:     rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_PLUS;      break;  // arrow left
     884           0 :                     case 6:     rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_CROSS;     break;  // bow tie
     885           0 :                     case 7:     rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_STAR;      break;  // sand glass
     886           2 :                     case 8:     rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_CIRCLE;    break;  // circle new in LibO3.5
     887           0 :                     case 9:     rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_DIAMOND;   break;  // star new in LibO3.5
     888           0 :                     case 10:    rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_CROSS;     break;  // X new in LibO3.5
     889           0 :                     case 11:    rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_PLUS;      break;  // plus new in LibO3.5
     890           2 :                     case 12:    rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_STAR;      break;  // asterisk new in LibO3.5
     891           0 :                     case 13:    rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_STDDEV;    break;  // horizontal bar new in LibO3.5
     892           0 :                     case 14:    rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_STAR;      break;  // vertical bar new in LibO3.5
     893           0 :                     default:    rMarkerFmt.mnMarkerType = XclChartHelper::GetAutoMarkerType( nFormatIdx );
     894             :                 }
     895          10 :             break;
     896             :             default:
     897           2 :                 rMarkerFmt.mnMarkerType = XclChartHelper::GetAutoMarkerType( nFormatIdx );
     898             :         }
     899          22 :         bool bHasFillColor = XclChartHelper::HasMarkerFillColor( rMarkerFmt.mnMarkerType );
     900          22 :         ::set_flag( rMarkerFmt.mnFlags, EXC_CHMARKERFORMAT_NOFILL, !bHasFillColor );
     901             : 
     902             :         // symbol size
     903          22 :         sal_Int32 nApiSize = (aApiSymbol.Size.Width + aApiSymbol.Size.Height + 1) / 2;
     904          22 :         rMarkerFmt.mnMarkerSize = XclTools::GetTwipsFromHmm( nApiSize );
     905             : 
     906             :         // symbol colors
     907          22 :         rMarkerFmt.maLineColor = ScfApiHelper::ConvertFromApiColor( aApiSymbol.BorderColor );
     908          22 :         rMarkerFmt.maFillColor = ScfApiHelper::ConvertFromApiColor( aApiSymbol.FillColor );
     909          22 :     }
     910          22 : }
     911             : 
     912          70 : sal_uInt16 XclChPropSetHelper::ReadRotationProperties( const ScfPropertySet& rPropSet, bool bSupportsStacked )
     913             : {
     914             :     // chart2 handles rotation as double in the range [0,360)
     915          70 :     double fAngle = 0.0;
     916          70 :     rPropSet.GetProperty( fAngle, EXC_CHPROP_TEXTROTATION );
     917          70 :     bool bStacked = bSupportsStacked && rPropSet.GetBoolProperty( EXC_CHPROP_STACKCHARACTERS );
     918             :     return bStacked ? EXC_ROT_STACKED :
     919          70 :         XclTools::GetXclRotation( static_cast< sal_Int32 >( fAngle * 100.0 + 0.5 ) );
     920             : }
     921             : 
     922             : // write properties -----------------------------------------------------------
     923             : 
     924         346 : void XclChPropSetHelper::WriteLineProperties(
     925             :         ScfPropertySet& rPropSet, XclChObjectTable& rDashTable,
     926             :         const XclChLineFormat& rLineFmt, XclChPropertyMode ePropMode )
     927             : {
     928             :     namespace cssd = ::com::sun::star::drawing;
     929             : 
     930             :     // line width
     931         346 :     sal_Int32 nApiWidth = 0;    // 0 is the width of a hair line
     932         346 :     switch( rLineFmt.mnWeight )
     933             :     {
     934          50 :         case EXC_CHLINEFORMAT_SINGLE:   nApiWidth = 35;     break;
     935           3 :         case EXC_CHLINEFORMAT_DOUBLE:   nApiWidth = 70;     break;
     936           1 :         case EXC_CHLINEFORMAT_TRIPLE:   nApiWidth = 105;    break;
     937             :     }
     938             : 
     939             :     // line style
     940         346 :     cssd::LineStyle eApiStyle = cssd::LineStyle_NONE;
     941         346 :     sal_Int16 nApiTrans = 0;
     942         346 :     sal_Int32 nDotLen = ::std::min< sal_Int32 >( rLineFmt.mnWeight + 105, 210 );
     943         346 :     cssd::LineDash aApiDash( cssd::DashStyle_RECT, 0, nDotLen, 0, 4 * nDotLen, nDotLen );
     944             : 
     945         346 :     switch( rLineFmt.mnPattern )
     946             :     {
     947             :         case EXC_CHLINEFORMAT_SOLID:
     948         161 :             eApiStyle = cssd::LineStyle_SOLID;
     949         161 :         break;
     950             :         case EXC_CHLINEFORMAT_DARKTRANS:
     951           0 :             eApiStyle = cssd::LineStyle_SOLID; nApiTrans = 25;
     952           0 :         break;
     953             :         case EXC_CHLINEFORMAT_MEDTRANS:
     954           0 :             eApiStyle = cssd::LineStyle_SOLID; nApiTrans = 50;
     955           0 :         break;
     956             :         case EXC_CHLINEFORMAT_LIGHTTRANS:
     957           0 :             eApiStyle = cssd::LineStyle_SOLID; nApiTrans = 75;
     958           0 :         break;
     959             :         case EXC_CHLINEFORMAT_DASH:
     960           0 :             eApiStyle = cssd::LineStyle_DASH; aApiDash.Dashes = 1;
     961           0 :         break;
     962             :         case EXC_CHLINEFORMAT_DOT:
     963           0 :             eApiStyle = cssd::LineStyle_DASH; aApiDash.Dots = 1;
     964           0 :         break;
     965             :         case EXC_CHLINEFORMAT_DASHDOT:
     966           0 :             eApiStyle = cssd::LineStyle_DASH; aApiDash.Dashes = aApiDash.Dots = 1;
     967           0 :         break;
     968             :         case EXC_CHLINEFORMAT_DASHDOTDOT:
     969           0 :             eApiStyle = cssd::LineStyle_DASH; aApiDash.Dashes = 1; aApiDash.Dots = 2;
     970           0 :         break;
     971             :     }
     972             : 
     973             :     // line color
     974         346 :     sal_Int32 nApiColor = ScfApiHelper::ConvertToApiColor( rLineFmt.maColor );
     975             : 
     976             :     // try to insert the dash style and receive its name
     977         346 :     Any aDashNameAny;
     978         346 :     if( eApiStyle == cssd::LineStyle_DASH )
     979             :     {
     980           0 :         OUString aDashName = rDashTable.InsertObject( ::com::sun::star::uno::makeAny( aApiDash ) );
     981           0 :         if( !aDashName.isEmpty() )
     982           0 :             aDashNameAny <<= aDashName;
     983             :     }
     984             : 
     985             :     // write the properties
     986         346 :     ScfPropSetHelper& rLineHlp = GetLineHelper( ePropMode );
     987         346 :     rLineHlp.InitializeWrite();
     988         346 :     rLineHlp << eApiStyle << nApiWidth << nApiColor << nApiTrans << aDashNameAny;
     989         346 :     rLineHlp.WriteToPropertySet( rPropSet );
     990         346 : }
     991             : 
     992         142 : void XclChPropSetHelper::WriteAreaProperties( ScfPropertySet& rPropSet,
     993             :         const XclChAreaFormat& rAreaFmt, XclChPropertyMode ePropMode )
     994             : {
     995             :     namespace cssd = ::com::sun::star::drawing;
     996         142 :     cssd::FillStyle eFillStyle = cssd::FillStyle_NONE;
     997         142 :     Color aColor;
     998         142 :     sal_Int16 nTransparency = 0;
     999             : 
    1000             :     // fill color
    1001         142 :     if( rAreaFmt.mnPattern != EXC_PATT_NONE )
    1002             :     {
    1003          62 :         eFillStyle = cssd::FillStyle_SOLID;
    1004          62 :         aColor = XclTools::GetPatternColor( rAreaFmt.maPattColor, rAreaFmt.maBackColor, rAreaFmt.mnPattern );
    1005             :     }
    1006             : 
    1007             :     // write the properties
    1008         142 :     ScfPropSetHelper& rAreaHlp = GetAreaHelper( ePropMode );
    1009         142 :     rAreaHlp.InitializeWrite();
    1010         142 :     rAreaHlp << eFillStyle << aColor << nTransparency;
    1011         142 :     rAreaHlp.WriteToPropertySet( rPropSet );
    1012         142 : }
    1013             : 
    1014         150 : void XclChPropSetHelper::WriteEscherProperties( ScfPropertySet& rPropSet,
    1015             :         XclChObjectTable& rGradientTable, XclChObjectTable& /*rHatchTable*/, XclChObjectTable& rBitmapTable,
    1016             :         const XclChEscherFormat& rEscherFmt, const XclChPicFormat* pPicFmt,
    1017             :         sal_uInt32 nDffFillType, XclChPropertyMode ePropMode )
    1018             : {
    1019         150 :     if( rEscherFmt.mxItemSet )
    1020             :     {
    1021         150 :         if( const XFillStyleItem* pStyleItem = static_cast< const XFillStyleItem* >( rEscherFmt.mxItemSet->GetItem( XATTR_FILLSTYLE, false ) ) )
    1022             :         {
    1023         150 :             switch( pStyleItem->GetValue() )
    1024             :             {
    1025             :                 case drawing::FillStyle_SOLID:
    1026             :                     // #i84812# Excel 2007 writes Escher properties for solid fill
    1027         150 :                     if( const XFillColorItem* pColorItem = static_cast< const XFillColorItem* >( rEscherFmt.mxItemSet->GetItem( XATTR_FILLCOLOR, false ) ) )
    1028             :                     {
    1029             :                         namespace cssd = ::com::sun::star::drawing;
    1030             :                         // get solid transparence too
    1031         150 :                         const XFillTransparenceItem* pTranspItem = static_cast< const XFillTransparenceItem* >( rEscherFmt.mxItemSet->GetItem( XATTR_FILLTRANSPARENCE, false ) );
    1032         150 :                         sal_uInt16 nTransp = pTranspItem ? pTranspItem->GetValue() : 0;
    1033         150 :                         ScfPropSetHelper& rAreaHlp = GetAreaHelper( ePropMode );
    1034         150 :                         rAreaHlp.InitializeWrite();
    1035         150 :                         rAreaHlp << cssd::FillStyle_SOLID << pColorItem->GetColorValue() << static_cast< sal_Int16 >( nTransp );
    1036         150 :                         rAreaHlp.WriteToPropertySet( rPropSet );
    1037             :                     }
    1038         150 :                 break;
    1039             :                 case drawing::FillStyle_GRADIENT:
    1040           0 :                     if( const XFillGradientItem* pGradItem = static_cast< const XFillGradientItem* >( rEscherFmt.mxItemSet->GetItem( XATTR_FILLGRADIENT, false ) ) )
    1041             :                     {
    1042           0 :                         Any aGradientAny;
    1043           0 :                         if( pGradItem->QueryValue( aGradientAny, MID_FILLGRADIENT ) )
    1044             :                         {
    1045           0 :                             OUString aGradName = rGradientTable.InsertObject( aGradientAny );
    1046           0 :                             if( !aGradName.isEmpty() )
    1047             :                             {
    1048             :                                 namespace cssd = ::com::sun::star::drawing;
    1049           0 :                                 ScfPropSetHelper& rGradHlp = GetGradientHelper( ePropMode );
    1050           0 :                                 rGradHlp.InitializeWrite();
    1051           0 :                                 rGradHlp << cssd::FillStyle_GRADIENT << aGradName;
    1052           0 :                                 rGradHlp.WriteToPropertySet( rPropSet );
    1053           0 :                             }
    1054           0 :                         }
    1055             :                     }
    1056           0 :                 break;
    1057             :                 case drawing::FillStyle_BITMAP:
    1058           0 :                     if( const XFillBitmapItem* pBmpItem = static_cast< const XFillBitmapItem* >( rEscherFmt.mxItemSet->GetItem( XATTR_FILLBITMAP, false ) ) )
    1059             :                     {
    1060           0 :                         Any aBitmapAny;
    1061           0 :                         if( pBmpItem->QueryValue( aBitmapAny, MID_GRAFURL ) )
    1062             :                         {
    1063           0 :                             OUString aBmpName = rBitmapTable.InsertObject( aBitmapAny );
    1064           0 :                             if( !aBmpName.isEmpty() )
    1065             :                             {
    1066             :                                 namespace cssd = ::com::sun::star::drawing;
    1067             :                                 /*  #i71810# Caller decides whether to use a CHPICFORMAT record for bitmap mode.
    1068             :                                     If not passed, detect fill mode from the DFF property 'fill-type'. */
    1069           0 :                                 bool bStretch = pPicFmt ? (pPicFmt->mnBmpMode == EXC_CHPICFORMAT_STRETCH) : (nDffFillType == mso_fillPicture);
    1070           0 :                                 cssd::BitmapMode eApiBmpMode = bStretch ? cssd::BitmapMode_STRETCH : cssd::BitmapMode_REPEAT;
    1071           0 :                                 maBitmapHlp.InitializeWrite();
    1072           0 :                                 maBitmapHlp << cssd::FillStyle_BITMAP << aBmpName << eApiBmpMode;
    1073           0 :                                 maBitmapHlp.WriteToPropertySet( rPropSet );
    1074           0 :                             }
    1075           0 :                         }
    1076             :                     }
    1077           0 :                 break;
    1078             :                 default:
    1079             :                     OSL_FAIL( "XclChPropSetHelper::WriteEscherProperties - unknown fill mode" );
    1080             :             }
    1081             :         }
    1082             :     }
    1083         150 : }
    1084             : 
    1085           4 : void XclChPropSetHelper::WriteMarkerProperties(
    1086             :         ScfPropertySet& rPropSet, const XclChMarkerFormat& rMarkerFmt )
    1087             : {
    1088             :     namespace cssc = ::com::sun::star::chart2;
    1089             :     namespace cssa = ::com::sun::star::awt;
    1090             : 
    1091             :     // symbol style
    1092           4 :     cssc::Symbol aApiSymbol;
    1093           4 :     aApiSymbol.Style = cssc::SymbolStyle_STANDARD;
    1094           4 :     switch( rMarkerFmt.mnMarkerType )
    1095             :     {
    1096           0 :         case EXC_CHMARKERFORMAT_NOSYMBOL:   aApiSymbol.Style = cssc::SymbolStyle_NONE;  break;
    1097           0 :         case EXC_CHMARKERFORMAT_SQUARE:     aApiSymbol.StandardSymbol = 0;              break;  // square
    1098           3 :         case EXC_CHMARKERFORMAT_DIAMOND:    aApiSymbol.StandardSymbol = 1;              break;  // diamond
    1099           0 :         case EXC_CHMARKERFORMAT_TRIANGLE:   aApiSymbol.StandardSymbol = 3;              break;  // arrow up
    1100           0 :         case EXC_CHMARKERFORMAT_CROSS:      aApiSymbol.StandardSymbol = 10;             break;  // X, legacy bow tie
    1101           1 :         case EXC_CHMARKERFORMAT_STAR:       aApiSymbol.StandardSymbol = 12;             break;  // asterisk, legacy sand glass
    1102           0 :         case EXC_CHMARKERFORMAT_DOWJ:       aApiSymbol.StandardSymbol = 4;              break;  // arrow right, same as export
    1103           0 :         case EXC_CHMARKERFORMAT_STDDEV:     aApiSymbol.StandardSymbol = 13;             break;  // horizontal bar, legacy arrow down
    1104           0 :         case EXC_CHMARKERFORMAT_CIRCLE:     aApiSymbol.StandardSymbol = 8;              break;  // circle, legacy arrow right
    1105           0 :         case EXC_CHMARKERFORMAT_PLUS:       aApiSymbol.StandardSymbol = 11;             break;  // plus, legacy arrow left
    1106           0 :         default: break;
    1107             :     }
    1108             : 
    1109             :     // symbol size
    1110           4 :     sal_Int32 nApiSize = XclTools::GetHmmFromTwips( rMarkerFmt.mnMarkerSize );
    1111           4 :     aApiSymbol.Size = cssa::Size( nApiSize, nApiSize );
    1112             : 
    1113             :     // symbol colors
    1114           4 :     aApiSymbol.FillColor = ScfApiHelper::ConvertToApiColor( rMarkerFmt.maFillColor );
    1115           4 :     aApiSymbol.BorderColor = ::get_flag( rMarkerFmt.mnFlags, EXC_CHMARKERFORMAT_NOLINE ) ?
    1116           4 :         aApiSymbol.FillColor : ScfApiHelper::ConvertToApiColor( rMarkerFmt.maLineColor );
    1117             : 
    1118             :     // set the property
    1119           4 :     rPropSet.SetProperty( EXC_CHPROP_SYMBOL, aApiSymbol );
    1120           4 : }
    1121             : 
    1122         176 : void XclChPropSetHelper::WriteRotationProperties(
    1123             :         ScfPropertySet& rPropSet, sal_uInt16 nRotation, bool bSupportsStacked )
    1124             : {
    1125         176 :     if( nRotation != EXC_CHART_AUTOROTATION )
    1126             :     {
    1127             :         // chart2 handles rotation as double in the range [0,360)
    1128          88 :         double fAngle = XclTools::GetScRotation( nRotation, 0 ) / 100.0;
    1129          88 :         rPropSet.SetProperty( EXC_CHPROP_TEXTROTATION, fAngle );
    1130          88 :         if( bSupportsStacked )
    1131          29 :             rPropSet.SetProperty( EXC_CHPROP_STACKCHARACTERS, nRotation == EXC_ROT_STACKED );
    1132             :     }
    1133         176 : }
    1134             : 
    1135             : // private --------------------------------------------------------------------
    1136             : 
    1137         572 : ScfPropSetHelper& XclChPropSetHelper::GetLineHelper( XclChPropertyMode ePropMode )
    1138             : {
    1139         572 :     switch( ePropMode )
    1140             :     {
    1141         422 :         case EXC_CHPROPMODE_COMMON:         return maLineHlpCommon;
    1142          26 :         case EXC_CHPROPMODE_LINEARSERIES:   return maLineHlpLinear;
    1143         124 :         case EXC_CHPROPMODE_FILLEDSERIES:   return maLineHlpFilled;
    1144             :         default: OSL_FAIL( "XclChPropSetHelper::GetLineHelper - unknown property mode" );
    1145             :     }
    1146           0 :     return maLineHlpCommon;
    1147             : }
    1148             : 
    1149         408 : ScfPropSetHelper& XclChPropSetHelper::GetAreaHelper( XclChPropertyMode ePropMode )
    1150             : {
    1151         408 :     switch( ePropMode )
    1152             :     {
    1153         226 :         case EXC_CHPROPMODE_COMMON:         return maAreaHlpCommon;
    1154         182 :         case EXC_CHPROPMODE_FILLEDSERIES:   return maAreaHlpFilled;
    1155             :         default:    OSL_FAIL( "XclChPropSetHelper::GetAreaHelper - unknown property mode" );
    1156             :     }
    1157           0 :     return maAreaHlpCommon;
    1158             : }
    1159             : 
    1160           0 : ScfPropSetHelper& XclChPropSetHelper::GetGradientHelper( XclChPropertyMode ePropMode )
    1161             : {
    1162           0 :     switch( ePropMode )
    1163             :     {
    1164           0 :         case EXC_CHPROPMODE_COMMON:         return maGradHlpCommon;
    1165           0 :         case EXC_CHPROPMODE_FILLEDSERIES:   return maGradHlpFilled;
    1166             :         default:    OSL_FAIL( "XclChPropSetHelper::GetGradientHelper - unknown property mode" );
    1167             :     }
    1168           0 :     return maGradHlpCommon;
    1169             : }
    1170             : 
    1171           0 : ScfPropSetHelper& XclChPropSetHelper::GetHatchHelper( XclChPropertyMode ePropMode )
    1172             : {
    1173           0 :     switch( ePropMode )
    1174             :     {
    1175           0 :         case EXC_CHPROPMODE_COMMON:         return maHatchHlpCommon;
    1176           0 :         case EXC_CHPROPMODE_FILLEDSERIES:   return maHatchHlpFilled;
    1177             :         default:    OSL_FAIL( "XclChPropSetHelper::GetHatchHelper - unknown property mode" );
    1178             :     }
    1179           0 :     return maHatchHlpCommon;
    1180             : }
    1181             : 
    1182             : namespace {
    1183             : 
    1184             : /*  The following local functions implement getting the XShape interface of all
    1185             :     supported title objects (chart and axes). This needs some effort due to the
    1186             :     design of the old Chart1 API used to access these objects. */
    1187             : 
    1188             : /** A code fragment that returns a shape object from the passed shape supplier
    1189             :     using the specified interface function. Checks a boolean property first. */
    1190             : #define EXC_FRAGMENT_GETTITLESHAPE( shape_supplier, supplier_func, property_name ) \
    1191             :     ScfPropertySet aPropSet( shape_supplier ); \
    1192             :     if( shape_supplier.is() && aPropSet.GetBoolProperty( #property_name ) ) \
    1193             :         return shape_supplier->supplier_func(); \
    1194             :     return Reference< XShape >(); \
    1195             : 
    1196             : /** Implements a function returning the drawing shape of an axis title, if
    1197             :     existing, using the specified API interface and its function. */
    1198             : #define EXC_DEFINEFUNC_GETAXISTITLESHAPE( func_name, interface_type, supplier_func, property_name ) \
    1199             : Reference< XShape > func_name( const Reference< cssc::XChartDocument >& rxChart1Doc ) \
    1200             : { \
    1201             :     Reference< cssc::interface_type > xAxisSupp( rxChart1Doc->getDiagram(), UNO_QUERY ); \
    1202             :     EXC_FRAGMENT_GETTITLESHAPE( xAxisSupp, supplier_func, property_name ) \
    1203             : }
    1204             : 
    1205             : /** Returns the drawing shape of the main title, if existing. */
    1206          20 : Reference< XShape > lclGetMainTitleShape( const Reference< cssc::XChartDocument >& rxChart1Doc )
    1207             : {
    1208          20 :     EXC_FRAGMENT_GETTITLESHAPE( rxChart1Doc, getTitle, HasMainTitle )
    1209             : }
    1210             : 
    1211           0 : EXC_DEFINEFUNC_GETAXISTITLESHAPE( lclGetXAxisTitleShape, XAxisXSupplier, getXAxisTitle, HasXAxisTitle )
    1212           0 : EXC_DEFINEFUNC_GETAXISTITLESHAPE( lclGetYAxisTitleShape, XAxisYSupplier, getYAxisTitle, HasYAxisTitle )
    1213           0 : EXC_DEFINEFUNC_GETAXISTITLESHAPE( lclGetZAxisTitleShape, XAxisZSupplier, getZAxisTitle, HasZAxisTitle )
    1214           0 : EXC_DEFINEFUNC_GETAXISTITLESHAPE( lclGetSecXAxisTitleShape, XSecondAxisTitleSupplier, getSecondXAxisTitle, HasSecondaryXAxisTitle )
    1215           0 : EXC_DEFINEFUNC_GETAXISTITLESHAPE( lclGetSecYAxisTitleShape, XSecondAxisTitleSupplier, getSecondYAxisTitle, HasSecondaryYAxisTitle )
    1216             : 
    1217             : #undef EXC_DEFINEFUNC_GETAXISTITLESHAPE
    1218             : #undef EXC_IMPLEMENT_GETTITLESHAPE
    1219             : 
    1220             : } // namespace
    1221             : 
    1222          72 : XclChRootData::XclChRootData()
    1223          72 :     : mxTypeInfoProv(new XclChTypeInfoProvider)
    1224          72 :     , mxFmtInfoProv(new XclChFormatInfoProvider)
    1225             :     , mnBorderGapX(0)
    1226             :     , mnBorderGapY(0)
    1227             :     , mfUnitSizeX(0.0)
    1228         216 :     , mfUnitSizeY(0.0)
    1229             : {
    1230             :     // remember some title shape getter functions
    1231          72 :     maGetShapeFuncs[ XclChTextKey( EXC_CHTEXTTYPE_TITLE ) ] = lclGetMainTitleShape;
    1232          72 :     maGetShapeFuncs[ XclChTextKey( EXC_CHTEXTTYPE_AXISTITLE, EXC_CHAXESSET_PRIMARY, EXC_CHAXIS_X ) ] = lclGetXAxisTitleShape;
    1233          72 :     maGetShapeFuncs[ XclChTextKey( EXC_CHTEXTTYPE_AXISTITLE, EXC_CHAXESSET_PRIMARY, EXC_CHAXIS_Y ) ] = lclGetYAxisTitleShape;
    1234          72 :     maGetShapeFuncs[ XclChTextKey( EXC_CHTEXTTYPE_AXISTITLE, EXC_CHAXESSET_PRIMARY, EXC_CHAXIS_Z ) ] = lclGetZAxisTitleShape;
    1235          72 :     maGetShapeFuncs[ XclChTextKey( EXC_CHTEXTTYPE_AXISTITLE, EXC_CHAXESSET_SECONDARY, EXC_CHAXIS_X ) ] = lclGetSecXAxisTitleShape;
    1236          72 :     maGetShapeFuncs[ XclChTextKey( EXC_CHTEXTTYPE_AXISTITLE, EXC_CHAXESSET_SECONDARY, EXC_CHAXIS_Y ) ] = lclGetSecYAxisTitleShape;
    1237          72 : }
    1238             : 
    1239          72 : XclChRootData::~XclChRootData()
    1240             : {
    1241          72 : }
    1242             : 
    1243          72 : void XclChRootData::InitConversion( const XclRoot& rRoot, const Reference< XChartDocument >& rxChartDoc, const Rectangle& rChartRect )
    1244             : {
    1245             :     // remember chart document reference and chart shape position/size
    1246             :     OSL_ENSURE( rxChartDoc.is(), "XclChRootData::InitConversion - missing chart document" );
    1247          72 :     mxChartDoc = rxChartDoc;
    1248          72 :     maChartRect = rChartRect;
    1249             : 
    1250             :     // Excel excludes a border of 5 pixels in each direction from chart area
    1251          72 :     mnBorderGapX = rRoot.GetHmmFromPixelX( 5.0 );
    1252          72 :     mnBorderGapY = rRoot.GetHmmFromPixelY( 5.0 );
    1253             : 
    1254             :     // size of a chart unit in 1/100 mm
    1255          72 :     mfUnitSizeX = ::std::max< double >( maChartRect.GetWidth() - 2 * mnBorderGapX, mnBorderGapX ) / EXC_CHART_TOTALUNITS;
    1256          72 :     mfUnitSizeY = ::std::max< double >( maChartRect.GetHeight() - 2 * mnBorderGapY, mnBorderGapY ) / EXC_CHART_TOTALUNITS;
    1257             : 
    1258             :     // create object tables
    1259          72 :     Reference< XMultiServiceFactory > xFactory( mxChartDoc, UNO_QUERY );
    1260             :     mxLineDashTable.reset( new XclChObjectTable(
    1261          72 :         xFactory, SERVICE_DRAWING_DASHTABLE, "Excel line dash " ) );
    1262             :     mxGradientTable.reset( new XclChObjectTable(
    1263          72 :         xFactory, SERVICE_DRAWING_GRADIENTTABLE, "Excel gradient " ) );
    1264             :     mxHatchTable.reset( new XclChObjectTable(
    1265          72 :         xFactory, SERVICE_DRAWING_HATCHTABLE, "Excel hatch " ) );
    1266             :     mxBitmapTable.reset( new XclChObjectTable(
    1267          72 :         xFactory, SERVICE_DRAWING_BITMAPTABLE, "Excel bitmap " ) );
    1268          72 : }
    1269             : 
    1270          72 : void XclChRootData::FinishConversion()
    1271             : {
    1272             :     // forget formatting object tables
    1273          72 :     mxBitmapTable.reset();
    1274          72 :     mxHatchTable.reset();
    1275          72 :     mxGradientTable.reset();
    1276          72 :     mxLineDashTable.reset();
    1277             :     // forget chart document reference
    1278          72 :     mxChartDoc.clear();
    1279          72 : }
    1280             : 
    1281          20 : Reference< XShape > XclChRootData::GetTitleShape( const XclChTextKey& rTitleKey ) const
    1282             : {
    1283          20 :     XclChGetShapeFuncMap::const_iterator aIt = maGetShapeFuncs.find( rTitleKey );
    1284             :     OSL_ENSURE( aIt != maGetShapeFuncs.end(), "XclChRootData::GetTitleShape - invalid title key" );
    1285          20 :     Reference< cssc::XChartDocument > xChart1Doc( mxChartDoc, UNO_QUERY );
    1286          20 :     Reference< XShape > xTitleShape;
    1287          20 :     if( xChart1Doc.is() && (aIt != maGetShapeFuncs.end()) )
    1288          20 :         xTitleShape = (aIt->second)( xChart1Doc );
    1289          20 :     return xTitleShape;
    1290          30 : }
    1291             : 
    1292             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11