summaryrefslogtreecommitdiff
path: root/chart2/source/view/main/ChartView.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'chart2/source/view/main/ChartView.cxx')
-rw-r--r--chart2/source/view/main/ChartView.cxx138
1 files changed, 112 insertions, 26 deletions
diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx
index b17a3b5337cf..28be0740d23d 100644
--- a/chart2/source/view/main/ChartView.cxx
+++ b/chart2/source/view/main/ChartView.cxx
@@ -7,7 +7,7 @@
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: ChartView.cxx,v $
- * $Revision: 1.47 $
+ * $Revision: 1.46.22.5 $
*
* This file is part of OpenOffice.org.
*
@@ -551,17 +551,18 @@ public:
void initializeCooSysAndSeriesPlotter( const uno::Reference< frame::XModel >& xChartModel );
void initAxisUsageList();
- void doAutoScaling();
+ void doAutoScaling( const uno::Reference< frame::XModel >& xChartModel );
void updateScalesAndIncrementsOnAxes();
void setScalesFromCooSysToPlotter();
void setNumberFormatsFromAxes();
drawing::Direction3D getPreferredAspectRatio();
- bool shouldKeep2DAspectRatio();
std::vector< VSeriesPlotter* >& getSeriesPlotterList() { return m_aSeriesPlotterList; }
std::vector< VCoordinateSystem* >& getCooSysList() { return m_rVCooSysList; }
std::vector< LegendEntryProvider* > getLegendEntryProviderList();
+ void AdaptScaleOfYAxisWithoutAttachedSeries( const uno::Reference< frame::XModel >& xChartModel );
+
private:
std::vector< VSeriesPlotter* > m_aSeriesPlotterList;
std::vector< VCoordinateSystem* >& m_rVCooSysList;
@@ -882,7 +883,7 @@ void SeriesPlotterContainer::updateScalesAndIncrementsOnAxes()
m_rVCooSysList[nC]->updateScalesAndIncrementsOnAxes();
}
-void SeriesPlotterContainer::doAutoScaling()
+void SeriesPlotterContainer::doAutoScaling( const uno::Reference< frame::XModel >& xChartModel )
{
//precondition: need a initialized m_aSeriesPlotterList
//precondition: need a initialized m_aAxisUsageList
@@ -947,6 +948,109 @@ void SeriesPlotterContainer::doAutoScaling()
aVCooSysList_Z[nC]->setExplicitScaleAndIncrement( 2, nAxisIndex, aExplicitScale, aExplicitIncrement );
}
}
+ AdaptScaleOfYAxisWithoutAttachedSeries( xChartModel );
+}
+
+void SeriesPlotterContainer::AdaptScaleOfYAxisWithoutAttachedSeries( const uno::Reference< frame::XModel >& xChartModel )
+{
+ //issue #i80518#
+
+ ::std::map< uno::Reference< XAxis >, AxisUsage >::iterator aAxisIter = m_aAxisUsageList.begin();
+ const ::std::map< uno::Reference< XAxis >, AxisUsage >::const_iterator aAxisEndIter = m_aAxisUsageList.end();
+
+ for( sal_Int32 nAxisIndex=0; nAxisIndex<=m_nMaxAxisIndex; nAxisIndex++ )
+ {
+ for( aAxisIter = m_aAxisUsageList.begin(); aAxisIter != aAxisEndIter; aAxisIter++ )
+ {
+ AxisUsage& rAxisUsage = (*aAxisIter).second;
+ ::std::vector< VCoordinateSystem* > aVCooSysList_Y = rAxisUsage.getCoordinateSystems( 1, nAxisIndex );
+ if( !aVCooSysList_Y.size() )
+ continue;
+
+ uno::Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xChartModel ) );
+ if( xDiagram.is() )
+ {
+ bool bSeriesAttachedToThisAxis = false;
+ sal_Int32 nAttachedAxisIndex = -1;
+ {
+ ::std::vector< Reference< XDataSeries > > aSeriesVector( DiagramHelper::getDataSeriesFromDiagram( xDiagram ) );
+ ::std::vector< Reference< XDataSeries > >::const_iterator aIter = aSeriesVector.begin();
+ for( ; aIter != aSeriesVector.end(); aIter++ )
+ {
+ sal_Int32 nCurrentIndex = DataSeriesHelper::getAttachedAxisIndex( *aIter );
+ if( nAxisIndex == nCurrentIndex )
+ {
+ bSeriesAttachedToThisAxis = true;
+ break;
+ }
+ else if( nAttachedAxisIndex<0 || nAttachedAxisIndex>nCurrentIndex )
+ nAttachedAxisIndex=nCurrentIndex;
+ }
+ }
+
+ if( !bSeriesAttachedToThisAxis && nAttachedAxisIndex >= 0 )
+ {
+ for( size_t nC = 0; nC < aVCooSysList_Y.size(); ++nC )
+ {
+ aVCooSysList_Y[nC]->prepareScaleAutomatismForDimensionAndIndex( rAxisUsage.aScaleAutomatism, 1, nAttachedAxisIndex );
+
+ ExplicitScaleData aExplicitScaleSource = aVCooSysList_Y[nC]->getExplicitScale( 1,nAttachedAxisIndex );
+ ExplicitIncrementData aExplicitIncrementSource = aVCooSysList_Y[nC]->getExplicitIncrement( 1,nAttachedAxisIndex );
+
+ ExplicitScaleData aExplicitScaleDest = aVCooSysList_Y[nC]->getExplicitScale( 1,nAxisIndex );;
+ ExplicitIncrementData aExplicitIncrementDest = aVCooSysList_Y[nC]->getExplicitIncrement( 1,nAxisIndex );;
+
+ aExplicitScaleDest.Orientation = aExplicitScaleSource.Orientation;
+ aExplicitScaleDest.Scaling = aExplicitScaleSource.Scaling;
+ aExplicitScaleDest.Breaks = aExplicitScaleSource.Breaks;
+ aExplicitScaleDest.AxisType = aExplicitScaleSource.AxisType;
+
+ aExplicitIncrementDest.BaseValue = aExplicitIncrementSource.BaseValue;
+
+ ScaleData aScale( rAxisUsage.aScaleAutomatism.getScale() );
+ if( !aScale.Minimum.hasValue() )
+ {
+ bool bNewMinOK = true;
+ double fMax=0.0;
+ if( aScale.Maximum >>= fMax )
+ bNewMinOK = (aExplicitScaleSource.Minimum <= fMax);
+ if( bNewMinOK )
+ aExplicitScaleDest.Minimum = aExplicitScaleSource.Minimum;
+ }
+ else
+ aExplicitIncrementDest.BaseValue = aExplicitScaleDest.Minimum;
+
+ if( !aScale.Maximum.hasValue() )
+ {
+ bool bNewMaxOK = true;
+ double fMin=0.0;
+ if( aScale.Minimum >>= fMin )
+ bNewMaxOK = (fMin <= aExplicitScaleSource.Maximum);
+ if( bNewMaxOK )
+ aExplicitScaleDest.Maximum = aExplicitScaleSource.Maximum;
+ }
+ if( !aScale.Origin.hasValue() )
+ aExplicitScaleDest.Origin = aExplicitScaleSource.Origin;
+
+ if( !aScale.IncrementData.Distance.hasValue() )
+ aExplicitIncrementDest.Distance = aExplicitIncrementSource.Distance;
+
+ bool bAutoMinorInterval = true;
+ if( aScale.IncrementData.SubIncrements.getLength() )
+ bAutoMinorInterval = !( aScale.IncrementData.SubIncrements[0].IntervalCount.hasValue() );
+ if( bAutoMinorInterval )
+ {
+ if( aExplicitIncrementDest.SubIncrements.getLength() && aExplicitIncrementSource.SubIncrements.getLength() )
+ aExplicitIncrementDest.SubIncrements[0].IntervalCount =
+ aExplicitIncrementSource.SubIncrements[0].IntervalCount;
+ }
+
+ aVCooSysList_Y[nC]->setExplicitScaleAndIncrement( 1, nAxisIndex, aExplicitScaleDest, aExplicitIncrementDest );
+ }
+ }
+ }
+ }
+ }
}
drawing::Direction3D SeriesPlotterContainer::getPreferredAspectRatio()
@@ -994,22 +1098,6 @@ drawing::Direction3D SeriesPlotterContainer::getPreferredAspectRatio()
return aPreferredAspectRatio;
}
-bool SeriesPlotterContainer::shouldKeep2DAspectRatio()
-{
- bool bOutKeep2DAspectRatio = false;
-
- //detect wether the aspect ratio needs to be kept
- ::std::vector< VSeriesPlotter* >::const_iterator aPlotterIter = m_aSeriesPlotterList.begin();
- const ::std::vector< VSeriesPlotter* >::const_iterator aPlotterEnd = m_aSeriesPlotterList.end();
- for( aPlotterIter = m_aSeriesPlotterList.begin()
- ; aPlotterIter != aPlotterEnd; aPlotterIter++ )
- {
- bOutKeep2DAspectRatio = bOutKeep2DAspectRatio || (*aPlotterIter)->keepAspectRatio();
- }
-
- return bOutKeep2DAspectRatio;
-}
-
//-----------------------------------------------------
namespace
@@ -1065,7 +1153,7 @@ void ChartView::impl_createDiagramAndContent( SeriesPlotterContainer& rSeriesPlo
pVCooSys->set3DWallPositions( eLeftWallPos, eBackWallPos, eBottomPos );
}
pVCooSys->createVAxisList( xNumberFormatsSupplier
- , rAvailableSize //font reference size
+ , rPageSize //font reference size
, BaseGFXHelper::B2IRectangleToAWTRectangle( aAvailableOuterRect ) //maximum space for labels
);
}
@@ -1073,7 +1161,7 @@ void ChartView::impl_createDiagramAndContent( SeriesPlotterContainer& rSeriesPlo
// - prepare list of all axis and how they are used
rSeriesPlotterContainer.initAxisUsageList();
- rSeriesPlotterContainer.doAutoScaling();
+ rSeriesPlotterContainer.doAutoScaling( m_xChartModel );
rSeriesPlotterContainer.setScalesFromCooSysToPlotter();
rSeriesPlotterContainer.setNumberFormatsFromAxes();
@@ -1084,7 +1172,6 @@ void ChartView::impl_createDiagramAndContent( SeriesPlotterContainer& rSeriesPlo
//aspect ratio
drawing::Direction3D aPreferredAspectRatio(
rSeriesPlotterContainer.getPreferredAspectRatio() );
-// bool bKeepAspectRatio = rSeriesPlotterContainer.shouldKeep2DAspectRatio();
uno::Reference< drawing::XShapes > xCoordinateRegionTarget(0);
VDiagram aVDiagram(xDiagram, aPreferredAspectRatio, nDimensionCount);
@@ -1131,7 +1218,7 @@ void ChartView::impl_createDiagramAndContent( SeriesPlotterContainer& rSeriesPlo
createTransformationSceneToScreen( aNewInnerRect ) ));
//redo autoscaling to get size and text dependent automatic main increment count
- rSeriesPlotterContainer.doAutoScaling();
+ rSeriesPlotterContainer.doAutoScaling( m_xChartModel );
rSeriesPlotterContainer.updateScalesAndIncrementsOnAxes();
rSeriesPlotterContainer.setScalesFromCooSysToPlotter();
@@ -1177,10 +1264,9 @@ void ChartView::impl_createDiagramAndContent( SeriesPlotterContainer& rSeriesPlo
{
//------------ set transformation to plotter / create series
VSeriesPlotter* pSeriesPlotter = *aPlotterIter;
- pSeriesPlotter->setPageReferenceSize( rPageSize );
rtl::OUString aCID; //III
pSeriesPlotter->initPlotter(xCoordinateRegionTarget,xTextTargetShapes,m_xShapeFactory,aCID);
- pSeriesPlotter->setDiagramReferenceSize( rAvailableSize );
+ pSeriesPlotter->setPageReferenceSize( rPageSize );
VCoordinateSystem* pVCooSys = lcl_getCooSysForPlotter( rVCooSysList, pSeriesPlotter );
if(2==nDimensionCount)
pSeriesPlotter->setTransformationSceneToScreen( pVCooSys->getTransformationSceneToScreen() );