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