tdf#117388 use native scrollbar under gtk in calc data view browser

Change-Id: Ia0ab035473da7b5b64e18876bb81e25fd63effda
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137877
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/sc/source/ui/inc/datatableview.hxx b/sc/source/ui/inc/datatableview.hxx
index 8eaac90..fa7be38 100644
--- a/sc/source/ui/inc/datatableview.hxx
+++ b/sc/source/ui/inc/datatableview.hxx
@@ -20,6 +20,7 @@
#pragma once

#include <com/sun/star/awt/XWindow.hpp>
#include <svtools/scrolladaptor.hxx>
#include <vcl/ctrl.hxx>
#include <vcl/scrbar.hxx>
#include <types.hxx>
@@ -79,15 +80,18 @@ class ScDataTableView : public Control
    VclPtr<ScrollBarBox> mpTopLeft;
    VclPtr<ScDataTableColView> mpColView;
    VclPtr<ScDataTableRowView> mpRowView;
    VclPtr<ScrollBar> mpVScroll;
    VclPtr<ScrollBar> mpHScroll;
    VclPtr<ScrollAdaptor> mpVScroll;
    VclPtr<ScrollAdaptor> mpHScroll;

    sal_uInt16 mnScrollBarSize;

    SCROW mnFirstVisibleRow;
    SCCOL mnFirstVisibleCol;

    std::unique_ptr<MouseEvent> mpMouseEvent;

    DECL_LINK(ScrollHdl, ScrollBar*, void);
    DECL_LINK(VertScrollHdl, weld::Scrollbar&, void);
    DECL_LINK(HorzScrollHdl, weld::Scrollbar&, void);

