diff options
author | Kohei Yoshida <kohei.yoshida@collabora.com> | 2014-08-13 14:26:16 -0400 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@collabora.com> | 2014-08-14 11:17:25 -0400 |
commit | be0de8b9db9c428de5c65be51be2eef17947e4dc (patch) | |
tree | 965d4f0a6eb2dfd8c0ee6d2127d3e50b5a7303e4 /chart2 | |
parent | 8bd81a6520174d8f2086d9a220973f86453d022e (diff) |
Use struct to group together parameters to reduce number of method args.
And to make it easier to share common parameters between methods.
Change-Id: Ibdbad66ea8f2f30b4518f9ecaec2f43087c54837
Diffstat (limited to 'chart2')
-rw-r--r-- | chart2/source/view/charttypes/PieChart.cxx | 130 | ||||
-rw-r--r-- | chart2/source/view/charttypes/PieChart.hxx | 23 |
2 files changed, 81 insertions, 72 deletions
diff --git a/chart2/source/view/charttypes/PieChart.cxx b/chart2/source/view/charttypes/PieChart.cxx index 51142bd9533b..b900e9c7150a 100644 --- a/chart2/source/view/charttypes/PieChart.cxx +++ b/chart2/source/view/charttypes/PieChart.cxx @@ -34,11 +34,33 @@ #include <boost/scoped_ptr.hpp> -namespace chart -{ using namespace ::com::sun::star; using namespace ::com::sun::star::chart2; +namespace chart { + +struct PieChart::ShapeParam +{ + double mfUnitCircleStartAngleDegree; + double mfUnitCircleWidthAngleDegree; + double mfUnitCircleOuterRadius; + double mfUnitCircleInnerRadius; + double mfExplodePercentage; + double mfLogicYSum; + double mfLogicZ; + double mfDepth; + + ShapeParam() : + mfUnitCircleStartAngleDegree(0.0), + mfUnitCircleWidthAngleDegree(0.0), + mfUnitCircleOuterRadius(0.0), + mfUnitCircleInnerRadius(0.0), + mfExplodePercentage(0.0), + mfLogicYSum(0.0), + mfLogicZ(0.0), + mfDepth(0.0) {} +}; + class PiePositionHelper : public PolarPlottingPositionHelper { public: @@ -163,21 +185,19 @@ bool PieChart::shouldSnapRectToUsedArea() } uno::Reference< drawing::XShape > PieChart::createDataPoint( - const uno::Reference< drawing::XShapes >& xTarget - , const uno::Reference< beans::XPropertySet >& xObjectProperties - , double fUnitCircleStartAngleDegree, double fUnitCircleWidthAngleDegree - , double fUnitCircleInnerRadius, double fUnitCircleOuterRadius - , double fLogicZ, double fDepth, double fExplodePercentage - , tPropertyNameValueMap* pOverwritePropertiesMap ) + const uno::Reference<drawing::XShapes>& xTarget, + const uno::Reference<beans::XPropertySet>& xObjectProperties, + tPropertyNameValueMap* pOverwritePropertiesMap, + const ShapeParam& rParam ) { //transform position: drawing::Direction3D aOffset; - if( !::rtl::math::approxEqual( fExplodePercentage, 0.0 ) ) + if (!::rtl::math::approxEqual(rParam.mfExplodePercentage, 0.0)) { - double fAngle = fUnitCircleStartAngleDegree + fUnitCircleWidthAngleDegree/2.0; - double fRadius = (fUnitCircleOuterRadius-fUnitCircleInnerRadius)*fExplodePercentage; - drawing::Position3D aOrigin = m_pPosHelper->transformUnitCircleToScene( 0, 0, fLogicZ ); - drawing::Position3D aNewOrigin = m_pPosHelper->transformUnitCircleToScene( fAngle, fRadius, fLogicZ ); + double fAngle = rParam.mfUnitCircleStartAngleDegree + rParam.mfUnitCircleWidthAngleDegree/2.0; + double fRadius = (rParam.mfUnitCircleOuterRadius-rParam.mfUnitCircleInnerRadius)*rParam.mfExplodePercentage; + drawing::Position3D aOrigin = m_pPosHelper->transformUnitCircleToScene(0, 0, rParam.mfLogicZ); + drawing::Position3D aNewOrigin = m_pPosHelper->transformUnitCircleToScene(fAngle, fRadius, rParam.mfLogicZ); aOffset = aNewOrigin - aOrigin; } @@ -186,16 +206,16 @@ uno::Reference< drawing::XShape > PieChart::createDataPoint( if(m_nDimension==3) { xShape = m_pShapeFactory->createPieSegment( xTarget - , fUnitCircleStartAngleDegree, fUnitCircleWidthAngleDegree - , fUnitCircleInnerRadius, fUnitCircleOuterRadius + , rParam.mfUnitCircleStartAngleDegree, rParam.mfUnitCircleWidthAngleDegree + , rParam.mfUnitCircleInnerRadius, rParam.mfUnitCircleOuterRadius , aOffset, B3DHomMatrixToHomogenMatrix( m_pPosHelper->getUnitCartesianToScene() ) - , fDepth ); + , rParam.mfDepth ); } else { xShape = m_pShapeFactory->createPieSegment2D( xTarget - , fUnitCircleStartAngleDegree, fUnitCircleWidthAngleDegree - , fUnitCircleInnerRadius, fUnitCircleOuterRadius + , rParam.mfUnitCircleStartAngleDegree, rParam.mfUnitCircleWidthAngleDegree + , rParam.mfUnitCircleInnerRadius, rParam.mfUnitCircleOuterRadius , aOffset, B3DHomMatrixToHomogenMatrix( m_pPosHelper->getUnitCartesianToScene() ) ); } this->setMappedProperties( xShape, xObjectProperties, PropertyMapper::getPropertyNameMapForFilledSeriesProperties(), pOverwritePropertiesMap ); @@ -204,19 +224,16 @@ uno::Reference< drawing::XShape > PieChart::createDataPoint( void PieChart::createTextLabelShape( const uno::Reference<drawing::XShapes>& xTextTarget, - VDataSeries& rSeries, sal_Int32 nPointIndex, - double fUnitCircleStartAngleDegree, double fUnitCircleWidthAngleDegree, - double fUnitCircleOuterRadius, double fUnitCircleInnerRadius, double fExplodePercentage, - double fLogicYSum, double fLogicZ ) + VDataSeries& rSeries, sal_Int32 nPointIndex, ShapeParam& rParam ) { if (!rSeries.getDataPointLabelIfLabel(nPointIndex)) return; - if( !::rtl::math::approxEqual( fExplodePercentage, 0.0 ) ) + if (!rtl::math::approxEqual(rParam.mfExplodePercentage, 0.0)) { - double fExplodeOffset = (fUnitCircleOuterRadius-fUnitCircleInnerRadius)*fExplodePercentage; - fUnitCircleInnerRadius += fExplodeOffset; - fUnitCircleOuterRadius += fExplodeOffset; + double fExplodeOffset = (rParam.mfUnitCircleOuterRadius-rParam.mfUnitCircleInnerRadius)*rParam.mfExplodePercentage; + rParam.mfUnitCircleInnerRadius += fExplodeOffset; + rParam.mfUnitCircleOuterRadius += fExplodeOffset; } sal_Int32 nLabelPlacement = rSeries.getLabelPlacement( @@ -240,12 +257,12 @@ void PieChart::createTextLabelShape( PolarLabelPositionHelper aPolarPosHelper(m_pPosHelper,m_nDimension,m_xLogicTarget,m_pShapeFactory); awt::Point aScreenPosition2D( aPolarPosHelper.getLabelScreenPositionAndAlignmentForUnitCircleValues(eAlignment, nLabelPlacement - , fUnitCircleStartAngleDegree, fUnitCircleWidthAngleDegree - , fUnitCircleInnerRadius, fUnitCircleOuterRadius, fLogicZ+0.5, 0 )); + , rParam.mfUnitCircleStartAngleDegree, rParam.mfUnitCircleWidthAngleDegree + , rParam.mfUnitCircleInnerRadius, rParam.mfUnitCircleOuterRadius, rParam.mfLogicZ+0.5, 0 )); PieLabelInfo aPieLabelInfo; aPieLabelInfo.aFirstPosition = basegfx::B2IVector( aScreenPosition2D.X, aScreenPosition2D.Y ); - awt::Point aOrigin( aPolarPosHelper.transformSceneToScreenPosition( m_pPosHelper->transformUnitCircleToScene( 0.0, 0.0, fLogicZ+1.0 ) ) ); + awt::Point aOrigin( aPolarPosHelper.transformSceneToScreenPosition( m_pPosHelper->transformUnitCircleToScene( 0.0, 0.0, rParam.mfLogicZ+1.0 ) ) ); aPieLabelInfo.aOrigin = basegfx::B2IVector( aOrigin.X, aOrigin.Y ); //add a scaling independent Offset if requested @@ -259,7 +276,7 @@ void PieChart::createTextLabelShape( double nVal = rSeries.getYValue(nPointIndex); aPieLabelInfo.xTextShape = createDataLabel( - xTextTarget, rSeries, nPointIndex, nVal, fLogicYSum, aScreenPosition2D, eAlignment); + xTextTarget, rSeries, nPointIndex, nVal, rParam.mfLogicYSum, aScreenPosition2D, eAlignment); uno::Reference< container::XChild > xChild( aPieLabelInfo.xTextShape, uno::UNO_QUERY ); if( xChild.is() ) @@ -409,6 +426,8 @@ void PieChart::createShapes() for( double fSlotX=0; aXSlotIter != aXSlotEnd && (m_bUseRings||fSlotX<0.5 ); ++aXSlotIter, fSlotX+=1.0 ) { + ShapeParam aParam; + ::std::vector< VDataSeries* >* pSeriesList = &(aXSlotIter->m_aSeriesVector); if( pSeriesList->size()<=0 )//there should be only one series in each x slot continue; @@ -420,7 +439,6 @@ void PieChart::createShapes() m_pPosHelper->m_fAngleDegreeOffset = pSeries->getStartingAngle(); - double fLogicYSum = 0.0; //iterate through all points to get the sum sal_Int32 nPointIndex=0; sal_Int32 nPointCount=pSeries->getTotalPointCount(); @@ -433,10 +451,12 @@ void PieChart::createShapes() } if( ::rtl::math::isNan(fY) ) continue; - fLogicYSum += fabs(fY); + aParam.mfLogicYSum += fabs(fY); } - if(fLogicYSum==0.0) + + if (aParam.mfLogicYSum == 0.0) continue; + double fLogicYForNextPoint = 0.0; //iterate through all points to create shapes for( nPointIndex = 0; nPointIndex < nPointCount; nPointIndex++ ) @@ -447,7 +467,7 @@ void PieChart::createShapes() if( !bIsVisible ) continue; - double fDepth = this->getTransformedDepth() * (n3DRelativeHeight / 100.0); + aParam.mfDepth = this->getTransformedDepth() * (n3DRelativeHeight / 100.0); uno::Reference< drawing::XShapes > xSeriesGroupShape_Shapes = getSeriesGroupShape(pSeries, xSeriesTarget); //collect data point information (logic coordinates, style ): @@ -464,14 +484,14 @@ void PieChart::createShapes() //iterate through all subsystems to create partial points { //logic values on angle axis: - double fLogicStartAngleValue = fLogicYPos/fLogicYSum; - double fLogicEndAngleValue = (fLogicYPos+fLogicYValue)/fLogicYSum; + double fLogicStartAngleValue = fLogicYPos / aParam.mfLogicYSum; + double fLogicEndAngleValue = (fLogicYPos+fLogicYValue) / aParam.mfLogicYSum; - double fExplodePercentage=0.0; + aParam.mfExplodePercentage = 0.0; bool bDoExplode = ( nExplodeableSlot == static_cast< ::std::vector< VDataSeriesGroup >::size_type >(fSlotX) ); if(bDoExplode) try { - xPointProperties->getPropertyValue( "Offset") >>= fExplodePercentage; + xPointProperties->getPropertyValue( "Offset") >>= aParam.mfExplodePercentage; } catch( const uno::Exception& e ) { @@ -479,10 +499,10 @@ void PieChart::createShapes() } //transforme to unit circle: - double fUnitCircleWidthAngleDegree = m_pPosHelper->getWidthAngleDegree( fLogicStartAngleValue, fLogicEndAngleValue ); - double fUnitCircleStartAngleDegree = m_pPosHelper->transformToAngleDegree( fLogicStartAngleValue ); - double fUnitCircleInnerRadius = m_pPosHelper->transformToRadius( fLogicInnerRadius ); - double fUnitCircleOuterRadius = m_pPosHelper->transformToRadius( fLogicOuterRadius ); + aParam.mfUnitCircleWidthAngleDegree = m_pPosHelper->getWidthAngleDegree( fLogicStartAngleValue, fLogicEndAngleValue ); + aParam.mfUnitCircleStartAngleDegree = m_pPosHelper->transformToAngleDegree( fLogicStartAngleValue ); + aParam.mfUnitCircleInnerRadius = m_pPosHelper->transformToRadius( fLogicInnerRadius ); + aParam.mfUnitCircleOuterRadius = m_pPosHelper->transformToRadius( fLogicOuterRadius ); //point color: boost::scoped_ptr< tPropertyNameValueMap > apOverwritePropertiesMap(NULL); @@ -496,12 +516,10 @@ void PieChart::createShapes() } //create data point - double fLogicZ = -1.0; // For 3D pie chart label position - uno::Reference<drawing::XShape> xPointShape( - createDataPoint( xSeriesGroupShape_Shapes, xPointProperties - , fUnitCircleStartAngleDegree, fUnitCircleWidthAngleDegree - , fUnitCircleInnerRadius, fUnitCircleOuterRadius - , fLogicZ, fDepth, fExplodePercentage, apOverwritePropertiesMap.get() ) ); + aParam.mfLogicZ = -1.0; // For 3D pie chart label position + uno::Reference<drawing::XShape> xPointShape = + createDataPoint( + xSeriesGroupShape_Shapes, xPointProperties, apOverwritePropertiesMap.get(), aParam); if(bHasFillColorMapping) { @@ -514,11 +532,7 @@ void PieChart::createShapes() } //create label - createTextLabelShape( - xTextTarget, *pSeries, nPointIndex, - fUnitCircleStartAngleDegree, fUnitCircleWidthAngleDegree, - fUnitCircleOuterRadius, fUnitCircleInnerRadius, - fExplodePercentage, fLogicYSum, fLogicZ); + createTextLabelShape(xTextTarget, *pSeries, nPointIndex, aParam); if(!bDoExplode) { @@ -529,12 +543,12 @@ void PieChart::createShapes() { //enable dragging of outer segments - double fAngle = fUnitCircleStartAngleDegree + fUnitCircleWidthAngleDegree/2.0; - double fMaxDeltaRadius = fUnitCircleOuterRadius-fUnitCircleInnerRadius; - drawing::Position3D aOrigin = m_pPosHelper->transformUnitCircleToScene( fAngle, fUnitCircleOuterRadius, fLogicZ ); - drawing::Position3D aNewOrigin = m_pPosHelper->transformUnitCircleToScene( fAngle, fUnitCircleOuterRadius + fMaxDeltaRadius, fLogicZ ); + double fAngle = aParam.mfUnitCircleStartAngleDegree + aParam.mfUnitCircleWidthAngleDegree/2.0; + double fMaxDeltaRadius = aParam.mfUnitCircleOuterRadius-aParam.mfUnitCircleInnerRadius; + drawing::Position3D aOrigin = m_pPosHelper->transformUnitCircleToScene( fAngle, aParam.mfUnitCircleOuterRadius, aParam.mfLogicZ ); + drawing::Position3D aNewOrigin = m_pPosHelper->transformUnitCircleToScene( fAngle, aParam.mfUnitCircleOuterRadius + fMaxDeltaRadius, aParam.mfLogicZ ); - sal_Int32 nOffsetPercent( static_cast<sal_Int32>(fExplodePercentage * 100.0) ); + sal_Int32 nOffsetPercent( static_cast<sal_Int32>(aParam.mfExplodePercentage * 100.0) ); awt::Point aMinimumPosition( PlottingPositionHelper::transformSceneToScreenPosition( aOrigin, m_xLogicTarget, m_pShapeFactory, m_nDimension ) ); diff --git a/chart2/source/view/charttypes/PieChart.hxx b/chart2/source/view/charttypes/PieChart.hxx index a9c723dcb79d..2b88b1a0ca56 100644 --- a/chart2/source/view/charttypes/PieChart.hxx +++ b/chart2/source/view/charttypes/PieChart.hxx @@ -30,7 +30,8 @@ class PiePositionHelper; class PieChart : public VSeriesPlotter { - // public methods + struct ShapeParam; + public: PieChart( const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartType >& xChartTypeModel @@ -63,22 +64,16 @@ private: //methods //no default constructor PieChart(); - ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > - createDataPoint( const ::com::sun::star::uno::Reference< - ::com::sun::star::drawing::XShapes >& xTarget - , const ::com::sun::star::uno::Reference< - ::com::sun::star::beans::XPropertySet >& xObjectProperties - , double fUnitCircleStartAngleDegree, double fWidthAngleDegree - , double fUnitCircleInnerRadius, double fUnitCircleOuterRadius - , double fLogicZ, double fDepth, double fExplodePercentage - , tPropertyNameValueMap* pOverWritePropertiesMap ); + css::uno::Reference<css::drawing::XShape> + createDataPoint( + const css::uno::Reference<css::drawing::XShapes>& xTarget, + const css::uno::Reference<css::beans::XPropertySet>& xObjectProperties, + tPropertyNameValueMap* pOverWritePropertiesMap, + const ShapeParam& rParam ); void createTextLabelShape( const css::uno::Reference<css::drawing::XShapes>& xTextTarget, - VDataSeries& rSeries, sal_Int32 nPointIndex, - double fUnitCircleStartAngleDegree, double fUnitCircleWidthAngleDegree, - double fUnitCircleOuterRadius, double fUnitCircleInnerRadius, double fExplodePercentage, - double fLogicYSum, double fLogicZ ); + VDataSeries& rSeries, sal_Int32 nPointIndex, ShapeParam& rParam ); double getMaxOffset(); bool detectLabelOverlapsAndMove(const ::com::sun::star::awt::Size& rPageSize);//returns true when there might be more to do |