diff options
Diffstat (limited to 'chart2/source/view/charttypes/PieChart.hxx')
-rw-r--r-- | chart2/source/view/charttypes/PieChart.hxx | 151 |
1 files changed, 144 insertions, 7 deletions
diff --git a/chart2/source/view/charttypes/PieChart.hxx b/chart2/source/view/charttypes/PieChart.hxx index 5bd25eed53e6..bf11f6c69055 100644 --- a/chart2/source/view/charttypes/PieChart.hxx +++ b/chart2/source/view/charttypes/PieChart.hxx @@ -21,13 +21,103 @@ #include <memory> #include <VSeriesPlotter.hxx> +#include <PlottingPositionHelper.hxx> #include <basegfx/vector/b2ivector.hxx> #include <com/sun/star/awt/Point.hpp> +#include <com/sun/star/chart2/PieChartSubType.hpp> + +using namespace ::com::sun::star; +using namespace ::com::sun::star::chart2; namespace chart { -class PiePositionHelper; +class PiePositionHelper : public PolarPlottingPositionHelper +{ +public: + PiePositionHelper( double fAngleDegreeOffset ); + + bool getInnerAndOuterRadius( double fCategoryX, double& fLogicInnerRadius, double& fLogicOuterRadius, bool bUseRings, double fMaxOffset ) const; + + // Determine if the pie wedges are ordered clockwise (returns true) or + // counterclockwise (returns false) + bool clockwiseWedges() const; + +public: + //Distance between different category rings, seen relative to width of a ring: + double m_fRingDistance; //>=0 m_fRingDistance=1 --> distance == width +}; + +enum class SubPieType { + NONE, // solo pie or donut + LEFT, // left pie in pie-of-pie + RIGHT // right pie in pie-of-pie +}; + + +//======================= +// class PieDataSrcBase +//======================= +class PieDataSrcBase +{ +public: + PieDataSrcBase() = default; + virtual ~PieDataSrcBase() = default; + + // Number of data points for given pie subtype + virtual sal_Int32 getNPoints(const VDataSeries* pSeries, + enum SubPieType eType) const = 0; + + // Get the value for the given pie wedge, for the given subtype + virtual double getData(const VDataSeries* pSeries, sal_Int32 nPtIdx, + enum SubPieType eType) const = 0; + + // Get the properties for the wedge and subtype + virtual uno::Reference< beans::XPropertySet > getProps( + const VDataSeries* pSeries, sal_Int32 nPtIdx, + enum SubPieType eType) const = 0; +}; + +//======================= +// class PieDataSrc +//======================= +class PieDataSrc : public PieDataSrcBase +{ +public: + sal_Int32 getNPoints(const VDataSeries* pSeries, + enum SubPieType eType) const; + + double getData(const VDataSeries* pSeries, sal_Int32 nPtIdx, + [[maybe_unused]]enum SubPieType eType) const; + + virtual uno::Reference< beans::XPropertySet > getProps( + const VDataSeries* pSeries, sal_Int32 nPtIdx, + enum SubPieType eType) const; +}; + +//======================= +// class OfPieDataSrc +//======================= +class OfPieDataSrc : public PieDataSrcBase +{ +public: + // Minimum sensible number of data points + static constexpr sal_Int32 minPoints = 4; + + sal_Int32 getNPoints(const VDataSeries* pSeries, + enum SubPieType eType) const; + + double getData(const VDataSeries* pSeries, sal_Int32 nPtIdx, + enum SubPieType eType) const; + + virtual uno::Reference< beans::XPropertySet > getProps( + const VDataSeries* pSeries, sal_Int32 nPtIdx, + enum SubPieType eType) const; +}; + +//======================= +// class PieChart +//======================= class PieChart : public VSeriesPlotter { struct ShapeParam; @@ -35,7 +125,7 @@ class PieChart : public VSeriesPlotter public: PieChart() = delete; - PieChart( const css::uno::Reference< css::chart2::XChartType >& xChartTypeModel + PieChart( const rtl::Reference< ::chart::ChartType >& xChartTypeModel , sal_Int32 nDimensionCount, bool bExcludingPositioning ); virtual ~PieChart() override; @@ -65,10 +155,18 @@ public: private: //methods rtl::Reference<SvxShape> createDataPoint( + enum SubPieType eType, const rtl::Reference<SvxShapeGroupAnyD>& xTarget, const css::uno::Reference<css::beans::XPropertySet>& xObjectProperties, - const ShapeParam& rParam ); + const ShapeParam& rParam, + const sal_Int32 nPointCount, + const bool bConcentricExplosion); + rtl::Reference<SvxShape> createBarDataPoint( + const rtl::Reference<SvxShapeGroupAnyD>& xTarget, + const uno::Reference<beans::XPropertySet>& xObjectProperties, + const ShapeParam& rParam, + double fBarSegBottom, double fBarSegTop); /** This method creates a text shape for a label of a data point. * * @param xTextTarget @@ -107,11 +205,49 @@ struct PieLabelInfo; bool performLabelBestFitInnerPlacement( ShapeParam& rShapeParam , PieLabelInfo const & rPieLabelInfo ); + // A standalone pie, one pie in a pie-of-pie, or one ring of a donut + void createOneRing([[maybe_unused]]enum SubPieType eType + , double fSlotX + , ShapeParam& aParam + , const rtl::Reference<SvxShapeGroupAnyD>& xSeriesTarget + , const rtl::Reference<SvxShapeGroup>& xTextTarget + , VDataSeries* pSeries + , const PieDataSrcBase *pDataSrc + , sal_Int32 n3DRelativeHeight); + + // A bar chart in a bar-of-pie + void createOneBar( + enum SubPieType eType, + ShapeParam& aParam, + const rtl::Reference<SvxShapeGroupAnyD>& xSeriesTarget, + const rtl::Reference<SvxShapeGroup>& xTextTarget, + VDataSeries* pSeries, + const PieDataSrcBase *pDataSrc, + sal_Int32 n3DRelativeHeight); + private: //member - std::unique_ptr<PiePositionHelper> - m_pPosHelper; + // Constants for of-pie charts. Some of these will want to become + // user-selectable values. TODO + + // Radius scalings for left and right of-pie subcharts + static constexpr double m_fLeftScale = 2.0/3; + static constexpr double m_fRightScale = 1.0/3; + // Shifts left/right for of-pie subcharts + static constexpr double m_fLeftShift = -0.75; + static constexpr double m_fRightShift = 0.75; + // Height of bar-of-pie bar + static constexpr double m_fFullBarHeight = 1.0; + // Bar-of-pie bar left side position + static constexpr double m_fBarLeft = 0.75; + // Bar-of-pie bar right side position + static constexpr double m_fBarRight = 1.25; + + PiePositionHelper m_aPosHelper; + bool m_bUseRings; bool m_bSizeExcludesLabelsAndExplodedSegments; + std::vector< ExplicitScaleData > m_aCartesianScales; // for bar-of-pie + ::css::chart2::PieChartSubType m_eSubType; struct PieLabelInfo { @@ -119,8 +255,8 @@ private: //member bool moveAwayFrom( const PieLabelInfo* pFix, const css::awt::Size& rPageSize , bool bMoveHalfWay, bool bMoveClockwise ); - css::uno::Reference< css::drawing::XShape > xTextShape; - css::uno::Reference< css::drawing::XShape > xLabelGroupShape; + rtl::Reference< SvxShapeText > xTextShape; + rtl::Reference< SvxShapeGroupAnyD > xLabelGroupShape; ::basegfx::B2IVector aFirstPosition; ::basegfx::B2IVector aOuterPosition; ::basegfx::B2IVector aOrigin; @@ -138,6 +274,7 @@ private: //member double m_fMaxOffset; /// cached max offset value (init'ed to NaN) }; + } //namespace chart /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |