Kaydet (Commit) ec68d58a authored tarafından Eike Rathke's avatar Eike Rathke

GetNextPos: deduplicate some nMovX code

Change-Id: I9208e2e0a9eaa27a81ffe1dd7054dffc7ddd75f4
Reviewed-on: https://gerrit.libreoffice.org/57050Reviewed-by: 's avatarEike Rathke <erack@redhat.com>
Tested-by: 's avatarEike Rathke <erack@redhat.com>
üst d778140c
...@@ -1498,82 +1498,70 @@ void ScTable::GetNextPos( SCCOL& rCol, SCROW& rRow, SCCOL nMovX, SCROW nMovY, ...@@ -1498,82 +1498,70 @@ void ScTable::GetNextPos( SCCOL& rCol, SCROW& rRow, SCCOL nMovX, SCROW nMovY,
const SCCOL nColCount = nEndCol - nStartCol + 1; const SCCOL nColCount = nEndCol - nStartCol + 1;
std::unique_ptr<SCROW[]> pNextRows( new SCROW[nColCount]); std::unique_ptr<SCROW[]> pNextRows( new SCROW[nColCount]);
const SCCOL nLastCol = aCol.size() - 1; const SCCOL nLastCol = aCol.size() - 1;
const bool bUp = (nMovX < 0); // Moving left also means moving up in rows.
const SCROW nRowAdd = (bUp ? -1 : 1);
sal_uInt16 nWrap = 0; sal_uInt16 nWrap = 0;
if ( nMovX > 0 ) // forward for (SCCOL i = 0; i < nColCount; ++i)
pNextRows[i] = (i + nStartCol < nCol) ? (nRow + nRowAdd) : nRow;
do
{ {
for (SCCOL i = 0; i < nColCount; ++i) SCROW nNextRow = pNextRows[nCol - nStartCol] + nRowAdd;
pNextRows[i] = (i + nStartCol < nCol) ? (nRow+1) : nRow; if ( bMarked )
do nNextRow = rMark.GetNextMarked( nCol, nNextRow, bUp );
if ( bUnprotected )
nNextRow = ( nCol <= nLastCol ) ? aCol[nCol].GetNextUnprotected( nNextRow, bUp ) :
aDefaultColAttrArray.GetNextUnprotected( nNextRow, bUp );
pNextRows[nCol - nStartCol] = nNextRow;
if (bUp)
{ {
SCROW nNextRow = pNextRows[nCol - nStartCol] + 1; SCROW nMaxRow = nStartRow - 1;
if ( bMarked )
nNextRow = rMark.GetNextMarked( nCol, nNextRow, false );
if ( bUnprotected )
nNextRow = ( nCol <= nLastCol ) ? aCol[nCol].GetNextUnprotected( nNextRow, false ) :
aDefaultColAttrArray.GetNextUnprotected( nNextRow, false );
pNextRows[nCol - nStartCol] = nNextRow;
SCROW nMinRow = nEndRow + 1;
for (SCCOL i = 0; i < nColCount; ++i) for (SCCOL i = 0; i < nColCount; ++i)
{ {
if (pNextRows[i] < nMinRow) // when two equal on the left if (pNextRows[i] >= nMaxRow) // when two equal the right one
{ {
nMinRow = pNextRows[i]; nMaxRow = pNextRows[i];
nCol = i + nStartCol; nCol = i + nStartCol;
} }
} }
nRow = nMinRow; nRow = nMaxRow;
if ( nRow > nEndRow ) if ( nRow < nStartRow )
{ {
if (++nWrap >= 2) if (++nWrap >= 2)
return; return;
nCol = nStartCol; nCol = nEndCol;
nRow = nStartRow; nRow = nEndRow;
for (SCCOL i = 0; i < nColCount; ++i) for (SCCOL i = 0; i < nColCount; ++i)
pNextRows[i] = nStartRow; // do it all over again pNextRows[i] = nEndRow; // do it all over again
} }
} }
while ( !ValidNextPos(nCol, nRow, rMark, bMarked, bUnprotected) ); else
}
else // backwards
{
for (SCCOL i = 0; i < nColCount; ++i)
pNextRows[i] = (i + nStartCol > nCol) ? (nRow-1) : nRow;
do
{ {
SCROW nNextRow = pNextRows[nCol - nStartCol] - 1; SCROW nMinRow = nEndRow + 1;
if ( bMarked )
nNextRow = rMark.GetNextMarked( nCol, nNextRow, true );
if ( bUnprotected )
nNextRow = ( nCol <= nLastCol ) ? aCol[nCol].GetNextUnprotected( nNextRow, true ) :
aDefaultColAttrArray.GetNextUnprotected( nNextRow, true );
pNextRows[nCol - nStartCol] = nNextRow;
SCROW nMaxRow = nStartRow - 1;
for (SCCOL i = 0; i < nColCount; ++i) for (SCCOL i = 0; i < nColCount; ++i)
{ {
if (pNextRows[i] >= nMaxRow) // when two equal on the right if (pNextRows[i] < nMinRow) // when two equal the left one
{ {
nMaxRow = pNextRows[i]; nMinRow = pNextRows[i];
nCol = i + nStartCol; nCol = i + nStartCol;
} }
} }
nRow = nMaxRow; nRow = nMinRow;
if ( nRow < nStartRow ) if ( nRow > nEndRow )
{ {
if (++nWrap >= 2) if (++nWrap >= 2)
return; return;
nCol = nEndCol; nCol = nStartCol;
nRow = nEndRow; nRow = nStartRow;
for (SCCOL i = 0; i < nColCount; ++i) for (SCCOL i = 0; i < nColCount; ++i)
pNextRows[i] = nEndRow; // do it all over again pNextRows[i] = nStartRow; // do it all over again
} }
} }
while ( !ValidNextPos(nCol, nRow, rMark, bMarked, bUnprotected) );
} }
while ( !ValidNextPos(nCol, nRow, rMark, bMarked, bUnprotected) );
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment