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/XDiagram.hpp>
35#include <com/sun/star/chart2/data/XDataSink.hpp>
36#include <com/sun/star/drawing/LineStyle.hpp>
39#include <osl/diagnose.h>
44#include <oox/token/namespaces.hxx>
45#include <oox/token/properties.hxx>
46#include <oox/token/tokens.hxx>
59const char SERVICE_CHART2_AREA[] =
"com.sun.star.chart2.AreaChartType";
60const char SERVICE_CHART2_CANDLE[] =
"com.sun.star.chart2.CandleStickChartType";
61const char SERVICE_CHART2_COLUMN[] =
"com.sun.star.chart2.ColumnChartType";
62const char SERVICE_CHART2_LINE[] =
"com.sun.star.chart2.LineChartType";
63const char SERVICE_CHART2_NET[] =
"com.sun.star.chart2.NetChartType";
64const char SERVICE_CHART2_FILLEDNET[] =
"com.sun.star.chart2.FilledNetChartType";
65const char SERVICE_CHART2_PIE[] =
"com.sun.star.chart2.PieChartType";
66const char SERVICE_CHART2_SCATTER[] =
"com.sun.star.chart2.ScatterChartType";
67const char SERVICE_CHART2_BUBBLE[] =
"com.sun.star.chart2.BubbleChartType";
68const char SERVICE_CHART2_SURFACE[] =
"com.sun.star.chart2.ColumnChartType";
70namespace csscd = ::com::sun::star::chart::DataLabelPlacement;
72const TypeGroupInfo spTypeInfos[] =
75 {
TYPEID_BAR,
TYPECATEGORY_BAR, SERVICE_CHART2_COLUMN,
VARPOINTMODE_SINGLE, csscd::OUTSIDE,
false,
true,
false,
true,
false,
true,
true },
76 {
TYPEID_HORBAR,
TYPECATEGORY_BAR, SERVICE_CHART2_COLUMN,
VARPOINTMODE_SINGLE, csscd::OUTSIDE,
false,
true,
false,
true,
true,
true,
true },
77 {
TYPEID_LINE,
TYPECATEGORY_LINE, SERVICE_CHART2_LINE,
VARPOINTMODE_SINGLE, csscd::RIGHT,
false,
false,
false,
true,
false,
true,
false },
78 {
TYPEID_AREA,
TYPECATEGORY_LINE, SERVICE_CHART2_AREA,
VARPOINTMODE_NONE, csscd::CENTER,
false,
true,
false,
true,
false,
true,
false },
79 {
TYPEID_STOCK,
TYPECATEGORY_LINE, SERVICE_CHART2_CANDLE,
VARPOINTMODE_NONE, csscd::RIGHT,
false,
false,
false,
true,
false,
true,
false },
80 {
TYPEID_RADARLINE,
TYPECATEGORY_RADAR, SERVICE_CHART2_NET,
VARPOINTMODE_SINGLE, csscd::OUTSIDE,
true,
false,
false,
true,
false,
false,
false },
81 {
TYPEID_RADARAREA,
TYPECATEGORY_RADAR, SERVICE_CHART2_FILLEDNET,
VARPOINTMODE_NONE, csscd::OUTSIDE,
true,
true,
false,
true,
false,
false,
false },
82 {
TYPEID_PIE,
TYPECATEGORY_PIE, SERVICE_CHART2_PIE,
VARPOINTMODE_MULTI, csscd::AVOID_OVERLAP,
true,
true,
true,
true,
false,
false,
false },
83 {
TYPEID_DOUGHNUT,
TYPECATEGORY_PIE, SERVICE_CHART2_PIE,
VARPOINTMODE_MULTI, csscd::AVOID_OVERLAP,
true,
true,
false,
true,
false,
false,
false },
84 {
TYPEID_OFPIE,
TYPECATEGORY_PIE, SERVICE_CHART2_PIE,
VARPOINTMODE_MULTI, csscd::AVOID_OVERLAP,
true,
true,
true,
true,
false,
false,
false },
85 {
TYPEID_SCATTER,
TYPECATEGORY_SCATTER, SERVICE_CHART2_SCATTER,
VARPOINTMODE_SINGLE, csscd::RIGHT,
false,
false,
false,
false,
false,
false,
false },
86 {
TYPEID_BUBBLE,
TYPECATEGORY_SCATTER, SERVICE_CHART2_BUBBLE,
VARPOINTMODE_SINGLE, csscd::RIGHT,
false,
true,
false,
false,
false,
false,
false },
87 {
TYPEID_SURFACE,
TYPECATEGORY_SURFACE, SERVICE_CHART2_SURFACE,
VARPOINTMODE_NONE, csscd::RIGHT,
false,
true,
false,
true,
false,
false,
false }
90const TypeGroupInfo saUnknownTypeInfo =
91 {
TYPEID_UNKNOWN,
TYPECATEGORY_BAR, SERVICE_CHART2_COLUMN,
VARPOINTMODE_SINGLE, csscd::OUTSIDE,
false,
true,
false,
true,
false,
true,
true };
93const TypeGroupInfo& lclGetTypeInfoFromTypeId(
TypeId eTypeId )
95 for(
auto const &rIt : spTypeInfos)
97 if( rIt.meTypeId == eTypeId )
100 OSL_ENSURE( eTypeId ==
TYPEID_UNKNOWN,
"lclGetTypeInfoFromTypeId - unexpected chart type identifier" );
101 return saUnknownTypeInfo;
108 return lclGetTypeInfoFromTypeId(
eType);
126 if( aTypeProp.
getProperty( xWhitePropSet, PROP_WhiteDay ) )
134 if( aTypeProp.
getProperty( xBlackPropSet, PROP_BlackDay ) )
148#define ENSURE_AXESCOUNT( min, max ) OSL_ENSURE( (min <= static_cast<int>(mrModel.maAxisIds.size())) && (static_cast<int>(mrModel.maAxisIds.size()) <= max), "TypeGroupConverter::TypeGroupConverter - invalid axes count" )
165 default: OSL_FAIL(
"TypeGroupConverter::TypeGroupConverter - unknown chart type" );
166#undef ENSURE_AXESCOUNT
188 maTypeInfo = lclGetTypeInfoFromTypeId( eTypeId );
228 OUString aSeriesTitle;
232 if( !pDataSeq->maData.empty() )
233 pDataSeq->maData.begin()->second >>= aSeriesTitle;
245 xCoordSystem = css::chart2::PolarCoordinateSystem3d::create(xContext);
247 xCoordSystem = css::chart2::PolarCoordinateSystem2d::create(xContext);
252 xCoordSystem = css::chart2::CartesianCoordinateSystem3d::create(xContext);
254 xCoordSystem = css::chart2::CartesianCoordinateSystem2d::create(xContext);
269 sal_Int32 nMaxValues = 0;
280 if (xLabeledSeq.is())
287 nMaxValues =
pValues->mxDataSeq->maData.size();
299 aSeq.mnPointCount = nMaxValues;
300 for( sal_Int32
i = 0;
i < nMaxValues;
i++ )
301 aSeq.maData[
i ] <<= OUString::number(
i + 1 );
311 sal_Int32 nAxesSetIdx,
bool bSupportsVaryColorsByPoint )
321 sal_Int32 nOldChartTypeIdx = -1;
331 aTypeProp.
setProperty( PROP_OverlapSequence, aInt32Seq );
333 aTypeProp.
setProperty( PROP_GapwidthSequence, aInt32Seq );
351 SeriesConvVector aSeries;
353 aSeries.push_back( std::make_shared<SeriesConverter>(*
this, *elemSeries) );
374 ::std::vector< Reference< XLabeledDataSequence > > aLabeledSeqVec;
375 OSL_ENSURE( aSeries.size() >= 3,
"TypeGroupConverter::convertFromModel - too few stock chart series" );
376 int nRoleIdx = (aSeries.size() == 3) ? 1 : 0;
377 for(
auto& rxSeriesConv : aSeries )
383 case 0: aRole =
"values-first";
break;
384 case 1: aRole =
"values-max";
break;
385 case 2: aRole =
"values-min";
break;
386 case 3: aRole =
"values-last";
break;
390 aLabeledSeqVec.push_back( xDataSeq );
411 aTypeProp.
setProperty( PROP_Japanese, bUpDownBars );
412 aTypeProp.
setProperty( PROP_ShowFirst, bUpDownBars );
425 for( sal_Int32 nCTIdx=0; nCTIdx<xOldChartTypes.getLength(); ++nCTIdx )
427 if ( xChartType->getChartType() == xOldChartTypes[nCTIdx]->getChartType() )
429 nOldChartTypeIdx = nCTIdx;
433 for (
auto const& elem : aSeries)
437 insertDataSeries( nOldChartTypeIdx == -1 ? xChartType : xOldChartTypes[nOldChartTypeIdx], xDataSeries, nAxesSetIdx );
445#if !OOX_CHART_SMOOTHED_PER_SERIES
454 if (nOldChartTypeIdx == -1)
456 xChartTypeCont->addChartType(xChartType);
465 OSL_FAIL(
"TypeGroupConverter::convertFromModel - cannot add chart type" );
475 namespace cssc = ::com::sun::star::chart2;
478 cssc::Symbol aSymbol;
479 aSymbol.Style = cssc::SymbolStyle_STANDARD;
482 case XML_auto: aSymbol.Style = cssc::SymbolStyle_AUTO;
break;
483 case XML_none: aSymbol.Style = cssc::SymbolStyle_NONE;
break;
484 case XML_square: aSymbol.StandardSymbol = 0;
break;
485 case XML_diamond: aSymbol.StandardSymbol = 1;
break;
486 case XML_triangle: aSymbol.StandardSymbol = 3;
break;
487 case XML_x: aSymbol.StandardSymbol = 10;
break;
488 case XML_star: aSymbol.StandardSymbol = 12;
break;
489 case XML_dot: aSymbol.StandardSymbol = 4;
break;
490 case XML_dash: aSymbol.StandardSymbol = 13;
break;
491 case XML_circle: aSymbol.StandardSymbol = 8;
break;
492 case XML_plus: aSymbol.StandardSymbol = 11;
break;
497 aSymbol.Size.Width = aSymbol.Size.Height = nSize;
501 Color aFillColor = xShapeProps->getFillProperties().maFillColor;
502 aSymbol.FillColor = sal_Int32(aFillColor.
getColor(
getFilter().getGraphicHelper()));
504 if( aSymbol.FillColor < 0 )
506 Color aLineColor = xShapeProps->getLineProperties().maLineFill.maFillColor;
507 aSymbol.BorderColor = sal_Int32(aLineColor.
getColor(
getFilter().getGraphicHelper()));
508 rPropSet.
setProperty(PROP_Color, aSymbol.BorderColor);
511 rPropSet.
setProperty(PROP_Color, aSymbol.FillColor);
522 namespace cssc = ::com::sun::star::chart2;
523 cssc::CurveStyle eCurveStyle = bOoxSmooth ? cssc::CurveStyle_CUBIC_SPLINES : cssc::CurveStyle_LINES;
524 rPropSet.
setProperty( PROP_CurveStyle, eCurveStyle );
533 namespace cssc = ::com::sun::star::chart2;
535 sal_Int32 nGeom3d = cssc::DataPointGeometry3D::CUBOID;
538 case XML_box: nGeom3d = cssc::DataPointGeometry3D::CUBOID;
break;
539 case XML_cone: nGeom3d = cssc::DataPointGeometry3D::CONE;
break;
540 case XML_coneToMax: nGeom3d = cssc::DataPointGeometry3D::CONE;
break;
541 case XML_cylinder: nGeom3d = cssc::DataPointGeometry3D::CYLINDER;
break;
542 case XML_pyramid: nGeom3d = cssc::DataPointGeometry3D::PYRAMID;
break;
543 case XML_pyramidToMax: nGeom3d = cssc::DataPointGeometry3D::PYRAMID;
break;
544 default: OSL_FAIL(
"TypeGroupConverter::convertBarGeometry - unknown 3D bar shape type" );
554 sal_Int32 nAngle = (450 - nOoxAngle) % 360;
564 double fOffset = getLimitedValue< double >( nOoxExplosion / 100.0, 0.0, 1.0 );
579 namespace cssc = ::com::sun::star::chart2;
580 cssc::StackingDirection eStacking = cssc::StackingDirection_NO_STACKING;
583 eStacking = cssc::StackingDirection_Y_STACKING;
585 eStacking = cssc::StackingDirection_Z_STACKING;
586 aSeriesProp.
setProperty( PROP_StackingDirection, eStacking );
589 aSeriesProp.
setProperty( PROP_AttachedAxisIndex, nAxesSetIdx );
595 xSeriesCont->addDataSeries( rxSeries );
599 OSL_FAIL(
"TypeGroupConverter::insertDataSeries - cannot add data series" );
const PropertyValue * pValues
constexpr auto convertPointToMm100(N n)
A wrapper for a UNO property set.
bool getProperty(Type &orValue, sal_Int32 nPropId) const
Gets the specified property from the property set.
bool setProperty(sal_Int32 nPropId, const Type &rValue)
Puts the passed value into the property set.
bool has(key_type nKey) const
Returns true, if the object associated to the passed key exists.
Template for a vector of ref-counted objects with additional accessor functions.
value_type get(sal_Int32 nIndex) const
Returns a reference to the object with the passed index, or 0 on error.
::Color getColor(const GraphicHelper &rGraphicHelper, ::Color nPhClr=API_RGB_TRANSPARENT) const
Returns the final RGB color value.
Base class of all converter classes.
UpDownBarsModel & mrModel
const ModelType & getModel() const
::oox::core::XmlFilterBase & getFilter() const
Returns the filter object of the imported/exported document.
ObjectFormatter & getFormatter() const
Returns the object formatter.
css::uno::Reference< css::uno::XInterface > createInstance(const OUString &rServiceName) const
Creates an instance for the passed service name, using the process service factory.
css::uno::Reference< css::uno::XComponentContext > const & getComponentContext() const
ModelType & create(KeyType eKey)
css::uno::Reference< css::chart2::XDataSeries > createDataSeries(const TypeGroupConverter &rTypeGroup, bool bVaryColorsByPoint)
Creates a data series object with initialized source links.
css::uno::Reference< css::chart2::data::XLabeledDataSequence > createCategorySequence(const OUString &rRole)
Creates a labeled data sequence object from category data link.
void convertBarGeometry(PropertySet &rPropSet, sal_Int32 nOoxShape) const
Sets the passed OOXML bar 3D geometry at the passed property set.
bool is3dChart() const
Returns true, if the chart is three-dimensional.
void convertPieExplosion(PropertySet &rPropSet, sal_Int32 nOoxExplosion) const
Sets the passed OOXML pie explosion at the passed property set.
bool isWall3dChart() const
Returns true, if chart type supports wall and floor format in 3D mode.
void insertDataSeries(const css::uno::Reference< css::chart2::XChartType > &rxChartType, const css::uno::Reference< css::chart2::XDataSeries > &rxSeries, sal_Int32 nAxesSetIdx)
Inserts the passed series into the chart type.
virtual ~TypeGroupConverter() override
bool isSeriesFrameFormat() const
Returns true, if this chart type supports area formatting for its series.
css::uno::Reference< css::chart2::data::XLabeledDataSequence > createCategorySequence()
Creates a labeled data sequence object for axis categories.
css::uno::Reference< css::chart2::XCoordinateSystem > createCoordinateSystem()
Creates a coordinate system according to the contained chart type.
void convertMarker(PropertySet &rPropSet, sal_Int32 nOoxSymbol, sal_Int32 nOoxSize, const ModelRef< Shape > &xShapeProps) const
Sets the passed OOXML marker style at the passed property set.
TypeGroupConverter(const ConverterRoot &rParent, TypeGroupModel &rModel)
ObjectType getSeriesObjectType() const
Returns the object type for a series depending on the chart type.
bool mb3dChart
Extended type info for contained chart type model.
void convertPieRotation(PropertySet &rPropSet, sal_Int32 nOoxAngle) const
Sets the passed OOXML pie rotation at the passed property set.
OUString getSingleSeriesTitle() const
Returns series title, if the chart type group contains only one single series.
void convertLineSmooth(PropertySet &rPropSet, bool bOoxSmooth) const
Sets the passed OOXML line smoothing at the passed property set.
bool isDeep3dChart() const
Returns true, if the series in this chart type group are ordered on the Z axis.
bool isStacked() const
Returns true, if the series in this chart type group are stacked on each other (no percentage).
void convertFromModel(const css::uno::Reference< css::chart2::XDiagram > &rxDiagram, const css::uno::Reference< css::chart2::XCoordinateSystem > &rxCoordSystem, sal_Int32 nAxesSetIdx, bool bSupportsVaryColorsByPoint)
Converts the OOXML type group model into a chart2 coordinate system.
bool isPercent() const
Returns true, if the series in this chart type group are stacked on each other as percentage.
virtual ~UpDownBarsConverter() override
UpDownBarsConverter(const ConverterRoot &rParent, UpDownBarsModel &rModel)
void convertFromModel(const css::uno::Reference< css::chart2::XChartType > &rxChartType)
Converts the OOXML up/down bars.
Sequence< sal_Int8 > aSeq
css::uno::Sequence< DstElementType > containerToSequence(const SrcType &i_Container)
@ TYPECATEGORY_RADAR
Line charts (line, area, stock charts).
@ TYPECATEGORY_SURFACE
Scatter and bubble charts.
@ TYPECATEGORY_SCATTER
Pie and donut charts.
@ TYPECATEGORY_PIE
Radar charts (linear or filled).
@ TYPECATEGORY_LINE
Bar charts (horizontal or vertical).
const TypeGroupInfo & GetTypeGroupInfo(TypeId eType)
ObjectType
Enumerates different object types for specific automatic formatting behaviour.
@ OBJECTTYPE_FILLEDSERIES2D
Linear series in 2D line/radarline/scatter charts.
@ OBJECTTYPE_HILOLINE
Drop lines between data points and X axis.
@ OBJECTTYPE_FILLEDSERIES3D
Filled series in 2D bar/area/radararea/bubble/pie/surface charts.
@ OBJECTTYPE_LINEARSERIES2D
Axis minor grid line.
@ OBJECTTYPE_UPBAR
High/low lines in line/stock charts.
@ OBJECTTYPE_DOWNBAR
Up-bar in line/stock charts.
TypeId
Enumerates different chart types.
@ TYPEID_RADARLINE
Stock chart.
@ TYPEID_SURFACE
Bubble chart.
@ TYPEID_OFPIE
Doughnut (ring) chart.
@ TYPEID_LINE
Horizontal bar chart.
@ TYPEID_HORBAR
Vertical bar chart.
@ TYPEID_PIE
Filled radar chart.
@ TYPEID_UNKNOWN
Surface chart.
@ TYPEID_DOUGHNUT
Pie chart.
@ TYPEID_BUBBLE
Scatter (XY) chart.
@ TYPEID_RADARAREA
Linear radar chart.
@ TYPEID_SCATTER
Pie-to-pie or pie-to-bar chart.
@ TYPEID_STOCK
Area chart.
@ VARPOINTMODE_MULTI
Only supported, if type group contains only one series.
@ VARPOINTMODE_SINGLE
No varied colors supported.
DataSequenceRef mxDataSeq
@ VALUES
Data point categories.
bool mbSmooth
True = invert negative data points.
Contains info for a chart type related to the OpenOffice.org chart module.
VarPointMode meVarPointMode
Service name of the type.
bool mbSeriesIsFrame2d
True = polar, false = cartesian.
bool mbSingleSeriesVis
True = 2D type series with area formatting.
bool mbSwappedAxesSet
True = X axis contains categories.
bool mbSupportsStacking
True = X axis and Y axis are swapped.
bool mbPolarCoordSystem
Default data label position (API constant).
const char * mpcServiceName
Category this chart type belongs to.
TypeCategory meTypeCategory
Unique chart type identifier.
sal_Int32 mnGapWidth
Space between series in deep 3D charts.
sal_Int32 mnGrouping
Space between bars in bar charts, or space in pie-to charts.
bool mbVaryColors
True = smooth lines in line charts.
sal_Int32 mnRadarStyle
Bar overlap per category (2D bar charts only).
sal_Int32 mnFirstAngle
Relative scaling of bubble size (percent).
ShapeRef mxHiLowLines
Drop lines connecting data points with X axis.
sal_Int32 mnTypeId
Split type in pie-to charts.
sal_Int32 mnOverlap
Pie-to-pie or pie-to-bar chart.
sal_Int32 mnBarDir
Threshold value in pie-to charts.
UpDownBarsRef mxUpDownBars
Data point label settings for all series.
ShapeRef mxSerLines
Up/down bars in stock charts.
ShapeRef mxUpBars
Formatting of down bars.
#define ENSURE_AXESCOUNT(min, max)
constexpr OUStringLiteral PROP_StartingAngle
constexpr OUStringLiteral PROP_LineStyle