1*cde9e8dcSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*cde9e8dcSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*cde9e8dcSAndrew Rist * or more contributor license agreements. See the NOTICE file
5*cde9e8dcSAndrew Rist * distributed with this work for additional information
6*cde9e8dcSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*cde9e8dcSAndrew Rist * to you under the Apache License, Version 2.0 (the
8*cde9e8dcSAndrew Rist * "License"); you may not use this file except in compliance
9*cde9e8dcSAndrew Rist * with the License. You may obtain a copy of the License at
10*cde9e8dcSAndrew Rist *
11*cde9e8dcSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*cde9e8dcSAndrew Rist *
13*cde9e8dcSAndrew Rist * Unless required by applicable law or agreed to in writing,
14*cde9e8dcSAndrew Rist * software distributed under the License is distributed on an
15*cde9e8dcSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*cde9e8dcSAndrew Rist * KIND, either express or implied. See the License for the
17*cde9e8dcSAndrew Rist * specific language governing permissions and limitations
18*cde9e8dcSAndrew Rist * under the License.
19*cde9e8dcSAndrew Rist *
20*cde9e8dcSAndrew Rist *************************************************************/
21*cde9e8dcSAndrew Rist
22*cde9e8dcSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_chart2.hxx"
26cdf0e10cSrcweir #include "BarChartTypeTemplate.hxx"
27cdf0e10cSrcweir #include "macros.hxx"
28cdf0e10cSrcweir #include "DiagramHelper.hxx"
29cdf0e10cSrcweir #include "servicenames_charttypes.hxx"
30cdf0e10cSrcweir #include "ContainerHelper.hxx"
31cdf0e10cSrcweir #include "DataSeriesHelper.hxx"
32cdf0e10cSrcweir #include "PropertyHelper.hxx"
33cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp>
34cdf0e10cSrcweir #include <com/sun/star/drawing/LineStyle.hpp>
35cdf0e10cSrcweir #include <com/sun/star/chart2/DataPointGeometry3D.hpp>
36cdf0e10cSrcweir
37cdf0e10cSrcweir #include <algorithm>
38cdf0e10cSrcweir
39cdf0e10cSrcweir using namespace ::com::sun::star;
40cdf0e10cSrcweir
41cdf0e10cSrcweir using ::com::sun::star::uno::Reference;
42cdf0e10cSrcweir using ::com::sun::star::uno::Sequence;
43cdf0e10cSrcweir using ::com::sun::star::beans::Property;
44cdf0e10cSrcweir using ::osl::MutexGuard;
45cdf0e10cSrcweir using ::rtl::OUString;
46cdf0e10cSrcweir
47cdf0e10cSrcweir namespace
48cdf0e10cSrcweir {
49cdf0e10cSrcweir
50cdf0e10cSrcweir static const OUString lcl_aServiceName(
51cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart2.BarChartTypeTemplate" ));
52cdf0e10cSrcweir
53cdf0e10cSrcweir enum
54cdf0e10cSrcweir {
55cdf0e10cSrcweir PROP_BAR_TEMPLATE_DIMENSION,
56cdf0e10cSrcweir PROP_BAR_TEMPLATE_GEOMETRY3D
57cdf0e10cSrcweir };
58cdf0e10cSrcweir
lcl_AddPropertiesToVector(::std::vector<Property> & rOutProperties)59cdf0e10cSrcweir void lcl_AddPropertiesToVector(
60cdf0e10cSrcweir ::std::vector< Property > & rOutProperties )
61cdf0e10cSrcweir {
62cdf0e10cSrcweir rOutProperties.push_back(
63cdf0e10cSrcweir Property( C2U( "Dimension" ),
64cdf0e10cSrcweir PROP_BAR_TEMPLATE_DIMENSION,
65cdf0e10cSrcweir ::getCppuType( reinterpret_cast< const sal_Int32 * >(0)),
66cdf0e10cSrcweir beans::PropertyAttribute::BOUND
67cdf0e10cSrcweir | beans::PropertyAttribute::MAYBEDEFAULT ));
68cdf0e10cSrcweir rOutProperties.push_back(
69cdf0e10cSrcweir Property( C2U( "Geometry3D" ),
70cdf0e10cSrcweir PROP_BAR_TEMPLATE_GEOMETRY3D,
71cdf0e10cSrcweir ::getCppuType( reinterpret_cast< const sal_Int32 * >(0)),
72cdf0e10cSrcweir beans::PropertyAttribute::BOUND
73cdf0e10cSrcweir | beans::PropertyAttribute::MAYBEDEFAULT ));
74cdf0e10cSrcweir }
75cdf0e10cSrcweir
76cdf0e10cSrcweir struct StaticBarChartTypeTemplateDefaults_Initializer
77cdf0e10cSrcweir {
operator ()__anone3cba5ba0111::StaticBarChartTypeTemplateDefaults_Initializer78cdf0e10cSrcweir ::chart::tPropertyValueMap* operator()()
79cdf0e10cSrcweir {
80cdf0e10cSrcweir static ::chart::tPropertyValueMap aStaticDefaults;
81cdf0e10cSrcweir lcl_AddDefaultsToMap( aStaticDefaults );
82cdf0e10cSrcweir return &aStaticDefaults;
83cdf0e10cSrcweir }
84cdf0e10cSrcweir private:
lcl_AddDefaultsToMap__anone3cba5ba0111::StaticBarChartTypeTemplateDefaults_Initializer85cdf0e10cSrcweir void lcl_AddDefaultsToMap( ::chart::tPropertyValueMap & rOutMap )
86cdf0e10cSrcweir {
87cdf0e10cSrcweir ::chart::PropertyHelper::setPropertyValueDefault< sal_Int32 >( rOutMap, PROP_BAR_TEMPLATE_DIMENSION, 2 );
88cdf0e10cSrcweir ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_BAR_TEMPLATE_GEOMETRY3D, ::chart2::DataPointGeometry3D::CUBOID );
89cdf0e10cSrcweir }
90cdf0e10cSrcweir };
91cdf0e10cSrcweir
92cdf0e10cSrcweir struct StaticBarChartTypeTemplateDefaults : public rtl::StaticAggregate< ::chart::tPropertyValueMap, StaticBarChartTypeTemplateDefaults_Initializer >
93cdf0e10cSrcweir {
94cdf0e10cSrcweir };
95cdf0e10cSrcweir
96cdf0e10cSrcweir struct StaticBarChartTypeTemplateInfoHelper_Initializer
97cdf0e10cSrcweir {
operator ()__anone3cba5ba0111::StaticBarChartTypeTemplateInfoHelper_Initializer98cdf0e10cSrcweir ::cppu::OPropertyArrayHelper* operator()()
99cdf0e10cSrcweir {
100cdf0e10cSrcweir static ::cppu::OPropertyArrayHelper aPropHelper( lcl_GetPropertySequence() );
101cdf0e10cSrcweir return &aPropHelper;
102cdf0e10cSrcweir }
103cdf0e10cSrcweir
104cdf0e10cSrcweir private:
lcl_GetPropertySequence__anone3cba5ba0111::StaticBarChartTypeTemplateInfoHelper_Initializer105cdf0e10cSrcweir Sequence< Property > lcl_GetPropertySequence()
106cdf0e10cSrcweir {
107cdf0e10cSrcweir ::std::vector< ::com::sun::star::beans::Property > aProperties;
108cdf0e10cSrcweir lcl_AddPropertiesToVector( aProperties );
109cdf0e10cSrcweir
110cdf0e10cSrcweir ::std::sort( aProperties.begin(), aProperties.end(),
111cdf0e10cSrcweir ::chart::PropertyNameLess() );
112cdf0e10cSrcweir
113cdf0e10cSrcweir return ::chart::ContainerHelper::ContainerToSequence( aProperties );
114cdf0e10cSrcweir }
115cdf0e10cSrcweir
116cdf0e10cSrcweir };
117cdf0e10cSrcweir
118cdf0e10cSrcweir struct StaticBarChartTypeTemplateInfoHelper : public rtl::StaticAggregate< ::cppu::OPropertyArrayHelper, StaticBarChartTypeTemplateInfoHelper_Initializer >
119cdf0e10cSrcweir {
120cdf0e10cSrcweir };
121cdf0e10cSrcweir
122cdf0e10cSrcweir struct StaticBarChartTypeTemplateInfo_Initializer
123cdf0e10cSrcweir {
operator ()__anone3cba5ba0111::StaticBarChartTypeTemplateInfo_Initializer124cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo >* operator()()
125cdf0e10cSrcweir {
126cdf0e10cSrcweir static uno::Reference< beans::XPropertySetInfo > xPropertySetInfo(
127cdf0e10cSrcweir ::cppu::OPropertySetHelper::createPropertySetInfo(*StaticBarChartTypeTemplateInfoHelper::get() ) );
128cdf0e10cSrcweir return &xPropertySetInfo;
129cdf0e10cSrcweir }
130cdf0e10cSrcweir };
131cdf0e10cSrcweir
132cdf0e10cSrcweir struct StaticBarChartTypeTemplateInfo : public rtl::StaticAggregate< uno::Reference< beans::XPropertySetInfo >, StaticBarChartTypeTemplateInfo_Initializer >
133cdf0e10cSrcweir {
134cdf0e10cSrcweir };
135cdf0e10cSrcweir
136cdf0e10cSrcweir } // anonymous namespace
137cdf0e10cSrcweir
138cdf0e10cSrcweir namespace chart
139cdf0e10cSrcweir {
140cdf0e10cSrcweir
BarChartTypeTemplate(Reference<uno::XComponentContext> const & xContext,const OUString & rServiceName,StackMode eStackMode,BarDirection eDirection,sal_Int32 nDim)141cdf0e10cSrcweir BarChartTypeTemplate::BarChartTypeTemplate(
142cdf0e10cSrcweir Reference<
143cdf0e10cSrcweir uno::XComponentContext > const & xContext,
144cdf0e10cSrcweir const OUString & rServiceName,
145cdf0e10cSrcweir StackMode eStackMode,
146cdf0e10cSrcweir BarDirection eDirection,
147cdf0e10cSrcweir sal_Int32 nDim /* = 2 */ ) :
148cdf0e10cSrcweir ChartTypeTemplate( xContext, rServiceName ),
149cdf0e10cSrcweir ::property::OPropertySet( m_aMutex ),
150cdf0e10cSrcweir m_eStackMode( eStackMode ),
151cdf0e10cSrcweir m_eBarDirection( eDirection ),
152cdf0e10cSrcweir m_nDim( nDim )
153cdf0e10cSrcweir {}
154cdf0e10cSrcweir
~BarChartTypeTemplate()155cdf0e10cSrcweir BarChartTypeTemplate::~BarChartTypeTemplate()
156cdf0e10cSrcweir {}
157cdf0e10cSrcweir
getDimension() const158cdf0e10cSrcweir sal_Int32 BarChartTypeTemplate::getDimension() const
159cdf0e10cSrcweir {
160cdf0e10cSrcweir return m_nDim;
161cdf0e10cSrcweir }
162cdf0e10cSrcweir
getStackMode(sal_Int32) const163cdf0e10cSrcweir StackMode BarChartTypeTemplate::getStackMode( sal_Int32 /* nChartTypeIndex */ ) const
164cdf0e10cSrcweir {
165cdf0e10cSrcweir return m_eStackMode;
166cdf0e10cSrcweir }
167cdf0e10cSrcweir
isSwapXAndY() const168cdf0e10cSrcweir bool BarChartTypeTemplate::isSwapXAndY() const
169cdf0e10cSrcweir {
170cdf0e10cSrcweir return (m_eBarDirection == HORIZONTAL);
171cdf0e10cSrcweir }
172cdf0e10cSrcweir
173cdf0e10cSrcweir // ____ XChartTypeTemplate ____
matchesTemplate(const Reference<chart2::XDiagram> & xDiagram,sal_Bool bAdaptProperties)174cdf0e10cSrcweir sal_Bool SAL_CALL BarChartTypeTemplate::matchesTemplate(
175cdf0e10cSrcweir const Reference< chart2::XDiagram >& xDiagram,
176cdf0e10cSrcweir sal_Bool bAdaptProperties )
177cdf0e10cSrcweir throw (uno::RuntimeException)
178cdf0e10cSrcweir {
179cdf0e10cSrcweir sal_Bool bResult = ChartTypeTemplate::matchesTemplate( xDiagram, bAdaptProperties );
180cdf0e10cSrcweir
181cdf0e10cSrcweir //check BarDirection
182cdf0e10cSrcweir if( bResult )
183cdf0e10cSrcweir {
184cdf0e10cSrcweir bool bFound = false;
185cdf0e10cSrcweir bool bAmbiguous = false;
186cdf0e10cSrcweir bool bVertical = DiagramHelper::getVertical( xDiagram, bFound, bAmbiguous );
187cdf0e10cSrcweir if( m_eBarDirection == HORIZONTAL )
188cdf0e10cSrcweir bResult = sal_Bool( bVertical );
189cdf0e10cSrcweir else if( m_eBarDirection == VERTICAL )
190cdf0e10cSrcweir bResult = sal_Bool( !bVertical );
191cdf0e10cSrcweir }
192cdf0e10cSrcweir
193cdf0e10cSrcweir // adapt solid-type of template according to values in series
194cdf0e10cSrcweir if( bAdaptProperties &&
195cdf0e10cSrcweir bResult &&
196cdf0e10cSrcweir getDimension() == 3 )
197cdf0e10cSrcweir {
198cdf0e10cSrcweir ::std::vector< Reference< chart2::XDataSeries > > aSeriesVec(
199cdf0e10cSrcweir DiagramHelper::getDataSeriesFromDiagram( xDiagram ));
200cdf0e10cSrcweir
201cdf0e10cSrcweir bool bGeomFound = false, bGeomAmbiguous = false;
202cdf0e10cSrcweir sal_Int32 aCommonGeom = DiagramHelper::getGeometry3D( xDiagram, bGeomFound, bGeomAmbiguous );
203cdf0e10cSrcweir
204cdf0e10cSrcweir if( !bGeomAmbiguous )
205cdf0e10cSrcweir {
206cdf0e10cSrcweir setFastPropertyValue_NoBroadcast(
207cdf0e10cSrcweir PROP_BAR_TEMPLATE_GEOMETRY3D, uno::makeAny( aCommonGeom ));
208cdf0e10cSrcweir }
209cdf0e10cSrcweir }
210cdf0e10cSrcweir
211cdf0e10cSrcweir return bResult;
212cdf0e10cSrcweir }
getChartTypeForIndex(sal_Int32)213cdf0e10cSrcweir Reference< chart2::XChartType > BarChartTypeTemplate::getChartTypeForIndex( sal_Int32 /*nChartTypeIndex*/ )
214cdf0e10cSrcweir {
215cdf0e10cSrcweir Reference< chart2::XChartType > xResult;
216cdf0e10cSrcweir
217cdf0e10cSrcweir try
218cdf0e10cSrcweir {
219cdf0e10cSrcweir Reference< lang::XMultiServiceFactory > xFact(
220cdf0e10cSrcweir GetComponentContext()->getServiceManager(), uno::UNO_QUERY_THROW );
221cdf0e10cSrcweir xResult.set( xFact->createInstance(
222cdf0e10cSrcweir CHART2_SERVICE_NAME_CHARTTYPE_COLUMN ), uno::UNO_QUERY_THROW );
223cdf0e10cSrcweir }
224cdf0e10cSrcweir catch( uno::Exception & ex )
225cdf0e10cSrcweir {
226cdf0e10cSrcweir ASSERT_EXCEPTION( ex );
227cdf0e10cSrcweir }
228cdf0e10cSrcweir
229cdf0e10cSrcweir return xResult;
230cdf0e10cSrcweir }
231cdf0e10cSrcweir
getChartTypeForNewSeries(const uno::Sequence<Reference<chart2::XChartType>> & aFormerlyUsedChartTypes)232cdf0e10cSrcweir Reference< chart2::XChartType > SAL_CALL BarChartTypeTemplate::getChartTypeForNewSeries(
233cdf0e10cSrcweir const uno::Sequence< Reference< chart2::XChartType > >& aFormerlyUsedChartTypes )
234cdf0e10cSrcweir throw (uno::RuntimeException)
235cdf0e10cSrcweir {
236cdf0e10cSrcweir Reference< chart2::XChartType > xResult( getChartTypeForIndex( 0 ) );
237cdf0e10cSrcweir ChartTypeTemplate::copyPropertiesFromOldToNewCoordianteSystem( aFormerlyUsedChartTypes, xResult );
238cdf0e10cSrcweir return xResult;
239cdf0e10cSrcweir }
240cdf0e10cSrcweir
241cdf0e10cSrcweir
242cdf0e10cSrcweir // ____ OPropertySet ____
GetDefaultValue(sal_Int32 nHandle) const243cdf0e10cSrcweir uno::Any BarChartTypeTemplate::GetDefaultValue( sal_Int32 nHandle ) const
244cdf0e10cSrcweir throw(beans::UnknownPropertyException)
245cdf0e10cSrcweir {
246cdf0e10cSrcweir const tPropertyValueMap& rStaticDefaults = *StaticBarChartTypeTemplateDefaults::get();
247cdf0e10cSrcweir tPropertyValueMap::const_iterator aFound( rStaticDefaults.find( nHandle ) );
248cdf0e10cSrcweir if( aFound == rStaticDefaults.end() )
249cdf0e10cSrcweir return uno::Any();
250cdf0e10cSrcweir return (*aFound).second;
251cdf0e10cSrcweir }
252cdf0e10cSrcweir
getInfoHelper()253cdf0e10cSrcweir ::cppu::IPropertyArrayHelper & SAL_CALL BarChartTypeTemplate::getInfoHelper()
254cdf0e10cSrcweir {
255cdf0e10cSrcweir return *StaticBarChartTypeTemplateInfoHelper::get();
256cdf0e10cSrcweir }
257cdf0e10cSrcweir
258cdf0e10cSrcweir // ____ XPropertySet ____
getPropertySetInfo()259cdf0e10cSrcweir Reference< beans::XPropertySetInfo > SAL_CALL BarChartTypeTemplate::getPropertySetInfo()
260cdf0e10cSrcweir throw (uno::RuntimeException)
261cdf0e10cSrcweir {
262cdf0e10cSrcweir return *StaticBarChartTypeTemplateInfo::get();
263cdf0e10cSrcweir }
264cdf0e10cSrcweir
applyStyle(const Reference<chart2::XDataSeries> & xSeries,::sal_Int32 nChartTypeIndex,::sal_Int32 nSeriesIndex,::sal_Int32 nSeriesCount)265cdf0e10cSrcweir void SAL_CALL BarChartTypeTemplate::applyStyle(
266cdf0e10cSrcweir const Reference< chart2::XDataSeries >& xSeries,
267cdf0e10cSrcweir ::sal_Int32 nChartTypeIndex,
268cdf0e10cSrcweir ::sal_Int32 nSeriesIndex,
269cdf0e10cSrcweir ::sal_Int32 nSeriesCount )
270cdf0e10cSrcweir throw (uno::RuntimeException)
271cdf0e10cSrcweir {
272cdf0e10cSrcweir ChartTypeTemplate::applyStyle( xSeries, nChartTypeIndex, nSeriesIndex, nSeriesCount );
273cdf0e10cSrcweir DataSeriesHelper::setPropertyAlsoToAllAttributedDataPoints( xSeries, C2U( "BorderStyle" ), uno::makeAny( drawing::LineStyle_NONE ) );
274cdf0e10cSrcweir if( getDimension() == 3 )
275cdf0e10cSrcweir {
276cdf0e10cSrcweir try
277cdf0e10cSrcweir {
278cdf0e10cSrcweir //apply Geometry3D
279cdf0e10cSrcweir uno::Any aAGeometry3D;
280cdf0e10cSrcweir this->getFastPropertyValue( aAGeometry3D, PROP_BAR_TEMPLATE_GEOMETRY3D );
281cdf0e10cSrcweir DataSeriesHelper::setPropertyAlsoToAllAttributedDataPoints( xSeries, C2U( "Geometry3D" ), aAGeometry3D );
282cdf0e10cSrcweir }
283cdf0e10cSrcweir catch( uno::Exception & ex )
284cdf0e10cSrcweir {
285cdf0e10cSrcweir ASSERT_EXCEPTION( ex );
286cdf0e10cSrcweir }
287cdf0e10cSrcweir }
288cdf0e10cSrcweir }
289cdf0e10cSrcweir
resetStyles(const Reference<chart2::XDiagram> & xDiagram)290cdf0e10cSrcweir void SAL_CALL BarChartTypeTemplate::resetStyles(
291cdf0e10cSrcweir const Reference< chart2::XDiagram >& xDiagram )
292cdf0e10cSrcweir throw (uno::RuntimeException)
293cdf0e10cSrcweir {
294cdf0e10cSrcweir ChartTypeTemplate::resetStyles( xDiagram );
295cdf0e10cSrcweir ::std::vector< Reference< chart2::XDataSeries > > aSeriesVec(
296cdf0e10cSrcweir DiagramHelper::getDataSeriesFromDiagram( xDiagram ));
297cdf0e10cSrcweir uno::Any aLineStyleAny( uno::makeAny( drawing::LineStyle_NONE ));
298cdf0e10cSrcweir for( ::std::vector< Reference< chart2::XDataSeries > >::iterator aIt( aSeriesVec.begin());
299cdf0e10cSrcweir aIt != aSeriesVec.end(); ++aIt )
300cdf0e10cSrcweir {
301cdf0e10cSrcweir Reference< beans::XPropertyState > xState( *aIt, uno::UNO_QUERY );
302cdf0e10cSrcweir if( xState.is())
303cdf0e10cSrcweir {
304cdf0e10cSrcweir if( getDimension() == 3 )
305cdf0e10cSrcweir xState->setPropertyToDefault( C2U("Geometry3D"));
306cdf0e10cSrcweir Reference< beans::XPropertySet > xProp( xState, uno::UNO_QUERY );
307cdf0e10cSrcweir if( xProp.is() &&
308cdf0e10cSrcweir xProp->getPropertyValue( C2U("BorderStyle")) == aLineStyleAny )
309cdf0e10cSrcweir {
310cdf0e10cSrcweir xState->setPropertyToDefault( C2U("BorderStyle"));
311cdf0e10cSrcweir }
312cdf0e10cSrcweir }
313cdf0e10cSrcweir }
314cdf0e10cSrcweir
315cdf0e10cSrcweir DiagramHelper::setVertical( xDiagram, false );
316cdf0e10cSrcweir }
317cdf0e10cSrcweir
318cdf0e10cSrcweir
createCoordinateSystems(const Reference<chart2::XCoordinateSystemContainer> & xCooSysCnt)319cdf0e10cSrcweir void BarChartTypeTemplate::createCoordinateSystems(
320cdf0e10cSrcweir const Reference< chart2::XCoordinateSystemContainer > & xCooSysCnt )
321cdf0e10cSrcweir {
322cdf0e10cSrcweir ChartTypeTemplate::createCoordinateSystems( xCooSysCnt );
323cdf0e10cSrcweir
324cdf0e10cSrcweir Reference< chart2::XDiagram > xDiagram( xCooSysCnt, uno::UNO_QUERY );
325cdf0e10cSrcweir DiagramHelper::setVertical( xDiagram, m_eBarDirection == HORIZONTAL );
326cdf0e10cSrcweir }
327cdf0e10cSrcweir
328cdf0e10cSrcweir // ----------------------------------------
329cdf0e10cSrcweir
getSupportedServiceNames_Static()330cdf0e10cSrcweir Sequence< OUString > BarChartTypeTemplate::getSupportedServiceNames_Static()
331cdf0e10cSrcweir {
332cdf0e10cSrcweir Sequence< OUString > aServices( 2 );
333cdf0e10cSrcweir aServices[ 0 ] = lcl_aServiceName;
334cdf0e10cSrcweir aServices[ 1 ] = C2U( "com.sun.star.chart2.ChartTypeTemplate" );
335cdf0e10cSrcweir return aServices;
336cdf0e10cSrcweir }
337cdf0e10cSrcweir
338cdf0e10cSrcweir // implement XServiceInfo methods basing upon getSupportedServiceNames_Static
339cdf0e10cSrcweir APPHELPER_XSERVICEINFO_IMPL( BarChartTypeTemplate, lcl_aServiceName );
340cdf0e10cSrcweir
341cdf0e10cSrcweir IMPLEMENT_FORWARD_XINTERFACE2( BarChartTypeTemplate, ChartTypeTemplate, OPropertySet )
342cdf0e10cSrcweir IMPLEMENT_FORWARD_XTYPEPROVIDER2( BarChartTypeTemplate, ChartTypeTemplate, OPropertySet )
343cdf0e10cSrcweir
344cdf0e10cSrcweir } // namespace chart
345