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);

Reply via email to