xref: /trunk/main/chart2/source/tools/RegressionCurveModel.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 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_charttools.hxx"
26 #include "RegressionCurveModel.hxx"
27 #include "macros.hxx"
28 #include "LineProperties.hxx"
29 #include "RegressionCurveHelper.hxx"
30 #include "RegressionCalculationHelper.hxx"
31 #include "RegressionEquation.hxx"
32 #include "ContainerHelper.hxx"
33 #include "CloneHelper.hxx"
34 #include "PropertyHelper.hxx"
35 #include <com/sun/star/beans/PropertyAttribute.hpp>
36 #include <rtl/math.hxx>
37 #include <rtl/ustrbuf.hxx>
38 
39 using namespace ::com::sun::star;
40 
41 using ::rtl::OUString;
42 using ::rtl::OUStringBuffer;
43 using ::com::sun::star::beans::Property;
44 using ::osl::MutexGuard;
45 
46 namespace
47 {
48 static const OUString lcl_aImplementationName_MeanValue(
49     RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.chart2.MeanValueRegressionCurve" ));
50 static const OUString lcl_aImplementationName_Linear(
51     RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.chart2.LinearRegressionCurve" ));
52 static const OUString lcl_aImplementationName_Logarithmic(
53     RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.chart2.LogarithmicRegressionCurve" ));
54 static const OUString lcl_aImplementationName_Exponential(
55     RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.chart2.ExponentialRegressionCurve" ));
56 static const OUString lcl_aImplementationName_Potential(
57     RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.chart2.PotentialRegressionCurve" ));
58 
59 static const OUString lcl_aServiceName(
60     RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart2.RegressionCurve" ));
61 
62 struct StaticXXXDefaults_Initializer
63 {
operator ()__anon3cf025210111::StaticXXXDefaults_Initializer64     ::chart::tPropertyValueMap* operator()()
65     {
66         static ::chart::tPropertyValueMap aStaticDefaults;
67         lcl_AddDefaultsToMap( aStaticDefaults );
68         return &aStaticDefaults;
69     }
70 private:
lcl_AddDefaultsToMap__anon3cf025210111::StaticXXXDefaults_Initializer71     void lcl_AddDefaultsToMap( ::chart::tPropertyValueMap & rOutMap )
72     {
73         ::chart::LineProperties::AddDefaultsToMap( rOutMap );
74     }
75 };
76 
77 struct StaticXXXDefaults : public rtl::StaticAggregate< ::chart::tPropertyValueMap, StaticXXXDefaults_Initializer >
78 {
79 };
80 
81 struct StaticRegressionCurveInfoHelper_Initializer
82 {
operator ()__anon3cf025210111::StaticRegressionCurveInfoHelper_Initializer83     ::cppu::OPropertyArrayHelper* operator()()
84     {
85         static ::cppu::OPropertyArrayHelper aPropHelper( lcl_GetPropertySequence() );
86         return &aPropHelper;
87     }
88 
89 private:
lcl_GetPropertySequence__anon3cf025210111::StaticRegressionCurveInfoHelper_Initializer90     uno::Sequence< Property > lcl_GetPropertySequence()
91     {
92         ::std::vector< ::com::sun::star::beans::Property > aProperties;
93         ::chart::LineProperties::AddPropertiesToVector( aProperties );
94 
95         ::std::sort( aProperties.begin(), aProperties.end(),
96                      ::chart::PropertyNameLess() );
97 
98         return ::chart::ContainerHelper::ContainerToSequence( aProperties );
99     }
100 };
101 
102 struct StaticRegressionCurveInfoHelper : public rtl::StaticAggregate< ::cppu::OPropertyArrayHelper, StaticRegressionCurveInfoHelper_Initializer >
103 {
104 };
105 
106 struct StaticRegressionCurveInfo_Initializer
107 {
operator ()__anon3cf025210111::StaticRegressionCurveInfo_Initializer108     uno::Reference< beans::XPropertySetInfo >* operator()()
109     {
110         static uno::Reference< beans::XPropertySetInfo > xPropertySetInfo(
111             ::cppu::OPropertySetHelper::createPropertySetInfo(*StaticRegressionCurveInfoHelper::get() ) );
112         return &xPropertySetInfo;
113     }
114 };
115 
116 struct StaticRegressionCurveInfo : public rtl::StaticAggregate< uno::Reference< beans::XPropertySetInfo >, StaticRegressionCurveInfo_Initializer >
117 {
118 };
119 
120 } // anonymous namespace
121 
122 namespace chart
123 {
124 
RegressionCurveModel(uno::Reference<uno::XComponentContext> const & xContext,tCurveType eCurveType)125 RegressionCurveModel::RegressionCurveModel(
126     uno::Reference< uno::XComponentContext > const & xContext,
127     tCurveType eCurveType ) :
128         ::property::OPropertySet( m_aMutex ),
129     m_xContext( xContext ),
130     m_eRegressionCurveType( eCurveType ),
131         m_xModifyEventForwarder( ModifyListenerHelper::createModifyEventForwarder()),
132         m_xEquationProperties( new RegressionEquation( xContext ))
133 {
134     // set 0 line width (default) hard, so that it is always written to XML,
135     // because the old implementation uses different defaults
136     setFastPropertyValue_NoBroadcast(
137         LineProperties::PROP_LINE_WIDTH, uno::makeAny( sal_Int32( 0 )));
138     ModifyListenerHelper::addListener( m_xEquationProperties, m_xModifyEventForwarder );
139 }
140 
RegressionCurveModel(const RegressionCurveModel & rOther)141 RegressionCurveModel::RegressionCurveModel( const RegressionCurveModel & rOther ) :
142         MutexContainer(),
143         impl::RegressionCurveModel_Base(),
144         ::property::OPropertySet( rOther, m_aMutex ),
145     m_xContext( rOther.m_xContext ),
146     m_eRegressionCurveType( rOther.m_eRegressionCurveType ),
147     m_xModifyEventForwarder( ModifyListenerHelper::createModifyEventForwarder())
148 {
149     m_xEquationProperties.set( CloneHelper::CreateRefClone< uno::Reference< beans::XPropertySet > >()( rOther.m_xEquationProperties ));
150     ModifyListenerHelper::addListener( m_xEquationProperties, m_xModifyEventForwarder );
151 }
152 
~RegressionCurveModel()153 RegressionCurveModel::~RegressionCurveModel()
154 {}
155 
156 // ____ XRegressionCurve ____
157 uno::Reference< chart2::XRegressionCurveCalculator > SAL_CALL
getCalculator()158     RegressionCurveModel::getCalculator()
159 {
160     return RegressionCurveHelper::createRegressionCurveCalculatorByServiceName( getServiceName());
161 }
162 
getEquationProperties()163 uno::Reference< beans::XPropertySet > SAL_CALL RegressionCurveModel::getEquationProperties()
164 {
165     return m_xEquationProperties;
166 }
167 
setEquationProperties(const uno::Reference<beans::XPropertySet> & xEquationProperties)168 void SAL_CALL RegressionCurveModel::setEquationProperties( const uno::Reference< beans::XPropertySet >& xEquationProperties )
169 {
170     if( xEquationProperties.is())
171     {
172         if( m_xEquationProperties.is())
173             ModifyListenerHelper::removeListener( m_xEquationProperties, m_xModifyEventForwarder );
174 
175         m_xEquationProperties.set( xEquationProperties );
176         ModifyListenerHelper::addListener( m_xEquationProperties, m_xModifyEventForwarder );
177         fireModifyEvent();
178     }
179 }
180 
181 // ____ XServiceName ____
getServiceName()182 ::rtl::OUString SAL_CALL RegressionCurveModel::getServiceName()
183 {
184     switch( m_eRegressionCurveType )
185     {
186         case CURVE_TYPE_MEAN_VALUE:
187             return C2U( "com.sun.star.chart2.MeanValueRegressionCurve" );
188         case CURVE_TYPE_LINEAR:
189             return C2U( "com.sun.star.chart2.LinearRegressionCurve" );
190         case CURVE_TYPE_LOGARITHM:
191             return C2U( "com.sun.star.chart2.LogarithmicRegressionCurve" );
192         case CURVE_TYPE_EXPONENTIAL:
193             return C2U( "com.sun.star.chart2.ExponentialRegressionCurve" );
194         case CURVE_TYPE_POWER:
195             return C2U( "com.sun.star.chart2.PotentialRegressionCurve" );
196     }
197 
198     return ::rtl::OUString();
199 }
200 
201 // ____ XModifyBroadcaster ____
addModifyListener(const uno::Reference<util::XModifyListener> & aListener)202 void SAL_CALL RegressionCurveModel::addModifyListener( const uno::Reference< util::XModifyListener >& aListener )
203 {
204     try
205     {
206         uno::Reference< util::XModifyBroadcaster > xBroadcaster( m_xModifyEventForwarder, uno::UNO_QUERY_THROW );
207         xBroadcaster->addModifyListener( aListener );
208     }
209     catch( const uno::Exception & ex )
210     {
211         ASSERT_EXCEPTION( ex );
212     }
213 }
214 
removeModifyListener(const uno::Reference<util::XModifyListener> & aListener)215 void SAL_CALL RegressionCurveModel::removeModifyListener( const uno::Reference< util::XModifyListener >& aListener )
216 {
217     try
218     {
219         uno::Reference< util::XModifyBroadcaster > xBroadcaster( m_xModifyEventForwarder, uno::UNO_QUERY_THROW );
220         xBroadcaster->removeModifyListener( aListener );
221     }
222     catch( const uno::Exception & ex )
223     {
224         ASSERT_EXCEPTION( ex );
225     }
226 }
227 
228 // ____ XModifyListener ____
modified(const lang::EventObject & aEvent)229 void SAL_CALL RegressionCurveModel::modified( const lang::EventObject& aEvent )
230 {
231     m_xModifyEventForwarder->modified( aEvent );
232 }
233 
234 // ____ XEventListener (base of XModifyListener) ____
disposing(const lang::EventObject &)235 void SAL_CALL RegressionCurveModel::disposing( const lang::EventObject& /* Source */ )
236 {
237     // nothing
238 }
239 
240 // ____ OPropertySet ____
firePropertyChangeEvent()241 void RegressionCurveModel::firePropertyChangeEvent()
242 {
243     fireModifyEvent();
244 }
245 
fireModifyEvent()246 void RegressionCurveModel::fireModifyEvent()
247 {
248     m_xModifyEventForwarder->modified( lang::EventObject( static_cast< uno::XWeak* >( this )));
249 }
250 
251 // ================================================================================
252 
253 // ____ OPropertySet ____
GetDefaultValue(sal_Int32 nHandle) const254 uno::Any RegressionCurveModel::GetDefaultValue( sal_Int32 nHandle ) const
255 {
256     const tPropertyValueMap& rStaticDefaults = *StaticXXXDefaults::get();
257     tPropertyValueMap::const_iterator aFound( rStaticDefaults.find( nHandle ) );
258     if( aFound == rStaticDefaults.end() )
259         return uno::Any();
260     return (*aFound).second;
261 }
262 
getInfoHelper()263 ::cppu::IPropertyArrayHelper & SAL_CALL RegressionCurveModel::getInfoHelper()
264 {
265     return *StaticRegressionCurveInfoHelper::get();
266 }
267 
268 // ____ XPropertySet ____
getPropertySetInfo()269 uno::Reference< beans::XPropertySetInfo > SAL_CALL RegressionCurveModel::getPropertySetInfo()
270 {
271     return *StaticRegressionCurveInfo::get();
272 }
273 
274 // ================================================================================
275 
276 // needed by MSC compiler
277 using impl::RegressionCurveModel_Base;
278 
IMPLEMENT_FORWARD_XINTERFACE2(RegressionCurveModel,RegressionCurveModel_Base,OPropertySet)279 IMPLEMENT_FORWARD_XINTERFACE2( RegressionCurveModel, RegressionCurveModel_Base, OPropertySet )
280 IMPLEMENT_FORWARD_XTYPEPROVIDER2( RegressionCurveModel, RegressionCurveModel_Base, OPropertySet )
281 
282 
283 
284 // implementations
285 
286 // --------------------------------------------------------------------------------
287 
288 MeanValueRegressionCurve::MeanValueRegressionCurve(
289     const uno::Reference< uno::XComponentContext > & xContext )
290         : RegressionCurveModel( xContext, RegressionCurveModel::CURVE_TYPE_MEAN_VALUE )
291 {}
MeanValueRegressionCurve(const MeanValueRegressionCurve & rOther)292 MeanValueRegressionCurve::MeanValueRegressionCurve(
293     const MeanValueRegressionCurve & rOther ) :
294         RegressionCurveModel( rOther )
295 {}
~MeanValueRegressionCurve()296 MeanValueRegressionCurve::~MeanValueRegressionCurve()
297 {}
getSupportedServiceNames_Static()298 uno::Sequence< ::rtl::OUString > MeanValueRegressionCurve::getSupportedServiceNames_Static()
299 {
300     uno::Sequence< ::rtl::OUString > aServices( 2 );
301     aServices[ 0 ] = lcl_aServiceName;
302     aServices[ 1 ] = C2U( "com.sun.star.chart2.MeanValueRegressionCurve" );
303     return aServices;
304 }
305 // implement XServiceInfo methods basing upon getSupportedServiceNames_Static
306 APPHELPER_XSERVICEINFO_IMPL( MeanValueRegressionCurve, lcl_aImplementationName_MeanValue );
307 
createClone()308 uno::Reference< util::XCloneable > SAL_CALL MeanValueRegressionCurve::createClone()
309 {
310     return uno::Reference< util::XCloneable >( new MeanValueRegressionCurve( *this ));
311 }
312 
313 // --------------------------------------------------------------------------------
314 
LinearRegressionCurve(const uno::Reference<uno::XComponentContext> & xContext)315 LinearRegressionCurve::LinearRegressionCurve(
316     const uno::Reference< uno::XComponentContext > & xContext )
317         : RegressionCurveModel( xContext, RegressionCurveModel::CURVE_TYPE_LINEAR )
318 {}
LinearRegressionCurve(const LinearRegressionCurve & rOther)319 LinearRegressionCurve::LinearRegressionCurve(
320     const LinearRegressionCurve & rOther ) :
321         RegressionCurveModel( rOther )
322 {}
~LinearRegressionCurve()323 LinearRegressionCurve::~LinearRegressionCurve()
324 {}
getSupportedServiceNames_Static()325 uno::Sequence< ::rtl::OUString > LinearRegressionCurve::getSupportedServiceNames_Static()
326 {
327     uno::Sequence< ::rtl::OUString > aServices( 2 );
328     aServices[ 0 ] = lcl_aServiceName;
329     aServices[ 1 ] = C2U( "com.sun.star.chart2.LinearRegressionCurve" );
330     return aServices;
331 }
332 // implement XServiceInfo methods basing upon getSupportedServiceNames_Static
333 APPHELPER_XSERVICEINFO_IMPL( LinearRegressionCurve, lcl_aImplementationName_Linear );
334 
createClone()335 uno::Reference< util::XCloneable > SAL_CALL LinearRegressionCurve::createClone()
336 {
337     return uno::Reference< util::XCloneable >( new LinearRegressionCurve( *this ));
338 }
339 
340 // --------------------------------------------------------------------------------
341 
LogarithmicRegressionCurve(const uno::Reference<uno::XComponentContext> & xContext)342 LogarithmicRegressionCurve::LogarithmicRegressionCurve(
343     const uno::Reference< uno::XComponentContext > & xContext )
344         : RegressionCurveModel( xContext, RegressionCurveModel::CURVE_TYPE_LOGARITHM )
345 {}
LogarithmicRegressionCurve(const LogarithmicRegressionCurve & rOther)346 LogarithmicRegressionCurve::LogarithmicRegressionCurve(
347     const LogarithmicRegressionCurve & rOther ) :
348         RegressionCurveModel( rOther )
349 {}
~LogarithmicRegressionCurve()350 LogarithmicRegressionCurve::~LogarithmicRegressionCurve()
351 {}
getSupportedServiceNames_Static()352 uno::Sequence< ::rtl::OUString > LogarithmicRegressionCurve::getSupportedServiceNames_Static()
353 {
354     uno::Sequence< ::rtl::OUString > aServices( 2 );
355     aServices[ 0 ] = lcl_aServiceName;
356     aServices[ 1 ] = C2U( "com.sun.star.chart2.LogarithmicRegressionCurve" );
357     return aServices;
358 }
359 // implement XServiceInfo methods basing upon getSupportedServiceNames_Static
360 APPHELPER_XSERVICEINFO_IMPL( LogarithmicRegressionCurve, lcl_aImplementationName_Logarithmic );
361 
createClone()362 uno::Reference< util::XCloneable > SAL_CALL LogarithmicRegressionCurve::createClone()
363 {
364     return uno::Reference< util::XCloneable >( new LogarithmicRegressionCurve( *this ));
365 }
366 
367 // --------------------------------------------------------------------------------
368 
ExponentialRegressionCurve(const uno::Reference<uno::XComponentContext> & xContext)369 ExponentialRegressionCurve::ExponentialRegressionCurve(
370     const uno::Reference< uno::XComponentContext > & xContext )
371         : RegressionCurveModel( xContext, RegressionCurveModel::CURVE_TYPE_EXPONENTIAL )
372 {}
ExponentialRegressionCurve(const ExponentialRegressionCurve & rOther)373 ExponentialRegressionCurve::ExponentialRegressionCurve(
374     const ExponentialRegressionCurve & rOther ) :
375         RegressionCurveModel( rOther )
376 {}
~ExponentialRegressionCurve()377 ExponentialRegressionCurve::~ExponentialRegressionCurve()
378 {}
getSupportedServiceNames_Static()379 uno::Sequence< ::rtl::OUString > ExponentialRegressionCurve::getSupportedServiceNames_Static()
380 {
381     uno::Sequence< ::rtl::OUString > aServices( 2 );
382     aServices[ 0 ] = lcl_aServiceName;
383     aServices[ 1 ] = C2U( "com.sun.star.chart2.ExponentialRegressionCurve" );
384     return aServices;
385 }
386 // implement XServiceInfo methods basing upon getSupportedServiceNames_Static
387 APPHELPER_XSERVICEINFO_IMPL( ExponentialRegressionCurve, lcl_aImplementationName_Exponential );
388 
createClone()389 uno::Reference< util::XCloneable > SAL_CALL ExponentialRegressionCurve::createClone()
390 {
391     return uno::Reference< util::XCloneable >( new ExponentialRegressionCurve( *this ));
392 }
393 
394 // --------------------------------------------------------------------------------
395 
PotentialRegressionCurve(const uno::Reference<uno::XComponentContext> & xContext)396 PotentialRegressionCurve::PotentialRegressionCurve(
397     const uno::Reference< uno::XComponentContext > & xContext )
398         : RegressionCurveModel( xContext, RegressionCurveModel::CURVE_TYPE_POWER )
399 {}
PotentialRegressionCurve(const PotentialRegressionCurve & rOther)400 PotentialRegressionCurve::PotentialRegressionCurve(
401     const PotentialRegressionCurve & rOther ) :
402         RegressionCurveModel( rOther )
403 {}
~PotentialRegressionCurve()404 PotentialRegressionCurve::~PotentialRegressionCurve()
405 {}
getSupportedServiceNames_Static()406 uno::Sequence< ::rtl::OUString > PotentialRegressionCurve::getSupportedServiceNames_Static()
407 {
408     uno::Sequence< ::rtl::OUString > aServices( 2 );
409     aServices[ 0 ] = lcl_aServiceName;
410     aServices[ 1 ] = C2U( "com.sun.star.chart2.PotentialRegressionCurve" );
411     return aServices;
412 }
413 // implement XServiceInfo methods basing upon getSupportedServiceNames_Static
414 APPHELPER_XSERVICEINFO_IMPL( PotentialRegressionCurve, lcl_aImplementationName_Potential );
415 
createClone()416 uno::Reference< util::XCloneable > SAL_CALL PotentialRegressionCurve::createClone()
417 {
418     return uno::Reference< util::XCloneable >( new PotentialRegressionCurve( *this ));
419 }
420 
421 
422 } //  namespace chart
423