sc/inc/columnset.hxx | 2 ++ sc/inc/document.hxx | 2 ++ sc/inc/listenercontext.hxx | 4 ++++ sc/source/core/data/columnset.cxx | 10 ++++++++++ sc/source/core/data/document.cxx | 12 ++++++++---- sc/source/core/data/document10.cxx | 10 ++++++++++ sc/source/core/data/listenercontext.cxx | 10 ++++++++++ sc/source/core/data/table2.cxx | 19 +++++++++++++++++-- 8 files changed, 63 insertions(+), 6 deletions(-)
New commits: commit 23acddd6e478eceff770846f0c0aabaa4c265016 Author: Eike Rathke <[email protected]> Date: Tue Apr 19 11:03:15 2016 +0200 call StartNeededListeners() only on affected columns, tdf#99322 follow-up Iterating over the entire document is an unnecessary performancce penalty if the set of affected columns is already known. (cherry picked from commit 35abb3aacb4072171e8c580e1306e3c44e368646) Conflicts: sc/inc/document.hxx sc: fix loplugin:passstuffbyref (cherry picked from commit 7218011f134250a2ad3e03ff28d5665265c50605) const as const can, tdf#99322 follow-up (cherry picked from commit 2efd20c7a18fe5e864509c75443883ccf35bc3a4) 6716817b0ca439b63cc7b49eb7a611c2c15a9b00 8c9714e6c6b15fbb1068b79d2efae48927a1fa77 Change-Id: I84598066f878ca4615d6a5e1d6c70ebaa686e446 Reviewed-on: https://gerrit.libreoffice.org/24242 Reviewed-by: Markus Mohrhard <[email protected]> Tested-by: Jenkins <[email protected]> diff --git a/sc/inc/columnset.hxx b/sc/inc/columnset.hxx index 3ee8fba..ddf08ba 100644 --- a/sc/inc/columnset.hxx +++ b/sc/inc/columnset.hxx @@ -30,6 +30,8 @@ class ColumnSet public: void set(SCTAB nTab, SCCOL nCol); void getColumns(SCTAB nTab, std::vector<SCCOL>& rCols) const; + bool hasTab( SCTAB nTab ) const; + bool empty() const; }; } diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index 5fbd432..4cb2de4 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -80,6 +80,7 @@ struct SortUndoParam; struct ReorderParam; class FormulaGroupAreaListener; class IconSetBitmapMap; +class ColumnSet; } @@ -1959,6 +1960,7 @@ public: void SetHardRecalcState( HardRecalcState eVal ) { eHardRecalcState = eVal; } void StartAllListeners(); void StartNeededListeners(); + void StartNeededListeners( const std::shared_ptr<const sc::ColumnSet>& rpColSet ); void StartAllListeners( const ScRange& rRange ); void SetForcedFormulas( bool bVal ) { bHasForcedFormulas = bVal; } diff --git a/sc/inc/listenercontext.hxx b/sc/inc/listenercontext.hxx index 0ecbd8b..491db5d 100644 --- a/sc/inc/listenercontext.hxx +++ b/sc/inc/listenercontext.hxx @@ -23,14 +23,18 @@ namespace sc { struct ColumnBlockPosition; class ColumnBlockPositionSet; +class ColumnSet; class StartListeningContext : boost::noncopyable { ScDocument& mrDoc; std::shared_ptr<ColumnBlockPositionSet> mpSet; + std::shared_ptr<const ColumnSet> mpColSet; public: StartListeningContext(ScDocument& rDoc); StartListeningContext(ScDocument& rDoc, const std::shared_ptr<ColumnBlockPositionSet>& pSet); + void setColumnSet( const std::shared_ptr<const ColumnSet>& pColSet ); + const std::shared_ptr<const ColumnSet>& getColumnSet() const; ScDocument& getDoc() { return mrDoc;} ColumnBlockPosition* getBlockPosition(SCTAB nTab, SCCOL nCol); diff --git a/sc/source/core/data/columnset.cxx b/sc/source/core/data/columnset.cxx index 84935e5..1af1371 100644 --- a/sc/source/core/data/columnset.cxx +++ b/sc/source/core/data/columnset.cxx @@ -52,6 +52,16 @@ void ColumnSet::getColumns(SCTAB nTab, std::vector<SCCOL>& rCols) const rCols.swap(aCols); } +bool ColumnSet::hasTab(SCTAB nTab) const +{ + return maTabs.find(nTab) != maTabs.end(); +} + +bool ColumnSet::empty() const +{ + return maTabs.empty(); +} + } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx index 843de15..ca63d82 100644 --- a/sc/source/core/data/document.cxx +++ b/sc/source/core/data/document.cxx @@ -2598,10 +2598,14 @@ void ScDocument::CopyBlockFromClip( // For URM_MOVE group listeners may have been removed, // re-establish them. - /* TODO: actually only those in - * sc::RefUpdateContext::maRegroupCols are affected, - * come up with a start listeners that takes such. */ - StartNeededListeners(); + if (!aRefCxt.maRegroupCols.empty()) + { + /* TODO: holding the ColumnSet in a shared_ptr at + * RefUpdateContext would eliminate the need of + * copying it here. */ + std::shared_ptr<const sc::ColumnSet> pColSet( new sc::ColumnSet( aRefCxt.maRegroupCols)); + StartNeededListeners( pColSet); + } SetInsertingFromOtherDoc( bOldInserting); } diff --git a/sc/source/core/data/document10.cxx b/sc/source/core/data/document10.cxx index d3303ed..8e1a54b 100644 --- a/sc/source/core/data/document10.cxx +++ b/sc/source/core/data/document10.cxx @@ -396,6 +396,11 @@ class StartNeededListenersHandler : std::unary_function<ScTable*, void> std::shared_ptr<sc::StartListeningContext> mpCxt; public: explicit StartNeededListenersHandler( ScDocument& rDoc ) : mpCxt(new sc::StartListeningContext(rDoc)) {} + explicit StartNeededListenersHandler( ScDocument& rDoc, const std::shared_ptr<const sc::ColumnSet>& rpColSet ) : + mpCxt(new sc::StartListeningContext(rDoc)) + { + mpCxt->setColumnSet( rpColSet); + } void operator() (ScTable* p) { @@ -411,6 +416,11 @@ void ScDocument::StartNeededListeners() std::for_each(maTabs.begin(), maTabs.end(), StartNeededListenersHandler(*this)); } +void ScDocument::StartNeededListeners( const std::shared_ptr<const sc::ColumnSet>& rpColSet ) +{ + std::for_each(maTabs.begin(), maTabs.end(), StartNeededListenersHandler(*this, rpColSet)); +} + void ScDocument::StartAllListeners( const ScRange& rRange ) { std::shared_ptr<sc::ColumnBlockPositionSet> pPosSet(new sc::ColumnBlockPositionSet(*this)); diff --git a/sc/source/core/data/listenercontext.cxx b/sc/source/core/data/listenercontext.cxx index 75010007..ad5e314 100644 --- a/sc/source/core/data/listenercontext.cxx +++ b/sc/source/core/data/listenercontext.cxx @@ -20,6 +20,16 @@ StartListeningContext::StartListeningContext( ScDocument& rDoc, const std::shared_ptr<ColumnBlockPositionSet>& pSet) : mrDoc(rDoc), mpSet(pSet) {} +void StartListeningContext::setColumnSet( const std::shared_ptr<const ColumnSet>& rpColSet ) +{ + mpColSet = rpColSet; +} + +const std::shared_ptr<const ColumnSet>& StartListeningContext::getColumnSet() const +{ + return mpColSet; +} + ColumnBlockPosition* StartListeningContext::getBlockPosition(SCTAB nTab, SCCOL nCol) { return mpSet->getBlockPosition(nTab, nCol); diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx index 24fde8a..453ba0a 100644 --- a/sc/source/core/data/table2.cxx +++ b/sc/source/core/data/table2.cxx @@ -53,6 +53,7 @@ #include "columnspanset.hxx" #include <rowheightcontext.hxx> #include <refhint.hxx> +#include "listenercontext.hxx" #include "scitems.hxx" #include <editeng/boxitem.hxx> @@ -1033,8 +1034,22 @@ const ScColumn* ScTable::FetchColumn( SCCOL nCol ) const void ScTable::StartListeners( sc::StartListeningContext& rCxt, bool bAll ) { - for (SCCOL i=0; i<=MAXCOL; i++) - aCol[i].StartListeners(rCxt, bAll); + std::shared_ptr<const sc::ColumnSet> pColSet = rCxt.getColumnSet(); + if (!pColSet) + { + for (SCCOL i=0; i<=MAXCOL; i++) + aCol[i].StartListeners(rCxt, bAll); + } + else if (pColSet->hasTab( nTab)) + { + std::vector<SCCOL> aColumns; + pColSet->getColumns( nTab, aColumns); + for (auto i : aColumns) + { + if (0 <= i && i <= MAXCOL) + aCol[i].StartListeners(rCxt, bAll); + } + } } void ScTable::AttachFormulaCells( _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
