summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNoel Grandin <noelgrandin@gmail.com>2022-06-25 15:44:25 +0200
committerXisco Fauli <xiscofauli@libreoffice.org>2022-06-27 21:40:42 +0200
commitf4be84dfd1714c9084ffa772ff62d63d51e6d0de (patch)
tree9810dac453a6089fa94b73bd9485e053057ce34d
parentsw: avoid divide by zero in SwTextGridPage::CharorLineChangedHdl (diff)
downloadcore-f4be84dfd1714c9084ffa772ff62d63d51e6d0de.tar.gz
core-f4be84dfd1714c9084ffa772ff62d63d51e6d0de.zip
tdf#149647 LibreOffice Calc cursor not positioned correctly
Revert the offending commit commit feec8e3c34e08b621098a17f1011dccd0b4f7f4c reduce iteration in ScViewData::GetScrPos Change-Id: Id1df2bf7f87e6b800b40871c1472ed466b7eb6a0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136442 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> (cherry picked from commit 34c6d02661949fcc9c15bd77d6e837623bbddcdb) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136458 Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org> Signed-off-by: Xisco Fauli <xiscofauli@libreoffice.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136488
-rw-r--r--sc/inc/document.hxx2
-rw-r--r--sc/inc/table.hxx2
-rw-r--r--sc/source/core/data/document.cxx4
-rw-r--r--sc/source/core/data/table2.cxx31
-rw-r--r--sc/source/ui/view/viewdata.cxx29
5 files changed, 26 insertions, 42 deletions
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 7b1563994bc0..2050eac9595f 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -1912,7 +1912,7 @@ public:
* specified height.
*/
SCROW GetRowForHeight( SCTAB nTab, sal_uLong nHeight ) const;
- sal_uLong GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow, SCTAB nTab, double fScale, const sal_uLong* pnMaxHeight = nullptr ) const;
+ sal_uLong GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow, SCTAB nTab, double fScale ) const;
SC_DLLPUBLIC sal_uLong GetColOffset( SCCOL nCol, SCTAB nTab, bool bHiddenAsZero = true ) const;
SC_DLLPUBLIC sal_uLong GetRowOffset( SCROW nRow, SCTAB nTab, bool bHiddenAsZero = true ) const;
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index 27a1fcf67fd8..4026a6b82d01 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -831,7 +831,7 @@ public:
sal_uLong GetColWidth( SCCOL nStartCol, SCCOL nEndCol ) const;
sal_uInt16 GetRowHeight( SCROW nRow, SCROW* pStartRow, SCROW* pEndRow, bool bHiddenAsZero = true ) const;
sal_uLong GetRowHeight( SCROW nStartRow, SCROW nEndRow, bool bHiddenAsZero = true ) const;
- sal_uLong GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow, double fScale, const sal_uLong* pnMaxHeight = nullptr ) const;
+ sal_uLong GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow, double fScale ) const;
sal_uLong GetColOffset( SCCOL nCol, bool bHiddenAsZero = true ) const;
sal_uLong GetRowOffset( SCROW nRow, bool bHiddenAsZero = true ) const;
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index dbf6233efa6b..5fe2cfe08d0d 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -4226,7 +4226,7 @@ SCROW ScDocument::GetRowForHeight( SCTAB nTab, sal_uLong nHeight ) const
}
sal_uLong ScDocument::GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow,
- SCTAB nTab, double fScale, const sal_uLong* pnMaxHeight ) const
+ SCTAB nTab, double fScale ) const
{
// faster for a single row
if (nStartRow == nEndRow)
@@ -4237,7 +4237,7 @@ sal_uLong ScDocument::GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow,
return 0;
if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
- return maTabs[nTab]->GetScaledRowHeight( nStartRow, nEndRow, fScale, pnMaxHeight );
+ return maTabs[nTab]->GetScaledRowHeight( nStartRow, nEndRow, fScale);
OSL_FAIL("wrong sheet number");
return 0;
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index 7f3f0d48cee4..b56f07d52a0f 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -3456,7 +3456,7 @@ sal_uLong ScTable::GetRowHeight( SCROW nStartRow, SCROW nEndRow, bool bHiddenAsZ
return (nEndRow - nStartRow + 1) * static_cast<sal_uLong>(ScGlobal::nStdRowHeight);
}
-sal_uLong ScTable::GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow, double fScale, const sal_uLong* pnMaxHeight ) const
+sal_uLong ScTable::GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow, double fScale ) const
{
OSL_ENSURE(ValidRow(nStartRow) && ValidRow(nEndRow),"wrong row number");
@@ -3483,21 +3483,8 @@ sal_uLong ScTable::GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow, double fS
SCROW nSegmentEnd = std::min( nLastRow, aSegmentIter.getLastPos() );
// round-down a single height value, multiply resulting (pixel) values
- const sal_uLong nOneHeight = static_cast<sal_uLong>( nRowVal * fScale );
- // sometimes scaling results in zero height
- if (nOneHeight)
- {
- SCROW nRowsInSegment = nSegmentEnd + 1 - nRow;
- if (pnMaxHeight)
- {
- nRowsInSegment = std::min(nRowsInSegment, static_cast<SCROW>(*pnMaxHeight / nOneHeight + 1));
- nHeight += nOneHeight * nRowsInSegment;
- if (nHeight > *pnMaxHeight)
- return nHeight;
- }
- else
- nHeight += nOneHeight * nRowsInSegment;
- }
+ sal_uLong nOneHeight = static_cast<sal_uLong>( nRowVal * fScale );
+ nHeight += nOneHeight * ( nSegmentEnd + 1 - nRow );
nRow = nSegmentEnd + 1;
}
@@ -3507,17 +3494,7 @@ sal_uLong ScTable::GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow, double fS
return nHeight;
}
else
- {
- const sal_uLong nOneHeight = static_cast<sal_uLong>(ScGlobal::nStdRowHeight * fScale);
- SCROW nRowsInSegment = nEndRow - nStartRow + 1;
- if (pnMaxHeight)
- {
- nRowsInSegment = std::min(nRowsInSegment, static_cast<SCROW>(*pnMaxHeight / nOneHeight + 1));
- return nOneHeight * nRowsInSegment;
- }
- else
- return static_cast<sal_uLong>(nRowsInSegment * nOneHeight);
- }
+ return static_cast<sal_uLong>((nEndRow - nStartRow + 1) * ScGlobal::nStdRowHeight * fScale);
}
sal_uInt16 ScTable::GetOriginalHeight( SCROW nRow ) const // non-0 even if hidden
diff --git a/sc/source/ui/view/viewdata.cxx b/sc/source/ui/view/viewdata.cxx
index 5cee19f21eb7..f712d23ae0e6 100644
--- a/sc/source/ui/view/viewdata.cxx
+++ b/sc/source/ui/view/viewdata.cxx
@@ -2416,7 +2416,7 @@ Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScSplitPos eWhich,
const_cast<ScViewData*>(this)->aScrSize.setHeight( pView->GetGridHeight(eWhichY) );
}
- sal_uLong nTSize;
+ sal_uInt16 nTSize;
bool bIsTiledRendering = comphelper::LibreOfficeKit::isActive();
@@ -2484,20 +2484,27 @@ Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScSplitPos eWhich,
if (nWhereY >= nStartPosY)
{
- if (bAllowNeg || bIsTiledRendering || nScrPosY <= aScrSize.Height())
+ for (SCROW nY = nStartPosY; nY < nWhereY && (bAllowNeg || bIsTiledRendering || nScrPosY <= aScrSize.Height()); nY++)
{
- if (nWhereY - 1 > mrDoc.MaxRow())
+ if ( nY > mrDoc.MaxRow() )
nScrPosY = 0x7FFFFFFF;
- else if (bAllowNeg || bIsTiledRendering)
- {
- sal_uLong nSizeYPix = mrDoc.GetScaledRowHeight(nStartPosY, nWhereY - 1, nForTab, nPPTY);
- nScrPosY += nSizeYPix;
- }
else
{
- sal_uLong nMaxHeight = aScrSize.getHeight() - nScrPosY;
- sal_uLong nSizeYPix = mrDoc.GetScaledRowHeight(nStartPosY, nWhereY - 1, nForTab, nPPTY, &nMaxHeight);
- nScrPosY += nSizeYPix;
+ nTSize = mrDoc.GetRowHeight( nY, nTabNo );
+ if (nTSize)
+ {
+ tools::Long nSizeYPix = ToPixel( nTSize, nPPTY );
+ nScrPosY += nSizeYPix;
+ }
+ else if ( nY < mrDoc.MaxRow() )
+ {
+ // skip multiple hidden rows (forward only for now)
+ SCROW nNext = mrDoc.FirstVisibleRow(nY + 1, mrDoc.MaxRow(), nTabNo);
+ if ( nNext > mrDoc.MaxRow() )
+ nY = mrDoc.MaxRow();
+ else
+ nY = nNext - 1; // +=nDir advances to next visible row
+ }
}
}
}