Files
libreoffice/chart2/source/controller/dialogs/ObjectNameProvider.cxx
Release Engineers 44569a657c CWS-TOOLING: integrate CWS bubblechart
2009-06-17 08:41:14 +0200 hde  r273051 : i101635: added new charttype bubble
2009-06-17 08:39:37 +0200 hde  r273050 : i101635: created new testcase tCreateNewBubbleChart
2009-06-17 08:38:07 +0200 hde  r273049 : i101635: created new testcase tCreateNewBubbleChart
2009-06-15 15:22:32 +0200 hde  r272991 : 101635
2009-06-11 12:44:01 +0200 iha  r272864 : rebase to dev300m50
2009-06-10 23:27:54 +0200 iha  r272841 : CWS-TOOLING: rebase CWS bubblechart to trunk@272827 (milestone: DEV300:m50)
2009-06-04 18:07:35 +0200 iha  r272649 : #i64689# Bubble Chart
2009-06-04 17:26:44 +0200 iha  r272647 : #i64689# Bubble Chart
2009-06-04 11:24:25 +0200 iha  r272618 : #i64689# add more spacing between bubbles and data labels
2009-05-26 18:05:23 +0200 ufi  r272314 : i101637
2009-04-22 14:37:50 +0200 iha  r271115 : #i64689# bubble chart
2009-04-21 17:52:23 +0200 iha  r271052 : #i64689# bubble chart
2009-04-21 17:50:48 +0200 iha  r271051 : #i76728# type icon for xy chart
2009-04-21 17:25:52 +0200 iha  r271049 : #i76728# type icon for xy chart
2009-04-09 11:18:09 +0200 iha  r270685 : #i100977# autoscaling works not correct if missing values should be treated as zero
2009-04-08 16:39:43 +0200 iha  r270656 : #i64689# bubble chart - missing value treatment
2009-04-08 15:13:25 +0200 iha  r270655 : #i64689# bubble chart - remove unused code
2009-04-08 15:12:19 +0200 iha  r270653 : #i64689# bubble chart - determine sereis length correctly on export
2009-04-08 14:22:43 +0200 iha  r270650 : #i64689# bubble chart - remove unused code
2009-04-08 14:12:09 +0200 iha  r270646 : #i64689# bubble chart - export domains even if no main sequence was found
2009-04-08 14:11:07 +0200 iha  r270645 : #i64689# bubble chart - don't replace missing size values with 1.0
2009-04-07 16:20:22 +0200 iha  r270602 : #i64689# bubble chart - do not offer percent values for data label display for xy and bubble chart
2009-04-07 16:17:42 +0200 iha  r270601 : remove superfluous code
2009-04-06 16:39:32 +0200 iha  r270569 : #i64689# bubble chart -correct automatic numberformat detection for axis, data table and data label + transport data label numberformat during copy paste in addition to axis numberformat
2009-04-02 17:33:33 +0200 iha  r270427 : use input string for formatting in data table during edit
2009-04-02 16:00:29 +0200 iha  r270413 : #i64689# bubble chart - when creating a new series within the data table give it the same number format as the former series, thus the new bubble size values can be edited with the same format immidiately
2009-04-02 11:25:33 +0200 iha  r270385 : #i64689# bubble chart -correct automatic numberformat detection for axis, data table and data label + transport data label numberformat during copy paste in addition to axis numberformat
2009-04-01 11:32:03 +0200 iha  r270312 : #i64689# bubble chart - add further parameter for view creation
2009-03-31 17:52:08 +0200 iha  r270291 : #i64689# bubble chart - scale bubble size with diagram size
2009-03-31 13:38:13 +0200 iha  r270278 : #i64689# bubble chart - wrong size for small values < 1
2009-03-27 19:11:07 +0100 iha  r270169 : #i64689# bubble chart
2009-03-27 19:07:11 +0100 iha  r270168 : #i64689# bubble chart - remove unused code
2009-03-27 18:33:57 +0100 iha  r270167 : #i64689# bubble chart - create no shape for invalid sizes
2009-03-27 15:18:21 +0100 iha  r270157 : #i76728# type icon for xy chart
2009-03-27 14:34:38 +0100 iha  r270156 : #i64689# bubble chart - correct scaling
2009-03-27 14:27:27 +0100 iha  r270155 : #i64689# bubble chart - images
2009-03-27 14:25:45 +0100 iha  r270154 : #i64689# bubble chart - images
2009-03-27 11:38:57 +0100 iha  r270142 : #i64689# bubble chart - values-size is the main series
2009-03-27 11:30:20 +0100 iha  r270140 : #i64689# correct order of sequences after load thus switching charttypes afterwards produces expected results now
2009-03-26 10:22:55 +0100 iha  r270056 : #i64689# bubble chart
2009-03-24 17:45:15 +0100 iha  r269984 : #i64689# bubble chart - user properties from points (not only from the series)
2009-03-24 15:10:57 +0100 dr  r269954 : #i64989# export bubble charts to xls
2009-03-24 14:55:29 +0100 dr  r269952 : #i64989# import bubble charts from xls
2009-03-24 14:54:46 +0100 dr  r269950 : #i64989# import bubble charts from ooxml
2009-03-23 18:59:08 +0100 iha  r269895 : further cleanups possible with new member m_aGlobalSeriesImportInfo
2009-03-23 16:54:04 +0100 iha  r269886 : #i64689# bubble chart - a single sequence must be interpreted as sizes because of ODF specification
2009-03-23 16:50:43 +0100 iha  r269885 : #i64689# save&load bubble chart
2009-03-20 19:30:29 +0100 iha  r269826 : CWS-TOOLING: rebase CWS bubblechart to trunk@269781 (milestone: DEV300:m44)
2009-03-19 11:30:33 +0100 iha  r269732 : #i64689# rename SchXMLCategoriesDomainContext to SchXMLCategoriesContext avoid confusion with domains
2009-03-18 17:11:13 +0100 iha  r269693 : #i64689# add charttype bubble
2009-03-18 17:09:22 +0100 iha  r269692 : #i64689# remove unused code
2009-03-13 12:18:26 +0100 iha  r269467 : #i64689# corrected lineends
2009-03-12 11:25:14 +0100 iha  r269376 : #i64689# bubble chart (part 1)
2009-07-02 19:17:43 +00:00

