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