blob: 3717b5c050c75b9ffdbbabfd729377ee88368fba [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_chart2.hxx"
#include "ObjectNameProvider.hxx"
#include "ResId.hxx"
#include "Strings.hrc"
#include "macros.hxx"
#include "AxisHelper.hxx"
#include "ChartModelHelper.hxx"
#include "DiagramHelper.hxx"
#include "DataSeriesHelper.hxx"
#include "TitleHelper.hxx"
#include "AxisIndexDefines.hxx"
#include "ExplicitCategoriesProvider.hxx"
#include "CommonConverters.hxx"
#include "NumberFormatterWrapper.hxx"
#include "RegressionCurveHelper.hxx"
#include <rtl/math.hxx>
#include <tools/debug.hxx>
#include <tools/string.hxx>
#include <com/sun/star/chart2/XTitle.hpp>
#include <com/sun/star/chart2/XRegressionCurveContainer.hpp>
//.............................................................................
namespace chart
{
//.............................................................................
using namespace ::com::sun::star;
using namespace ::com::sun::star::chart2;
using ::com::sun::star::uno::Reference;
using ::com::sun::star::uno::Sequence;
using ::com::sun::star::uno::Any;
using rtl::OUString;
namespace
{
OUString lcl_getDataSeriesName( const rtl::OUString& rObjectCID, const Reference< frame::XModel >& xChartModel )
{
OUString aRet;
Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xChartModel ) );
Reference< XDataSeries > xSeries( ObjectIdentifier::getDataSeriesForCID( rObjectCID , xChartModel ), uno::UNO_QUERY );
if( xDiagram.is() && xSeries.is() )
{
Reference< XChartType > xChartType( DiagramHelper::getChartTypeOfSeries( xDiagram, xSeries ) );
if( xChartType.is() )
{
aRet = ::chart::DataSeriesHelper::getDataSeriesLabel(
xSeries, xChartType->getRoleOfSequenceForSeriesLabel() ) ;
}
}
return aRet;
}
OUString lcl_getFullSeriesName( const rtl::OUString& rObjectCID, const Reference< frame::XModel >& xChartModel )
{
OUString aRet = String(SchResId(STR_TIP_DATASERIES));
OUString aWildcard( C2U("%SERIESNAME") );
sal_Int32 nIndex = aRet.indexOf( aWildcard );
if( nIndex != -1 )
aRet = aRet.replaceAt( nIndex, aWildcard.getLength(), lcl_getDataSeriesName( rObjectCID, xChartModel ) );
return aRet;
}
void lcl_addText( OUString& rOut, const OUString& rSeparator, const OUString& rNext )
{
if( !rOut.isEmpty() && !rNext.isEmpty() )
rOut+=rSeparator;
if( !rNext.isEmpty() )
rOut+=rNext;
}
OUString lcl_getDataPointValueText( const Reference< XDataSeries >& xSeries, sal_Int32 nPointIndex,
const Reference< XCoordinateSystem >& xCooSys,
const Reference< frame::XModel >& xChartModel )
{
OUString aRet;
Reference<data::XDataSource> xDataSource(
uno::Reference<data::XDataSource>( xSeries, uno::UNO_QUERY ) );
if(!xDataSource.is())
return aRet;
Sequence< Reference< data::XLabeledDataSequence > > aDataSequences( xDataSource->getDataSequences() );
rtl::OUString aX, aY, aY_Min, aY_Max, aY_First, aY_Last, a_Size;
double fValue = 0;
uno::Reference< util::XNumberFormatsSupplier > xNumberFormatsSupplier( xChartModel, uno::UNO_QUERY );
NumberFormatterWrapper aNumberFormatterWrapper( xNumberFormatsSupplier );
sal_Int32 nLabelColor = 0;//dummy
bool bColorChanged;//dummy
for(sal_Int32 nN = aDataSequences.getLength();nN--;)
{
uno::Reference<data::XDataSequence> xDataSequence( aDataSequences[nN]->getValues());
if( !xDataSequence.is() )
continue;
Sequence< Any > aData( xDataSequence->getData() );
if( nPointIndex >= aData.getLength() )
continue;
uno::Reference<beans::XPropertySet> xProp(xDataSequence, uno::UNO_QUERY );
if( xProp.is())
{
try
{
uno::Any aARole = xProp->getPropertyValue( C2U( "Role" ) );
rtl::OUString aRole;
aARole >>= aRole;
if( aRole.equals(C2U("values-x")) )
{
aData[nPointIndex]>>= fValue;
sal_Int32 nNumberFormatKey = xDataSequence->getNumberFormatKeyByIndex( nPointIndex );
aX = aNumberFormatterWrapper.getFormattedString( nNumberFormatKey, fValue, nLabelColor, bColorChanged );
}
else if( aRole.equals(C2U("values-y")) )
{
aData[nPointIndex]>>= fValue;
sal_Int32 nNumberFormatKey = xDataSequence->getNumberFormatKeyByIndex( nPointIndex );
aY = aNumberFormatterWrapper.getFormattedString( nNumberFormatKey, fValue, nLabelColor, bColorChanged );
}
else if( aRole.equals(C2U("values-first")) )
{
aData[nPointIndex]>>= fValue;
sal_Int32 nNumberFormatKey = xDataSequence->getNumberFormatKeyByIndex( nPointIndex );
aY_First = aNumberFormatterWrapper.getFormattedString( nNumberFormatKey, fValue, nLabelColor, bColorChanged );
}
else if( aRole.equals(C2U("values-min")) )
{
aData[nPointIndex]>>= fValue;
sal_Int32 nNumberFormatKey = xDataSequence->getNumberFormatKeyByIndex( nPointIndex );
aY_Min = aNumberFormatterWrapper.getFormattedString( nNumberFormatKey, fValue, nLabelColor, bColorChanged );
}
else if( aRole.equals(C2U("values-max")) )
{
aData[nPointIndex]>>= fValue;
sal_Int32 nNumberFormatKey = xDataSequence->getNumberFormatKeyByIndex( nPointIndex );
aY_Max = aNumberFormatterWrapper.getFormattedString( nNumberFormatKey, fValue, nLabelColor, bColorChanged );
}
else if( aRole.equals(C2U("values-last")) )
{
aData[nPointIndex]>>= fValue;
sal_Int32 nNumberFormatKey = xDataSequence->getNumberFormatKeyByIndex( nPointIndex );
aY_Last = aNumberFormatterWrapper.getFormattedString( nNumberFormatKey, fValue, nLabelColor, bColorChanged );
}
else if( aRole.equals(C2U("values-size")) )
{
aData[nPointIndex]>>= fValue;
sal_Int32 nNumberFormatKey = xDataSequence->getNumberFormatKeyByIndex( nPointIndex );
a_Size = aNumberFormatterWrapper.getFormattedString( nNumberFormatKey, fValue, nLabelColor, bColorChanged );
}
}
catch( uno::Exception& e )
{
ASSERT_EXCEPTION( e );
}
}
}
if( aX.isEmpty() )
{
aRet = ExplicitCategoriesProvider::getCategoryByIndex( xCooSys, xChartModel, nPointIndex );
}
else
{
aRet = aX;
}
OUString aSeparator(C2U(" "));
lcl_addText( aRet, aSeparator, aY );
lcl_addText( aRet, aSeparator, aY_First );
lcl_addText( aRet, aSeparator, aY_Min );
lcl_addText( aRet, aSeparator, aY_Max );
lcl_addText( aRet, aSeparator, aY_Last );
lcl_addText( aRet, aSeparator, a_Size );
return aRet;
}
} //end anonymous namespace
rtl::OUString ObjectNameProvider::getName( ObjectType eObjectType, bool bPlural )
{
rtl::OUString aRet;
switch( eObjectType )
{
case OBJECTTYPE_PAGE:
aRet=String(SchResId(STR_OBJECT_PAGE));
break;
case OBJECTTYPE_TITLE:
{
if(bPlural)
aRet=String(SchResId(STR_OBJECT_TITLES));
else
aRet=String(SchResId(STR_OBJECT_TITLE));
}
break;
case OBJECTTYPE_LEGEND:
aRet=String(SchResId(STR_OBJECT_LEGEND));
break;
case OBJECTTYPE_LEGEND_ENTRY:
aRet=String(SchResId(STR_OBJECT_LEGEND_SYMBOL));//@todo change string if we do differenciate symbol and legend entry in future
break;
case OBJECTTYPE_DIAGRAM:
aRet=String(SchResId(STR_OBJECT_DIAGRAM));
break;
case OBJECTTYPE_DIAGRAM_WALL:
aRet=String(SchResId(STR_OBJECT_DIAGRAM_WALL));
break;
case OBJECTTYPE_DIAGRAM_FLOOR:
aRet=String(SchResId(STR_OBJECT_DIAGRAM_FLOOR));
break;
case OBJECTTYPE_AXIS:
{
if(bPlural)
aRet=String(SchResId(STR_OBJECT_AXES));
else
aRet=String(SchResId(STR_OBJECT_AXIS));
}
break;
case OBJECTTYPE_AXIS_UNITLABEL:
aRet=String(SchResId(STR_OBJECT_LABEL));//@todo maybe a more concrete name
break;
case OBJECTTYPE_GRID:
case OBJECTTYPE_SUBGRID: //maybe todo: different names for subgrids
{
if(bPlural)
aRet=String(SchResId(STR_OBJECT_GRIDS));
else
aRet=String(SchResId(STR_OBJECT_GRID));
}
break;
case OBJECTTYPE_DATA_SERIES:
{
if(bPlural)
aRet=String(SchResId(STR_OBJECT_DATASERIES_PLURAL));
else
aRet=String(SchResId(STR_OBJECT_DATASERIES));
}
break;
case OBJECTTYPE_DATA_POINT:
{
if(bPlural)
aRet=String(SchResId(STR_OBJECT_DATAPOINTS));
else
aRet=String(SchResId(STR_OBJECT_DATAPOINT));
}
break;
case OBJECTTYPE_DATA_LABELS:
aRet=String(SchResId(STR_OBJECT_DATALABELS));
break;
case OBJECTTYPE_DATA_LABEL:
aRet=String(SchResId(STR_OBJECT_LABEL));
break;
case OBJECTTYPE_DATA_ERRORS:
aRet=String(SchResId(STR_OBJECT_ERROR_BARS));//@todo? maybe distinguish plural singular
break;
case OBJECTTYPE_DATA_ERRORS_X:
aRet=String(SchResId(STR_OBJECT_ERROR_BARS));//@todo? maybe specialize in future
break;
case OBJECTTYPE_DATA_ERRORS_Y:
aRet=String(SchResId(STR_OBJECT_ERROR_BARS));//@todo? maybe specialize in future
break;
case OBJECTTYPE_DATA_ERRORS_Z:
aRet=String(SchResId(STR_OBJECT_ERROR_BARS));//@todo? maybe specialize in future
break;
case OBJECTTYPE_DATA_AVERAGE_LINE:
aRet=String(SchResId(STR_OBJECT_AVERAGE_LINE));
break;
case OBJECTTYPE_DATA_CURVE:
{
if(bPlural)
aRet=String(SchResId(STR_OBJECT_CURVES));
else
aRet=String(SchResId(STR_OBJECT_CURVE));
}
break;
case OBJECTTYPE_DATA_STOCK_RANGE:
//aRet=String(SchResId());
break;
case OBJECTTYPE_DATA_STOCK_LOSS:
aRet=String(SchResId(STR_OBJECT_STOCK_LOSS));
break;
case OBJECTTYPE_DATA_STOCK_GAIN:
aRet=String(SchResId(STR_OBJECT_STOCK_GAIN));
break;
case OBJECTTYPE_DATA_CURVE_EQUATION:
aRet=String(SchResId(STR_OBJECT_CURVE_EQUATION));
break;
default: //OBJECTTYPE_UNKNOWN
;
}
return aRet;
}
rtl::OUString ObjectNameProvider::getAxisName( const rtl::OUString& rObjectCID
, const uno::Reference< frame::XModel >& xChartModel )
{
rtl::OUString aRet;
Reference< XAxis > xAxis(
ObjectIdentifier::getObjectPropertySet( rObjectCID , xChartModel ), uno::UNO_QUERY );
sal_Int32 nCooSysIndex = 0;
sal_Int32 nDimensionIndex = 0;
sal_Int32 nAxisIndex = 0;
AxisHelper::getIndicesForAxis( xAxis, ChartModelHelper::findDiagram( xChartModel ), nCooSysIndex, nDimensionIndex, nAxisIndex );
switch(nDimensionIndex)
{
case 0://x-axis
if( nAxisIndex == 0 )
aRet=String(SchResId(STR_OBJECT_AXIS_X));
else
aRet=String(SchResId(STR_OBJECT_SECONDARY_X_AXIS));
break;
case 1://y-axis
if( nAxisIndex == 0 )
aRet=String(SchResId(STR_OBJECT_AXIS_Y));
else
aRet=String(SchResId(STR_OBJECT_SECONDARY_Y_AXIS));
break;
case 2://z-axis
aRet=String(SchResId(STR_OBJECT_AXIS_Z));
break;
default://axis
aRet=String(SchResId(STR_OBJECT_AXIS));
break;
}
return aRet;
}
OUString ObjectNameProvider::getTitleNameByType( TitleHelper::eTitleType eType )
{
OUString aRet;
switch(eType)
{
case TitleHelper::MAIN_TITLE:
aRet=String(SchResId(STR_OBJECT_TITLE_MAIN));
break;
case TitleHelper::SUB_TITLE:
aRet=String(SchResId(STR_OBJECT_TITLE_SUB));
break;
case TitleHelper::X_AXIS_TITLE:
aRet=String(SchResId(STR_OBJECT_TITLE_X_AXIS));
break;
case TitleHelper::Y_AXIS_TITLE:
aRet=String(SchResId(STR_OBJECT_TITLE_Y_AXIS));
break;
case TitleHelper::Z_AXIS_TITLE:
aRet=String(SchResId(STR_OBJECT_TITLE_Z_AXIS));
break;
case TitleHelper::SECONDARY_X_AXIS_TITLE:
aRet=String(SchResId(STR_OBJECT_TITLE_SECONDARY_X_AXIS));
break;
case TitleHelper::SECONDARY_Y_AXIS_TITLE:
aRet=String(SchResId(STR_OBJECT_TITLE_SECONDARY_Y_AXIS));
break;
default:
DBG_ERROR("unknown title type");
break;
}
if( aRet.isEmpty() )
aRet=String(SchResId(STR_OBJECT_TITLE));
return aRet;
}
OUString ObjectNameProvider::getTitleName( const OUString& rObjectCID
, const Reference< frame::XModel >& xChartModel )
{
OUString aRet;
Reference< XTitle > xTitle(
ObjectIdentifier::getObjectPropertySet( rObjectCID , xChartModel ), uno::UNO_QUERY );
if( xTitle.is() )
{
TitleHelper::eTitleType eType;
if( TitleHelper::getTitleType( eType, xTitle, xChartModel ) )
aRet = ObjectNameProvider::getTitleNameByType( eType );
}
if( aRet.isEmpty() )
aRet=String(SchResId(STR_OBJECT_TITLE));
return aRet;
}
rtl::OUString ObjectNameProvider::getGridName( const rtl::OUString& rObjectCID
, const uno::Reference< frame::XModel >& xChartModel )
{
rtl::OUString aRet;
sal_Int32 nCooSysIndex = -1;
sal_Int32 nDimensionIndex = -1;
sal_Int32 nAxisIndex = -1;
Reference< XAxis > xAxis( ObjectIdentifier::getAxisForCID( rObjectCID , xChartModel ) );
AxisHelper::getIndicesForAxis( xAxis, ChartModelHelper::findDiagram( xChartModel )
, nCooSysIndex , nDimensionIndex, nAxisIndex );
bool bMainGrid = (ObjectIdentifier::getObjectType( rObjectCID ) == OBJECTTYPE_GRID);
if( bMainGrid )
{
switch(nDimensionIndex)
{
case 0://x-axis
aRet=String(SchResId(STR_OBJECT_GRID_MAJOR_X));
break;
case 1://y-axis
aRet=String(SchResId(STR_OBJECT_GRID_MAJOR_Y));
break;
case 2://z-axis
aRet=String(SchResId(STR_OBJECT_GRID_MAJOR_Z));
break;
default://axis
aRet=String(SchResId(STR_OBJECT_GRID));
break;
}
}
else
{
switch(nDimensionIndex)
{
case 0://x-axis
aRet=String(SchResId(STR_OBJECT_GRID_MINOR_X));
break;
case 1://y-axis
aRet=String(SchResId(STR_OBJECT_GRID_MINOR_Y));
break;
case 2://z-axis
aRet=String(SchResId(STR_OBJECT_GRID_MINOR_Z));
break;
default://axis
aRet=String(SchResId(STR_OBJECT_GRID));
break;
}
}
return aRet;
}
rtl::OUString ObjectNameProvider::getHelpText( const rtl::OUString& rObjectCID, const Reference< chart2::XChartDocument >& xChartDocument, bool bVerbose )
{
return getHelpText( rObjectCID, Reference< frame::XModel >( xChartDocument, uno::UNO_QUERY ), bVerbose );
}
rtl::OUString ObjectNameProvider::getHelpText( const rtl::OUString& rObjectCID, const Reference< frame::XModel >& xChartModel, bool bVerbose )
{
rtl::OUString aRet;
ObjectType eObjectType( ObjectIdentifier::getObjectType(rObjectCID) );
if( OBJECTTYPE_AXIS == eObjectType )
{
aRet=ObjectNameProvider::getAxisName( rObjectCID, xChartModel );
}
else if( OBJECTTYPE_GRID == eObjectType
|| OBJECTTYPE_SUBGRID == eObjectType )
{
aRet=ObjectNameProvider::getGridName( rObjectCID, xChartModel );
}
else if( OBJECTTYPE_TITLE == eObjectType )
{
aRet=ObjectNameProvider::getTitleName( rObjectCID, xChartModel );
}
else if( OBJECTTYPE_DATA_SERIES == eObjectType )
{
aRet = lcl_getFullSeriesName( rObjectCID, xChartModel );
}
else if( OBJECTTYPE_DATA_POINT == eObjectType )
{
if( bVerbose )
{
OUString aNewLine(C2U("\n"));
aRet=String(SchResId(STR_TIP_DATAPOINT_INDEX));
aRet+=aNewLine;
aRet+=String(SchResId(STR_TIP_DATASERIES));
aRet+=aNewLine;
aRet+=String(SchResId(STR_TIP_DATAPOINT_VALUES));
}
else
aRet=String(SchResId(STR_TIP_DATAPOINT));
Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xChartModel ) );
Reference< XDataSeries > xSeries( ObjectIdentifier::getDataSeriesForCID( rObjectCID , xChartModel ), uno::UNO_QUERY );
if( xDiagram.is() && xSeries.is() )
{
sal_Int32 nPointIndex( ObjectIdentifier::getParticleID(rObjectCID).toInt32() );
//replace data point index
sal_Int32 nIndex = -1;
OUString aWildcard( C2U("%POINTNUMBER") );
nIndex = aRet.indexOf( aWildcard );
if( nIndex != -1 )
{
aRet = aRet.replaceAt( nIndex, aWildcard.getLength(), OUString::valueOf(nPointIndex+1) );
}
//replace data series index
aWildcard = C2U("%SERIESNUMBER");
nIndex = aRet.indexOf( aWildcard );
if( nIndex != -1 )
{
::std::vector< Reference< chart2::XDataSeries > > aSeriesVector(
DiagramHelper::getDataSeriesFromDiagram( xDiagram ) );
sal_Int32 nSeriesIndex = -1;
for( nSeriesIndex=aSeriesVector.size();nSeriesIndex--;)
{
if( aSeriesVector[nSeriesIndex] == xSeries )
{
break;
}
}
OUString aReplacement( OUString::valueOf(nSeriesIndex+1) );
aRet = aRet.replaceAt( nIndex, aWildcard.getLength(), aReplacement );
}
//replace point values
aWildcard = C2U("%POINTVALUES");
nIndex = aRet.indexOf( aWildcard );
if( nIndex != -1 )
aRet = aRet.replaceAt( nIndex, aWildcard.getLength(), lcl_getDataPointValueText(
xSeries,nPointIndex, DataSeriesHelper::getCoordinateSystemOfSeries(xSeries, xDiagram), xChartModel ) );
//replace series name
aWildcard = C2U("%SERIESNAME");
nIndex = aRet.indexOf( aWildcard );
if( nIndex != -1 )
aRet = aRet.replaceAt( nIndex, aWildcard.getLength(), lcl_getDataSeriesName( rObjectCID, xChartModel ) );
}
}
/*
else if( OBJECTTYPE_DIAGRAM == eObjectType )
{
//todo different names for different diagram types ???
//or different names for series of diferent charttypes
}
*/
else if( OBJECTTYPE_DATA_CURVE == eObjectType )
{
if( bVerbose )
{
aRet = String( SchResId( STR_OBJECT_CURVE_WITH_PARAMETERS ));
Reference< chart2::XDataSeries > xSeries( ObjectIdentifier::getDataSeriesForCID( rObjectCID , xChartModel ));
Reference< chart2::XRegressionCurveContainer > xCurveCnt( xSeries, uno::UNO_QUERY );
if( xCurveCnt.is())
{
Reference< chart2::XRegressionCurve > xCurve( RegressionCurveHelper::getFirstCurveNotMeanValueLine( xCurveCnt ));
if( xCurve.is())
{
try
{
Reference< chart2::XRegressionCurveCalculator > xCalculator( xCurve->getCalculator(), uno::UNO_QUERY_THROW );
RegressionCurveHelper::initializeCurveCalculator( xCalculator, xSeries, xChartModel );
// replace formula
sal_Int32 nIndex = -1;
OUString aWildcard( C2U("%FORMULA") );
nIndex = aRet.indexOf( aWildcard );
if( nIndex != -1 )
aRet = aRet.replaceAt( nIndex, aWildcard.getLength(), xCalculator->getRepresentation());
// replace r^2
aWildcard = C2U("%RSQUARED");
nIndex = aRet.indexOf( aWildcard );
if( nIndex != -1 )
{
sal_Unicode aDecimalSep( '.' );
//@todo: enable this code when a localized decimal
//separator is also available for the formula
// SvtSysLocale aSysLocale;
// OUString aSep( aSysLocale.GetLocaleData().getNumDecimalSep());
// if( aSep.getLength() == 1 )
// aDecimalSep = aSep.toChar();
double fR( xCalculator->getCorrelationCoefficient());
aRet = aRet.replaceAt(
nIndex, aWildcard.getLength(),
::rtl::math::doubleToUString(
fR*fR, rtl_math_StringFormat_G, 4, aDecimalSep, true ));
}
}
catch( const uno::Exception & ex )
{
ASSERT_EXCEPTION( ex );
}
}
}
}
else
{
// non-verbose
aRet = ObjectNameProvider::getName( eObjectType, false );
}
}
else if( OBJECTTYPE_DATA_AVERAGE_LINE == eObjectType )
{
if( bVerbose )
{
aRet = String( SchResId( STR_OBJECT_AVERAGE_LINE_WITH_PARAMETERS ));
Reference< chart2::XDataSeries > xSeries( ObjectIdentifier::getDataSeriesForCID( rObjectCID , xChartModel ));
Reference< chart2::XRegressionCurveContainer > xCurveCnt( xSeries, uno::UNO_QUERY );
if( xCurveCnt.is())
{
Reference< chart2::XRegressionCurve > xCurve( RegressionCurveHelper::getMeanValueLine( xCurveCnt ));
if( xCurve.is())
{
try
{
Reference< chart2::XRegressionCurveCalculator > xCalculator( xCurve->getCalculator(), uno::UNO_QUERY_THROW );
RegressionCurveHelper::initializeCurveCalculator( xCalculator, xSeries, xChartModel );
sal_Unicode aDecimalSep( '.' );
// replace average value
// SvtSysLocale aSysLocale;
// OUString aSep( aSysLocale.GetLocaleData().getNumDecimalSep());
// if( aSep.getLength() == 1 )
// aDecimalSep = aSep.toChar();
sal_Int32 nIndex = -1;
OUString aWildcard( C2U("%AVERAGE_VALUE") );
nIndex = aRet.indexOf( aWildcard );
// as the curve is constant, the value at any x-value is ok
if( nIndex != -1 )
{
const double fMeanValue( xCalculator->getCurveValue( 0.0 ));
aRet = aRet.replaceAt(
nIndex, aWildcard.getLength(),
::rtl::math::doubleToUString(
fMeanValue, rtl_math_StringFormat_G, 4, aDecimalSep, true ));
}
// replace standard deviation
aWildcard = C2U("%STD_DEVIATION");
nIndex = aRet.indexOf( aWildcard );
if( nIndex != -1 )
{
const double fStdDev( xCalculator->getCorrelationCoefficient());
aRet = aRet.replaceAt(
nIndex, aWildcard.getLength(),
::rtl::math::doubleToUString(
fStdDev, rtl_math_StringFormat_G, 4, aDecimalSep, true ));
}
}
catch( const uno::Exception & ex )
{
ASSERT_EXCEPTION( ex );
}
}
}
}
else
{
// non-verbose
aRet = ObjectNameProvider::getName( eObjectType, false );
}
}
else
{
aRet = ObjectNameProvider::getName( eObjectType, false );
}
return aRet;
}
rtl::OUString ObjectNameProvider::getSelectedObjectText( const rtl::OUString & rObjectCID, const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartDocument >& xChartDocument )
{
rtl::OUString aRet;
ObjectType eObjectType( ObjectIdentifier::getObjectType(rObjectCID) );
Reference< frame::XModel > xChartModel( xChartDocument, uno::UNO_QUERY );
if( OBJECTTYPE_DATA_POINT == eObjectType )
{
aRet = String( SchResId( STR_STATUS_DATAPOINT_MARKED ));
Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xChartModel ) );
Reference< XDataSeries > xSeries( ObjectIdentifier::getDataSeriesForCID( rObjectCID , xChartModel ), uno::UNO_QUERY );
if( xDiagram.is() && xSeries.is() )
{
sal_Int32 nPointIndex( ObjectIdentifier::getParticleID(rObjectCID).toInt32() );
// replace data point index
replaceParamterInString( aRet, C2U("%POINTNUMBER"), OUString::valueOf( nPointIndex + 1 ));
// replace data series index
{
::std::vector< Reference< chart2::XDataSeries > > aSeriesVector(
DiagramHelper::getDataSeriesFromDiagram( xDiagram ) );
sal_Int32 nSeriesIndex = -1;
for( nSeriesIndex=aSeriesVector.size();nSeriesIndex--;)
{
if( aSeriesVector[nSeriesIndex] == xSeries )
break;
}
replaceParamterInString( aRet, C2U("%SERIESNUMBER"), OUString::valueOf( nSeriesIndex + 1 ) );
}
// replace point value
replaceParamterInString( aRet, C2U("%POINTVALUES"), lcl_getDataPointValueText(
xSeries, nPointIndex, DataSeriesHelper::getCoordinateSystemOfSeries(xSeries, xDiagram), xChartModel ) );
}
}
else
{
// use the verbose text including the formula for trend lines
const bool bVerbose( OBJECTTYPE_DATA_CURVE == eObjectType || OBJECTTYPE_DATA_AVERAGE_LINE == eObjectType );
const OUString aHelpText( getHelpText( rObjectCID, xChartModel, bVerbose ));
if( !aHelpText.isEmpty() )
{
aRet = String( SchResId( STR_STATUS_OBJECT_MARKED ));
replaceParamterInString( aRet, C2U("%OBJECTNAME"), aHelpText );
}
}
return aRet;
}
rtl::OUString ObjectNameProvider::getNameForCID(
const rtl::OUString& rObjectCID,
const uno::Reference< chart2::XChartDocument >& xChartDocument )
{
ObjectType eType( ObjectIdentifier::getObjectType( rObjectCID ));
Reference< frame::XModel > xModel( xChartDocument, uno::UNO_QUERY );
switch( eType )
{
case OBJECTTYPE_AXIS:
return getAxisName( rObjectCID, xModel );
case OBJECTTYPE_TITLE:
return getTitleName( rObjectCID, xModel );
case OBJECTTYPE_GRID:
case OBJECTTYPE_SUBGRID:
return getGridName( rObjectCID, xModel );
case OBJECTTYPE_DATA_SERIES:
return lcl_getFullSeriesName( rObjectCID, xModel );
//case OBJECTTYPE_LEGEND_ENTRY:
case OBJECTTYPE_DATA_POINT:
case OBJECTTYPE_DATA_LABELS:
case OBJECTTYPE_DATA_LABEL:
case OBJECTTYPE_DATA_ERRORS:
case OBJECTTYPE_DATA_ERRORS_X:
case OBJECTTYPE_DATA_ERRORS_Y:
case OBJECTTYPE_DATA_ERRORS_Z:
case OBJECTTYPE_DATA_CURVE:
case OBJECTTYPE_DATA_AVERAGE_LINE:
case OBJECTTYPE_DATA_CURVE_EQUATION:
{
rtl::OUString aRet = lcl_getFullSeriesName( rObjectCID, xModel );
aRet += C2U(" ");
if( eType == OBJECTTYPE_DATA_POINT || eType == OBJECTTYPE_DATA_LABEL )
{
aRet += getName( OBJECTTYPE_DATA_POINT );
sal_Int32 nPointIndex = ObjectIdentifier::getIndexFromParticleOrCID( rObjectCID );
aRet += C2U(" ");
aRet += OUString::valueOf(nPointIndex+1);
if( eType == OBJECTTYPE_DATA_LABEL )
{
aRet += C2U(" ");
aRet += getName( OBJECTTYPE_DATA_LABEL );
}
}
else
aRet += getName( eType );
return aRet;
}
default:
break;
}
return getName( eType );
}
rtl::OUString ObjectNameProvider::getName_ObjectForSeries(
ObjectType eObjectType,
const rtl::OUString& rSeriesCID,
const uno::Reference< chart2::XChartDocument >& xChartDocument )
{
uno::Reference< frame::XModel> xChartModel( xChartDocument, uno::UNO_QUERY );
Reference< XDataSeries > xSeries( ObjectIdentifier::getDataSeriesForCID( rSeriesCID , xChartModel ), uno::UNO_QUERY );
if( xSeries.is() )
{
OUString aRet = String(SchResId(STR_OBJECT_FOR_SERIES));
replaceParamterInString( aRet, C2U("%OBJECTNAME"), getName( eObjectType, false /*bPlural*/ ) );
replaceParamterInString( aRet, C2U("%SERIESNAME"), lcl_getDataSeriesName( rSeriesCID, xChartModel ) );
return aRet;
}
else
return ObjectNameProvider::getName_ObjectForAllSeries( eObjectType );
}
rtl::OUString ObjectNameProvider::getName_ObjectForAllSeries( ObjectType eObjectType )
{
OUString aRet = String(SchResId(STR_OBJECT_FOR_ALL_SERIES));
replaceParamterInString( aRet, C2U("%OBJECTNAME"), getName( eObjectType, true /*bPlural*/ ) );
return aRet;
}
//.............................................................................
} //namespace chart
//.............................................................................