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