tdf#117388 use native scrollbar under gtk in data browser

Change-Id: I22745f1c910f68fd2c0b31e8392c111fc76ef529
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137864
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/include/svtools/brwbox.hxx b/include/svtools/brwbox.hxx
index aeb945f..f16a19f 100644
--- a/include/svtools/brwbox.hxx
+++ b/include/svtools/brwbox.hxx
@@ -37,7 +37,7 @@

class BrowserColumn;
class BrowserHeader;
class ScrollBar;
class ScrollAdaptor;
class MeasureStatusBar;

namespace svt {
@@ -48,6 +48,10 @@ namespace vcl {
    class IAccessibleFactory;
}

namespace weld {
    class Scrollbar;
}

#define BROWSER_INVALIDID           SAL_MAX_UINT16
constexpr sal_Int32 BROWSER_ENDOFSELECTION = SFX_ENDOFSELECTION;

@@ -268,8 +272,8 @@ public:

private:
    VclPtr<BrowserDataWin> pDataWin;       // window to display data rows
    VclPtr<ScrollBar>      pVScroll;       // vertical scrollbar
    VclPtr<ScrollBar>      aHScroll;       // horizontal scrollbar
    VclPtr<ScrollAdaptor>  pVScroll;       // vertical scrollbar
    VclPtr<ScrollAdaptor>  aHScroll;       // horizontal scrollbar
    VclPtr<MeasureStatusBar> aStatusBarHeight; // statusbar, just to measure its height

    tools::Long     m_nDataRowHeight; // height of a single data-row
@@ -359,7 +363,8 @@ private:

    SVT_DLLPRIVATE void            ColumnInserted( sal_uInt16 nPos );

    DECL_DLLPRIVATE_LINK(    ScrollHdl, ScrollBar*, void );
    DECL_DLLPRIVATE_LINK(VertScrollHdl, weld::Scrollbar&, void);
    DECL_DLLPRIVATE_LINK(HorzScrollHdl, weld::Scrollbar&, void);
    DECL_DLLPRIVATE_LINK(    StartDragHdl, HeaderBar*, void );

    SVT_DLLPRIVATE tools::Long GetFrozenWidth() const;
diff --git a/svtools/source/brwbox/brwbox1.cxx b/svtools/source/brwbox/brwbox1.cxx
index 4eafda7..c9f0dd6 100644
--- a/svtools/source/brwbox/brwbox1.cxx
+++ b/svtools/source/brwbox/brwbox1.cxx
@@ -19,6 +19,7 @@

#include <svtools/brwbox.hxx>
#include <svtools/brwhead.hxx>
#include <svtools/scrolladaptor.hxx>
#include <o3tl/numeric.hxx>
#include <o3tl/safeint.hxx>
#include "datwin.hxx"
@@ -101,7 +102,7 @@ void BrowseBox::ConstructImpl( BrowserMode nMode )
    uRow.nSel = BROWSER_ENDOFSELECTION;

    aHScroll->SetLineSize(1);
    aHScroll->SetScrollHdl( LINK( this, BrowseBox, ScrollHdl ) );
    aHScroll->SetScrollHdl( LINK( this, BrowseBox, HorzScrollHdl ) );
    pDataWin->Show();

