[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: koffice/kspread (silent)
From: Stefan Nikolaus <stefan.nikolaus () kdemail ! net>
Date: 2007-02-02 13:32:15
Message-ID: 1170423135.237419.3413.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 629355 by nikolaus:
Cleanup Move the calculation related methods to RecalcManager.
SVN_SILENT
M +4 -80 DependencyManager.cpp
M +6 -21 DependencyManager.h
M +124 -21 RecalcManager.cpp
--- trunk/koffice/kspread/DependencyManager.cpp #629354:629355
@@ -111,11 +111,6 @@
void removeCircularDependencyFlags(const Region& region);
/**
- * Helper function for DependencyManager::cellsToCalculate().
- */
- void cellsToCalculate( const Region& region, QSet<Cell>& cells ) const;
-
- /**
* For debugging/testing purposes.
*/
void dump() const;
@@ -282,57 +277,16 @@
}
}
-KSpread::Region DependencyManager::consumingRegion(const Cell& cell) const
+QHash<Cell, int> DependencyManager::depths() const
{
- return d->consumingRegion(cell);
+ return d->depths;
}
-QMap<int, Cell> DependencyManager::cellsToCalculate( const Region& region ) const
+KSpread::Region DependencyManager::consumingRegion(const Cell& cell) const
{
- if (region.isEmpty())
- return QMap<int, Cell>();
-
- QSet<Cell> cells;
- d->cellsToCalculate( region, cells );
- QMap<int, Cell> depths;
- foreach ( Cell cell, cells )
- depths.insertMulti( d->depths[cell], cell );
- return depths;
+ return d->consumingRegion(cell);
}
-QMap<int, Cell> DependencyManager::cellsToCalculate( Sheet* sheet ) const
-{
- // NOTE Stefan: It's necessary, that the cells are filled in row-wise;
- // beginning with the top left; ending with the bottom right.
- // This ensures, that the value storage is processed the same
- // way, which boosts performance (using PointStorage) for an
- // empty storage (on loading). For an already filled value
- // storage, the speed gain is not that sensible.
- QMap<int, Cell> cells;
- Cell cell;
- if ( !sheet ) // map recalculation
- {
- for ( int s = 0; s < d->map->count(); ++s )
- {
- sheet = d->map->sheet( s );
- for ( int c = 0; c < sheet->formulaStorage()->count(); ++c )
- {
- cell = Cell( sheet, sheet->formulaStorage()->col( c ), \
sheet->formulaStorage()->row( c ) );
- cells.insertMulti( d->depths[cell], cell );
- }
- }
- }
- else // sheet recalculation
- {
- for ( int c = 0; c < sheet->formulaStorage()->count(); ++c )
- {
- cell = Cell( sheet, sheet->formulaStorage()->col( c ), \
sheet->formulaStorage()->row( c ) );
- cells.insertMulti( d->depths[cell], cell );
- }
- }
- return cells;
-}
-
void DependencyManager::regionMoved( const Region& movedRegion, const Region::Point& \
destination ) {
Region::Point locationOffset( destination.pos() - \
movedRegion.boundingRect().topLeft() ); @@ -726,33 +680,3 @@
}
}
}
-
-void DependencyManager::Private::cellsToCalculate( const Region& region, QSet<Cell>& \
cells ) const
-{
- Region::ConstIterator end(region.constEnd());
- for (Region::ConstIterator it(region.constBegin()); it != end; ++it)
- {
- const QRect range = (*it)->rect();
- const Sheet* sheet = (*it)->sheet();
- for (int col = range.left(); col <= range.right(); ++col)
- {
- for (int row = range.top(); row <= range.bottom(); ++row)
- {
- Cell cell( sheet,col, row);
- // Even empty cells may act as value
- // providers and need to be processed.
-
- // check for already processed cells
- if ( cells.contains( cell ) )
- continue;
-
- // add it to the list
- if ( cell.isFormula() )
- cells.insert( cell );
-
- // add its consumers to the list
- cellsToCalculate( consumingRegion( cell ), cells );
- }
- }
- }
-}
--- trunk/koffice/kspread/DependencyManager.h #629354:629355
@@ -55,6 +55,12 @@
void updateAllDependencies(const Map* map);
/**
+ * Returns the cell depths.
+ * \return the cell depths
+ */
+ QHash<Cell, int> depths() const;
+
+ /**
* Returns the region, that consumes the value of \p cell.
* \return region consuming \p cell 's value
*/
@@ -70,27 +76,6 @@
protected:
/**
- * Finds all cells in region and their dependents, that need recalculation.
- *
- * \return the cells, that need recalculation, ordered by reference depth
- *
- * \see RecalcManager::regionChanged
- */
- QMap<int,Cell> cellsToCalculate( const Region& region ) const;
-
- /**
- * Finds all cells in \p sheet , that have got a formula and hence need
- * recalculation.
- * If \p sheet is zero, all cells in the Map a returned.
- *
- * \return the cells, that need recalculation, ordered by reference depth
- *
- * \see RecalcManager::recalcMap
- * \see RecalcManager::recalcSheet
- */
- QMap<int,Cell> cellsToCalculate( Sheet* sheet = 0 ) const;
-
- /**
* \param cell the cell which formula should be altered
* \param oldLocation the location/range, that was cut
* \param offset the relative movement and new sheet, if applicable
--- trunk/koffice/kspread/RecalcManager.cpp #629354:629355
@@ -22,6 +22,7 @@
#include <QMap>
#include "Cell.h"
+#include "CellStorage.h"
#include "DependencyManager.h"
#include "Formula.h"
#include "Map.h"
@@ -37,26 +38,128 @@
class RecalcManager::Private
{
public:
- /**
- * Stores cells ordered by its reference depth.
- * Depth means the maximum depth of all cells this cell depends on plus one,
- * while a cell which has a formula without cell references has a depth
- * of zero.
- *
- * Examples:
- * \li A1: '=1.0'
- * \li A2: '=A1+A1'
- * \li A3: '=A1+A1+A2'
- *
- * \li depth(A1) = 0
- * \li depth(A2) = 1
- * \li depth(A3) = 2
- */
- QMap<int, Cell> cells;
- const Map* map;
- bool busy;
+ /**
+ * Finds all cells in region and their dependents, that need recalculation.
+ *
+ * \see RecalcManager::regionChanged
+ */
+ void cellsToCalculate( const Region& region );
+
+ /**
+ * Finds all cells in \p sheet , that have got a formula and hence need
+ * recalculation.
+ * If \p sheet is zero, all cells in the Map a returned.
+ *
+ * \see RecalcManager::recalcMap
+ * \see RecalcManager::recalcSheet
+ */
+ void cellsToCalculate( Sheet* sheet = 0 );
+
+ /**
+ * Helper function for cellsToCalculate(const Region&) and \
cellsToCalculate(Sheet*). + */
+ void cellsToCalculate( const Region& region, QSet<Cell>& cells ) const;
+
+ /*
+ * Stores cells ordered by its reference depth.
+ * Depth means the maximum depth of all cells this cell depends on plus one,
+ * while a cell which has a formula without cell references has a depth
+ * of zero.
+ *
+ * Examples:
+ * \li A1: '=1.0'
+ * \li A2: '=A1+A1'
+ * \li A3: '=A1+A1+A2'
+ *
+ * \li depth(A1) = 0
+ * \li depth(A2) = 1
+ * \li depth(A3) = 2
+ */
+ QMap<int, Cell> cells;
+ const Map* map;
+ bool busy;
};
+void RecalcManager::Private::cellsToCalculate( const Region& region )
+{
+ if (region.isEmpty())
+ return;
+
+ // retrieve the cell depths
+ QHash<Cell, int> depths = map->dependencyManager()->depths();
+
+ // create the cell map ordered by depth
+ QSet<Cell> cells;
+ cellsToCalculate( region, cells );
+ const QSet<Cell>::ConstIterator end( cells.end() );
+ for ( QSet<Cell>::ConstIterator it( cells.begin() ); it != end; ++it )
+ this->cells.insertMulti( depths[*it], *it );
+}
+
+void RecalcManager::Private::cellsToCalculate( Sheet* sheet )
+{
+ // retrieve the cell depths
+ QHash<Cell, int> depths = map->dependencyManager()->depths();
+
+ // NOTE Stefan: It's necessary, that the cells are filled in row-wise;
+ // beginning with the top left; ending with the bottom right.
+ // This ensures, that the value storage is processed the same
+ // way, which boosts performance (using PointStorage) for an
+ // empty storage (on loading). For an already filled value
+ // storage, the speed gain is not that sensible.
+ Cell cell;
+ if ( !sheet ) // map recalculation
+ {
+ for ( int s = 0; s < map->count(); ++s )
+ {
+ sheet = map->sheet( s );
+ for ( int c = 0; c < sheet->formulaStorage()->count(); ++c )
+ {
+ cell = Cell( sheet, sheet->formulaStorage()->col( c ), \
sheet->formulaStorage()->row( c ) ); + cells.insertMulti( \
depths[cell], cell ); + }
+ }
+ }
+ else // sheet recalculation
+ {
+ for ( int c = 0; c < sheet->formulaStorage()->count(); ++c )
+ {
+ cell = Cell( sheet, sheet->formulaStorage()->col( c ), \
sheet->formulaStorage()->row( c ) ); + cells.insertMulti( depths[cell], \
cell ); + }
+ }
+}
+
+void RecalcManager::Private::cellsToCalculate( const Region& region, QSet<Cell>& \
cells ) const +{
+ Region::ConstIterator end(region.constEnd());
+ for (Region::ConstIterator it(region.constBegin()); it != end; ++it)
+ {
+ const QRect range = (*it)->rect();
+ const Sheet* sheet = (*it)->sheet();
+ for (int col = range.left(); col <= range.right(); ++col)
+ {
+ for (int row = range.top(); row <= range.bottom(); ++row)
+ {
+ Cell cell( sheet,col, row);
+ // Even empty cells may act as value
+ // providers and need to be processed.
+
+ // check for already processed cells
+ if ( cells.contains( cell ) )
+ continue;
+
+ // add it to the list
+ if ( cell.isFormula() )
+ cells.insert( cell );
+
+ // add its consumers to the list
+ cellsToCalculate( map->dependencyManager()->consumingRegion( cell ), \
cells ); + }
+ }
+ }
+}
+
RecalcManager::RecalcManager( const Map* map )
: d(new Private)
{
@@ -76,7 +179,7 @@
d->busy = true;
kDebug(36002) << "RecalcManager::regionChanged " << region.name() << endl;
ElapsedTime et( "Overall region recalculation", ElapsedTime::PrintOnlyTime );
- d->cells = d->map->dependencyManager()->cellsToCalculate( region );
+ d->cellsToCalculate( region );
recalc();
d->busy = false;
}
@@ -87,7 +190,7 @@
return;
d->busy = true;
ElapsedTime et( "Overall sheet recalculation", ElapsedTime::PrintOnlyTime );
- d->cells = d->map->dependencyManager()->cellsToCalculate( sheet );
+ d->cellsToCalculate( sheet );
recalc();
d->busy = false;
}
@@ -98,7 +201,7 @@
return;
d->busy = true;
ElapsedTime et( "Overall map recalculation", ElapsedTime::PrintOnlyTime );
- d->cells = d->map->dependencyManager()->cellsToCalculate();
+ d->cellsToCalculate();
recalc();
d->busy = false;
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic