summaryrefslogtreecommitdiff
path: root/oox/source/drawingml/chart/seriesconverter.cxx
diff options
context:
space:
mode:
authorVladimir Glazounov <vg@openoffice.org>2008-07-01 11:10:26 +0000
committerVladimir Glazounov <vg@openoffice.org>2008-07-01 11:10:26 +0000
commit185f81199198be4245b28c479e00d2666d876f98 (patch)
tree7ada94e3333fdc4f4aa66d0a54a018e6568c6edb /oox/source/drawingml/chart/seriesconverter.cxx
parent199274d3c8aebf3535ca0a342b8b398951d5015c (diff)
INTEGRATION: CWS xmlfilter05 (1.1.4); FILE MERGED
2008/05/21 12:32:00 dr 1.1.4.12: #i10000# new header 2008/04/23 16:00:22 dr 1.1.4.11: chart auto formatting, first steps... 2008/04/22 10:47:07 dr 1.1.4.10: conversion helpers 2008/04/21 14:52:44 dr 1.1.4.9: chart data point settings 2008/04/18 16:26:58 dr 1.1.4.8: import line symbols 2008/04/18 13:00:09 dr 1.1.4.7: import pie explosion 2008/04/18 12:34:43 dr 1.1.4.6: import stock charts, improved default attribute handling 2008/04/17 12:39:16 dr 1.1.4.5: #i87747# reversed rotation in radar charts 2008/04/17 11:57:16 dr 1.1.4.4: #i87806# manual error bars 2008/04/02 12:41:57 hbrinkm 1.1.4.3: merged changes from xmlfilter04 to xmlfilter05 2008/04/01 15:38:17 hbrinkm 1.1.4.2: 'Merged xmlfilter04' 2008/03/03 14:04:30 hbrinkm 1.1.4.1: file seriesconverter.cxx was added on branch cws_dev300_xmlfilter05 on 2008-04-01 15:38:17 +0000
Diffstat (limited to 'oox/source/drawingml/chart/seriesconverter.cxx')
-rw-r--r--oox/source/drawingml/chart/seriesconverter.cxx229
1 files changed, 162 insertions, 67 deletions
diff --git a/oox/source/drawingml/chart/seriesconverter.cxx b/oox/source/drawingml/chart/seriesconverter.cxx
index 9153f17dd27b..85eac19b29f4 100644
--- a/oox/source/drawingml/chart/seriesconverter.cxx
+++ b/oox/source/drawingml/chart/seriesconverter.cxx
@@ -8,7 +8,7 @@
*
* $RCSfile: seriesconverter.cxx,v $
*
- * $Revision: 1.2 $
+ * $Revision: 1.3 $
*
* This file is part of OpenOffice.org.
*
@@ -30,9 +30,7 @@
************************************************************************/
#include "oox/drawingml/chart/seriesconverter.hxx"
-#include <com/sun/star/chart2/CurveStyle.hpp>
-#include <com/sun/star/chart2/DataPointGeometry3D.hpp>
-#include <com/sun/star/chart2/ErrorBarStyle.hpp>
+#include <com/sun/star/chart/ErrorBarStyle.hpp>
#include <com/sun/star/chart2/XDataSeries.hpp>
#include <com/sun/star/chart2/XRegressionCurve.hpp>
#include <com/sun/star/chart2/XRegressionCurveContainer.hpp>
@@ -62,6 +60,47 @@ namespace chart {
// ============================================================================
+namespace {
+
+Reference< XLabeledDataSequence > lclCreateLabeledDataSequence(
+ const ConverterRoot& rParent,
+ DataSourceModel* pValues, const OUString& rRole,
+ TextModel* pTitle = 0 )
+{
+ // create data sequence for values
+ Reference< XDataSequence > xValueSeq;
+ if( pValues )
+ {
+ DataSourceConverter aSourceConv( rParent, *pValues );
+ xValueSeq = aSourceConv.createDataSequence( rRole );
+ }
+
+ // create data sequence for title
+ Reference< XDataSequence > xTitleSeq;
+ if( pTitle )
+ {
+ TextConverter aTextConv( rParent, *pTitle );
+ xTitleSeq = aTextConv.createDataSequence( CREATE_OUSTRING( "label" ) );
+ }
+
+ // create the labeled data sequence, if values or title are present
+ Reference< XLabeledDataSequence > xLabeledSeq;
+ if( xValueSeq.is() || xTitleSeq.is() )
+ {
+ xLabeledSeq.set( ConverterRoot::createInstance( CREATE_OUSTRING( "com.sun.star.chart2.data.LabeledDataSequence" ) ), UNO_QUERY );
+ if( xLabeledSeq.is() )
+ {
+ xLabeledSeq->setValues( xValueSeq );
+ xLabeledSeq->setLabel( xTitleSeq );
+ }
+ }
+ return xLabeledSeq;
+}
+
+} // namespace
+
+// ============================================================================
+
ErrorBarConverter::ErrorBarConverter( const ConverterRoot& rParent, ErrorBarModel& rModel ) :
ConverterBase< ErrorBarModel >( rParent, rModel )
{
@@ -71,13 +110,12 @@ ErrorBarConverter::~ErrorBarConverter()
{
}
-void ErrorBarConverter::convertModelToDocument( const Reference< XDataSeries >& rxDataSeries )
+void ErrorBarConverter::convertFromModel( const Reference< XDataSeries >& rxDataSeries )
{
bool bShowPos = (mrModel.mnTypeId == XML_plus) || (mrModel.mnTypeId == XML_both);
bool bShowNeg = (mrModel.mnTypeId == XML_minus) || (mrModel.mnTypeId == XML_both);
if( bShowPos || bShowNeg ) try
{
-
Reference< XPropertySet > xErrorBar( createInstance( CREATE_OUSTRING( "com.sun.star.chart2.ErrorBar" ) ), UNO_QUERY_THROW );
PropertySet aBarProp( xErrorBar );
@@ -86,32 +124,60 @@ void ErrorBarConverter::convertModelToDocument( const Reference< XDataSeries >&
aBarProp.setProperty( CREATE_OUSTRING( "ShowNegativeError" ), bShowNeg );
// type of displayed error
- namespace cssc = ::com::sun::star::chart2;
+ namespace cssc = ::com::sun::star::chart;
switch( mrModel.mnValueType )
{
case XML_cust:
- // #i86465# manual error bar values not supported
- xErrorBar.clear();
+ {
+ // #i87806# manual error bars
+ aBarProp.setProperty( CREATE_OUSTRING( "ErrorBarStyle" ), cssc::ErrorBarStyle::FROM_DATA );
+ // attach data sequences to erorr bar
+ Reference< XDataSink > xDataSink( xErrorBar, UNO_QUERY );
+ if( xDataSink.is() )
+ {
+ // create vector of all value sequences
+ ::std::vector< Reference< XLabeledDataSequence > > aLabeledSeqVec;
+ // add positive values
+ if( bShowPos )
+ {
+ Reference< XLabeledDataSequence > xValueSeq = createLabeledDataSequence( ErrorBarModel::PLUS );
+ if( xValueSeq.is() )
+ aLabeledSeqVec.push_back( xValueSeq );
+ }
+ // add negative values
+ if( bShowNeg )
+ {
+ Reference< XLabeledDataSequence > xValueSeq = createLabeledDataSequence( ErrorBarModel::MINUS );
+ if( xValueSeq.is() )
+ aLabeledSeqVec.push_back( xValueSeq );
+ }
+ // attach labeled data sequences to series
+ if( aLabeledSeqVec.empty() )
+ xErrorBar.clear();
+ else
+ xDataSink->setData( ContainerHelper::vectorToSequence( aLabeledSeqVec ) );
+ }
+ }
break;
case XML_fixedVal:
- aBarProp.setProperty( CREATE_OUSTRING( "ErrorBarStyle" ), cssc::ErrorBarStyle_ABSOLUTE );
+ aBarProp.setProperty( CREATE_OUSTRING( "ErrorBarStyle" ), cssc::ErrorBarStyle::ABSOLUTE );
aBarProp.setProperty( CREATE_OUSTRING( "PositiveError" ), mrModel.mfValue );
aBarProp.setProperty( CREATE_OUSTRING( "NegativeError" ), mrModel.mfValue );
break;
case XML_percentage:
- aBarProp.setProperty( CREATE_OUSTRING( "ErrorBarStyle" ), cssc::ErrorBarStyle_RELATIVE );
+ aBarProp.setProperty( CREATE_OUSTRING( "ErrorBarStyle" ), cssc::ErrorBarStyle::RELATIVE );
aBarProp.setProperty( CREATE_OUSTRING( "PositiveError" ), mrModel.mfValue );
aBarProp.setProperty( CREATE_OUSTRING( "NegativeError" ), mrModel.mfValue );
break;
case XML_stdDev:
- aBarProp.setProperty( CREATE_OUSTRING( "ErrorBarStyle" ), cssc::ErrorBarStyle_STANDARD_DEVIATION );
+ aBarProp.setProperty( CREATE_OUSTRING( "ErrorBarStyle" ), cssc::ErrorBarStyle::STANDARD_DEVIATION );
aBarProp.setProperty( CREATE_OUSTRING( "Weight" ), mrModel.mfValue );
break;
case XML_stdErr:
- aBarProp.setProperty( CREATE_OUSTRING( "ErrorBarStyle" ), cssc::ErrorBarStyle_STANDARD_ERROR );
+ aBarProp.setProperty( CREATE_OUSTRING( "ErrorBarStyle" ), cssc::ErrorBarStyle::STANDARD_ERROR );
break;
default:
- OSL_ENSURE( false, "ErrorBarConverter::convertModelToDocument - unknown error bar type" );
+ OSL_ENSURE( false, "ErrorBarConverter::convertFromModel - unknown error bar type" );
xErrorBar.clear();
}
@@ -124,14 +190,40 @@ void ErrorBarConverter::convertModelToDocument( const Reference< XDataSeries >&
{
case XML_x: aSeriesProp.setProperty( CREATE_OUSTRING( "ErrorBarX" ), xErrorBar ); break;
case XML_y: aSeriesProp.setProperty( CREATE_OUSTRING( "ErrorBarY" ), xErrorBar ); break;
- default: OSL_ENSURE( false, "ErrorBarConverter::convertModelToDocument - invalid error bar direction" );
+ default: OSL_ENSURE( false, "ErrorBarConverter::convertFromModel - invalid error bar direction" );
}
}
}
catch( Exception& )
{
- OSL_ENSURE( false, "ErrorBarConverter::convertModelToDocument - error while creating error bars" );
+ OSL_ENSURE( false, "ErrorBarConverter::convertFromModel - error while creating error bars" );
+ }
+}
+
+// private --------------------------------------------------------------------
+
+Reference< XLabeledDataSequence > ErrorBarConverter::createLabeledDataSequence( ErrorBarModel::SourceType eSourceType )
+{
+ OUString aRole;
+ switch( eSourceType )
+ {
+ case ErrorBarModel::PLUS:
+ switch( mrModel.mnDirection )
+ {
+ case XML_x: aRole = CREATE_OUSTRING( "error-bars-x-positive" ); break;
+ case XML_y: aRole = CREATE_OUSTRING( "error-bars-y-positive" ); break;
+ }
+ break;
+ case ErrorBarModel::MINUS:
+ switch( mrModel.mnDirection )
+ {
+ case XML_x: aRole = CREATE_OUSTRING( "error-bars-x-negative" ); break;
+ case XML_y: aRole = CREATE_OUSTRING( "error-bars-y-negative" ); break;
+ }
+ break;
}
+ OSL_ENSURE( aRole.getLength() > 0, "ErrorBarConverter::createLabeledDataSequence - invalid error bar direction" );
+ return lclCreateLabeledDataSequence( *this, mrModel.maSources.get( eSourceType ).get(), aRole );
}
// ============================================================================
@@ -145,7 +237,7 @@ TrendlineConverter::~TrendlineConverter()
{
}
-void TrendlineConverter::convertModelToDocument( const Reference< XDataSeries >& rxDataSeries )
+void TrendlineConverter::convertFromModel( const Reference< XDataSeries >& rxDataSeries )
{
try
{
@@ -159,7 +251,7 @@ void TrendlineConverter::convertModelToDocument( const Reference< XDataSeries >&
case XML_movingAvg: /* #i66819# moving average trendlines not supported */ break;
case XML_poly: /* #i20819# polynomial trendlines not supported */ break;
case XML_power: aServiceName = CREATE_OUSTRING( "com.sun.star.chart2.PotentialRegressionCurve" ); break;
- default: OSL_ENSURE( false, "TrendlineConverter::convertModelToDocument - unknown trendline type" );
+ default: OSL_ENSURE( false, "TrendlineConverter::convertFromModel - unknown trendline type" );
}
if( aServiceName.getLength() > 0 )
{
@@ -181,7 +273,38 @@ void TrendlineConverter::convertModelToDocument( const Reference< XDataSeries >&
}
catch( Exception& )
{
- OSL_ENSURE( false, "TrendlineConverter::convertModelToDocument - error while creating trendline" );
+ OSL_ENSURE( false, "TrendlineConverter::convertFromModel - error while creating trendline" );
+ }
+}
+
+// ============================================================================
+
+DataPointConverter::DataPointConverter( const ConverterRoot& rParent, DataPointModel& rModel ) :
+ ConverterBase< DataPointModel >( rParent, rModel )
+{
+}
+
+DataPointConverter::~DataPointConverter()
+{
+}
+
+void DataPointConverter::convertFromModel( const Reference< XDataSeries >& rxDataSeries,
+ const TypeGroupConverter& rTypeGroup, const SeriesModel& rSeries )
+{
+ try
+ {
+ PropertySet aPropSet( rxDataSeries->getDataPointByIndex( mrModel.mnIndex ) );
+
+ // data point marker
+ if( mrModel.monMarkerSymbol.differsFrom( rSeries.mnMarkerSymbol ) || mrModel.monMarkerSize.differsFrom( rSeries.mnMarkerSize ) )
+ rTypeGroup.convertMarker( aPropSet, mrModel.monMarkerSymbol.get( rSeries.mnMarkerSymbol ), mrModel.monMarkerSize.get( rSeries.mnMarkerSize ) );
+
+ // data point pie explosion
+ if( mrModel.monExplosion.differsFrom( rSeries.mnExplosion ) )
+ rTypeGroup.convertPieExplosion( aPropSet, mrModel.monExplosion.get() );
+ }
+ catch( Exception& )
+ {
}
}
@@ -198,7 +321,7 @@ SeriesConverter::~SeriesConverter()
Reference< XLabeledDataSequence > SeriesConverter::createCategorySequence( const OUString& rRole )
{
- return createLabeledDataSequence( SeriesModel::CATEGORIES, rRole );
+ return createLabeledDataSequence( SeriesModel::CATEGORIES, rRole, false );
}
Reference< XLabeledDataSequence > SeriesConverter::createValueSequence( const OUString& rRole )
@@ -210,6 +333,7 @@ Reference< XDataSeries > SeriesConverter::createDataSeries( const TypeGroupConve
{
// create the data series object
Reference< XDataSeries > xDataSeries( createInstance( CREATE_OUSTRING( "com.sun.star.chart2.DataSeries" ) ), UNO_QUERY );
+ PropertySet aSeriesProp( xDataSeries );
// attach data and title sequences to series
Reference< XDataSink > xDataSink( xDataSeries, UNO_QUERY );
@@ -237,39 +361,33 @@ Reference< XDataSeries > SeriesConverter::createDataSeries( const TypeGroupConve
for( SeriesModel::ErrorBarVector::iterator aIt = mrModel.maErrorBars.begin(), aEnd = mrModel.maErrorBars.end(); aIt != aEnd; ++aIt )
{
ErrorBarConverter aErrorBarConv( *this, **aIt );
- aErrorBarConv.convertModelToDocument( xDataSeries );
+ aErrorBarConv.convertFromModel( xDataSeries );
}
// trendlines
for( SeriesModel::TrendlineVector::iterator aIt = mrModel.maTrendlines.begin(), aEnd = mrModel.maTrendlines.end(); aIt != aEnd; ++aIt )
{
TrendlineConverter aTrendlineConv( *this, **aIt );
- aTrendlineConv.convertModelToDocument( xDataSeries );
+ aTrendlineConv.convertFromModel( xDataSeries );
}
- // series properties
- namespace cssc = ::com::sun::star::chart2;
- PropertySet aSeriesProp( xDataSeries );
-
-#if 0
- // TODO: #i66858# smoothed lines per series
- if( mrModel.mobSmooth.get( false ) )
- aSeriesProp.setProperty( CREATE_OUSTRING( "CurveStyle" ), cssc::CurveStyle_CUBIC_SPLINES );
+ // data point markers
+ rTypeGroup.convertMarker( aSeriesProp, mrModel.mnMarkerSymbol, mrModel.mnMarkerSize );
+#if OOX_CHART_SMOOTHED_PER_SERIES
+ // #i66858# smoothed series lines
+ rTypeGroup.convertLineSmooth( aSeriesProp, mrModel.mbSmooth );
#endif
-
// 3D bar style (not possible to set at chart type -> set at all series)
- sal_Int32 nApiShape = cssc::DataPointGeometry3D::CUBOID;
- switch( mrModel.monShape.get( rTypeGroup.getModel().mnShape ) )
+ rTypeGroup.convertBarGeometry( aSeriesProp, mrModel.monShape.get( rTypeGroup.getModel().mnShape ) );
+ // pie explosion (restricted to [0%,100%] in Chart2)
+ rTypeGroup.convertPieExplosion( aSeriesProp, mrModel.mnExplosion );
+
+ // data point settings
+ for( SeriesModel::DataPointVector::iterator aIt = mrModel.maPoints.begin(), aEnd = mrModel.maPoints.end(); aIt != aEnd; ++aIt )
{
- case XML_box: nApiShape = cssc::DataPointGeometry3D::CUBOID; break;
- case XML_cone: nApiShape = cssc::DataPointGeometry3D::CONE; break;
- case XML_coneToMax: nApiShape = cssc::DataPointGeometry3D::CONE; break;
- case XML_cylinder: nApiShape = cssc::DataPointGeometry3D::CYLINDER; break;
- case XML_pyramid: nApiShape = cssc::DataPointGeometry3D::PYRAMID; break;
- case XML_pyramidToMax: nApiShape = cssc::DataPointGeometry3D::PYRAMID; break;
- default: OSL_ENSURE( false, "SeriesConverter::createDataSeries - unknown 3D bar shape type" );
+ DataPointConverter aPointConv( *this, **aIt );
+ aPointConv.convertFromModel( xDataSeries, rTypeGroup, mrModel );
}
- aSeriesProp.setProperty( CREATE_OUSTRING( "Geometry3D" ), nApiShape );
return xDataSeries;
}
@@ -279,32 +397,9 @@ Reference< XDataSeries > SeriesConverter::createDataSeries( const TypeGroupConve
Reference< XLabeledDataSequence > SeriesConverter::createLabeledDataSequence(
SeriesModel::SourceType eSourceType, const OUString& rRole, bool bUseTextLabel )
{
- // create data sequence for values and title
- Reference< XDataSequence > xValueSeq;
- if( DataSourceModel* pValues = mrModel.maSources.get( eSourceType ).get() )
- {
- DataSourceConverter aSourceConv( *this, *pValues );
- xValueSeq = aSourceConv.createDataSequence( rRole );
- }
- Reference< XDataSequence > xTitleSeq;
- if( bUseTextLabel && mrModel.mxText.is() )
- {
- TextConverter aTextConv( *this, *mrModel.mxText );
- xTitleSeq = aTextConv.createDataSequence( CREATE_OUSTRING( "label" ) );
- }
-
- // create the labeled data sequence, if values or title are present
- Reference< XLabeledDataSequence > xLabeledSeq;
- if( xValueSeq.is() || xTitleSeq.is() )
- {
- xLabeledSeq.set( ConverterRoot::createInstance( CREATE_OUSTRING( "com.sun.star.chart2.data.LabeledDataSequence" ) ), UNO_QUERY );
- if( xLabeledSeq.is() )
- {
- xLabeledSeq->setValues( xValueSeq );
- xLabeledSeq->setLabel( xTitleSeq );
- }
- }
- return xLabeledSeq;
+ DataSourceModel* pValues = mrModel.maSources.get( eSourceType ).get();
+ TextModel* pTitle = bUseTextLabel ? mrModel.mxText.get() : 0;
+ return lclCreateLabeledDataSequence( *this, pValues, rRole, pTitle );
}
// ============================================================================