tdf#68290 cursor moves with Enter in protected sheet
Change-Id: I2ac848f1799d94f521628480664cdb579417772a
Reviewed-on: https://gerrit.libreoffice.org/49085
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Jenkins <ci@libreoffice.org>
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index b463480..08ddea3 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -593,6 +593,8 @@ public:
void GetNextPos( SCCOL& rCol, SCROW& rRow, SCCOL nMovX, SCROW nMovY,
bool bMarked, bool bUnprotected, const ScMarkData& rMark ) const;
bool SkipRow( const SCCOL rCol, SCROW& rRow, const SCROW nMovY, const ScMarkData& rMark,
const bool bUp, const SCROW nUsedY, const bool bSheetProtected ) const;
void LimitChartArea( SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow ) const;
bool HasData( SCCOL nCol, SCROW nRow ) const;
diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx
index ddc440d..5a0d97d 100644
--- a/sc/source/core/data/table1.cxx
+++ b/sc/source/core/data/table1.cxx
@@ -1318,10 +1318,47 @@ bool ScTable::ValidNextPos( SCCOL nCol, SCROW nRow, const ScMarkData& rMark,
return true;
}
// Skips the current cell if it is Hidden, Overlapped or Protected and Sheet is Protected
bool ScTable::SkipRow( const SCCOL nCol, SCROW& rRow, const SCROW nMovY,
const ScMarkData& rMark, const bool bUp, const SCROW nUsedY, const bool bSheetProtected ) const
{
if ( !ValidRow( rRow ))
return false;
if (bSheetProtected && pDocument->HasAttrib( nCol, rRow, nTab, nCol, rRow, nTab, HasAttrFlags::Protected))
{
if ( rRow > nUsedY )
rRow = (bUp ? nUsedY : MAXROW + nMovY);
else
rRow += nMovY;
rRow = rMark.GetNextMarked( nCol, rRow, bUp );
return true;
}
else
{
bool bRowHidden = RowHidden( rRow );
bool bOverlapped = pDocument->HasAttrib( nCol, rRow, nTab, nCol, rRow, nTab, HasAttrFlags::Overlapped );
if ( bRowHidden || bOverlapped )
{
rRow += nMovY;
rRow = rMark.GetNextMarked( nCol, rRow, bUp );
return true;
}
}
return false;
}
void ScTable::GetNextPos( SCCOL& rCol, SCROW& rRow, SCCOL nMovX, SCROW nMovY,
bool bMarked, bool bUnprotected, const ScMarkData& rMark ) const
{
if (bUnprotected && !IsProtected()) // Is sheet really protected?
bool bSheetProtected = IsProtected();
if ( bUnprotected && !bSheetProtected ) // Is sheet really protected?
bUnprotected = false;
sal_uInt16 nWrap = 0;
@@ -1336,30 +1373,33 @@ void ScTable::GetNextPos( SCCOL& rCol, SCROW& rRow, SCCOL nMovX, SCROW nMovY,
if ( nMovY && bMarked )
{
bool bUp = ( nMovY < 0 );
bool bUp = ( nMovY < 0 );
SCROW nUsedY = nRow;
SCCOL nUsedX = nCol;
nRow = rMark.GetNextMarked( nCol, nRow, bUp );
while ( ValidRow(nRow) &&
(RowHidden(nRow) || pDocument->HasAttrib(nCol, nRow, nTab, nCol, nRow, nTab, HasAttrFlags::Overlapped)) )
{
// skip hidden rows (see above)
nRow += nMovY;
nRow = rMark.GetNextMarked( nCol, nRow, bUp );
}
pDocument->GetPrintArea( nTab, nUsedX, nUsedY );
while ( SkipRow( nCol, nRow, nMovY, rMark, bUp, nUsedY, bSheetProtected ))
;
while ( nRow < 0 || nRow > MAXROW )
{
nCol = sal::static_int_cast<SCCOL>( nCol + static_cast<SCCOL>(nMovY) );
while ( ValidCol(nCol) && ColHidden(nCol) )
nCol = sal::static_int_cast<SCCOL>( nCol + static_cast<SCCOL>(nMovY) ); // skip hidden rows (see above)
if (nCol < 0)
{
nCol = MAXCOL;
nCol = (bSheetProtected ? nUsedX : MAXCOL);
if (++nWrap >= 2)
return;
}
else if (nCol > MAXCOL)
else if (nCol > MAXCOL || ( nCol > nUsedX && bSheetProtected ))
{
nCol = 0;
if (++nWrap >= 2)
return;
}
@@ -1367,14 +1407,11 @@ void ScTable::GetNextPos( SCCOL& rCol, SCROW& rRow, SCCOL nMovX, SCROW nMovY,
nRow = MAXROW;
else if (nRow > MAXROW)
nRow = 0;
nRow = rMark.GetNextMarked( nCol, nRow, bUp );
while ( ValidRow(nRow) &&
(RowHidden(nRow) || pDocument->HasAttrib(nCol, nRow, nTab, nCol, nRow, nTab, HasAttrFlags::Overlapped)) )
{
// skip hidden rows (see above)
nRow += nMovY;
nRow = rMark.GetNextMarked( nCol, nRow, bUp );
}
while ( SkipRow( nCol, nRow, nMovY, rMark, bUp, nUsedY, bSheetProtected ))
;
}
}