sc/source/ui/docshell/docfunc.cxx | 9 +++ sc/source/ui/undo/UndoInsertSparkline.cxx | 26 ++++++++- sc/source/ui/view/gridwin.cxx | 12 +++- sc/source/ui/view/output.cxx | 79 ++++++++++++++++++++++++------ 4 files changed, 106 insertions(+), 20 deletions(-)
New commits: commit 57f793fd94e9692593b4f8e147c9295751116973 Author: Tibor Nagy <tibor.nagy.ext...@allotropia.de> AuthorDate: Mon Apr 14 14:11:06 2025 +0200 Commit: Nagy Tibor <tibor.nagy.ext...@allotropia.de> CommitDate: Tue Apr 15 14:48:35 2025 +0200 tdf#159712 sc: sparklines are not displayed correctly in merged cells The sparklines are always rendered in the top-left corner and do not take the space of the whole merged cell. Change-Id: I735c180d135de79907dd685045d277cc357815fd Reviewed-on: https://gerrit.libreoffice.org/c/core/+/184152 Tested-by: Jenkins Reviewed-by: Nagy Tibor <tibor.nagy.ext...@allotropia.de> diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx index 9b5413cd1c17..62873862e11d 100644 --- a/sc/source/ui/docshell/docfunc.cxx +++ b/sc/source/ui/docshell/docfunc.cxx @@ -5857,6 +5857,15 @@ bool ScDocFunc::InsertSparklines(ScRange const& rDataRange, ScRange const& rSpar pUndoInsertSparkline->Redo(); rDocShell.GetUndoManager()->AddUndoAction(std::move(pUndoInsertSparkline)); + ScDocument& rDoc = rDocShell.GetDocument(); + if (rSparklineRange.aStart == rSparklineRange.aEnd + && rDoc.HasAttrib(rSparklineRange, HasAttrFlags::Merged)) + { + ScRange aExtendMergeRange(rSparklineRange); + rDoc.ExtendMerge(aExtendMergeRange); + rDocShell.PostPaint(aExtendMergeRange, PaintPartFlags::Grid); + } + return true; } diff --git a/sc/source/ui/undo/UndoInsertSparkline.cxx b/sc/source/ui/undo/UndoInsertSparkline.cxx index 708f3d746f91..ee2dfe2ba312 100644 --- a/sc/source/ui/undo/UndoInsertSparkline.cxx +++ b/sc/source/ui/undo/UndoInsertSparkline.cxx @@ -39,10 +39,19 @@ void UndoInsertSparkline::Undo() for (auto const& rSparklineData : maSparklineDataVector) { rDocument.DeleteSparkline(rSparklineData.maPosition); - aRanges.push_back(ScRange(rSparklineData.maPosition)); + + ScRange aCurrRange(rSparklineData.maPosition); + + if (aCurrRange.aStart == aCurrRange.aEnd + && rDocument.HasAttrib(aCurrRange, HasAttrFlags::Merged)) + { + rDocument.ExtendMerge(aCurrRange); + } + + aRanges.push_back(aCurrRange); } - pDocShell->PostPaint(aRanges, PaintPartFlags::All); + pDocShell->PostPaint(aRanges, PaintPartFlags::All, SC_PF_TESTMERGE); EndUndo(); } @@ -57,10 +66,19 @@ void UndoInsertSparkline::Redo() { auto* pCreated = rDocument.CreateSparkline(rSparklineData.maPosition, mpSparklineGroup); pCreated->setInputRange(rSparklineData.maData); - aRanges.push_back(ScRange(rSparklineData.maPosition)); + + ScRange aCurrRange(rSparklineData.maPosition); + + if (aCurrRange.aStart == aCurrRange.aEnd + && rDocument.HasAttrib(aCurrRange, HasAttrFlags::Merged)) + { + rDocument.ExtendMerge(aCurrRange); + } + + aRanges.push_back(aCurrRange); } - pDocShell->PostPaint(aRanges, PaintPartFlags::All); + pDocShell->PostPaint(aRanges, PaintPartFlags::All, SC_PF_TESTMERGE); EndRedo(); } diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx index 998fd794fa6e..3398a2b14d97 100644 --- a/sc/source/ui/view/gridwin.cxx +++ b/sc/source/ui/view/gridwin.cxx @@ -7386,8 +7386,16 @@ void ScGridWindow::UpdateSparklineGroupOverlay() SCCOL nColumn = pCurrentSparkline->getColumn(); SCROW nRow = pCurrentSparkline->getRow(); - Point aStart = mrViewData.GetScrPos(nColumn, nRow, eWhich); - Point aEnd = mrViewData.GetScrPos(nColumn + 1, nRow + 1, eWhich); + SCTAB nTab = mrViewData.GetTabNo(); + ScRange aCurrRange(nColumn, nRow, nTab); + bool bMerge = rDocument.IsMerged(aCurrentAddress); + if (bMerge) + rDocument.ExtendMerge(aCurrRange); + + Point aStart = mrViewData.GetScrPos(aCurrRange.aStart.Col(), + aCurrRange.aStart.Row(), eWhich); + Point aEnd = mrViewData.GetScrPos(aCurrRange.aEnd.Col() + 1, + aCurrRange.aEnd.Row() + 1, eWhich); basegfx::B2DRange aRange(aStart.X(), aStart.Y(), aEnd.X(), aEnd.Y()); diff --git a/sc/source/ui/view/output.cxx b/sc/source/ui/view/output.cxx index 13e5e5af9572..e12aabaff1c6 100644 --- a/sc/source/ui/view/output.cxx +++ b/sc/source/ui/view/output.cxx @@ -2402,26 +2402,77 @@ void ScOutputData::DrawSparklines(vcl::RenderContext& rRenderContext) ScCellInfo* pInfo = &pThisRowInfo->cellInfo(nX); bool bIsMerged = false; - if ( nX==nX1 && pInfo->bHOverlapped && !pInfo->bVOverlapped ) - { - // find start of merged cell - bIsMerged = true; - SCROW nY = pRowInfo[nArrY].nRowNo; - SCCOL nMergeX = nX; - SCROW nMergeY = nY; - mpDoc->ExtendOverlapped( nMergeX, nMergeY, nX, nY, nTab ); - } + SCCOL nOverX = nX; + SCROW nOverY = pThisRowInfo->nRowNo; + tools::Long nStartPosX = nPosX; + tools::Long nStartPosY = nPosY; - std::shared_ptr<sc::Sparkline> pSparkline; ScAddress aCurrentAddress(nX, pRowInfo[nArrY].nRowNo, nTab); + std::shared_ptr<sc::Sparkline> pSparkline = mpDoc->GetSparkline(aCurrentAddress); + + if (pInfo->bHOverlapped || pInfo->bVOverlapped) + { + while (nOverX > 0 && (mpDoc->GetAttr( + nOverX, nOverY, nTab, ATTR_MERGE_FLAG)->GetValue() & ScMF::Hor)) + { + --nOverX; + nStartPosX -= nLayoutSign + * static_cast<tools::Long>(mpDoc->GetColWidth(nOverX, nTab) + * mnPPTX); + } + + while (nOverY > 0 && (mpDoc->GetAttr( + nOverX, nOverY, nTab, ATTR_MERGE_FLAG)->GetValue() & ScMF::Ver)) + { + --nOverY; + nStartPosY -= nLayoutSign + * static_cast<tools::Long>(mpDoc->GetRowHeight(nOverY, nTab) + * mnPPTY); + } - if (!mpDoc->ColHidden(nX, nTab) && (pSparkline = mpDoc->GetSparkline(aCurrentAddress)) + pSparkline = mpDoc->GetSparkline(ScAddress(nOverX, nOverY, nTab)); + bIsMerged = pSparkline ? true : false; + } + + if (!mpDoc->ColHidden(nX, nTab) && pSparkline && (bIsMerged || (!pInfo->bHOverlapped && !pInfo->bVOverlapped))) { - const tools::Long nWidth = pRowInfo[0].basicCellInfo(nX).nWidth; - const tools::Long nHeight = pThisRowInfo->nHeight; + tools::Long nWidth = pRowInfo[0].basicCellInfo(nX).nWidth; + tools::Long nHeight = pThisRowInfo->nHeight; + + if (bIsMerged || pInfo->bMerged) + { + const ScMergeAttr* pMerge = mpDoc->GetAttr(nOverX, nOverY, nTab, ATTR_MERGE); + SCROW nCountX = pMerge->GetColMerge(); + if (nCountX > 0) + { + sal_Int32 nIndex = 1; + while (nCountX > nIndex && (mpDoc->GetAttr( + nOverX + nIndex, nOverY, nTab, ATTR_MERGE_FLAG)->GetValue() & ScMF::Hor)) + { + nWidth += nLayoutSign + * static_cast<tools::Long>( + mpDoc->GetColWidth(nOverX + nIndex, nTab) * mnPPTX); + nIndex++; + } + } + + SCROW nCountY = pMerge->GetRowMerge(); + if (nCountY > 0) + { + sal_Int32 nIndex = 1; + while (nCountY > nIndex && (mpDoc->GetAttr( + nOverX, nOverY + nIndex, nTab, ATTR_MERGE_FLAG)->GetValue() & ScMF::Ver)) + { + nHeight += nLayoutSign + * static_cast<tools::Long>( + mpDoc->GetRowHeight(nOverY + nIndex, nTab) * mnPPTY); + nIndex++; + } + } + } - Point aPoint(nPosX, nPosY); + Point aPoint(nStartPosX, nStartPosY); Size aSize(nWidth, nHeight); sc::SparklineRenderer renderer(*mpDoc);