sc/inc/document.hxx | 2 +- sc/inc/table.hxx | 2 +- sc/source/core/data/document.cxx | 4 ++-- sc/source/core/data/table2.cxx | 31 ++++--------------------------- sc/source/ui/view/viewdata.cxx | 29 ++++++++++++++++++----------- 5 files changed, 26 insertions(+), 42 deletions(-)
New commits: commit f4be84dfd1714c9084ffa772ff62d63d51e6d0de Author: Noel Grandin <noelgran...@gmail.com> AuthorDate: Sat Jun 25 15:44:25 2022 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Mon Jun 27 21:40:42 2022 +0200 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.gran...@collabora.co.uk> (cherry picked from commit 34c6d02661949fcc9c15bd77d6e837623bbddcdb) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136458 Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136488 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 + } } } }