xref: /trunk/main/chart2/workbench/addin/sampleaddin.cxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
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 
component_getImplementationEnvironment(const sal_Char ** ppEnvTypeName,uno_Environment **)41 void SAL_CALL component_getImplementationEnvironment(
42     const sal_Char ** ppEnvTypeName, uno_Environment ** /*ppEnv*/ )
43 {
44     *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
45 }
46 
component_writeInfo(void *,registry::XRegistryKey * pRegistryKey)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 
component_getFactory(const sal_Char * pImplName,void * pServiceManager,void *)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 
SampleAddIn()107 SampleAddIn::SampleAddIn()
108 {
109 
110 }
111 
~SampleAddIn()112 SampleAddIn::~SampleAddIn()
113 {}
114 
115 
116 // this functionality should be provided by the chart API some day
getLogicalPosition(uno::Reference<drawing::XShape> & xAxis,double fValue,sal_Bool bVertical,awt::Point & aOutPosition)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 
getImplementationName_Static()170 OUString SampleAddIn::getImplementationName_Static()
171 {
172     return OUString::createFromAscii( "SampleAddIn" );
173 }
174 
getSupportedServiceNames_Static()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 
SampleAddIn_CreateInstance(const uno::Reference<lang::XMultiServiceFactory> &)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
initialize(const uno::Sequence<uno::Any> & aArguments)198 void SAL_CALL SampleAddIn::initialize( const uno::Sequence< uno::Any >& aArguments )
199 {
200     // first argument should be the XChartDocument
201     OSL_ENSURE( aArguments.getLength() > 0, "Please initialize Chart AddIn with ChartDocument!" );
202 
203     if( aArguments.getLength())
204     {
205         aArguments[ 0 ] >>= mxChartDoc;
206         OSL_ENSURE( mxChartDoc.is(), "First argument in initialization is not an XChartDocument!" );
207 
208         // set XY chart as base type to be drawn
209         uno::Reference< beans::XPropertySet > xDocProp( mxChartDoc, uno::UNO_QUERY );
210         if( xDocProp.is())
211         {
212             uno::Any aBaseType;
213             aBaseType <<= rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart.XYDiagram" ));
214             try
215             {
216                 xDocProp->setPropertyValue( rtl::OUString::createFromAscii( "BaseDiagram" ), aBaseType );
217             }
218             catch( ... )
219             {}
220         }
221 
222         // change background of plot area to light blue
223         uno::Reference< chart::X3DDisplay > xWallSupplier( mxChartDoc->getDiagram(), uno::UNO_QUERY );
224         if( xWallSupplier.is())
225         {
226             uno::Reference< beans::XPropertySet > xDiaProp( xWallSupplier->getWall(), uno::UNO_QUERY );
227             uno::Reference< beans::XPropertySet > xLegendProp( mxChartDoc->getLegend(), uno::UNO_QUERY );
228             if( xDiaProp.is() &&
229                 xLegendProp.is())
230             {
231                 uno::Any aAny;
232                 aAny <<= (sal_Int32)( 0xe0e0f0 );
233                 xDiaProp->setPropertyValue( OUString::createFromAscii( "FillColor" ), aAny );
234                 xLegendProp->setPropertyValue( OUString::createFromAscii( "FillColor" ), aAny );
235             }
236         }
237     }
238 }
239 
240 // XRefreshable
241 /********************************************************************************
242  *
243  * The method refresh is the most important method - here all objects that
244  * are necessary for the chart are created
245  *
246  * in the first implementation you will have to insert everything in this
247  * routine - all old objects are deleted beforehand
248  *
249  ********************************************************************************/
refresh()250 void SAL_CALL SampleAddIn::refresh()
251 {
252     if( ! mxChartDoc.is())
253         return;
254 
255     // first of all get the draw page
256     uno::Reference< drawing::XDrawPageSupplier > xPageSupp( mxChartDoc, uno::UNO_QUERY );
257     uno::Reference< lang::XMultiServiceFactory > xFactory( mxChartDoc, uno::UNO_QUERY );
258     if( xPageSupp.is() &&
259         xFactory.is() )
260     {
261         uno::Reference< drawing::XDrawPage > xPage = xPageSupp->getDrawPage();
262         if( xPage.is())
263         {
264             // now we have the page to insert objects
265 
266             // add a horizontal line at the middle value of the first series
267             // -------------------------------------------------------------
268 
269 
270             // get the logical position from the coordinate
271             // get x- and y-axis
272             uno::Reference< drawing::XShape > xYAxisShape( getYAxis(), uno::UNO_QUERY );
273             uno::Reference< drawing::XShape > xXAxisShape( getXAxis(), uno::UNO_QUERY );
274 
275             if( xXAxisShape.is() &&
276                 xYAxisShape.is() )
277             {
278                 // create line first time
279                 if( ! mxMyRedLine.is())
280                 {
281                     mxMyRedLine = uno::Reference< drawing::XShape >(
282                         xFactory->createInstance( OUString::createFromAscii( "com.sun.star.drawing.LineShape" )),
283                         uno::UNO_QUERY );
284                     xPage->add( mxMyRedLine );
285 
286                     // make line red and thick
287                     uno::Reference< beans::XPropertySet > xShapeProp( mxMyRedLine, uno::UNO_QUERY );
288                     if( xShapeProp.is())
289                     {
290                         uno::Any aColor, aWidth;
291                         aColor <<= (sal_Int32)(0xe01010);
292                         aWidth <<= (sal_Int32)(50);         // 0.5 mm
293                         try
294                         {
295                             xShapeProp->setPropertyValue( OUString::createFromAscii( "LineColor" ), aColor );
296                             xShapeProp->setPropertyValue( OUString::createFromAscii( "LineWidth" ), aWidth );
297                         }
298                         catch( ... )
299                         {}
300                     }
301                 }
302                 // create text object first time
303                 if( ! mxMyText.is())
304                 {
305                     mxMyText = uno::Reference< drawing::XShape >(
306                         xFactory->createInstance( OUString::createFromAscii( "com.sun.star.drawing.TextShape" )),
307                         uno::UNO_QUERY );
308                     xPage->add( mxMyText );
309 
310                     // change text
311                     OUString aText;
312 //                  if( maLocale.Language.equalsIgnoreCase( OUString::createFromAscii("DE")))
313 //                      aText = OUString::createFromAscii( "Kleines Beispiel" );
314 //                  else
315                         aText = OUString::createFromAscii( "Little Example" );
316 
317                     uno::Reference< beans::XPropertySet > xTextProp( mxMyText, uno::UNO_QUERY );
318                     if( xTextProp.is())
319                     {
320                         uno::Any aTrueAny;
321                         aTrueAny <<= (sal_Bool)(sal_True);
322                         try
323                         {
324                             xTextProp->setPropertyValue( rtl::OUString::createFromAscii( "TextAutoGrowWidth" ), aTrueAny );
325                         }
326                         catch( ... )
327                         {}
328                     }
329 
330                     uno::Reference< text::XTextRange > xTextRange( mxMyText, uno::UNO_QUERY );
331                     if( xTextRange.is())
332                     {
333                         xTextRange->setString( aText );
334                     }
335                 }
336 
337 
338                 // position line and text
339 
340                 // get the array. Note: the first dimension is the length
341                 // of each series and the second one is the number of series
342                 // this should be changed in the future
343                 uno::Sequence< uno::Sequence< double > > aData;
344                 uno::Reference< chart::XChartData > xData = mxChartDoc->getData();
345                 uno::Reference< chart::XChartDataArray > xDataArray( xData, uno::UNO_QUERY );
346                 if( xDataArray.is())
347                     aData = xDataArray->getData();
348 
349                 // get row count == length of each series
350                 sal_Int32 nSize = aData.getLength();
351                 sal_Int32 nMiddle = nSize / 2;
352                 // get value for first series
353                 double fMiddleVal = xData->getNotANumber();     // set to NaN
354                 if( aData[ nMiddle ].getLength())               // we have at least one series
355                     fMiddleVal = aData[ nMiddle ][ 0 ];
356 
357                 awt::Point aPos;
358                 getLogicalPosition( xYAxisShape, fMiddleVal, sal_True, aPos );
359                 awt::Size aSize = xXAxisShape->getSize();
360 
361                 if( mxMyRedLine.is())
362                 {
363                     awt::Point aEnd = aPos;
364                     aEnd.X += aSize.Width;
365 
366                     uno::Sequence< uno::Sequence< awt::Point > > aPtSeq( 1 );
367                     aPtSeq[ 0 ].realloc( 2 );
368                     aPtSeq[ 0 ][ 0 ] = aPos;
369                     aPtSeq[ 0 ][ 1 ] = aEnd;
370 
371                     uno::Reference< beans::XPropertySet > xShapeProp( mxMyRedLine, uno::UNO_QUERY );
372                     if( xShapeProp.is())
373                     {
374                         uno::Any aAny;
375                         aAny <<= aPtSeq;
376                         xShapeProp->setPropertyValue( rtl::OUString::createFromAscii( "PolyPolygon" ), aAny );
377                     }
378                 }
379                 if( mxMyText.is())
380                 {
381                     // put the text centered below the red line
382                     aPos.X += ( aSize.Width - mxMyRedLine->getPosition().X ) / 2;
383                     aPos.Y += 1000;
384                     aPos.Y += static_cast<sal_Int32>(0.1 * xYAxisShape->getSize().Height);
385                     mxMyText->setPosition( aPos );
386                 }
387             }
388         }
389     }
390 
391     // set axis scale to 200
392 //      uno::Reference< beans::XPropertySet > xXAxis( getXAxis(), uno::UNO_QUERY );
393 //      if( xXAxis.is())
394 //      {
395 //          uno::Any aAny;
396 //          aAny <<= (sal_Bool)(sal_False);
397 //          xXAxis->setPropertyValue( rtl::OUString::createFromAscii( "AutoStepMain" ),
398 //                                    aAny );
399 //          aAny <<= (double)(200.0);
400 //          xXAxis->setPropertyValue( rtl::OUString::createFromAscii( "StepMain" ),
401 //                                    aAny );
402 //      }
403 
404 // try setting symbols
405 //      uno::Reference< beans::XPropertySet > xProp = getDataRowProperties( 0 );
406 //      if( xProp.is())
407 //      {
408 //          uno::Any aAny;
409 //          aAny <<= (sal_Int32)(-1);
410 //          xProp->setPropertyValue( OUString::createFromAscii( "SymbolType" ), aAny );
411 //          aAny <<= rtl::OUString::createFromAscii( "http://mib-1168/www/images/go.gif" );
412 //          xProp->setPropertyValue( OUString::createFromAscii( "SymbolBitmapURL" ), aAny );
413 //      }
414 }
415 
addRefreshListener(const uno::Reference<util::XRefreshListener> &)416 void SAL_CALL SampleAddIn::addRefreshListener( const uno::Reference< util::XRefreshListener >&  )
417 {
418     // not implemented - this is not necessary
419     // (this method exists just because the interface requires it)
420 }
421 
removeRefreshListener(const uno::Reference<util::XRefreshListener> &)422 void SAL_CALL SampleAddIn::removeRefreshListener( const uno::Reference< util::XRefreshListener >&  )
423 {
424     // not implemented - this is not necessary
425     // (this method exists just because the interface requires it)
426 }
427 
428 // XDiagram
getDiagramType()429 OUString SAL_CALL SampleAddIn::getDiagramType()
430 {
431     return OUString::createFromAscii( "com.sun.star.chart.SampleDiagram" );
432 }
433 
434 // the following methods just delegate to the "parent diagram" (which in the future might no longer exist)
435 
getDataRowProperties(sal_Int32 nRow)436 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getDataRowProperties( sal_Int32 nRow )
437 {
438     if( mxChartDoc.is())
439     {
440         uno::Reference< chart::XDiagram > xDia = mxChartDoc->getDiagram();
441         if( xDia.is())
442             return xDia->getDataRowProperties( nRow );
443     }
444 
445     return uno::Reference< beans::XPropertySet >();
446 }
447 
getDataPointProperties(sal_Int32 nCol,sal_Int32 nRow)448 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getDataPointProperties( sal_Int32 nCol, sal_Int32 nRow )
449 {
450     if( mxChartDoc.is())
451     {
452         uno::Reference< chart::XDiagram > xDia = mxChartDoc->getDiagram();
453         if( xDia.is())
454             return xDia->getDataPointProperties( nCol, nRow );
455     }
456 
457     return uno::Reference< beans::XPropertySet >();
458 }
459 
460 // XShape ( ::XDiagram )
getSize()461 awt::Size SAL_CALL SampleAddIn::getSize()
462 {
463     if( mxChartDoc.is())
464     {
465         uno::Reference< drawing::XShape > xShape( mxChartDoc->getDiagram(), uno::UNO_QUERY );
466         if( xShape.is())
467             return xShape->getSize();
468     }
469 
470     return awt::Size();
471 }
472 
setSize(const awt::Size & aSize)473 void SAL_CALL SampleAddIn::setSize( const awt::Size& aSize )
474 {
475     if( mxChartDoc.is())
476     {
477         uno::Reference< drawing::XShape > xShape( mxChartDoc->getDiagram(), uno::UNO_QUERY );
478         if( xShape.is())
479             xShape->setSize( aSize );
480     }
481 }
482 
getPosition()483 awt::Point SAL_CALL SampleAddIn::getPosition()
484 {
485     if( mxChartDoc.is())
486     {
487         uno::Reference< drawing::XShape > xShape( mxChartDoc->getDiagram(), uno::UNO_QUERY );
488         if( xShape.is())
489             return xShape->getPosition();
490     }
491 
492     return awt::Point();
493 }
494 
setPosition(const awt::Point & aPos)495 void SAL_CALL SampleAddIn::setPosition( const awt::Point& aPos )
496 {
497     if( mxChartDoc.is())
498     {
499         uno::Reference< drawing::XShape > xShape( mxChartDoc->getDiagram(), uno::UNO_QUERY );
500         if( xShape.is())
501             xShape->setPosition( aPos );
502     }
503 }
504 
505 // XShapeDescriptor ( ::XShape ::XDiagram )
getShapeType()506 rtl::OUString SAL_CALL SampleAddIn::getShapeType()
507 {
508     return OUString::createFromAscii( "com.sun.star.chart.SampleAddinShape" );
509 }
510 
511 // XAxisXSupplier
getXAxisTitle()512 uno::Reference< drawing::XShape > SAL_CALL SampleAddIn::getXAxisTitle()
513 {
514     if( mxChartDoc.is())
515     {
516         uno::Reference< chart::XAxisXSupplier > xAxisSupp( mxChartDoc->getDiagram(), uno::UNO_QUERY );
517         if( xAxisSupp.is())
518             return xAxisSupp->getXAxisTitle();
519     }
520 
521     return uno::Reference< drawing::XShape >();
522 }
523 
getXAxis()524 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getXAxis()
525 {
526     if( mxChartDoc.is())
527     {
528         uno::Reference< chart::XAxisXSupplier > xAxisSupp( mxChartDoc->getDiagram(), uno::UNO_QUERY );
529         if( xAxisSupp.is())
530             return xAxisSupp->getXAxis();
531     }
532 
533     return uno::Reference< beans::XPropertySet >();
534 }
535 
getXMainGrid()536 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getXMainGrid()
537 {
538     if( mxChartDoc.is())
539     {
540         uno::Reference< chart::XAxisXSupplier > xAxisSupp( mxChartDoc->getDiagram(), uno::UNO_QUERY );
541         if( xAxisSupp.is())
542             return xAxisSupp->getXMainGrid();
543     }
544 
545     return uno::Reference< beans::XPropertySet >();
546 }
547 
getXHelpGrid()548 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getXHelpGrid()
549 {
550     if( mxChartDoc.is())
551     {
552         uno::Reference< chart::XAxisXSupplier > xAxisSupp( mxChartDoc->getDiagram(), uno::UNO_QUERY );
553         if( xAxisSupp.is())
554             return xAxisSupp->getXHelpGrid();
555     }
556 
557     return uno::Reference< beans::XPropertySet >();
558 }
559 
560 // XAxisYSupplier
getYAxisTitle()561 uno::Reference< drawing::XShape > SAL_CALL SampleAddIn::getYAxisTitle()
562 {
563     if( mxChartDoc.is())
564     {
565         uno::Reference< chart::XAxisYSupplier > xAxisSupp( mxChartDoc->getDiagram(), uno::UNO_QUERY );
566         if( xAxisSupp.is())
567             return xAxisSupp->getYAxisTitle();
568     }
569 
570     return uno::Reference< drawing::XShape >();
571 }
572 
getYAxis()573 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getYAxis()
574 {
575     if( mxChartDoc.is())
576     {
577         uno::Reference< chart::XAxisYSupplier > xAxisSupp( mxChartDoc->getDiagram(), uno::UNO_QUERY );
578         if( xAxisSupp.is())
579             return xAxisSupp->getYAxis();
580     }
581 
582     return uno::Reference< beans::XPropertySet >();
583 }
584 
getYMainGrid()585 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getYMainGrid()
586 {
587     if( mxChartDoc.is())
588     {
589         uno::Reference< chart::XAxisYSupplier > xAxisSupp( mxChartDoc->getDiagram(), uno::UNO_QUERY );
590         if( xAxisSupp.is())
591             return xAxisSupp->getYMainGrid();
592     }
593 
594     return uno::Reference< beans::XPropertySet >();
595 }
596 
getYHelpGrid()597 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getYHelpGrid()
598 {
599     if( mxChartDoc.is())
600     {
601         uno::Reference< chart::XAxisYSupplier > xAxisSupp( mxChartDoc->getDiagram(), uno::UNO_QUERY );
602         if( xAxisSupp.is())
603             return xAxisSupp->getYHelpGrid();
604     }
605 
606     return uno::Reference< beans::XPropertySet >();
607 }
608 
609 // XStatisticDisplay
getUpBar()610 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getUpBar()
611 {
612     if( mxChartDoc.is())
613     {
614         uno::Reference< chart::XStatisticDisplay > xStatDisp( mxChartDoc->getDiagram(), uno::UNO_QUERY );
615         if( xStatDisp.is())
616             return xStatDisp->getUpBar();
617     }
618 
619     return uno::Reference< beans::XPropertySet >();
620 }
621 
getDownBar()622 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getDownBar()
623 {
624     if( mxChartDoc.is())
625     {
626         uno::Reference< chart::XStatisticDisplay > xStatDisp( mxChartDoc->getDiagram(), uno::UNO_QUERY );
627         if( xStatDisp.is())
628             return xStatDisp->getDownBar();
629     }
630 
631     return uno::Reference< beans::XPropertySet >();
632 }
633 
getMinMaxLine()634 uno::Reference< beans::XPropertySet > SAL_CALL SampleAddIn::getMinMaxLine()
635 {
636     if( mxChartDoc.is())
637     {
638         uno::Reference< chart::XStatisticDisplay > xStatDisp( mxChartDoc->getDiagram(), uno::UNO_QUERY );
639         if( xStatDisp.is())
640             return xStatDisp->getMinMaxLine();
641     }
642 
643     return uno::Reference< beans::XPropertySet >();
644 }
645 
646 // XServiceName
getServiceName()647 OUString SAL_CALL SampleAddIn::getServiceName()
648 {
649     return OUString::createFromAscii( "com.sun.star.chart.SampleAddIn" );
650 }
651 
652 // XServiceInfo
getImplementationName()653 OUString SAL_CALL SampleAddIn::getImplementationName()
654 {
655     return getImplementationName_Static();
656 }
657 
supportsService(const OUString & ServiceName)658 sal_Bool SAL_CALL SampleAddIn::supportsService( const OUString& ServiceName )
659 {
660     uno::Sequence< OUString > aServiceSeq = getSupportedServiceNames_Static();
661 
662     sal_Int32 nLength = aServiceSeq.getLength();
663     for( sal_Int32 i=0; i < nLength; i++ )
664     {
665         if( ServiceName.equals( aServiceSeq[ i ] ))
666             return sal_True;
667     }
668 
669     return sal_False;
670 }
671 
getSupportedServiceNames()672 uno::Sequence< OUString > SAL_CALL SampleAddIn::getSupportedServiceNames()
673 {
674     return getSupportedServiceNames_Static();
675 }
676 
677 // XLocalizable
setLocale(const lang::Locale & eLocale)678 void SAL_CALL SampleAddIn::setLocale( const lang::Locale& eLocale )
679 {
680     maLocale = eLocale;
681 }
682 
getLocale()683 lang::Locale SAL_CALL SampleAddIn::getLocale()
684 {
685     return maLocale;
686 }
687