summaryrefslogtreecommitdiff
path: root/sc/source
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@googlemail.com>2013-11-24 21:22:20 +0100
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2013-11-28 00:32:39 +0100
commit12aa3151ab993fff1ae312ae7b1d5bbcfc379b07 (patch)
treee9187d3ee8a43810bba4bdc222094b4f0109e20f /sc/source
parentbf35ce3f91c8ee3f06a7a6c7a10dd17f05198ce5 (diff)
checking every cell on a sheet is expensive, related fdo#71934
This is only the first of two places that does this. Change-Id: I57fe1eb07630ecd86b112e88b7ad32c16e9f793a
Diffstat (limited to 'sc/source')
-rw-r--r--sc/source/core/data/document.cxx16
-rw-r--r--sc/source/core/data/table2.cxx14
-rw-r--r--sc/source/ui/view/cellsh.cxx17
3 files changed, 31 insertions, 16 deletions
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 80696e4bd0ed..708300e72a88 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -6226,6 +6226,22 @@ void ScDocument::GetAllNoteEntries( std::vector<sc::NoteEntry>& rNotes ) const
}
}
+bool ScDocument::ContainsNotesInRange( const ScRangeList& rRange ) const
+{
+ for( size_t i = 0; i < rRange.size(); ++i)
+ {
+ const ScRange* pRange = rRange[i];
+ for( SCTAB nTab = pRange->aStart.Tab(); nTab < pRange->aEnd.Tab(); ++nTab )
+ {
+ bool bContainsNote = maTabs[nTab]->ContainsNotesInRange( *pRange );
+ if(bContainsNote)
+ return true;
+ }
+ }
+
+ return false;
+}
+
void ScDocument::SetAutoNameCache( ScAutoNameCache* pCache )
{
delete pAutoNameCache;
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index 29e10c90d09f..c0d41d1ae6cf 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -1516,6 +1516,20 @@ void ScTable::GetAllNoteEntries( std::vector<sc::NoteEntry>& rNotes ) const
aCol[nCol].GetAllNoteEntries(rNotes);
}
+bool ScTable::ContainsNotesInRange( const ScRange& rRange ) const
+{
+ SCROW nStartRow = rRange.aStart.Row();
+ SCROW nEndRow = rRange.aEnd.Row();
+ for (SCCOL nCol = rRange.aStart.Col(); nCol <= rRange.aEnd.Col(); ++nCol)
+ {
+ bool bContainsNote = !aCol[nCol].IsNotesEmptyBlock(nStartRow, nEndRow);
+ if(bContainsNote)
+ return true;
+ }
+
+ return false;
+}
+
CellType ScTable::GetCellType( SCCOL nCol, SCROW nRow ) const
{
if (ValidColRow( nCol, nRow ))
diff --git a/sc/source/ui/view/cellsh.cxx b/sc/source/ui/view/cellsh.cxx
index 943379f2d0af..8895f963d192 100644
--- a/sc/source/ui/view/cellsh.cxx
+++ b/sc/source/ui/view/cellsh.cxx
@@ -979,22 +979,7 @@ void ScCellShell::GetState(SfxItemSet &rSet)
// look for at least one note in selection
ScRangeList aRanges;
rMark.FillRangeListWithMarks( &aRanges, false );
- size_t nCount = aRanges.size();
- for (size_t nPos = 0; nPos < nCount && !bEnable; ++nPos)
- {
- SCTAB aTab = aRanges[nPos]->aStart.Tab();
- for (SCCOL aCol=aRanges[nPos]->aStart.Col(); aCol <= aRanges[nPos]->aEnd.Col() && !bEnable; aCol++)
- {
- for (SCROW aRow=aRanges[nPos]->aStart.Row(); aRow <= aRanges[nPos]->aEnd.Row(); aRow++)
- {
- if (pDoc->HasNote(aCol, aRow, aTab))
- {
- bEnable = true;
- break;
- }
- }
- }
- }
+ bEnable = pDoc->ContainsNotesInRange( aRanges );
}
}
else