From ca82e0625dd0a63243da28c585b60d3f77dc7114 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Milcke?= Date: Thu, 20 Nov 2003 17:12:27 +0000 Subject: [PATCH] Line- and Scatter subtypes added (symbols, curve type) --- .../controller/dialogs/dlg_ChartType.cxx | 27 ++- .../source/controller/inc/dlg_ChartType.hxx | 8 +- .../model/template/ChartTypeTemplate.cxx | 30 ++- .../source/model/template/LineChartType.cxx | 14 +- .../source/model/template/LineChartType.hxx | 10 +- .../model/template/LineChartTypeTemplate.cxx | 182 +++++++++++++++- .../model/template/LineChartTypeTemplate.hxx | 33 ++- .../model/template/ScatterChartType.cxx | 14 +- .../model/template/ScatterChartType.hxx | 8 +- .../template/ScatterChartTypeTemplate.cxx | 201 ++++++++++++++++-- .../template/ScatterChartTypeTemplate.hxx | 33 ++- 11 files changed, 501 insertions(+), 59 deletions(-) diff --git a/chart2/source/controller/dialogs/dlg_ChartType.cxx b/chart2/source/controller/dialogs/dlg_ChartType.cxx index bd7fa7a67617..5a78bcf825fd 100644 --- a/chart2/source/controller/dialogs/dlg_ChartType.cxx +++ b/chart2/source/controller/dialogs/dlg_ChartType.cxx @@ -2,9 +2,9 @@ * * $RCSfile: dlg_ChartType.cxx,v $ * - * $Revision: 1.5 $ + * $Revision: 1.6 $ * - * last change: $Author: bm $ $Date: 2003-11-20 17:07:34 $ + * last change: $Author: bm $ $Date: 2003-11-20 18:12:22 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -323,7 +323,7 @@ bool lcl_IsCombiChart( SvxChartStyle eStyle ) { try { - OSL_TRACE( U2C( aServiceNames[i] )); +// OSL_TRACE( U2C( aServiceNames[i] )); uno::Reference< chart2::XChartTypeTemplate > xTempl( xCTManager->createInstance( aServiceNames[ i ] ), uno::UNO_QUERY_THROW ); @@ -1143,7 +1143,7 @@ IMPL_LINK( SchDiagramTypeDlg, DoubleClickHdl, void *, EMPTYARG ) |* \************************************************************************/ -sal_Int32 SchDiagramTypeDlg::GetDepth() +sal_Int32 SchDiagramTypeDlg::GetDepth() const { return aMtrFldDeep.GetValue(); } @@ -1208,7 +1208,7 @@ IMPL_LINK( SchDiagramTypeDlg, ClickHdl, void *, EMPTYARG ) |* \************************************************************************/ -sal_Int32 SchDiagramTypeDlg::GetGranularity() +sal_Int32 SchDiagramTypeDlg::GetGranularity() const { return aMtrFldGran.GetValue(); } @@ -1279,6 +1279,23 @@ uno::Reference< chart2::XChartTypeTemplate > SchDiagramTypeDlg::getTemplate() co lcl_GetTemplateServiceNameForChartStyle( eStyle )), uno::UNO_QUERY ); + if( lcl_IsBSplineChart( eStyle ) || + lcl_IsCubicSplineChart( eStyle )) + { + try + { + uno::Reference< beans::XPropertySet > xProp( xResult, uno::UNO_QUERY_THROW ); + xProp->setPropertyValue( C2U( "CurveResolution" ), uno::makeAny( GetGranularity())); + + if( lcl_IsBSplineChart( eStyle )) + xProp->setPropertyValue( C2U( "SplineOrder" ), uno::makeAny( GetDepth())); + } + catch( uno::Exception & ex ) + { + ASSERT_EXCEPTION( ex ); + } + } + if( lcl_IsCombiChart( eStyle )) { try diff --git a/chart2/source/controller/inc/dlg_ChartType.hxx b/chart2/source/controller/inc/dlg_ChartType.hxx index aec1d7d312bc..ec854a397818 100644 --- a/chart2/source/controller/inc/dlg_ChartType.hxx +++ b/chart2/source/controller/inc/dlg_ChartType.hxx @@ -2,9 +2,9 @@ * * $RCSfile: dlg_ChartType.hxx,v $ * - * $Revision: 1.3 $ + * $Revision: 1.4 $ * - * last change: $Author: bm $ $Date: 2003-11-04 13:28:38 $ + * last change: $Author: bm $ $Date: 2003-11-20 18:12:23 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -202,10 +202,10 @@ public: //BM void GetAttr(SfxItemSet& rOutAttrs); - sal_Int32 GetDepth(); + sal_Int32 GetDepth() const; void SetDepth( sal_Int32 nDeep ); - sal_Int32 GetGranularity(); + sal_Int32 GetGranularity() const; void SetGranularity( sal_Int32 nGranularity ); /** The value set here determines the maximum number of lines in a line/bar diff --git a/chart2/source/model/template/ChartTypeTemplate.cxx b/chart2/source/model/template/ChartTypeTemplate.cxx index d4acbe10a548..143de44653a6 100644 --- a/chart2/source/model/template/ChartTypeTemplate.cxx +++ b/chart2/source/model/template/ChartTypeTemplate.cxx @@ -2,9 +2,9 @@ * * $RCSfile: ChartTypeTemplate.cxx,v $ * - * $Revision: 1.6 $ + * $Revision: 1.7 $ * - * last change: $Author: bm $ $Date: 2003-11-20 17:07:36 $ + * last change: $Author: bm $ $Date: 2003-11-20 18:12:23 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -199,16 +199,26 @@ sal_Bool SAL_CALL ChartTypeTemplate::matchesTemplate( if( aChartTypes[0]->getChartType()->getChartType().equals( getDefaultChartType()->getChartType())) { - uno::Reference< beans::XPropertySet > xProp( aChartTypes[0], uno::UNO_QUERY ); - sal_Int32 nDim; - if( xProp.is() && - (xProp->getPropertyValue( C2U( "Dimension" )) >>= nDim )) + try { - bResult = (nDim == getDimension()); + uno::Reference< beans::XPropertySet > xProp( aChartTypes[0]->getChartType(), + uno::UNO_QUERY_THROW ); + uno::Reference< beans::XPropertySetInfo > xInfo( xProp->getPropertySetInfo() ); + sal_Int32 nDim; + if( xInfo.is() && + xInfo->hasPropertyByName( C2U( "Dimension" )) && + (xProp->getPropertyValue( C2U( "Dimension" )) >>= nDim )) + { + bResult = (nDim == getDimension()); + } + else + // correct chart type, but without Dimension property + bResult = sal_True; + } + catch( uno::Exception & ex ) + { + ASSERT_EXCEPTION( ex ); } - else - // correct chart type, but without Dimension property - bResult = sal_True; if( bResult ) bResult = ( helper::DataSeriesTreeHelper::getStackMode( xParent ) == diff --git a/chart2/source/model/template/LineChartType.cxx b/chart2/source/model/template/LineChartType.cxx index 4e452439be15..bbe92de44e28 100644 --- a/chart2/source/model/template/LineChartType.cxx +++ b/chart2/source/model/template/LineChartType.cxx @@ -2,9 +2,9 @@ * * $RCSfile: LineChartType.cxx,v $ * - * $Revision: 1.4 $ + * $Revision: 1.5 $ * - * last change: $Author: bm $ $Date: 2003-11-19 17:27:01 $ + * last change: $Author: bm $ $Date: 2003-11-20 18:12:23 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -178,12 +178,20 @@ namespace chart LineChartType::LineChartType( sal_Int32 nDim /* = 2 */, - chart2::CurveStyle eCurveStyle /* chart2::CurveStyle_LINES */ ) : + chart2::CurveStyle eCurveStyle /* chart2::CurveStyle_LINES */, + sal_Int32 nResolution /* = 20 */, + sal_Int32 nOrder /* = 3 */ ) : ChartType( nDim ) { if( eCurveStyle != chart2::CurveStyle_LINES ) setFastPropertyValue_NoBroadcast( PROP_LINECHARTTYPE_CURVE_STYLE, uno::makeAny( eCurveStyle )); + if( nResolution != 20 ) + setFastPropertyValue_NoBroadcast( PROP_LINECHARTTYPE_CURVE_RESOLUTION, + uno::makeAny( nResolution )); + if( nOrder != 3 ) + setFastPropertyValue_NoBroadcast( PROP_LINECHARTTYPE_SPLINE_ORDER, + uno::makeAny( nOrder )); } LineChartType::~LineChartType() diff --git a/chart2/source/model/template/LineChartType.hxx b/chart2/source/model/template/LineChartType.hxx index 7fab963f3c70..dc2fda9f9d85 100644 --- a/chart2/source/model/template/LineChartType.hxx +++ b/chart2/source/model/template/LineChartType.hxx @@ -2,9 +2,9 @@ * * $RCSfile: LineChartType.hxx,v $ * - * $Revision: 1.3 $ + * $Revision: 1.4 $ * - * last change: $Author: bm $ $Date: 2003-11-19 16:50:13 $ + * last change: $Author: bm $ $Date: 2003-11-20 18:12:24 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -74,8 +74,10 @@ class LineChartType : public ChartType { public: LineChartType( sal_Int32 nDim = 2, - ::drafts::com::sun::star::chart2::CurveStyle eCurveStyle = - ::drafts::com::sun::star::chart2::CurveStyle_LINES ); + ::drafts::com::sun::star::chart2::CurveStyle eCurveStyle = + ::drafts::com::sun::star::chart2::CurveStyle_LINES, + sal_Int32 nResolution = 20, + sal_Int32 nOrder = 3 ); virtual ~LineChartType(); protected: diff --git a/chart2/source/model/template/LineChartTypeTemplate.cxx b/chart2/source/model/template/LineChartTypeTemplate.cxx index 744781cdfdca..9c033d8f0408 100644 --- a/chart2/source/model/template/LineChartTypeTemplate.cxx +++ b/chart2/source/model/template/LineChartTypeTemplate.cxx @@ -2,9 +2,9 @@ * * $RCSfile: LineChartTypeTemplate.cxx,v $ * - * $Revision: 1.5 $ + * $Revision: 1.6 $ * - * last change: $Author: bm $ $Date: 2003-11-20 17:07:38 $ + * last change: $Author: bm $ $Date: 2003-11-20 18:12:24 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -61,6 +61,7 @@ #include "LineChartTypeTemplate.hxx" #include "LineChartType.hxx" #include "macros.hxx" +#include "algohelper.hxx" #include "DataSeriesTreeHelper.hxx" #ifndef _DRAFTS_COM_SUN_STAR_CHART2_SYMBOLSTYLE_HPP_ @@ -70,9 +71,104 @@ #include #endif +#ifndef CHART_PROPERTYHELPER_HXX +#include "PropertyHelper.hxx" +#endif +#ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBUTE_HPP_ +#include +#endif + +#include + using namespace ::com::sun::star; using namespace ::drafts::com::sun::star; +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Sequence; +using ::rtl::OUString; +using ::com::sun::star::beans::Property; +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Any; +using ::osl::MutexGuard; + +namespace +{ + +static const OUString lcl_aServiceName( + RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart2.LineChartTypeTemplate" )); + +enum +{ + PROP_LINECHARTTYPE_TEMPLATE_CURVE_RESOLUTION, + PROP_LINECHARTTYPE_TEMPLATE_SPLINE_ORDER + +}; + +void lcl_AddPropertiesToVector( + ::std::vector< Property > & rOutProperties ) +{ + rOutProperties.push_back( + Property( C2U( "CurveResolution" ), + PROP_LINECHARTTYPE_TEMPLATE_CURVE_RESOLUTION, + ::getCppuType( reinterpret_cast< const sal_Int32 * >(0)), + beans::PropertyAttribute::BOUND + | beans::PropertyAttribute::MAYBEDEFAULT )); + rOutProperties.push_back( + Property( C2U( "SplineOrder" ), + PROP_LINECHARTTYPE_TEMPLATE_SPLINE_ORDER, + ::getCppuType( reinterpret_cast< const sal_Int32 * >(0)), + beans::PropertyAttribute::BOUND + | beans::PropertyAttribute::MAYBEDEFAULT )); +} + +void lcl_AddDefaultsToMap( + ::chart::helper::tPropertyValueMap & rOutMap ) +{ + OSL_ASSERT( rOutMap.end() == rOutMap.find( PROP_LINECHARTTYPE_TEMPLATE_CURVE_RESOLUTION )); + rOutMap[ PROP_LINECHARTTYPE_TEMPLATE_CURVE_RESOLUTION ] = + uno::makeAny( sal_Int32( 20 ) ); + + // todo: check whether order 3 means polygons of order 3 or 2. (see + // http://www.people.nnov.ru/fractal/Splines/Basis.htm ) + OSL_ASSERT( rOutMap.end() == rOutMap.find( PROP_LINECHARTTYPE_TEMPLATE_SPLINE_ORDER )); + rOutMap[ PROP_LINECHARTTYPE_TEMPLATE_SPLINE_ORDER ] = + uno::makeAny( sal_Int32( 3 ) ); +} + +const Sequence< Property > & lcl_GetPropertySequence() +{ + static Sequence< Property > aPropSeq; + + // /-- + MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); + if( 0 == aPropSeq.getLength() ) + { + // get properties + ::std::vector< ::com::sun::star::beans::Property > aProperties; + lcl_AddPropertiesToVector( aProperties ); + + // and sort them for access via bsearch + ::std::sort( aProperties.begin(), aProperties.end(), + ::chart::helper::PropertyNameLess() ); + + // transfer result to static Sequence + aPropSeq = ::chart::helper::VectorToSequence( aProperties ); + } + + return aPropSeq; +} + +::cppu::IPropertyArrayHelper & lcl_getInfoHelper() +{ + static ::cppu::OPropertyArrayHelper aArrayHelper( + lcl_GetPropertySequence(), + /* bSorted = */ sal_True ); + + return aArrayHelper; +} + +} // anonymous namespace + namespace chart { @@ -85,14 +181,63 @@ LineChartTypeTemplate::LineChartTypeTemplate( bool bSymbols, sal_Int32 nDim /* = 2 */ ) : ChartTypeTemplate( xContext, rServiceName ), - m_eStackMode( eStackMode ), - m_eCurveStyle( eCurveStyle ), - m_bHasSymbols( bSymbols ), - m_nDim( nDim ) + ::property::OPropertySet( m_aMutex ), + m_eStackMode( eStackMode ), + m_eCurveStyle( eCurveStyle ), + m_bHasSymbols( bSymbols ), + m_nDim( nDim ) {} LineChartTypeTemplate::~LineChartTypeTemplate() {} +// ____ OPropertySet ____ +uno::Any LineChartTypeTemplate::GetDefaultValue( sal_Int32 nHandle ) const + throw(beans::UnknownPropertyException) +{ + static helper::tPropertyValueMap aStaticDefaults; + + // /-- + ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); + if( 0 == aStaticDefaults.size() ) + { + // initialize defaults + lcl_AddDefaultsToMap( aStaticDefaults ); + } + + helper::tPropertyValueMap::const_iterator aFound( + aStaticDefaults.find( nHandle )); + + if( aFound == aStaticDefaults.end()) + return uno::Any(); + + return (*aFound).second; + // \-- +} + +::cppu::IPropertyArrayHelper & SAL_CALL LineChartTypeTemplate::getInfoHelper() +{ + return lcl_getInfoHelper(); +} + + +// ____ XPropertySet ____ +uno::Reference< beans::XPropertySetInfo > SAL_CALL + LineChartTypeTemplate::getPropertySetInfo() + throw (uno::RuntimeException) +{ + static uno::Reference< beans::XPropertySetInfo > xInfo; + + // /-- + MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); + if( !xInfo.is()) + { + xInfo = ::cppu::OPropertySetHelper::createPropertySetInfo( + getInfoHelper()); + } + + return xInfo; + // \-- +} sal_Int32 LineChartTypeTemplate::getDimension() const { @@ -107,6 +252,15 @@ chart2::StackMode LineChartTypeTemplate::getStackMode() const uno::Reference< chart2::XChartType > LineChartTypeTemplate::getDefaultChartType() throw (uno::RuntimeException) { + sal_Int32 nRes; + sal_Int32 nOrder; + + if( ( getFastPropertyValue( PROP_LINECHARTTYPE_TEMPLATE_CURVE_RESOLUTION ) >>= nRes ) && + ( getFastPropertyValue( PROP_LINECHARTTYPE_TEMPLATE_SPLINE_ORDER ) >>= nOrder ) ) + { + return new LineChartType( m_nDim, m_eCurveStyle, nRes, nOrder ); + } + return new LineChartType( m_nDim, m_eCurveStyle ); } @@ -206,4 +360,20 @@ sal_Bool SAL_CALL LineChartTypeTemplate::matchesTemplate( return bResult; } +// ---------------------------------------- + +Sequence< OUString > LineChartTypeTemplate::getSupportedServiceNames_Static() +{ + Sequence< OUString > aServices( 2 ); + aServices[ 0 ] = lcl_aServiceName; + aServices[ 1 ] = C2U( "drafts.com.sun.star.chart2.ChartTypeTemplate" ); + return aServices; +} + +// implement XServiceInfo methods basing upon getSupportedServiceNames_Static +APPHELPER_XSERVICEINFO_IMPL( LineChartTypeTemplate, lcl_aServiceName ); + +IMPLEMENT_FORWARD_XINTERFACE2( LineChartTypeTemplate, ChartTypeTemplate, OPropertySet ) +IMPLEMENT_FORWARD_XTYPEPROVIDER2( LineChartTypeTemplate, ChartTypeTemplate, OPropertySet ) + } // namespace chart diff --git a/chart2/source/model/template/LineChartTypeTemplate.hxx b/chart2/source/model/template/LineChartTypeTemplate.hxx index 5de6ff5a33b0..ec01829e92a2 100644 --- a/chart2/source/model/template/LineChartTypeTemplate.hxx +++ b/chart2/source/model/template/LineChartTypeTemplate.hxx @@ -2,9 +2,9 @@ * * $RCSfile: LineChartTypeTemplate.hxx,v $ * - * $Revision: 1.4 $ + * $Revision: 1.5 $ * - * last change: $Author: bm $ $Date: 2003-11-20 17:07:38 $ + * last change: $Author: bm $ $Date: 2003-11-20 18:12:24 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -62,6 +62,12 @@ #define CHART_LINECHARTTYPETEMPLATE_HXX #include "ChartTypeTemplate.hxx" +#include "OPropertySet.hxx" +#include "MutexContainer.hxx" + +#ifndef _COMPHELPER_UNO3_HXX_ +#include +#endif #ifndef _DRAFTS_COM_SUN_STAR_CHART2_STACKMODE_HPP_ #include @@ -73,7 +79,10 @@ namespace chart { -class LineChartTypeTemplate : public ChartTypeTemplate +class LineChartTypeTemplate : + public helper::MutexContainer, + public ChartTypeTemplate, + public ::property::OPropertySet { public: explicit LineChartTypeTemplate( @@ -85,7 +94,25 @@ public: bool bSymbols, sal_Int32 nDim = 2 ); virtual ~LineChartTypeTemplate(); + /// XServiceInfo declarations + APPHELPER_XSERVICEINFO_DECL() + + /// merge XInterface implementations + DECLARE_XINTERFACE() + /// merge XTypeProvider implementations + DECLARE_XTYPEPROVIDER() + protected: + // ____ OPropertySet ____ + virtual ::com::sun::star::uno::Any GetDefaultValue( sal_Int32 nHandle ) const + throw(::com::sun::star::beans::UnknownPropertyException); + virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper(); + + // ____ XPropertySet ____ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL + getPropertySetInfo() + throw (::com::sun::star::uno::RuntimeException); + // ____ XChartTypeTemplate ____ virtual ::com::sun::star::uno::Reference< ::drafts::com::sun::star::chart2::XDiagram > SAL_CALL createDiagram( const ::com::sun::star::uno::Sequence< diff --git a/chart2/source/model/template/ScatterChartType.cxx b/chart2/source/model/template/ScatterChartType.cxx index 9653bd24e297..b2de9af06233 100644 --- a/chart2/source/model/template/ScatterChartType.cxx +++ b/chart2/source/model/template/ScatterChartType.cxx @@ -2,9 +2,9 @@ * * $RCSfile: ScatterChartType.cxx,v $ * - * $Revision: 1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: bm $ $Date: 2003-11-20 17:02:23 $ + * last change: $Author: bm $ $Date: 2003-11-20 18:12:25 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -178,12 +178,20 @@ namespace chart ScatterChartType::ScatterChartType( sal_Int32 nDim /* = 2 */, - chart2::CurveStyle eCurveStyle /* chart2::CurveStyle_LINES */ ) : + chart2::CurveStyle eCurveStyle /* chart2::CurveStyle_LINES */ , + sal_Int32 nResolution /* = 20 */, + sal_Int32 nOrder /* = 3 */ ) : ChartType( nDim ) { if( eCurveStyle != chart2::CurveStyle_LINES ) setFastPropertyValue_NoBroadcast( PROP_SCATTERCHARTTYPE_CURVE_STYLE, uno::makeAny( eCurveStyle )); + if( nResolution != 20 ) + setFastPropertyValue_NoBroadcast( PROP_SCATTERCHARTTYPE_CURVE_RESOLUTION, + uno::makeAny( nResolution )); + if( nOrder != 3 ) + setFastPropertyValue_NoBroadcast( PROP_SCATTERCHARTTYPE_SPLINE_ORDER, + uno::makeAny( nOrder )); } ScatterChartType::~ScatterChartType() diff --git a/chart2/source/model/template/ScatterChartType.hxx b/chart2/source/model/template/ScatterChartType.hxx index 81d86c80943e..4b5430e58a16 100644 --- a/chart2/source/model/template/ScatterChartType.hxx +++ b/chart2/source/model/template/ScatterChartType.hxx @@ -2,9 +2,9 @@ * * $RCSfile: ScatterChartType.hxx,v $ * - * $Revision: 1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: bm $ $Date: 2003-11-20 17:02:33 $ + * last change: $Author: bm $ $Date: 2003-11-20 18:12:25 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -75,7 +75,9 @@ class ScatterChartType : public ChartType public: ScatterChartType( sal_Int32 nDim = 2, ::drafts::com::sun::star::chart2::CurveStyle eCurveStyle = - ::drafts::com::sun::star::chart2::CurveStyle_LINES ); + ::drafts::com::sun::star::chart2::CurveStyle_LINES, + sal_Int32 nResolution = 20, + sal_Int32 nOrder = 3 ); virtual ~ScatterChartType(); protected: diff --git a/chart2/source/model/template/ScatterChartTypeTemplate.cxx b/chart2/source/model/template/ScatterChartTypeTemplate.cxx index 415714847266..7f087d191308 100644 --- a/chart2/source/model/template/ScatterChartTypeTemplate.cxx +++ b/chart2/source/model/template/ScatterChartTypeTemplate.cxx @@ -2,9 +2,9 @@ * * $RCSfile: ScatterChartTypeTemplate.cxx,v $ * - * $Revision: 1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: bm $ $Date: 2003-11-20 17:02:46 $ + * last change: $Author: bm $ $Date: 2003-11-20 18:12:26 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -61,6 +61,7 @@ #include "ScatterChartTypeTemplate.hxx" #include "ScatterChartType.hxx" #include "macros.hxx" +#include "algohelper.hxx" #include "DataSeriesTreeHelper.hxx" #ifndef _DRAFTS_COM_SUN_STAR_CHART2_SYMBOLSTYLE_HPP_ @@ -70,43 +71,197 @@ #include #endif +#ifndef CHART_PROPERTYHELPER_HXX +#include "PropertyHelper.hxx" +#endif +#ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBUTE_HPP_ +#include +#endif + +#include + using namespace ::com::sun::star; using namespace ::drafts::com::sun::star; +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Sequence; +using ::rtl::OUString; +using ::com::sun::star::beans::Property; +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Any; +using ::osl::MutexGuard; + +namespace +{ + +static const OUString lcl_aServiceName( + RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart2.ScatterChartTypeTemplate" )); + +enum +{ + PROP_SCATTERCHARTTYPE_TEMPLATE_CURVE_RESOLUTION, + PROP_SCATTERCHARTTYPE_TEMPLATE_SPLINE_ORDER + +}; + +void lcl_AddPropertiesToVector( + ::std::vector< Property > & rOutProperties ) +{ + rOutProperties.push_back( + Property( C2U( "CurveResolution" ), + PROP_SCATTERCHARTTYPE_TEMPLATE_CURVE_RESOLUTION, + ::getCppuType( reinterpret_cast< const sal_Int32 * >(0)), + beans::PropertyAttribute::BOUND + | beans::PropertyAttribute::MAYBEDEFAULT )); + rOutProperties.push_back( + Property( C2U( "SplineOrder" ), + PROP_SCATTERCHARTTYPE_TEMPLATE_SPLINE_ORDER, + ::getCppuType( reinterpret_cast< const sal_Int32 * >(0)), + beans::PropertyAttribute::BOUND + | beans::PropertyAttribute::MAYBEDEFAULT )); +} + +void lcl_AddDefaultsToMap( + ::chart::helper::tPropertyValueMap & rOutMap ) +{ + OSL_ASSERT( rOutMap.end() == rOutMap.find( PROP_SCATTERCHARTTYPE_TEMPLATE_CURVE_RESOLUTION )); + rOutMap[ PROP_SCATTERCHARTTYPE_TEMPLATE_CURVE_RESOLUTION ] = + uno::makeAny( sal_Int32( 20 ) ); + + // todo: check whether order 3 means polygons of order 3 or 2. (see + // http://www.people.nnov.ru/fractal/Splines/Basis.htm ) + OSL_ASSERT( rOutMap.end() == rOutMap.find( PROP_SCATTERCHARTTYPE_TEMPLATE_SPLINE_ORDER )); + rOutMap[ PROP_SCATTERCHARTTYPE_TEMPLATE_SPLINE_ORDER ] = + uno::makeAny( sal_Int32( 3 ) ); +} + +const Sequence< Property > & lcl_GetPropertySequence() +{ + static Sequence< Property > aPropSeq; + + // /-- + MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); + if( 0 == aPropSeq.getLength() ) + { + // get properties + ::std::vector< ::com::sun::star::beans::Property > aProperties; + lcl_AddPropertiesToVector( aProperties ); + + // and sort them for access via bsearch + ::std::sort( aProperties.begin(), aProperties.end(), + ::chart::helper::PropertyNameLess() ); + + // transfer result to static Sequence + aPropSeq = ::chart::helper::VectorToSequence( aProperties ); + } + + return aPropSeq; +} + +::cppu::IPropertyArrayHelper & lcl_getInfoHelper() +{ + static ::cppu::OPropertyArrayHelper aArrayHelper( + lcl_GetPropertySequence(), + /* bSorted = */ sal_True ); + + return aArrayHelper; +} + +} // anonymous namespace + namespace chart { ScatterChartTypeTemplate::ScatterChartTypeTemplate( - uno::Reference< + Reference< uno::XComponentContext > const & xContext, - const ::rtl::OUString & rServiceName, + const OUString & rServiceName, chart2::CurveStyle eCurveStyle, bool bSymbols, sal_Int32 nDim /* = 2 */ ) : ChartTypeTemplate( xContext, rServiceName ), - m_eCurveStyle( eCurveStyle ), - m_bHasSymbols( bSymbols ), - m_nDim( nDim ) + ::property::OPropertySet( m_aMutex ), + m_eCurveStyle( eCurveStyle ), + m_bHasSymbols( bSymbols ), + m_nDim( nDim ) {} ScatterChartTypeTemplate::~ScatterChartTypeTemplate() {} +// ____ OPropertySet ____ +uno::Any ScatterChartTypeTemplate::GetDefaultValue( sal_Int32 nHandle ) const + throw(beans::UnknownPropertyException) +{ + static helper::tPropertyValueMap aStaticDefaults; + + // /-- + ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); + if( 0 == aStaticDefaults.size() ) + { + // initialize defaults + lcl_AddDefaultsToMap( aStaticDefaults ); + } + + helper::tPropertyValueMap::const_iterator aFound( + aStaticDefaults.find( nHandle )); + + if( aFound == aStaticDefaults.end()) + return uno::Any(); + + return (*aFound).second; + // \-- +} + +::cppu::IPropertyArrayHelper & SAL_CALL ScatterChartTypeTemplate::getInfoHelper() +{ + return lcl_getInfoHelper(); +} + + +// ____ XPropertySet ____ +uno::Reference< beans::XPropertySetInfo > SAL_CALL + ScatterChartTypeTemplate::getPropertySetInfo() + throw (uno::RuntimeException) +{ + static uno::Reference< beans::XPropertySetInfo > xInfo; + + // /-- + MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); + if( !xInfo.is()) + { + xInfo = ::cppu::OPropertySetHelper::createPropertySetInfo( + getInfoHelper()); + } + + return xInfo; + // \-- +} + sal_Int32 ScatterChartTypeTemplate::getDimension() const { return m_nDim; } -uno::Reference< chart2::XChartType > ScatterChartTypeTemplate::getDefaultChartType() +Reference< chart2::XChartType > ScatterChartTypeTemplate::getDefaultChartType() throw (uno::RuntimeException) { + sal_Int32 nRes; + sal_Int32 nOrder; + + if( ( getFastPropertyValue( PROP_SCATTERCHARTTYPE_TEMPLATE_CURVE_RESOLUTION ) >>= nRes ) && + ( getFastPropertyValue( PROP_SCATTERCHARTTYPE_TEMPLATE_SPLINE_ORDER ) >>= nOrder ) ) + { + return new ScatterChartType( m_nDim, m_eCurveStyle, nRes, nOrder ); + } + return new ScatterChartType( m_nDim, m_eCurveStyle ); } // ____ XChartTypeTemplate ____ -uno::Reference< chart2::XDiagram > SAL_CALL +Reference< chart2::XDiagram > SAL_CALL ScatterChartTypeTemplate::createDiagram( - const uno::Sequence< uno::Reference< chart2::XDataSeries > >& aSeriesSeq ) + const Sequence< Reference< chart2::XDataSeries > >& aSeriesSeq ) throw (uno::RuntimeException) { // set symbol type at data series @@ -119,7 +274,7 @@ uno::Reference< chart2::XDiagram > SAL_CALL try { chart2::SymbolProperties aSymbProp; - uno::Reference< beans::XPropertySet > xProp( aSeriesSeq[i], uno::UNO_QUERY_THROW ); + Reference< beans::XPropertySet > xProp( aSeriesSeq[i], uno::UNO_QUERY_THROW ); if( (xProp->getPropertyValue( C2U( "SymbolProperties" )) >>= aSymbProp ) ) { aSymbProp.aStyle = eStyle; @@ -140,7 +295,7 @@ uno::Reference< chart2::XDiagram > SAL_CALL } sal_Bool SAL_CALL ScatterChartTypeTemplate::matchesTemplate( - const uno::Reference< chart2::XDiagram >& xDiagram ) + const Reference< chart2::XDiagram >& xDiagram ) throw (uno::RuntimeException) { sal_Bool bResult = ChartTypeTemplate::matchesTemplate( xDiagram ); @@ -150,7 +305,7 @@ sal_Bool SAL_CALL ScatterChartTypeTemplate::matchesTemplate( { try { - uno::Reference< beans::XPropertySet > xCTProp( + Reference< beans::XPropertySet > xCTProp( helper::DataSeriesTreeHelper::getChartTypeByIndex( xDiagram->getTree(), 0 ), uno::UNO_QUERY_THROW ); chart2::CurveStyle eCurveStyle; @@ -168,7 +323,7 @@ sal_Bool SAL_CALL ScatterChartTypeTemplate::matchesTemplate( // check symbol-style if( bResult ) { - uno::Sequence< uno::Reference< chart2::XDataSeries > > aSeriesSeq( + Sequence< Reference< chart2::XDataSeries > > aSeriesSeq( helper::DataSeriesTreeHelper::getDataSeriesFromDiagram( xDiagram )); chart2::SymbolStyle eStyle = m_bHasSymbols ? chart2::SymbolStyle_STANDARD @@ -179,7 +334,7 @@ sal_Bool SAL_CALL ScatterChartTypeTemplate::matchesTemplate( try { chart2::SymbolProperties aSymbProp; - uno::Reference< beans::XPropertySet > xProp( aSeriesSeq[i], uno::UNO_QUERY_THROW ); + Reference< beans::XPropertySet > xProp( aSeriesSeq[i], uno::UNO_QUERY_THROW ); if( (xProp->getPropertyValue( C2U( "SymbolProperties" )) >>= aSymbProp ) ) { if( aSymbProp.aStyle != eStyle ) @@ -199,4 +354,20 @@ sal_Bool SAL_CALL ScatterChartTypeTemplate::matchesTemplate( return bResult; } +// ---------------------------------------- + +Sequence< OUString > ScatterChartTypeTemplate::getSupportedServiceNames_Static() +{ + Sequence< OUString > aServices( 2 ); + aServices[ 0 ] = lcl_aServiceName; + aServices[ 1 ] = C2U( "drafts.com.sun.star.chart2.ChartTypeTemplate" ); + return aServices; +} + +// implement XServiceInfo methods basing upon getSupportedServiceNames_Static +APPHELPER_XSERVICEINFO_IMPL( ScatterChartTypeTemplate, lcl_aServiceName ); + +IMPLEMENT_FORWARD_XINTERFACE2( ScatterChartTypeTemplate, ChartTypeTemplate, OPropertySet ) +IMPLEMENT_FORWARD_XTYPEPROVIDER2( ScatterChartTypeTemplate, ChartTypeTemplate, OPropertySet ) + } // namespace chart diff --git a/chart2/source/model/template/ScatterChartTypeTemplate.hxx b/chart2/source/model/template/ScatterChartTypeTemplate.hxx index 91c8aeb35a3e..31cff5e94479 100644 --- a/chart2/source/model/template/ScatterChartTypeTemplate.hxx +++ b/chart2/source/model/template/ScatterChartTypeTemplate.hxx @@ -2,9 +2,9 @@ * * $RCSfile: ScatterChartTypeTemplate.hxx,v $ * - * $Revision: 1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: bm $ $Date: 2003-11-20 17:02:55 $ + * last change: $Author: bm $ $Date: 2003-11-20 18:12:27 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -62,6 +62,12 @@ #define CHART_SCATTERCHARTTYPETEMPLATE_HXX #include "ChartTypeTemplate.hxx" +#include "OPropertySet.hxx" +#include "MutexContainer.hxx" + +#ifndef _COMPHELPER_UNO3_HXX_ +#include +#endif #ifndef _DRAFTS_COM_SUN_STAR_CHART2_STACKMODE_HPP_ #include @@ -73,7 +79,10 @@ namespace chart { -class ScatterChartTypeTemplate : public ChartTypeTemplate +class ScatterChartTypeTemplate : + public helper::MutexContainer, + public ChartTypeTemplate, + public ::property::OPropertySet { public: explicit ScatterChartTypeTemplate( @@ -84,7 +93,25 @@ public: bool bSymbols, sal_Int32 nDim = 2 ); virtual ~ScatterChartTypeTemplate(); + /// XServiceInfo declarations + APPHELPER_XSERVICEINFO_DECL() + + /// merge XInterface implementations + DECLARE_XINTERFACE() + /// merge XTypeProvider implementations + DECLARE_XTYPEPROVIDER() + protected: + // ____ OPropertySet ____ + virtual ::com::sun::star::uno::Any GetDefaultValue( sal_Int32 nHandle ) const + throw(::com::sun::star::beans::UnknownPropertyException); + virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper(); + + // ____ XPropertySet ____ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL + getPropertySetInfo() + throw (::com::sun::star::uno::RuntimeException); + // ____ XChartTypeTemplate ____ virtual ::com::sun::star::uno::Reference< ::drafts::com::sun::star::chart2::XDiagram > SAL_CALL createDiagram( const ::com::sun::star::uno::Sequence<