diff options
author | Ingrid Halama <iha@openoffice.org> | 2004-01-06 18:45:54 +0000 |
---|---|---|
committer | Ingrid Halama <iha@openoffice.org> | 2004-01-06 18:45:54 +0000 |
commit | ff2df87a01cdb963a52da1539fa49ba42aef691a (patch) | |
tree | c537ac4207bc774829c698a521e2bb0e2b2bd4ba /chart2 | |
parent | eeec3a207b7b0a6e36831b9455563a5858a74c45 (diff) |
3D data labels
Diffstat (limited to 'chart2')
-rw-r--r-- | chart2/source/view/charttypes/AreaChart.cxx | 21 | ||||
-rw-r--r-- | chart2/source/view/charttypes/BarChart.cxx | 47 | ||||
-rw-r--r-- | chart2/source/view/charttypes/BarChart.hxx | 4 | ||||
-rw-r--r-- | chart2/source/view/charttypes/PieChart.cxx | 107 | ||||
-rw-r--r-- | chart2/source/view/charttypes/PieChart.hxx | 5 |
5 files changed, 144 insertions, 40 deletions
diff --git a/chart2/source/view/charttypes/AreaChart.cxx b/chart2/source/view/charttypes/AreaChart.cxx index e0c9964f4218..b8121fc35636 100644 --- a/chart2/source/view/charttypes/AreaChart.cxx +++ b/chart2/source/view/charttypes/AreaChart.cxx @@ -482,7 +482,7 @@ void AreaChart::createShapes() m_xErrorBarTarget = createGroupShape( m_xLogicTarget,rtl::OUString() ); else m_xErrorBarTarget = m_xSeriesTarget; - m_xTextTarget = createGroupShape( m_xLogicTarget,rtl::OUString() ); + m_xTextTarget = m_pShapeFactory->createGroup2D( m_xFinalTarget,rtl::OUString() ); //--------------------------------------------- //check necessary here that different Y axis can not be stacked in the same group? ... hm? @@ -641,14 +641,17 @@ void AreaChart::createShapes() createErrorBar_Y( aUnscaledLogicPosition, **aSeriesIter, nIndex, m_xErrorBarTarget ); //create data point label - LabelAlignment eAlignment(LABEL_ALIGN_TOP); - awt::Point aScreenPosition2D = awt::Point( - static_cast<sal_Int32>(aTransformedGeom.m_aPosition.PositionX) - ,static_cast<sal_Int32>(aTransformedGeom.m_aPosition.PositionY - -aSymbolSize.DirectionY/2-1)); - this->createDataLabel( m_xTextTarget, **aSeriesIter, nIndex - , aUnscaledLogicPosition.PositionY - , fLogicYSum, aScreenPosition2D, eAlignment ); + if( (**aSeriesIter).getDataPointLabelIfLabel(nIndex) ) + { + LabelAlignment eAlignment = LABEL_ALIGN_TOP; + drawing::Position3D aScenePosition3D( aTransformedGeom.m_aPosition.PositionX + , aTransformedGeom.m_aPosition.PositionY-aSymbolSize.DirectionY/2-1 + , aTransformedGeom.m_aPosition.PositionZ+m_pPosHelper->getTransformedDepth() ); + awt::Point aScreenPosition2D( this->transformSceneToScreenPosition( aScenePosition3D ) ); + this->createDataLabel( m_xTextTarget, **aSeriesIter, nIndex + , aUnscaledLogicPosition.PositionY + , fLogicYSum, aScreenPosition2D, eAlignment ); + } } //remove PointGroupShape if empty diff --git a/chart2/source/view/charttypes/BarChart.cxx b/chart2/source/view/charttypes/BarChart.cxx index a48f4d3f07c9..4df588b466a2 100644 --- a/chart2/source/view/charttypes/BarChart.cxx +++ b/chart2/source/view/charttypes/BarChart.cxx @@ -188,6 +188,28 @@ APPHELPER_XSERVICEINFO_IMPL(BarChart,CHART2_VIEW_BARCHART_SERVICE_IMPLEMENTATION } */ +awt::Point BarChart::getLabelScreenPositionAndAlignment( + LabelAlignment& rAlignment, bool bMiddlePosition + , const DataPointGeometry& rTransformedGeom ) const +{ + drawing::Position3D aScenePosition3D( rTransformedGeom.m_aPosition.PositionX + , rTransformedGeom.m_aPosition.PositionY + rTransformedGeom.m_aSize.DirectionY + , 0 ); + if(bMiddlePosition) + { + aScenePosition3D.PositionY -= rTransformedGeom.m_aSize.DirectionY/2.0; + rAlignment = LABEL_ALIGN_CENTER; + } + if(3==m_nDimension) + { + rAlignment = LABEL_ALIGN_CENTER; + aScenePosition3D.PositionZ -= rTransformedGeom.m_aSize.DirectionZ/2.0; + if(bMiddlePosition) + aScenePosition3D.PositionZ -= rTransformedGeom.m_aSize.DirectionZ/2.0; + } + return this->transformSceneToScreenPosition( aScenePosition3D ); +} + uno::Reference< drawing::XShape > BarChart::createDataPoint2D_Bar( const uno::Reference< drawing::XShapes >& xTarget , const DataPointGeometry& rGeometry @@ -288,7 +310,7 @@ void BarChart::createShapes() uno::Reference< drawing::XShapes > xRegressionCurveTarget( createGroupShape( m_xLogicTarget,rtl::OUString() )); uno::Reference< drawing::XShapes > xTextTarget( - createGroupShape( m_xLogicTarget,rtl::OUString() )); + m_pShapeFactory->createGroup2D( m_xFinalTarget,rtl::OUString() )); //--------------------------------------------- @@ -448,21 +470,14 @@ void BarChart::createShapes() //------------ //create data point label - bool bMiddlePosition = false; - if( pSeriesList->begin() != pSeriesList->end() ) - bMiddlePosition = true; - - awt::Point aScreenPosition2D = awt::Point( - static_cast<sal_Int32>(aTransformedGeom.m_aPosition.PositionX) - ,static_cast<sal_Int32>(aTransformedGeom.m_aPosition.PositionY - +aTransformedGeom.m_aSize.DirectionY ) - ); - if(bMiddlePosition) - aScreenPosition2D.Y -= static_cast<sal_Int32>(aTransformedGeom.m_aSize.DirectionY/2.0); - - double fLogicSum = bPositive ? fLogicPositiveYSum : fLogicNegativeYSum; - this->createDataLabel( xTextTarget, **aSeriesIter, nCatIndex - , fLogicBarHeight, fLogicSum, aScreenPosition2D ); + if( (**aSeriesIter).getDataPointLabelIfLabel(nCatIndex) ) + { + double fLogicSum = bPositive ? fLogicPositiveYSum : fLogicNegativeYSum; + LabelAlignment eAlignment(LABEL_ALIGN_TOP); + awt::Point aScreenPosition2D( this->getLabelScreenPositionAndAlignment(eAlignment, pSeriesList->size() > 1, aTransformedGeom)); + this->createDataLabel( xTextTarget, **aSeriesIter, nCatIndex + , fLogicBarHeight, fLogicSum, aScreenPosition2D, eAlignment ); + } }//end iteration through partial points //remove PointGroupShape if empty diff --git a/chart2/source/view/charttypes/BarChart.hxx b/chart2/source/view/charttypes/BarChart.hxx index 8b23e3e01a9d..f0ab7008a7e3 100644 --- a/chart2/source/view/charttypes/BarChart.hxx +++ b/chart2/source/view/charttypes/BarChart.hxx @@ -61,6 +61,10 @@ private: //methods , const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xObjectProperties ); + ::com::sun::star::awt::Point getLabelScreenPositionAndAlignment( + LabelAlignment& rAlignment, bool bMiddlePosition + , const DataPointGeometry& rTransformedGeom ) const; + private: //member BarPositionHelper* m_pPosHelper; }; diff --git a/chart2/source/view/charttypes/PieChart.cxx b/chart2/source/view/charttypes/PieChart.cxx index aaf6a43e5963..70da314a9896 100644 --- a/chart2/source/view/charttypes/PieChart.cxx +++ b/chart2/source/view/charttypes/PieChart.cxx @@ -15,6 +15,10 @@ #ifndef INCLUDED_RTL_MATH_HXX #include <rtl/math.hxx> #endif +// header for class Vector2D +#ifndef _VECTOR2D_HXX +#include <tools/vector2d.hxx> +#endif //............................................................................. namespace chart @@ -238,6 +242,20 @@ bool PieChart::isSingleRingChart() const return m_pPosHelper->getEndCategoryIndex()==1 ; } +awt::Point PieChart::transformLogicToScreenPosition( const drawing::Position3D& rLogicPosition3D ) const +{ + drawing::Position3D aScenePosition3D( SequenceToPosition3D( + m_pPosHelper->getTransformationLogicToScene( m_nDimension )->transform( + Position3DToSequence(rLogicPosition3D) ) ) ); + if(3==m_nDimension) + { + drawing::Position3D aScenePosition3D_rotated( aScenePosition3D.PositionX, -aScenePosition3D.PositionZ, aScenePosition3D.PositionY ); + aScenePosition3D = aScenePosition3D_rotated; + } + awt::Point aScreenPosition2D( this->transformSceneToScreenPosition( aScenePosition3D ) ); + return aScreenPosition2D; +} + awt::Point PieChart::getLabelScreenPositionAndAlignment( LabelAlignment& rAlignment, bool bOutsidePosition , double fAngleDegree, double fOuterRadius, double fInnerRadius, double fLogicZ) const { @@ -247,8 +265,71 @@ awt::Point PieChart::getLabelScreenPositionAndAlignment( LabelAlignment& rAlignm double fRadius = 0.0; if( bOutsidePosition ) { - fRadius = fOuterRadius + 0.1*fOuterRadius; - if(fAngleDegree<=22.5) + fRadius = fOuterRadius; + if(3!=m_nDimension) //for 3D better add 10percent of the 2D distance + fRadius += 0.1*fOuterRadius; + } + else + fRadius = fInnerRadius + (fOuterRadius-fInnerRadius)/2.0 ; + + if(3==m_nDimension) + fAnglePi *= -1.0; + drawing::Position3D aLogicPos(fRadius*cos(fAnglePi),fRadius*sin(fAnglePi),fLogicZ+0.5); + awt::Point aRet( this->transformLogicToScreenPosition( aLogicPos ) ); + + if(3==m_nDimension) + { + //check wether the upper or the downer edge is more distant from the center + //take the farest point to put the label to + drawing::Position3D aLogicPos2(fRadius*cos(fAnglePi),fRadius*sin(fAnglePi),fLogicZ-0.5); + drawing::Position3D aLogicCenter(0,0,fLogicZ); + + awt::Point aP0( this->transformLogicToScreenPosition( + drawing::Position3D(0,0,fLogicZ) ) ); + awt::Point aP1(aRet); + awt::Point aP2( this->transformLogicToScreenPosition( + drawing::Position3D(fRadius*cos(fAnglePi),fRadius*sin(fAnglePi),fLogicZ-0.5) ) ); + + Vector2D aV0( aP0.X, aP0.Y ); + Vector2D aV1( aP1.X, aP1.Y ); + Vector2D aV2( aP2.X, aP2.Y ); + + double fL1 = (aV1-aV0).GetLength(); + double fL2 = (aV2-aV0).GetLength(); + + if(fL2>fL1) + aRet = aP2; + + //calculate new angle for alignment + double fDX = aRet.X-aP0.X; + double fDY = aRet.Y-aP0.Y; + fDY*=-1.0;//drawing layer has inverse y values + if( fDX != 0.0 ) + { + fAngleDegree = atan(fDY/fDX)*180.0/F_PI; + if(fDX<0.0) + fAngleDegree+=180.0; + } + else + { + if(fDY>0.0) + fAngleDegree = 90.0; + else + fAngleDegree = 270.0; + } + } + //------------------------------ + //set LabelAlignment + if( bOutsidePosition ) + { + while(fAngleDegree>360.0) + fAngleDegree-=360.0; + while(fAngleDegree<0.0) + fAngleDegree+=360.0; + + if(fAngleDegree==0.0) + rAlignment = LABEL_ALIGN_CENTER; + else if(fAngleDegree<=22.5) rAlignment = LABEL_ALIGN_RIGHT; else if(fAngleDegree<67.5) rAlignment = LABEL_ALIGN_RIGHT_TOP; @@ -269,14 +350,9 @@ awt::Point PieChart::getLabelScreenPositionAndAlignment( LabelAlignment& rAlignm } else { - fRadius = fInnerRadius + (fOuterRadius-fInnerRadius)/2.0 ; rAlignment = LABEL_ALIGN_CENTER; } - drawing::Position3D aLogicPos(fRadius*cos(fAnglePi),fRadius*sin(fAnglePi),fLogicZ); - - uno::Reference< XTransformation > xTransformation = m_pPosHelper->getTransformationLogicToScene( m_nDimension ); - drawing::Position3D aScreenPosition3D( SequenceToPosition3D( xTransformation->transform( Position3DToSequence(aLogicPos) ) ) ); - return awt::Point( aScreenPosition3D.PositionX, aScreenPosition3D.PositionY ); + return aRet; } uno::Reference< drawing::XShape > PieChart::createDataPoint2D( @@ -320,7 +396,7 @@ void PieChart::createShapes() uno::Reference< drawing::XShapes > xSeriesTarget( createGroupShape( m_xLogicTarget,rtl::OUString() )); uno::Reference< drawing::XShapes > xTextTarget( - createGroupShape( m_xLogicTarget,rtl::OUString() )); + m_pShapeFactory->createGroup2D( m_xFinalTarget,rtl::OUString() )); if( this->isSingleRingChart() ) { @@ -439,11 +515,14 @@ void PieChart::createShapes() ,(*aSeriesIter)->getPropertiesOfPoint( nCatIndex )); } //create data point label - LabelAlignment eAlignment(LABEL_ALIGN_CENTER); - awt::Point aScreenPosition2D( this->getLabelScreenPositionAndAlignment(eAlignment, this->isSingleRingChart() - , fStartAngleDegree + fWidthAngleDegree/2.0, fOuterXRadius, fInnerXRadius, fLogicZ )); - this->createDataLabel( xTextTarget, **aSeriesIter, nCatIndex - , fLogicYValue, fLogicYSum, aScreenPosition2D, eAlignment ); + if( (**aSeriesIter).getDataPointLabelIfLabel(nCatIndex) ) + { + LabelAlignment eAlignment(LABEL_ALIGN_CENTER); + awt::Point aScreenPosition2D( this->getLabelScreenPositionAndAlignment(eAlignment, this->isSingleRingChart() + , fStartAngleDegree + fWidthAngleDegree/2.0, fOuterXRadius, fInnerXRadius, fLogicZ )); + this->createDataLabel( xTextTarget, **aSeriesIter, nCatIndex + , fLogicYValue, fLogicYSum, aScreenPosition2D, eAlignment ); + } } //remove PointGroupShape if empty diff --git a/chart2/source/view/charttypes/PieChart.hxx b/chart2/source/view/charttypes/PieChart.hxx index af1b5513a2b6..43aee9cff770 100644 --- a/chart2/source/view/charttypes/PieChart.hxx +++ b/chart2/source/view/charttypes/PieChart.hxx @@ -55,11 +55,14 @@ private: //methods , const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xObjectProperties ); - ::com::sun::star::awt::Point PieChart::getLabelScreenPositionAndAlignment( + ::com::sun::star::awt::Point getLabelScreenPositionAndAlignment( LabelAlignment& rAlignment, bool bCenteredPosition , double fAngleDegree, double fOuterRadius, double fInnerRadius , double fLogicZ) const; + ::com::sun::star::awt::Point transformLogicToScreenPosition( + const ::com::sun::star::drawing::Position3D& rScenePosition3D ) const; + bool isSingleRingChart() const; private: //member |