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