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_chart2.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 { 64 ::chart::tPropertyValueMap* operator()() 65 { 66 static ::chart::tPropertyValueMap aStaticDefaults; 67 lcl_AddDefaultsToMap( aStaticDefaults ); 68 return &aStaticDefaults; 69 } 70 private: 71 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 { 83 ::cppu::OPropertyArrayHelper* operator()() 84 { 85 static ::cppu::OPropertyArrayHelper aPropHelper( lcl_GetPropertySequence() ); 86 return &aPropHelper; 87 } 88 89 private: 90 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 { 108 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 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 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 153 RegressionCurveModel::~RegressionCurveModel() 154 {} 155 156 // ____ XRegressionCurve ____ 157 uno::Reference< chart2::XRegressionCurveCalculator > SAL_CALL 158 RegressionCurveModel::getCalculator() 159 throw (uno::RuntimeException) 160 { 161 return RegressionCurveHelper::createRegressionCurveCalculatorByServiceName( getServiceName()); 162 } 163 164 uno::Reference< beans::XPropertySet > SAL_CALL RegressionCurveModel::getEquationProperties() 165 throw (uno::RuntimeException) 166 { 167 return m_xEquationProperties; 168 } 169 170 void SAL_CALL RegressionCurveModel::setEquationProperties( const uno::Reference< beans::XPropertySet >& xEquationProperties ) 171 throw (uno::RuntimeException) 172 { 173 if( xEquationProperties.is()) 174 { 175 if( m_xEquationProperties.is()) 176 ModifyListenerHelper::removeListener( m_xEquationProperties, m_xModifyEventForwarder ); 177 178 m_xEquationProperties.set( xEquationProperties ); 179 ModifyListenerHelper::addListener( m_xEquationProperties, m_xModifyEventForwarder ); 180 fireModifyEvent(); 181 } 182 } 183 184 // ____ XServiceName ____ 185 ::rtl::OUString SAL_CALL RegressionCurveModel::getServiceName() 186 throw (uno::RuntimeException) 187 { 188 switch( m_eRegressionCurveType ) 189 { 190 case CURVE_TYPE_MEAN_VALUE: 191 return C2U( "com.sun.star.chart2.MeanValueRegressionCurve" ); 192 case CURVE_TYPE_LINEAR: 193 return C2U( "com.sun.star.chart2.LinearRegressionCurve" ); 194 case CURVE_TYPE_LOGARITHM: 195 return C2U( "com.sun.star.chart2.LogarithmicRegressionCurve" ); 196 case CURVE_TYPE_EXPONENTIAL: 197 return C2U( "com.sun.star.chart2.ExponentialRegressionCurve" ); 198 case CURVE_TYPE_POWER: 199 return C2U( "com.sun.star.chart2.PotentialRegressionCurve" ); 200 } 201 202 return ::rtl::OUString(); 203 } 204 205 // ____ XModifyBroadcaster ____ 206 void SAL_CALL RegressionCurveModel::addModifyListener( const uno::Reference< util::XModifyListener >& aListener ) 207 throw (uno::RuntimeException) 208 { 209 try 210 { 211 uno::Reference< util::XModifyBroadcaster > xBroadcaster( m_xModifyEventForwarder, uno::UNO_QUERY_THROW ); 212 xBroadcaster->addModifyListener( aListener ); 213 } 214 catch( const uno::Exception & ex ) 215 { 216 ASSERT_EXCEPTION( ex ); 217 } 218 } 219 220 void SAL_CALL RegressionCurveModel::removeModifyListener( const uno::Reference< util::XModifyListener >& aListener ) 221 throw (uno::RuntimeException) 222 { 223 try 224 { 225 uno::Reference< util::XModifyBroadcaster > xBroadcaster( m_xModifyEventForwarder, uno::UNO_QUERY_THROW ); 226 xBroadcaster->removeModifyListener( aListener ); 227 } 228 catch( const uno::Exception & ex ) 229 { 230 ASSERT_EXCEPTION( ex ); 231 } 232 } 233 234 // ____ XModifyListener ____ 235 void SAL_CALL RegressionCurveModel::modified( const lang::EventObject& aEvent ) 236 throw (uno::RuntimeException) 237 { 238 m_xModifyEventForwarder->modified( aEvent ); 239 } 240 241 // ____ XEventListener (base of XModifyListener) ____ 242 void SAL_CALL RegressionCurveModel::disposing( const lang::EventObject& /* Source */ ) 243 throw (uno::RuntimeException) 244 { 245 // nothing 246 } 247 248 // ____ OPropertySet ____ 249 void RegressionCurveModel::firePropertyChangeEvent() 250 { 251 fireModifyEvent(); 252 } 253 254 void RegressionCurveModel::fireModifyEvent() 255 { 256 m_xModifyEventForwarder->modified( lang::EventObject( static_cast< uno::XWeak* >( this ))); 257 } 258 259 // ================================================================================ 260 261 // ____ OPropertySet ____ 262 uno::Any RegressionCurveModel::GetDefaultValue( sal_Int32 nHandle ) const 263 throw(beans::UnknownPropertyException) 264 { 265 const tPropertyValueMap& rStaticDefaults = *StaticXXXDefaults::get(); 266 tPropertyValueMap::const_iterator aFound( rStaticDefaults.find( nHandle ) ); 267 if( aFound == rStaticDefaults.end() ) 268 return uno::Any(); 269 return (*aFound).second; 270 } 271 272 ::cppu::IPropertyArrayHelper & SAL_CALL RegressionCurveModel::getInfoHelper() 273 { 274 return *StaticRegressionCurveInfoHelper::get(); 275 } 276 277 // ____ XPropertySet ____ 278 uno::Reference< beans::XPropertySetInfo > SAL_CALL RegressionCurveModel::getPropertySetInfo() 279 throw (uno::RuntimeException) 280 { 281 return *StaticRegressionCurveInfo::get(); 282 } 283 284 // ================================================================================ 285 286 // needed by MSC compiler 287 using impl::RegressionCurveModel_Base; 288 289 IMPLEMENT_FORWARD_XINTERFACE2( RegressionCurveModel, RegressionCurveModel_Base, OPropertySet ) 290 IMPLEMENT_FORWARD_XTYPEPROVIDER2( RegressionCurveModel, RegressionCurveModel_Base, OPropertySet ) 291 292 293 294 // implementations 295 296 // -------------------------------------------------------------------------------- 297 298 MeanValueRegressionCurve::MeanValueRegressionCurve( 299 const uno::Reference< uno::XComponentContext > & xContext ) 300 : RegressionCurveModel( xContext, RegressionCurveModel::CURVE_TYPE_MEAN_VALUE ) 301 {} 302 MeanValueRegressionCurve::MeanValueRegressionCurve( 303 const MeanValueRegressionCurve & rOther ) : 304 RegressionCurveModel( rOther ) 305 {} 306 MeanValueRegressionCurve::~MeanValueRegressionCurve() 307 {} 308 uno::Sequence< ::rtl::OUString > MeanValueRegressionCurve::getSupportedServiceNames_Static() 309 { 310 uno::Sequence< ::rtl::OUString > aServices( 2 ); 311 aServices[ 0 ] = lcl_aServiceName; 312 aServices[ 1 ] = C2U( "com.sun.star.chart2.MeanValueRegressionCurve" ); 313 return aServices; 314 } 315 // implement XServiceInfo methods basing upon getSupportedServiceNames_Static 316 APPHELPER_XSERVICEINFO_IMPL( MeanValueRegressionCurve, lcl_aImplementationName_MeanValue ); 317 318 uno::Reference< util::XCloneable > SAL_CALL MeanValueRegressionCurve::createClone() 319 throw (uno::RuntimeException) 320 { 321 return uno::Reference< util::XCloneable >( new MeanValueRegressionCurve( *this )); 322 } 323 324 // -------------------------------------------------------------------------------- 325 326 LinearRegressionCurve::LinearRegressionCurve( 327 const uno::Reference< uno::XComponentContext > & xContext ) 328 : RegressionCurveModel( xContext, RegressionCurveModel::CURVE_TYPE_LINEAR ) 329 {} 330 LinearRegressionCurve::LinearRegressionCurve( 331 const LinearRegressionCurve & rOther ) : 332 RegressionCurveModel( rOther ) 333 {} 334 LinearRegressionCurve::~LinearRegressionCurve() 335 {} 336 uno::Sequence< ::rtl::OUString > LinearRegressionCurve::getSupportedServiceNames_Static() 337 { 338 uno::Sequence< ::rtl::OUString > aServices( 2 ); 339 aServices[ 0 ] = lcl_aServiceName; 340 aServices[ 1 ] = C2U( "com.sun.star.chart2.LinearRegressionCurve" ); 341 return aServices; 342 } 343 // implement XServiceInfo methods basing upon getSupportedServiceNames_Static 344 APPHELPER_XSERVICEINFO_IMPL( LinearRegressionCurve, lcl_aImplementationName_Linear ); 345 346 uno::Reference< util::XCloneable > SAL_CALL LinearRegressionCurve::createClone() 347 throw (uno::RuntimeException) 348 { 349 return uno::Reference< util::XCloneable >( new LinearRegressionCurve( *this )); 350 } 351 352 // -------------------------------------------------------------------------------- 353 354 LogarithmicRegressionCurve::LogarithmicRegressionCurve( 355 const uno::Reference< uno::XComponentContext > & xContext ) 356 : RegressionCurveModel( xContext, RegressionCurveModel::CURVE_TYPE_LOGARITHM ) 357 {} 358 LogarithmicRegressionCurve::LogarithmicRegressionCurve( 359 const LogarithmicRegressionCurve & rOther ) : 360 RegressionCurveModel( rOther ) 361 {} 362 LogarithmicRegressionCurve::~LogarithmicRegressionCurve() 363 {} 364 uno::Sequence< ::rtl::OUString > LogarithmicRegressionCurve::getSupportedServiceNames_Static() 365 { 366 uno::Sequence< ::rtl::OUString > aServices( 2 ); 367 aServices[ 0 ] = lcl_aServiceName; 368 aServices[ 1 ] = C2U( "com.sun.star.chart2.LogarithmicRegressionCurve" ); 369 return aServices; 370 } 371 // implement XServiceInfo methods basing upon getSupportedServiceNames_Static 372 APPHELPER_XSERVICEINFO_IMPL( LogarithmicRegressionCurve, lcl_aImplementationName_Logarithmic ); 373 374 uno::Reference< util::XCloneable > SAL_CALL LogarithmicRegressionCurve::createClone() 375 throw (uno::RuntimeException) 376 { 377 return uno::Reference< util::XCloneable >( new LogarithmicRegressionCurve( *this )); 378 } 379 380 // -------------------------------------------------------------------------------- 381 382 ExponentialRegressionCurve::ExponentialRegressionCurve( 383 const uno::Reference< uno::XComponentContext > & xContext ) 384 : RegressionCurveModel( xContext, RegressionCurveModel::CURVE_TYPE_EXPONENTIAL ) 385 {} 386 ExponentialRegressionCurve::ExponentialRegressionCurve( 387 const ExponentialRegressionCurve & rOther ) : 388 RegressionCurveModel( rOther ) 389 {} 390 ExponentialRegressionCurve::~ExponentialRegressionCurve() 391 {} 392 uno::Sequence< ::rtl::OUString > ExponentialRegressionCurve::getSupportedServiceNames_Static() 393 { 394 uno::Sequence< ::rtl::OUString > aServices( 2 ); 395 aServices[ 0 ] = lcl_aServiceName; 396 aServices[ 1 ] = C2U( "com.sun.star.chart2.ExponentialRegressionCurve" ); 397 return aServices; 398 } 399 // implement XServiceInfo methods basing upon getSupportedServiceNames_Static 400 APPHELPER_XSERVICEINFO_IMPL( ExponentialRegressionCurve, lcl_aImplementationName_Exponential ); 401 402 uno::Reference< util::XCloneable > SAL_CALL ExponentialRegressionCurve::createClone() 403 throw (uno::RuntimeException) 404 { 405 return uno::Reference< util::XCloneable >( new ExponentialRegressionCurve( *this )); 406 } 407 408 // -------------------------------------------------------------------------------- 409 410 PotentialRegressionCurve::PotentialRegressionCurve( 411 const uno::Reference< uno::XComponentContext > & xContext ) 412 : RegressionCurveModel( xContext, RegressionCurveModel::CURVE_TYPE_POWER ) 413 {} 414 PotentialRegressionCurve::PotentialRegressionCurve( 415 const PotentialRegressionCurve & rOther ) : 416 RegressionCurveModel( rOther ) 417 {} 418 PotentialRegressionCurve::~PotentialRegressionCurve() 419 {} 420 uno::Sequence< ::rtl::OUString > PotentialRegressionCurve::getSupportedServiceNames_Static() 421 { 422 uno::Sequence< ::rtl::OUString > aServices( 2 ); 423 aServices[ 0 ] = lcl_aServiceName; 424 aServices[ 1 ] = C2U( "com.sun.star.chart2.PotentialRegressionCurve" ); 425 return aServices; 426 } 427 // implement XServiceInfo methods basing upon getSupportedServiceNames_Static 428 APPHELPER_XSERVICEINFO_IMPL( PotentialRegressionCurve, lcl_aImplementationName_Potential ); 429 430 uno::Reference< util::XCloneable > SAL_CALL PotentialRegressionCurve::createClone() 431 throw (uno::RuntimeException) 432 { 433 return uno::Reference< util::XCloneable >( new PotentialRegressionCurve( *this )); 434 } 435 436 437 } // namespace chart 438