768 lines
29 KiB
C++

/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: ObjectNameProvider.cxx,v $
* $Revision: 1.9 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 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 "chartview/NumberFormatterWrapper.hxx"
#include "RegressionCurveHelper.hxx"
#include <rtl/math.hxx>
#include <tools/debug.hxx>
#include <tools/string.hxx>
// #include <svtools/syslocale.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;
}
void lcl_addText( OUString& rOut, const OUString& rSeparator, const OUString& rNext )
{
if( rOut.getLength() && rNext.getLength() )
rOut+=rSeparator;
if( rNext.getLength() )
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.getLength() == 0 )
{
rtl::OUString aCategory = ::rtl::OUString( String(SchResId(STR_TIP_CATEGORY_VALUE)));
replaceParamterInString( aCategory
, C2U("%CATEGORYVALUE")
, ExplicitCategoriesProvider::getCategoryByIndex( xCooSys, nPointIndex )
);
aRet = aCategory;
}
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_INDICATOR));//@todo? maybe distinguish plural singular
break;
case OBJECTTYPE_DATA_ERRORS_X:
aRet=String(SchResId(STR_OBJECT_ERROR_INDICATOR));//@todo? maybe specialize in future
break;
case OBJECTTYPE_DATA_ERRORS_Y:
aRet=String(SchResId(STR_OBJECT_ERROR_INDICATOR));//@todo? maybe specialize in future
break;
case OBJECTTYPE_DATA_ERRORS_Z:
aRet=String(SchResId(STR_OBJECT_ERROR_INDICATOR));//@todo? maybe specialize in future
break;
case OBJECTTYPE_DATA_AVERAGE_LINE:
aRet=String(SchResId(STR_OBJECT_AVERAGE_LINE));
break;
case OBJECTTYPE_DATA_CURVE:
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;
}
//static
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 nDimensionIndex = AxisHelper::getDimensionIndexOfAxis( xAxis, ChartModelHelper::findDiagram( xChartModel ) );
switch(nDimensionIndex)
{
case 0://x-axis
aRet=String(SchResId(STR_OBJECT_AXIS_X));
break;
case 1://y-axis
aRet=String(SchResId(STR_OBJECT_AXIS_Y));
break;
case 2://z-axis
aRet=String(SchResId(STR_OBJECT_AXIS_Z));
break;
default://axis
aRet=String(SchResId(STR_OBJECT_AXIS));
break;
}
return aRet;
}
//static
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 ) )
{
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.getLength() )
aRet=String(SchResId(STR_OBJECT_TITLE));
return aRet;
}
//static
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=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 ) );
}
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;
}
// static
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.getLength())
{
aRet = String( SchResId( STR_STATUS_OBJECT_MARKED ));
replaceParamterInString( aRet, C2U("%OBJECTNAME"), aHelpText );
}
}
return aRet;
}
// static
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:
return getGridName( rObjectCID, xModel );
default:
break;
}
return getName( eType );
}
//.............................................................................
} //namespace chart
//.............................................................................