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 "ChartController.hxx"
21 : #include "ChartWindow.hxx"
22 : #include "chartview/DrawModelWrapper.hxx"
23 : #include "ObjectIdentifier.hxx"
24 : #include "chartview/ExplicitValueProvider.hxx"
25 : #include "macros.hxx"
26 : #include "dlg_ObjectProperties.hxx"
27 : #include "dlg_View3D.hxx"
28 : #include "dlg_InsertErrorBars.hxx"
29 : #include "ViewElementListProvider.hxx"
30 : #include "DataPointItemConverter.hxx"
31 : #include "TextLabelItemConverter.hxx"
32 : #include "AxisItemConverter.hxx"
33 : #include "MultipleChartConverters.hxx"
34 : #include "TitleItemConverter.hxx"
35 : #include "LegendItemConverter.hxx"
36 : #include "RegressionCurveItemConverter.hxx"
37 : #include "RegressionEquationItemConverter.hxx"
38 : #include "ErrorBarItemConverter.hxx"
39 : #include "ChartModelHelper.hxx"
40 : #include "AxisHelper.hxx"
41 : #include "TitleHelper.hxx"
42 : #include "LegendHelper.hxx"
43 : #include "ChartTypeHelper.hxx"
44 : #include "ColorPerPointHelper.hxx"
45 : #include "DiagramHelper.hxx"
46 : #include "servicenames_charttypes.hxx"
47 : #include "ControllerLockGuard.hxx"
48 : #include "UndoGuard.hxx"
49 : #include "ObjectNameProvider.hxx"
50 : #include "ResId.hxx"
51 : #include "Strings.hrc"
52 : #include "ReferenceSizeProvider.hxx"
53 : #include "RegressionCurveHelper.hxx"
54 : #include <com/sun/star/chart2/XChartDocument.hpp>
55 :
56 : #include <memory>
57 : #include <boost/scoped_ptr.hpp>
58 :
59 : #include <vcl/msgbox.hxx>
60 : #include <vcl/svapp.hxx>
61 : #include <osl/mutex.hxx>
62 : #include <svx/ActionDescriptionProvider.hxx>
63 :
64 : namespace chart
65 : {
66 : using namespace ::com::sun::star;
67 : using namespace ::com::sun::star::chart2;
68 : using ::com::sun::star::uno::Reference;
69 :
70 : namespace
71 : {
72 :
73 0 : wrapper::ItemConverter* createItemConverter(
74 : const OUString & aObjectCID, const uno::Reference<frame::XModel>& xChartModel,
75 : const uno::Reference<uno::XComponentContext>& xContext, SdrModel& rDrawModel,
76 : ExplicitValueProvider* pExplicitValueProvider, ReferenceSizeProvider* pRefSizeProvider )
77 : {
78 0 : wrapper::ItemConverter* pItemConverter=NULL;
79 :
80 : //get type of selected object
81 0 : ObjectType eObjectType = ObjectIdentifier::getObjectType( aObjectCID );
82 0 : if( OBJECTTYPE_UNKNOWN==eObjectType )
83 : {
84 : OSL_FAIL("unknown ObjectType");
85 0 : return NULL;
86 : }
87 :
88 0 : OUString aParticleID = ObjectIdentifier::getParticleID( aObjectCID );
89 0 : bool bAffectsMultipleObjects = aParticleID == "ALLELEMENTS";
90 0 : if( !bAffectsMultipleObjects )
91 : {
92 : uno::Reference< beans::XPropertySet > xObjectProperties =
93 0 : ObjectIdentifier::getObjectPropertySet( aObjectCID, xChartModel );
94 0 : if(!xObjectProperties.is())
95 0 : return NULL;
96 : //create itemconverter for a single object
97 0 : switch(eObjectType)
98 : {
99 : case OBJECTTYPE_PAGE:
100 : pItemConverter = new wrapper::GraphicPropertyItemConverter(
101 : xObjectProperties, rDrawModel.GetItemPool(),
102 : rDrawModel, uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ),
103 0 : wrapper::GraphicPropertyItemConverter::LINE_AND_FILL_PROPERTIES );
104 0 : break;
105 : case OBJECTTYPE_TITLE:
106 : {
107 0 : boost::scoped_ptr<awt::Size> pRefSize;
108 0 : if (pRefSizeProvider)
109 0 : pRefSize.reset(new awt::Size(pRefSizeProvider->getPageSize()));
110 :
111 : pItemConverter = new wrapper::TitleItemConverter(
112 : xObjectProperties, rDrawModel.GetItemPool(), rDrawModel,
113 : uno::Reference<lang::XMultiServiceFactory>(xChartModel, uno::UNO_QUERY),
114 0 : pRefSize.get());
115 : }
116 0 : break;
117 : case OBJECTTYPE_LEGEND:
118 : {
119 0 : boost::scoped_ptr<awt::Size> pRefSize;
120 0 : if (pRefSizeProvider)
121 0 : pRefSize.reset( new awt::Size( pRefSizeProvider->getPageSize()));
122 :
123 : pItemConverter = new wrapper::LegendItemConverter(
124 : xObjectProperties, rDrawModel.GetItemPool(), rDrawModel,
125 : uno::Reference<lang::XMultiServiceFactory>(xChartModel, uno::UNO_QUERY),
126 0 : pRefSize.get());
127 : }
128 0 : break;
129 : case OBJECTTYPE_LEGEND_ENTRY:
130 0 : break;
131 : case OBJECTTYPE_DIAGRAM:
132 0 : break;
133 : case OBJECTTYPE_DIAGRAM_WALL:
134 : case OBJECTTYPE_DIAGRAM_FLOOR:
135 : pItemConverter = new wrapper::GraphicPropertyItemConverter(
136 : xObjectProperties, rDrawModel.GetItemPool(),
137 : rDrawModel, uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ),
138 0 : wrapper::GraphicPropertyItemConverter::LINE_AND_FILL_PROPERTIES );
139 0 : break;
140 : case OBJECTTYPE_AXIS:
141 : {
142 0 : boost::scoped_ptr<awt::Size> pRefSize;
143 0 : if (pRefSizeProvider)
144 0 : pRefSize.reset( new awt::Size( pRefSizeProvider->getPageSize()));
145 :
146 0 : uno::Reference< beans::XPropertySet > xDiaProp;
147 0 : xDiaProp.set( ChartModelHelper::findDiagram( xChartModel ), uno::UNO_QUERY );
148 :
149 : // the second property set contains the property CoordinateOrigin
150 : // nOriginIndex is the index of the corresponding index of the
151 : // origin (x=0, y=1, z=2)
152 :
153 0 : ExplicitScaleData aExplicitScale;
154 0 : ExplicitIncrementData aExplicitIncrement;
155 0 : if( pExplicitValueProvider )
156 : pExplicitValueProvider->getExplicitValuesForAxis(
157 : uno::Reference< XAxis >( xObjectProperties, uno::UNO_QUERY ),
158 0 : aExplicitScale, aExplicitIncrement );
159 :
160 : pItemConverter = new wrapper::AxisItemConverter(
161 : xObjectProperties, rDrawModel.GetItemPool(),
162 : rDrawModel,
163 : uno::Reference< chart2::XChartDocument >( xChartModel, uno::UNO_QUERY ),
164 : &aExplicitScale, &aExplicitIncrement,
165 0 : pRefSize.get() );
166 : }
167 0 : break;
168 : case OBJECTTYPE_AXIS_UNITLABEL:
169 0 : break;
170 : case OBJECTTYPE_DATA_LABELS:
171 : case OBJECTTYPE_DATA_LABEL:
172 : {
173 0 : boost::scoped_ptr<awt::Size> pRefSize;
174 0 : if (pRefSizeProvider)
175 0 : pRefSize.reset( new awt::Size( pRefSizeProvider->getPageSize()));
176 :
177 0 : uno::Reference<XDataSeries> xSeries = ObjectIdentifier::getDataSeriesForCID(aObjectCID, xChartModel);
178 0 : uno::Reference<XChartType> xChartType = ChartModelHelper::getChartTypeOfSeries(xChartModel, xSeries);
179 :
180 0 : uno::Reference<XDiagram> xDiagram = ChartModelHelper::findDiagram(xChartModel);
181 :
182 0 : bool bDataSeries = eObjectType == OBJECTTYPE_DATA_LABELS;
183 :
184 0 : sal_Int32 nPointIndex = -1; /*-1 for whole series*/
185 0 : if (!bDataSeries)
186 0 : nPointIndex = aParticleID.toInt32();
187 :
188 : sal_Int32 nNumberFormat = ExplicitValueProvider::getExplicitNumberFormatKeyForDataLabel(
189 0 : xObjectProperties, xSeries, nPointIndex, xDiagram);
190 : sal_Int32 nPercentNumberFormat = ExplicitValueProvider::getExplicitPercentageNumberFormatKeyForDataLabel(
191 0 : xObjectProperties,uno::Reference<util::XNumberFormatsSupplier>(xChartModel, uno::UNO_QUERY));
192 :
193 : pItemConverter = new wrapper::TextLabelItemConverter(
194 : xChartModel, xObjectProperties, xSeries,
195 : rDrawModel.GetItemPool(), pRefSize.get(), bDataSeries,
196 0 : nNumberFormat, nPercentNumberFormat);
197 : }
198 0 : break;
199 : case OBJECTTYPE_DATA_SERIES:
200 : case OBJECTTYPE_DATA_POINT:
201 : {
202 0 : boost::scoped_ptr<awt::Size> pRefSize;
203 0 : if (pRefSizeProvider)
204 0 : pRefSize.reset( new awt::Size( pRefSizeProvider->getPageSize()));
205 :
206 : wrapper::GraphicPropertyItemConverter::eGraphicObjectType eMapTo =
207 0 : wrapper::GraphicPropertyItemConverter::FILLED_DATA_POINT;
208 :
209 0 : uno::Reference< XDataSeries > xSeries = ObjectIdentifier::getDataSeriesForCID( aObjectCID, xChartModel );
210 0 : uno::Reference< XChartType > xChartType = ChartModelHelper::getChartTypeOfSeries( xChartModel, xSeries );
211 :
212 0 : uno::Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xChartModel ) );
213 0 : sal_Int32 nDimensionCount = DiagramHelper::getDimension( xDiagram );
214 0 : if( !ChartTypeHelper::isSupportingAreaProperties( xChartType, nDimensionCount ) )
215 0 : eMapTo = wrapper::GraphicPropertyItemConverter::LINE_DATA_POINT;
216 :
217 0 : bool bDataSeries = eObjectType == OBJECTTYPE_DATA_SERIES;
218 :
219 : //special color for pie chart:
220 0 : bool bUseSpecialFillColor = false;
221 0 : sal_Int32 nSpecialFillColor =0;
222 0 : sal_Int32 nPointIndex = -1; /*-1 for whole series*/
223 0 : if(!bDataSeries)
224 : {
225 0 : nPointIndex = aParticleID.toInt32();
226 0 : uno::Reference< beans::XPropertySet > xSeriesProp( xSeries, uno::UNO_QUERY );
227 0 : bool bVaryColorsByPoint = false;
228 0 : if( xSeriesProp.is() &&
229 0 : (xSeriesProp->getPropertyValue("VaryColorsByPoint") >>= bVaryColorsByPoint) &&
230 : bVaryColorsByPoint )
231 : {
232 0 : if( !ColorPerPointHelper::hasPointOwnColor( xSeriesProp, nPointIndex, xObjectProperties ) )
233 : {
234 0 : bUseSpecialFillColor = true;
235 : OSL_ASSERT( xDiagram.is());
236 0 : uno::Reference< XColorScheme > xColorScheme( xDiagram->getDefaultColorScheme() );
237 0 : if( xColorScheme.is())
238 0 : nSpecialFillColor = xColorScheme->getColorByIndex( nPointIndex );
239 : }
240 0 : }
241 : }
242 0 : sal_Int32 nNumberFormat=ExplicitValueProvider::getExplicitNumberFormatKeyForDataLabel( xObjectProperties, xSeries, nPointIndex, xDiagram );
243 : sal_Int32 nPercentNumberFormat=ExplicitValueProvider::getExplicitPercentageNumberFormatKeyForDataLabel(
244 0 : xObjectProperties,uno::Reference< util::XNumberFormatsSupplier >(xChartModel, uno::UNO_QUERY));
245 :
246 : pItemConverter = new wrapper::DataPointItemConverter( xChartModel, xContext,
247 : xObjectProperties, xSeries, rDrawModel.GetItemPool(), rDrawModel,
248 : uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ),
249 : eMapTo, pRefSize.get(), bDataSeries, bUseSpecialFillColor, nSpecialFillColor, true,
250 0 : nNumberFormat, nPercentNumberFormat );
251 0 : break;
252 : }
253 : case OBJECTTYPE_GRID:
254 : case OBJECTTYPE_SUBGRID:
255 : case OBJECTTYPE_DATA_AVERAGE_LINE:
256 : pItemConverter = new wrapper::GraphicPropertyItemConverter(
257 : xObjectProperties, rDrawModel.GetItemPool(),
258 : rDrawModel, uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ),
259 0 : wrapper::GraphicPropertyItemConverter::LINE_PROPERTIES );
260 0 : break;
261 :
262 : case OBJECTTYPE_DATA_ERRORS_X:
263 : case OBJECTTYPE_DATA_ERRORS_Y:
264 : case OBJECTTYPE_DATA_ERRORS_Z:
265 : pItemConverter = new wrapper::ErrorBarItemConverter(
266 : xChartModel, xObjectProperties, rDrawModel.GetItemPool(),
267 0 : rDrawModel, uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ));
268 0 : break;
269 :
270 : case OBJECTTYPE_DATA_CURVE:
271 : pItemConverter = new wrapper::RegressionCurveItemConverter(
272 : xObjectProperties, uno::Reference< chart2::XRegressionCurveContainer >(
273 : ObjectIdentifier::getDataSeriesForCID( aObjectCID, xChartModel ), uno::UNO_QUERY ),
274 : rDrawModel.GetItemPool(), rDrawModel,
275 0 : uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ));
276 0 : break;
277 : case OBJECTTYPE_DATA_CURVE_EQUATION:
278 : {
279 0 : boost::scoped_ptr<awt::Size> pRefSize;
280 0 : if (pRefSizeProvider)
281 0 : pRefSize.reset(new awt::Size(pRefSizeProvider->getPageSize()));
282 :
283 : pItemConverter = new wrapper::RegressionEquationItemConverter(
284 : xObjectProperties, rDrawModel.GetItemPool(), rDrawModel,
285 : uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ),
286 0 : pRefSize.get());
287 0 : break;
288 : }
289 : case OBJECTTYPE_DATA_STOCK_RANGE:
290 0 : break;
291 : case OBJECTTYPE_DATA_STOCK_LOSS:
292 : case OBJECTTYPE_DATA_STOCK_GAIN:
293 : pItemConverter = new wrapper::GraphicPropertyItemConverter(
294 : xObjectProperties, rDrawModel.GetItemPool(),
295 : rDrawModel, uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ),
296 0 : wrapper::GraphicPropertyItemConverter::LINE_AND_FILL_PROPERTIES );
297 0 : break;
298 : default: //OBJECTTYPE_UNKNOWN
299 0 : break;
300 0 : }
301 : }
302 : else
303 : {
304 : //create itemconverter for a all objects of given type
305 0 : switch(eObjectType)
306 : {
307 : case OBJECTTYPE_TITLE:
308 : pItemConverter = new wrapper::AllTitleItemConverter( xChartModel, rDrawModel.GetItemPool(),
309 0 : rDrawModel, uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ));
310 0 : break;
311 : case OBJECTTYPE_AXIS:
312 : {
313 0 : boost::scoped_ptr<awt::Size> pRefSize;
314 0 : if (pRefSizeProvider)
315 0 : pRefSize.reset( new awt::Size( pRefSizeProvider->getPageSize()));
316 :
317 : pItemConverter = new wrapper::AllAxisItemConverter(
318 : xChartModel, rDrawModel.GetItemPool(),
319 0 : rDrawModel, uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ), pRefSize.get());
320 : }
321 0 : break;
322 : case OBJECTTYPE_GRID:
323 : case OBJECTTYPE_SUBGRID:
324 : pItemConverter = new wrapper::AllGridItemConverter( xChartModel, rDrawModel.GetItemPool(),
325 0 : rDrawModel, uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ));
326 0 : break;
327 : default: //for this type it is not supported to change all elements at once
328 0 : break;
329 : }
330 :
331 : }
332 0 : return pItemConverter;
333 : }
334 :
335 0 : OUString lcl_getTitleCIDForCommand( const OString& rDispatchCommand, const uno::Reference< frame::XModel > & xChartModel )
336 : {
337 0 : if( rDispatchCommand.equals("AllTitles"))
338 0 : return ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_TITLE, "ALLELEMENTS" );
339 :
340 0 : TitleHelper::eTitleType nTitleType( TitleHelper::MAIN_TITLE );
341 0 : if( rDispatchCommand.equals("SubTitle") )
342 0 : nTitleType = TitleHelper::SUB_TITLE;
343 0 : else if( rDispatchCommand.equals("XTitle") )
344 0 : nTitleType = TitleHelper::X_AXIS_TITLE;
345 0 : else if( rDispatchCommand.equals("YTitle") )
346 0 : nTitleType = TitleHelper::Y_AXIS_TITLE;
347 0 : else if( rDispatchCommand.equals("ZTitle") )
348 0 : nTitleType = TitleHelper::Z_AXIS_TITLE;
349 0 : else if( rDispatchCommand.equals("SecondaryXTitle") )
350 0 : nTitleType = TitleHelper::SECONDARY_X_AXIS_TITLE;
351 0 : else if( rDispatchCommand.equals("SecondaryYTitle") )
352 0 : nTitleType = TitleHelper::SECONDARY_Y_AXIS_TITLE;
353 :
354 0 : uno::Reference< XTitle > xTitle( TitleHelper::getTitle( nTitleType, xChartModel ) );
355 0 : return ObjectIdentifier::createClassifiedIdentifierForObject( xTitle, xChartModel );
356 : }
357 :
358 0 : OUString lcl_getAxisCIDForCommand( const OString& rDispatchCommand, const uno::Reference< frame::XModel >& xChartModel )
359 : {
360 0 : if( rDispatchCommand.equals("DiagramAxisAll"))
361 0 : return ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_AXIS, "ALLELEMENTS" );
362 :
363 0 : sal_Int32 nDimensionIndex=0;
364 0 : bool bMainAxis=true;
365 0 : if( rDispatchCommand.equals("DiagramAxisX"))
366 : {
367 0 : nDimensionIndex=0; bMainAxis=true;
368 : }
369 0 : else if( rDispatchCommand.equals("DiagramAxisY"))
370 : {
371 0 : nDimensionIndex=1; bMainAxis=true;
372 : }
373 0 : else if( rDispatchCommand.equals("DiagramAxisZ"))
374 : {
375 0 : nDimensionIndex=2; bMainAxis=true;
376 : }
377 0 : else if( rDispatchCommand.equals("DiagramAxisA"))
378 : {
379 0 : nDimensionIndex=0; bMainAxis=false;
380 : }
381 0 : else if( rDispatchCommand.equals("DiagramAxisB"))
382 : {
383 0 : nDimensionIndex=1; bMainAxis=false;
384 : }
385 :
386 0 : uno::Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xChartModel ) );
387 0 : uno::Reference< XAxis > xAxis( AxisHelper::getAxis( nDimensionIndex, bMainAxis, xDiagram ) );
388 0 : return ObjectIdentifier::createClassifiedIdentifierForObject( xAxis, xChartModel );
389 : }
390 :
391 0 : OUString lcl_getGridCIDForCommand( const OString& rDispatchCommand, const uno::Reference< frame::XModel >& xChartModel )
392 : {
393 0 : uno::Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xChartModel ) );
394 :
395 0 : if( rDispatchCommand.equals("DiagramGridAll"))
396 0 : return ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_GRID, "ALLELEMENTS" );
397 :
398 0 : sal_Int32 nDimensionIndex=0;
399 0 : bool bMainGrid=true;
400 :
401 : //x and y is swapped in the commands
402 :
403 0 : if( rDispatchCommand.equals("DiagramGridYMain"))
404 : {
405 0 : nDimensionIndex=0; bMainGrid=true;
406 : }
407 0 : else if( rDispatchCommand.equals("DiagramGridXMain"))
408 : {
409 0 : nDimensionIndex=1; bMainGrid=true;
410 : }
411 0 : else if( rDispatchCommand.equals("DiagramGridZMain"))
412 : {
413 0 : nDimensionIndex=2; bMainGrid=true;
414 : }
415 0 : else if( rDispatchCommand.equals("DiagramGridYHelp"))
416 : {
417 0 : nDimensionIndex=0; bMainGrid=false;
418 : }
419 0 : else if( rDispatchCommand.equals("DiagramGridXHelp"))
420 : {
421 0 : nDimensionIndex=1; bMainGrid=false;
422 : }
423 0 : else if( rDispatchCommand.equals("DiagramGridZHelp"))
424 : {
425 0 : nDimensionIndex=2; bMainGrid=false;
426 : }
427 :
428 0 : bool bMainAxis = true;
429 0 : uno::Reference< XAxis > xAxis( AxisHelper::getAxis( nDimensionIndex, bMainAxis, xDiagram ) );
430 :
431 0 : sal_Int32 nSubGridIndex= bMainGrid ? (-1) : 0;
432 0 : OUString aCID( ObjectIdentifier::createClassifiedIdentifierForGrid( xAxis, xChartModel, nSubGridIndex ) );
433 0 : return aCID;
434 : }
435 :
436 0 : OUString lcl_getErrorCIDForCommand( const ObjectType eDispatchType, const ObjectType &eSelectedType, const OUString &rSelectedCID)
437 : {
438 0 : if( eSelectedType == eDispatchType )
439 0 : return rSelectedCID;
440 :
441 0 : return ObjectIdentifier::createClassifiedIdentifierWithParent( eDispatchType, OUString(), rSelectedCID );
442 : }
443 :
444 0 : OUString lcl_getObjectCIDForCommand( const OString& rDispatchCommand, const uno::Reference< XChartDocument > & xChartDocument, const OUString& rSelectedCID )
445 : {
446 0 : ObjectType eObjectType = OBJECTTYPE_UNKNOWN;
447 0 : OUString aParticleID;
448 :
449 0 : uno::Reference< frame::XModel > xChartModel( xChartDocument, uno::UNO_QUERY );
450 0 : const ObjectType eSelectedType = ObjectIdentifier::getObjectType( rSelectedCID );
451 0 : uno::Reference< XDataSeries > xSeries = ObjectIdentifier::getDataSeriesForCID( rSelectedCID, xChartModel );
452 0 : uno::Reference< chart2::XRegressionCurveContainer > xRegCurveCnt( xSeries, uno::UNO_QUERY );
453 :
454 : //legend
455 0 : if( rDispatchCommand.equals("Legend") || rDispatchCommand.equals("FormatLegend") )
456 : {
457 0 : eObjectType = OBJECTTYPE_LEGEND;
458 : //@todo set particular aParticleID if we have more than one legend
459 : }
460 : //wall floor area
461 0 : else if( rDispatchCommand.equals("DiagramWall") || rDispatchCommand.equals("FormatWall") )
462 : {
463 : //OBJECTTYPE_DIAGRAM;
464 0 : eObjectType = OBJECTTYPE_DIAGRAM_WALL;
465 : //@todo set particular aParticleID if we have more than one diagram
466 : }
467 0 : else if( rDispatchCommand.equals("DiagramFloor") || rDispatchCommand.equals("FormatFloor") )
468 : {
469 0 : eObjectType = OBJECTTYPE_DIAGRAM_FLOOR;
470 : //@todo set particular aParticleID if we have more than one diagram
471 : }
472 0 : else if( rDispatchCommand.equals("DiagramArea") || rDispatchCommand.equals("FormatChartArea") )
473 : {
474 0 : eObjectType = OBJECTTYPE_PAGE;
475 : }
476 : //title
477 0 : else if( rDispatchCommand.equals("MainTitle")
478 0 : || rDispatchCommand.equals("SubTitle")
479 0 : || rDispatchCommand.equals("XTitle")
480 0 : || rDispatchCommand.equals("YTitle")
481 0 : || rDispatchCommand.equals("ZTitle")
482 0 : || rDispatchCommand.equals("SecondaryXTitle")
483 0 : || rDispatchCommand.equals("SecondaryYTitle")
484 0 : || rDispatchCommand.equals("AllTitles")
485 : )
486 : {
487 0 : return lcl_getTitleCIDForCommand( rDispatchCommand, xChartModel );
488 : }
489 : //axis
490 0 : else if( rDispatchCommand.equals("DiagramAxisX")
491 0 : || rDispatchCommand.equals("DiagramAxisY")
492 0 : || rDispatchCommand.equals("DiagramAxisZ")
493 0 : || rDispatchCommand.equals("DiagramAxisA")
494 0 : || rDispatchCommand.equals("DiagramAxisB")
495 0 : || rDispatchCommand.equals("DiagramAxisAll")
496 : )
497 : {
498 0 : return lcl_getAxisCIDForCommand( rDispatchCommand, xChartModel );
499 : }
500 : //grid
501 0 : else if( rDispatchCommand.equals("DiagramGridYMain")
502 0 : || rDispatchCommand.equals("DiagramGridXMain")
503 0 : || rDispatchCommand.equals("DiagramGridZMain")
504 0 : || rDispatchCommand.equals("DiagramGridYHelp")
505 0 : || rDispatchCommand.equals("DiagramGridXHelp")
506 0 : || rDispatchCommand.equals("DiagramGridZHelp")
507 0 : || rDispatchCommand.equals("DiagramGridAll")
508 : )
509 : {
510 0 : return lcl_getGridCIDForCommand( rDispatchCommand, xChartModel );
511 : }
512 : //data series
513 0 : else if( rDispatchCommand.equals("FormatDataSeries") )
514 : {
515 0 : if( eSelectedType == OBJECTTYPE_DATA_SERIES )
516 0 : return rSelectedCID;
517 : else
518 : return ObjectIdentifier::createClassifiedIdentifier(
519 0 : OBJECTTYPE_DATA_SERIES, ObjectIdentifier::getSeriesParticleFromCID( rSelectedCID ) );
520 : }
521 : //data point
522 0 : else if( rDispatchCommand.equals("FormatDataPoint") )
523 : {
524 0 : return rSelectedCID;
525 : }
526 : //data labels
527 0 : else if( rDispatchCommand.equals("FormatDataLabels") )
528 : {
529 0 : if( eSelectedType == OBJECTTYPE_DATA_LABELS )
530 0 : return rSelectedCID;
531 : else
532 : return ObjectIdentifier::createClassifiedIdentifierWithParent(
533 0 : OBJECTTYPE_DATA_LABELS, OUString(), rSelectedCID );
534 : }
535 : //data labels
536 0 : else if( rDispatchCommand.equals("FormatDataLabel") )
537 : {
538 0 : if( eSelectedType == OBJECTTYPE_DATA_LABEL )
539 0 : return rSelectedCID;
540 : else
541 : {
542 0 : sal_Int32 nPointIndex = ObjectIdentifier::getParticleID( rSelectedCID ).toInt32();
543 0 : if( nPointIndex>=0 )
544 : {
545 0 : OUString aSeriesParticle = ObjectIdentifier::getSeriesParticleFromCID( rSelectedCID );
546 0 : OUString aChildParticle( ObjectIdentifier::getStringForType( OBJECTTYPE_DATA_LABELS ) + "=" );
547 0 : OUString aLabelsCID = ObjectIdentifier::createClassifiedIdentifierForParticles( aSeriesParticle, aChildParticle );
548 : OUString aLabelCID_Stub = ObjectIdentifier::createClassifiedIdentifierWithParent(
549 0 : OBJECTTYPE_DATA_LABEL, OUString(), aLabelsCID );
550 :
551 0 : return ObjectIdentifier::createPointCID( aLabelCID_Stub, nPointIndex );
552 : }
553 : }
554 : }
555 : //mean value line
556 0 : else if( rDispatchCommand.equals("FormatMeanValue") )
557 : {
558 0 : if( eSelectedType == OBJECTTYPE_DATA_AVERAGE_LINE )
559 0 : return rSelectedCID;
560 : else
561 : return ObjectIdentifier::createDataCurveCID(
562 : ObjectIdentifier::getSeriesParticleFromCID( rSelectedCID ),
563 : RegressionCurveHelper::getRegressionCurveIndex( xRegCurveCnt,
564 0 : RegressionCurveHelper::getMeanValueLine( xRegCurveCnt ) ), true );
565 : }
566 : //trend line
567 0 : else if( rDispatchCommand.equals("FormatTrendline") )
568 : {
569 0 : if( eSelectedType == OBJECTTYPE_DATA_CURVE )
570 0 : return rSelectedCID;
571 : else
572 : return ObjectIdentifier::createDataCurveCID(
573 : ObjectIdentifier::getSeriesParticleFromCID( rSelectedCID ),
574 : RegressionCurveHelper::getRegressionCurveIndex( xRegCurveCnt,
575 0 : RegressionCurveHelper::getFirstCurveNotMeanValueLine( xRegCurveCnt ) ), false );
576 : }
577 : //trend line equation
578 0 : else if( rDispatchCommand.equals("FormatTrendlineEquation") )
579 : {
580 0 : if( eSelectedType == OBJECTTYPE_DATA_CURVE_EQUATION )
581 0 : return rSelectedCID;
582 : else
583 : return ObjectIdentifier::createDataCurveEquationCID(
584 : ObjectIdentifier::getSeriesParticleFromCID( rSelectedCID ),
585 : RegressionCurveHelper::getRegressionCurveIndex( xRegCurveCnt,
586 0 : RegressionCurveHelper::getFirstCurveNotMeanValueLine( xRegCurveCnt ) ) );
587 : }
588 : // y error bars
589 0 : else if( rDispatchCommand.equals("FormatXErrorBars") )
590 : {
591 0 : return lcl_getErrorCIDForCommand(OBJECTTYPE_DATA_ERRORS_X, eSelectedType, rSelectedCID );
592 : }
593 : // y error bars
594 0 : else if( rDispatchCommand.equals("FormatYErrorBars") )
595 : {
596 0 : return lcl_getErrorCIDForCommand(OBJECTTYPE_DATA_ERRORS_Y, eSelectedType, rSelectedCID );
597 : }
598 : // axis
599 0 : else if( rDispatchCommand.equals("FormatAxis") )
600 : {
601 0 : if( eSelectedType == OBJECTTYPE_AXIS )
602 0 : return rSelectedCID;
603 : else
604 : {
605 0 : Reference< XAxis > xAxis = ObjectIdentifier::getAxisForCID( rSelectedCID, xChartModel );
606 0 : return ObjectIdentifier::createClassifiedIdentifierForObject( xAxis , xChartModel );
607 : }
608 : }
609 : // major grid
610 0 : else if( rDispatchCommand.equals("FormatMajorGrid") )
611 : {
612 0 : if( eSelectedType == OBJECTTYPE_GRID )
613 0 : return rSelectedCID;
614 : else
615 : {
616 0 : Reference< XAxis > xAxis = ObjectIdentifier::getAxisForCID( rSelectedCID, xChartModel );
617 0 : return ObjectIdentifier::createClassifiedIdentifierForGrid( xAxis, xChartModel );
618 : }
619 :
620 : }
621 : // minor grid
622 0 : else if( rDispatchCommand.equals("FormatMinorGrid") )
623 : {
624 0 : if( eSelectedType == OBJECTTYPE_SUBGRID )
625 0 : return rSelectedCID;
626 : else
627 : {
628 0 : Reference< XAxis > xAxis = ObjectIdentifier::getAxisForCID( rSelectedCID, xChartModel );
629 0 : return ObjectIdentifier::createClassifiedIdentifierForGrid( xAxis, xChartModel, 0 /*sub grid index*/ );
630 : }
631 : }
632 : // title
633 0 : else if( rDispatchCommand.equals("FormatTitle") )
634 : {
635 0 : if( eSelectedType == OBJECTTYPE_TITLE )
636 0 : return rSelectedCID;
637 : }
638 : // stock loss
639 0 : else if( rDispatchCommand.equals("FormatStockLoss") )
640 : {
641 0 : if( eSelectedType == OBJECTTYPE_DATA_STOCK_LOSS )
642 0 : return rSelectedCID;
643 : else
644 0 : return ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_DATA_STOCK_LOSS, OUString());
645 : }
646 : // stock gain
647 0 : else if( rDispatchCommand.equals("FormatStockGain") )
648 : {
649 0 : if( eSelectedType == OBJECTTYPE_DATA_STOCK_GAIN )
650 0 : return rSelectedCID;
651 : else
652 0 : return ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_DATA_STOCK_GAIN, OUString() );
653 : }
654 :
655 : return ObjectIdentifier::createClassifiedIdentifier(
656 0 : eObjectType, aParticleID );
657 : }
658 :
659 : }
660 : // anonymous namespace
661 :
662 0 : void ChartController::executeDispatch_FormatObject(const OUString& rDispatchCommand)
663 : {
664 0 : uno::Reference< XChartDocument > xChartDocument( getModel(), uno::UNO_QUERY );
665 0 : OString aCommand( OUStringToOString( rDispatchCommand, RTL_TEXTENCODING_ASCII_US ) );
666 0 : OUString rObjectCID = lcl_getObjectCIDForCommand( aCommand, xChartDocument, m_aSelection.getSelectedCID() );
667 0 : executeDlg_ObjectProperties( rObjectCID );
668 0 : }
669 :
670 0 : void ChartController::executeDispatch_ObjectProperties()
671 : {
672 0 : executeDlg_ObjectProperties( m_aSelection.getSelectedCID() );
673 0 : }
674 :
675 : namespace
676 : {
677 :
678 0 : OUString lcl_getFormatCIDforSelectedCID( const OUString& rSelectedCID )
679 : {
680 0 : OUString aFormatCID(rSelectedCID);
681 :
682 : //get type of selected object
683 0 : ObjectType eObjectType = ObjectIdentifier::getObjectType( aFormatCID );
684 :
685 : // some legend entries are handled as if they were data series
686 0 : if( OBJECTTYPE_LEGEND_ENTRY==eObjectType )
687 : {
688 0 : OUString aParentParticle( ObjectIdentifier::getFullParentParticle( rSelectedCID ) );
689 0 : aFormatCID = ObjectIdentifier::createClassifiedIdentifierForParticle( aParentParticle );
690 : }
691 :
692 : // treat diagram as wall
693 0 : if( OBJECTTYPE_DIAGRAM==eObjectType )
694 0 : aFormatCID = ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_DIAGRAM_WALL, OUString() );
695 :
696 0 : return aFormatCID;
697 : }
698 :
699 : }//end anonymous namespace
700 :
701 0 : void ChartController::executeDlg_ObjectProperties( const OUString& rSelectedObjectCID )
702 : {
703 0 : OUString aObjectCID = lcl_getFormatCIDforSelectedCID( rSelectedObjectCID );
704 :
705 : UndoGuard aUndoGuard( ActionDescriptionProvider::createDescription(
706 : ActionDescriptionProvider::FORMAT,
707 : ObjectNameProvider::getName( ObjectIdentifier::getObjectType( aObjectCID ))),
708 0 : m_xUndoManager );
709 :
710 0 : bool bSuccess = ChartController::executeDlg_ObjectProperties_withoutUndoGuard( aObjectCID, false );
711 0 : if( bSuccess )
712 0 : aUndoGuard.commit();
713 0 : }
714 :
715 0 : bool ChartController::executeDlg_ObjectProperties_withoutUndoGuard(
716 : const OUString& rObjectCID, bool bSuccessOnUnchanged )
717 : {
718 : //return true if the properties were changed successfully
719 0 : bool bRet = false;
720 0 : if( rObjectCID.isEmpty() )
721 : {
722 0 : return bRet;
723 : }
724 : try
725 : {
726 : //get type of object
727 0 : ObjectType eObjectType = ObjectIdentifier::getObjectType( rObjectCID );
728 0 : if( OBJECTTYPE_UNKNOWN==eObjectType )
729 : {
730 0 : return bRet;
731 : }
732 0 : if( OBJECTTYPE_DIAGRAM_WALL==eObjectType || OBJECTTYPE_DIAGRAM_FLOOR==eObjectType )
733 : {
734 0 : if( !DiagramHelper::isSupportingFloorAndWall( ChartModelHelper::findDiagram( getModel() ) ) )
735 0 : return bRet;
736 : }
737 :
738 : //convert properties to ItemSet
739 :
740 0 : boost::scoped_ptr<ReferenceSizeProvider> pRefSizeProv(impl_createReferenceSizeProvider());
741 :
742 : boost::scoped_ptr<wrapper::ItemConverter> pItemConverter(
743 0 : createItemConverter( rObjectCID, getModel(), m_xCC,
744 0 : m_pDrawModelWrapper->getSdrModel(),
745 : ExplicitValueProvider::getExplicitValueProvider(m_xChartView),
746 0 : pRefSizeProv.get()));
747 :
748 0 : if (!pItemConverter)
749 0 : return bRet;
750 :
751 0 : SfxItemSet aItemSet = pItemConverter->CreateEmptyItemSet();
752 :
753 0 : if ( eObjectType == OBJECTTYPE_DATA_ERRORS_X || eObjectType == OBJECTTYPE_DATA_ERRORS_Y )
754 0 : aItemSet.Put(SfxBoolItem(SCHATTR_STAT_ERRORBAR_TYPE, eObjectType == OBJECTTYPE_DATA_ERRORS_Y ));
755 :
756 0 : pItemConverter->FillItemSet(aItemSet);
757 :
758 : //prepare dialog
759 0 : ObjectPropertiesDialogParameter aDialogParameter = ObjectPropertiesDialogParameter( rObjectCID );
760 0 : aDialogParameter.init( getModel() );
761 0 : ViewElementListProvider aViewElementListProvider( m_pDrawModelWrapper.get() );
762 :
763 0 : SolarMutexGuard aGuard;
764 : ScopedVclPtrInstance<SchAttribTabDlg> aDlg(
765 : m_pChartWindow, &aItemSet, &aDialogParameter,
766 : &aViewElementListProvider,
767 : uno::Reference< util::XNumberFormatsSupplier >(
768 0 : getModel(), uno::UNO_QUERY ) );
769 :
770 0 : if(aDialogParameter.HasSymbolProperties())
771 : {
772 0 : SfxItemSet* pSymbolShapeProperties=NULL;
773 : uno::Reference< beans::XPropertySet > xObjectProperties =
774 0 : ObjectIdentifier::getObjectPropertySet( rObjectCID, getModel() );
775 0 : wrapper::DataPointItemConverter aSymbolItemConverter( getModel(), m_xCC
776 0 : , xObjectProperties, ObjectIdentifier::getDataSeriesForCID( rObjectCID, getModel() )
777 0 : , m_pDrawModelWrapper->getSdrModel().GetItemPool()
778 0 : , m_pDrawModelWrapper->getSdrModel()
779 0 : , uno::Reference< lang::XMultiServiceFactory >( getModel(), uno::UNO_QUERY )
780 0 : , wrapper::GraphicPropertyItemConverter::FILLED_DATA_POINT );
781 :
782 0 : pSymbolShapeProperties = new SfxItemSet( aSymbolItemConverter.CreateEmptyItemSet() );
783 0 : aSymbolItemConverter.FillItemSet( *pSymbolShapeProperties );
784 :
785 0 : sal_Int32 nStandardSymbol=0;//@todo get from somewhere
786 0 : Graphic* pAutoSymbolGraphic = new Graphic( aViewElementListProvider.GetSymbolGraphic( nStandardSymbol, pSymbolShapeProperties ) );
787 : // note: the dialog takes the ownership of pSymbolShapeProperties and pAutoSymbolGraphic
788 0 : aDlg->setSymbolInformation( pSymbolShapeProperties, pAutoSymbolGraphic );
789 : }
790 0 : if( aDialogParameter.HasStatisticProperties() )
791 : {
792 : aDlg->SetAxisMinorStepWidthForErrorBarDecimals(
793 0 : InsertErrorBarsDialog::getAxisMinorStepWidthForErrorBarDecimals( getModel(), m_xChartView, rObjectCID ) );
794 : }
795 :
796 : //open the dialog
797 0 : if (aDlg->Execute() == RET_OK || (bSuccessOnUnchanged && aDlg->DialogWasClosedWithOK()))
798 : {
799 0 : const SfxItemSet* pOutItemSet = aDlg->GetOutputItemSet();
800 0 : if(pOutItemSet)
801 : {
802 0 : ControllerLockGuardUNO aCLGuard( getModel());
803 0 : (void)pItemConverter->ApplyItemSet(*pOutItemSet); //model should be changed now
804 0 : bRet = true;
805 : }
806 0 : }
807 : }
808 0 : catch( const util::CloseVetoException& )
809 : {
810 : }
811 0 : catch( const uno::RuntimeException& )
812 : {
813 : }
814 0 : return bRet;
815 : }
816 :
817 0 : void ChartController::executeDispatch_View3D()
818 : {
819 : try
820 : {
821 : // using assignment for broken gcc 3.3
822 : UndoLiveUpdateGuard aUndoGuard = UndoLiveUpdateGuard(
823 : SCH_RESSTR( STR_ACTION_EDIT_3D_VIEW ),
824 0 : m_xUndoManager );
825 :
826 : //open dialog
827 0 : SolarMutexGuard aSolarGuard;
828 0 : ScopedVclPtrInstance< View3DDialog > aDlg( m_pChartWindow, getModel(), m_pDrawModelWrapper->GetColorList() );
829 0 : if( aDlg->Execute() == RET_OK )
830 0 : aUndoGuard.commit();
831 : }
832 0 : catch(const uno::RuntimeException& e)
833 : {
834 : ASSERT_EXCEPTION( e );
835 : }
836 0 : }
837 :
838 57 : } //namespace chart
839 :
840 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|