public:
    ScDataTableView(const css::uno::Reference<css::awt::XWindow>& rParent,
diff --git a/sc/source/ui/miscdlgs/datatableview.cxx b/sc/source/ui/miscdlgs/datatableview.cxx
index d74df0e..70fe3dd 100644
--- a/sc/source/ui/miscdlgs/datatableview.cxx
+++ b/sc/source/ui/miscdlgs/datatableview.cxx
@@ -36,7 +36,6 @@ constexpr double nPPTY = 0.06666;

constexpr sal_uInt16 nRowHeaderWidth = 100;
constexpr sal_uInt16 nColHeaderHeight = 20;
constexpr sal_uInt16 nScrollBarSize = 10;

ScDataTableColView::ScDataTableColView(vcl::Window* pParent, ScDocument* pDoc, SelectionEngine* pSelectionEngine):
        ScHeaderControl(pParent, pSelectionEngine, pDoc->MaxCol()+1, false, nullptr),
@@ -136,8 +135,9 @@ ScDataTableView::ScDataTableView(const css::uno::Reference<css::awt::XWindow> &r
    mpTopLeft(VclPtr<ScrollBarBox>::Create(this, WB_SIZEABLE)),
    mpColView(VclPtr<ScDataTableColView>::Create(this, mpDoc.get(), mpSelectionEngine.get())),
    mpRowView(VclPtr<ScDataTableRowView>::Create(this, mpDoc.get(), mpSelectionEngine.get())),
    mpVScroll(VclPtr<ScrollBar>::Create(this, WinBits(WB_VSCROLL | WB_DRAG))),
    mpHScroll(VclPtr<ScrollBar>::Create(this, WinBits(WB_HSCROLL | WB_DRAG))),
    mpVScroll(VclPtr<ScrollAdaptor>::Create(this, false)),
    mpHScroll(VclPtr<ScrollAdaptor>::Create(this, true)),
    mnScrollBarSize(mpVScroll->GetSizePixel().Width()),
    mnFirstVisibleRow(0),
    mnFirstVisibleCol(0)
{
@@ -147,11 +147,11 @@ ScDataTableView::ScDataTableView(const css::uno::Reference<css::awt::XWindow> &r

    mpVScroll->SetRangeMin(0);
    mpVScroll->SetRangeMax(100);
    mpVScroll->SetEndScrollHdl(LINK(this, ScDataTableView, ScrollHdl));
    mpVScroll->SetScrollHdl(LINK(this, ScDataTableView, VertScrollHdl));

    mpHScroll->SetRangeMin(0);
    mpHScroll->SetRangeMax(50);
    mpHScroll->SetEndScrollHdl(LINK(this, ScDataTableView, ScrollHdl));
    mpHScroll->SetScrollHdl(LINK(this, ScDataTableView, HorzScrollHdl));

    mpTopLeft->Show();
    mpColView->Show();
@@ -250,17 +250,17 @@ void ScDataTableView::Resize()
{
    Size aSize = GetSizePixel();
    mpTopLeft->setPosSizePixel(0, 0, nRowHeaderWidth, nColHeaderHeight);
    mpColView->setPosSizePixel(nRowHeaderWidth, 0, aSize.Width() - nScrollBarSize, nColHeaderHeight);
    mpColView->setPosSizePixel(nRowHeaderWidth, 0, aSize.Width() - mnScrollBarSize, nColHeaderHeight);
    mpRowView->setPosSizePixel(0, nColHeaderHeight, nRowHeaderWidth, aSize.Height());

    mpVScroll->setPosSizePixel(aSize.Width() - nScrollBarSize, nColHeaderHeight, nScrollBarSize, aSize.Height() - nColHeaderHeight - nScrollBarSize);
    mpHScroll->setPosSizePixel(nRowHeaderWidth, aSize.Height() - nScrollBarSize, aSize.Width() - nRowHeaderWidth - nScrollBarSize, nScrollBarSize);
    mpVScroll->setPosSizePixel(aSize.Width() - mnScrollBarSize, nColHeaderHeight, mnScrollBarSize, aSize.Height() - nColHeaderHeight - mnScrollBarSize);
    mpHScroll->setPosSizePixel(nRowHeaderWidth, aSize.Height() - mnScrollBarSize, aSize.Width() - nRowHeaderWidth - mnScrollBarSize, mnScrollBarSize);
}

void ScDataTableView::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRectangle)
{
    Size aSize = GetSizePixel();
    SCCOL nMaxVisibleCol = findColFromPos(aSize.Width() - nScrollBarSize, mpDoc.get(), mnFirstVisibleCol);
    SCCOL nMaxVisibleCol = findColFromPos(aSize.Width() - mnScrollBarSize, mpDoc.get(), mnFirstVisibleCol);
    SCROW nMaxVisibleRow = findRowFromPos(aSize.Height(), mpDoc.get(), mnFirstVisibleRow);

    ScTableInfo aTableInfo;
@@ -300,20 +300,19 @@ void ScDataTableView::getRowRange(SCROW& rStartCol, SCROW& rEndCol) const
    rEndCol = static_cast<SCROW>(aEnd);
}

IMPL_LINK(ScDataTableView, ScrollHdl, ScrollBar*, pScrollBar, void)
IMPL_LINK_NOARG(ScDataTableView, VertScrollHdl, weld::Scrollbar&, void)
{
    if (pScrollBar == mpVScroll.get())
    {
        mnFirstVisibleRow = pScrollBar->GetThumbPos();
        pScrollBar->SetRangeMax(std::min(mpDoc->MaxRow(), static_cast<SCROW>(mnFirstVisibleRow + 100)));
        mpRowView->SetPos(mnFirstVisibleRow);
    }
    else
    {
        mnFirstVisibleCol = pScrollBar->GetThumbPos();
        pScrollBar->SetRangeMax(std::min(mpDoc->MaxCol(), static_cast<SCCOL>(mnFirstVisibleCol + 50)));
        mpColView->SetPos(mnFirstVisibleCol);
    }
    mnFirstVisibleRow = mpVScroll->GetThumbPos();
    mpVScroll->SetRangeMax(std::min(mpDoc->MaxRow(), static_cast<SCROW>(mnFirstVisibleRow + 100)));
    mpRowView->SetPos(mnFirstVisibleRow);
    Invalidate();
}

IMPL_LINK_NOARG(ScDataTableView, HorzScrollHdl, weld::Scrollbar&, void)
{
    mnFirstVisibleCol = mpHScroll->GetThumbPos();
    mpHScroll->SetRangeMax(std::min(mpDoc->MaxCol(), static_cast<SCCOL>(mnFirstVisibleCol + 50)));
    mpColView->SetPos(mnFirstVisibleCol);
    Invalidate();
}