1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include "oox/drawingml/chart/typegroupconverter.hxx"
22 #include <com/sun/star/chart/DataLabelPlacement.hpp>
23 #include <com/sun/star/chart2/CartesianCoordinateSystem2d.hpp>
24 #include <com/sun/star/chart2/CartesianCoordinateSystem3d.hpp>
25 #include <com/sun/star/chart2/PolarCoordinateSystem2d.hpp>
26 #include <com/sun/star/chart2/PolarCoordinateSystem3d.hpp>
27 #include <com/sun/star/chart2/CurveStyle.hpp>
28 #include <com/sun/star/chart2/DataPointGeometry3D.hpp>
29 #include <com/sun/star/chart2/StackingDirection.hpp>
30 #include <com/sun/star/chart2/Symbol.hpp>
31 #include <com/sun/star/chart2/XChartTypeContainer.hpp>
32 #include <com/sun/star/chart2/XCoordinateSystem.hpp>
33 #include <com/sun/star/chart2/XDataSeriesContainer.hpp>
34 #include <com/sun/star/chart2/data/XDataSink.hpp>
35 #include <com/sun/star/drawing/LineStyle.hpp>
36 #include "oox/drawingml/lineproperties.hxx"
37 #include "oox/drawingml/chart/seriesconverter.hxx"
38 #include "oox/drawingml/chart/typegroupmodel.hxx"
39 #include "oox/helper/containerhelper.hxx"
45 // ============================================================================
47 using namespace ::com::sun::star::beans
;
48 using namespace ::com::sun::star::chart2
;
49 using namespace ::com::sun::star::chart2::data
;
50 using namespace ::com::sun::star::uno
;
52 // ============================================================================
56 // chart type service names
57 const sal_Char SERVICE_CHART2_AREA
[] = "com.sun.star.chart2.AreaChartType";
58 const sal_Char SERVICE_CHART2_CANDLE
[] = "com.sun.star.chart2.CandleStickChartType";
59 const sal_Char SERVICE_CHART2_COLUMN
[] = "com.sun.star.chart2.ColumnChartType";
60 const sal_Char SERVICE_CHART2_LINE
[] = "com.sun.star.chart2.LineChartType";
61 const sal_Char SERVICE_CHART2_NET
[] = "com.sun.star.chart2.NetChartType";
62 const sal_Char SERVICE_CHART2_FILLEDNET
[] = "com.sun.star.chart2.FilledNetChartType";
63 const sal_Char SERVICE_CHART2_PIE
[] = "com.sun.star.chart2.PieChartType";
64 const sal_Char SERVICE_CHART2_SCATTER
[] = "com.sun.star.chart2.ScatterChartType";
65 const sal_Char SERVICE_CHART2_BUBBLE
[] = "com.sun.star.chart2.BubbleChartType";
66 const sal_Char SERVICE_CHART2_SURFACE
[] = "com.sun.star.chart2.ColumnChartType"; // Todo
68 namespace csscd
= ::com::sun::star::chart::DataLabelPlacement
;
70 static const TypeGroupInfo spTypeInfos
[] =
72 // type-id type-category service varied-point-color default label pos comb2d supp3d polar area2d 1stvis xcateg swap stack revers betw picopt
73 { TYPEID_BAR
, TYPECATEGORY_BAR
, SERVICE_CHART2_COLUMN
, VARPOINTMODE_SINGLE
, csscd::OUTSIDE
, true, true, false, true, false, true, false, true, false, true, true },
74 { TYPEID_HORBAR
, TYPECATEGORY_BAR
, SERVICE_CHART2_COLUMN
, VARPOINTMODE_SINGLE
, csscd::OUTSIDE
, false, true, false, true, false, true, true, true, false, true, true },
75 { TYPEID_LINE
, TYPECATEGORY_LINE
, SERVICE_CHART2_LINE
, VARPOINTMODE_SINGLE
, csscd::RIGHT
, true, true, false, false, false, true, false, true, false, true, false },
76 { TYPEID_AREA
, TYPECATEGORY_LINE
, SERVICE_CHART2_AREA
, VARPOINTMODE_NONE
, csscd::CENTER
, true, true, false, true, false, true, false, true, true, false, false },
77 { TYPEID_STOCK
, TYPECATEGORY_LINE
, SERVICE_CHART2_CANDLE
, VARPOINTMODE_NONE
, csscd::RIGHT
, true, false, false, false, false, true, false, true, false, true, false },
78 { TYPEID_RADARLINE
, TYPECATEGORY_RADAR
, SERVICE_CHART2_NET
, VARPOINTMODE_SINGLE
, csscd::TOP
, false, false, true, false, false, true, false, false, false, false, false },
79 { TYPEID_RADARAREA
, TYPECATEGORY_RADAR
, SERVICE_CHART2_FILLEDNET
, VARPOINTMODE_NONE
, csscd::TOP
, false, false, true, true, false, true, false, false, true, false, false },
80 { TYPEID_PIE
, TYPECATEGORY_PIE
, SERVICE_CHART2_PIE
, VARPOINTMODE_MULTI
, csscd::AVOID_OVERLAP
, false, true, true, true, true, true, false, false, false, false, false },
81 { TYPEID_DOUGHNUT
, TYPECATEGORY_PIE
, SERVICE_CHART2_PIE
, VARPOINTMODE_MULTI
, csscd::AVOID_OVERLAP
, false, true, true, true, false, true, false, false, false, false, false },
82 { TYPEID_OFPIE
, TYPECATEGORY_PIE
, SERVICE_CHART2_PIE
, VARPOINTMODE_MULTI
, csscd::AVOID_OVERLAP
, false, true, true, true, true, true, false, false, false, false, false },
83 { TYPEID_SCATTER
, TYPECATEGORY_SCATTER
, SERVICE_CHART2_SCATTER
, VARPOINTMODE_SINGLE
, csscd::RIGHT
, true, true, false, false, false, false, false, false, false, false, false },
84 { TYPEID_BUBBLE
, TYPECATEGORY_SCATTER
, SERVICE_CHART2_BUBBLE
, VARPOINTMODE_SINGLE
, csscd::RIGHT
, false, false, false, true, false, false, false, false, false, false, false },
85 { TYPEID_SURFACE
, TYPECATEGORY_SURFACE
, SERVICE_CHART2_SURFACE
, VARPOINTMODE_NONE
, csscd::RIGHT
, false, true, false, true, false, true, false, false, false, false, false }
88 static const TypeGroupInfo saUnknownTypeInfo
=
89 { TYPEID_UNKNOWN
, TYPECATEGORY_BAR
, SERVICE_CHART2_COLUMN
, VARPOINTMODE_SINGLE
, csscd::OUTSIDE
, true, true, false, true, false, true, false, true, false, true, true };
91 const TypeGroupInfo
& lclGetTypeInfoFromTypeId( TypeId eTypeId
)
93 const TypeGroupInfo
* pEnd
= STATIC_ARRAY_END( spTypeInfos
);
94 for( const TypeGroupInfo
* pIt
= spTypeInfos
; pIt
!= pEnd
; ++pIt
)
95 if( pIt
->meTypeId
== eTypeId
)
97 OSL_ENSURE( eTypeId
== TYPEID_UNKNOWN
, "lclGetTypeInfoFromTypeId - unexpected chart type identifier" );
98 return saUnknownTypeInfo
;
103 // ============================================================================
105 UpDownBarsConverter::UpDownBarsConverter( const ConverterRoot
& rParent
, UpDownBarsModel
& rModel
) :
106 ConverterBase
< UpDownBarsModel
>( rParent
, rModel
)
110 UpDownBarsConverter::~UpDownBarsConverter()
114 void UpDownBarsConverter::convertFromModel( const Reference
< XChartType
>& rxChartType
)
116 PropertySet
aTypeProp( rxChartType
);
119 Reference
< XPropertySet
> xWhitePropSet
;
120 if( aTypeProp
.getProperty( xWhitePropSet
, PROP_WhiteDay
) )
122 PropertySet
aPropSet( xWhitePropSet
);
123 getFormatter().convertFrameFormatting( aPropSet
, mrModel
.mxUpBars
, OBJECTTYPE_UPBAR
);
127 Reference
< XPropertySet
> xBlackPropSet
;
128 if( aTypeProp
.getProperty( xBlackPropSet
, PROP_BlackDay
) )
130 PropertySet
aPropSet( xBlackPropSet
);
131 getFormatter().convertFrameFormatting( aPropSet
, mrModel
.mxDownBars
, OBJECTTYPE_DOWNBAR
);
135 // ============================================================================
137 TypeGroupConverter::TypeGroupConverter( const ConverterRoot
& rParent
, TypeGroupModel
& rModel
) :
138 ConverterBase
< TypeGroupModel
>( rParent
, rModel
),
141 TypeId eTypeId
= TYPEID_UNKNOWN
;
142 switch( mrModel
.mnTypeId
)
144 #define ENSURE_AXESCOUNT( min, max ) OSL_ENSURE( (min <= (int)mrModel.maAxisIds.size()) && ((int)mrModel.maAxisIds.size() <= max), "TypeGroupConverter::TypeGroupConverter - invalid axes count" )
145 case C_TOKEN( area3DChart
): ENSURE_AXESCOUNT( 2, 3 ); eTypeId
= TYPEID_AREA
; mb3dChart
= true; break;
146 case C_TOKEN( areaChart
): ENSURE_AXESCOUNT( 2, 2 ); eTypeId
= TYPEID_AREA
; mb3dChart
= false; break;
147 case C_TOKEN( bar3DChart
): ENSURE_AXESCOUNT( 2, 3 ); eTypeId
= TYPEID_BAR
; mb3dChart
= true; break;
148 case C_TOKEN( barChart
): ENSURE_AXESCOUNT( 2, 2 ); eTypeId
= TYPEID_BAR
; mb3dChart
= false; break;
149 case C_TOKEN( bubbleChart
): ENSURE_AXESCOUNT( 2, 2 ); eTypeId
= TYPEID_BUBBLE
; mb3dChart
= false; break;
150 case C_TOKEN( doughnutChart
): ENSURE_AXESCOUNT( 0, 0 ); eTypeId
= TYPEID_DOUGHNUT
; mb3dChart
= false; break;
151 case C_TOKEN( line3DChart
): ENSURE_AXESCOUNT( 3, 3 ); eTypeId
= TYPEID_LINE
; mb3dChart
= true; break;
152 case C_TOKEN( lineChart
): ENSURE_AXESCOUNT( 2, 2 ); eTypeId
= TYPEID_LINE
; mb3dChart
= false; break;
153 case C_TOKEN( ofPieChart
): ENSURE_AXESCOUNT( 0, 0 ); eTypeId
= TYPEID_OFPIE
; mb3dChart
= false; break;
154 case C_TOKEN( pie3DChart
): ENSURE_AXESCOUNT( 0, 0 ); eTypeId
= TYPEID_PIE
; mb3dChart
= true; break;
155 case C_TOKEN( pieChart
): ENSURE_AXESCOUNT( 0, 0 ); eTypeId
= TYPEID_PIE
; mb3dChart
= false; break;
156 case C_TOKEN( radarChart
): ENSURE_AXESCOUNT( 2, 2 ); eTypeId
= TYPEID_RADARLINE
; mb3dChart
= false; break;
157 case C_TOKEN( scatterChart
): ENSURE_AXESCOUNT( 2, 2 ); eTypeId
= TYPEID_SCATTER
; mb3dChart
= false; break;
158 case C_TOKEN( stockChart
): ENSURE_AXESCOUNT( 2, 2 ); eTypeId
= TYPEID_STOCK
; mb3dChart
= false; break;
159 case C_TOKEN( surface3DChart
): ENSURE_AXESCOUNT( 3, 3 ); eTypeId
= TYPEID_SURFACE
; mb3dChart
= true; break;
160 case C_TOKEN( surfaceChart
): ENSURE_AXESCOUNT( 2, 3 ); eTypeId
= TYPEID_SURFACE
; mb3dChart
= true; break; // 3D bar chart from all surface charts
161 default: OSL_FAIL( "TypeGroupConverter::TypeGroupConverter - unknown chart type" );
162 #undef ENSURE_AXESCOUNT
165 // special handling for some chart types
169 if( mrModel
.mnBarDir
== XML_bar
)
170 eTypeId
= TYPEID_HORBAR
;
172 case TYPEID_RADARLINE
:
173 if( mrModel
.mnRadarStyle
== XML_filled
)
174 eTypeId
= TYPEID_RADARAREA
;
177 // create a deep 3D bar chart from surface charts
178 mrModel
.mnGrouping
= XML_standard
;
183 // set the chart type info struct for the current chart type
184 maTypeInfo
= lclGetTypeInfoFromTypeId( eTypeId
);
187 TypeGroupConverter::~TypeGroupConverter()
191 bool TypeGroupConverter::isStacked() const
193 return maTypeInfo
.mbSupportsStacking
&& (mrModel
.mnGrouping
== XML_stacked
);
196 bool TypeGroupConverter::isPercent() const
198 return maTypeInfo
.mbSupportsStacking
&& (mrModel
.mnGrouping
== XML_percentStacked
);
201 bool TypeGroupConverter::is3dChart() const
206 bool TypeGroupConverter::isWall3dChart() const
208 return mb3dChart
&& (maTypeInfo
.meTypeCategory
!= TYPECATEGORY_PIE
);
211 bool TypeGroupConverter::isDeep3dChart() const
213 return isWall3dChart() && (mrModel
.mnGrouping
== XML_standard
);
216 bool TypeGroupConverter::isSeriesFrameFormat() const
218 return mb3dChart
|| maTypeInfo
.mbSeriesIsFrame2d
;
221 ObjectType
TypeGroupConverter::getSeriesObjectType() const
223 return mb3dChart
? OBJECTTYPE_FILLEDSERIES3D
:
224 (maTypeInfo
.mbSeriesIsFrame2d
? OBJECTTYPE_FILLEDSERIES2D
: OBJECTTYPE_LINEARSERIES2D
);
227 bool TypeGroupConverter::isReverseSeries() const
229 return maTypeInfo
.mbReverseSeries
&& !mb3dChart
&& !isStacked() && !isPercent();
232 OUString
TypeGroupConverter::getSingleSeriesTitle() const
234 OUString aSeriesTitle
;
235 if( !mrModel
.maSeries
.empty() && (maTypeInfo
.mbSingleSeriesVis
|| (mrModel
.maSeries
.size() == 1)) )
236 if( const TextModel
* pText
= mrModel
.maSeries
.front()->mxText
.get() )
237 if( const DataSequenceModel
* pDataSeq
= pText
->mxDataSeq
.get() )
238 if( !pDataSeq
->maData
.empty() )
239 pDataSeq
->maData
.begin()->second
>>= aSeriesTitle
;
243 Reference
< XCoordinateSystem
> TypeGroupConverter::createCoordinateSystem()
245 // create the coordinate system object
246 Reference
< css::uno::XComponentContext
> xContext
= getComponentContext();
247 Reference
< XCoordinateSystem
> xCoordSystem
;
248 if( maTypeInfo
.mbPolarCoordSystem
)
251 xCoordSystem
= css::chart2::PolarCoordinateSystem3d::create(xContext
);
253 xCoordSystem
= css::chart2::PolarCoordinateSystem2d::create(xContext
);
258 xCoordSystem
= css::chart2::CartesianCoordinateSystem3d::create(xContext
);
260 xCoordSystem
= css::chart2::CartesianCoordinateSystem2d::create(xContext
);
264 if( maTypeInfo
.mbSwappedAxesSet
)
266 PropertySet
aPropSet( xCoordSystem
);
267 aPropSet
.setProperty( PROP_SwapXAndYAxis
, true );
273 Reference
< XLabeledDataSequence
> TypeGroupConverter::createCategorySequence()
275 Reference
< XLabeledDataSequence
> xLabeledSeq
;
276 /* Find first existing category sequence. The bahaviour of Excel 2007 is
277 different to Excel 2003, which always used the category sequence of the
278 first series, even if it was empty. */
279 for( TypeGroupModel::SeriesVector::iterator aIt
= mrModel
.maSeries
.begin(), aEnd
= mrModel
.maSeries
.end(); !xLabeledSeq
.is() && (aIt
!= aEnd
); ++aIt
)
281 if( (*aIt
)->maSources
.has( SeriesModel::CATEGORIES
) )
283 SeriesConverter
aSeriesConv( *this, **aIt
);
284 xLabeledSeq
= aSeriesConv
.createCategorySequence( "categories" );
290 void TypeGroupConverter::convertFromModel( const Reference
< XDiagram
>& rxDiagram
,
291 const Reference
< XCoordinateSystem
>& rxCoordSystem
,
292 sal_Int32 nAxesSetIdx
, bool bSupportsVaryColorsByPoint
)
296 // create the chart type object
297 OUString aService
= OUString::createFromAscii( maTypeInfo
.mpcServiceName
);
298 Reference
< XChartType
> xChartType( createInstance( aService
), UNO_QUERY_THROW
);
300 // additional properties
301 PropertySet
aDiaProp( rxDiagram
);
302 PropertySet
aTypeProp( xChartType
);
303 switch( maTypeInfo
.meTypeCategory
)
305 case TYPECATEGORY_BAR
:
307 Sequence
< sal_Int32
> aInt32Seq( 2 );
308 aInt32Seq
[ 0 ] = aInt32Seq
[ 1 ] = mrModel
.mnOverlap
;
309 aTypeProp
.setProperty( PROP_OverlapSequence
, aInt32Seq
);
310 aInt32Seq
[ 0 ] = aInt32Seq
[ 1 ] = mrModel
.mnGapWidth
;
311 aTypeProp
.setProperty( PROP_GapwidthSequence
, aInt32Seq
);
314 case TYPECATEGORY_PIE
:
316 aTypeProp
.setProperty( PROP_UseRings
, maTypeInfo
.meTypeId
== TYPEID_DOUGHNUT
);
317 /* #i85166# starting angle of first pie slice. 3D pie charts
318 use Y rotation setting in view3D element. Of-pie charts do
319 not support pie rotation. */
320 if( !is3dChart() && (maTypeInfo
.meTypeId
!= TYPEID_OFPIE
) )
321 convertPieRotation( aDiaProp
, mrModel
.mnFirstAngle
);
327 // create converter objects for all series models
328 typedef RefVector
< SeriesConverter
> SeriesConvVector
;
329 SeriesConvVector aSeries
;
330 for( TypeGroupModel::SeriesVector::iterator aIt
= mrModel
.maSeries
.begin(), aEnd
= mrModel
.maSeries
.end(); aIt
!= aEnd
; ++aIt
)
331 aSeries
.push_back( SeriesConvVector::value_type( new SeriesConverter( *this, **aIt
) ) );
333 // reverse series order for some unstacked 2D chart types
334 if( isReverseSeries() )
335 ::std::reverse( aSeries
.begin(), aSeries
.end() );
337 // decide whether to use varying colors for each data point
338 bool bVaryColorsByPoint
= bSupportsVaryColorsByPoint
&& mrModel
.mbVaryColors
;
339 switch( maTypeInfo
.meVarPointMode
)
341 case VARPOINTMODE_NONE
: bVaryColorsByPoint
= false; break;
342 case VARPOINTMODE_SINGLE
: bVaryColorsByPoint
&= (mrModel
.maSeries
.size() == 1); break;
343 case VARPOINTMODE_MULTI
: break;
346 /* Stock chart needs special processing. Create one 'big' series with
347 data sequences of different roles. */
348 if( maTypeInfo
.meTypeId
== TYPEID_STOCK
)
350 // create the data series object
351 Reference
< XDataSeries
> xDataSeries( createInstance( "com.sun.star.chart2.DataSeries" ), UNO_QUERY
);
352 Reference
< XDataSink
> xDataSink( xDataSeries
, UNO_QUERY
);
355 // create a list of data sequences from all series
356 ::std::vector
< Reference
< XLabeledDataSequence
> > aLabeledSeqVec
;
357 OSL_ENSURE( aSeries
.size() >= 3, "TypeGroupConverter::convertFromModel - too few stock chart series" );
358 int nRoleIdx
= (aSeries
.size() == 3) ? 1 : 0;
359 for( SeriesConvVector::iterator aIt
= aSeries
.begin(), aEnd
= aSeries
.end(); (nRoleIdx
< 4) && (aIt
!= aEnd
); ++nRoleIdx
, ++aIt
)
361 // create a data sequence with a specific role
365 case 0: aRole
= "values-first"; break;
366 case 1: aRole
= "values-max"; break;
367 case 2: aRole
= "values-min"; break;
368 case 3: aRole
= "values-last"; break;
370 Reference
< XLabeledDataSequence
> xDataSeq
= (*aIt
)->createValueSequence( aRole
);
372 aLabeledSeqVec
.push_back( xDataSeq
);
375 // attach labeled data sequences to series and insert series into chart type
376 xDataSink
->setData( ContainerHelper::vectorToSequence( aLabeledSeqVec
) );
378 // formatting of high/low lines
379 aTypeProp
.setProperty( PROP_ShowHighLow
, true );
380 PropertySet
aSeriesProp( xDataSeries
);
381 if( mrModel
.mxHiLowLines
.is() )
382 getFormatter().convertFrameFormatting( aSeriesProp
, mrModel
.mxHiLowLines
, OBJECTTYPE_HILOLINE
);
384 // hi/low-lines cannot be switched off via "ShowHighLow" property (?)
385 aSeriesProp
.setProperty( PROP_LineStyle
, ::com::sun::star::drawing::LineStyle_NONE
);
387 // formatting of up/down bars
388 bool bUpDownBars
= mrModel
.mxUpDownBars
.is();
389 aTypeProp
.setProperty( PROP_Japanese
, bUpDownBars
);
390 aTypeProp
.setProperty( PROP_ShowFirst
, bUpDownBars
);
393 UpDownBarsConverter
aUpDownConv( *this, *mrModel
.mxUpDownBars
);
394 aUpDownConv
.convertFromModel( xChartType
);
397 // insert the series into the chart type object
398 insertDataSeries( xChartType
, xDataSeries
, nAxesSetIdx
);
403 for( SeriesConvVector::iterator aIt
= aSeries
.begin(), aEnd
= aSeries
.end(); aIt
!= aEnd
; ++aIt
)
405 SeriesConverter
& rSeriesConv
= **aIt
;
406 Reference
< XDataSeries
> xDataSeries
= rSeriesConv
.createDataSeries( *this, bVaryColorsByPoint
);
407 insertDataSeries( xChartType
, xDataSeries
, nAxesSetIdx
);
409 /* Excel does not use the value of the c:smooth element of the
410 chart type to set a default line smoothing for the data
411 series. Line smoothing is always controlled by the c:smooth
412 element of the respective data series. If the element in the
413 data series is missing, line smoothing is off, regardless of
414 the c:smooth element of the chart type. */
415 #if !OOX_CHART_SMOOTHED_PER_SERIES
416 if( rSeriesConv
.getModel().mbSmooth
)
417 convertLineSmooth( aTypeProp
, true );
422 // add chart type object to coordinate system
423 Reference
< XChartTypeContainer
> xChartTypeCont( rxCoordSystem
, UNO_QUERY_THROW
);
424 xChartTypeCont
->addChartType( xChartType
);
426 // set existence of bar connector lines at diagram (only in stacked 2D bar charts)
427 if( mrModel
.mxSerLines
.is() && !mb3dChart
&& (maTypeInfo
.meTypeCategory
== TYPECATEGORY_BAR
) && (isStacked() || isPercent()) )
428 aDiaProp
.setProperty( PROP_ConnectBars
, true );
432 OSL_FAIL( "TypeGroupConverter::convertFromModel - cannot add chart type" );
436 void TypeGroupConverter::convertMarker( PropertySet
& rPropSet
, sal_Int32 nOoxSymbol
, sal_Int32 nOoxSize
) const
438 if( !isSeriesFrameFormat() )
440 namespace cssc
= ::com::sun::star::chart2
;
443 cssc::Symbol aSymbol
;
444 aSymbol
.Style
= cssc::SymbolStyle_STANDARD
;
445 switch( nOoxSymbol
) // compare with XclChPropSetHelper::WriteMarkerProperties in xlchart.cxx
447 case XML_auto
: aSymbol
.Style
= cssc::SymbolStyle_AUTO
; break;
448 case XML_none
: aSymbol
.Style
= cssc::SymbolStyle_NONE
; break;
449 case XML_square
: aSymbol
.StandardSymbol
= 0; break; // square
450 case XML_diamond
: aSymbol
.StandardSymbol
= 1; break; // diamond
451 case XML_triangle
: aSymbol
.StandardSymbol
= 3; break; // arrow up
452 case XML_x
: aSymbol
.StandardSymbol
= 10; break; // X, legacy bow tie
453 case XML_star
: aSymbol
.StandardSymbol
= 12; break; // asterisk, legacy sand glass
454 case XML_dot
: aSymbol
.StandardSymbol
= 4; break; // arrow right
455 case XML_dash
: aSymbol
.StandardSymbol
= 13; break; // horizontal bar, legacy arrow down
456 case XML_circle
: aSymbol
.StandardSymbol
= 8; break; // circle, legacy arrow right
457 case XML_plus
: aSymbol
.StandardSymbol
= 11; break; // plus, legacy arrow left
460 // symbol size (points in OOXML, 1/100 mm in Chart2)
461 sal_Int32 nSize
= static_cast< sal_Int32
>( nOoxSize
* (2540.0 / 72.0) + 0.5 );
462 aSymbol
.Size
.Width
= aSymbol
.Size
.Height
= nSize
;
465 rPropSet
.setProperty( PROP_Symbol
, aSymbol
);
469 void TypeGroupConverter::convertLineSmooth( PropertySet
& rPropSet
, bool bOoxSmooth
) const
471 if( !isSeriesFrameFormat() && (maTypeInfo
.meTypeCategory
!= TYPECATEGORY_RADAR
) )
473 namespace cssc
= ::com::sun::star::chart2
;
474 cssc::CurveStyle eCurveStyle
= bOoxSmooth
? cssc::CurveStyle_CUBIC_SPLINES
: cssc::CurveStyle_LINES
;
475 rPropSet
.setProperty( PROP_CurveStyle
, eCurveStyle
);
479 void TypeGroupConverter::convertBarGeometry( PropertySet
& rPropSet
, sal_Int32 nOoxShape
) const
481 if( mb3dChart
&& (maTypeInfo
.meTypeCategory
== TYPECATEGORY_BAR
) )
483 namespace cssc
= ::com::sun::star::chart2
;
485 sal_Int32 nGeom3d
= cssc::DataPointGeometry3D::CUBOID
;
488 case XML_box
: nGeom3d
= cssc::DataPointGeometry3D::CUBOID
; break;
489 case XML_cone
: nGeom3d
= cssc::DataPointGeometry3D::CONE
; break;
490 case XML_coneToMax
: nGeom3d
= cssc::DataPointGeometry3D::CONE
; break;
491 case XML_cylinder
: nGeom3d
= cssc::DataPointGeometry3D::CYLINDER
; break;
492 case XML_pyramid
: nGeom3d
= cssc::DataPointGeometry3D::PYRAMID
; break;
493 case XML_pyramidToMax
: nGeom3d
= cssc::DataPointGeometry3D::PYRAMID
; break;
494 default: OSL_FAIL( "TypeGroupConverter::convertBarGeometry - unknown 3D bar shape type" );
496 rPropSet
.setProperty( PROP_Geometry3D
, nGeom3d
);
500 void TypeGroupConverter::convertPieRotation( PropertySet
& rPropSet
, sal_Int32 nOoxAngle
) const
502 if( maTypeInfo
.meTypeCategory
== TYPECATEGORY_PIE
)
504 // map OOXML [0,360] clockwise (0deg top) to Chart2 counterclockwise (0deg left)
505 sal_Int32 nAngle
= (450 - nOoxAngle
) % 360;
506 rPropSet
.setProperty( PROP_StartingAngle
, nAngle
);
510 void TypeGroupConverter::convertPieExplosion( PropertySet
& rPropSet
, sal_Int32 nOoxExplosion
) const
512 if( maTypeInfo
.meTypeCategory
== TYPECATEGORY_PIE
)
514 // pie explosion restricted to 100% in Chart2, set as double in range [0,1]
515 double fOffset
= getLimitedValue
< double >( nOoxExplosion
/ 100.0, 0.0, 1.0 );
516 rPropSet
.setProperty( PROP_Offset
, fOffset
);
520 // private --------------------------------------------------------------------
522 void TypeGroupConverter::insertDataSeries( const Reference
< XChartType
>& rxChartType
, const Reference
< XDataSeries
>& rxSeries
, sal_Int32 nAxesSetIdx
)
526 PropertySet
aSeriesProp( rxSeries
);
528 // series stacking mode
529 namespace cssc
= ::com::sun::star::chart2
;
530 cssc::StackingDirection eStacking
= cssc::StackingDirection_NO_STACKING
;
531 // stacked overrides deep-3d
532 if( isStacked() || isPercent() )
533 eStacking
= cssc::StackingDirection_Y_STACKING
;
534 else if( isDeep3dChart() )
535 eStacking
= cssc::StackingDirection_Z_STACKING
;
536 aSeriesProp
.setProperty( PROP_StackingDirection
, eStacking
);
538 // additional series properties
539 aSeriesProp
.setProperty( PROP_AttachedAxisIndex
, nAxesSetIdx
);
541 // insert series into container
544 Reference
< XDataSeriesContainer
> xSeriesCont( rxChartType
, UNO_QUERY_THROW
);
545 xSeriesCont
->addDataSeries( rxSeries
);
549 OSL_FAIL( "TypeGroupConverter::insertDataSeries - cannot add data series" );
554 // ============================================================================
557 } // namespace drawingml
560 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */