tdf#117388 use native scrollbar under gtk in calc print preview

This changes the scrolling to happen immediately during scrolling and
not when the user releases the scrollbar at the end.

Change-Id: Id8fdb8205964416ad25a99e2c71b061cabee8388
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137853
Tested-by: Caolán McNamara <caolanm@redhat.com>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/sc/source/ui/inc/prevwsh.hxx b/sc/source/ui/inc/prevwsh.hxx
index 5f306cb..94af0b9 100644
--- a/sc/source/ui/inc/prevwsh.hxx
+++ b/sc/source/ui/inc/prevwsh.hxx
@@ -24,6 +24,7 @@

#include <sfx2/viewsh.hxx>
#include <sfx2/zoomitem.hxx>
#include <svtools/scrolladaptor.hxx>
#include <vcl/syswin.hxx>

#include <shellids.hxx>
@@ -42,19 +43,23 @@ class SC_DLLPUBLIC ScPreviewShell final : public SfxViewShell

    VclPtr<SystemWindow>   mpFrameWindow;
    VclPtr<ScPreview>      pPreview;               // Output window
    VclPtr<ScrollBar>      pHorScroll;
    VclPtr<ScrollBar>      pVerScroll;
    VclPtr<ScrollAdaptor>  pHorScroll;
    VclPtr<ScrollAdaptor>  pVerScroll;
    VclPtr<vcl::Window>    pCorner;

    TriState        nSourceDesignMode;      // form design mode from TabView
    SvxZoomType     eZoom;
    tools::Long            nMaxVertPos;
    tools::Long     nMaxVertPos;
    tools::Long     nPrevHThumbPos;
    tools::Long     nPrevVThumbPos;

    std::unique_ptr<SfxBroadcaster> pAccessibilityBroadcaster;
    bool            GetPageSize( Size& aPageSize );
private:
    void            Construct( vcl::Window* pParent );
    DECL_DLLPRIVATE_LINK( ScrollHandler, ScrollBar*, void );
    DECL_DLLPRIVATE_LINK( HorzScrollHandler, weld::Scrollbar&, void );
    DECL_DLLPRIVATE_LINK( VertScrollHandler, weld::Scrollbar&, void );
    void ScrollHandler(ScrollAdaptor* pScrollBar);
    DECL_DLLPRIVATE_LINK( CloseHdl, SystemWindow&, void);
    void            DoScroll( sal_uInt16 nMode );
    void            ExitPreview();
diff --git a/sc/source/ui/view/prevwsh.cxx b/sc/source/ui/view/prevwsh.cxx
index 4552062..da04cff 100644
--- a/sc/source/ui/view/prevwsh.cxx
+++ b/sc/source/ui/view/prevwsh.cxx
@@ -121,14 +121,14 @@ void ScPreviewShell::Construct( vcl::Window* pParent )

    pCorner = VclPtr<ScrollBarBox>::Create( pParent, WB_SIZEABLE );

    pHorScroll = VclPtr<ScrollBar>::Create(pParent, WB_HSCROLL );
    pVerScroll = VclPtr<ScrollBar>::Create(pParent, WB_VSCROLL);
    pHorScroll = VclPtr<ScrollAdaptor>::Create(pParent, true);
    pVerScroll = VclPtr<ScrollAdaptor>::Create(pParent, false);

    // RTL: no mirroring for horizontal scrollbars
    pHorScroll->EnableRTL( false );

    pHorScroll->SetEndScrollHdl( LINK( this, ScPreviewShell, ScrollHandler ) );
    pVerScroll->SetEndScrollHdl( LINK( this, ScPreviewShell, ScrollHandler ) );
    pHorScroll->SetScrollHdl(LINK(this, ScPreviewShell, HorzScrollHandler));
    pVerScroll->SetScrollHdl(LINK(this, ScPreviewShell, VertScrollHandler));

    pPreview = VclPtr<ScPreview>::Create( pParent, pDocShell, this );

@@ -152,7 +152,9 @@ ScPreviewShell::ScPreviewShell( SfxViewFrame* pViewFrame,
    pDocShell( static_cast<ScDocShell*>(pViewFrame->GetObjectShell()) ),
    mpFrameWindow(nullptr),
    nSourceDesignMode( TRISTATE_INDET ),
    nMaxVertPos(0)
    nMaxVertPos(0),
    nPrevHThumbPos(0),
    nPrevVThumbPos(0)
{
    Construct( &pViewFrame->GetWindow() );
    SfxShell::SetContextName(vcl::EnumContext::GetContextName(vcl::EnumContext::Context::Printpreview));
@@ -358,6 +360,7 @@ void ScPreviewShell::UpdateScrollBars()
            pPreview->SetXOffset(nMaxPos);
        }
        pHorScroll->SetThumbPos( aOfs.X() );
        nPrevHThumbPos = pHorScroll->GetThumbPos();
    }

    if( !pVerScroll )
@@ -394,12 +397,22 @@ void ScPreviewShell::UpdateScrollBars()
        pPreview->SetYOffset( nMaxVertPos );
        pVerScroll->SetThumbPos( aOfs.Y() );
    }
    nPrevVThumbPos = pVerScroll->GetThumbPos();
}

IMPL_LINK( ScPreviewShell, ScrollHandler, ScrollBar*, pScroll, void )
IMPL_LINK_NOARG(ScPreviewShell, HorzScrollHandler, weld::Scrollbar&, void)
{
    ScrollHandler(pHorScroll);
}

IMPL_LINK_NOARG(ScPreviewShell, VertScrollHandler, weld::Scrollbar&, void)
{
    ScrollHandler(pVerScroll);
}

void ScPreviewShell::ScrollHandler(ScrollAdaptor* pScroll)
{
    tools::Long nPos           = pScroll->GetThumbPos();
    tools::Long nDelta         = pScroll->GetDelta();
    tools::Long nMaxRange      = pScroll->GetRangeMax();
    tools::Long nTotalPages    = pPreview->GetTotalPages();
    tools::Long nPageNo        = 0;
@@ -421,6 +434,9 @@ IMPL_LINK( ScPreviewShell, ScrollHandler, ScrollBar*, pScroll, void )

    bool bHoriz = ( pScroll == pHorScroll );

    tools::Long nDelta = bHoriz ? (pHorScroll->GetThumbPos() - nPrevHThumbPos)
                                : (pVerScroll->GetThumbPos() - nPrevVThumbPos);

    if( bHoriz )
        pPreview->SetXOffset( nPos );
    else
@@ -1110,6 +1126,7 @@ void ScPreviewShell::DoScroll( sal_uInt16 nMode )
        if( aCurPos.Y() != aPrevPos.Y() )
        {
            pVerScroll->SetThumbPos( aCurPos.Y() );
            nPrevVThumbPos = pVerScroll->GetThumbPos();
            pPreview->SetYOffset( aCurPos.Y() );
        }
    }
@@ -1117,6 +1134,7 @@ void ScPreviewShell::DoScroll( sal_uInt16 nMode )
    if( aCurPos.X() != aPrevPos.X() )
    {
        pHorScroll->SetThumbPos( aCurPos.X() );
        nPrevHThumbPos = pHorScroll->GetThumbPos();
        pPreview->SetXOffset( aCurPos.X() );
    }