1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_chart2.hxx"
30 #include "TitleWrapper.hxx"
31 #include "macros.hxx"
32 #include "ContainerHelper.hxx"
33 #include "ControllerLockGuard.hxx"
34 
35 #include <comphelper/InlineContainer.hxx>
36 #include <com/sun/star/beans/PropertyAttribute.hpp>
37 #include <com/sun/star/chart2/RelativePosition.hpp>
38 
39 #include "CharacterProperties.hxx"
40 #include "LineProperties.hxx"
41 #include "FillProperties.hxx"
42 #include "UserDefinedProperties.hxx"
43 #include "WrappedCharacterHeightProperty.hxx"
44 #include "WrappedTextRotationProperty.hxx"
45 #include "WrappedAutomaticPositionProperties.hxx"
46 #include "WrappedScaleTextProperties.hxx"
47 
48 #include <algorithm>
49 #include <rtl/ustrbuf.hxx>
50 
51 using namespace ::com::sun::star;
52 using ::com::sun::star::beans::Property;
53 using ::osl::MutexGuard;
54 using ::rtl::OUString;
55 using ::com::sun::star::uno::Any;
56 using ::com::sun::star::uno::Reference;
57 using ::com::sun::star::uno::Sequence;
58 
59 
60 namespace chart
61 {
62 class WrappedTitleStringProperty : public WrappedProperty
63 {
64 public:
65     WrappedTitleStringProperty( const Reference< uno::XComponentContext >& xContext );
66     virtual ~WrappedTitleStringProperty();
67 
68     virtual void setPropertyValue( const Any& rOuterValue, const Reference< beans::XPropertySet >& xInnerPropertySet ) const
69                                     throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException);
70     virtual Any getPropertyValue( const Reference< beans::XPropertySet >& xInnerPropertySet ) const
71                                     throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException);
72     virtual Any getPropertyDefault( const Reference< beans::XPropertyState >& xInnerPropertyState ) const
73                         throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException);
74 
75 protected:
76     Reference< uno::XComponentContext > m_xContext;
77 };
78 
79 WrappedTitleStringProperty::WrappedTitleStringProperty( const Reference< uno::XComponentContext >& xContext )
80     : ::chart::WrappedProperty( C2U( "String" ), OUString() )
81     , m_xContext( xContext )
82 {
83 }
84 WrappedTitleStringProperty::~WrappedTitleStringProperty()
85 {
86 }
87 
88 void WrappedTitleStringProperty::setPropertyValue( const Any& rOuterValue, const Reference< beans::XPropertySet >& xInnerPropertySet ) const
89                 throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
90 {
91     Reference< chart2::XTitle > xTitle(xInnerPropertySet,uno::UNO_QUERY);
92     if(xTitle.is())
93     {
94         OUString aString;
95         rOuterValue >>= aString;
96         TitleHelper::setCompleteString( aString, xTitle, m_xContext );
97     }
98 }
99 Any WrappedTitleStringProperty::getPropertyValue( const Reference< beans::XPropertySet >& xInnerPropertySet ) const
100                         throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
101 {
102     Any aRet( getPropertyDefault( Reference< beans::XPropertyState >( xInnerPropertySet, uno::UNO_QUERY ) ) );
103     Reference< chart2::XTitle > xTitle(xInnerPropertySet,uno::UNO_QUERY);
104     if(xTitle.is())
105     {
106         Sequence< Reference< chart2::XFormattedString > > aStrings( xTitle->getText());
107 
108         ::rtl::OUStringBuffer aBuf;
109         for( sal_Int32 i = 0; i < aStrings.getLength(); ++i )
110         {
111             aBuf.append( aStrings[ i ]->getString());
112         }
113         aRet <<= aBuf.makeStringAndClear();
114     }
115     return aRet;
116 }
117 Any WrappedTitleStringProperty::getPropertyDefault( const Reference< beans::XPropertyState >& /*xInnerPropertyState*/ ) const
118                         throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
119 {
120     return uno::makeAny( rtl::OUString() );//default title is a empty String
121 }
122 
123 //-----------------------------------------------------------------------------
124 //-----------------------------------------------------------------------------
125 
126 class WrappedStackedTextProperty : public WrappedProperty
127 {
128 public:
129     WrappedStackedTextProperty();
130     virtual ~WrappedStackedTextProperty();
131 };
132 
133 WrappedStackedTextProperty::WrappedStackedTextProperty()
134     : ::chart::WrappedProperty( C2U( "StackedText" ), C2U( "StackCharacters" ) )
135 {
136 }
137 WrappedStackedTextProperty::~WrappedStackedTextProperty()
138 {
139 }
140 
141 }// end namespace chart
142 
143 
144 //-----------------------------------------------------------------------------
145 //-----------------------------------------------------------------------------
146 //-----------------------------------------------------------------------------
147 //-----------------------------------------------------------------------------
148 
149 namespace
150 {
151 static const OUString lcl_aServiceName(
152     RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.chart.Title" ));
153 
154 enum
155 {
156     PROP_TITLE_STRING,
157     PROP_TITLE_TEXT_ROTATION,
158     PROP_TITLE_TEXT_STACKED
159 };
160 
161 void lcl_AddPropertiesToVector(
162     ::std::vector< Property > & rOutProperties )
163 {
164     rOutProperties.push_back(
165         Property( C2U( "String" ),
166                   PROP_TITLE_STRING,
167                   ::getCppuType( reinterpret_cast< const ::rtl::OUString * >(0)),
168                   beans::PropertyAttribute::BOUND
169                   | beans::PropertyAttribute::MAYBEVOID ));
170 
171     rOutProperties.push_back(
172         Property( C2U( "TextRotation" ),
173                   PROP_TITLE_TEXT_ROTATION,
174                   ::getCppuType( reinterpret_cast< const sal_Int32 * >(0)),
175                   beans::PropertyAttribute::BOUND
176                   | beans::PropertyAttribute::MAYBEDEFAULT ));
177     rOutProperties.push_back(
178         Property( C2U( "StackedText" ),
179                   PROP_TITLE_TEXT_STACKED,
180                   ::getBooleanCppuType(),
181                   beans::PropertyAttribute::BOUND
182                   | beans::PropertyAttribute::MAYBEDEFAULT ));
183 }
184 
185 struct StaticTitleWrapperPropertyArray_Initializer
186 {
187     Sequence< Property >* operator()()
188     {
189         static Sequence< Property > aPropSeq( lcl_GetPropertySequence() );
190         return &aPropSeq;
191     }
192 
193 private:
194     Sequence< Property > lcl_GetPropertySequence()
195     {
196         ::std::vector< beans::Property > aProperties;
197         lcl_AddPropertiesToVector( aProperties );
198         ::chart::CharacterProperties::AddPropertiesToVector( aProperties );
199         ::chart::LineProperties::AddPropertiesToVector( aProperties );
200         ::chart::FillProperties::AddPropertiesToVector( aProperties );
201         //::chart::NamedProperties::AddPropertiesToVector( aProperties );
202         ::chart::UserDefinedProperties::AddPropertiesToVector( aProperties );
203         ::chart::wrapper::WrappedAutomaticPositionProperties::addProperties( aProperties );
204         ::chart::wrapper::WrappedScaleTextProperties::addProperties( aProperties );
205 
206         ::std::sort( aProperties.begin(), aProperties.end(),
207                      ::chart::PropertyNameLess() );
208 
209         return ::chart::ContainerHelper::ContainerToSequence( aProperties );
210     }
211 };
212 
213 struct StaticTitleWrapperPropertyArray : public rtl::StaticAggregate< Sequence< Property >, StaticTitleWrapperPropertyArray_Initializer >
214 {
215 };
216 
217 } // anonymous namespace
218 
219 // --------------------------------------------------------------------------------
220 
221 namespace chart
222 {
223 namespace wrapper
224 {
225 
226 TitleWrapper::TitleWrapper( ::chart::TitleHelper::eTitleType eTitleType,
227     ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact ) :
228         m_spChart2ModelContact( spChart2ModelContact ),
229         m_aEventListenerContainer( m_aMutex ),
230         m_eTitleType(eTitleType)
231 {
232     ControllerLockGuard aCtrlLockGuard( Reference< frame::XModel >( m_spChart2ModelContact->getChart2Document(), uno::UNO_QUERY ));
233     if( !getTitleObject().is() ) //#i83831# create an empty title at the model, thus references to properties can be mapped mapped correctly
234         TitleHelper::createTitle( m_eTitleType, OUString(), m_spChart2ModelContact->getChartModel(), m_spChart2ModelContact->m_xContext );
235 }
236 
237 TitleWrapper::~TitleWrapper()
238 {
239 }
240 
241 // ____ XShape ____
242 awt::Point SAL_CALL TitleWrapper::getPosition()
243     throw (uno::RuntimeException)
244 {
245     return m_spChart2ModelContact->GetTitlePosition( this->getTitleObject() );
246 }
247 
248 void SAL_CALL TitleWrapper::setPosition( const awt::Point& aPosition )
249     throw (uno::RuntimeException)
250 {
251     Reference< beans::XPropertySet > xPropertySet( this->getInnerPropertySet() );
252     if(xPropertySet.is())
253     {
254         awt::Size aPageSize( m_spChart2ModelContact->GetPageSize() );
255 
256         chart2::RelativePosition aRelativePosition;
257         aRelativePosition.Anchor = drawing::Alignment_TOP_LEFT;
258         aRelativePosition.Primary = double(aPosition.X)/double(aPageSize.Width);
259         aRelativePosition.Secondary = double(aPosition.Y)/double(aPageSize.Height);
260         xPropertySet->setPropertyValue( C2U( "RelativePosition" ), uno::makeAny(aRelativePosition) );
261     }
262 }
263 
264 awt::Size SAL_CALL TitleWrapper::getSize()
265     throw (uno::RuntimeException)
266 {
267     return m_spChart2ModelContact->GetTitleSize( this->getTitleObject() );
268 }
269 
270 void SAL_CALL TitleWrapper::setSize( const awt::Size& /*aSize*/ )
271     throw (beans::PropertyVetoException,
272            uno::RuntimeException)
273 {
274     OSL_ENSURE( false, "trying to set size of title" );
275 }
276 
277 // ____ XShapeDescriptor (base of XShape) ____
278 OUString SAL_CALL TitleWrapper::getShapeType()
279     throw (uno::RuntimeException)
280 {
281     return C2U( "com.sun.star.chart.ChartTitle" );
282 }
283 
284 // ____ XComponent ____
285 void SAL_CALL TitleWrapper::dispose()
286     throw (uno::RuntimeException)
287 {
288     Reference< uno::XInterface > xSource( static_cast< ::cppu::OWeakObject* >( this ) );
289     m_aEventListenerContainer.disposeAndClear( lang::EventObject( xSource ) );
290 
291     // /--
292     MutexGuard aGuard( GetMutex());
293     clearWrappedPropertySet();
294     // \--
295 }
296 
297 void SAL_CALL TitleWrapper::addEventListener(
298     const Reference< lang::XEventListener >& xListener )
299     throw (uno::RuntimeException)
300 {
301 	m_aEventListenerContainer.addInterface( xListener );
302 }
303 
304 void SAL_CALL TitleWrapper::removeEventListener(
305     const Reference< lang::XEventListener >& aListener )
306     throw (uno::RuntimeException)
307 {
308 	m_aEventListenerContainer.removeInterface( aListener );
309 }
310 
311 // ================================================================================
312 
313 Reference< beans::XPropertySet > TitleWrapper::getFirstCharacterPropertySet()
314 {
315     Reference< beans::XPropertySet > xProp;
316 
317     Reference< chart2::XTitle > xTitle( this->getTitleObject() );
318     if( xTitle.is())
319     {
320         Sequence< Reference< chart2::XFormattedString > > aStrings( xTitle->getText());
321         if( aStrings.getLength() > 0 )
322             xProp.set( aStrings[0], uno::UNO_QUERY );
323     }
324 
325     return xProp;
326 }
327 
328 void TitleWrapper::getFastCharacterPropertyValue( sal_Int32 nHandle, Any& rValue )
329 {
330     OSL_ASSERT( FAST_PROPERTY_ID_START_CHAR_PROP <= nHandle &&
331                 nHandle < CharacterProperties::FAST_PROPERTY_ID_END_CHAR_PROP );
332 
333     Reference< beans::XPropertySet > xProp( getFirstCharacterPropertySet(), uno::UNO_QUERY );
334     Reference< beans::XFastPropertySet > xFastProp( xProp, uno::UNO_QUERY );
335     if(xProp.is())
336     {
337         const WrappedProperty* pWrappedProperty = getWrappedProperty( nHandle );
338         if( pWrappedProperty )
339         {
340             rValue = pWrappedProperty->getPropertyValue( xProp );
341         }
342         else if( xFastProp.is() )
343         {
344             rValue = xFastProp->getFastPropertyValue( nHandle );
345         }
346     }
347 
348 }
349 
350 void TitleWrapper::setFastCharacterPropertyValue(
351     sal_Int32 nHandle, const Any& rValue ) throw (uno::Exception)
352 {
353     OSL_ASSERT( FAST_PROPERTY_ID_START_CHAR_PROP <= nHandle &&
354                 nHandle < CharacterProperties::FAST_PROPERTY_ID_END_CHAR_PROP );
355 
356     Reference< chart2::XTitle > xTitle( this->getTitleObject() );
357     if( xTitle.is())
358     {
359         Sequence< Reference< chart2::XFormattedString > > aStrings( xTitle->getText());
360         const WrappedProperty* pWrappedProperty = getWrappedProperty( nHandle );
361 
362         for( sal_Int32 i = 0; i < aStrings.getLength(); ++i )
363         {
364             Reference< beans::XFastPropertySet > xFastPropertySet( aStrings[ i ], uno::UNO_QUERY );
365             Reference< beans::XPropertySet > xPropSet( xFastPropertySet, uno::UNO_QUERY );
366 
367             if( pWrappedProperty )
368                 pWrappedProperty->setPropertyValue( rValue, xPropSet );
369             else if( xFastPropertySet.is() )
370                 xFastPropertySet->setFastPropertyValue( nHandle, rValue );
371         }
372     }
373 }
374 
375 // ================================================================================
376 // WrappedPropertySet
377 
378 void SAL_CALL TitleWrapper::setPropertyValue( const OUString& rPropertyName, const Any& rValue )
379                                     throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
380 {
381     sal_Int32 nHandle = getInfoHelper().getHandleByName( rPropertyName );
382     if( CharacterProperties::IsCharacterPropertyHandle( nHandle ) )
383     {
384         setFastCharacterPropertyValue( nHandle, rValue );
385     }
386     else
387         WrappedPropertySet::setPropertyValue( rPropertyName, rValue );
388 }
389 
390 Any SAL_CALL TitleWrapper::getPropertyValue( const OUString& rPropertyName )
391                                     throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
392 {
393     Any aRet;
394     sal_Int32 nHandle = getInfoHelper().getHandleByName( rPropertyName );
395     if( CharacterProperties::IsCharacterPropertyHandle( nHandle ) )
396         getFastCharacterPropertyValue( nHandle, aRet );
397     else
398         aRet = WrappedPropertySet::getPropertyValue( rPropertyName );
399     return aRet;
400 }
401 
402 beans::PropertyState SAL_CALL TitleWrapper::getPropertyState( const OUString& rPropertyName )
403                                     throw (beans::UnknownPropertyException, uno::RuntimeException)
404 {
405     beans::PropertyState aState( beans::PropertyState_DIRECT_VALUE );
406 
407     sal_Int32 nHandle = getInfoHelper().getHandleByName( rPropertyName );
408     if( CharacterProperties::IsCharacterPropertyHandle( nHandle ) )
409     {
410         Reference< beans::XPropertyState > xPropState( getFirstCharacterPropertySet(), uno::UNO_QUERY );
411         if( xPropState.is() )
412         {
413             const WrappedProperty* pWrappedProperty = getWrappedProperty( rPropertyName );
414             if( pWrappedProperty )
415                 aState = pWrappedProperty->getPropertyState( xPropState );
416             else
417                 aState = xPropState->getPropertyState( rPropertyName );
418         }
419     }
420     else
421         aState = WrappedPropertySet::getPropertyState( rPropertyName );
422 
423     return aState;
424 }
425 void SAL_CALL TitleWrapper::setPropertyToDefault( const OUString& rPropertyName )
426                                     throw (beans::UnknownPropertyException, uno::RuntimeException)
427 {
428     sal_Int32 nHandle = getInfoHelper().getHandleByName( rPropertyName );
429     if( CharacterProperties::IsCharacterPropertyHandle( nHandle ) )
430     {
431         Any aDefault = getPropertyDefault( rPropertyName );
432         setFastCharacterPropertyValue( nHandle, aDefault );
433     }
434     else
435         WrappedPropertySet::setPropertyToDefault( rPropertyName );
436 }
437 Any SAL_CALL TitleWrapper::getPropertyDefault( const OUString& rPropertyName )
438                                     throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
439 {
440     Any aRet;
441 
442     sal_Int32 nHandle = getInfoHelper().getHandleByName( rPropertyName );
443     if( CharacterProperties::IsCharacterPropertyHandle( nHandle ) )
444     {
445         Reference< beans::XPropertyState > xPropState( getFirstCharacterPropertySet(), uno::UNO_QUERY );
446         if( xPropState.is() )
447         {
448             const WrappedProperty* pWrappedProperty = getWrappedProperty( rPropertyName );
449             if( pWrappedProperty )
450                 aRet = pWrappedProperty->getPropertyDefault(xPropState);
451             else
452                 aRet = xPropState->getPropertyDefault( rPropertyName );
453         }
454     }
455     else
456         aRet = WrappedPropertySet::getPropertyDefault( rPropertyName );
457 
458     return aRet;
459 }
460 
461 void SAL_CALL TitleWrapper::addPropertyChangeListener( const OUString& rPropertyName, const Reference< beans::XPropertyChangeListener >& xListener )
462                                     throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
463 {
464     sal_Int32 nHandle = getInfoHelper().getHandleByName( rPropertyName );
465     if( CharacterProperties::IsCharacterPropertyHandle( nHandle ) )
466     {
467         Reference< beans::XPropertySet > xPropSet( getFirstCharacterPropertySet(), uno::UNO_QUERY );
468         if( xPropSet.is() )
469             xPropSet->addPropertyChangeListener( rPropertyName, xListener );
470     }
471     else
472         WrappedPropertySet::addPropertyChangeListener( rPropertyName, xListener );
473 }
474 void SAL_CALL TitleWrapper::removePropertyChangeListener( const OUString& rPropertyName, const Reference< beans::XPropertyChangeListener >& xListener )
475                                     throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
476 {
477     sal_Int32 nHandle = getInfoHelper().getHandleByName( rPropertyName );
478     if( CharacterProperties::IsCharacterPropertyHandle( nHandle ) )
479     {
480         Reference< beans::XPropertySet > xPropSet( getFirstCharacterPropertySet(), uno::UNO_QUERY );
481         if( xPropSet.is() )
482             xPropSet->removePropertyChangeListener( rPropertyName, xListener );
483     }
484     else
485         WrappedPropertySet::removePropertyChangeListener( rPropertyName, xListener );
486 }
487 
488 // ================================================================================
489 
490 //ReferenceSizePropertyProvider
491 void TitleWrapper::updateReferenceSize()
492 {
493     Reference< beans::XPropertySet > xProp( this->getTitleObject(), uno::UNO_QUERY );
494     if( xProp.is() )
495     {
496         if( xProp->getPropertyValue( C2U("ReferencePageSize") ).hasValue() )
497             xProp->setPropertyValue( C2U("ReferencePageSize"), uno::makeAny(
498                             m_spChart2ModelContact->GetPageSize() ));
499     }
500 }
501 Any TitleWrapper::getReferenceSize()
502 {
503     Any aRet;
504     Reference< beans::XPropertySet > xProp( this->getTitleObject(), uno::UNO_QUERY );
505     if( xProp.is() )
506         aRet = xProp->getPropertyValue( C2U("ReferencePageSize") );
507 
508     return aRet;
509 }
510 awt::Size TitleWrapper::getCurrentSizeForReference()
511 {
512     return m_spChart2ModelContact->GetPageSize();
513 }
514 
515 // ================================================================================
516 
517 Reference< chart2::XTitle > TitleWrapper::getTitleObject()
518 {
519     return TitleHelper::getTitle( m_eTitleType, m_spChart2ModelContact->getChartModel() );
520 }
521 
522 // WrappedPropertySet
523 
524 Reference< beans::XPropertySet > TitleWrapper::getInnerPropertySet()
525 {
526     return Reference< beans::XPropertySet >( this->getTitleObject(), uno::UNO_QUERY );
527 }
528 
529 const Sequence< beans::Property >& TitleWrapper::getPropertySequence()
530 {
531     return *StaticTitleWrapperPropertyArray::get();
532 }
533 
534 const std::vector< WrappedProperty* > TitleWrapper::createWrappedProperties()
535 {
536     ::std::vector< ::chart::WrappedProperty* > aWrappedProperties;
537 
538     aWrappedProperties.push_back( new WrappedTitleStringProperty( m_spChart2ModelContact->m_xContext ) );
539     aWrappedProperties.push_back( new WrappedTextRotationProperty( m_eTitleType==TitleHelper::Y_AXIS_TITLE || m_eTitleType==TitleHelper::X_AXIS_TITLE ) );
540     aWrappedProperties.push_back( new WrappedStackedTextProperty() );
541     WrappedCharacterHeightProperty::addWrappedProperties( aWrappedProperties, this );
542     WrappedAutomaticPositionProperties::addWrappedProperties( aWrappedProperties );
543     WrappedScaleTextProperties::addWrappedProperties( aWrappedProperties, m_spChart2ModelContact );
544 
545     return aWrappedProperties;
546 }
547 
548 // ================================================================================
549 
550 Sequence< OUString > TitleWrapper::getSupportedServiceNames_Static()
551 {
552     Sequence< OUString > aServices( 4 );
553     aServices[ 0 ] = C2U( "com.sun.star.chart.ChartTitle" );
554     aServices[ 1 ] = C2U( "com.sun.star.drawing.Shape" );
555     aServices[ 2 ] = C2U( "com.sun.star.xml.UserDefinedAttributeSupplier" );
556     aServices[ 3 ] = C2U( "com.sun.star.style.CharacterProperties" );
557 //     aServices[ 4 ] = C2U( "com.sun.star.beans.PropertySet" );
558 //     aServices[ 5 ] = C2U( "com.sun.star.drawing.FillProperties" );
559 //     aServices[ 6 ] = C2U( "com.sun.star.drawing.LineProperties" );
560 
561     return aServices;
562 }
563 
564 // implement XServiceInfo methods basing upon getSupportedServiceNames_Static
565 APPHELPER_XSERVICEINFO_IMPL( TitleWrapper, lcl_aServiceName );
566 
567 } //  namespace wrapper
568 } //  namespace chart
569