sc/source/ui/inc/prevwsh.hxx  |   13 +++++++++----
 sc/source/ui/view/prevwsh.cxx |   32 +++++++++++++++++++++++++-------
 2 files changed, 34 insertions(+), 11 deletions(-)

New commits:
commit 6819707cbc8e7257a694623a6331c3c6f965fa94
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Fri Aug 5 10:25:43 2022 +0100
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Fri Aug 5 14:57:37 2022 +0200

    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 <caol...@redhat.com>
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/sc/source/ui/inc/prevwsh.hxx b/sc/source/ui/inc/prevwsh.hxx
index 5f306cb1ce77..94af0b9a518c 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 4552062b624a..da04cffd61e0 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() );
     }
 

Reply via email to