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

Generated by: LCOV version 1.10