1*cde9e8dcSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*cde9e8dcSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*cde9e8dcSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*cde9e8dcSAndrew Rist * distributed with this work for additional information 6*cde9e8dcSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*cde9e8dcSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*cde9e8dcSAndrew Rist * "License"); you may not use this file except in compliance 9*cde9e8dcSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*cde9e8dcSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*cde9e8dcSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*cde9e8dcSAndrew Rist * software distributed under the License is distributed on an 15*cde9e8dcSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*cde9e8dcSAndrew Rist * KIND, either express or implied. See the License for the 17*cde9e8dcSAndrew Rist * specific language governing permissions and limitations 18*cde9e8dcSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*cde9e8dcSAndrew Rist *************************************************************/ 21*cde9e8dcSAndrew Rist 22*cde9e8dcSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_chart2.hxx" 26cdf0e10cSrcweir #include "ErrorBar.hxx" 27cdf0e10cSrcweir #include "macros.hxx" 28cdf0e10cSrcweir #include "LineProperties.hxx" 29cdf0e10cSrcweir #include "ContainerHelper.hxx" 30cdf0e10cSrcweir #include "EventListenerHelper.hxx" 31cdf0e10cSrcweir #include "PropertyHelper.hxx" 32cdf0e10cSrcweir #include "CloneHelper.hxx" 33cdf0e10cSrcweir 34cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp> 35cdf0e10cSrcweir #include <com/sun/star/chart/ErrorBarStyle.hpp> 36cdf0e10cSrcweir 37cdf0e10cSrcweir #include <rtl/math.hxx> 38cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 39cdf0e10cSrcweir 40cdf0e10cSrcweir using namespace ::com::sun::star; 41cdf0e10cSrcweir 42cdf0e10cSrcweir using ::rtl::OUString; 43cdf0e10cSrcweir using ::rtl::OUStringBuffer; 44cdf0e10cSrcweir using ::com::sun::star::beans::Property; 45cdf0e10cSrcweir using ::osl::MutexGuard; 46cdf0e10cSrcweir 47cdf0e10cSrcweir namespace 48cdf0e10cSrcweir { 49cdf0e10cSrcweir static const OUString lcl_aServiceName( 50cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.chart2.ErrorBar" )); 51cdf0e10cSrcweir 52cdf0e10cSrcweir enum 53cdf0e10cSrcweir { 54cdf0e10cSrcweir PROP_ERROR_BAR_STYLE, 55cdf0e10cSrcweir PROP_ERROR_BAR_POS_ERROR, 56cdf0e10cSrcweir PROP_ERROR_BAR_NEG_ERROR, 57cdf0e10cSrcweir PROP_ERROR_BAR_WEIGHT, 58cdf0e10cSrcweir PROP_ERROR_BAR_SHOW_POS_ERROR, 59cdf0e10cSrcweir PROP_ERROR_BAR_SHOW_NEG_ERROR 60cdf0e10cSrcweir }; 61cdf0e10cSrcweir 62cdf0e10cSrcweir void lcl_AddPropertiesToVector( 63cdf0e10cSrcweir ::std::vector< Property > & rOutProperties ) 64cdf0e10cSrcweir { 65cdf0e10cSrcweir rOutProperties.push_back( 66cdf0e10cSrcweir Property( C2U( "ErrorBarStyle" ), 67cdf0e10cSrcweir PROP_ERROR_BAR_STYLE, 68cdf0e10cSrcweir ::getCppuType( reinterpret_cast< sal_Int32 * >(0)), 69cdf0e10cSrcweir beans::PropertyAttribute::BOUND 70cdf0e10cSrcweir | beans::PropertyAttribute::MAYBEDEFAULT )); 71cdf0e10cSrcweir 72cdf0e10cSrcweir rOutProperties.push_back( 73cdf0e10cSrcweir Property( C2U( "PositiveError" ), 74cdf0e10cSrcweir PROP_ERROR_BAR_POS_ERROR, 75cdf0e10cSrcweir ::getCppuType( reinterpret_cast< const double * >(0)), 76cdf0e10cSrcweir beans::PropertyAttribute::BOUND 77cdf0e10cSrcweir | beans::PropertyAttribute::MAYBEDEFAULT )); 78cdf0e10cSrcweir rOutProperties.push_back( 79cdf0e10cSrcweir Property( C2U( "NegativeError" ), 80cdf0e10cSrcweir PROP_ERROR_BAR_NEG_ERROR, 81cdf0e10cSrcweir ::getCppuType( reinterpret_cast< const double * >(0)), 82cdf0e10cSrcweir beans::PropertyAttribute::BOUND 83cdf0e10cSrcweir | beans::PropertyAttribute::MAYBEDEFAULT )); 84cdf0e10cSrcweir 85cdf0e10cSrcweir rOutProperties.push_back( 86cdf0e10cSrcweir Property( C2U( "Weight" ), 87cdf0e10cSrcweir PROP_ERROR_BAR_WEIGHT, 88cdf0e10cSrcweir ::getCppuType( reinterpret_cast< const double * >(0)), 89cdf0e10cSrcweir beans::PropertyAttribute::BOUND 90cdf0e10cSrcweir | beans::PropertyAttribute::MAYBEDEFAULT )); 91cdf0e10cSrcweir 92cdf0e10cSrcweir rOutProperties.push_back( 93cdf0e10cSrcweir Property( C2U( "ShowPositiveError" ), 94cdf0e10cSrcweir PROP_ERROR_BAR_SHOW_POS_ERROR, 95cdf0e10cSrcweir ::getBooleanCppuType(), 96cdf0e10cSrcweir beans::PropertyAttribute::BOUND 97cdf0e10cSrcweir | beans::PropertyAttribute::MAYBEDEFAULT )); 98cdf0e10cSrcweir rOutProperties.push_back( 99cdf0e10cSrcweir Property( C2U( "ShowNegativeError" ), 100cdf0e10cSrcweir PROP_ERROR_BAR_SHOW_NEG_ERROR, 101cdf0e10cSrcweir ::getBooleanCppuType(), 102cdf0e10cSrcweir beans::PropertyAttribute::BOUND 103cdf0e10cSrcweir | beans::PropertyAttribute::MAYBEDEFAULT )); 104cdf0e10cSrcweir } 105cdf0e10cSrcweir 106cdf0e10cSrcweir struct StaticErrorBarDefaults_Initializer 107cdf0e10cSrcweir { 108cdf0e10cSrcweir ::chart::tPropertyValueMap* operator()() 109cdf0e10cSrcweir { 110cdf0e10cSrcweir static ::chart::tPropertyValueMap aStaticDefaults; 111cdf0e10cSrcweir lcl_AddDefaultsToMap( aStaticDefaults ); 112cdf0e10cSrcweir return &aStaticDefaults; 113cdf0e10cSrcweir } 114cdf0e10cSrcweir private: 115cdf0e10cSrcweir void lcl_AddDefaultsToMap( ::chart::tPropertyValueMap & rOutMap ) 116cdf0e10cSrcweir { 117cdf0e10cSrcweir ::chart::LineProperties::AddDefaultsToMap( rOutMap ); 118cdf0e10cSrcweir 119cdf0e10cSrcweir ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_ERROR_BAR_STYLE, ::com::sun::star::chart::ErrorBarStyle::NONE ); 120cdf0e10cSrcweir ::chart::PropertyHelper::setPropertyValueDefault< double >( rOutMap, PROP_ERROR_BAR_POS_ERROR, 0.0 ); 121cdf0e10cSrcweir ::chart::PropertyHelper::setPropertyValueDefault< double >( rOutMap, PROP_ERROR_BAR_NEG_ERROR, 0.0 ); 122cdf0e10cSrcweir ::chart::PropertyHelper::setPropertyValueDefault< double >( rOutMap, PROP_ERROR_BAR_WEIGHT, 1.0 ); 123cdf0e10cSrcweir ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_ERROR_BAR_SHOW_POS_ERROR, true ); 124cdf0e10cSrcweir ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_ERROR_BAR_SHOW_NEG_ERROR, true ); 125cdf0e10cSrcweir } 126cdf0e10cSrcweir }; 127cdf0e10cSrcweir 128cdf0e10cSrcweir struct StaticErrorBarDefaults : public rtl::StaticAggregate< ::chart::tPropertyValueMap, StaticErrorBarDefaults_Initializer > 129cdf0e10cSrcweir { 130cdf0e10cSrcweir }; 131cdf0e10cSrcweir 132cdf0e10cSrcweir struct StaticErrorBarInfoHelper_Initializer 133cdf0e10cSrcweir { 134cdf0e10cSrcweir ::cppu::OPropertyArrayHelper* operator()() 135cdf0e10cSrcweir { 136cdf0e10cSrcweir static ::cppu::OPropertyArrayHelper aPropHelper( lcl_GetPropertySequence() ); 137cdf0e10cSrcweir return &aPropHelper; 138cdf0e10cSrcweir } 139cdf0e10cSrcweir 140cdf0e10cSrcweir private: 141cdf0e10cSrcweir uno::Sequence< Property > lcl_GetPropertySequence() 142cdf0e10cSrcweir { 143cdf0e10cSrcweir ::std::vector< ::com::sun::star::beans::Property > aProperties; 144cdf0e10cSrcweir lcl_AddPropertiesToVector( aProperties ); 145cdf0e10cSrcweir ::chart::LineProperties::AddPropertiesToVector( aProperties ); 146cdf0e10cSrcweir 147cdf0e10cSrcweir ::std::sort( aProperties.begin(), aProperties.end(), 148cdf0e10cSrcweir ::chart::PropertyNameLess() ); 149cdf0e10cSrcweir 150cdf0e10cSrcweir return ::chart::ContainerHelper::ContainerToSequence( aProperties ); 151cdf0e10cSrcweir } 152cdf0e10cSrcweir 153cdf0e10cSrcweir }; 154cdf0e10cSrcweir 155cdf0e10cSrcweir struct StaticErrorBarInfoHelper : public rtl::StaticAggregate< ::cppu::OPropertyArrayHelper, StaticErrorBarInfoHelper_Initializer > 156cdf0e10cSrcweir { 157cdf0e10cSrcweir }; 158cdf0e10cSrcweir 159cdf0e10cSrcweir struct StaticErrorBarInfo_Initializer 160cdf0e10cSrcweir { 161cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo >* operator()() 162cdf0e10cSrcweir { 163cdf0e10cSrcweir static uno::Reference< beans::XPropertySetInfo > xPropertySetInfo( 164cdf0e10cSrcweir ::cppu::OPropertySetHelper::createPropertySetInfo(*StaticErrorBarInfoHelper::get() ) ); 165cdf0e10cSrcweir return &xPropertySetInfo; 166cdf0e10cSrcweir } 167cdf0e10cSrcweir }; 168cdf0e10cSrcweir 169cdf0e10cSrcweir struct StaticErrorBarInfo : public rtl::StaticAggregate< uno::Reference< beans::XPropertySetInfo >, StaticErrorBarInfo_Initializer > 170cdf0e10cSrcweir { 171cdf0e10cSrcweir }; 172cdf0e10cSrcweir 173cdf0e10cSrcweir bool lcl_isInternalData( const uno::Reference< chart2::data::XLabeledDataSequence > & xLSeq ) 174cdf0e10cSrcweir { 175cdf0e10cSrcweir uno::Reference< lang::XServiceInfo > xServiceInfo( xLSeq, uno::UNO_QUERY ); 176cdf0e10cSrcweir return ( xServiceInfo.is() && xServiceInfo->getImplementationName().equalsAsciiL( 177cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM("com.sun.star.comp.chart2.LabeledDataSequence"))); 178cdf0e10cSrcweir } 179cdf0e10cSrcweir 180cdf0e10cSrcweir } // anonymous namespace 181cdf0e10cSrcweir 182cdf0e10cSrcweir namespace chart 183cdf0e10cSrcweir { 184cdf0e10cSrcweir 185cdf0e10cSrcweir uno::Reference< beans::XPropertySet > createErrorBar( const uno::Reference< uno::XComponentContext > & xContext ) 186cdf0e10cSrcweir { 187cdf0e10cSrcweir return new ErrorBar( xContext ); 188cdf0e10cSrcweir } 189cdf0e10cSrcweir 190cdf0e10cSrcweir ErrorBar::ErrorBar( 191cdf0e10cSrcweir uno::Reference< uno::XComponentContext > const & xContext ) : 192cdf0e10cSrcweir ::property::OPropertySet( m_aMutex ), 193cdf0e10cSrcweir m_xContext( xContext ), 194cdf0e10cSrcweir m_xModifyEventForwarder( ModifyListenerHelper::createModifyEventForwarder()) 195cdf0e10cSrcweir {} 196cdf0e10cSrcweir 197cdf0e10cSrcweir ErrorBar::ErrorBar( const ErrorBar & rOther ) : 198cdf0e10cSrcweir MutexContainer(), 199cdf0e10cSrcweir impl::ErrorBar_Base(), 200cdf0e10cSrcweir ::property::OPropertySet( rOther, m_aMutex ), 201cdf0e10cSrcweir m_xContext( rOther.m_xContext ), 202cdf0e10cSrcweir m_xModifyEventForwarder( ModifyListenerHelper::createModifyEventForwarder()) 203cdf0e10cSrcweir { 204cdf0e10cSrcweir if( ! rOther.m_aDataSequences.empty()) 205cdf0e10cSrcweir { 206cdf0e10cSrcweir if( lcl_isInternalData( rOther.m_aDataSequences.front())) 207cdf0e10cSrcweir CloneHelper::CloneRefVector< tDataSequenceContainer::value_type >( 208cdf0e10cSrcweir rOther.m_aDataSequences, m_aDataSequences ); 209cdf0e10cSrcweir else 210cdf0e10cSrcweir m_aDataSequences = rOther.m_aDataSequences; 211cdf0e10cSrcweir ModifyListenerHelper::addListenerToAllElements( m_aDataSequences, m_xModifyEventForwarder ); 212cdf0e10cSrcweir } 213cdf0e10cSrcweir } 214cdf0e10cSrcweir 215cdf0e10cSrcweir ErrorBar::~ErrorBar() 216cdf0e10cSrcweir {} 217cdf0e10cSrcweir 218cdf0e10cSrcweir uno::Reference< util::XCloneable > SAL_CALL ErrorBar::createClone() 219cdf0e10cSrcweir throw (uno::RuntimeException) 220cdf0e10cSrcweir { 221cdf0e10cSrcweir return uno::Reference< util::XCloneable >( new ErrorBar( *this )); 222cdf0e10cSrcweir } 223cdf0e10cSrcweir 224cdf0e10cSrcweir // ================================================================================ 225cdf0e10cSrcweir 226cdf0e10cSrcweir // ____ OPropertySet ____ 227cdf0e10cSrcweir uno::Any ErrorBar::GetDefaultValue( sal_Int32 nHandle ) const 228cdf0e10cSrcweir throw(beans::UnknownPropertyException) 229cdf0e10cSrcweir { 230cdf0e10cSrcweir const tPropertyValueMap& rStaticDefaults = *StaticErrorBarDefaults::get(); 231cdf0e10cSrcweir tPropertyValueMap::const_iterator aFound( rStaticDefaults.find( nHandle ) ); 232cdf0e10cSrcweir if( aFound == rStaticDefaults.end() ) 233cdf0e10cSrcweir return uno::Any(); 234cdf0e10cSrcweir return (*aFound).second; 235cdf0e10cSrcweir } 236cdf0e10cSrcweir 237cdf0e10cSrcweir ::cppu::IPropertyArrayHelper & SAL_CALL ErrorBar::getInfoHelper() 238cdf0e10cSrcweir { 239cdf0e10cSrcweir return *StaticErrorBarInfoHelper::get(); 240cdf0e10cSrcweir } 241cdf0e10cSrcweir 242cdf0e10cSrcweir // ____ XPropertySet ____ 243cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > SAL_CALL ErrorBar::getPropertySetInfo() 244cdf0e10cSrcweir throw (uno::RuntimeException) 245cdf0e10cSrcweir { 246cdf0e10cSrcweir return *StaticErrorBarInfo::get(); 247cdf0e10cSrcweir } 248cdf0e10cSrcweir 249cdf0e10cSrcweir // ____ XModifyBroadcaster ____ 250cdf0e10cSrcweir void SAL_CALL ErrorBar::addModifyListener( const uno::Reference< util::XModifyListener >& aListener ) 251cdf0e10cSrcweir throw (uno::RuntimeException) 252cdf0e10cSrcweir { 253cdf0e10cSrcweir try 254cdf0e10cSrcweir { 255cdf0e10cSrcweir uno::Reference< util::XModifyBroadcaster > xBroadcaster( m_xModifyEventForwarder, uno::UNO_QUERY_THROW ); 256cdf0e10cSrcweir xBroadcaster->addModifyListener( aListener ); 257cdf0e10cSrcweir } 258cdf0e10cSrcweir catch( const uno::Exception & ex ) 259cdf0e10cSrcweir { 260cdf0e10cSrcweir ASSERT_EXCEPTION( ex ); 261cdf0e10cSrcweir } 262cdf0e10cSrcweir } 263cdf0e10cSrcweir 264cdf0e10cSrcweir void SAL_CALL ErrorBar::removeModifyListener( const uno::Reference< util::XModifyListener >& aListener ) 265cdf0e10cSrcweir throw (uno::RuntimeException) 266cdf0e10cSrcweir { 267cdf0e10cSrcweir try 268cdf0e10cSrcweir { 269cdf0e10cSrcweir uno::Reference< util::XModifyBroadcaster > xBroadcaster( m_xModifyEventForwarder, uno::UNO_QUERY_THROW ); 270cdf0e10cSrcweir xBroadcaster->removeModifyListener( aListener ); 271cdf0e10cSrcweir } 272cdf0e10cSrcweir catch( const uno::Exception & ex ) 273cdf0e10cSrcweir { 274cdf0e10cSrcweir ASSERT_EXCEPTION( ex ); 275cdf0e10cSrcweir } 276cdf0e10cSrcweir } 277cdf0e10cSrcweir 278cdf0e10cSrcweir // ____ XModifyListener ____ 279cdf0e10cSrcweir void SAL_CALL ErrorBar::modified( const lang::EventObject& aEvent ) 280cdf0e10cSrcweir throw (uno::RuntimeException) 281cdf0e10cSrcweir { 282cdf0e10cSrcweir m_xModifyEventForwarder->modified( aEvent ); 283cdf0e10cSrcweir } 284cdf0e10cSrcweir 285cdf0e10cSrcweir // ____ XEventListener (base of XModifyListener) ____ 286cdf0e10cSrcweir void SAL_CALL ErrorBar::disposing( const lang::EventObject& /* Source */ ) 287cdf0e10cSrcweir throw (uno::RuntimeException) 288cdf0e10cSrcweir { 289cdf0e10cSrcweir // nothing 290cdf0e10cSrcweir } 291cdf0e10cSrcweir 292cdf0e10cSrcweir // ____ XDataSink ____ 293cdf0e10cSrcweir void SAL_CALL ErrorBar::setData( const uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence > >& aData ) 294cdf0e10cSrcweir throw (uno::RuntimeException) 295cdf0e10cSrcweir { 296cdf0e10cSrcweir ModifyListenerHelper::removeListenerFromAllElements( m_aDataSequences, m_xModifyEventForwarder ); 297cdf0e10cSrcweir EventListenerHelper::removeListenerFromAllElements( m_aDataSequences, this ); 298cdf0e10cSrcweir m_aDataSequences = ContainerHelper::SequenceToVector( aData ); 299cdf0e10cSrcweir EventListenerHelper::addListenerToAllElements( m_aDataSequences, this ); 300cdf0e10cSrcweir ModifyListenerHelper::addListenerToAllElements( m_aDataSequences, m_xModifyEventForwarder ); 301cdf0e10cSrcweir } 302cdf0e10cSrcweir 303cdf0e10cSrcweir // ____ XDataSource ____ 304cdf0e10cSrcweir uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence > > SAL_CALL ErrorBar::getDataSequences() 305cdf0e10cSrcweir throw (uno::RuntimeException) 306cdf0e10cSrcweir { 307cdf0e10cSrcweir return ContainerHelper::ContainerToSequence( m_aDataSequences ); 308cdf0e10cSrcweir } 309cdf0e10cSrcweir 310cdf0e10cSrcweir // ____ XChild ____ 311cdf0e10cSrcweir uno::Reference< uno::XInterface > SAL_CALL ErrorBar::getParent() 312cdf0e10cSrcweir throw (uno::RuntimeException) 313cdf0e10cSrcweir { 314cdf0e10cSrcweir return m_xParent; 315cdf0e10cSrcweir } 316cdf0e10cSrcweir 317cdf0e10cSrcweir void SAL_CALL ErrorBar::setParent( 318cdf0e10cSrcweir const uno::Reference< uno::XInterface >& Parent ) 319cdf0e10cSrcweir throw (lang::NoSupportException, 320cdf0e10cSrcweir uno::RuntimeException) 321cdf0e10cSrcweir { 322cdf0e10cSrcweir m_xParent.set( Parent ); 323cdf0e10cSrcweir } 324cdf0e10cSrcweir 325cdf0e10cSrcweir // ____ OPropertySet ____ 326cdf0e10cSrcweir void ErrorBar::firePropertyChangeEvent() 327cdf0e10cSrcweir { 328cdf0e10cSrcweir fireModifyEvent(); 329cdf0e10cSrcweir } 330cdf0e10cSrcweir 331cdf0e10cSrcweir void ErrorBar::fireModifyEvent() 332cdf0e10cSrcweir { 333cdf0e10cSrcweir m_xModifyEventForwarder->modified( lang::EventObject( static_cast< uno::XWeak* >( this ))); 334cdf0e10cSrcweir } 335cdf0e10cSrcweir 336cdf0e10cSrcweir // ================================================================================ 337cdf0e10cSrcweir 338cdf0e10cSrcweir uno::Sequence< ::rtl::OUString > ErrorBar::getSupportedServiceNames_Static() 339cdf0e10cSrcweir { 340cdf0e10cSrcweir uno::Sequence< ::rtl::OUString > aServices( 2 ); 341cdf0e10cSrcweir aServices[ 0 ] = lcl_aServiceName; 342cdf0e10cSrcweir aServices[ 1 ] = C2U( "com.sun.star.chart2.ErrorBar" ); 343cdf0e10cSrcweir return aServices; 344cdf0e10cSrcweir } 345cdf0e10cSrcweir 346cdf0e10cSrcweir // implement XServiceInfo methods basing upon getSupportedServiceNames_Static 347cdf0e10cSrcweir APPHELPER_XSERVICEINFO_IMPL( ErrorBar, lcl_aServiceName ); 348cdf0e10cSrcweir 349cdf0e10cSrcweir // needed by MSC compiler 350cdf0e10cSrcweir using impl::ErrorBar_Base; 351cdf0e10cSrcweir 352cdf0e10cSrcweir IMPLEMENT_FORWARD_XINTERFACE2( ErrorBar, ErrorBar_Base, OPropertySet ) 353cdf0e10cSrcweir IMPLEMENT_FORWARD_XTYPEPROVIDER2( ErrorBar, ErrorBar_Base, OPropertySet ) 354cdf0e10cSrcweir 355cdf0e10cSrcweir } // namespace chart 356