1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_chart2.hxx"
26*b1cdbd2cSJim Jagielski #include "BubbleChartTypeTemplate.hxx"
27*b1cdbd2cSJim Jagielski #include "macros.hxx"
28*b1cdbd2cSJim Jagielski #include "BubbleDataInterpreter.hxx"
29*b1cdbd2cSJim Jagielski #include "CartesianCoordinateSystem.hxx"
30*b1cdbd2cSJim Jagielski #include "Scaling.hxx"
31*b1cdbd2cSJim Jagielski #include "DiagramHelper.hxx"
32*b1cdbd2cSJim Jagielski #include "servicenames_charttypes.hxx"
33*b1cdbd2cSJim Jagielski #include "ContainerHelper.hxx"
34*b1cdbd2cSJim Jagielski #include "DataSeriesHelper.hxx"
35*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/LineStyle.hpp>
36*b1cdbd2cSJim Jagielski #include "PropertyHelper.hxx"
37*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyAttribute.hpp>
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski #include <algorithm>
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference;
44*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Sequence;
45*b1cdbd2cSJim Jagielski using ::rtl::OUString;
46*b1cdbd2cSJim Jagielski using ::com::sun::star::beans::Property;
47*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference;
48*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Any;
49*b1cdbd2cSJim Jagielski using ::osl::MutexGuard;
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski namespace
52*b1cdbd2cSJim Jagielski {
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski static const OUString lcl_aServiceName(
55*b1cdbd2cSJim Jagielski     RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart2.BubbleChartTypeTemplate" ));
56*b1cdbd2cSJim Jagielski 
lcl_AddPropertiesToVector(::std::vector<Property> &)57*b1cdbd2cSJim Jagielski void lcl_AddPropertiesToVector(
58*b1cdbd2cSJim Jagielski     ::std::vector< Property > & /*rOutProperties*/ )
59*b1cdbd2cSJim Jagielski {
60*b1cdbd2cSJim Jagielski }
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski struct StaticBubbleChartTypeTemplateDefaults_Initializer
63*b1cdbd2cSJim Jagielski {
operator ()__anona10197da0111::StaticBubbleChartTypeTemplateDefaults_Initializer64*b1cdbd2cSJim Jagielski     ::chart::tPropertyValueMap* operator()()
65*b1cdbd2cSJim Jagielski     {
66*b1cdbd2cSJim Jagielski         static ::chart::tPropertyValueMap aStaticDefaults;
67*b1cdbd2cSJim Jagielski         lcl_AddDefaultsToMap( aStaticDefaults );
68*b1cdbd2cSJim Jagielski         return &aStaticDefaults;
69*b1cdbd2cSJim Jagielski     }
70*b1cdbd2cSJim Jagielski private:
lcl_AddDefaultsToMap__anona10197da0111::StaticBubbleChartTypeTemplateDefaults_Initializer71*b1cdbd2cSJim Jagielski     void lcl_AddDefaultsToMap( ::chart::tPropertyValueMap & /*rOutMap*/ )
72*b1cdbd2cSJim Jagielski     {
73*b1cdbd2cSJim Jagielski     }
74*b1cdbd2cSJim Jagielski };
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski struct StaticBubbleChartTypeTemplateDefaults : public rtl::StaticAggregate< ::chart::tPropertyValueMap, StaticBubbleChartTypeTemplateDefaults_Initializer >
77*b1cdbd2cSJim Jagielski {
78*b1cdbd2cSJim Jagielski };
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski struct StaticBubbleChartTypeTemplateInfoHelper_Initializer
81*b1cdbd2cSJim Jagielski {
operator ()__anona10197da0111::StaticBubbleChartTypeTemplateInfoHelper_Initializer82*b1cdbd2cSJim Jagielski     ::cppu::OPropertyArrayHelper* operator()()
83*b1cdbd2cSJim Jagielski     {
84*b1cdbd2cSJim Jagielski         static ::cppu::OPropertyArrayHelper aPropHelper( lcl_GetPropertySequence() );
85*b1cdbd2cSJim Jagielski         return &aPropHelper;
86*b1cdbd2cSJim Jagielski     }
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski private:
lcl_GetPropertySequence__anona10197da0111::StaticBubbleChartTypeTemplateInfoHelper_Initializer89*b1cdbd2cSJim Jagielski     Sequence< Property > lcl_GetPropertySequence()
90*b1cdbd2cSJim Jagielski     {
91*b1cdbd2cSJim Jagielski         ::std::vector< ::com::sun::star::beans::Property > aProperties;
92*b1cdbd2cSJim Jagielski         lcl_AddPropertiesToVector( aProperties );
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski         ::std::sort( aProperties.begin(), aProperties.end(),
95*b1cdbd2cSJim Jagielski                      ::chart::PropertyNameLess() );
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski         return ::chart::ContainerHelper::ContainerToSequence( aProperties );
98*b1cdbd2cSJim Jagielski     }
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski };
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski struct StaticBubbleChartTypeTemplateInfoHelper : public rtl::StaticAggregate< ::cppu::OPropertyArrayHelper, StaticBubbleChartTypeTemplateInfoHelper_Initializer >
103*b1cdbd2cSJim Jagielski {
104*b1cdbd2cSJim Jagielski };
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski struct StaticBubbleChartTypeTemplateInfo_Initializer
107*b1cdbd2cSJim Jagielski {
operator ()__anona10197da0111::StaticBubbleChartTypeTemplateInfo_Initializer108*b1cdbd2cSJim Jagielski     uno::Reference< beans::XPropertySetInfo >* operator()()
109*b1cdbd2cSJim Jagielski     {
110*b1cdbd2cSJim Jagielski         static uno::Reference< beans::XPropertySetInfo > xPropertySetInfo(
111*b1cdbd2cSJim Jagielski             ::cppu::OPropertySetHelper::createPropertySetInfo(*StaticBubbleChartTypeTemplateInfoHelper::get() ) );
112*b1cdbd2cSJim Jagielski         return &xPropertySetInfo;
113*b1cdbd2cSJim Jagielski     }
114*b1cdbd2cSJim Jagielski };
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski struct StaticBubbleChartTypeTemplateInfo : public rtl::StaticAggregate< uno::Reference< beans::XPropertySetInfo >, StaticBubbleChartTypeTemplateInfo_Initializer >
117*b1cdbd2cSJim Jagielski {
118*b1cdbd2cSJim Jagielski };
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski } // anonymous namespace
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski namespace chart
123*b1cdbd2cSJim Jagielski {
124*b1cdbd2cSJim Jagielski 
BubbleChartTypeTemplate(Reference<uno::XComponentContext> const & xContext,const OUString & rServiceName)125*b1cdbd2cSJim Jagielski BubbleChartTypeTemplate::BubbleChartTypeTemplate(
126*b1cdbd2cSJim Jagielski     Reference<
127*b1cdbd2cSJim Jagielski         uno::XComponentContext > const & xContext,
128*b1cdbd2cSJim Jagielski     const OUString & rServiceName ) :
129*b1cdbd2cSJim Jagielski         ChartTypeTemplate( xContext, rServiceName ),
130*b1cdbd2cSJim Jagielski         ::property::OPropertySet( m_aMutex )
131*b1cdbd2cSJim Jagielski {
132*b1cdbd2cSJim Jagielski }
133*b1cdbd2cSJim Jagielski 
~BubbleChartTypeTemplate()134*b1cdbd2cSJim Jagielski BubbleChartTypeTemplate::~BubbleChartTypeTemplate()
135*b1cdbd2cSJim Jagielski {}
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski // ____ OPropertySet ____
GetDefaultValue(sal_Int32 nHandle) const138*b1cdbd2cSJim Jagielski uno::Any BubbleChartTypeTemplate::GetDefaultValue( sal_Int32 nHandle ) const
139*b1cdbd2cSJim Jagielski     throw(beans::UnknownPropertyException)
140*b1cdbd2cSJim Jagielski {
141*b1cdbd2cSJim Jagielski     const tPropertyValueMap& rStaticDefaults = *StaticBubbleChartTypeTemplateDefaults::get();
142*b1cdbd2cSJim Jagielski     tPropertyValueMap::const_iterator aFound( rStaticDefaults.find( nHandle ) );
143*b1cdbd2cSJim Jagielski     if( aFound == rStaticDefaults.end() )
144*b1cdbd2cSJim Jagielski         return uno::Any();
145*b1cdbd2cSJim Jagielski     return (*aFound).second;
146*b1cdbd2cSJim Jagielski }
147*b1cdbd2cSJim Jagielski 
getInfoHelper()148*b1cdbd2cSJim Jagielski ::cppu::IPropertyArrayHelper & SAL_CALL BubbleChartTypeTemplate::getInfoHelper()
149*b1cdbd2cSJim Jagielski {
150*b1cdbd2cSJim Jagielski     return *StaticBubbleChartTypeTemplateInfoHelper::get();
151*b1cdbd2cSJim Jagielski }
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski // ____ XPropertySet ____
getPropertySetInfo()154*b1cdbd2cSJim Jagielski uno::Reference< beans::XPropertySetInfo > SAL_CALL BubbleChartTypeTemplate::getPropertySetInfo()
155*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
156*b1cdbd2cSJim Jagielski {
157*b1cdbd2cSJim Jagielski     return *StaticBubbleChartTypeTemplateInfo::get();
158*b1cdbd2cSJim Jagielski }
159*b1cdbd2cSJim Jagielski 
getDimension() const160*b1cdbd2cSJim Jagielski sal_Int32 BubbleChartTypeTemplate::getDimension() const
161*b1cdbd2cSJim Jagielski {
162*b1cdbd2cSJim Jagielski     return 2;
163*b1cdbd2cSJim Jagielski }
164*b1cdbd2cSJim Jagielski 
getStackMode(sal_Int32) const165*b1cdbd2cSJim Jagielski StackMode BubbleChartTypeTemplate::getStackMode( sal_Int32 /* nChartTypeIndex */ ) const
166*b1cdbd2cSJim Jagielski {
167*b1cdbd2cSJim Jagielski     return StackMode_NONE;
168*b1cdbd2cSJim Jagielski }
169*b1cdbd2cSJim Jagielski 
applyStyle(const Reference<chart2::XDataSeries> & xSeries,::sal_Int32 nChartTypeIndex,::sal_Int32 nSeriesIndex,::sal_Int32 nSeriesCount)170*b1cdbd2cSJim Jagielski void SAL_CALL BubbleChartTypeTemplate::applyStyle(
171*b1cdbd2cSJim Jagielski     const Reference< chart2::XDataSeries >& xSeries,
172*b1cdbd2cSJim Jagielski     ::sal_Int32 nChartTypeIndex,
173*b1cdbd2cSJim Jagielski     ::sal_Int32 nSeriesIndex,
174*b1cdbd2cSJim Jagielski     ::sal_Int32 nSeriesCount )
175*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
176*b1cdbd2cSJim Jagielski {
177*b1cdbd2cSJim Jagielski     ChartTypeTemplate::applyStyle( xSeries, nChartTypeIndex, nSeriesIndex, nSeriesCount );
178*b1cdbd2cSJim Jagielski     DataSeriesHelper::setPropertyAlsoToAllAttributedDataPoints( xSeries, C2U( "BorderStyle" ), uno::makeAny( drawing::LineStyle_NONE ) );
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski     try
181*b1cdbd2cSJim Jagielski     {
182*b1cdbd2cSJim Jagielski     }
183*b1cdbd2cSJim Jagielski     catch( uno::Exception & ex )
184*b1cdbd2cSJim Jagielski     {
185*b1cdbd2cSJim Jagielski         ASSERT_EXCEPTION( ex );
186*b1cdbd2cSJim Jagielski     }
187*b1cdbd2cSJim Jagielski }
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski // ____ XChartTypeTemplate ____
supportsCategories()190*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL BubbleChartTypeTemplate::supportsCategories()
191*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
192*b1cdbd2cSJim Jagielski {
193*b1cdbd2cSJim Jagielski     return false;
194*b1cdbd2cSJim Jagielski }
195*b1cdbd2cSJim Jagielski 
matchesTemplate(const Reference<chart2::XDiagram> & xDiagram,sal_Bool bAdaptProperties)196*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL BubbleChartTypeTemplate::matchesTemplate(
197*b1cdbd2cSJim Jagielski     const Reference< chart2::XDiagram >& xDiagram,
198*b1cdbd2cSJim Jagielski     sal_Bool bAdaptProperties )
199*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
200*b1cdbd2cSJim Jagielski {
201*b1cdbd2cSJim Jagielski     sal_Bool bResult = ChartTypeTemplate::matchesTemplate( xDiagram, bAdaptProperties );
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski     if( bResult )
204*b1cdbd2cSJim Jagielski     {
205*b1cdbd2cSJim Jagielski         ::std::vector< Reference< chart2::XDataSeries > > aSeriesVec(
206*b1cdbd2cSJim Jagielski             DiagramHelper::getDataSeriesFromDiagram( xDiagram ));
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski         for( ::std::vector< Reference< chart2::XDataSeries > >::const_iterator aIt =
209*b1cdbd2cSJim Jagielski                  aSeriesVec.begin(); aIt != aSeriesVec.end(); ++aIt )
210*b1cdbd2cSJim Jagielski         {
211*b1cdbd2cSJim Jagielski             try
212*b1cdbd2cSJim Jagielski             {
213*b1cdbd2cSJim Jagielski             }
214*b1cdbd2cSJim Jagielski             catch( uno::Exception & ex )
215*b1cdbd2cSJim Jagielski             {
216*b1cdbd2cSJim Jagielski                 ASSERT_EXCEPTION( ex );
217*b1cdbd2cSJim Jagielski             }
218*b1cdbd2cSJim Jagielski         }
219*b1cdbd2cSJim Jagielski     }
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski     // adapt curve style, spline order and resolution
222*b1cdbd2cSJim Jagielski     if( bResult && bAdaptProperties )
223*b1cdbd2cSJim Jagielski     {
224*b1cdbd2cSJim Jagielski         try
225*b1cdbd2cSJim Jagielski         {
226*b1cdbd2cSJim Jagielski         }
227*b1cdbd2cSJim Jagielski         catch( uno::Exception & ex )
228*b1cdbd2cSJim Jagielski         {
229*b1cdbd2cSJim Jagielski             ASSERT_EXCEPTION( ex );
230*b1cdbd2cSJim Jagielski         }
231*b1cdbd2cSJim Jagielski     }
232*b1cdbd2cSJim Jagielski 
233*b1cdbd2cSJim Jagielski     return bResult;
234*b1cdbd2cSJim Jagielski }
235*b1cdbd2cSJim Jagielski 
getChartTypeForIndex(sal_Int32)236*b1cdbd2cSJim Jagielski Reference< chart2::XChartType > BubbleChartTypeTemplate::getChartTypeForIndex( sal_Int32 /*nChartTypeIndex*/ )
237*b1cdbd2cSJim Jagielski {
238*b1cdbd2cSJim Jagielski     Reference< chart2::XChartType > xResult;
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski     try
241*b1cdbd2cSJim Jagielski     {
242*b1cdbd2cSJim Jagielski         Reference< lang::XMultiServiceFactory > xFact(
243*b1cdbd2cSJim Jagielski             GetComponentContext()->getServiceManager(), uno::UNO_QUERY_THROW );
244*b1cdbd2cSJim Jagielski         xResult.set( xFact->createInstance(
245*b1cdbd2cSJim Jagielski                          CHART2_SERVICE_NAME_CHARTTYPE_BUBBLE ), uno::UNO_QUERY_THROW );
246*b1cdbd2cSJim Jagielski     }
247*b1cdbd2cSJim Jagielski     catch( uno::Exception & ex )
248*b1cdbd2cSJim Jagielski     {
249*b1cdbd2cSJim Jagielski         ASSERT_EXCEPTION( ex );
250*b1cdbd2cSJim Jagielski     }
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski     return xResult;
253*b1cdbd2cSJim Jagielski }
254*b1cdbd2cSJim Jagielski 
getChartTypeForNewSeries(const uno::Sequence<Reference<chart2::XChartType>> & aFormerlyUsedChartTypes)255*b1cdbd2cSJim Jagielski Reference< chart2::XChartType > SAL_CALL BubbleChartTypeTemplate::getChartTypeForNewSeries(
256*b1cdbd2cSJim Jagielski         const uno::Sequence< Reference< chart2::XChartType > >& aFormerlyUsedChartTypes )
257*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
258*b1cdbd2cSJim Jagielski {
259*b1cdbd2cSJim Jagielski     Reference< chart2::XChartType > xResult;
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski     try
262*b1cdbd2cSJim Jagielski     {
263*b1cdbd2cSJim Jagielski         Reference< lang::XMultiServiceFactory > xFact(
264*b1cdbd2cSJim Jagielski             GetComponentContext()->getServiceManager(), uno::UNO_QUERY_THROW );
265*b1cdbd2cSJim Jagielski         xResult.set( xFact->createInstance(
266*b1cdbd2cSJim Jagielski                          CHART2_SERVICE_NAME_CHARTTYPE_BUBBLE ), uno::UNO_QUERY_THROW );
267*b1cdbd2cSJim Jagielski 
268*b1cdbd2cSJim Jagielski         ChartTypeTemplate::copyPropertiesFromOldToNewCoordianteSystem( aFormerlyUsedChartTypes, xResult );
269*b1cdbd2cSJim Jagielski     }
270*b1cdbd2cSJim Jagielski     catch( uno::Exception & ex )
271*b1cdbd2cSJim Jagielski     {
272*b1cdbd2cSJim Jagielski         ASSERT_EXCEPTION( ex );
273*b1cdbd2cSJim Jagielski     }
274*b1cdbd2cSJim Jagielski 
275*b1cdbd2cSJim Jagielski     return xResult;
276*b1cdbd2cSJim Jagielski }
277*b1cdbd2cSJim Jagielski 
getDataInterpreter()278*b1cdbd2cSJim Jagielski Reference< chart2::XDataInterpreter > SAL_CALL BubbleChartTypeTemplate::getDataInterpreter()
279*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
280*b1cdbd2cSJim Jagielski {
281*b1cdbd2cSJim Jagielski     if( ! m_xDataInterpreter.is())
282*b1cdbd2cSJim Jagielski         m_xDataInterpreter.set( new BubbleDataInterpreter( GetComponentContext()) );
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski     return m_xDataInterpreter;
285*b1cdbd2cSJim Jagielski }
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski // ----------------------------------------
288*b1cdbd2cSJim Jagielski 
getSupportedServiceNames_Static()289*b1cdbd2cSJim Jagielski Sequence< OUString > BubbleChartTypeTemplate::getSupportedServiceNames_Static()
290*b1cdbd2cSJim Jagielski {
291*b1cdbd2cSJim Jagielski     Sequence< OUString > aServices( 2 );
292*b1cdbd2cSJim Jagielski     aServices[ 0 ] = lcl_aServiceName;
293*b1cdbd2cSJim Jagielski     aServices[ 1 ] = C2U( "com.sun.star.chart2.ChartTypeTemplate" );
294*b1cdbd2cSJim Jagielski     return aServices;
295*b1cdbd2cSJim Jagielski }
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski // implement XServiceInfo methods basing upon getSupportedServiceNames_Static
298*b1cdbd2cSJim Jagielski APPHELPER_XSERVICEINFO_IMPL( BubbleChartTypeTemplate, lcl_aServiceName );
299*b1cdbd2cSJim Jagielski 
300*b1cdbd2cSJim Jagielski IMPLEMENT_FORWARD_XINTERFACE2( BubbleChartTypeTemplate, ChartTypeTemplate, OPropertySet )
301*b1cdbd2cSJim Jagielski IMPLEMENT_FORWARD_XTYPEPROVIDER2( BubbleChartTypeTemplate, ChartTypeTemplate, OPropertySet )
302*b1cdbd2cSJim Jagielski 
303*b1cdbd2cSJim Jagielski } //  namespace chart
304