tdf#50934: Some rejiggering of of-pie code, plus implementing subpie chart

Change-Id: I91fca31db0eb0bfb673e77f1369abe110fe405b7
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/160724
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
diff --git a/chart2/source/view/charttypes/PieChart.cxx b/chart2/source/view/charttypes/PieChart.cxx
index 49cf48d..201e226 100644
--- a/chart2/source/view/charttypes/PieChart.cxx
+++ b/chart2/source/view/charttypes/PieChart.cxx
@@ -243,6 +243,7 @@ bool PieChart::shouldSnapRectToUsedArea()
}

rtl::Reference<SvxShape> PieChart::createDataPoint(
    const SubPieType e_subType,
    const rtl::Reference<SvxShapeGroupAnyD>& xTarget,
    const uno::Reference<beans::XPropertySet>& xObjectProperties,
    const ShapeParam& rParam,
@@ -286,12 +287,28 @@ rtl::Reference<SvxShape> PieChart::createDataPoint(
            drawing::Position3D aNewOrigin = m_aPosHelper.transformUnitCircleToScene(fAngle, fRadius, rParam.mfLogicZ);
            aOffset = aNewOrigin - aOrigin;
        }
    } else if (m_eSubType != PieChartSubType_NONE) {
        // Draw the main pie for bar-of-pie/pie-of-pie smaller and to the left
        drawing::Position3D aOrigin = m_aPosHelper.transformUnitCircleToScene(0, 0, rParam.mfLogicZ);
        drawing::Position3D aNewOrigin = m_aPosHelper.transformUnitCircleToScene(180, 1.0, rParam.mfLogicZ);
        aOffset = aNewOrigin - aOrigin;
        fExplodedOuterRadius *= 2.0/3;
    } else {
        drawing::Position3D aOrigin, aNewOrigin;
        switch (e_subType) {
            case SubPieType::LEFT:
                // Draw the main pie for bar-of-pie/pie-of-pie smaller and to the left
                aOrigin = m_aPosHelper.transformUnitCircleToScene(0, 0, rParam.mfLogicZ);
                aNewOrigin = m_aPosHelper.transformUnitCircleToScene(180, 0.75, rParam.mfLogicZ);
                aOffset = aNewOrigin - aOrigin;
                fExplodedOuterRadius *= 2.0/3;
                break;
            case SubPieType::RIGHT:
                // Draw the sub-pie for pie-of-pie much smaller and to the right
                aOrigin = m_aPosHelper.transformUnitCircleToScene(0, 0, rParam.mfLogicZ);
                aNewOrigin = m_aPosHelper.transformUnitCircleToScene(0, 0.75, rParam.mfLogicZ);
                aOffset = aNewOrigin - aOrigin;
                fExplodedOuterRadius *= 1.0/3;
                break;
            case SubPieType::NONE:
            default:
                // no change
                break;
        }
    }


@@ -847,10 +864,11 @@ void PieChart::createShapes()
            createOneRing(SubPieType::NONE, fSlotX, aParam, xSeriesTarget, xTextTarget, pSeries, n3DRelativeHeight);
            break;
        case PieChartSubType_BAR:
            createOneRing(SubPieType::LEFT, fSlotX, aParam, xSeriesTarget, xTextTarget, pSeries, n3DRelativeHeight);
            createOneRing(SubPieType::LEFT, 0, aParam, xSeriesTarget, xTextTarget, pSeries, n3DRelativeHeight);
            break;
        case PieChartSubType_PIE:
            createOneRing(SubPieType::LEFT, fSlotX, aParam, xSeriesTarget, xTextTarget, pSeries, n3DRelativeHeight);
            createOneRing(SubPieType::LEFT, 0, aParam, xSeriesTarget, xTextTarget, pSeries, n3DRelativeHeight);
            createOneRing(SubPieType::RIGHT, 0, aParam, xSeriesTarget, xTextTarget, pSeries, n3DRelativeHeight);
            break;
        default:
            assert(false); // this shouldn't happen
@@ -949,8 +967,7 @@ void PieChart::createOneRing([[maybe_unused]]enum SubPieType eType,
            // Do concentric explosion if it's a donut chart with more than one series
            const bool bConcentricExplosion = m_bUseRings && (m_aZSlots.front().size() > 1);
            rtl::Reference<SvxShape> xPointShape =
                createDataPoint(
                    xSeriesGroupShape_Shapes, xPointProperties, aParam, nPointCount,
                createDataPoint(eType, xSeriesGroupShape_Shapes, xPointProperties, aParam, nPointCount,
                    bConcentricExplosion);

            ///point color:
diff --git a/chart2/source/view/charttypes/PieChart.hxx b/chart2/source/view/charttypes/PieChart.hxx
index 5c04ee0..0517c87 100644
--- a/chart2/source/view/charttypes/PieChart.hxx
+++ b/chart2/source/view/charttypes/PieChart.hxx
@@ -84,6 +84,7 @@ 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,