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 #include "sampleaddin.hxx" 24 25 #include <cppuhelper/factory.hxx> 26 #include <osl/diagnose.h> 27 28 #include <com/sun/star/drawing/XDrawPageSupplier.hpp> 29 #include <com/sun/star/drawing/XDrawPage.hpp> 30 #include <com/sun/star/chart/XChartDataArray.hpp> 31 #include <com/sun/star/text/XTextRange.hpp> 32 #include <com/sun/star/chart/X3DDisplay.hpp> 33 34 using namespace com::sun::star; 35 using namespace rtl; 36 37 // code for creating instances of SampleAddIn 38 39 extern "C" { 40 41 void SAL_CALL component_getImplementationEnvironment( 42 const sal_Char ** ppEnvTypeName, uno_Environment ** /*ppEnv*/ ) 43 { 44 *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; 45 } 46 47 sal_Bool SAL_CALL component_writeInfo( 48 void * /*pServiceManager*/, registry::XRegistryKey * pRegistryKey ) 49 { 50 if( pRegistryKey ) 51 { 52 try 53 { 54 OUString aImpl = OUString::createFromAscii( "/" ); 55 aImpl += SampleAddIn::getImplementationName_Static(); 56 aImpl += OUString::createFromAscii( "/UNO/SERVICES" ); 57 58 uno::Reference< registry::XRegistryKey> xNewKey( 59 reinterpret_cast<registry::XRegistryKey*>( pRegistryKey )->createKey( aImpl ) ); 60 61 uno::Sequence< OUString > aSequ = SampleAddIn::getSupportedServiceNames_Static(); 62 const OUString * pArray = aSequ.getConstArray(); 63 for( sal_Int32 i = 0; i < aSequ.getLength(); i++ ) 64 xNewKey->createKey( pArray[i] ); 65 66 return sal_True; 67 } 68 catch( registry::InvalidRegistryException& ) 69 { 70 OSL_ENSURE( sal_False, "### InvalidRegistryException!" ); 71 } 72 } 73 return sal_False; 74 } 75 76 void * SAL_CALL component_getFactory( 77 const sal_Char * pImplName, void * pServiceManager, void * /*pRegistryKey*/ ) 78 { 79 void* pRet = 0; 80 81 if ( pServiceManager && 82 OUString::createFromAscii( pImplName ) == SampleAddIn::getImplementationName_Static() ) 83 { 84 uno::Reference< lang::XSingleServiceFactory> xFactory( cppu::createSingleFactory( 85 reinterpret_cast<lang::XMultiServiceFactory*>( pServiceManager ), 86 SampleAddIn::getImplementationName_Static(), 87 SampleAddIn_CreateInstance, 88 SampleAddIn::getSupportedServiceNames_Static() ) ); 89 90 if( xFactory.is()) 91 { 92 xFactory->acquire(); 93 pRet = xFactory.get(); 94 } 95 } 96 97 return pRet; 98 } 99 100 } // extern C 101 102 103 // -------------------- 104 // class SampleAddIn 105 // -------------------- 106 107 SampleAddIn::SampleAddIn() 108 { 109 110 } 111 112 SampleAddIn::~SampleAddIn() 113 {} 114 115 116 // this functionality should be provided by the chart API some day 117 sal_Bool SampleAddIn::getLogicalPosition( uno::Reference< drawing::XShape >& xAxis, 118 double fValue, 119 sal_Bool bVertical, 120 awt::Point& aOutPosition ) 121 { 122 sal_Bool bRet = sal_False; 123 124 if( xAxis.is()) 125 { 126 awt::Size aSize = xAxis->getSize(); 127 sal_Int32 nLength = bVertical? aSize.Height: aSize.Width; 128 129 uno::Reference< beans::XPropertySet > xProp( xAxis, uno::UNO_QUERY ); 130 if( xProp.is()) 131 { 132 try 133 { 134 double fMin(0.0), fMax(0.0); 135 uno::Any aAny = xProp->getPropertyValue( OUString::createFromAscii( "Min" )); 136 aAny >>= fMin; 137 aAny = xProp->getPropertyValue( OUString::createFromAscii( "Max" )); 138 aAny >>= fMax; 139 140 double fRange = fMax - fMin; 141 if( fMin <= fValue && fValue <= fMax && 142 fRange != 0.0 ) 143 { 144 double fPercentage = (fValue - fMin) / fRange; 145 awt::Point aPos = xAxis->getPosition(); 146 147 if( bVertical ) 148 { 149 aOutPosition.X = aPos.X; 150 aOutPosition.Y = static_cast<sal_Int32>(aPos.Y + nLength * (1.0 - fPercentage)); // y scale goes from top to bottom 151 } 152 else 153 { 154 aOutPosition.X = static_cast<sal_Int32>(aPos.X + nLength * fPercentage); 155 aOutPosition.Y = aPos.Y; 156 } 157 bRet = sal_True; 158 } 159 } 160 catch( beans::UnknownPropertyException ) 161 { 162 // the shape xAxis was no chart axis 163 } 164 } 165 } 166 167 return bRet; 168 } 169 170 OUString SampleAddIn::getImplementationName_Static() 171 { 172 return OUString::createFromAscii( "SampleAddIn" ); 173 } 174 175 uno::Sequence< ::rtl::OUString > SampleAddIn::getSupportedServiceNames_Static() 176 { 177 uno::Sequence< OUString > aSeq( 4 ); 178 179 aSeq[ 0 ] = OUString::createFromAscii( "com.sun.star.chart.ChartAxisXSupplier" ); 180 aSeq[ 1 ] = OUString::createFromAscii( "com.sun.star.chart.ChartAxisYSupplier" ); 181 aSeq[ 2 ] = OUString::createFromAscii( "com.sun.star.chart.Diagram" ); 182 aSeq[ 3 ] = OUString::createFromAscii( "com.sun.star.chart.SampleAddIn" ); 183 184 return aSeq; 185 } 186 187 uno::Reference< uno::XInterface > SAL_CALL SampleAddIn_CreateInstance( 188 const uno::Reference< lang::XMultiServiceFactory >& ) 189 { 190 uno::Reference< uno::XInterface > xInst = (cppu::OWeakObject*)new SampleAddIn(); 191 192 return xInst; 193 } 194 195 // implementation of interface methods 196 197 // XInitialization 198 void SAL_CALL SampleAddIn::initialize( const uno::Sequence< uno::Any >& aArguments ) 199 throw( uno::Exception, uno::RuntimeException ) 200 { 201 // first argument should be the XChartDocument 202 OSL_ENSURE( aArguments.getLength() > 0, "Please initialize Chart AddIn with ChartDocument!" ); 203 204 if( aArguments.getLength()) 205 { 206 aArguments[ 0 ] >>= mxChartDoc; 207 OSL_ENSURE( mxChartDoc.is(), "First argument in initialization is not an XChartDocument!" ); 208 209 // set XY chart as base type to be drawn 210 uno::Reference< beans::XPropertySet > xDocProp( mxChartDoc, uno::UNO_QUERY ); 211 if( xDocProp.is()) 212 { 213 uno::Any aBaseType; 214 aBaseType <<= rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart.XYDiagram" )); 215 try 216 { 217 xDocProp->setPropertyValue( rtl::OUString::createFromAscii( "BaseDiagram" ), aBaseType ); 218 } 219 catch( ... ) 220 {} 221 } 222 223 // change background of plot area to light blue 224 uno::Reference< chart::X3DDisplay > xWallSupplier( mxChartDoc->getDiagram(), uno::UNO_QUERY ); 225 if( xWallSupplier.is()) 226 { 227 uno::Reference< beans::XPropertySet > xDiaProp( xWallSupplier->getWall(), uno::UNO_QUERY ); 228 uno::Reference< beans::XPropertySet > xLegendProp( mxChartDoc->getLegend(), uno::UNO_QUERY ); 229 if( xDiaProp.is() && 230 xLegendProp.is()) 231 { 232 uno::Any aAny; 233 aAny <<= (sal_Int32)( 0xe0e0f0 ); 234 xDiaProp->setPropertyValue( OUString::createFromAscii( "FillColor" ), aAny ); 235 xLegendProp->setPropertyValue( OUString::createFromAscii( "FillColor" ), aAny ); 236 } 237 } 238 } 239 } 240 241 // XRefreshable 242 /******************************************************************************** 243 * 244 * The method refresh is the most important method - here all objects that 245 * are necessary for the chart are created 246 * 247 * in the first implementation you will have to insert everything in this 248 * routine - all old objects are deleted beforehand 249 * 250 ********************************************************************************/ 251 void SAL_CALL SampleAddIn::refresh() throw( uno::RuntimeException ) 252 { 253 if( ! mxChartDoc.is()) 254 return; 255 256 // first of all get the draw page 257 uno::Reference< drawing::XDrawPageSupplier > xPageSupp( mxChartDoc, uno::UNO_QUERY ); 258 uno::Reference< lang::XMultiServiceFactory > xFactory( mxChartDoc, uno::UNO_QUERY ); 259 if( xPageSupp.is() && 260 xFactory.is() ) 261 { 262 uno::Reference< drawing::XDrawPage > xPage = xPageSupp->getDrawPage(); 263 if( xPage.is()) 264 { 265 // now we have the page to insert objects 266 267 // add a horizontal line at the middle value of the first series 268 // ------------------------------------------------------------- 269 270 271 // get the logical position from the coordinate 272 // get x- and y-axis 273 uno::Reference< drawing::XShape > xYAxisShape( getYAxis(), uno::UNO_QUERY ); 274 uno::Reference< drawing::XShape > xXAxisShape( getXAxis(), uno::UNO_QUERY ); 275 276 if( xXAxisShape.is() && 277 xYAxisShape.is() ) 278 { 279 // create line first time 280 if( ! mxMyRedLine.is()) 281 { 282 mxMyRedLine = uno::Reference< drawing::XShape >( 283 xFactory->createInstance( OUString::createFromAscii( "com.sun.star.drawing.LineShape" )), 284 uno::UNO_QUERY ); 285 xPage->add( mxMyRedLine ); 286 287 // make line red and thick 288 uno::Reference< beans::XPropertySet > xShapeProp( mxMyRedLine, uno::UNO_QUERY ); 289 if( xShapeProp.is()) 290 { 291 uno::Any aColor, aWidth; 292 aColor <<= (sal_Int32)(0xe01010); 293 aWidth <<= (sal_Int32)(50); // 0.5 mm 294 try 295 { 296 xShapeProp->setPropertyValue( OUString::createFromAscii( "LineColor" ), aColor ); 297 xShapeProp->setPropertyValue( OUString::createFromAscii( "LineWidth" ), aWidth ); 298 } 299 catch( ... ) 300 {} 301 } 302 } 303 // create text object first time 304 if( ! mxMyText.is()) 305 { 306 mxMyText = uno::Reference< drawing::XShape >( 307 xFactory->createInstance( OUString::createFromAscii( "com.sun.star.drawing.TextShape" )), 308 uno::UNO_QUERY ); 309 xPage->add( mxMyText ); 310 311 // change text 312 OUString aText; 313 // if( maLocale.Language.equalsIgnoreCase( OUString::createFromAscii("DE"))) 314 // aText = OUString::createFromAscii( "Kleines Beispiel" ); 315 // else 316 aText = OUString::createFromAscii( "Little Example" ); 317 318 uno::Reference< beans::XPropertySet > xTextProp( mxMyText, uno::UNO_QUERY ); 319 if( xTextProp.is()) 320 { 321 uno::Any aTrueAny; 322 aTrueAny <<= (sal_Bool)(sal_True); 323 try 324 { 325 xTextProp->setPropertyValue( rtl::OUString::createFromAscii( "TextAutoGrowWidth" ), aTrueAny ); 326 } 327 catch( ... ) 328 {} 329 } 330 331 uno::Reference< text::XTextRange > xTextRange( mxMyText, uno::UNO_QUERY ); 332 if( xTextRange.is()) 333 { 334 xTextRange->setString( aText ); 335 } 336 } 337 338 339 // position line and text 340 341 // get the array. Note: the first dimension is the length 342 // of each series and the second one is the number of series 343 // this should be changed in the future 344 uno::Sequence< uno::Sequence< double > > aData; 345 uno::Reference< chart::XChartData > xData = mxChartDoc->getData(); 346 uno::Reference< chart::XChartDataArray > xDataArray( xData, uno::UNO_QUERY ); 347 if( xDataArray.is()) 348 aData = xDataArray->getData(); 349 350 // get row count == length of each series 351 sal_Int32 nSize = aData.getLength(); 352 sal_Int32 nMiddle = nSize / 2; 353 // get value for first series 354 double fMiddleVal = xData->getNotANumber(); // set to NaN 355 if( aData[ nMiddle ].getLength()) // we have at least one series 356 fMiddleVal = aData[ nMiddle ][ 0 ]; 357 358 awt::Point aPos; 359 getLogicalPosition( xYAxisShape, fMiddleVal, sal_True, aPos ); 360 awt::Size aSize = xXAxisShape->getSize(); 361 362 if( mxMyRedLine.is()) 363 { 364 awt::Point aEnd = aPos; 365 aEnd.X += aSize.Width; 366 367 uno::Sequence< uno::Sequence< awt::Point > > aPtSeq( 1 ); 368 aPtSeq[ 0 ].realloc( 2 ); 369 aPtSeq[ 0 ][ 0 ] = aPos; 370 aPtSeq[ 0 ][ 1 ] = aEnd; 371 372 uno::Reference< beans::XPropertySet > xShapeProp( mxMyRedLine, uno::UNO_QUERY ); 373 if( xShapeProp.is()) 374 { 375 uno::Any aAny; 376 aAny <<= aPtSeq; 377 xShapeProp->setPropertyValue( rtl::OUString::createFromAscii( "PolyPolygon" ), aAny ); 378 } 379 } 380 if( mxMyText.is()) 381 { 382 // put the text centered below the red line 383 aPos.X += ( aSize.Width - mxMyRedLine->getPosition().X ) / 2; 384 aPos.Y += 1000; 385 aPos.Y += static_cast<sal_Int32>(0.1 * xYAxisShape->getSize().Height); 386 mxMyText->setPosition( aPos ); 387 } 388 } 389 } 390 } 391 392 // set axis scale to 200 393 // uno::Reference< beans::XPropertySet > xXAxis( getXAxis(), uno::UNO_QUERY ); 394 // if( xXAxis.is()) 395 // { 396 // uno::Any aAny; 397 // aAny <<= (sal_Bool)(sal_False); 398 // xXAxis->setPropertyValue( rtl::OUString::createFromAscii( "AutoStepMain" ), 399 // aAny ); 400 // aAny <<= (double)(200.0); 401 // xXAxis->setPropertyValue( rtl::OUString::createFromAscii( "StepMain" ), 402 // aAny ); 403 // } 404 405 // try setting symbols 406 // uno::Reference< beans::XPropertySet > xProp = getDataRowProperties( 0 ); 407 // if( xProp.is()) 408 // { 409 // uno::Any aAny; 410 // aAny <<= (sal_Int32)(-1); 411 // xProp->setPropertyValue( OUString::createFromAscii( "SymbolType" ), aAny ); 412 // aAny <<= rtl::OUString::createFromAscii( "http://mib-1168/www/images/go.gif" ); 413 // xProp->setPropertyValue( OUString::createFromAscii( "SymbolBitmapURL" ), aAny ); 414 // } 415 } 416 417 void SAL_CALL SampleAddIn::addRefreshListener( const uno::Reference< util::XRefreshListener >& ) 418 throw( uno::RuntimeException ) 419 { 420 // not implemented - this is not necessary 421 // (this method exists just because the interface requires it) 422 } 423 424 void SAL_CALL SampleAddIn::removeRefreshListener( const uno::Reference< util::XRefreshListener >& ) 425 throw( uno::RuntimeException ) 426 { 427 // not implemented - this is not necessary 428 // (this method exists just because the interface requires it) 429 } 430 431 // XDiagram 432 OUString SAL_CALL SampleAddIn::getDiagramType() throw( uno::RuntimeException ) 433 { 434 return OUString::createFromAscii( "com.sun.star.chart.SampleDiagram" ); 435 } 436 437 // the following methods just delegate to the "parent diagram" (which in the future might no longer exist) 438 439 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getDataRowProperties( sal_Int32 nRow ) 440 throw( lang::IndexOutOfBoundsException, 441 uno::RuntimeException ) 442 { 443 if( mxChartDoc.is()) 444 { 445 uno::Reference< chart::XDiagram > xDia = mxChartDoc->getDiagram(); 446 if( xDia.is()) 447 return xDia->getDataRowProperties( nRow ); 448 } 449 450 return uno::Reference< beans::XPropertySet >(); 451 } 452 453 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getDataPointProperties( sal_Int32 nCol, sal_Int32 nRow ) 454 throw( lang::IndexOutOfBoundsException, 455 uno::RuntimeException ) 456 { 457 if( mxChartDoc.is()) 458 { 459 uno::Reference< chart::XDiagram > xDia = mxChartDoc->getDiagram(); 460 if( xDia.is()) 461 return xDia->getDataPointProperties( nCol, nRow ); 462 } 463 464 return uno::Reference< beans::XPropertySet >(); 465 } 466 467 // XShape ( ::XDiagram ) 468 awt::Size SAL_CALL SampleAddIn::getSize() 469 throw( uno::RuntimeException ) 470 { 471 if( mxChartDoc.is()) 472 { 473 uno::Reference< drawing::XShape > xShape( mxChartDoc->getDiagram(), uno::UNO_QUERY ); 474 if( xShape.is()) 475 return xShape->getSize(); 476 } 477 478 return awt::Size(); 479 } 480 481 void SAL_CALL SampleAddIn::setSize( const awt::Size& aSize ) 482 throw( beans::PropertyVetoException, uno::RuntimeException ) 483 { 484 if( mxChartDoc.is()) 485 { 486 uno::Reference< drawing::XShape > xShape( mxChartDoc->getDiagram(), uno::UNO_QUERY ); 487 if( xShape.is()) 488 xShape->setSize( aSize ); 489 } 490 } 491 492 awt::Point SAL_CALL SampleAddIn::getPosition() 493 throw( uno::RuntimeException ) 494 { 495 if( mxChartDoc.is()) 496 { 497 uno::Reference< drawing::XShape > xShape( mxChartDoc->getDiagram(), uno::UNO_QUERY ); 498 if( xShape.is()) 499 return xShape->getPosition(); 500 } 501 502 return awt::Point(); 503 } 504 505 void SAL_CALL SampleAddIn::setPosition( const awt::Point& aPos ) 506 throw( uno::RuntimeException ) 507 { 508 if( mxChartDoc.is()) 509 { 510 uno::Reference< drawing::XShape > xShape( mxChartDoc->getDiagram(), uno::UNO_QUERY ); 511 if( xShape.is()) 512 xShape->setPosition( aPos ); 513 } 514 } 515 516 // XShapeDescriptor ( ::XShape ::XDiagram ) 517 rtl::OUString SAL_CALL SampleAddIn::getShapeType() throw( com::sun::star::uno::RuntimeException ) 518 { 519 return OUString::createFromAscii( "com.sun.star.chart.SampleAddinShape" ); 520 } 521 522 // XAxisXSupplier 523 uno::Reference< drawing::XShape > SAL_CALL SampleAddIn::getXAxisTitle() 524 throw( uno::RuntimeException ) 525 { 526 if( mxChartDoc.is()) 527 { 528 uno::Reference< chart::XAxisXSupplier > xAxisSupp( mxChartDoc->getDiagram(), uno::UNO_QUERY ); 529 if( xAxisSupp.is()) 530 return xAxisSupp->getXAxisTitle(); 531 } 532 533 return uno::Reference< drawing::XShape >(); 534 } 535 536 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getXAxis() 537 throw( uno::RuntimeException ) 538 { 539 if( mxChartDoc.is()) 540 { 541 uno::Reference< chart::XAxisXSupplier > xAxisSupp( mxChartDoc->getDiagram(), uno::UNO_QUERY ); 542 if( xAxisSupp.is()) 543 return xAxisSupp->getXAxis(); 544 } 545 546 return uno::Reference< beans::XPropertySet >(); 547 } 548 549 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getXMainGrid() 550 throw( uno::RuntimeException ) 551 { 552 if( mxChartDoc.is()) 553 { 554 uno::Reference< chart::XAxisXSupplier > xAxisSupp( mxChartDoc->getDiagram(), uno::UNO_QUERY ); 555 if( xAxisSupp.is()) 556 return xAxisSupp->getXMainGrid(); 557 } 558 559 return uno::Reference< beans::XPropertySet >(); 560 } 561 562 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getXHelpGrid() 563 throw( uno::RuntimeException ) 564 { 565 if( mxChartDoc.is()) 566 { 567 uno::Reference< chart::XAxisXSupplier > xAxisSupp( mxChartDoc->getDiagram(), uno::UNO_QUERY ); 568 if( xAxisSupp.is()) 569 return xAxisSupp->getXHelpGrid(); 570 } 571 572 return uno::Reference< beans::XPropertySet >(); 573 } 574 575 // XAxisYSupplier 576 uno::Reference< drawing::XShape > SAL_CALL SampleAddIn::getYAxisTitle() 577 throw( uno::RuntimeException ) 578 { 579 if( mxChartDoc.is()) 580 { 581 uno::Reference< chart::XAxisYSupplier > xAxisSupp( mxChartDoc->getDiagram(), uno::UNO_QUERY ); 582 if( xAxisSupp.is()) 583 return xAxisSupp->getYAxisTitle(); 584 } 585 586 return uno::Reference< drawing::XShape >(); 587 } 588 589 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getYAxis() 590 throw( uno::RuntimeException ) 591 { 592 if( mxChartDoc.is()) 593 { 594 uno::Reference< chart::XAxisYSupplier > xAxisSupp( mxChartDoc->getDiagram(), uno::UNO_QUERY ); 595 if( xAxisSupp.is()) 596 return xAxisSupp->getYAxis(); 597 } 598 599 return uno::Reference< beans::XPropertySet >(); 600 } 601 602 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getYMainGrid() 603 throw( uno::RuntimeException ) 604 { 605 if( mxChartDoc.is()) 606 { 607 uno::Reference< chart::XAxisYSupplier > xAxisSupp( mxChartDoc->getDiagram(), uno::UNO_QUERY ); 608 if( xAxisSupp.is()) 609 return xAxisSupp->getYMainGrid(); 610 } 611 612 return uno::Reference< beans::XPropertySet >(); 613 } 614 615 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getYHelpGrid() 616 throw( uno::RuntimeException ) 617 { 618 if( mxChartDoc.is()) 619 { 620 uno::Reference< chart::XAxisYSupplier > xAxisSupp( mxChartDoc->getDiagram(), uno::UNO_QUERY ); 621 if( xAxisSupp.is()) 622 return xAxisSupp->getYHelpGrid(); 623 } 624 625 return uno::Reference< beans::XPropertySet >(); 626 } 627 628 // XStatisticDisplay 629 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getUpBar() 630 throw( uno::RuntimeException ) 631 { 632 if( mxChartDoc.is()) 633 { 634 uno::Reference< chart::XStatisticDisplay > xStatDisp( mxChartDoc->getDiagram(), uno::UNO_QUERY ); 635 if( xStatDisp.is()) 636 return xStatDisp->getUpBar(); 637 } 638 639 return uno::Reference< beans::XPropertySet >(); 640 } 641 642 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getDownBar() 643 throw( uno::RuntimeException ) 644 { 645 if( mxChartDoc.is()) 646 { 647 uno::Reference< chart::XStatisticDisplay > xStatDisp( mxChartDoc->getDiagram(), uno::UNO_QUERY ); 648 if( xStatDisp.is()) 649 return xStatDisp->getDownBar(); 650 } 651 652 return uno::Reference< beans::XPropertySet >(); 653 } 654 655 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getMinMaxLine() 656 throw( uno::RuntimeException ) 657 { 658 if( mxChartDoc.is()) 659 { 660 uno::Reference< chart::XStatisticDisplay > xStatDisp( mxChartDoc->getDiagram(), uno::UNO_QUERY ); 661 if( xStatDisp.is()) 662 return xStatDisp->getMinMaxLine(); 663 } 664 665 return uno::Reference< beans::XPropertySet >(); 666 } 667 668 // XServiceName 669 OUString SAL_CALL SampleAddIn::getServiceName() throw( uno::RuntimeException ) 670 { 671 return OUString::createFromAscii( "com.sun.star.chart.SampleAddIn" ); 672 } 673 674 // XServiceInfo 675 OUString SAL_CALL SampleAddIn::getImplementationName() throw( uno::RuntimeException ) 676 { 677 return getImplementationName_Static(); 678 } 679 680 sal_Bool SAL_CALL SampleAddIn::supportsService( const OUString& ServiceName ) 681 throw( uno::RuntimeException ) 682 { 683 uno::Sequence< OUString > aServiceSeq = getSupportedServiceNames_Static(); 684 685 sal_Int32 nLength = aServiceSeq.getLength(); 686 for( sal_Int32 i=0; i < nLength; i++ ) 687 { 688 if( ServiceName.equals( aServiceSeq[ i ] )) 689 return sal_True; 690 } 691 692 return sal_False; 693 } 694 695 uno::Sequence< OUString > SAL_CALL SampleAddIn::getSupportedServiceNames() 696 throw( uno::RuntimeException ) 697 { 698 return getSupportedServiceNames_Static(); 699 } 700 701 // XLocalizable 702 void SAL_CALL SampleAddIn::setLocale( const lang::Locale& eLocale ) 703 throw( uno::RuntimeException ) 704 { 705 maLocale = eLocale; 706 } 707 708 lang::Locale SAL_CALL SampleAddIn::getLocale() 709 throw( uno::RuntimeException ) 710 { 711 return maLocale; 712 } 713