chart2/source/view/axes/Tickmarks.cxx | 29 ++++ chart2/source/view/axes/Tickmarks.hxx | 8 + chart2/source/view/axes/VAxisBase.cxx | 25 +++ chart2/source/view/axes/VAxisBase.hxx | 9 + chart2/source/view/axes/VCartesianAxis.cxx | 110 +++++++++++++---- chart2/source/view/axes/VCartesianAxis.hxx | 4 chart2/source/view/axes/VCartesianCoordinateSystem.cxx | 13 +- chart2/source/view/axes/VCoordinateSystem.cxx | 7 - 8 files changed, 176 insertions(+), 29 deletions(-)
New commits: commit 859cb431f1208142529af8f7166347d84e4f4e75 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Fri Oct 17 17:01:09 2014 -0400 Adjust text properties after adding a cached text object... But it still doesn't work, and I have a feeling that this strategy will not work without a huge amount of effort. I'll probably abandon it and try something else. Change-Id: Ic09b6e65abdd5595810b29c6ba7858cb5e7b31b5 diff --git a/chart2/source/view/axes/VCartesianAxis.cxx b/chart2/source/view/axes/VCartesianAxis.cxx index 968770d..6914ee0 100644 --- a/chart2/source/view/axes/VCartesianAxis.cxx +++ b/chart2/source/view/axes/VCartesianAxis.cxx @@ -103,6 +103,39 @@ Reference< drawing::XShape > createSingleLabel( return xShape2DText; } +void adjustSingleLabel( + const Reference<drawing::XShape>& xShape, const awt::Point& rAnchorPos, + const AxisLabelProperties& rAxisLabelProps, const AxisProperties& rAxisProps, + const tNameSequence& rPropNames, const tAnySequence& rPropValues ) +{ + if (!xShape.is()) + return; + + uno::Reference<beans::XPropertySet> xProp(xShape, uno::UNO_QUERY); + if (xProp.is()) + { + //set properties + PropertyMapper::setMultiProperties(rPropNames, rPropValues, xProp); + + //set position matrix + //the matrix needs to be set at the end behind autogrow and such position influencing properties + double fRotationAnglePi = rAxisLabelProps.fRotationAngleDegree * (F_PI / -180.0); + uno::Any aATransformation = AbstractShapeFactory::makeTransformation(rAnchorPos, fRotationAnglePi); + try + { + xProp->setPropertyValue("Transformation", aATransformation); + } + catch( const uno::Exception& e ) + { + ASSERT_EXCEPTION( e ); + } + } + + LabelPositionHelper::correctPositionForRotation( + xShape, rAxisProps.maLabelAlignment.meAlignment, + rAxisLabelProps.fRotationAngleDegree, rAxisProps.m_bComplexCategories); +} + bool lcl_doesShapeOverlapWithTickmark( const Reference< drawing::XShape >& xShape , double fRotationAngleDegree , const basegfx::B2DVector& rTickScreenPosition @@ -763,8 +796,12 @@ bool VCartesianAxis::createTextShapes( uno::Reference<drawing::XShape> xCached = rTickIter.getTextShape(); if (xCached.is()) { - xTarget->add(xCached); pTickInfo->xTextShape = xCached; + xTarget->add(xCached); + adjustSingleLabel( + pTickInfo->xTextShape, aAnchorScreenPosition2D, + rAxisLabelProperties, m_aAxisProperties, + aPropNames, aPropValues); } else { commit b83a034b6977bd83057e14f06eb044659f9ca82e Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Fri Oct 17 15:15:51 2014 -0400 More on caching axis label text shapes. Still disabled. Lots of stuff is still not working.... Change-Id: Ib2548e912da75aa55bd215bf79a845331a6bad5f diff --git a/chart2/source/view/axes/Tickmarks.cxx b/chart2/source/view/axes/Tickmarks.cxx index a8cd9a5..78fe7be 100644 --- a/chart2/source/view/axes/Tickmarks.cxx +++ b/chart2/source/view/axes/Tickmarks.cxx @@ -58,11 +58,18 @@ sal_Int32 TickInfo::getScreenDistanceBetweenTicks( const TickInfo& rOherTickInfo return nRet; } -PureTickIter::PureTickIter( TickInfoArrayType& rTickInfoVector ) - : m_rTickVector(rTickInfoVector) - , m_aTickIter(m_rTickVector.begin()) +uno::Reference<drawing::XShape> TickIter::getTextShape() { + return uno::Reference<drawing::XShape>(); } + +PureTickIter::PureTickIter( TickInfoArrayType& rTickInfoVector, const TickLabelArrayType* pLabels ) : + m_rTickVector(rTickInfoVector), + mpLabels(pLabels), + m_aTickIter(m_rTickVector.begin()) +{ +} + PureTickIter::~PureTickIter() { } @@ -84,6 +91,22 @@ TickInfo* PureTickIter::nextInfo() return 0; } +uno::Reference<drawing::XShape> PureTickIter::getTextShape() +{ + uno::Reference<drawing::XShape> xShape; + if (!mpLabels) + return xShape; + + if (m_aTickIter == m_rTickVector.end()) + return xShape; + + size_t nPos = std::distance(m_rTickVector.begin(), m_aTickIter); + if (nPos >= mpLabels->size()) + return xShape; + + return (*mpLabels)[nPos]; +} + TickFactory::TickFactory( const ExplicitScaleData& rScale, const ExplicitIncrementData& rIncrement ) : m_rScale( rScale ) diff --git a/chart2/source/view/axes/Tickmarks.hxx b/chart2/source/view/axes/Tickmarks.hxx index 15e83eb..352ef2a 100644 --- a/chart2/source/view/axes/Tickmarks.hxx +++ b/chart2/source/view/axes/Tickmarks.hxx @@ -56,24 +56,30 @@ private: typedef std::vector<TickInfo> TickInfoArrayType; typedef std::vector<TickInfoArrayType> TickInfoArraysType; +typedef std::vector<css::uno::Reference<css::drawing::XShape> > TickLabelArrayType; +typedef std::vector<TickLabelArrayType> TickLabelArraysType; + class TickIter { public: virtual ~TickIter() {} virtual TickInfo* firstInfo() = 0; virtual TickInfo* nextInfo() = 0; + virtual css::uno::Reference<css::drawing::XShape> getTextShape(); }; class PureTickIter : public TickIter { public: - PureTickIter( TickInfoArrayType& rTickInfoVector ); + PureTickIter( TickInfoArrayType& rTickInfoVector, const TickLabelArrayType* pLabels ); virtual ~PureTickIter(); virtual TickInfo* firstInfo() SAL_OVERRIDE; virtual TickInfo* nextInfo() SAL_OVERRIDE; + virtual css::uno::Reference<css::drawing::XShape> getTextShape() SAL_OVERRIDE; private: TickInfoArrayType& m_rTickVector; + const TickLabelArrayType* mpLabels; TickInfoArrayType::iterator m_aTickIter; }; diff --git a/chart2/source/view/axes/VAxisBase.cxx b/chart2/source/view/axes/VAxisBase.cxx index c391382..1524e77 100644 --- a/chart2/source/view/axes/VAxisBase.cxx +++ b/chart2/source/view/axes/VAxisBase.cxx @@ -49,6 +49,31 @@ VAxisBase::~VAxisBase() { } +#if ENABLE_AXIS_SHAPE_CACHE +void VAxisBase::reset() +{ +} + +void VAxisBase::copyShapes( const VAxisBase& r ) +{ + TickLabelArraysType aNewTickLabels; + TickInfoArraysType::const_iterator it = r.m_aAllTickInfos.begin(), itEnd = r.m_aAllTickInfos.end(); + for (; it != itEnd; ++it) + { + aNewTickLabels.push_back(TickLabelArrayType()); + TickLabelArrayType& rLabelArray = aNewTickLabels.back(); + TickInfoArrayType::const_iterator it2 = it->begin(), it2End = it->end(); + for (; it2 != it2End; ++it2) + { + const TickInfo& rOldTick = *it2; + rLabelArray.push_back(rOldTick.xTextShape); + } + } + + m_aAllTickLabels.swap(aNewTickLabels); +} +#endif + void VAxisBase::initAxisLabelProperties( const ::com::sun::star::awt::Size& rFontReferenceSize , const ::com::sun::star::awt::Rectangle& rMaximumSpaceForLabels ) { diff --git a/chart2/source/view/axes/VAxisBase.hxx b/chart2/source/view/axes/VAxisBase.hxx index d43ef58..980c170 100644 --- a/chart2/source/view/axes/VAxisBase.hxx +++ b/chart2/source/view/axes/VAxisBase.hxx @@ -22,6 +22,8 @@ #include "VAxisOrGridBase.hxx" #include "VAxisProperties.hxx" #include "Tickmarks.hxx" +#include <macros.hxx> + #include <com/sun/star/util/XNumberFormatsSupplier.hpp> namespace chart @@ -39,6 +41,11 @@ public: ::com::sun::star::util::XNumberFormatsSupplier >& xNumberFormatsSupplier ); virtual ~VAxisBase(); +#if ENABLE_AXIS_SHAPE_CACHE + void reset(); + void copyShapes( const VAxisBase& r ); +#endif + /** * Return the number of dimensions the diagram has. 2 for x and y, and 3 * for x, y, and z. @@ -97,6 +104,8 @@ protected: //member * which has multi-level axis labels. */ TickInfoArraysType m_aAllTickInfos; + TickLabelArraysType m_aAllTickLabels; + bool m_bReCreateAllTickInfos; bool m_bRecordMaximumTextSize; diff --git a/chart2/source/view/axes/VCartesianAxis.cxx b/chart2/source/view/axes/VCartesianAxis.cxx index be13e64..968770d 100644 --- a/chart2/source/view/axes/VCartesianAxis.cxx +++ b/chart2/source/view/axes/VCartesianAxis.cxx @@ -218,7 +218,7 @@ private: //member LabelIterator::LabelIterator( TickInfoArrayType& rTickInfoVector , const AxisLabelStaggering eAxisLabelStaggering , bool bInnerLine ) - : m_aPureTickIter( rTickInfoVector ) + : m_aPureTickIter(rTickInfoVector, NULL) , m_eAxisLabelStaggering(eAxisLabelStaggering) , m_bInnerLine(bInnerLine) { @@ -375,23 +375,25 @@ bool lcl_hasWordBreak( const Reference< drawing::XShape >& rxShape ) class MaxLabelTickIter : public TickIter { public: - MaxLabelTickIter( TickInfoArrayType& rTickInfoVector - , sal_Int32 nLongestLabelIndex ); + MaxLabelTickIter( TickInfoArrayType& rTickInfoVector, sal_Int32 nLongestLabelIndex, const TickLabelArrayType* pLabels ); virtual ~MaxLabelTickIter(); virtual TickInfo* firstInfo() SAL_OVERRIDE; virtual TickInfo* nextInfo() SAL_OVERRIDE; + virtual uno::Reference<drawing::XShape> getTextShape() SAL_OVERRIDE; private: TickInfoArrayType& m_rTickInfoVector; + const TickLabelArrayType* mpTickLabels; ::std::vector< sal_Int32 > m_aValidIndices; - sal_Int32 m_nCurrentIndex; + size_t m_nCurrentIndex; }; -MaxLabelTickIter::MaxLabelTickIter( TickInfoArrayType& rTickInfoVector - , sal_Int32 nLongestLabelIndex ) - : m_rTickInfoVector(rTickInfoVector) - , m_nCurrentIndex(0) +MaxLabelTickIter::MaxLabelTickIter( + TickInfoArrayType& rTickInfoVector, sal_Int32 nLongestLabelIndex, const TickLabelArrayType* pLabels ) : + m_rTickInfoVector(rTickInfoVector), + mpTickLabels(pLabels), + m_nCurrentIndex(0) { sal_Int32 nMaxIndex = m_rTickInfoVector.size()-1; if( nLongestLabelIndex<0 || nLongestLabelIndex>=nMaxIndex-1 ) @@ -415,7 +417,7 @@ MaxLabelTickIter::~MaxLabelTickIter() TickInfo* MaxLabelTickIter::firstInfo() { m_nCurrentIndex = 0; - if( m_nCurrentIndex < static_cast<sal_Int32>(m_aValidIndices.size()) ) + if (m_nCurrentIndex < m_aValidIndices.size()) return &m_rTickInfoVector[m_aValidIndices[m_nCurrentIndex]]; return 0; } @@ -423,11 +425,23 @@ TickInfo* MaxLabelTickIter::firstInfo() TickInfo* MaxLabelTickIter::nextInfo() { m_nCurrentIndex++; - if( m_nCurrentIndex>=0 && m_nCurrentIndex<static_cast<sal_Int32>(m_aValidIndices.size()) ) + if (m_nCurrentIndex < m_aValidIndices.size()) return &m_rTickInfoVector[m_aValidIndices[m_nCurrentIndex]]; return 0; } +uno::Reference<drawing::XShape> MaxLabelTickIter::getTextShape() +{ + uno::Reference<drawing::XShape> xShape; + if (!mpTickLabels) + return xShape; + + if (m_nCurrentIndex >= mpTickLabels->size()) + return xShape; + + return (*mpTickLabels)[m_nCurrentIndex]; +} + bool VCartesianAxis::isBreakOfLabelsAllowed( const AxisLabelProperties& rAxisLabelProperties , bool bIsHorizontalAxis ) { @@ -566,14 +580,19 @@ void VCartesianAxis::createAllTickInfos( TickInfoArraysType& rAllTickInfos ) VAxisBase::createAllTickInfos(rAllTickInfos); } -TickIter* VCartesianAxis::createLabelTickIterator( sal_Int32 nTextLevel ) +TickIter* VCartesianAxis::createLabelTickIterator( size_t nTextLevel ) { - if( nTextLevel>=0 && nTextLevel < static_cast< sal_Int32 >(m_aAllTickInfos.size()) ) - return new PureTickIter( m_aAllTickInfos[nTextLevel] ); - return NULL; + if (nTextLevel >= m_aAllTickInfos.size()) + return NULL; + + const TickLabelArrayType* pLabels = NULL; + if (nTextLevel < m_aAllTickLabels.size()) + pLabels = &m_aAllTickLabels[nTextLevel]; + + return new PureTickIter(m_aAllTickInfos[nTextLevel], pLabels); } -TickIter* VCartesianAxis::createMaximumLabelTickIterator( sal_Int32 nTextLevel ) +TickIter* VCartesianAxis::createMaximumLabelTickIterator( size_t nTextLevel ) { if( isComplexCategoryAxis() || isDateAxis() ) { @@ -586,7 +605,8 @@ TickIter* VCartesianAxis::createMaximumLabelTickIterator( sal_Int32 nTextLevel ) if( !m_aAllTickInfos.empty() ) { sal_Int32 nLongestLabelIndex = m_bUseTextLabels ? this->getIndexOfLongestLabel( m_aTextLabels ) : 0; - return new MaxLabelTickIter( m_aAllTickInfos[0], nLongestLabelIndex ); + const TickLabelArrayType* pLabels = m_aAllTickLabels.empty() ? NULL : &m_aAllTickLabels[0]; + return new MaxLabelTickIter( m_aAllTickInfos[0], nLongestLabelIndex, pLabels ); } } } @@ -739,10 +759,21 @@ bool VCartesianAxis::createTextShapes( //create single label if(!pTickInfo->xTextShape.is()) - pTickInfo->xTextShape = createSingleLabel( m_xShapeFactory, xTarget - , aAnchorScreenPosition2D, aLabel - , rAxisLabelProperties, m_aAxisProperties - , aPropNames, aPropValues ); + { + uno::Reference<drawing::XShape> xCached = rTickIter.getTextShape(); + if (xCached.is()) + { + xTarget->add(xCached); + pTickInfo->xTextShape = xCached; + } + else + { + pTickInfo->xTextShape = createSingleLabel( + m_xShapeFactory, xTarget, aAnchorScreenPosition2D, aLabel, + rAxisLabelProperties, m_aAxisProperties, aPropNames, aPropValues); + } + } + if(!pTickInfo->xTextShape.is()) continue; @@ -1281,7 +1312,7 @@ void VCartesianAxis::hideIdenticalScreenValues( TickInfoArraysType& rTickInfos ) sal_Int32 nCount = rTickInfos.size(); for( sal_Int32 nN=0; nN<nCount; nN++ ) { - PureTickIter aTickIter( rTickInfos[nN] ); + PureTickIter aTickIter(rTickInfos[nN], NULL); lcl_hideIdenticalScreenValues( aTickIter ); } } diff --git a/chart2/source/view/axes/VCartesianAxis.hxx b/chart2/source/view/axes/VCartesianAxis.hxx index e3f26a8..ad94f76 100644 --- a/chart2/source/view/axes/VCartesianAxis.hxx +++ b/chart2/source/view/axes/VCartesianAxis.hxx @@ -47,8 +47,8 @@ public: virtual void createAllTickInfos( TickInfoArraysType& rAllTickInfos ) SAL_OVERRIDE; void createAllTickInfosFromComplexCategories( TickInfoArraysType& rAllTickInfos, bool bShiftedPosition ); - TickIter* createLabelTickIterator( sal_Int32 nTextLevel ); - TickIter* createMaximumLabelTickIterator( sal_Int32 nTextLevel ); + TickIter* createLabelTickIterator( size_t nTextLevel ); + TickIter* createMaximumLabelTickIterator( size_t nTextLevel ); sal_Int32 getTextLevelCount() const; virtual TickFactory* createTickFactory() SAL_OVERRIDE; diff --git a/chart2/source/view/axes/VCartesianCoordinateSystem.cxx b/chart2/source/view/axes/VCartesianCoordinateSystem.cxx index 79005bf..15730a7 100644 --- a/chart2/source/view/axes/VCartesianCoordinateSystem.cxx +++ b/chart2/source/view/axes/VCartesianCoordinateSystem.cxx @@ -99,7 +99,8 @@ void VCartesianCoordinateSystem::createVAxisList( , const awt::Rectangle& rMaximumSpaceForLabels ) { - m_aAxisMap.clear(); + tVAxisMap aOldAxisMap; + aOldAxisMap.swap(m_aAxisMap); sal_Int32 nDimensionCount = m_xCooSysModel->getDimension(); bool bSwapXAndY = this->getPropertySwapXAndYAxis(); @@ -148,6 +149,16 @@ void VCartesianCoordinateSystem::createVAxisList( ::boost::shared_ptr< VAxisBase > apVAxis( new VCartesianAxis(aAxisProperties,xNumberFormatsSupplier,nDimensionIndex,nDimensionCount) ); tFullAxisIndex aFullAxisIndex( nDimensionIndex, nAxisIndex ); + +#if ENABLE_AXIS_SHAPE_CACHE + tVAxisMap::iterator it = aOldAxisMap.find(aFullAxisIndex); + if (it != aOldAxisMap.end()) + { + // Copy the text objects over. + apVAxis->copyShapes(*it->second); + } +#endif + m_aAxisMap[aFullAxisIndex] = apVAxis; apVAxis->set3DWallPositions( m_eLeftWallPos, m_eBackWallPos, m_eBottomPos ); diff --git a/chart2/source/view/axes/VCoordinateSystem.cxx b/chart2/source/view/axes/VCoordinateSystem.cxx index 25b7149..690dde3 100644 --- a/chart2/source/view/axes/VCoordinateSystem.cxx +++ b/chart2/source/view/axes/VCoordinateSystem.cxx @@ -119,7 +119,12 @@ void VCoordinateSystem::reset() m_apExplicitCategoriesProvider.reset(); - m_aAxisMap.clear(); // TODO : switch to reset() later. + tVAxisMap::iterator it = m_aAxisMap.begin(), itEnd = m_aAxisMap.end(); + for (; it != itEnd; ++it) + { + VAxisBase& rAxis = *it->second; + rAxis.reset(); + } } #endif _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits