1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #include "DataSeries.hxx"
21 #include "DataSeriesProperties.hxx"
22 #include "DataPointProperties.hxx"
23 #include "CharacterProperties.hxx"
24 #include "UserDefinedProperties.hxx"
25 #include "DataPoint.hxx"
27 #include "DataSeriesHelper.hxx"
28 #include "ContainerHelper.hxx"
29 #include "CloneHelper.hxx"
30 #include "ModifyListenerHelper.hxx"
31 #include "EventListenerHelper.hxx"
32 #include <cppuhelper/supportsservice.hxx>
36 using namespace ::com::sun::star
;
38 using ::com::sun::star::beans::Property
;
39 using ::com::sun::star::uno::Sequence
;
40 using ::com::sun::star::uno::Reference
;
41 using ::com::sun::star::uno::Any
;
42 using ::osl::MutexGuard
;
47 struct StaticDataSeriesDefaults
: public rtl::StaticWithInit
< ::chart::tPropertyValueMap
, StaticDataSeriesDefaults
>
49 ::chart::tPropertyValueMap
operator()()
51 ::chart::tPropertyValueMap aStaticDefaults
;
52 ::chart::DataSeriesProperties::AddDefaultsToMap( aStaticDefaults
);
53 ::chart::CharacterProperties::AddDefaultsToMap( aStaticDefaults
);
54 float fDefaultCharHeight
= 10.0;
55 ::chart::PropertyHelper::setPropertyValue( aStaticDefaults
, ::chart::CharacterProperties::PROP_CHAR_CHAR_HEIGHT
, fDefaultCharHeight
);
56 ::chart::PropertyHelper::setPropertyValue( aStaticDefaults
, ::chart::CharacterProperties::PROP_CHAR_ASIAN_CHAR_HEIGHT
, fDefaultCharHeight
);
57 ::chart::PropertyHelper::setPropertyValue( aStaticDefaults
, ::chart::CharacterProperties::PROP_CHAR_COMPLEX_CHAR_HEIGHT
, fDefaultCharHeight
);
58 return aStaticDefaults
;
62 struct StaticDataSeriesInfoHelper
: public rtl::StaticWithInit
< ::cppu::OPropertyArrayHelper
, StaticDataSeriesInfoHelper
, StaticDataSeriesInfoHelper
, uno::Sequence
< Property
> >
64 uno::Sequence
< Property
> operator()()
66 ::std::vector
< ::com::sun::star::beans::Property
> aProperties
;
67 ::chart::DataSeriesProperties::AddPropertiesToVector( aProperties
);
68 ::chart::CharacterProperties::AddPropertiesToVector( aProperties
);
69 ::chart::UserDefinedProperties::AddPropertiesToVector( aProperties
);
71 ::std::sort( aProperties
.begin(), aProperties
.end(),
72 ::chart::PropertyNameLess() );
74 return ::chart::ContainerHelper::ContainerToSequence( aProperties
);
78 struct StaticDataSeriesInfo
: public rtl::StaticWithInit
< uno::Reference
< beans::XPropertySetInfo
>, StaticDataSeriesInfo
>
80 uno::Reference
< beans::XPropertySetInfo
> operator()()
82 return ::cppu::OPropertySetHelper::createPropertySetInfo(StaticDataSeriesInfoHelper::get() );
87 const uno::Reference
< uno::XInterface
> & xChildInterface
,
88 const uno::Reference
< uno::XInterface
> & xParentInterface
)
90 uno::Reference
< container::XChild
> xChild( xChildInterface
, uno::UNO_QUERY
);
92 xChild
->setParent( xParentInterface
);
95 typedef ::std::map
< sal_Int32
, ::com::sun::star::uno::Reference
< ::com::sun::star::beans::XPropertySet
> >
98 void lcl_CloneAttributedDataPoints(
99 const lcl_tDataPointMap
& rSource
, lcl_tDataPointMap
& rDestination
,
100 const uno::Reference
< uno::XInterface
> & xSeries
)
102 for( lcl_tDataPointMap::const_iterator
aIt( rSource
.begin());
103 aIt
!= rSource
.end(); ++aIt
)
105 Reference
< beans::XPropertySet
> xPoint( (*aIt
).second
);
108 Reference
< util::XCloneable
> xCloneable( xPoint
, uno::UNO_QUERY
);
111 xPoint
.set( xCloneable
->createClone(), uno::UNO_QUERY
);
114 lcl_SetParent( xPoint
, xSeries
);
115 rDestination
.insert( lcl_tDataPointMap::value_type( (*aIt
).first
, xPoint
));
122 } // anonymous namespace
127 DataSeries::DataSeries( const uno::Reference
< uno::XComponentContext
> & xContext
) :
128 ::property::OPropertySet( m_aMutex
),
129 m_xContext( xContext
),
130 m_xModifyEventForwarder( ModifyListenerHelper::createModifyEventForwarder())
134 DataSeries::DataSeries( const DataSeries
& rOther
) :
136 impl::DataSeries_Base(),
137 ::property::OPropertySet( rOther
, m_aMutex
),
138 m_xContext( rOther
.m_xContext
),
139 m_xModifyEventForwarder( ModifyListenerHelper::createModifyEventForwarder())
141 if( ! rOther
.m_aDataSequences
.empty())
143 CloneHelper::CloneRefVector
< tDataSequenceContainer::value_type
>(
144 rOther
.m_aDataSequences
, m_aDataSequences
);
145 ModifyListenerHelper::addListenerToAllElements( m_aDataSequences
, m_xModifyEventForwarder
);
148 CloneHelper::CloneRefVector
< Reference
< chart2::XRegressionCurve
> >( rOther
.m_aRegressionCurves
, m_aRegressionCurves
);
149 ModifyListenerHelper::addListenerToAllElements( m_aRegressionCurves
, m_xModifyEventForwarder
);
151 // add as listener to XPropertySet properties
152 Reference
< beans::XPropertySet
> xPropertySet
;
155 getFastPropertyValue( aValue
, DataPointProperties::PROP_DATAPOINT_ERROR_BAR_X
);
156 if( ( aValue
>>= xPropertySet
)
157 && xPropertySet
.is())
158 ModifyListenerHelper::addListener( xPropertySet
, m_xModifyEventForwarder
);
160 getFastPropertyValue( aValue
, DataPointProperties::PROP_DATAPOINT_ERROR_BAR_Y
);
161 if( ( aValue
>>= xPropertySet
)
162 && xPropertySet
.is())
163 ModifyListenerHelper::addListener( xPropertySet
, m_xModifyEventForwarder
);
166 // late initialization to call after copy-constructing
167 void DataSeries::Init( const DataSeries
& rOther
)
169 if( ! rOther
.m_aDataSequences
.empty())
170 EventListenerHelper::addListenerToAllElements( m_aDataSequences
, this );
172 Reference
< uno::XInterface
> xThisInterface( static_cast< ::cppu::OWeakObject
* >( this ));
173 if( ! rOther
.m_aAttributedDataPoints
.empty())
175 lcl_CloneAttributedDataPoints(
176 rOther
.m_aAttributedDataPoints
, m_aAttributedDataPoints
, xThisInterface
);
177 ModifyListenerHelper::addListenerToAllMapElements( m_aAttributedDataPoints
, m_xModifyEventForwarder
);
180 // add as parent to error bars
181 Reference
< beans::XPropertySet
> xPropertySet
;
184 getFastPropertyValue( aValue
, DataPointProperties::PROP_DATAPOINT_ERROR_BAR_X
);
185 if( ( aValue
>>= xPropertySet
)
186 && xPropertySet
.is())
187 lcl_SetParent( xPropertySet
, xThisInterface
);
189 getFastPropertyValue( aValue
, DataPointProperties::PROP_DATAPOINT_ERROR_BAR_Y
);
190 if( ( aValue
>>= xPropertySet
)
191 && xPropertySet
.is())
192 lcl_SetParent( xPropertySet
, xThisInterface
);
195 DataSeries::~DataSeries()
199 ModifyListenerHelper::removeListenerFromAllMapElements( m_aAttributedDataPoints
, m_xModifyEventForwarder
);
200 ModifyListenerHelper::removeListenerFromAllElements( m_aRegressionCurves
, m_xModifyEventForwarder
);
201 ModifyListenerHelper::removeListenerFromAllElements( m_aDataSequences
, m_xModifyEventForwarder
);
203 // remove listener from XPropertySet properties
204 Reference
< beans::XPropertySet
> xPropertySet
;
207 getFastPropertyValue( aValue
, DataPointProperties::PROP_DATAPOINT_ERROR_BAR_X
);
208 if( ( aValue
>>= xPropertySet
)
209 && xPropertySet
.is())
210 ModifyListenerHelper::removeListener( xPropertySet
, m_xModifyEventForwarder
);
212 getFastPropertyValue( aValue
, DataPointProperties::PROP_DATAPOINT_ERROR_BAR_Y
);
213 if( ( aValue
>>= xPropertySet
)
214 && xPropertySet
.is())
215 ModifyListenerHelper::removeListener( xPropertySet
, m_xModifyEventForwarder
);
217 catch( const uno::Exception
& ex
)
219 ASSERT_EXCEPTION( ex
);
223 // ____ XCloneable ____
224 uno::Reference
< util::XCloneable
> SAL_CALL
DataSeries::createClone()
225 throw (uno::RuntimeException
, std::exception
)
227 DataSeries
* pNewSeries( new DataSeries( *this ));
228 // hold a reference to the clone
229 uno::Reference
< util::XCloneable
> xResult( pNewSeries
);
230 // do initialization that uses uno references to the clone
231 pNewSeries
->Init( *this );
236 Sequence
< OUString
> DataSeries::getSupportedServiceNames_Static()
238 Sequence
< OUString
> aServices( 3 );
239 aServices
[ 0 ] = "com.sun.star.chart2.DataSeries";
240 aServices
[ 1 ] = "com.sun.star.chart2.DataPointProperties";
241 aServices
[ 2 ] = "com.sun.star.beans.PropertySet";
245 // ____ OPropertySet ____
246 uno::Any
DataSeries::GetDefaultValue( sal_Int32 nHandle
) const
247 throw (beans::UnknownPropertyException
,
248 uno::RuntimeException
)
250 const tPropertyValueMap
& rStaticDefaults
= StaticDataSeriesDefaults::get();
251 tPropertyValueMap::const_iterator
aFound( rStaticDefaults
.find( nHandle
) );
252 if( aFound
== rStaticDefaults
.end() )
254 return (*aFound
).second
;
257 // ____ OPropertySet ____
258 ::cppu::IPropertyArrayHelper
& SAL_CALL
DataSeries::getInfoHelper()
260 return StaticDataSeriesInfoHelper::get();
263 // ____ XPropertySet ____
264 uno::Reference
< beans::XPropertySetInfo
> SAL_CALL
DataSeries::getPropertySetInfo()
265 throw (uno::RuntimeException
, std::exception
)
267 return StaticDataSeriesInfo::get();
270 void SAL_CALL
DataSeries::getFastPropertyValue
272 sal_Int32 nHandle
) const
274 // special handling for get. set is not possible for this property
275 if( nHandle
== DataSeriesProperties::PROP_DATASERIES_ATTRIBUTED_DATA_POINTS
)
277 // ToDo: only add those property sets that are really modified
278 uno::Sequence
< sal_Int32
> aSeq( m_aAttributedDataPoints
.size());
279 sal_Int32
* pIndexArray
= aSeq
.getArray();
282 for( tDataPointAttributeContainer::const_iterator
aIt( m_aAttributedDataPoints
.begin());
283 aIt
!= m_aAttributedDataPoints
.end(); ++aIt
)
285 pIndexArray
[ i
] = (*aIt
).first
;
292 OPropertySet::getFastPropertyValue( rValue
, nHandle
);
295 void SAL_CALL
DataSeries::setFastPropertyValue_NoBroadcast(
296 sal_Int32 nHandle
, const uno::Any
& rValue
)
297 throw (uno::Exception
, std::exception
)
299 if( nHandle
== DataPointProperties::PROP_DATAPOINT_ERROR_BAR_Y
300 || nHandle
== DataPointProperties::PROP_DATAPOINT_ERROR_BAR_X
)
303 Reference
< util::XModifyBroadcaster
> xBroadcaster
;
304 this->getFastPropertyValue( aOldValue
, nHandle
);
305 if( aOldValue
.hasValue() &&
306 (aOldValue
>>= xBroadcaster
) &&
309 ModifyListenerHelper::removeListener( xBroadcaster
, m_xModifyEventForwarder
);
312 OSL_ASSERT( rValue
.getValueType().getTypeClass() == uno::TypeClass_INTERFACE
);
313 if( rValue
.hasValue() &&
314 (rValue
>>= xBroadcaster
) &&
317 ModifyListenerHelper::addListener( xBroadcaster
, m_xModifyEventForwarder
);
321 ::property::OPropertySet::setFastPropertyValue_NoBroadcast( nHandle
, rValue
);
324 Reference
< beans::XPropertySet
>
325 SAL_CALL
DataSeries::getDataPointByIndex( sal_Int32 nIndex
)
326 throw (lang::IndexOutOfBoundsException
,
327 uno::RuntimeException
, std::exception
)
329 Reference
< beans::XPropertySet
> xResult
;
331 Sequence
< Reference
< chart2::data::XLabeledDataSequence
> > aSequences
;
333 MutexGuard
aGuard( GetMutex() );
334 aSequences
= ContainerHelper::ContainerToSequence( m_aDataSequences
);
337 ::std::vector
< Reference
< chart2::data::XLabeledDataSequence
> > aValuesSeries(
338 DataSeriesHelper::getAllDataSequencesByRole( aSequences
, "values", true ) );
340 if (aValuesSeries
.empty())
341 throw lang::IndexOutOfBoundsException();
343 Reference
< chart2::data::XDataSequence
> xSeq( aValuesSeries
.front()->getValues() );
344 if( 0 <= nIndex
&& nIndex
< xSeq
->getData().getLength() )
347 MutexGuard
aGuard( GetMutex() );
348 tDataPointAttributeContainer::iterator
aIt( m_aAttributedDataPoints
.find( nIndex
) );
349 if( aIt
!= m_aAttributedDataPoints
.end() )
350 xResult
= (*aIt
).second
;
354 Reference
< beans::XPropertySet
> xParentProperties
;
355 Reference
< util::XModifyListener
> xModifyEventForwarder
;
357 MutexGuard
aGuard( GetMutex() );
358 xParentProperties
= this;
359 xModifyEventForwarder
= m_xModifyEventForwarder
;
362 // create a new XPropertySet for this data point
363 xResult
.set( new DataPoint( xParentProperties
) );
365 MutexGuard
aGuard( GetMutex() );
366 m_aAttributedDataPoints
[ nIndex
] = xResult
;
368 ModifyListenerHelper::addListener( xResult
, xModifyEventForwarder
);
375 void SAL_CALL
DataSeries::resetDataPoint( sal_Int32 nIndex
)
376 throw (uno::RuntimeException
, std::exception
)
378 Reference
< beans::XPropertySet
> xDataPointProp
;
379 Reference
< util::XModifyListener
> xModifyEventForwarder
;
381 MutexGuard
aGuard( GetMutex() );
382 xModifyEventForwarder
= m_xModifyEventForwarder
;
383 tDataPointAttributeContainer::iterator
aIt( m_aAttributedDataPoints
.find( nIndex
));
384 if( aIt
!= m_aAttributedDataPoints
.end())
386 xDataPointProp
= (*aIt
).second
;
387 m_aAttributedDataPoints
.erase(aIt
);
391 if( xDataPointProp
.is() )
393 Reference
< util::XModifyBroadcaster
> xBroadcaster( xDataPointProp
, uno::UNO_QUERY
);
394 if( xBroadcaster
.is() && xModifyEventForwarder
.is())
395 xBroadcaster
->removeModifyListener( xModifyEventForwarder
);
400 void SAL_CALL
DataSeries::resetAllDataPoints()
401 throw (uno::RuntimeException
, std::exception
)
403 tDataPointAttributeContainer aOldAttributedDataPoints
;
404 Reference
< util::XModifyListener
> xModifyEventForwarder
;
406 MutexGuard
aGuard( GetMutex() );
407 xModifyEventForwarder
= m_xModifyEventForwarder
;
408 std::swap( aOldAttributedDataPoints
, m_aAttributedDataPoints
);
410 ModifyListenerHelper::removeListenerFromAllMapElements( aOldAttributedDataPoints
, xModifyEventForwarder
);
411 aOldAttributedDataPoints
.clear();
415 // ____ XDataSink ____
416 void SAL_CALL
DataSeries::setData( const uno::Sequence
< Reference
< chart2::data::XLabeledDataSequence
> >& aData
)
417 throw (uno::RuntimeException
, std::exception
)
419 tDataSequenceContainer aOldDataSequences
;
420 tDataSequenceContainer aNewDataSequences
;
421 Reference
< util::XModifyListener
> xModifyEventForwarder
;
422 Reference
< lang::XEventListener
> xListener
;
424 MutexGuard
aGuard( GetMutex() );
425 xModifyEventForwarder
= m_xModifyEventForwarder
;
427 std::swap( aOldDataSequences
, m_aDataSequences
);
428 aNewDataSequences
= ContainerHelper::SequenceToVector( aData
);
429 m_aDataSequences
= aNewDataSequences
;
431 ModifyListenerHelper::removeListenerFromAllElements( aOldDataSequences
, xModifyEventForwarder
);
432 EventListenerHelper::removeListenerFromAllElements( aOldDataSequences
, xListener
);
433 EventListenerHelper::addListenerToAllElements( aNewDataSequences
, xListener
);
434 ModifyListenerHelper::addListenerToAllElements( aNewDataSequences
, xModifyEventForwarder
);
438 // ____ XDataSource ____
439 Sequence
< Reference
< chart2::data::XLabeledDataSequence
> > SAL_CALL
DataSeries::getDataSequences()
440 throw (uno::RuntimeException
, std::exception
)
442 MutexGuard
aGuard( GetMutex() );
443 return ContainerHelper::ContainerToSequence( m_aDataSequences
);
446 // ____ XRegressionCurveContainer ____
447 void SAL_CALL
DataSeries::addRegressionCurve(
448 const uno::Reference
< chart2::XRegressionCurve
>& xRegressionCurve
)
449 throw (lang::IllegalArgumentException
,
450 uno::RuntimeException
, std::exception
)
452 Reference
< util::XModifyListener
> xModifyEventForwarder
;
454 MutexGuard
aGuard( GetMutex() );
455 xModifyEventForwarder
= m_xModifyEventForwarder
;
456 if( ::std::find( m_aRegressionCurves
.begin(), m_aRegressionCurves
.end(), xRegressionCurve
)
457 != m_aRegressionCurves
.end())
458 throw lang::IllegalArgumentException();
459 m_aRegressionCurves
.push_back( xRegressionCurve
);
461 ModifyListenerHelper::addListener( xRegressionCurve
, xModifyEventForwarder
);
465 void SAL_CALL
DataSeries::removeRegressionCurve(
466 const uno::Reference
< chart2::XRegressionCurve
>& xRegressionCurve
)
467 throw (container::NoSuchElementException
,
468 uno::RuntimeException
, std::exception
)
470 if( !xRegressionCurve
.is() )
471 throw container::NoSuchElementException();
473 Reference
< util::XModifyListener
> xModifyEventForwarder
;
475 MutexGuard
aGuard( GetMutex() );
476 xModifyEventForwarder
= m_xModifyEventForwarder
;
477 tRegressionCurveContainerType::iterator
aIt(
478 ::std::find( m_aRegressionCurves
.begin(), m_aRegressionCurves
.end(), xRegressionCurve
) );
479 if( aIt
== m_aRegressionCurves
.end())
480 throw container::NoSuchElementException(
481 "The given regression curve is no element of this series",
482 static_cast< uno::XWeak
* >( this ));
483 m_aRegressionCurves
.erase( aIt
);
486 ModifyListenerHelper::removeListener( xRegressionCurve
, xModifyEventForwarder
);
490 uno::Sequence
< uno::Reference
< chart2::XRegressionCurve
> > SAL_CALL
DataSeries::getRegressionCurves()
491 throw (uno::RuntimeException
, std::exception
)
493 MutexGuard
aGuard( GetMutex() );
494 return ContainerHelper::ContainerToSequence( m_aRegressionCurves
);
497 void SAL_CALL
DataSeries::setRegressionCurves(
498 const Sequence
< Reference
< chart2::XRegressionCurve
> >& aRegressionCurves
)
499 throw (uno::RuntimeException
, std::exception
)
501 tRegressionCurveContainerType aOldCurves
;
502 tRegressionCurveContainerType
aNewCurves( ContainerHelper::SequenceToVector( aRegressionCurves
) );
503 Reference
< util::XModifyListener
> xModifyEventForwarder
;
505 MutexGuard
aGuard( GetMutex() );
506 xModifyEventForwarder
= m_xModifyEventForwarder
;
507 std::swap( aOldCurves
, m_aRegressionCurves
);
508 m_aRegressionCurves
= aNewCurves
;
510 ModifyListenerHelper::removeListenerFromAllElements( aOldCurves
, xModifyEventForwarder
);
511 ModifyListenerHelper::addListenerToAllElements( aNewCurves
, xModifyEventForwarder
);
515 // ____ XModifyBroadcaster ____
516 void SAL_CALL
DataSeries::addModifyListener( const Reference
< util::XModifyListener
>& aListener
)
517 throw (uno::RuntimeException
, std::exception
)
521 Reference
< util::XModifyBroadcaster
> xBroadcaster( m_xModifyEventForwarder
, uno::UNO_QUERY_THROW
);
522 xBroadcaster
->addModifyListener( aListener
);
524 catch( const uno::Exception
& ex
)
526 ASSERT_EXCEPTION( ex
);
530 void SAL_CALL
DataSeries::removeModifyListener( const Reference
< util::XModifyListener
>& aListener
)
531 throw (uno::RuntimeException
, std::exception
)
535 Reference
< util::XModifyBroadcaster
> xBroadcaster( m_xModifyEventForwarder
, uno::UNO_QUERY_THROW
);
536 xBroadcaster
->removeModifyListener( aListener
);
538 catch( const uno::Exception
& ex
)
540 ASSERT_EXCEPTION( ex
);
544 // ____ XModifyListener ____
545 void SAL_CALL
DataSeries::modified( const lang::EventObject
& aEvent
)
546 throw (uno::RuntimeException
, std::exception
)
548 m_xModifyEventForwarder
->modified( aEvent
);
551 // ____ XEventListener (base of XModifyListener) ____
552 void SAL_CALL
DataSeries::disposing( const lang::EventObject
& rEventObject
)
553 throw (uno::RuntimeException
, std::exception
)
555 // forget disposed data sequences
556 tDataSequenceContainer::iterator
aIt(
557 ::std::find( m_aDataSequences
.begin(), m_aDataSequences
.end(), rEventObject
.Source
));
558 if( aIt
!= m_aDataSequences
.end())
559 m_aDataSequences
.erase( aIt
);
562 // ____ OPropertySet ____
563 void DataSeries::firePropertyChangeEvent()
568 void DataSeries::fireModifyEvent()
570 m_xModifyEventForwarder
->modified( lang::EventObject( static_cast< uno::XWeak
* >( this )));
573 using impl::DataSeries_Base
;
574 using ::property::OPropertySet
;
576 IMPLEMENT_FORWARD_XINTERFACE2( DataSeries
, DataSeries_Base
, OPropertySet
)
577 IMPLEMENT_FORWARD_XTYPEPROVIDER2( DataSeries
, DataSeries_Base
, OPropertySet
)
579 // implement XServiceInfo methods basing upon getSupportedServiceNames_Static
580 OUString SAL_CALL
DataSeries::getImplementationName()
581 throw( css::uno::RuntimeException
, std::exception
)
583 return getImplementationName_Static();
586 OUString
DataSeries::getImplementationName_Static()
588 return OUString("com.sun.star.comp.chart.DataSeries");
591 sal_Bool SAL_CALL
DataSeries::supportsService( const OUString
& rServiceName
)
592 throw( css::uno::RuntimeException
, std::exception
)
594 return cppu::supportsService(this, rServiceName
);
597 css::uno::Sequence
< OUString
> SAL_CALL
DataSeries::getSupportedServiceNames()
598 throw( css::uno::RuntimeException
, std::exception
)
600 return getSupportedServiceNames_Static();
605 extern "C" SAL_DLLPUBLIC_EXPORT
css::uno::XInterface
* SAL_CALL
606 com_sun_star_comp_chart_DataSeries_get_implementation(css::uno::XComponentContext
*context
,
607 css::uno::Sequence
<css::uno::Any
> const &)
609 return cppu::acquire(new ::chart::DataSeries(context
));
612 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */