sc/source/ui/inc/gridwin.hxx  |    8 ++
 sc/source/ui/view/gridwin.cxx |  121 ++++++++++++++++++------------------------
 2 files changed, 59 insertions(+), 70 deletions(-)

New commits:
commit 98e3715cbdccc82abc7be4b1fa0baff849f7dbce
Author:     Markus Mohrhard <[email protected]>
AuthorDate: Sun Jul 20 13:47:16 2025 +0800
Commit:     Andras Timar <[email protected]>
CommitDate: Mon Nov 17 18:58:28 2025 +0100

    extract common Calc overlay drawing code
    
    cherry-pick from: 3e60e9faad1b86d09cc84b47d9a2054aacf0aac8
    
    Change-Id: Ic471194b17bc79c7a070d4c225eabc17d4713281
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/193663
    Reviewed-by: Andras Timar <[email protected]>
    Tested-by: Jenkins CollaboraOffice <[email protected]>

diff --git a/sc/source/ui/inc/gridwin.hxx b/sc/source/ui/inc/gridwin.hxx
index 8bb4ac1e4cff..bf9863f3d817 100644
--- a/sc/source/ui/inc/gridwin.hxx
+++ b/sc/source/ui/inc/gridwin.hxx
@@ -42,7 +42,11 @@ namespace sc {
     class SpellCheckContext;
 }
 
-namespace sdr::overlay { class OverlayManager; }
+namespace sdr::overlay {
+    class OverlayManager;
+    class OverlayObject;
+    enum class OverlayType;
+}
 
 class FmFormView;
 struct ScTableInfo;
@@ -330,6 +334,8 @@ class SAL_DLLPUBLIC_RTTI ScGridWindow : public 
vcl::DocWindow, public DropTarget
 
     void            UpdateFormulaRange(SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW 
nY2);
 
+    std::unique_ptr<sdr::overlay::OverlayObject> DrawOverlay(const 
std::vector<tools::Rectangle>& rRects, const Color& rColor, bool bBorder, bool 
bContrastOutline, sdr::overlay::OverlayType eOverlayType);
+
 protected:
     virtual void    PrePaint(vcl::RenderContext& rRenderContext) override;
     virtual void    Paint(vcl::RenderContext& rRenderContext, const 
tools::Rectangle& rRect) override;
diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx
index e9f835751bb9..9bf831ff0ca0 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -6809,6 +6809,45 @@ void ScGridWindow::DeleteSelectionOverlay()
     mpOOSelection.reset();
 }
 
+std::unique_ptr<sdr::overlay::OverlayObject> ScGridWindow::DrawOverlay(const 
std::vector<tools::Rectangle>& rRects, const Color& rColor, bool bBorder, bool 
bContrastOutline, sdr::overlay::OverlayType eOverlayType)
+{
+    rtl::Reference<sdr::overlay::OverlayManager> xOverlayManager = 
getOverlayManager();
+    if (!xOverlayManager.is())
+        return std::unique_ptr<sdr::overlay::OverlayObject>();
+
+    std::vector< basegfx::B2DRange > aRanges;
+    const basegfx::B2DHomMatrix 
aTransform(GetOutDev()->GetInverseViewTransformation());
+    ScDocument& rDoc = mrViewData.GetDocument();
+    SCTAB nTab = mrViewData.CurrentTabForData();
+    bool bLayoutRTL = rDoc.IsLayoutRTL( nTab );
+
+    for(const tools::Rectangle & rRA : rRects)
+    {
+        if (bLayoutRTL)
+        {
+            basegfx::B2DRange aRB(rRA.Left(), rRA.Top() - 1, rRA.Right() + 1, 
rRA.Bottom());
+            aRB.transform(aTransform);
+            aRanges.push_back(aRB);
+        }
+        else
+        {
+            basegfx::B2DRange aRB(rRA.Left() - 1, rRA.Top() - 1, rRA.Right(), 
rRA.Bottom());
+            aRB.transform(aTransform);
+            aRanges.push_back(aRB);
+        }
+    }
+
+    std::unique_ptr<sdr::overlay::OverlayObject> pOverlay(new 
sdr::overlay::OverlaySelection(
+        eOverlayType,
+        rColor,
+        std::move(aRanges),
+        bBorder, bContrastOutline));
+
+    xOverlayManager->add(*pOverlay);
+
+    return pOverlay;
+}
+
 void ScGridWindow::UpdateSelectionOverlay()
 {
     const MapMode aDrawMode = GetDrawMapMode();
@@ -6840,42 +6879,14 @@ void ScGridWindow::UpdateSelectionOverlay()
             // notify the LibreOfficeKit too
             UpdateKitSelection(aRects);
         }
