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 27 #include "RegressionEquation.hxx" 28 #include "LineProperties.hxx" 29 #include "FillProperties.hxx" 30 #include "UserDefinedProperties.hxx" 31 #include "CharacterProperties.hxx" 32 #include "PropertyHelper.hxx" 33 #include "macros.hxx" 34 #include "ContainerHelper.hxx" 35 36 #include <com/sun/star/uno/Sequence.hxx> 37 #include <com/sun/star/drawing/FillStyle.hpp> 38 #include <com/sun/star/drawing/LineStyle.hpp> 39 #include <com/sun/star/beans/PropertyAttribute.hpp> 40 #include <com/sun/star/chart2/RelativePosition.hpp> 41 #include <com/sun/star/awt/Size.hpp> 42 43 #include <algorithm> 44 45 using namespace ::com::sun::star; 46 47 using ::com::sun::star::uno::Reference; 48 using ::com::sun::star::beans::Property; 49 using ::osl::MutexGuard; 50 51 // ____________________________________________________________ 52 53 namespace 54 { 55 56 static const ::rtl::OUString lcl_aImplementationName( 57 RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.chart2.RegressionEquation" )); 58 static const ::rtl::OUString lcl_aServiceName( 59 RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart2.RegressionEquation" )); 60 61 enum 62 { 63 PROP_EQUATION_SHOW, 64 PROP_EQUATION_SHOW_CORRELATION_COEFF, 65 // PROP_EQUATION_SEPARATOR, 66 PROP_EQUATION_REF_PAGE_SIZE, 67 PROP_EQUATION_REL_POS, 68 PROP_EQUATION_NUMBER_FORMAT 69 }; 70 71 void lcl_AddPropertiesToVector( 72 ::std::vector< Property > & rOutProperties ) 73 { 74 rOutProperties.push_back( 75 Property( C2U( "ShowEquation" ), 76 PROP_EQUATION_SHOW, 77 ::getBooleanCppuType(), 78 beans::PropertyAttribute::BOUND 79 | beans::PropertyAttribute::MAYBEDEFAULT )); 80 81 rOutProperties.push_back( 82 Property( C2U( "ShowCorrelationCoefficient" ), 83 PROP_EQUATION_SHOW_CORRELATION_COEFF, 84 ::getBooleanCppuType(), 85 beans::PropertyAttribute::BOUND 86 | beans::PropertyAttribute::MAYBEDEFAULT )); 87 88 // rOutProperties.push_back( 89 // Property( C2U( "Separator" ), 90 // PROP_EQUATION_SEPARATOR, 91 // ::getCppuType( reinterpret_cast< ::rtl::OUString * >(0)), 92 // beans::PropertyAttribute::BOUND 93 // | beans::PropertyAttribute::MAYBEDEFAULT )); 94 95 rOutProperties.push_back( 96 Property( C2U( "ReferencePageSize" ), 97 PROP_EQUATION_REF_PAGE_SIZE, 98 ::getCppuType( reinterpret_cast< const awt::Size * >(0)), 99 beans::PropertyAttribute::BOUND 100 | beans::PropertyAttribute::MAYBEVOID )); 101 102 rOutProperties.push_back( 103 Property( C2U( "RelativePosition" ), 104 PROP_EQUATION_REL_POS, 105 ::getCppuType( reinterpret_cast< const chart2::RelativePosition * >(0)), 106 beans::PropertyAttribute::BOUND 107 | beans::PropertyAttribute::MAYBEVOID )); 108 109 rOutProperties.push_back( 110 Property( C2U( "NumberFormat" ), 111 PROP_EQUATION_NUMBER_FORMAT, 112 ::getCppuType( reinterpret_cast< const sal_Int32 * >(0)), 113 beans::PropertyAttribute::BOUND 114 | beans::PropertyAttribute::MAYBEVOID )); 115 } 116 117 struct StaticRegressionEquationDefaults_Initializer 118 { 119 ::chart::tPropertyValueMap* operator()() 120 { 121 static ::chart::tPropertyValueMap aStaticDefaults; 122 lcl_AddDefaultsToMap( aStaticDefaults ); 123 return &aStaticDefaults; 124 } 125 private: 126 void lcl_AddDefaultsToMap( ::chart::tPropertyValueMap & rOutMap ) 127 { 128 ::chart::LineProperties::AddDefaultsToMap( rOutMap ); 129 ::chart::FillProperties::AddDefaultsToMap( rOutMap ); 130 ::chart::CharacterProperties::AddDefaultsToMap( rOutMap ); 131 132 ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_EQUATION_SHOW, false ); 133 ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_EQUATION_SHOW_CORRELATION_COEFF, false ); 134 //::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_EQUATION_SEPARATOR, ::rtl::OUString( sal_Unicode( '\n' ))); 135 136 // override other defaults 137 ::chart::PropertyHelper::setPropertyValue( rOutMap, ::chart::FillProperties::PROP_FILL_STYLE, drawing::FillStyle_NONE ); 138 ::chart::PropertyHelper::setPropertyValue( rOutMap, ::chart::LineProperties::PROP_LINE_STYLE, drawing::LineStyle_NONE ); 139 140 float fDefaultCharHeight = 10.0; 141 ::chart::PropertyHelper::setPropertyValue( rOutMap, ::chart::CharacterProperties::PROP_CHAR_CHAR_HEIGHT, fDefaultCharHeight ); 142 ::chart::PropertyHelper::setPropertyValue( rOutMap, ::chart::CharacterProperties::PROP_CHAR_ASIAN_CHAR_HEIGHT, fDefaultCharHeight ); 143 ::chart::PropertyHelper::setPropertyValue( rOutMap, ::chart::CharacterProperties::PROP_CHAR_COMPLEX_CHAR_HEIGHT, fDefaultCharHeight ); 144 } 145 }; 146 147 struct StaticRegressionEquationDefaults : public rtl::StaticAggregate< ::chart::tPropertyValueMap, StaticRegressionEquationDefaults_Initializer > 148 { 149 }; 150 151 struct StaticRegressionEquationInfoHelper_Initializer 152 { 153 ::cppu::OPropertyArrayHelper* operator()() 154 { 155 static ::cppu::OPropertyArrayHelper aPropHelper( lcl_GetPropertySequence() ); 156 return &aPropHelper; 157 } 158 159 private: 160 uno::Sequence< Property > lcl_GetPropertySequence() 161 { 162 ::std::vector< ::com::sun::star::beans::Property > aProperties; 163 lcl_AddPropertiesToVector( aProperties ); 164 ::chart::LineProperties::AddPropertiesToVector( aProperties ); 165 ::chart::FillProperties::AddPropertiesToVector( aProperties ); 166 ::chart::CharacterProperties::AddPropertiesToVector( aProperties ); 167 ::chart::UserDefinedProperties::AddPropertiesToVector( aProperties ); 168 169 ::std::sort( aProperties.begin(), aProperties.end(), 170 ::chart::PropertyNameLess() ); 171 172 return ::chart::ContainerHelper::ContainerToSequence( aProperties ); 173 } 174 175 }; 176 177 struct StaticRegressionEquationInfoHelper : public rtl::StaticAggregate< ::cppu::OPropertyArrayHelper, StaticRegressionEquationInfoHelper_Initializer > 178 { 179 }; 180 181 struct StaticRegressionEquationInfo_Initializer 182 { 183 uno::Reference< beans::XPropertySetInfo >* operator()() 184 { 185 static uno::Reference< beans::XPropertySetInfo > xPropertySetInfo( 186 ::cppu::OPropertySetHelper::createPropertySetInfo(*StaticRegressionEquationInfoHelper::get() ) ); 187 return &xPropertySetInfo; 188 } 189 }; 190 191 struct StaticRegressionEquationInfo : public rtl::StaticAggregate< uno::Reference< beans::XPropertySetInfo >, StaticRegressionEquationInfo_Initializer > 192 { 193 }; 194 195 } // anonymous namespace 196 197 // ____________________________________________________________ 198 199 namespace chart 200 { 201 202 RegressionEquation::RegressionEquation( const Reference< uno::XComponentContext > & xContext ) : 203 ::property::OPropertySet( m_aMutex ), 204 m_xModifyEventForwarder( new ModifyListenerHelper::ModifyEventForwarder()), 205 m_xContext( xContext ) 206 {} 207 208 RegressionEquation::RegressionEquation( const RegressionEquation & rOther ) : 209 MutexContainer(), 210 impl::RegressionEquation_Base(), 211 ::property::OPropertySet( rOther, m_aMutex ), 212 m_xModifyEventForwarder( new ModifyListenerHelper::ModifyEventForwarder()) 213 {} 214 215 RegressionEquation::~RegressionEquation() 216 {} 217 218 219 // ____ XCloneable ____ 220 uno::Reference< util::XCloneable > SAL_CALL RegressionEquation::createClone() 221 throw (uno::RuntimeException) 222 { 223 return uno::Reference< util::XCloneable >( new RegressionEquation( *this )); 224 } 225 226 // ____ OPropertySet ____ 227 uno::Any RegressionEquation::GetDefaultValue( sal_Int32 nHandle ) const 228 throw(beans::UnknownPropertyException) 229 { 230 const tPropertyValueMap& rStaticDefaults = *StaticRegressionEquationDefaults::get(); 231 tPropertyValueMap::const_iterator aFound( rStaticDefaults.find( nHandle ) ); 232 if( aFound == rStaticDefaults.end() ) 233 return uno::Any(); 234 return (*aFound).second; 235 } 236 237 ::cppu::IPropertyArrayHelper & SAL_CALL RegressionEquation::getInfoHelper() 238 { 239 return *StaticRegressionEquationInfoHelper::get(); 240 } 241 242 // ____ XPropertySet ____ 243 Reference< beans::XPropertySetInfo > SAL_CALL RegressionEquation::getPropertySetInfo() 244 throw (uno::RuntimeException) 245 { 246 return *StaticRegressionEquationInfo::get(); 247 } 248 249 // ____ XModifyBroadcaster ____ 250 void SAL_CALL RegressionEquation::addModifyListener( const uno::Reference< util::XModifyListener >& aListener ) 251 throw (uno::RuntimeException) 252 { 253 try 254 { 255 uno::Reference< util::XModifyBroadcaster > xBroadcaster( m_xModifyEventForwarder, uno::UNO_QUERY_THROW ); 256 xBroadcaster->addModifyListener( aListener ); 257 } 258 catch( const uno::Exception & ex ) 259 { 260 ASSERT_EXCEPTION( ex ); 261 } 262 } 263 264 void SAL_CALL RegressionEquation::removeModifyListener( const uno::Reference< util::XModifyListener >& aListener ) 265 throw (uno::RuntimeException) 266 { 267 try 268 { 269 uno::Reference< util::XModifyBroadcaster > xBroadcaster( m_xModifyEventForwarder, uno::UNO_QUERY_THROW ); 270 xBroadcaster->removeModifyListener( aListener ); 271 } 272 catch( const uno::Exception & ex ) 273 { 274 ASSERT_EXCEPTION( ex ); 275 } 276 } 277 278 // ____ XModifyListener ____ 279 void SAL_CALL RegressionEquation::modified( const lang::EventObject& aEvent ) 280 throw (uno::RuntimeException) 281 { 282 m_xModifyEventForwarder->modified( aEvent ); 283 } 284 285 // ____ XEventListener (base of XModifyListener) ____ 286 void SAL_CALL RegressionEquation::disposing( const lang::EventObject& /* Source */ ) 287 throw (uno::RuntimeException) 288 { 289 // nothing 290 } 291 292 // ____ OPropertySet ____ 293 void RegressionEquation::firePropertyChangeEvent() 294 { 295 fireModifyEvent(); 296 } 297 298 void RegressionEquation::fireModifyEvent() 299 { 300 m_xModifyEventForwarder->modified( lang::EventObject( static_cast< uno::XWeak* >( this ))); 301 } 302 303 // -------------------------------------------------------------------------------- 304 305 // ____ XTitle ____ 306 uno::Sequence< uno::Reference< chart2::XFormattedString > > SAL_CALL RegressionEquation::getText() 307 throw (uno::RuntimeException) 308 { 309 // /-- 310 MutexGuard aGuard( GetMutex() ); 311 return m_aStrings; 312 // \-- 313 } 314 315 void SAL_CALL RegressionEquation::setText( const uno::Sequence< uno::Reference< chart2::XFormattedString > >& Strings ) 316 throw (uno::RuntimeException) 317 { 318 // /-- 319 MutexGuard aGuard( GetMutex() ); 320 ModifyListenerHelper::removeListenerFromAllElements( 321 ContainerHelper::SequenceToVector( m_aStrings ), m_xModifyEventForwarder ); 322 m_aStrings = Strings; 323 ModifyListenerHelper::addListenerToAllElements( 324 ContainerHelper::SequenceToVector( m_aStrings ), m_xModifyEventForwarder ); 325 fireModifyEvent(); 326 // \-- 327 } 328 329 // ================================================================================ 330 331 uno::Sequence< ::rtl::OUString > RegressionEquation::getSupportedServiceNames_Static() 332 { 333 const sal_Int32 nNumServices( 5 ); 334 sal_Int32 nI = 0; 335 uno::Sequence< ::rtl::OUString > aServices( nNumServices ); 336 aServices[ nI++ ] = lcl_aServiceName; 337 aServices[ nI++ ] = C2U( "com.sun.star.beans.PropertySet" ); 338 aServices[ nI++ ] = C2U( "com.sun.star.drawing.FillProperties" ); 339 aServices[ nI++ ] = C2U( "com.sun.star.drawing.LineProperties" ); 340 aServices[ nI++ ] = C2U( "com.sun.star.style.CharacterProperties" ); 341 OSL_ASSERT( nNumServices == nI ); 342 return aServices; 343 } 344 345 // implement XServiceInfo methods basing upon getSupportedServiceNames_Static 346 APPHELPER_XSERVICEINFO_IMPL( RegressionEquation, lcl_aImplementationName ); 347 348 using impl::RegressionEquation_Base; 349 350 IMPLEMENT_FORWARD_XINTERFACE2( RegressionEquation, RegressionEquation_Base, ::property::OPropertySet ) 351 352 } // namespace chart 353