summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Francis <dennisfrancis.in@gmail.com>2017-06-07 22:48:01 +0530
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2017-06-10 07:09:58 +0200
commita680f6988482f13489d6c802b6078d43564ae934 (patch)
tree0316677f9cdc83d66d6671683720ae0ec80c67d4
parent076ed447f694239d5c67adee528ea6e471d909ff (diff)
tdf#50916 : More refactoring in table1.cxx
Refactored ScTable::FindNextVisibleColWithContent() and ScTable::FindAreaPos() for dynamic column container. Change-Id: I5afdbe98d4f0eb69f42b56308b57b87777861740 Reviewed-on: https://gerrit.libreoffice.org/38556 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
-rw-r--r--sc/source/core/data/table1.cxx35
1 files changed, 28 insertions, 7 deletions
diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx
index fe7b88966374..bbb6d610a5ce 100644
--- a/sc/source/core/data/table1.cxx
+++ b/sc/source/core/data/table1.cxx
@@ -1163,9 +1163,12 @@ SCCOL ScTable::FindNextVisibleCol( SCCOL nCol, bool bRight ) const
SCCOL ScTable::FindNextVisibleColWithContent( SCCOL nCol, bool bRight, SCROW nRow ) const
{
+ const SCCOL nLastCol = aCol.size() - 1;
if(bRight)
{
- if(nCol == MAXCOL)
+ // If nCol is the last allocated column index, there wont be any content to its right.
+ // To maintain the original return behaviour, return MAXCOL.
+ if(nCol >= nLastCol)
return MAXCOL;
do
@@ -1176,19 +1179,27 @@ SCCOL ScTable::FindNextVisibleColWithContent( SCCOL nCol, bool bRight, SCROW nRo
if(bHidden)
{
nCol = nEndCol +1;
- if(nEndCol >= MAXCOL)
+ // Can end search early as there is no data after nLastCol.
+ // For nCol == nLastCol, it may still have data so don't want to return MAXCOL.
+ if(nCol > nLastCol)
return MAXCOL;
}
if(aCol[nCol].HasVisibleDataAt(nRow))
return nCol;
}
- while(nCol < MAXCOL);
+ while(nCol < nLastCol); // Stop search as soon as the last allocated column is searched.
return MAXCOL;
}
else
{
+ // If nCol is in the unallocated range [nLastCol+1, MAXCOL], then move it directly to nLastCol
+ // as there is no data in the unallocated range. This also makes the search faster and avoids
+ // the need for more range checks in the loop below.
+ if ( nCol > nLastCol )
+ nCol = nLastCol;
+
if(nCol == 0)
return 0;
@@ -1215,10 +1226,12 @@ SCCOL ScTable::FindNextVisibleColWithContent( SCCOL nCol, bool bRight, SCROW nRo
void ScTable::FindAreaPos( SCCOL& rCol, SCROW& rRow, ScMoveDirection eDirection ) const
{
+ const SCCOL nLastCol = aCol.size() - 1;
+
if (eDirection == SC_MOVE_LEFT || eDirection == SC_MOVE_RIGHT)
{
SCCOL nNewCol = rCol;
- bool bThere = aCol[nNewCol].HasVisibleDataAt(rRow);
+ bool bThere = ( nNewCol <= nLastCol ) && aCol[nNewCol].HasVisibleDataAt(rRow);
bool bRight = (eDirection == SC_MOVE_RIGHT);
if (bThere)
{
@@ -1229,14 +1242,14 @@ void ScTable::FindAreaPos( SCCOL& rCol, SCROW& rRow, ScMoveDirection eDirection
SCCOL nNextCol = FindNextVisibleCol( nNewCol, bRight );
- if(aCol[nNextCol].HasVisibleDataAt(rRow))
+ if( nNextCol <= nLastCol && aCol[nNextCol].HasVisibleDataAt(rRow) )
{
bool bFound = false;
nNewCol = nNextCol;
do
{
nNextCol = FindNextVisibleCol( nNewCol, bRight );
- if(aCol[nNextCol].HasVisibleDataAt(rRow))
+ if( nNextCol <= nLastCol && aCol[nNextCol].HasVisibleDataAt(rRow) )
nNewCol = nNextCol;
else
bFound = true;
@@ -1261,7 +1274,15 @@ void ScTable::FindAreaPos( SCCOL& rCol, SCROW& rRow, ScMoveDirection eDirection
}
else
{
- aCol[rCol].FindDataAreaPos(rRow,eDirection == SC_MOVE_DOWN);
+ if ( rCol <= nLastCol )
+ aCol[rCol].FindDataAreaPos(rRow,eDirection == SC_MOVE_DOWN);
+ else
+ {
+ // The cell (rCol, rRow) is equivalent to an empty cell (although not allocated).
+ // Set rRow to 0 or MAXROW depending on eDirection to maintain the behaviour of
+ // ScColumn::FindDataAreaPos() when the given column is empty.
+ rRow = ( eDirection == SC_MOVE_DOWN ) ? MAXROW : 0;
+ }
}
}