Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "ObjectNameProvider.hxx"
21 : #include "ResId.hxx"
22 : #include "Strings.hrc"
23 : #include "macros.hxx"
24 : #include "AxisHelper.hxx"
25 : #include "ChartModelHelper.hxx"
26 : #include "DiagramHelper.hxx"
27 : #include "DataSeriesHelper.hxx"
28 : #include "TitleHelper.hxx"
29 : #include "AxisIndexDefines.hxx"
30 : #include "ExplicitCategoriesProvider.hxx"
31 : #include "CommonConverters.hxx"
32 : #include "NumberFormatterWrapper.hxx"
33 : #include "RegressionCurveHelper.hxx"
34 : #include <rtl/math.hxx>
35 : #include <rtl/ustring.hxx>
36 :
37 : #include <com/sun/star/chart2/XTitle.hpp>
38 : #include <com/sun/star/chart2/XRegressionCurveContainer.hpp>
39 :
40 : namespace chart
41 : {
42 : using namespace ::com::sun::star;
43 : using namespace ::com::sun::star::chart2;
44 : using ::com::sun::star::uno::Reference;
45 : using ::com::sun::star::uno::Sequence;
46 : using ::com::sun::star::uno::Any;
47 :
48 : namespace
49 : {
50 :
51 0 : OUString lcl_getDataSeriesName( const OUString& rObjectCID, const Reference< frame::XModel >& xChartModel )
52 : {
53 0 : OUString aRet;
54 :
55 0 : Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xChartModel ) );
56 0 : Reference< XDataSeries > xSeries( ObjectIdentifier::getDataSeriesForCID( rObjectCID , xChartModel ), uno::UNO_QUERY );
57 0 : if( xDiagram.is() && xSeries.is() )
58 : {
59 0 : Reference< XChartType > xChartType( DiagramHelper::getChartTypeOfSeries( xDiagram, xSeries ) );
60 0 : if( xChartType.is() )
61 : {
62 0 : aRet = ::chart::DataSeriesHelper::getDataSeriesLabel(
63 0 : xSeries, xChartType->getRoleOfSequenceForSeriesLabel() ) ;
64 0 : }
65 : }
66 :
67 0 : return aRet;
68 : }
69 :
70 0 : OUString lcl_getFullSeriesName( const OUString& rObjectCID, const Reference< frame::XModel >& xChartModel )
71 : {
72 0 : OUString aRet(SCH_RESSTR(STR_TIP_DATASERIES));
73 0 : OUString aWildcard( "%SERIESNAME" );
74 0 : sal_Int32 nIndex = aRet.indexOf( aWildcard );
75 0 : if( nIndex != -1 )
76 0 : aRet = aRet.replaceAt( nIndex, aWildcard.getLength(), lcl_getDataSeriesName( rObjectCID, xChartModel ) );
77 0 : return aRet;
78 : }
79 :
80 0 : void lcl_addText( OUString& rOut, const OUString& rSeparator, const OUString& rNext )
81 : {
82 0 : if( !(rOut.isEmpty() || rNext.isEmpty()) )
83 0 : rOut+=rSeparator;
84 0 : if( !rNext.isEmpty() )
85 0 : rOut+=rNext;
86 0 : }
87 :
88 0 : OUString lcl_getDataPointValueText( const Reference< XDataSeries >& xSeries, sal_Int32 nPointIndex,
89 : const Reference< XCoordinateSystem >& xCooSys,
90 : const Reference< frame::XModel >& xChartModel )
91 : {
92 :
93 0 : OUString aRet;
94 :
95 : Reference<data::XDataSource> xDataSource(
96 0 : uno::Reference<data::XDataSource>( xSeries, uno::UNO_QUERY ) );
97 0 : if(!xDataSource.is())
98 0 : return aRet;
99 :
100 0 : Sequence< Reference< data::XLabeledDataSequence > > aDataSequences( xDataSource->getDataSequences() );
101 :
102 0 : OUString aX, aY, aY_Min, aY_Max, aY_First, aY_Last, a_Size;
103 0 : double fValue = 0;
104 :
105 0 : uno::Reference< util::XNumberFormatsSupplier > xNumberFormatsSupplier( xChartModel, uno::UNO_QUERY );
106 0 : NumberFormatterWrapper aNumberFormatterWrapper( xNumberFormatsSupplier );
107 0 : sal_Int32 nLabelColor = 0;//dummy
108 : bool bColorChanged;//dummy
109 :
110 0 : for(sal_Int32 nN = aDataSequences.getLength();nN--;)
111 : {
112 0 : uno::Reference<data::XDataSequence> xDataSequence( aDataSequences[nN]->getValues());
113 0 : if( !xDataSequence.is() )
114 0 : continue;
115 0 : Sequence< Any > aData( xDataSequence->getData() );
116 0 : if( nPointIndex >= aData.getLength() )
117 0 : continue;
118 0 : uno::Reference<beans::XPropertySet> xProp(xDataSequence, uno::UNO_QUERY );
119 0 : if( xProp.is())
120 : {
121 : try
122 : {
123 0 : uno::Any aARole = xProp->getPropertyValue( "Role" );
124 0 : OUString aRole;
125 0 : aARole >>= aRole;
126 :
127 0 : if( aRole == "values-x" )
128 : {
129 0 : aData[nPointIndex]>>= fValue;
130 0 : sal_Int32 nNumberFormatKey = xDataSequence->getNumberFormatKeyByIndex( nPointIndex );
131 0 : aX = aNumberFormatterWrapper.getFormattedString( nNumberFormatKey, fValue, nLabelColor, bColorChanged );
132 : }
133 0 : else if( aRole == "values-y")
134 : {
135 0 : aData[nPointIndex]>>= fValue;
136 0 : sal_Int32 nNumberFormatKey = xDataSequence->getNumberFormatKeyByIndex( nPointIndex );
137 0 : aY = aNumberFormatterWrapper.getFormattedString( nNumberFormatKey, fValue, nLabelColor, bColorChanged );
138 : }
139 0 : else if( aRole == "values-first" )
140 : {
141 0 : aData[nPointIndex]>>= fValue;
142 0 : sal_Int32 nNumberFormatKey = xDataSequence->getNumberFormatKeyByIndex( nPointIndex );
143 0 : aY_First = aNumberFormatterWrapper.getFormattedString( nNumberFormatKey, fValue, nLabelColor, bColorChanged );
144 : }
145 0 : else if( aRole == "values-min" )
146 : {
147 0 : aData[nPointIndex]>>= fValue;
148 0 : sal_Int32 nNumberFormatKey = xDataSequence->getNumberFormatKeyByIndex( nPointIndex );
149 0 : aY_Min = aNumberFormatterWrapper.getFormattedString( nNumberFormatKey, fValue, nLabelColor, bColorChanged );
150 : }
151 0 : else if( aRole == "values-max" )
152 : {
153 0 : aData[nPointIndex]>>= fValue;
154 0 : sal_Int32 nNumberFormatKey = xDataSequence->getNumberFormatKeyByIndex( nPointIndex );
155 0 : aY_Max = aNumberFormatterWrapper.getFormattedString( nNumberFormatKey, fValue, nLabelColor, bColorChanged );
156 : }
157 0 : else if( aRole == "values-last" )
158 : {
159 0 : aData[nPointIndex]>>= fValue;
160 0 : sal_Int32 nNumberFormatKey = xDataSequence->getNumberFormatKeyByIndex( nPointIndex );
161 0 : aY_Last = aNumberFormatterWrapper.getFormattedString( nNumberFormatKey, fValue, nLabelColor, bColorChanged );
162 : }
163 0 : else if( aRole == "values-size" )
164 : {
165 0 : aData[nPointIndex]>>= fValue;
166 0 : sal_Int32 nNumberFormatKey = xDataSequence->getNumberFormatKeyByIndex( nPointIndex );
167 0 : a_Size = aNumberFormatterWrapper.getFormattedString( nNumberFormatKey, fValue, nLabelColor, bColorChanged );
168 0 : }
169 : }
170 0 : catch( const uno::Exception& e )
171 : {
172 : ASSERT_EXCEPTION( e );
173 : }
174 : }
175 0 : }
176 :
177 0 : if( aX.isEmpty() )
178 : {
179 0 : ChartModel* pModel = dynamic_cast<ChartModel*>(xChartModel.get());
180 0 : aRet = ExplicitCategoriesProvider::getCategoryByIndex( xCooSys, *pModel, nPointIndex );
181 : }
182 : else
183 : {
184 0 : aRet = aX;
185 : }
186 :
187 0 : OUString aSeparator( " " );
188 :
189 0 : lcl_addText( aRet, aSeparator, aY );
190 0 : lcl_addText( aRet, aSeparator, aY_First );
191 0 : lcl_addText( aRet, aSeparator, aY_Min );
192 0 : lcl_addText( aRet, aSeparator, aY_Max );
193 0 : lcl_addText( aRet, aSeparator, aY_Last );
194 0 : lcl_addText( aRet, aSeparator, a_Size );
195 :
196 0 : return aRet;
197 : }
198 :
199 : } //end anonymous namespace
200 :
201 0 : OUString ObjectNameProvider::getName( ObjectType eObjectType, bool bPlural )
202 : {
203 0 : OUString aRet;
204 0 : switch( eObjectType )
205 : {
206 : case OBJECTTYPE_PAGE:
207 0 : aRet=SCH_RESSTR(STR_OBJECT_PAGE);
208 0 : break;
209 : case OBJECTTYPE_TITLE:
210 : {
211 0 : if(bPlural)
212 0 : aRet=SCH_RESSTR(STR_OBJECT_TITLES);
213 : else
214 0 : aRet=SCH_RESSTR(STR_OBJECT_TITLE);
215 : }
216 0 : break;
217 : case OBJECTTYPE_LEGEND:
218 0 : aRet=SCH_RESSTR(STR_OBJECT_LEGEND);
219 0 : break;
220 : case OBJECTTYPE_LEGEND_ENTRY:
221 0 : aRet=SCH_RESSTR(STR_OBJECT_LEGEND_SYMBOL);//@todo change string if we do differenciate symbol and legend entry in future
222 0 : break;
223 : case OBJECTTYPE_DIAGRAM:
224 0 : aRet=SCH_RESSTR(STR_OBJECT_DIAGRAM);
225 0 : break;
226 : case OBJECTTYPE_DIAGRAM_WALL:
227 0 : aRet=SCH_RESSTR(STR_OBJECT_DIAGRAM_WALL);
228 0 : break;
229 : case OBJECTTYPE_DIAGRAM_FLOOR:
230 0 : aRet=SCH_RESSTR(STR_OBJECT_DIAGRAM_FLOOR);
231 0 : break;
232 : case OBJECTTYPE_AXIS:
233 : {
234 0 : if(bPlural)
235 0 : aRet=SCH_RESSTR(STR_OBJECT_AXES);
236 : else
237 0 : aRet=SCH_RESSTR(STR_OBJECT_AXIS);
238 : }
239 0 : break;
240 : case OBJECTTYPE_AXIS_UNITLABEL:
241 0 : aRet=SCH_RESSTR(STR_OBJECT_LABEL);//@todo maybe a more concrete name
242 0 : break;
243 : case OBJECTTYPE_GRID:
244 : case OBJECTTYPE_SUBGRID: //maybe todo: different names for subgrids
245 : {
246 0 : if(bPlural)
247 0 : aRet=SCH_RESSTR(STR_OBJECT_GRIDS);
248 : else
249 0 : aRet=SCH_RESSTR(STR_OBJECT_GRID);
250 : }
251 0 : break;
252 : case OBJECTTYPE_DATA_SERIES:
253 : {
254 0 : if(bPlural)
255 0 : aRet=SCH_RESSTR(STR_OBJECT_DATASERIES_PLURAL);
256 : else
257 0 : aRet=SCH_RESSTR(STR_OBJECT_DATASERIES);
258 : }
259 0 : break;
260 : case OBJECTTYPE_DATA_POINT:
261 : {
262 0 : if(bPlural)
263 0 : aRet=SCH_RESSTR(STR_OBJECT_DATAPOINTS);
264 : else
265 0 : aRet=SCH_RESSTR(STR_OBJECT_DATAPOINT);
266 : }
267 0 : break;
268 : case OBJECTTYPE_DATA_LABELS:
269 0 : aRet=SCH_RESSTR(STR_OBJECT_DATALABELS);
270 0 : break;
271 : case OBJECTTYPE_DATA_LABEL:
272 0 : aRet=SCH_RESSTR(STR_OBJECT_LABEL);
273 0 : break;
274 : case OBJECTTYPE_DATA_ERRORS_X:
275 0 : aRet=SCH_RESSTR(STR_OBJECT_ERROR_BARS_X);
276 0 : break;
277 : case OBJECTTYPE_DATA_ERRORS_Y:
278 0 : aRet=SCH_RESSTR(STR_OBJECT_ERROR_BARS_Y);
279 0 : break;
280 : case OBJECTTYPE_DATA_ERRORS_Z:
281 0 : aRet=SCH_RESSTR(STR_OBJECT_ERROR_BARS_Z);
282 0 : break;
283 : case OBJECTTYPE_DATA_AVERAGE_LINE:
284 0 : aRet=SCH_RESSTR(STR_OBJECT_AVERAGE_LINE);
285 0 : break;
286 : case OBJECTTYPE_DATA_CURVE:
287 : {
288 0 : if(bPlural)
289 0 : aRet=SCH_RESSTR(STR_OBJECT_CURVES);
290 : else
291 0 : aRet=SCH_RESSTR(STR_OBJECT_CURVE);
292 : }
293 0 : break;
294 : case OBJECTTYPE_DATA_STOCK_RANGE:
295 0 : break;
296 : case OBJECTTYPE_DATA_STOCK_LOSS:
297 0 : aRet=SCH_RESSTR(STR_OBJECT_STOCK_LOSS);
298 0 : break;
299 : case OBJECTTYPE_DATA_STOCK_GAIN:
300 0 : aRet=SCH_RESSTR(STR_OBJECT_STOCK_GAIN);
301 0 : break;
302 : case OBJECTTYPE_DATA_CURVE_EQUATION:
303 0 : aRet=SCH_RESSTR(STR_OBJECT_CURVE_EQUATION);
304 0 : break;
305 : default: //OBJECTTYPE_UNKNOWN
306 : ;
307 : }
308 0 : return aRet;
309 : }
310 :
311 0 : OUString ObjectNameProvider::getAxisName( const OUString& rObjectCID
312 : , const uno::Reference< frame::XModel >& xChartModel )
313 : {
314 0 : OUString aRet;
315 :
316 : Reference< XAxis > xAxis(
317 0 : ObjectIdentifier::getObjectPropertySet( rObjectCID , xChartModel ), uno::UNO_QUERY );
318 :
319 0 : sal_Int32 nCooSysIndex = 0;
320 0 : sal_Int32 nDimensionIndex = 0;
321 0 : sal_Int32 nAxisIndex = 0;
322 0 : AxisHelper::getIndicesForAxis( xAxis, ChartModelHelper::findDiagram( xChartModel ), nCooSysIndex, nDimensionIndex, nAxisIndex );
323 :
324 0 : switch(nDimensionIndex)
325 : {
326 : case 0://x-axis
327 0 : if( nAxisIndex == 0 )
328 0 : aRet=SCH_RESSTR(STR_OBJECT_AXIS_X);
329 : else
330 0 : aRet=SCH_RESSTR(STR_OBJECT_SECONDARY_X_AXIS);
331 0 : break;
332 : case 1://y-axis
333 0 : if( nAxisIndex == 0 )
334 0 : aRet=SCH_RESSTR(STR_OBJECT_AXIS_Y);
335 : else
336 0 : aRet=SCH_RESSTR(STR_OBJECT_SECONDARY_Y_AXIS);
337 0 : break;
338 : case 2://z-axis
339 0 : aRet=SCH_RESSTR(STR_OBJECT_AXIS_Z);
340 0 : break;
341 : default://axis
342 0 : aRet=SCH_RESSTR(STR_OBJECT_AXIS);
343 0 : break;
344 : }
345 :
346 0 : return aRet;
347 : }
348 :
349 0 : OUString ObjectNameProvider::getTitleNameByType( TitleHelper::eTitleType eType )
350 : {
351 0 : OUString aRet;
352 :
353 0 : switch(eType)
354 : {
355 : case TitleHelper::MAIN_TITLE:
356 0 : aRet=SCH_RESSTR(STR_OBJECT_TITLE_MAIN);
357 0 : break;
358 : case TitleHelper::SUB_TITLE:
359 0 : aRet=SCH_RESSTR(STR_OBJECT_TITLE_SUB);
360 0 : break;
361 : case TitleHelper::X_AXIS_TITLE:
362 0 : aRet=SCH_RESSTR(STR_OBJECT_TITLE_X_AXIS);
363 0 : break;
364 : case TitleHelper::Y_AXIS_TITLE:
365 0 : aRet=SCH_RESSTR(STR_OBJECT_TITLE_Y_AXIS);
366 0 : break;
367 : case TitleHelper::Z_AXIS_TITLE:
368 0 : aRet=SCH_RESSTR(STR_OBJECT_TITLE_Z_AXIS);
369 0 : break;
370 : case TitleHelper::SECONDARY_X_AXIS_TITLE:
371 0 : aRet=SCH_RESSTR(STR_OBJECT_TITLE_SECONDARY_X_AXIS);
372 0 : break;
373 : case TitleHelper::SECONDARY_Y_AXIS_TITLE:
374 0 : aRet=SCH_RESSTR(STR_OBJECT_TITLE_SECONDARY_Y_AXIS);
375 0 : break;
376 : default:
377 : OSL_FAIL("unknown title type");
378 0 : break;
379 : }
380 :
381 0 : if( aRet.isEmpty() )
382 0 : aRet=SCH_RESSTR(STR_OBJECT_TITLE);
383 :
384 0 : return aRet;
385 : }
386 :
387 0 : OUString ObjectNameProvider::getTitleName( const OUString& rObjectCID
388 : , const Reference< frame::XModel >& xChartModel )
389 : {
390 0 : OUString aRet;
391 :
392 : Reference< XTitle > xTitle(
393 0 : ObjectIdentifier::getObjectPropertySet( rObjectCID , xChartModel ), uno::UNO_QUERY );
394 0 : if( xTitle.is() )
395 : {
396 : TitleHelper::eTitleType eType;
397 0 : if( TitleHelper::getTitleType( eType, xTitle, xChartModel ) )
398 0 : aRet = ObjectNameProvider::getTitleNameByType( eType );
399 : }
400 0 : if( aRet.isEmpty() )
401 0 : aRet=SCH_RESSTR(STR_OBJECT_TITLE);
402 :
403 0 : return aRet;
404 : }
405 :
406 0 : OUString ObjectNameProvider::getGridName( const OUString& rObjectCID
407 : , const uno::Reference< frame::XModel >& xChartModel )
408 : {
409 0 : OUString aRet;
410 :
411 0 : sal_Int32 nCooSysIndex = -1;
412 0 : sal_Int32 nDimensionIndex = -1;
413 0 : sal_Int32 nAxisIndex = -1;
414 0 : Reference< XAxis > xAxis( ObjectIdentifier::getAxisForCID( rObjectCID , xChartModel ) );
415 : AxisHelper::getIndicesForAxis( xAxis, ChartModelHelper::findDiagram( xChartModel )
416 0 : , nCooSysIndex , nDimensionIndex, nAxisIndex );
417 :
418 0 : bool bMainGrid = (ObjectIdentifier::getObjectType( rObjectCID ) == OBJECTTYPE_GRID);
419 :
420 0 : if( bMainGrid )
421 : {
422 0 : switch(nDimensionIndex)
423 : {
424 : case 0://x-axis
425 0 : aRet=SCH_RESSTR(STR_OBJECT_GRID_MAJOR_X);
426 0 : break;
427 : case 1://y-axis
428 0 : aRet=SCH_RESSTR(STR_OBJECT_GRID_MAJOR_Y);
429 0 : break;
430 : case 2://z-axis
431 0 : aRet=SCH_RESSTR(STR_OBJECT_GRID_MAJOR_Z);
432 0 : break;
433 : default://axis
434 0 : aRet=SCH_RESSTR(STR_OBJECT_GRID);
435 0 : break;
436 : }
437 : }
438 : else
439 : {
440 0 : switch(nDimensionIndex)
441 : {
442 : case 0://x-axis
443 0 : aRet=SCH_RESSTR(STR_OBJECT_GRID_MINOR_X);
444 0 : break;
445 : case 1://y-axis
446 0 : aRet=SCH_RESSTR(STR_OBJECT_GRID_MINOR_Y);
447 0 : break;
448 : case 2://z-axis
449 0 : aRet=SCH_RESSTR(STR_OBJECT_GRID_MINOR_Z);
450 0 : break;
451 : default://axis
452 0 : aRet=SCH_RESSTR(STR_OBJECT_GRID);
453 0 : break;
454 : }
455 : }
456 0 : return aRet;
457 : }
458 :
459 0 : OUString ObjectNameProvider::getHelpText( const OUString& rObjectCID, const Reference< chart2::XChartDocument >& xChartDocument, bool bVerbose )
460 : {
461 0 : return getHelpText( rObjectCID, Reference< frame::XModel >( xChartDocument, uno::UNO_QUERY ), bVerbose );
462 : }
463 :
464 0 : OUString ObjectNameProvider::getHelpText( const OUString& rObjectCID, const Reference< frame::XModel >& xChartModel, bool bVerbose )
465 : {
466 0 : OUString aRet;
467 0 : ObjectType eObjectType( ObjectIdentifier::getObjectType(rObjectCID) );
468 0 : if( OBJECTTYPE_AXIS == eObjectType )
469 : {
470 0 : aRet=ObjectNameProvider::getAxisName( rObjectCID, xChartModel );
471 : }
472 0 : else if( OBJECTTYPE_GRID == eObjectType
473 0 : || OBJECTTYPE_SUBGRID == eObjectType )
474 : {
475 0 : aRet=ObjectNameProvider::getGridName( rObjectCID, xChartModel );
476 : }
477 0 : else if( OBJECTTYPE_TITLE == eObjectType )
478 : {
479 0 : aRet=ObjectNameProvider::getTitleName( rObjectCID, xChartModel );
480 : }
481 0 : else if( OBJECTTYPE_DATA_SERIES == eObjectType )
482 : {
483 0 : aRet = lcl_getFullSeriesName( rObjectCID, xChartModel );
484 : }
485 0 : else if( OBJECTTYPE_DATA_POINT == eObjectType )
486 : {
487 0 : if( bVerbose )
488 : {
489 0 : OUString aNewLine( "\n" );
490 :
491 0 : aRet=SCH_RESSTR(STR_TIP_DATAPOINT_INDEX);
492 0 : aRet+=aNewLine;
493 0 : aRet+=SCH_RESSTR(STR_TIP_DATASERIES);
494 0 : aRet+=aNewLine;
495 0 : aRet+=SCH_RESSTR(STR_TIP_DATAPOINT_VALUES);
496 : }
497 : else
498 0 : aRet=SCH_RESSTR(STR_TIP_DATAPOINT);
499 :
500 0 : Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xChartModel ) );
501 0 : Reference< XDataSeries > xSeries( ObjectIdentifier::getDataSeriesForCID( rObjectCID , xChartModel ), uno::UNO_QUERY );
502 0 : if( xDiagram.is() && xSeries.is() )
503 : {
504 0 : sal_Int32 nPointIndex( ObjectIdentifier::getParticleID(rObjectCID).toInt32() );
505 :
506 : //replace data point index
507 0 : OUString aWildcard( "%POINTNUMBER" );
508 0 : sal_Int32 nIndex = aRet.indexOf( aWildcard );
509 0 : if( nIndex != -1 )
510 : {
511 0 : aRet = aRet.replaceAt( nIndex, aWildcard.getLength(), OUString::number(nPointIndex+1) );
512 : }
513 :
514 : //replace data series index
515 0 : aWildcard = "%SERIESNUMBER";
516 0 : nIndex = aRet.indexOf( aWildcard );
517 0 : if( nIndex != -1 )
518 : {
519 : ::std::vector< Reference< chart2::XDataSeries > > aSeriesVector(
520 0 : DiagramHelper::getDataSeriesFromDiagram( xDiagram ) );
521 0 : sal_Int32 nSeriesIndex = -1;
522 0 : for( nSeriesIndex=aSeriesVector.size();nSeriesIndex--;)
523 : {
524 0 : if( aSeriesVector[nSeriesIndex] == xSeries )
525 : {
526 0 : break;
527 : }
528 : }
529 :
530 0 : OUString aReplacement( OUString::number(nSeriesIndex+1) );
531 0 : aRet = aRet.replaceAt( nIndex, aWildcard.getLength(), aReplacement );
532 : }
533 :
534 : //replace point values
535 0 : aWildcard = "%POINTVALUES";
536 0 : nIndex = aRet.indexOf( aWildcard );
537 0 : if( nIndex != -1 )
538 0 : aRet = aRet.replaceAt( nIndex, aWildcard.getLength(), lcl_getDataPointValueText(
539 0 : xSeries,nPointIndex, DataSeriesHelper::getCoordinateSystemOfSeries(xSeries, xDiagram), xChartModel ) );
540 :
541 : //replace series name
542 0 : aWildcard = "%SERIESNAME";
543 0 : nIndex = aRet.indexOf( aWildcard );
544 0 : if( nIndex != -1 )
545 0 : aRet = aRet.replaceAt( nIndex, aWildcard.getLength(), lcl_getDataSeriesName( rObjectCID, xChartModel ) );
546 0 : }
547 : }
548 0 : else if( OBJECTTYPE_DATA_CURVE == eObjectType )
549 : {
550 0 : if( bVerbose )
551 : {
552 0 : aRet = SCH_RESSTR( STR_OBJECT_CURVE_WITH_PARAMETERS );
553 0 : Reference< chart2::XDataSeries > xSeries( ObjectIdentifier::getDataSeriesForCID( rObjectCID , xChartModel ));
554 0 : Reference< chart2::XRegressionCurveContainer > xCurveCnt( xSeries, uno::UNO_QUERY );
555 :
556 0 : if( xCurveCnt.is())
557 : {
558 0 : sal_Int32 nCurveIndex = ObjectIdentifier::getIndexFromParticleOrCID( rObjectCID );
559 0 : Reference< chart2::XRegressionCurve > xCurve( RegressionCurveHelper::getRegressionCurveAtIndex(xCurveCnt, nCurveIndex) );
560 0 : if( xCurve.is())
561 : {
562 : try
563 : {
564 0 : Reference< chart2::XRegressionCurveCalculator > xCalculator( xCurve->getCalculator(), uno::UNO_QUERY_THROW );
565 0 : sal_Int32 aDegree = 2;
566 0 : sal_Int32 aPeriod = 2;
567 0 : sal_Bool aForceIntercept = false;
568 0 : double aInterceptValue = 0.0;
569 0 : uno::Reference< beans::XPropertySet > xProperties( xCurve, uno::UNO_QUERY );
570 0 : if ( xProperties.is())
571 : {
572 0 : xProperties->getPropertyValue( "PolynomialDegree") >>= aDegree;
573 0 : xProperties->getPropertyValue( "MovingAveragePeriod") >>= aPeriod;
574 0 : xProperties->getPropertyValue( "ForceIntercept") >>= aForceIntercept;
575 0 : if (aForceIntercept)
576 0 : xProperties->getPropertyValue( "InterceptValue") >>= aInterceptValue;
577 : }
578 0 : xCalculator->setRegressionProperties(aDegree, aForceIntercept, aInterceptValue, 2);
579 0 : RegressionCurveHelper::initializeCurveCalculator( xCalculator, xSeries, xChartModel );
580 :
581 : // change text for Moving Average
582 0 : OUString aWildcard( "%PERIOD" );
583 0 : sal_Int32 nIndex = xCalculator->getRepresentation().indexOf( aWildcard );
584 0 : if( nIndex != -1 )
585 : { // replace period
586 0 : aRet = xCalculator->getRepresentation();
587 0 : aRet = aRet.replaceAt( nIndex, aWildcard.getLength(), OUString::number(aPeriod) );
588 : }
589 :
590 : // replace formula
591 0 : aWildcard = "%FORMULA";
592 0 : nIndex = aRet.indexOf( aWildcard );
593 0 : if( nIndex != -1 )
594 0 : aRet = aRet.replaceAt( nIndex, aWildcard.getLength(), xCalculator->getRepresentation());
595 :
596 : // replace r^2
597 0 : aWildcard = "%RSQUARED";
598 0 : nIndex = aRet.indexOf( aWildcard );
599 0 : if( nIndex != -1 )
600 : {
601 0 : sal_Unicode aDecimalSep( '.' );
602 0 : double fR( xCalculator->getCorrelationCoefficient());
603 0 : aRet = aRet.replaceAt(
604 : nIndex, aWildcard.getLength(),
605 : ::rtl::math::doubleToUString(
606 0 : fR*fR, rtl_math_StringFormat_G, 4, aDecimalSep, true ));
607 0 : }
608 : }
609 0 : catch( const uno::Exception & ex )
610 : {
611 : ASSERT_EXCEPTION( ex );
612 : }
613 0 : }
614 0 : }
615 : }
616 : else
617 : {
618 0 : Reference< chart2::XDataSeries > xSeries( ObjectIdentifier::getDataSeriesForCID(rObjectCID , xChartModel));
619 0 : Reference< chart2::XRegressionCurveContainer > xCurveCnt( xSeries, uno::UNO_QUERY );
620 0 : aRet += getName(eObjectType, false);
621 :
622 0 : if( xCurveCnt.is())
623 : {
624 0 : sal_Int32 nCurveIndex = ObjectIdentifier::getIndexFromParticleOrCID( rObjectCID );
625 0 : Reference< chart2::XRegressionCurve > xCurve( RegressionCurveHelper::getRegressionCurveAtIndex(xCurveCnt, nCurveIndex) );
626 0 : if( xCurve.is())
627 : {
628 0 : aRet += " (";
629 0 : aRet += RegressionCurveHelper::getRegressionCurveName(xCurve);
630 0 : aRet += " )";
631 0 : }
632 0 : }
633 : }
634 : }
635 0 : else if( OBJECTTYPE_DATA_AVERAGE_LINE == eObjectType )
636 : {
637 0 : if( bVerbose )
638 : {
639 0 : aRet = SCH_RESSTR(STR_OBJECT_AVERAGE_LINE_WITH_PARAMETERS);
640 0 : Reference< chart2::XDataSeries > xSeries( ObjectIdentifier::getDataSeriesForCID( rObjectCID , xChartModel ));
641 0 : Reference< chart2::XRegressionCurveContainer > xCurveCnt( xSeries, uno::UNO_QUERY );
642 0 : if( xCurveCnt.is())
643 : {
644 0 : Reference< chart2::XRegressionCurve > xCurve( RegressionCurveHelper::getMeanValueLine( xCurveCnt ));
645 0 : if( xCurve.is())
646 : {
647 : try
648 : {
649 0 : Reference< chart2::XRegressionCurveCalculator > xCalculator( xCurve->getCalculator(), uno::UNO_QUERY_THROW );
650 0 : RegressionCurveHelper::initializeCurveCalculator( xCalculator, xSeries, xChartModel );
651 :
652 0 : sal_Unicode aDecimalSep( '.' );
653 :
654 0 : OUString aWildcard( "%AVERAGE_VALUE" );
655 0 : sal_Int32 nIndex = aRet.indexOf( aWildcard );
656 : // as the curve is constant, the value at any x-value is ok
657 0 : if( nIndex != -1 )
658 : {
659 0 : const double fMeanValue( xCalculator->getCurveValue( 0.0 ));
660 0 : aRet = aRet.replaceAt(
661 : nIndex, aWildcard.getLength(),
662 : ::rtl::math::doubleToUString(
663 0 : fMeanValue, rtl_math_StringFormat_G, 4, aDecimalSep, true ));
664 : }
665 :
666 : // replace standard deviation
667 0 : aWildcard = "%STD_DEVIATION";
668 0 : nIndex = aRet.indexOf( aWildcard );
669 0 : if( nIndex != -1 )
670 : {
671 0 : const double fStdDev( xCalculator->getCorrelationCoefficient());
672 0 : aRet = aRet.replaceAt(
673 : nIndex, aWildcard.getLength(),
674 : ::rtl::math::doubleToUString(
675 0 : fStdDev, rtl_math_StringFormat_G, 4, aDecimalSep, true ));
676 0 : }
677 : }
678 0 : catch( const uno::Exception & ex )
679 : {
680 : ASSERT_EXCEPTION( ex );
681 : }
682 0 : }
683 0 : }
684 : }
685 : else
686 : {
687 : // non-verbose
688 0 : aRet = ObjectNameProvider::getName( eObjectType, false );
689 : }
690 : }
691 : else
692 : {
693 0 : aRet = ObjectNameProvider::getName( eObjectType, false );
694 : }
695 0 : return aRet;
696 : }
697 :
698 0 : OUString ObjectNameProvider::getSelectedObjectText( const OUString & rObjectCID, const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartDocument >& xChartDocument )
699 : {
700 0 : OUString aRet;
701 0 : ObjectType eObjectType( ObjectIdentifier::getObjectType(rObjectCID) );
702 0 : Reference< frame::XModel > xChartModel( xChartDocument, uno::UNO_QUERY );
703 :
704 0 : if( OBJECTTYPE_DATA_POINT == eObjectType )
705 : {
706 0 : aRet = SCH_RESSTR( STR_STATUS_DATAPOINT_MARKED );
707 :
708 0 : Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xChartModel ) );
709 0 : Reference< XDataSeries > xSeries( ObjectIdentifier::getDataSeriesForCID( rObjectCID , xChartModel ), uno::UNO_QUERY );
710 0 : if( xDiagram.is() && xSeries.is() )
711 : {
712 0 : sal_Int32 nPointIndex( ObjectIdentifier::getParticleID(rObjectCID).toInt32() );
713 :
714 : // replace data point index
715 0 : replaceParamterInString( aRet, "%POINTNUMBER", OUString::number( nPointIndex + 1 ));
716 :
717 : // replace data series index
718 : {
719 : ::std::vector< Reference< chart2::XDataSeries > > aSeriesVector(
720 0 : DiagramHelper::getDataSeriesFromDiagram( xDiagram ) );
721 0 : sal_Int32 nSeriesIndex = -1;
722 0 : for( nSeriesIndex=aSeriesVector.size();nSeriesIndex--;)
723 : {
724 0 : if( aSeriesVector[nSeriesIndex] == xSeries )
725 0 : break;
726 : }
727 0 : replaceParamterInString( aRet, "%SERIESNUMBER", OUString::number( nSeriesIndex + 1 ) );
728 : }
729 :
730 : // replace point value
731 : replaceParamterInString( aRet, "%POINTVALUES", lcl_getDataPointValueText(
732 0 : xSeries, nPointIndex, DataSeriesHelper::getCoordinateSystemOfSeries(xSeries, xDiagram), xChartModel ) );
733 0 : }
734 : }
735 : else
736 : {
737 : // use the verbose text including the formula for trend lines
738 0 : const bool bVerbose( OBJECTTYPE_DATA_CURVE == eObjectType || OBJECTTYPE_DATA_AVERAGE_LINE == eObjectType );
739 0 : const OUString aHelpText( getHelpText( rObjectCID, xChartModel, bVerbose ));
740 0 : if( !aHelpText.isEmpty())
741 : {
742 0 : aRet = SCH_RESSTR( STR_STATUS_OBJECT_MARKED );
743 0 : replaceParamterInString( aRet, "%OBJECTNAME", aHelpText );
744 0 : }
745 : }
746 :
747 0 : return aRet;
748 : }
749 :
750 0 : OUString ObjectNameProvider::getNameForCID(
751 : const OUString& rObjectCID,
752 : const uno::Reference< chart2::XChartDocument >& xChartDocument )
753 : {
754 0 : ObjectType eType( ObjectIdentifier::getObjectType( rObjectCID ));
755 0 : Reference< frame::XModel > xModel( xChartDocument, uno::UNO_QUERY );
756 :
757 0 : switch( eType )
758 : {
759 : case OBJECTTYPE_AXIS:
760 0 : return getAxisName( rObjectCID, xModel );
761 : case OBJECTTYPE_TITLE:
762 0 : return getTitleName( rObjectCID, xModel );
763 : case OBJECTTYPE_GRID:
764 : case OBJECTTYPE_SUBGRID:
765 0 : return getGridName( rObjectCID, xModel );
766 : case OBJECTTYPE_DATA_SERIES:
767 0 : return lcl_getFullSeriesName( rObjectCID, xModel );
768 : case OBJECTTYPE_DATA_POINT:
769 : case OBJECTTYPE_DATA_LABELS:
770 : case OBJECTTYPE_DATA_LABEL:
771 : case OBJECTTYPE_DATA_ERRORS_X:
772 : case OBJECTTYPE_DATA_ERRORS_Y:
773 : case OBJECTTYPE_DATA_ERRORS_Z:
774 : case OBJECTTYPE_DATA_AVERAGE_LINE:
775 : case OBJECTTYPE_DATA_CURVE:
776 : case OBJECTTYPE_DATA_CURVE_EQUATION:
777 : {
778 0 : OUString aRet = lcl_getFullSeriesName( rObjectCID, xModel );
779 0 : aRet += " ";
780 0 : if( eType == OBJECTTYPE_DATA_POINT || eType == OBJECTTYPE_DATA_LABEL )
781 : {
782 0 : aRet += getName( OBJECTTYPE_DATA_POINT );
783 0 : sal_Int32 nPointIndex = ObjectIdentifier::getIndexFromParticleOrCID( rObjectCID );
784 0 : aRet += " ";
785 0 : aRet += OUString::number(nPointIndex+1);
786 :
787 0 : if( eType == OBJECTTYPE_DATA_LABEL )
788 : {
789 0 : aRet += " ";
790 0 : aRet += getName( OBJECTTYPE_DATA_LABEL );
791 0 : }
792 : }
793 0 : else if (eType == OBJECTTYPE_DATA_CURVE || eType == OBJECTTYPE_DATA_CURVE_EQUATION)
794 : {
795 0 : Reference< chart2::XDataSeries > xSeries( ObjectIdentifier::getDataSeriesForCID( rObjectCID , xModel ));
796 0 : Reference< chart2::XRegressionCurveContainer > xCurveCnt( xSeries, uno::UNO_QUERY );
797 :
798 0 : aRet += " ";
799 0 : aRet += getName(eType);
800 :
801 0 : if( xCurveCnt.is())
802 : {
803 0 : sal_Int32 nCurveIndex = ObjectIdentifier::getIndexFromParticleOrCID( rObjectCID );
804 0 : Reference< chart2::XRegressionCurve > xCurve( RegressionCurveHelper::getRegressionCurveAtIndex(xCurveCnt, nCurveIndex) );
805 0 : if( xCurve.is())
806 : {
807 0 : aRet += " (";
808 0 : aRet += RegressionCurveHelper::getRegressionCurveName(xCurve);
809 0 : aRet += ")";
810 0 : }
811 0 : }
812 : }
813 : else
814 : {
815 0 : aRet += getName( eType );
816 : }
817 0 : return aRet;
818 : }
819 : default:
820 0 : break;
821 : }
822 :
823 0 : return getName( eType );
824 : }
825 :
826 0 : OUString ObjectNameProvider::getName_ObjectForSeries(
827 : ObjectType eObjectType,
828 : const OUString& rSeriesCID,
829 : const uno::Reference< chart2::XChartDocument >& xChartDocument )
830 : {
831 0 : uno::Reference< frame::XModel> xChartModel( xChartDocument, uno::UNO_QUERY );
832 0 : Reference< XDataSeries > xSeries( ObjectIdentifier::getDataSeriesForCID( rSeriesCID , xChartModel ), uno::UNO_QUERY );
833 0 : if( xSeries.is() )
834 : {
835 0 : OUString aRet = SCH_RESSTR(STR_OBJECT_FOR_SERIES);
836 0 : replaceParamterInString( aRet, "%OBJECTNAME", getName( eObjectType, false /*bPlural*/ ) );
837 0 : replaceParamterInString( aRet, "%SERIESNAME", lcl_getDataSeriesName( rSeriesCID, xChartModel ) );
838 0 : return aRet;
839 : }
840 : else
841 0 : return ObjectNameProvider::getName_ObjectForAllSeries( eObjectType );
842 : }
843 :
844 0 : OUString ObjectNameProvider::getName_ObjectForAllSeries( ObjectType eObjectType )
845 : {
846 0 : OUString aRet = SCH_RESSTR(STR_OBJECT_FOR_ALL_SERIES);
847 0 : replaceParamterInString( aRet, "%OBJECTNAME", getName( eObjectType, true /*bPlural*/ ) );
848 0 : return aRet;
849 : }
850 :
851 : } //namespace chart
852 :
853 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|