chart2/source/view/axes/VCoordinateSystem.cxx | 40 ++-- chart2/source/view/inc/VCoordinateSystem.hxx | 9 chart2/source/view/main/ChartView.cxx | 255 +++++++++++++------------- 3 files changed, 166 insertions(+), 138 deletions(-)
New commits: commit ecf648b3a5881a5f24f5b26d51fb4823b225aed4 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Fri Oct 10 14:12:04 2014 -0400 Make the variable name shorter and sweeter... Change-Id: Ibea26f3c99b50f2011050960794d9736566ee7ce diff --git a/chart2/source/view/axes/VCoordinateSystem.cxx b/chart2/source/view/axes/VCoordinateSystem.cxx index 1f1fe68..7e88097 100644 --- a/chart2/source/view/axes/VCoordinateSystem.cxx +++ b/chart2/source/view/axes/VCoordinateSystem.cxx @@ -77,7 +77,7 @@ VCoordinateSystem::VCoordinateSystem( const Reference< XCoordinateSystem >& xCoo , m_eLeftWallPos(CuboidPlanePosition_Left) , m_eBackWallPos(CuboidPlanePosition_Back) , m_eBottomPos(CuboidPlanePosition_Bottom) - , m_aMergedMinimumAndMaximumSupplier() + , m_aMergedMinMaxSupplier() , m_aExplicitScales(3) , m_aExplicitIncrements(3) , m_apExplicitCategoriesProvider(NULL) @@ -360,13 +360,14 @@ void VCoordinateSystem::prepareAutomaticAxisScaling( ScaleAutomatism& rScaleAuto { if( rScaleAutomatism.getScale().AxisType==AxisType::DATE && nDimIndex==0 ) { + // This is a date X dimension. Determine proper time resolution. sal_Int32 nTimeResolution = ::com::sun::star::chart::TimeUnit::MONTH; if( !(rScaleAutomatism.getScale().TimeIncrement.TimeResolution >>= nTimeResolution) ) { - nTimeResolution = m_aMergedMinimumAndMaximumSupplier.calculateTimeResolutionOnXAxis(); + nTimeResolution = m_aMergedMinMaxSupplier.calculateTimeResolutionOnXAxis(); rScaleAutomatism.setAutomaticTimeResolution( nTimeResolution ); } - m_aMergedMinimumAndMaximumSupplier.setTimeResolutionOnXAxis( nTimeResolution, rScaleAutomatism.getNullDate() ); + m_aMergedMinMaxSupplier.setTimeResolutionOnXAxis( nTimeResolution, rScaleAutomatism.getNullDate() ); } double fMin = 0.0; @@ -375,31 +376,34 @@ void VCoordinateSystem::prepareAutomaticAxisScaling( ScaleAutomatism& rScaleAuto ::rtl::math::setInf(&fMax, true); if( 0 == nDimIndex ) { - fMin = m_aMergedMinimumAndMaximumSupplier.getMinimumX(); - fMax = m_aMergedMinimumAndMaximumSupplier.getMaximumX(); + // x dimension + fMin = m_aMergedMinMaxSupplier.getMinimumX(); + fMax = m_aMergedMinMaxSupplier.getMaximumX(); } else if( 1 == nDimIndex ) { + // y dimension ExplicitScaleData aScale = getExplicitScale( 0, 0 ); - fMin = m_aMergedMinimumAndMaximumSupplier.getMinimumYInRange(aScale.Minimum,aScale.Maximum, nAxisIndex); - fMax = m_aMergedMinimumAndMaximumSupplier.getMaximumYInRange(aScale.Minimum,aScale.Maximum, nAxisIndex); + fMin = m_aMergedMinMaxSupplier.getMinimumYInRange(aScale.Minimum,aScale.Maximum, nAxisIndex); + fMax = m_aMergedMinMaxSupplier.getMaximumYInRange(aScale.Minimum,aScale.Maximum, nAxisIndex); } else if( 2 == nDimIndex ) { - fMin = m_aMergedMinimumAndMaximumSupplier.getMinimumZ(); - fMax = m_aMergedMinimumAndMaximumSupplier.getMaximumZ(); + // z dimension + fMin = m_aMergedMinMaxSupplier.getMinimumZ(); + fMax = m_aMergedMinMaxSupplier.getMaximumZ(); } //merge our values with those already contained in rScaleAutomatism rScaleAutomatism.expandValueRange( fMin, fMax ); rScaleAutomatism.setAutoScalingOptions( - m_aMergedMinimumAndMaximumSupplier.isExpandBorderToIncrementRhythm( nDimIndex ), - m_aMergedMinimumAndMaximumSupplier.isExpandIfValuesCloseToBorder( nDimIndex ), - m_aMergedMinimumAndMaximumSupplier.isExpandWideValuesToZero( nDimIndex ), - m_aMergedMinimumAndMaximumSupplier.isExpandNarrowValuesTowardZero( nDimIndex ) ); + m_aMergedMinMaxSupplier.isExpandBorderToIncrementRhythm( nDimIndex ), + m_aMergedMinMaxSupplier.isExpandIfValuesCloseToBorder( nDimIndex ), + m_aMergedMinMaxSupplier.isExpandWideValuesToZero( nDimIndex ), + m_aMergedMinMaxSupplier.isExpandNarrowValuesTowardZero( nDimIndex ) ); - VAxisBase* pVAxis( this->getVAxis( nDimIndex, nAxisIndex ) ); + VAxisBase* pVAxis = getVAxis(nDimIndex, nAxisIndex); if( pVAxis ) rScaleAutomatism.setMaximumAutoMainIncrementCount( pVAxis->estimateMaximumAutoMainIncrementCount() ); } @@ -530,17 +534,17 @@ void VCoordinateSystem::createGridShapes() } void VCoordinateSystem::addMinimumAndMaximumSupplier( MinimumAndMaximumSupplier* pMinimumAndMaximumSupplier ) { - m_aMergedMinimumAndMaximumSupplier.addMinimumAndMaximumSupplier(pMinimumAndMaximumSupplier); + m_aMergedMinMaxSupplier.addMinimumAndMaximumSupplier(pMinimumAndMaximumSupplier); } bool VCoordinateSystem::hasMinimumAndMaximumSupplier( MinimumAndMaximumSupplier* pMinimumAndMaximumSupplier ) { - return m_aMergedMinimumAndMaximumSupplier.hasMinimumAndMaximumSupplier(pMinimumAndMaximumSupplier); + return m_aMergedMinMaxSupplier.hasMinimumAndMaximumSupplier(pMinimumAndMaximumSupplier); } void VCoordinateSystem::clearMinimumAndMaximumSupplierList() { - m_aMergedMinimumAndMaximumSupplier.clearMinimumAndMaximumSupplierList(); + m_aMergedMinMaxSupplier.clearMinimumAndMaximumSupplierList(); } bool VCoordinateSystem::getPropertySwapXAndYAxis() const diff --git a/chart2/source/view/inc/VCoordinateSystem.hxx b/chart2/source/view/inc/VCoordinateSystem.hxx index 7439535..cde8c1b 100644 --- a/chart2/source/view/inc/VCoordinateSystem.hxx +++ b/chart2/source/view/inc/VCoordinateSystem.hxx @@ -172,7 +172,12 @@ protected: //member CuboidPlanePosition m_eBackWallPos; CuboidPlanePosition m_eBottomPos; - MergedMinimumAndMaximumSupplier m_aMergedMinimumAndMaximumSupplier; //this is used only for autoscaling purpose + /** + * Collection of min-max suppliers which are basically different chart + * types present in the same coordinate system. This is used only for + * auto-scaling purposes. + */ + MergedMinimumAndMaximumSupplier m_aMergedMinMaxSupplier; ::com::sun::star::uno::Sequence< OUString > m_aSeriesNamesForZAxis; commit acfabbf06d37b5bcd18dc27fcbf75a3943f498f8 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Fri Oct 10 11:40:55 2014 -0400 prepareScaleAutomatismForDimensionAndIndex -> prepareAutomaticAxisScaling. Change-Id: Ic66d2fcf78603bdd4fa1e08933900f49c66384b7 diff --git a/chart2/source/view/axes/VCoordinateSystem.cxx b/chart2/source/view/axes/VCoordinateSystem.cxx index 457ff82..1f1fe68 100644 --- a/chart2/source/view/axes/VCoordinateSystem.cxx +++ b/chart2/source/view/axes/VCoordinateSystem.cxx @@ -356,7 +356,7 @@ void VCoordinateSystem::updateScalesAndIncrementsOnAxes() { } -void VCoordinateSystem::prepareScaleAutomatismForDimensionAndIndex( ScaleAutomatism& rScaleAutomatism, sal_Int32 nDimIndex, sal_Int32 nAxisIndex ) +void VCoordinateSystem::prepareAutomaticAxisScaling( ScaleAutomatism& rScaleAutomatism, sal_Int32 nDimIndex, sal_Int32 nAxisIndex ) { if( rScaleAutomatism.getScale().AxisType==AxisType::DATE && nDimIndex==0 ) { diff --git a/chart2/source/view/inc/VCoordinateSystem.hxx b/chart2/source/view/inc/VCoordinateSystem.hxx index 54df0b3..7439535 100644 --- a/chart2/source/view/inc/VCoordinateSystem.hxx +++ b/chart2/source/view/inc/VCoordinateSystem.hxx @@ -86,7 +86,7 @@ public: bool hasMinimumAndMaximumSupplier( MinimumAndMaximumSupplier* pMinimumAndMaximumSupplier ); void clearMinimumAndMaximumSupplierList(); - void prepareScaleAutomatismForDimensionAndIndex( ScaleAutomatism& rScaleAutomatism, sal_Int32 nDimIndex, sal_Int32 nAxisIndex ); + void prepareAutomaticAxisScaling( ScaleAutomatism& rScaleAutomatism, sal_Int32 nDimIndex, sal_Int32 nAxisIndex ); void setExplicitScaleAndIncrement( sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex , const ExplicitScaleData& rExplicitScale diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx index f3f14a4..1ecbe06 100644 --- a/chart2/source/view/main/ChartView.cxx +++ b/chart2/source/view/main/ChartView.cxx @@ -227,7 +227,7 @@ void AxisUsage::prepareAutomaticAxisScaling( ScaleAutomatism& rScaleAutomatism, { std::vector<VCoordinateSystem*> aVCooSysList = getCoordinateSystems(nDimIndex, nAxisIndex); for (size_t i = 0, n = aVCooSysList.size(); i < n; ++i) - aVCooSysList[i]->prepareScaleAutomatismForDimensionAndIndex(rScaleAutomatism, nDimIndex, nAxisIndex); + aVCooSysList[i]->prepareAutomaticAxisScaling(rScaleAutomatism, nDimIndex, nAxisIndex); } void AxisUsage::setExplicitScaleAndIncrement( @@ -793,7 +793,7 @@ void SeriesPlotterContainer::AdaptScaleOfYAxisWithoutAttachedSeries( ChartModel& { for( size_t nC = 0; nC < aVCooSysList_Y.size(); ++nC ) { - aVCooSysList_Y[nC]->prepareScaleAutomatismForDimensionAndIndex( rAxisUsage.aAutoScaling, 1, nAttachedAxisIndex ); + aVCooSysList_Y[nC]->prepareAutomaticAxisScaling( rAxisUsage.aAutoScaling, 1, nAttachedAxisIndex ); ExplicitScaleData aExplicitScaleSource = aVCooSysList_Y[nC]->getExplicitScale( 1,nAttachedAxisIndex ); ExplicitIncrementData aExplicitIncrementSource = aVCooSysList_Y[nC]->getExplicitIncrement( 1,nAttachedAxisIndex ); commit 2ba6c00d37606595244ea2e67ddc14e129805b48 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Fri Oct 10 11:15:17 2014 -0400 Hide the 3rd nested looping for clarity. Also aScaleAutomatism -> aAutoScaling. The word 'automatism' is a bit awkward. Change-Id: I9856f904d5693e79e19176ba5fff881267d5c7e7 diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx index 9764494..f3f14a4 100644 --- a/chart2/source/view/main/ChartView.cxx +++ b/chart2/source/view/main/ChartView.cxx @@ -141,7 +141,10 @@ struct AxisUsage ::std::vector< VCoordinateSystem* > getCoordinateSystems( sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex ); sal_Int32 getMaxAxisIndexForDimension( sal_Int32 nDimensionIndex ); - ScaleAutomatism aScaleAutomatism; + void prepareAutomaticAxisScaling( ScaleAutomatism& rScaleAutomatism, sal_Int32 nDimIndex, sal_Int32 nAxisIndex ); + void setExplicitScaleAndIncrement( sal_Int32 nDimIndex, sal_Int32 nAxisIndex, const ExplicitScaleData& rScale, const ExplicitIncrementData& rInc ); + + ScaleAutomatism aAutoScaling; private: tCoordinateSystemMap aCoordinateSystems; @@ -149,7 +152,7 @@ private: }; AxisUsage::AxisUsage() - : aScaleAutomatism(AxisHelper::createDefaultScale(),Date( Date::SYSTEM )) + : aAutoScaling(AxisHelper::createDefaultScale(), Date(Date::SYSTEM)) { } @@ -220,6 +223,21 @@ sal_Int32 AxisUsage::getMaxAxisIndexForDimension( sal_Int32 nDimensionIndex ) return nRet; } +void AxisUsage::prepareAutomaticAxisScaling( ScaleAutomatism& rScaleAutomatism, sal_Int32 nDimIndex, sal_Int32 nAxisIndex ) +{ + std::vector<VCoordinateSystem*> aVCooSysList = getCoordinateSystems(nDimIndex, nAxisIndex); + for (size_t i = 0, n = aVCooSysList.size(); i < n; ++i) + aVCooSysList[i]->prepareScaleAutomatismForDimensionAndIndex(rScaleAutomatism, nDimIndex, nAxisIndex); +} + +void AxisUsage::setExplicitScaleAndIncrement( + sal_Int32 nDimIndex, sal_Int32 nAxisIndex, const ExplicitScaleData& rScale, const ExplicitIncrementData& rInc ) +{ + std::vector<VCoordinateSystem*> aVCooSysList = getCoordinateSystems(nDimIndex, nAxisIndex); + for (size_t i = 0, n = aVCooSysList.size(); i < n; ++i) + aVCooSysList[i]->setExplicitScaleAndIncrement(nDimIndex, nAxisIndex, rScale, rInc); +} + typedef boost::ptr_vector<VSeriesPlotter> SeriesPlottersType; class SeriesPlotterContainer @@ -584,7 +602,7 @@ void SeriesPlotterContainer::initAxisUsageList(const Date& rNullDate) bool bHasComplexCat = pCatProvider && pCatProvider->hasComplexCategories(); aSourceScale.ShiftedCategoryPosition = isCategoryPositionShifted(aSourceScale, bHasComplexCat); - m_aAxisUsageList[xAxis].aScaleAutomatism = ScaleAutomatism(aSourceScale, rNullDate); + m_aAxisUsageList[xAxis].aAutoScaling = ScaleAutomatism(aSourceScale, rNullDate); } AxisUsage& rAxisUsage = m_aAxisUsageList[xAxis]; @@ -697,57 +715,38 @@ void SeriesPlotterContainer::doAutoScaling( ChartModel& rChartModel ) const ::std::map< uno::Reference< XAxis >, AxisUsage >::const_iterator aAxisEndIter = m_aAxisUsageList.end(); //iterate over the main scales first than secondary axis - size_t nC; - sal_Int32 nAxisIndex=0; - for( nAxisIndex=0; nAxisIndex<=m_nMaxAxisIndex; nAxisIndex++ ) + for (sal_Int32 nAxisIndex = 0; nAxisIndex <= m_nMaxAxisIndex; ++nAxisIndex) { - // - first do autoscale for all x and z scales (because they are treated independent) for( aAxisIter = m_aAxisUsageList.begin(); aAxisIter != aAxisEndIter; ++aAxisIter ) { AxisUsage& rAxisUsage = (*aAxisIter).second; - ::std::vector< VCoordinateSystem* > aVCooSysList_X = rAxisUsage.getCoordinateSystems(0,nAxisIndex); - ::std::vector< VCoordinateSystem* > aVCooSysList_Z = rAxisUsage.getCoordinateSystems(2,nAxisIndex); - for( nC=0; nC < aVCooSysList_X.size(); nC++) - aVCooSysList_X[nC]->prepareScaleAutomatismForDimensionAndIndex(rAxisUsage.aScaleAutomatism,0,nAxisIndex); - for( nC=0; nC < aVCooSysList_Z.size(); nC++) - aVCooSysList_Z[nC]->prepareScaleAutomatismForDimensionAndIndex(rAxisUsage.aScaleAutomatism,2,nAxisIndex); + rAxisUsage.prepareAutomaticAxisScaling(rAxisUsage.aAutoScaling, 0, nAxisIndex); + rAxisUsage.prepareAutomaticAxisScaling(rAxisUsage.aAutoScaling, 2, nAxisIndex); ExplicitScaleData aExplicitScale; ExplicitIncrementData aExplicitIncrement; - rAxisUsage.aScaleAutomatism.calculateExplicitScaleAndIncrement( aExplicitScale, aExplicitIncrement ); + rAxisUsage.aAutoScaling.calculateExplicitScaleAndIncrement( aExplicitScale, aExplicitIncrement ); - for( nC=0; nC < aVCooSysList_X.size(); nC++) - aVCooSysList_X[nC]->setExplicitScaleAndIncrement( 0, nAxisIndex, aExplicitScale, aExplicitIncrement ); - for( nC=0; nC < aVCooSysList_Z.size(); nC++) - aVCooSysList_Z[nC]->setExplicitScaleAndIncrement( 2, nAxisIndex, aExplicitScale, aExplicitIncrement ); + rAxisUsage.setExplicitScaleAndIncrement(0, nAxisIndex, aExplicitScale, aExplicitIncrement); + rAxisUsage.setExplicitScaleAndIncrement(2, nAxisIndex, aExplicitScale, aExplicitIncrement); } // - second do autoscale for the dependent y scales (the coordinate systems are prepared with x and z scales already ) for( aAxisIter = m_aAxisUsageList.begin(); aAxisIter != aAxisEndIter; ++aAxisIter ) { AxisUsage& rAxisUsage = (*aAxisIter).second; - ::std::vector< VCoordinateSystem* > aVCooSysList_X = rAxisUsage.getCoordinateSystems(0,nAxisIndex); - ::std::vector< VCoordinateSystem* > aVCooSysList_Y = rAxisUsage.getCoordinateSystems(1,nAxisIndex); - ::std::vector< VCoordinateSystem* > aVCooSysList_Z = rAxisUsage.getCoordinateSystems(2,nAxisIndex); - if(!aVCooSysList_Y.size()) - continue; - - for( nC=0; nC < aVCooSysList_Y.size(); nC++) - aVCooSysList_Y[nC]->prepareScaleAutomatismForDimensionAndIndex(rAxisUsage.aScaleAutomatism,1,nAxisIndex); + rAxisUsage.prepareAutomaticAxisScaling(rAxisUsage.aAutoScaling, 1, nAxisIndex); ExplicitScaleData aExplicitScale; ExplicitIncrementData aExplicitIncrement; - rAxisUsage.aScaleAutomatism.calculateExplicitScaleAndIncrement( aExplicitScale, aExplicitIncrement ); - - for( nC=0; nC < aVCooSysList_X.size(); nC++) - aVCooSysList_X[nC]->setExplicitScaleAndIncrement( 0, nAxisIndex, aExplicitScale, aExplicitIncrement ); - for( nC=0; nC < aVCooSysList_Y.size(); nC++) - aVCooSysList_Y[nC]->setExplicitScaleAndIncrement( 1, nAxisIndex, aExplicitScale, aExplicitIncrement ); - for( nC=0; nC < aVCooSysList_Z.size(); nC++) - aVCooSysList_Z[nC]->setExplicitScaleAndIncrement( 2, nAxisIndex, aExplicitScale, aExplicitIncrement ); + rAxisUsage.aAutoScaling.calculateExplicitScaleAndIncrement( aExplicitScale, aExplicitIncrement ); + + rAxisUsage.setExplicitScaleAndIncrement(0, nAxisIndex, aExplicitScale, aExplicitIncrement); + rAxisUsage.setExplicitScaleAndIncrement(1, nAxisIndex, aExplicitScale, aExplicitIncrement); + rAxisUsage.setExplicitScaleAndIncrement(2, nAxisIndex, aExplicitScale, aExplicitIncrement); } } AdaptScaleOfYAxisWithoutAttachedSeries( rChartModel ); @@ -794,7 +793,7 @@ void SeriesPlotterContainer::AdaptScaleOfYAxisWithoutAttachedSeries( ChartModel& { for( size_t nC = 0; nC < aVCooSysList_Y.size(); ++nC ) { - aVCooSysList_Y[nC]->prepareScaleAutomatismForDimensionAndIndex( rAxisUsage.aScaleAutomatism, 1, nAttachedAxisIndex ); + aVCooSysList_Y[nC]->prepareScaleAutomatismForDimensionAndIndex( rAxisUsage.aAutoScaling, 1, nAttachedAxisIndex ); ExplicitScaleData aExplicitScaleSource = aVCooSysList_Y[nC]->getExplicitScale( 1,nAttachedAxisIndex ); ExplicitIncrementData aExplicitIncrementSource = aVCooSysList_Y[nC]->getExplicitIncrement( 1,nAttachedAxisIndex ); @@ -808,7 +807,7 @@ void SeriesPlotterContainer::AdaptScaleOfYAxisWithoutAttachedSeries( ChartModel& aExplicitIncrementDest.BaseValue = aExplicitIncrementSource.BaseValue; - ScaleData aScale( rAxisUsage.aScaleAutomatism.getScale() ); + ScaleData aScale( rAxisUsage.aAutoScaling.getScale() ); if( !aScale.Minimum.hasValue() ) { bool bNewMinOK = true; commit 5ce6a22a3bd048267af6b301ae54248a11a38def Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Fri Oct 10 09:53:26 2014 -0400 Make this loop a bit easier to follow... Change-Id: Ib978f47925e1f7d77e02586bff50d24fa5b27f2c diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx index e693deeb..9764494 100644 --- a/chart2/source/view/main/ChartView.cxx +++ b/chart2/source/view/main/ChartView.cxx @@ -242,6 +242,9 @@ public: void AdaptScaleOfYAxisWithoutAttachedSeries( ChartModel& rModel ); + bool isCategoryPositionShifted( + const chart2::ScaleData& rSourceScale, bool bHasComplexCategories ) const; + private: SeriesPlottersType m_aSeriesPlotterList; std::vector< VCoordinateSystem* >& m_rVCooSysList; @@ -525,61 +528,89 @@ void SeriesPlotterContainer::initializeCooSysAndSeriesPlotter( } } +bool SeriesPlotterContainer::isCategoryPositionShifted( + const chart2::ScaleData& rSourceScale, bool bHasComplexCategories ) const +{ + if (rSourceScale.AxisType == AxisType::CATEGORY && m_bChartTypeUsesShiftedCategoryPositionPerDefault) + return true; + + if (rSourceScale.AxisType==AxisType::CATEGORY && bHasComplexCategories) + return true; + + if (rSourceScale.AxisType == AxisType::DATE) + return true; + + if (rSourceScale.AxisType == AxisType::SERIES) + return true; + + return false; +} + void SeriesPlotterContainer::initAxisUsageList(const Date& rNullDate) { m_aAxisUsageList.clear(); - size_t nC; - for( nC=0; nC < m_rVCooSysList.size(); nC++) + + // Loop through coordinate systems in the diagram (though for now + // there should only be one coordinate system per diagram). + for (size_t i = 0, n = m_rVCooSysList.size(); i < n; ++i) { - VCoordinateSystem* pVCooSys = m_rVCooSysList[nC]; - for(sal_Int32 nDimensionIndex=0; nDimensionIndex<3; nDimensionIndex++) + VCoordinateSystem* pVCooSys = m_rVCooSysList[i]; + uno::Reference<XCoordinateSystem> xCooSys = pVCooSys->getModel(); + sal_Int32 nDimCount = xCooSys->getDimension(); + + for (sal_Int32 nDimIndex = 0; nDimIndex < nDimCount; ++nDimIndex) { - uno::Reference< XCoordinateSystem > xCooSys = pVCooSys->getModel(); - sal_Int32 nDimensionCount = xCooSys->getDimension(); - if( nDimensionIndex >= nDimensionCount ) - continue; - bool bChartTypeAllowsDateAxis = ChartTypeHelper::isSupportingDateAxis( AxisHelper::getChartTypeByIndex( xCooSys, 0 ), nDimensionCount, nDimensionIndex ); - const sal_Int32 nMaximumAxisIndex = xCooSys->getMaximumAxisIndexByDimension(nDimensionIndex); - for(sal_Int32 nAxisIndex=0; nAxisIndex<=nMaximumAxisIndex; ++nAxisIndex) + bool bDateAxisAllowed = ChartTypeHelper::isSupportingDateAxis( + AxisHelper::getChartTypeByIndex(xCooSys, 0), nDimCount, nDimIndex); + + // Each dimension may have primary and secondary axes. + const sal_Int32 nMaxAxisIndex = xCooSys->getMaximumAxisIndexByDimension(nDimIndex); + for (sal_Int32 nAxisIndex = 0; nAxisIndex <= nMaxAxisIndex; ++nAxisIndex) { - uno::Reference< XAxis > xAxis( xCooSys->getAxisByDimension( nDimensionIndex, nAxisIndex ) ); - OSL_ASSERT( xAxis.is()); - if( xAxis.is()) + uno::Reference<XAxis> xAxis = xCooSys->getAxisByDimension(nDimIndex, nAxisIndex); + + if (!xAxis.is()) + continue; + + if (m_aAxisUsageList.find(xAxis) == m_aAxisUsageList.end()) { - if(m_aAxisUsageList.find(xAxis)==m_aAxisUsageList.end()) - { - chart2::ScaleData aSourceScale = xAxis->getScaleData(); - ExplicitCategoriesProvider* pExplicitCategoriesProvider = pVCooSys->getExplicitCategoriesProvider(); - if( nDimensionIndex==0 ) - AxisHelper::checkDateAxis( aSourceScale, pExplicitCategoriesProvider, bChartTypeAllowsDateAxis ); - if( (aSourceScale.AxisType == AxisType::CATEGORY && m_bChartTypeUsesShiftedCategoryPositionPerDefault) - || (aSourceScale.AxisType==AxisType::CATEGORY && pExplicitCategoriesProvider && pExplicitCategoriesProvider->hasComplexCategories() ) - || aSourceScale.AxisType == AxisType::DATE - || aSourceScale.AxisType == AxisType::SERIES ) - aSourceScale.ShiftedCategoryPosition = true; - else - aSourceScale.ShiftedCategoryPosition = false; - m_aAxisUsageList[xAxis].aScaleAutomatism = ScaleAutomatism(aSourceScale,rNullDate); - } - AxisUsage& rAxisUsage = m_aAxisUsageList[xAxis]; - rAxisUsage.addCoordinateSystem(pVCooSys,nDimensionIndex,nAxisIndex); + // Create axis usage object for this axis. + + chart2::ScaleData aSourceScale = xAxis->getScaleData(); + ExplicitCategoriesProvider* pCatProvider = pVCooSys->getExplicitCategoriesProvider(); + if (nDimIndex == 0) + AxisHelper::checkDateAxis( aSourceScale, pCatProvider, bDateAxisAllowed ); + + bool bHasComplexCat = pCatProvider && pCatProvider->hasComplexCategories(); + aSourceScale.ShiftedCategoryPosition = isCategoryPositionShifted(aSourceScale, bHasComplexCat); + + m_aAxisUsageList[xAxis].aScaleAutomatism = ScaleAutomatism(aSourceScale, rNullDate); } + + AxisUsage& rAxisUsage = m_aAxisUsageList[xAxis]; + rAxisUsage.addCoordinateSystem(pVCooSys, nDimIndex, nAxisIndex); } } } + // Determine the highest axis index of all dimensions. ::std::map< uno::Reference< XAxis >, AxisUsage >::iterator aAxisIter = m_aAxisUsageList.begin(); const ::std::map< uno::Reference< XAxis >, AxisUsage >::const_iterator aAxisEndIter = m_aAxisUsageList.end(); - - //init m_nMaxAxisIndex m_nMaxAxisIndex = 0; - for(sal_Int32 nDimensionIndex=0; nDimensionIndex<3; nDimensionIndex++) + for (size_t i = 0, n = m_rVCooSysList.size(); i < n; ++i) { - for( aAxisIter = m_aAxisUsageList.begin(); aAxisIter != aAxisEndIter; ++aAxisIter ) + VCoordinateSystem* pVCooSys = m_rVCooSysList[i]; + uno::Reference<XCoordinateSystem> xCooSys = pVCooSys->getModel(); + sal_Int32 nDimCount = xCooSys->getDimension(); + + for (sal_Int32 nDimIndex = 0; nDimIndex < nDimCount; ++nDimIndex) { - sal_Int32 nLocalMax = aAxisIter->second.getMaxAxisIndexForDimension( nDimensionIndex ); - if( m_nMaxAxisIndex < nLocalMax ) - m_nMaxAxisIndex = nLocalMax; + for (aAxisIter = m_aAxisUsageList.begin(); aAxisIter != aAxisEndIter; ++aAxisIter) + { + sal_Int32 nLocalMax = aAxisIter->second.getMaxAxisIndexForDimension(nDimIndex); + if (m_nMaxAxisIndex < nLocalMax) + m_nMaxAxisIndex = nLocalMax; + } } } } commit 424fb26da3603a5ec702b96fc0dcc2458706e84d Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Fri Oct 10 09:33:33 2014 -0400 Make this a hard prerequisite. Change-Id: Ib1c859b6033b2cf148e1ed74a437dda85872dffe diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx index 01d3cf8..e693deeb 100644 --- a/chart2/source/view/main/ChartView.cxx +++ b/chart2/source/view/main/ChartView.cxx @@ -658,8 +658,9 @@ void SeriesPlotterContainer::updateScalesAndIncrementsOnAxes() void SeriesPlotterContainer::doAutoScaling( ChartModel& rChartModel ) { - //precondition: need a initialized m_aSeriesPlotterList - //precondition: need a initialized m_aAxisUsageList + if (m_aSeriesPlotterList.empty() || m_aAxisUsageList.empty()) + // We need these two containers populated to do auto-scaling. Bail out. + return; ::std::map< uno::Reference< XAxis >, AxisUsage >::iterator aAxisIter = m_aAxisUsageList.begin(); const ::std::map< uno::Reference< XAxis >, AxisUsage >::const_iterator aAxisEndIter = m_aAxisUsageList.end(); commit eb2c2f1a3c1a6c829d75418ec1578d15f7895485 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Fri Oct 10 09:30:04 2014 -0400 Use boost::ptr_vector for this... which also exposed few cases of mis-used const-ness here and there... Change-Id: Ie4374459643fc050ded646762d72ad622cf3f843 diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx index 9d3b54c..01d3cf8 100644 --- a/chart2/source/view/main/ChartView.cxx +++ b/chart2/source/view/main/ChartView.cxx @@ -115,6 +115,7 @@ #include <osl/time.h> #include <boost/shared_ptr.hpp> +#include <boost/ptr_container/ptr_vector.hpp> namespace chart { @@ -219,6 +220,8 @@ sal_Int32 AxisUsage::getMaxAxisIndexForDimension( sal_Int32 nDimensionIndex ) return nRet; } +typedef boost::ptr_vector<VSeriesPlotter> SeriesPlottersType; + class SeriesPlotterContainer { public: @@ -233,14 +236,14 @@ public: void setNumberFormatsFromAxes(); drawing::Direction3D getPreferredAspectRatio(); - std::vector< VSeriesPlotter* >& getSeriesPlotterList() { return m_aSeriesPlotterList; } + SeriesPlottersType& getSeriesPlotterList() { return m_aSeriesPlotterList; } std::vector< VCoordinateSystem* >& getCooSysList() { return m_rVCooSysList; } std::vector< LegendEntryProvider* > getLegendEntryProviderList(); void AdaptScaleOfYAxisWithoutAttachedSeries( ChartModel& rModel ); private: - std::vector< VSeriesPlotter* > m_aSeriesPlotterList; + SeriesPlottersType m_aSeriesPlotterList; std::vector< VCoordinateSystem* >& m_rVCooSysList; ::std::map< uno::Reference< XAxis >, AxisUsage > m_aAxisUsageList; sal_Int32 m_nMaxAxisIndex; @@ -261,22 +264,16 @@ SeriesPlotterContainer::~SeriesPlotterContainer() // - remove plotter from coordinatesystems for( size_t nC=0; nC < m_rVCooSysList.size(); nC++) m_rVCooSysList[nC]->clearMinimumAndMaximumSupplierList(); - // - delete all plotter - ::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 ) - delete *aPlotterIter; - m_aSeriesPlotterList.clear(); } std::vector< LegendEntryProvider* > SeriesPlotterContainer::getLegendEntryProviderList() { std::vector< LegendEntryProvider* > aRet( m_aSeriesPlotterList.size() ); - ::std::vector< VSeriesPlotter* >::const_iterator aPlotterIter = m_aSeriesPlotterList.begin(); - const ::std::vector< VSeriesPlotter* >::const_iterator aPlotterEnd = m_aSeriesPlotterList.end(); + SeriesPlottersType::iterator aPlotterIter = m_aSeriesPlotterList.begin(); + const SeriesPlottersType::iterator aPlotterEnd = m_aSeriesPlotterList.end(); sal_Int32 nN = 0; for( aPlotterIter = m_aSeriesPlotterList.begin(); aPlotterIter != aPlotterEnd; ++aPlotterIter, nN++ ) - aRet[nN] = *aPlotterIter; + aRet[nN] = &(*aPlotterIter); return aRet; } @@ -517,7 +514,7 @@ void SeriesPlotterContainer::initializeCooSysAndSeriesPlotter( { if(!bSeriesNamesInitialized) { - VSeriesPlotter* pSeriesPlotter = m_aSeriesPlotterList[0]; + VSeriesPlotter* pSeriesPlotter = &m_aSeriesPlotterList[0]; if( pSeriesPlotter ) aSeriesNames = pSeriesPlotter->getSeriesNames(); bSeriesNamesInitialized = true; @@ -590,11 +587,11 @@ void SeriesPlotterContainer::initAxisUsageList(const Date& rNullDate) void SeriesPlotterContainer::setScalesFromCooSysToPlotter() { //set scales to plotter to enable them to provide the preferred scene AspectRatio - ::std::vector< VSeriesPlotter* >::const_iterator aPlotterIter = m_aSeriesPlotterList.begin(); - const ::std::vector< VSeriesPlotter* >::const_iterator aPlotterEnd = m_aSeriesPlotterList.end(); + SeriesPlottersType::iterator aPlotterIter = m_aSeriesPlotterList.begin(); + const SeriesPlottersType::iterator aPlotterEnd = m_aSeriesPlotterList.end(); for( aPlotterIter = m_aSeriesPlotterList.begin(); aPlotterIter != aPlotterEnd; ++aPlotterIter ) { - VSeriesPlotter* pSeriesPlotter = *aPlotterIter; + VSeriesPlotter* pSeriesPlotter = &(*aPlotterIter); VCoordinateSystem* pVCooSys = lcl_getCooSysForPlotter( m_rVCooSysList, pSeriesPlotter ); if(pVCooSys) { @@ -609,11 +606,11 @@ void SeriesPlotterContainer::setScalesFromCooSysToPlotter() void SeriesPlotterContainer::setNumberFormatsFromAxes() { //set numberformats to plotter to enable them to display the data labels in the numberformat of the axis - ::std::vector< VSeriesPlotter* >::const_iterator aPlotterIter = m_aSeriesPlotterList.begin(); - const ::std::vector< VSeriesPlotter* >::const_iterator aPlotterEnd = m_aSeriesPlotterList.end(); + SeriesPlottersType::iterator aPlotterIter = m_aSeriesPlotterList.begin(); + const SeriesPlottersType::iterator aPlotterEnd = m_aSeriesPlotterList.end(); for( aPlotterIter = m_aSeriesPlotterList.begin(); aPlotterIter != aPlotterEnd; ++aPlotterIter ) { - VSeriesPlotter* pSeriesPlotter = *aPlotterIter; + VSeriesPlotter* pSeriesPlotter = &(*aPlotterIter); VCoordinateSystem* pVCooSys = lcl_getCooSysForPlotter( m_rVCooSysList, pSeriesPlotter ); if(pVCooSys) { @@ -876,12 +873,12 @@ drawing::Direction3D SeriesPlotterContainer::getPreferredAspectRatio() //first with special demands wins (less or equal zero <-> arbitrary) double fx, fy, fz; fx = fy = fz = -1.0; - ::std::vector< VSeriesPlotter* >::const_iterator aPlotterIter = m_aSeriesPlotterList.begin(); - const ::std::vector< VSeriesPlotter* >::const_iterator aPlotterEnd = m_aSeriesPlotterList.end(); + SeriesPlottersType::const_iterator aPlotterIter = m_aSeriesPlotterList.begin(); + const SeriesPlottersType::const_iterator aPlotterEnd = m_aSeriesPlotterList.end(); for( aPlotterIter = m_aSeriesPlotterList.begin(), nPlotterCount=0 ; aPlotterIter != aPlotterEnd; ++aPlotterIter, ++nPlotterCount ) { - drawing::Direction3D aSingleRatio( (*aPlotterIter)->getPreferredDiagramAspectRatio() ); + drawing::Direction3D aSingleRatio( aPlotterIter->getPreferredDiagramAspectRatio() ); if( fx<0 && aSingleRatio.DirectionX>0 ) fx = aSingleRatio.DirectionX; @@ -1455,7 +1452,7 @@ awt::Rectangle ChartView::impl_createDiagramAndContent( const CreateShapeParam2D basegfx::B2IRectangle aAvailableOuterRect = BaseGFXHelper::makeRectangle(rParam.maRemainingSpace); const std::vector< VCoordinateSystem* >& rVCooSysList( rParam.mpSeriesPlotterContainer->getCooSysList() ); - const std::vector< VSeriesPlotter* >& rSeriesPlotterList( rParam.mpSeriesPlotterContainer->getSeriesPlotterList() ); + SeriesPlottersType& rSeriesPlotterList = rParam.mpSeriesPlotterContainer->getSeriesPlotterList(); //create VAxis, so they can give necessary information for automatic scaling uno::Reference< util::XNumberFormatsSupplier > xNumberFormatsSupplier( static_cast< ::cppu::OWeakObject* >( &mrChartModel ), uno::UNO_QUERY ); @@ -1581,11 +1578,11 @@ awt::Rectangle ChartView::impl_createDiagramAndContent( const CreateShapeParam2D // - create data series for all charttypes m_bPointsWereSkipped = false; - ::std::vector< VSeriesPlotter* >::const_iterator aPlotterIter = rSeriesPlotterList.begin(); - const ::std::vector< VSeriesPlotter* >::const_iterator aPlotterEnd = rSeriesPlotterList.end(); + SeriesPlottersType::iterator aPlotterIter = rSeriesPlotterList.begin(); + const SeriesPlottersType::iterator aPlotterEnd = rSeriesPlotterList.end(); for( aPlotterIter = rSeriesPlotterList.begin(); aPlotterIter != aPlotterEnd; ++aPlotterIter ) { - VSeriesPlotter* pSeriesPlotter = *aPlotterIter; + VSeriesPlotter* pSeriesPlotter = &(*aPlotterIter); OUString aCID; //III uno::Reference< drawing::XShapes > xSeriesTarget(0); if( pSeriesPlotter->WantToPlotInFrontOfAxisLine() ) @@ -1624,7 +1621,7 @@ awt::Rectangle ChartView::impl_createDiagramAndContent( const CreateShapeParam2D for( aPlotterIter = rSeriesPlotterList.begin(); aPlotterIter != aPlotterEnd; ++aPlotterIter ) { - VSeriesPlotter* pSeriesPlotter = *aPlotterIter; + VSeriesPlotter* pSeriesPlotter = &(*aPlotterIter); pSeriesPlotter->releaseShapes(); } @@ -1644,7 +1641,7 @@ awt::Rectangle ChartView::impl_createDiagramAndContent( const CreateShapeParam2D // - create data series for all charttypes for( aPlotterIter = rSeriesPlotterList.begin(); aPlotterIter != aPlotterEnd; ++aPlotterIter ) { - VSeriesPlotter* pSeriesPlotter = *aPlotterIter; + VSeriesPlotter* pSeriesPlotter = &(*aPlotterIter); VCoordinateSystem* pVCooSys = lcl_getCooSysForPlotter( rVCooSysList, pSeriesPlotter ); if(2==nDimensionCount) pSeriesPlotter->setTransformationSceneToScreen( pVCooSys->getTransformationSceneToScreen() ); @@ -1653,10 +1650,7 @@ awt::Rectangle ChartView::impl_createDiagramAndContent( const CreateShapeParam2D } for( aPlotterIter = rSeriesPlotterList.begin(); aPlotterIter != aPlotterEnd; ++aPlotterIter ) - { - VSeriesPlotter* pSeriesPlotter = *aPlotterIter; - pSeriesPlotter->rearrangeLabelToAvoidOverlapIfRequested( rPageSize ); - } + aPlotterIter->rearrangeLabelToAvoidOverlapIfRequested(rPageSize); } if (rParam.mbUseFixedInnerSize) @@ -1669,8 +1663,7 @@ awt::Rectangle ChartView::impl_createDiagramAndContent( const CreateShapeParam2D bool bSnapRectToUsedArea = false; for( aPlotterIter = rSeriesPlotterList.begin(); aPlotterIter != aPlotterEnd; ++aPlotterIter ) { - VSeriesPlotter* pSeriesPlotter = *aPlotterIter; - bSnapRectToUsedArea = pSeriesPlotter->shouldSnapRectToUsedArea(); + bSnapRectToUsedArea = aPlotterIter->shouldSnapRectToUsedArea(); if(bSnapRectToUsedArea) break; } @@ -3064,13 +3057,11 @@ void ChartView::createShapes2D( const awt::Size& rPageSize ) aParam.mpSeriesPlotterContainer->initializeCooSysAndSeriesPlotter( mrChartModel ); if(maTimeBased.bTimeBased && maTimeBased.nFrame != 0) { - std::vector<VSeriesPlotter*>& rSeriesPlotter = - aParam.mpSeriesPlotterContainer->getSeriesPlotterList(); + SeriesPlottersType& rSeriesPlotter = aParam.mpSeriesPlotterContainer->getSeriesPlotterList(); size_t n = rSeriesPlotter.size(); for(size_t i = 0; i < n; ++i) { - std::vector< VDataSeries* > aAllNewDataSeries = - rSeriesPlotter[i]->getAllSeries(); + std::vector<VDataSeries*> aAllNewDataSeries = rSeriesPlotter[i].getAllSeries(); std::vector< VDataSeries* >& rAllOldDataSeries = maTimeBased.m_aDataSeriesList[i]; size_t m = std::min(aAllNewDataSeries.size(), rAllOldDataSeries.size()); @@ -3127,17 +3118,14 @@ void ChartView::createShapes2D( const awt::Size& rPageSize ) if(maTimeBased.bTimeBased && maTimeBased.nFrame % 60 == 0) { // create copy of the data for next frame - std::vector<VSeriesPlotter*>& rSeriesPlotter = - aParam.mpSeriesPlotterContainer->getSeriesPlotterList(); + SeriesPlottersType& rSeriesPlotter = aParam.mpSeriesPlotterContainer->getSeriesPlotterList(); size_t n = rSeriesPlotter.size(); maTimeBased.m_aDataSeriesList.clear(); maTimeBased.m_aDataSeriesList.resize(n); for(size_t i = 0; i < n; ++i) { - std::vector< VDataSeries* > aAllNewDataSeries = - rSeriesPlotter[i]->getAllSeries(); - std::vector< VDataSeries* >& rAllOldDataSeries = - maTimeBased.m_aDataSeriesList[i]; + std::vector<VDataSeries*> aAllNewDataSeries = rSeriesPlotter[i].getAllSeries(); + std::vector<VDataSeries*>& rAllOldDataSeries = maTimeBased.m_aDataSeriesList[i]; size_t m = aAllNewDataSeries.size(); for(size_t j = 0; j < m; ++j) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits