LCOV - code coverage report
Current view: top level - sc/source/filter/excel - xlchart.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 221 514 43.0 %
Date: 2012-08-25 Functions: 49 78 62.8 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 141 811 17.4 %

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

Generated by: LCOV version 1.10