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