-        else if (xOverlayManager.is())
+        else
         {
-            std::vector< basegfx::B2DRange > aRanges;
-            const basegfx::B2DHomMatrix 
aTransform(GetOutDev()->GetInverseViewTransformation());
-            ScDocument& rDoc = mrViewData.GetDocument();
-            SCTAB nTab = mrViewData.CurrentTabForData();
-            bool bLayoutRTL = rDoc.IsLayoutRTL( nTab );
-
-            for(const tools::Rectangle & rRA : aRects)
-            {
-                if (bLayoutRTL)
-                {
-                    basegfx::B2DRange aRB(rRA.Left(), rRA.Top() - 1, 
rRA.Right() + 1, rRA.Bottom());
-                    aRB.transform(aTransform);
-                    aRanges.push_back(aRB);
-                }
-                else
-                {
-                    basegfx::B2DRange aRB(rRA.Left() - 1, rRA.Top() - 1, 
rRA.Right(), rRA.Bottom());
-                    aRB.transform(aTransform);
-                    aRanges.push_back(aRB);
-                }
-            }
-
-            // get the system's highlight color
             const Color aHighlight(SvtOptionsDrawinglayer::getHilightColor());
-
-            std::unique_ptr<sdr::overlay::OverlayObject> pOverlay(new 
sdr::overlay::OverlaySelection(
-                sdr::overlay::OverlayType::Transparent,
-                aHighlight,
-                std::move(aRanges),
-                true, true));
-
-            xOverlayManager->add(*pOverlay);
-            mpOOSelection.reset(new sdr::overlay::OverlayObjectList);
-            mpOOSelection->append(std::move(pOverlay));
+            std::unique_ptr<sdr::overlay::OverlayObject> pOverlay = 
DrawOverlay(aRects, aHighlight, true, true, 
sdr::overlay::OverlayType::Transparent);
+            if (pOverlay) {
+                mpOOSelection.reset(new sdr::overlay::OverlayObjectList);
+                mpOOSelection->append(std::move(pOverlay));
+            }
         }
     }
     else
@@ -6907,43 +6918,15 @@ void ScGridWindow::UpdateHighlightOverlay()
 
     if (!aRects.empty() && mrViewData.IsActive())
     {
+        ScModule* mod = ScModule::get();
+        const Color aBackgroundColor = 
mod->GetColorConfig().GetColorValue(svtools::DOCCOLOR).nColor;
+        Color aHighlightColor = 
mod->GetColorConfig().GetColorValue(svtools::CALCCELLFOCUS).nColor;
+        aHighlightColor.Merge(aBackgroundColor, 100);
+
         // #i70788# get the OverlayManager safely
-        if (rtl::Reference<sdr::overlay::OverlayManager> xOverlayManager = 
getOverlayManager())
+        std::unique_ptr<sdr::overlay::OverlayObject> pOverlay = 
DrawOverlay(aRects, aHighlightColor, false, false, 
sdr::overlay::OverlayType::Transparent);
+        if (pOverlay)
         {
-            std::vector< basegfx::B2DRange > aRanges;
-            const basegfx::B2DHomMatrix 
aTransform(GetOutDev()->GetInverseViewTransformation());
-            ScDocument& rDoc = mrViewData.GetDocument();
-            SCTAB nTab = mrViewData.CurrentTabForData();
-            bool bLayoutRTL = rDoc.IsLayoutRTL( nTab );
-
-            for(const tools::Rectangle & rRA : aRects)
-            {
-                if (bLayoutRTL)
-                {
-                    basegfx::B2DRange aRB(rRA.Left(), rRA.Top() - 1, 
rRA.Right() + 1, rRA.Bottom());
-                    aRB.transform(aTransform);
-                    aRanges.push_back(aRB);
-                }
-                else
-                {
-                    basegfx::B2DRange aRB(rRA.Left() - 1, rRA.Top() - 1, 
rRA.Right(), rRA.Bottom());
-                    aRB.transform(aTransform);
-                    aRanges.push_back(aRB);
-                }
-            }
-
-            ScModule* mod = ScModule::get();
-            const Color aBackgroundColor = 
mod->GetColorConfig().GetColorValue(svtools::DOCCOLOR).nColor;
-            Color aHighlightColor = 
mod->GetColorConfig().GetColorValue(svtools::CALCCELLFOCUS).nColor;
-            aHighlightColor.Merge(aBackgroundColor, 100);
-
-            std::unique_ptr<sdr::overlay::OverlayObject> pOverlay(new 
sdr::overlay::OverlaySelection(
-                sdr::overlay::OverlayType::Transparent,
-                aHighlightColor,
-                std::move(aRanges),
-                false, false));
-
-            xOverlayManager->add(*pOverlay);
             mpOOHighlight.reset(new sdr::overlay::OverlayObjectList);
             mpOOHighlight->append(std::move(pOverlay));
         }

Reply via email to