summaryrefslogtreecommitdiff
path: root/chart2
diff options
context:
space:
mode:
authorIngrid Halama <iha@openoffice.org>2004-01-06 18:45:54 +0000
committerIngrid Halama <iha@openoffice.org>2004-01-06 18:45:54 +0000
commitff2df87a01cdb963a52da1539fa49ba42aef691a (patch)
treec537ac4207bc774829c698a521e2bb0e2b2bd4ba /chart2
parenteeec3a207b7b0a6e36831b9455563a5858a74c45 (diff)
3D data labels
Diffstat (limited to 'chart2')
-rw-r--r--chart2/source/view/charttypes/AreaChart.cxx21
-rw-r--r--chart2/source/view/charttypes/BarChart.cxx47
-rw-r--r--chart2/source/view/charttypes/BarChart.hxx4
-rw-r--r--chart2/source/view/charttypes/PieChart.cxx107
-rw-r--r--chart2/source/view/charttypes/PieChart.hxx5
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