    SetMode( nMode );
@@ -161,7 +162,7 @@ BrowseBox::BrowseBox( vcl::Window* pParent, WinBits nBits, BrowserMode nMode )
    :Control( pParent, nBits | WB_3DLOOK )
    ,DragSourceHelper( this )
    ,DropTargetHelper( this )
    ,aHScroll( VclPtr<ScrollBar>::Create(this, WB_HSCROLL) )
    ,aHScroll( VclPtr<ScrollAdaptor>::Create(this, true) )
    // see NavigationBar ctor, here we just want to know its height
    ,aStatusBarHeight(VclPtr<MeasureStatusBar>::Create(this))
{
@@ -2181,13 +2182,10 @@ void BrowseBox::SetMode( BrowserMode nMode )
    bHLines = ( nMode & BrowserMode::HLINES ) == BrowserMode::HLINES;
    bVLines = ( nMode & BrowserMode::VLINES ) == BrowserMode::VLINES;

    constexpr WinBits nVScrollWinBits = WB_VSCROLL;
    pVScroll = ( nMode & BrowserMode::TRACKING_TIPS ) == BrowserMode::TRACKING_TIPS
                ? VclPtr<BrowserScrollBar>::Create( this, nVScrollWinBits, pDataWin.get() )
                : VclPtr<ScrollBar>::Create( this, nVScrollWinBits );
    pVScroll = VclPtr<ScrollAdaptor>::Create(this, false);
    pVScroll->SetLineSize( 1 );
    pVScroll->SetPageSize(1);
    pVScroll->SetScrollHdl( LINK( this, BrowseBox, ScrollHdl ) );
    pVScroll->SetScrollHdl( LINK( this, BrowseBox, VertScrollHdl ) );

    pDataWin->bAutoSizeLastCol =
            BrowserMode::AUTOSIZE_LASTCOL == ( nMode & BrowserMode::AUTOSIZE_LASTCOL );
diff --git a/svtools/source/brwbox/brwbox2.cxx b/svtools/source/brwbox/brwbox2.cxx
index 98eb5e8..7bcdea5 100644
--- a/svtools/source/brwbox/brwbox2.cxx
+++ b/svtools/source/brwbox/brwbox2.cxx
@@ -23,11 +23,12 @@
#include <tools/debug.hxx>
#include <svtools/brwbox.hxx>
#include <svtools/brwhead.hxx>
#include "datwin.hxx"
#include <svtools/colorcfg.hxx>
#include <svtools/scrolladaptor.hxx>
#include "datwin.hxx"
#include <vcl/commandevent.hxx>
#include <vcl/help.hxx>
#include <vcl/ptrstyle.hxx>
#include <vcl/scrbar.hxx>
#include <vcl/settings.hxx>

#include <tools/multisel.hxx>
@@ -1120,9 +1121,18 @@ void BrowseBox::UpdateScrollbars()
        ? static_cast<short>( mvCols.size() - nFirstCol )
        : static_cast<short>( nLastCol - nFirstCol );

    short nRange = std::max( nScrollCols, short(0) );
    aHScroll->SetVisibleSize( nVisibleHSize );
    aHScroll->SetRange( Range( 0, nRange ));
    if (nVisibleHSize)
    {
        short nRange = std::max( nScrollCols, short(0) );
        aHScroll->SetVisibleSize( nVisibleHSize );
        aHScroll->SetRange( Range( 0, nRange ));
    }
    else
    {
        // ensure scrollbar is shown as fully filled
        aHScroll->SetVisibleSize(1);
        aHScroll->SetRange(Range(0, 1));
    }
    if ( bNeedsHScroll && !aHScroll->IsVisible() )
        aHScroll->Show();

@@ -1251,7 +1261,6 @@ tools::Long BrowseBox::GetFrozenWidth() const
    return nWidth;
}


void BrowseBox::ColumnInserted( sal_uInt16 nPos )
{
    if ( pColSel )
@@ -1259,7 +1268,6 @@ void BrowseBox::ColumnInserted( sal_uInt16 nPos )
    UpdateScrollbars();
}


sal_uInt16 BrowseBox::FrozenColCount() const
{
    std::size_t nCol;
@@ -1270,27 +1278,39 @@ sal_uInt16 BrowseBox::FrozenColCount() const
    return nCol; //TODO: BrowserColumns::size_type -> sal_uInt16!
}


IMPL_LINK(BrowseBox, ScrollHdl, ScrollBar*, pBar, void)
IMPL_LINK(BrowseBox, VertScrollHdl, weld::Scrollbar&, rScrollbar, void)
{
    if ( pBar->GetDelta() == 0 )
        return;
    auto nCurScrollRow = nTopRow;
    auto nPos = rScrollbar.adjustment_get_value();
    ScrollRows(nPos - nCurScrollRow);

    if ( pBar == aHScroll.get() )
        ScrollColumns( aHScroll->GetDelta() );
    if ( pBar == pVScroll )
        ScrollRows( pVScroll->GetDelta() );
    bool bShowTooltip = ((m_nCurrentMode & BrowserMode::TRACKING_TIPS) == BrowserMode::TRACKING_TIPS);
    if (bShowTooltip &&
        rScrollbar.get_scroll_type() == ScrollType::Drag &&
        Help::IsQuickHelpEnabled())
    {
        OUString aTip = OUString::number(nPos) + "/";
        if (!pDataWin->GetRealRowCount().isEmpty())
            aTip += pDataWin->GetRealRowCount();
        else
            aTip += OUString::number(rScrollbar.adjustment_get_upper());
        tools::Rectangle aRect(GetPointerPosPixel(), Size(GetTextWidth(aTip), GetTextHeight()));
        Help::ShowQuickHelp(this, aRect, aTip);
    }
}

IMPL_LINK(BrowseBox, HorzScrollHdl, weld::Scrollbar&, rScrollbar, void)
{
    auto nCurScrollCol = nFirstCol - FrozenColCount();
    ScrollColumns(rScrollbar.adjustment_get_value() - nCurScrollCol);
}

IMPL_LINK( BrowseBox, StartDragHdl, HeaderBar*, pBar, void )
{
    pBar->SetDragSize( pDataWin->GetOutputSizePixel().Height() );
}


// usually only the first column was resized

void BrowseBox::MouseButtonDown( const MouseEvent& rEvt )
{

diff --git a/svtools/source/brwbox/datwin.cxx b/svtools/source/brwbox/datwin.cxx
index 331fd25..2eea4a5 100644
--- a/svtools/source/brwbox/datwin.cxx
+++ b/svtools/source/brwbox/datwin.cxx
@@ -20,6 +20,7 @@
#include "datwin.hxx"
#include <o3tl/numeric.hxx>
#include <svtools/brwhead.hxx>
#include <svtools/scrolladaptor.hxx>
#include <utility>
#include <vcl/commandevent.hxx>
#include <vcl/help.hxx>
@@ -635,7 +636,6 @@ void BrowserDataWin::DoOutstandingInvalidations()
    aInvalidRegion.clear();
}


void BrowserDataWin::Invalidate( InvalidateFlags nFlags )
{
    if ( !GetUpdateMode() )
@@ -656,40 +656,4 @@ void BrowserDataWin::Invalidate( const tools::Rectangle& rRect, InvalidateFlags 
        Window::Invalidate( rRect, nFlags );
}

BrowserScrollBar::~BrowserScrollBar()
{
    disposeOnce();
}

void BrowserScrollBar::dispose()
{
    _pDataWin.clear();
    ScrollBar::dispose();
}

void BrowserScrollBar::Tracking( const TrackingEvent& rTEvt )
{
    tools::Long nPos = GetThumbPos();
    if ( nPos != _nLastPos )
    {
        OUString aTip = OUString::number(nPos) + "/";
        if ( !_pDataWin->GetRealRowCount().isEmpty() )
            aTip += _pDataWin->GetRealRowCount();
        else
            aTip += OUString::number(GetRangeMax());

        tools::Rectangle aRect(GetPointerPosPixel(), Size(GetTextWidth(aTip), GetTextHeight()));
        Help::ShowQuickHelp(this, aRect, aTip);
        _nLastPos = nPos;
    }

    ScrollBar::Tracking( rTEvt );
}

void BrowserScrollBar::EndScroll()
{
    Help::HideBalloonAndQuickHelp();
    ScrollBar::EndScroll();
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svtools/source/brwbox/datwin.hxx b/svtools/source/brwbox/datwin.hxx
index 460712e..acabcc0 100644
--- a/svtools/source/brwbox/datwin.hxx
+++ b/svtools/source/brwbox/datwin.hxx
@@ -79,30 +79,6 @@ public:
    void                ZoomChanged(const Fraction& rNewZoom);
};


class BrowserScrollBar: public ScrollBar
{
    tools::Long _nLastPos;
    VclPtr<BrowserDataWin> _pDataWin;

public:
                    BrowserScrollBar( vcl::Window* pParent, WinBits nStyle,
                                      BrowserDataWin *pDataWin )
                    :   ScrollBar( pParent, nStyle ),
                        _nLastPos( std::numeric_limits<tools::Long>::max() ),
                        _pDataWin( pDataWin )
                    {}
   virtual          ~BrowserScrollBar() override;
   virtual void     dispose() override;
                    //ScrollBar( vcl::Window* pParent, const ResId& rResId );

    virtual void    Tracking( const TrackingEvent& rTEvt ) override;
    virtual void    EndScroll() override;
};


void InitSettings_Impl( vcl::Window *pWin );



/* vim:set shiftwidth=4 softtabstop=4 expandtab: */