summaryrefslogtreecommitdiff
path: root/chart2/source/view/charttypes/VSeriesPlotter.cxx
diff options
context:
space:
mode:
authorMarco Cecchetti <marco.cecchetti@collabora.com>2015-07-19 18:18:00 +0200
committerAndras Timar <andras.timar@collabora.com>2015-09-09 07:41:51 +0000
commit9ed1dd01be8afa0961e388a79e9ff4c1235820c2 (patch)
tree366cad6bae91e791be462e4c03f499ab0ba3e2f2 /chart2/source/view/charttypes/VSeriesPlotter.cxx
parent79bc956e7f44b762bfd6560e5a9c9812fa3dcf4d (diff)
tdf#90839: support for wrapped text in data labels and for centered data value
Now in a pie chart the text of a label can be wrapped, the wrapping is automatic and the maximum text width is fixed to almost half the pie radius. This feature is used to import correctly the relative text wrapping property provided by MSO. Moreover the data value and percent value of a label are now centered horizontally, respect with the label text. Conflicts: chart2/qa/extras/xshape/chart2xshape.cxx Change-Id: Ie10d6184365436f763cd9693a5bbefcfa9b3862b Reviewed-on: https://gerrit.libreoffice.org/17193 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Andras Timar <andras.timar@collabora.com>
Diffstat (limited to 'chart2/source/view/charttypes/VSeriesPlotter.cxx')
-rw-r--r--chart2/source/view/charttypes/VSeriesPlotter.cxx139
1 files changed, 111 insertions, 28 deletions
diff --git a/chart2/source/view/charttypes/VSeriesPlotter.cxx b/chart2/source/view/charttypes/VSeriesPlotter.cxx
index 2fa557f42c48..7a8f1d28f708 100644
--- a/chart2/source/view/charttypes/VSeriesPlotter.cxx
+++ b/chart2/source/view/charttypes/VSeriesPlotter.cxx
@@ -66,6 +66,17 @@
#include <com/sun/star/drawing/LineStyle.hpp>
#include <com/sun/star/util/XCloneable.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/container/XEnumeration.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/text/XText.hpp>
+#include <com/sun/star/text/XSimpleText.hpp>
+#include <com/sun/star/text/XTextContent.hpp>
+#include <com/sun/star/text/XTextRange.hpp>
+#include <com/sun/star/text/XTextCursor.hpp>
+#include <com/sun/star/style/ParagraphAdjust.hpp>
+#include <com/sun/star/drawing/TextFitToSizeType.hpp>
+
#include <svx/unoshape.hxx>
#include <functional>
@@ -415,7 +426,8 @@ uno::Reference< drawing::XShape > VSeriesPlotter::createDataLabel( const uno::Re
, double fSumValue
, const awt::Point& rScreenPosition2D
, LabelAlignment eAlignment
- , sal_Int32 nOffset )
+ , sal_Int32 nOffset
+ , sal_Int32 nTextWidth )
{
uno::Reference< drawing::XShape > xTextShape;
@@ -476,10 +488,10 @@ uno::Reference< drawing::XShape > VSeriesPlotter::createDataLabel( const uno::Re
xSymbol.set( VSeriesPlotter::createLegendSymbolForPoint( aMaxSymbolExtent, rDataSeries, nPointIndex, xTarget_, m_xShapeFactory ) );
else
xSymbol.set( VSeriesPlotter::createLegendSymbolForSeries( aMaxSymbolExtent, rDataSeries, xTarget_, m_xShapeFactory ) );
-
}
+
//prepare text
- OUStringBuffer aText;
+ bool bTextWrap = false;
OUString aSeparator(" ");
double fRotationDegrees = 0.0;
try
@@ -487,6 +499,7 @@ uno::Reference< drawing::XShape > VSeriesPlotter::createDataLabel( const uno::Re
uno::Reference< beans::XPropertySet > xPointProps( rDataSeries.getPropertiesOfPoint( nPointIndex ) );
if(xPointProps.is())
{
+ xPointProps->getPropertyValue( "TextWordWrap" ) >>= bTextWrap;
xPointProps->getPropertyValue( "LabelSeparator" ) >>= aSeparator;
// Extract the optional text rotation through the
// "TextRotation" property attached to the passed data point.
@@ -498,12 +511,8 @@ uno::Reference< drawing::XShape > VSeriesPlotter::createDataLabel( const uno::Re
ASSERT_EXCEPTION( e );
}
- // check if data series entry percent value and absolute value have to
- // be appended to the text label, and what should be the separator
- // character (comma, space, new line). In case it is a new line we get
- // a multi-line label.
- bool bMultiLineLabel = aSeparator == "\n";
sal_Int32 nLineCountForSymbolsize = 0;
+ Sequence< OUString > aTextList(3);
{
if(pLabel->ShowCategoryName)
{
@@ -512,22 +521,14 @@ uno::Reference< drawing::XShape > VSeriesPlotter::createDataLabel( const uno::Re
Sequence< OUString > aCategories( m_pExplicitCategoriesProvider->getSimpleCategories() );
if( nPointIndex >= 0 && nPointIndex < aCategories.getLength() )
{
- aText.append( aCategories[nPointIndex] );
- ++nLineCountForSymbolsize;
+ aTextList[0] = aCategories[nPointIndex];
}
}
}
if(pLabel->ShowNumber)
{
- OUString aNumber = getLabelTextForValue(rDataSeries, nPointIndex, fValue, false);
- if( !aNumber.isEmpty() )
- {
- if(!aText.isEmpty())
- aText.append(aSeparator);
- aText.append(aNumber);
- ++nLineCountForSymbolsize;
- }
+ aTextList[1] = getLabelTextForValue(rDataSeries, nPointIndex, fValue, false);
}
if(pLabel->ShowNumberInPercent)
@@ -538,16 +539,18 @@ uno::Reference< drawing::XShape > VSeriesPlotter::createDataLabel( const uno::Re
if( fValue < 0 )
fValue*=-1.0;
- OUString aPercentage = getLabelTextForValue(rDataSeries, nPointIndex, fValue, true);
- if( !aPercentage.isEmpty() )
+ aTextList[2] = getLabelTextForValue(rDataSeries, nPointIndex, fValue, true);
+ }
+
+ for( sal_Int32 nN = 0; nN < 3; ++nN)
+ {
+ if( !aTextList[nN].isEmpty() )
{
- if(!aText.isEmpty())
- aText.append(aSeparator);
- aText.append(aPercentage);
++nLineCountForSymbolsize;
}
}
}
+
//prepare properties for multipropertyset-interface of shape
tNameSequence* pPropNames;
tAnySequence* pPropValues;
@@ -557,14 +560,94 @@ uno::Reference< drawing::XShape > VSeriesPlotter::createDataLabel( const uno::Re
// set text alignment for the text shape to be created.
LabelPositionHelper::changeTextAdjustment( *pPropValues, *pPropNames, eAlignment );
- //create text shape
- xTextShape = AbstractShapeFactory::getOrCreateShapeFactory(m_xShapeFactory)->
- createText( xTarget_, aText.makeStringAndClear()
- , *pPropNames, *pPropValues, AbstractShapeFactory::makeTransformation( aScreenPosition2D ) );
+ // check if data series entry percent value and absolute value have to
+ // be appended to the text label, and what should be the separator
+ // character (comma, space, new line). In case it is a new line we get
+ // a multi-line label.
+ bool bMultiLineLabel = ( aSeparator == "\n" );
+
+ if( bMultiLineLabel )
+ {
+ // prepare properties for each paragraph
+ // we want to have the value and percent value centered respect
+ // with the category name
+ Sequence< tNameSequence > aParaPropNames(3);
+ aParaPropNames[1].realloc(1);
+ aParaPropNames[1][0] = OUString( "ParaAdjust" );
+ aParaPropNames[2].realloc(1);
+ aParaPropNames[2][0] = OUString( "ParaAdjust" );
+
+ Sequence< tAnySequence > aParaPropValues(3);
+ aParaPropValues[1].realloc(1);
+ aParaPropValues[1][0] = uno::makeAny( style::ParagraphAdjust_CENTER );
+ aParaPropValues[2].realloc(1);
+ aParaPropValues[2][0] = uno::makeAny( style::ParagraphAdjust_CENTER );
+
+ //create text shape
+ xTextShape = AbstractShapeFactory::getOrCreateShapeFactory(m_xShapeFactory)->
+ createText( xTarget_, aTextList, aParaPropNames, aParaPropValues
+ , *pPropNames, *pPropValues, AbstractShapeFactory::makeTransformation( aScreenPosition2D ) );
+ }
+ else
+ {
+ // join text list elements
+ OUStringBuffer aText;
+ for( sal_Int32 nN = 0; nN < 3; ++nN)
+ {
+ if( !aTextList[nN].isEmpty() )
+ {
+ if( !aText.isEmpty() )
+ {
+ aText.append(aSeparator);
+ }
+ aText.append( aTextList[nN] );
+ }
+ }
+
+ //create text shape
+ xTextShape = AbstractShapeFactory::getOrCreateShapeFactory(m_xShapeFactory)->
+ createText( xTarget_, aText.makeStringAndClear()
+ , *pPropNames, *pPropValues, AbstractShapeFactory::makeTransformation( aScreenPosition2D ) );
+ }
if( !xTextShape.is() )
return xTextShape;
+ // we need to use a default value for the maximum width property ?
+ if( nTextWidth == 0 && bTextWrap )
+ {
+ sal_Int32 nMinSize =
+ (m_aPageReferenceSize.Height < m_aPageReferenceSize.Width)
+ ? m_aPageReferenceSize.Height
+ : m_aPageReferenceSize.Width;
+ nTextWidth = nMinSize / 3;
+ }
+
+ // in case text must be wrapped set the maximum width property
+ // for the text shape
+ if( nTextWidth != 0 && bTextWrap )
+ {
+ uno::Reference< beans::XPropertySet > xProp( xTextShape, uno::UNO_QUERY );
+ if( xProp.is() )
+ {
+ // compute the height of a line of text
+ if( !bMultiLineLabel || nLineCountForSymbolsize <= 0 )
+ {
+ nLineCountForSymbolsize = 1;
+ }
+ awt::Size aTextSize = xTextShape->getSize();
+ sal_Int32 aTextLineHeight = aTextSize.Height / nLineCountForSymbolsize;
+
+ // set maximum text width
+ uno::Any aTextMaximumFrameWidth = uno::makeAny( nTextWidth );
+ xProp->setPropertyValue( "TextMaximumFrameWidth", aTextMaximumFrameWidth );
+
+ // compute the total lines of text
+ aTextSize = xTextShape->getSize();
+ nLineCountForSymbolsize = aTextSize.Height / aTextLineHeight;
+ }
+ }
+
// in case text is rotated, the transformation property of the text
// shape is modified.
const awt::Point aUnrotatedTextPos( xTextShape->getPosition() );
@@ -586,7 +669,7 @@ uno::Reference< drawing::XShape > VSeriesPlotter::createDataLabel( const uno::Re
awt::Point aSymbolPosition( aUnrotatedTextPos );
awt::Size aSymbolSize( xSymbol->getSize() );
- awt::Size aTextSize( xTextShape->getSize() );
+ awt::Size aTextSize = xTextShape->getSize();
sal_Int32 nXDiff = aSymbolSize.Width + static_cast< sal_Int32 >( std::max( 100.0, fViewFontSize * 0.22 ) );//minimum 1mm
if( !bMultiLineLabel || nLineCountForSymbolsize <= 0 )