sc/inc/document.hxx | 3 +- sc/inc/table.hxx | 2 + sc/source/core/data/document.cxx | 12 +++++++++-- sc/source/core/data/drwlayer.cxx | 7 +----- sc/source/core/data/table5.cxx | 42 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 58 insertions(+), 8 deletions(-)
New commits: commit 69cc8bdd5f9109804d912b52d5ee1040d6e1868f Author: Balazs Varga <balazs.varga.ext...@allotropia.de> AuthorDate: Sat Mar 25 18:57:08 2023 +0100 Commit: Balazs Varga <balazs.varga.ext...@allotropia.de> CommitDate: Sun Mar 26 16:37:32 2023 +0000 Related: tdf#154005 sc ods fileopen: fix dropdown form control size Fixing the crashtesting assert/crash after the original change. Also a little clean-up. Change-Id: I35453fbc55b3d5d4064179e84755334c2d3a01ca Reviewed-on: https://gerrit.libreoffice.org/c/core/+/149583 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> Reviewed-by: Balazs Varga <balazs.varga.ext...@allotropia.de> diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index f044eaf77f78..285fcf1a7d31 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -2036,7 +2036,8 @@ public: SC_DLLPUBLIC SCROW FirstVisibleRow(SCROW nStartRow, SCROW nEndRow, SCTAB nTab) const; SC_DLLPUBLIC SCROW LastVisibleRow(SCROW nStartRow, SCROW nEndRow, SCTAB nTab) const; SCROW CountVisibleRows(SCROW nStartRow, SCROW nEndRow, SCTAB nTab) const; - SCCOL CountVisibleCols(SCROW nStartCol, SCROW nEndCol, SCTAB nTab) const; + SCROW CountHiddenRows(SCROW nStartRow, SCROW nEndRow, SCTAB nTab) const; + SCCOL CountHiddenCols(SCROW nStartCol, SCROW nEndCol, SCTAB nTab) const; SC_DLLPUBLIC bool RowFiltered(SCROW nRow, SCTAB nTab, SCROW* pFirstRow = nullptr, SCROW* pLastRow = nullptr) const; bool HasFilteredRows(SCROW nStartRow, SCROW nEndRow, SCTAB nTab) const; diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx index 5eefb5f95c38..cbce92da3998 100644 --- a/sc/inc/table.hxx +++ b/sc/inc/table.hxx @@ -971,9 +971,11 @@ public: SCROW FirstVisibleRow(SCROW nStartRow, SCROW nEndRow) const; SCROW LastVisibleRow(SCROW nStartRow, SCROW nEndRow) const; SCROW CountVisibleRows(SCROW nStartRow, SCROW nEndRow) const; + SCROW CountHiddenRows(SCROW nStartRow, SCROW nEndRow) const; tools::Long GetTotalRowHeight(SCROW nStartRow, SCROW nEndRow, bool bHiddenAsZero = true) const; SCCOL CountVisibleCols(SCCOL nStartCol, SCCOL nEndCol) const; + SCCOL CountHiddenCols(SCCOL nStartCol, SCCOL nEndCol) const; SCCOLROW LastHiddenColRow(SCCOLROW nPos, bool bCol) const; diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx index b295e68f69e0..afec7f072b3c 100644 --- a/sc/source/core/data/document.cxx +++ b/sc/source/core/data/document.cxx @@ -4561,12 +4561,20 @@ SCROW ScDocument::CountVisibleRows(SCROW nStartRow, SCROW nEndRow, SCTAB nTab) c return maTabs[nTab]->CountVisibleRows(nStartRow, nEndRow); } -SCCOL ScDocument::CountVisibleCols(SCROW nStartCol, SCROW nEndCol, SCTAB nTab) const +SCROW ScDocument::CountHiddenRows(SCROW nStartRow, SCROW nEndRow, SCTAB nTab) const { if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size()) || !maTabs[nTab]) return 0; - return maTabs[nTab]->CountVisibleCols(nStartCol, nEndCol); + return maTabs[nTab]->CountHiddenRows(nStartRow, nEndRow); +} + +SCCOL ScDocument::CountHiddenCols(SCROW nStartCol, SCROW nEndCol, SCTAB nTab) const +{ + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size()) || !maTabs[nTab]) + return 0; + + return maTabs[nTab]->CountHiddenCols(nStartCol, nEndCol); } bool ScDocument::RowFiltered(SCROW nRow, SCTAB nTab, SCROW* pFirstRow, SCROW* pLastRow) const diff --git a/sc/source/core/data/drwlayer.cxx b/sc/source/core/data/drwlayer.cxx index 653571cabd38..359bf3b1e7be 100644 --- a/sc/source/core/data/drwlayer.cxx +++ b/sc/source/core/data/drwlayer.cxx @@ -713,11 +713,8 @@ void lcl_SetLogicRectFromAnchor(SdrObject* pObj, const ScDrawObjData& rAnchor, c // tdf#154005: Handle hidden row/col: remove hidden row/cols size from the ScDrawObjData shape size in case of forms if (pObj->GetObjIdentifier() == SdrObjKind::UNO && pObj->GetObjInventor() == SdrInventor::FmForm) { - nHiddenRows = ((rAnchor.maEnd.Row() - rAnchor.maStart.Row()) + 1) - - (pDoc->CountVisibleRows(rAnchor.maStart.Row(), rAnchor.maEnd.Row(), rAnchor.maStart.Tab())); - - nHiddenCols = ((rAnchor.maEnd.Col() - rAnchor.maStart.Col()) + 1) - - (pDoc->CountVisibleCols(rAnchor.maStart.Col(), rAnchor.maEnd.Col(), rAnchor.maStart.Tab())); + nHiddenRows = pDoc->CountHiddenRows(rAnchor.maStart.Row(), rAnchor.maEnd.Row(), rAnchor.maStart.Tab()); + nHiddenCols = pDoc->CountHiddenCols(rAnchor.maStart.Col(), rAnchor.maEnd.Col(), rAnchor.maStart.Tab()); } // In case of a vertical mirrored custom shape, LibreOffice uses internally an additional 180deg diff --git a/sc/source/core/data/table5.cxx b/sc/source/core/data/table5.cxx index ad136f53bb4b..40f59f9b0151 100644 --- a/sc/source/core/data/table5.cxx +++ b/sc/source/core/data/table5.cxx @@ -769,6 +769,27 @@ SCROW ScTable::CountVisibleRows(SCROW nStartRow, SCROW nEndRow) const return nCount; } +SCROW ScTable::CountHiddenRows(SCROW nStartRow, SCROW nEndRow) const +{ + SCROW nCount = 0; + SCROW nRow = nStartRow; + ScFlatBoolRowSegments::RangeData aData; + while (nRow <= nEndRow) + { + if (!mpHiddenRows->getRangeData(nRow, aData)) + break; + + if (aData.mnRow2 > nEndRow) + aData.mnRow2 = nEndRow; + + if (aData.mbValue) + nCount += aData.mnRow2 - nRow + 1; + + nRow = aData.mnRow2 + 1; + } + return nCount; +} + tools::Long ScTable::GetTotalRowHeight(SCROW nStartRow, SCROW nEndRow, bool bHiddenAsZero) const { tools::Long nHeight = 0; @@ -814,6 +835,27 @@ SCCOL ScTable::CountVisibleCols(SCCOL nStartCol, SCCOL nEndCol) const return nCount; } +SCCOL ScTable::CountHiddenCols(SCCOL nStartCol, SCCOL nEndCol) const +{ + SCCOL nCount = 0; + SCCOL nCol = nStartCol; + ScFlatBoolColSegments::RangeData aData; + while (nCol <= nEndCol) + { + if (!mpHiddenCols->getRangeData(nCol, aData)) + break; + + if (aData.mnCol2 > nEndCol) + aData.mnCol2 = nEndCol; + + if (aData.mbValue) + nCount += aData.mnCol2 - nCol + 1; + + nCol = aData.mnCol2 + 1; + } + return nCount; +} + SCCOLROW ScTable::LastHiddenColRow(SCCOLROW nPos, bool bCol) const { if (bCol)