include/svtools/scrolladaptor.hxx | 4 ++ sc/source/ui/inc/tabview.hxx | 22 +++++++----- sc/source/ui/view/tabview.cxx | 54 +++++++++++++++++-------------- sc/source/ui/view/tabview4.cxx | 7 +--- sc/source/ui/view/tabview5.cxx | 8 ++-- svtools/source/control/scrolladaptor.cxx | 4 ++ 6 files changed, 59 insertions(+), 40 deletions(-)
New commits: commit 7b20a1b0736825c9c934288428e6e581f79971e2 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Thu Aug 4 16:32:10 2022 +0100 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Fri Aug 5 09:52:50 2022 +0200 tdf#117388 use native scrollbar under gtk in calc document Change-Id: I436067b4f2b463fe9a5d6789cf96f906891757bd Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137810 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/include/svtools/scrolladaptor.hxx b/include/svtools/scrolladaptor.hxx index 8e94d3ee603d..1214b2c854fa 100644 --- a/include/svtools/scrolladaptor.hxx +++ b/include/svtools/scrolladaptor.hxx @@ -58,6 +58,10 @@ public: // what is it bool IsHoriScroll() const { return m_bHori; } + ScrollType GetScrollType() const; + + virtual void EnableRTL(bool bEnable = true) override; + virtual tools::Long DoScroll(tools::Long nNewPos) override; virtual bool Inactive() const override { return !m_xScrollBar->get_sensitive(); } diff --git a/sc/source/ui/inc/tabview.hxx b/sc/source/ui/inc/tabview.hxx index 81151f10fe48..97c6e9681423 100644 --- a/sc/source/ui/inc/tabview.hxx +++ b/sc/source/ui/inc/tabview.hxx @@ -22,6 +22,7 @@ #include <array> #include <memory> +#include <svtools/scrolladaptor.hxx> #include <vcl/scrbar.hxx> #include <vcl/help.hxx> @@ -147,10 +148,10 @@ private: VclPtr<ScTabSplitter> pHSplitter; VclPtr<ScTabSplitter> pVSplitter; VclPtr<ScTabControl> pTabControl; - VclPtr<ScrollBar> aVScrollTop; - VclPtr<ScrollBar> aVScrollBottom; // initially visible - VclPtr<ScrollBar> aHScrollLeft; // initially visible - VclPtr<ScrollBar> aHScrollRight; + VclPtr<ScrollAdaptor> aVScrollTop; + VclPtr<ScrollAdaptor> aVScrollBottom; // initially visible + VclPtr<ScrollAdaptor> aHScrollLeft; // initially visible + VclPtr<ScrollAdaptor> aHScrollRight; VclPtr<ScCornerButton> aCornerButton; VclPtr<ScCornerButton> aTopButton; VclPtr<ScrollBarBox> aScrollBarBox; @@ -219,9 +220,12 @@ private: void DoAddWin( ScGridWindow* pWin ); - void InitScrollBar( ScrollBar& rScrollBar, tools::Long nMaxVal ); - DECL_LINK(ScrollHdl, ScrollBar*, void ); - DECL_LINK(EndScrollHdl, ScrollBar*, void ); + void InitScrollBar(ScrollAdaptor& rScrollBar, tools::Long nMaxVal, const Link<weld::Scrollbar&, void>& rLink); + DECL_LINK(HScrollLeftHdl, weld::Scrollbar&, void ); + DECL_LINK(HScrollRightHdl, weld::Scrollbar&, void ); + DECL_LINK(VScrollTopHdl, weld::Scrollbar&, void ); + DECL_LINK(VScrollBottomHdl, weld::Scrollbar&, void ); + void ScrollHdl(ScrollAdaptor* rScrollBar); DECL_LINK(SplitHdl, Splitter*, void); void DoHSplit(tools::Long nSplitPos); @@ -231,8 +235,8 @@ private: void UpdateVarZoom(); - static void SetScrollBar( ScrollBar& rScroll, tools::Long nRangeMax, tools::Long nVisible, tools::Long nPos, bool bLayoutRTL ); - static tools::Long GetScrollBarPos( const ScrollBar& rScroll ); + static void SetScrollBar( ScrollAdaptor& rScroll, tools::Long nRangeMax, tools::Long nVisible, tools::Long nPos, bool bLayoutRTL ); + static tools::Long GetScrollBarPos( const ScrollAdaptor& rScroll ); void GetAreaMoveEndPosition(SCCOL nMovX, SCROW nMovY, ScFollowMode eMode, SCCOL& rAreaX, SCROW& rAreaY, ScFollowMode& rMode); diff --git a/sc/source/ui/view/tabview.cxx b/sc/source/ui/view/tabview.cxx index c737317764dc..45764e6cdd6d 100644 --- a/sc/source/ui/view/tabview.cxx +++ b/sc/source/ui/view/tabview.cxx @@ -176,10 +176,10 @@ ScTabView::ScTabView( vcl::Window* pParent, ScDocShell& rDocSh, ScTabViewShell* aViewData( rDocSh, pViewShell ), aFunctionSet( &aViewData ), aHdrFunc( &aViewData ), - aVScrollTop( VclPtr<ScrollBar>::Create( pFrameWin, WinBits( WB_VSCROLL | WB_DRAG ) ) ), - aVScrollBottom( VclPtr<ScrollBar>::Create( pFrameWin, WinBits( WB_VSCROLL | WB_DRAG ) ) ), - aHScrollLeft( VclPtr<ScrollBar>::Create( pFrameWin, WinBits( WB_HSCROLL | WB_DRAG ) ) ), - aHScrollRight( VclPtr<ScrollBar>::Create( pFrameWin, WinBits( WB_HSCROLL | WB_DRAG ) ) ), + aVScrollTop( VclPtr<ScrollAdaptor>::Create( pFrameWin, false ) ), + aVScrollBottom( VclPtr<ScrollAdaptor>::Create( pFrameWin, false ) ), + aHScrollLeft( VclPtr<ScrollAdaptor>::Create( pFrameWin, true ) ), + aHScrollRight( VclPtr<ScrollAdaptor>::Create( pFrameWin, true ) ), aCornerButton( VclPtr<ScCornerButton>::Create( pFrameWin, &aViewData ) ), aTopButton( VclPtr<ScCornerButton>::Create( pFrameWin, &aViewData ) ), aScrollBarBox( VclPtr<ScrollBarBox>::Create( pFrameWin, WB_SIZEABLE ) ), @@ -221,21 +221,19 @@ ScTabView::ScTabView( vcl::Window* pParent, ScDocShell& rDocSh, ScTabViewShell* Init(); } -void ScTabView::InitScrollBar( ScrollBar& rScrollBar, tools::Long nMaxVal ) +void ScTabView::InitScrollBar(ScrollAdaptor& rScrollBar, tools::Long nMaxVal, const Link<weld::Scrollbar&, void>& rLink) { rScrollBar.SetRange( Range( 0, nMaxVal ) ); rScrollBar.SetLineSize( 1 ); rScrollBar.SetPageSize( 1 ); // is queried separately rScrollBar.SetVisibleSize( 10 ); // is reset by Resize - rScrollBar.SetScrollHdl( LINK(this, ScTabView, ScrollHdl) ); - rScrollBar.SetEndScrollHdl( LINK(this, ScTabView, EndScrollHdl) ); + rScrollBar.SetScrollHdl(rLink); rScrollBar.EnableRTL( aViewData.GetDocument().IsLayoutRTL( aViewData.GetTabNo() ) ); } // Scroll-Timer - void ScTabView::SetTimer( ScGridWindow* pWin, const MouseEvent& rMEvt ) { pTimerWindow = pWin; @@ -989,24 +987,35 @@ bool ScTabView::ScrollCommand( const CommandEvent& rCEvt, ScSplitPos ePos ) { ScHSplitPos eHPos = WhichH(ePos); ScVSplitPos eVPos = WhichV(ePos); - ScrollBar* pHScroll = ( eHPos == SC_SPLIT_LEFT ) ? aHScrollLeft.get() : aHScrollRight.get(); - ScrollBar* pVScroll = ( eVPos == SC_SPLIT_TOP ) ? aVScrollTop.get() : aVScrollBottom.get(); + ScrollAdaptor* pHScroll = ( eHPos == SC_SPLIT_LEFT ) ? aHScrollLeft.get() : aHScrollRight.get(); + ScrollAdaptor* pVScroll = ( eVPos == SC_SPLIT_TOP ) ? aVScrollTop.get() : aVScrollBottom.get(); if ( pGridWin[ePos] ) bDone = pGridWin[ePos]->HandleScrollCommand( rCEvt, pHScroll, pVScroll ); } return bDone; } -IMPL_LINK_NOARG(ScTabView, EndScrollHdl, ScrollBar*, void) +IMPL_LINK_NOARG(ScTabView, HScrollLeftHdl, weld::Scrollbar&, void) { - if ( bDragging ) - { - UpdateScrollBars(); - bDragging = false; - } + ScrollHdl(aHScrollLeft.get()); } -IMPL_LINK( ScTabView, ScrollHdl, ScrollBar*, pScroll, void ) +IMPL_LINK_NOARG(ScTabView, HScrollRightHdl, weld::Scrollbar&, void) +{ + ScrollHdl(aHScrollRight.get()); +} + +IMPL_LINK_NOARG(ScTabView, VScrollTopHdl, weld::Scrollbar&, void) +{ + ScrollHdl(aVScrollTop.get()); +} + +IMPL_LINK_NOARG(ScTabView, VScrollBottomHdl, weld::Scrollbar&, void) +{ + ScrollHdl(aVScrollBottom.get()); +} + +void ScTabView::ScrollHdl(ScrollAdaptor* pScroll) { bool bHoriz = ( pScroll == aHScrollLeft.get() || pScroll == aHScrollRight.get() ); tools::Long nViewPos; @@ -1019,7 +1028,7 @@ IMPL_LINK( ScTabView, ScrollHdl, ScrollBar*, pScroll, void ) bool bLayoutRTL = aViewData.GetDocument().IsLayoutRTL( aViewData.GetTabNo() ); - ScrollType eType = pScroll->GetType(); + ScrollType eType = pScroll->GetScrollType(); if ( eType == ScrollType::Drag ) { if (!bDragging) @@ -1085,6 +1094,8 @@ IMPL_LINK( ScTabView, ScrollHdl, ScrollBar*, pScroll, void ) Help::ShowQuickHelp(pScroll->GetParent(), aRect, aHelpStr, nAlign); } } + else + bDragging = false; tools::Long nDelta(0); switch ( eType ) diff --git a/sc/source/ui/view/tabview4.cxx b/sc/source/ui/view/tabview4.cxx index 5238947a88f3..345ae9335256 100644 --- a/sc/source/ui/view/tabview4.cxx +++ b/sc/source/ui/view/tabview4.cxx @@ -340,7 +340,7 @@ void ScTabView::InitRefMode( SCCOL nCurX, SCROW nCurY, SCTAB nCurZ, ScRefType eT } } -void ScTabView::SetScrollBar( ScrollBar& rScroll, tools::Long nRangeMax, tools::Long nVisible, tools::Long nPos, bool bLayoutRTL ) +void ScTabView::SetScrollBar( ScrollAdaptor& rScroll, tools::Long nRangeMax, tools::Long nVisible, tools::Long nPos, bool bLayoutRTL ) { if ( nVisible == 0 ) nVisible = 1; // #i59893# don't use visible size 0 @@ -352,14 +352,13 @@ void ScTabView::SetScrollBar( ScrollBar& rScroll, tools::Long nRangeMax, tools:: rScroll.EnableRTL( bLayoutRTL ); } -tools::Long ScTabView::GetScrollBarPos( const ScrollBar& rScroll ) +tools::Long ScTabView::GetScrollBarPos( const ScrollAdaptor& rScroll ) { return rScroll.GetThumbPos(); } // UpdateScrollBars - set visible area and scroll width of scroll bars - -static tools::Long lcl_UpdateBar( ScrollBar& rScroll, SCCOLROW nSize ) // Size = (complete) cells +static tools::Long lcl_UpdateBar( ScrollAdaptor& rScroll, SCCOLROW nSize ) // Size = (complete) cells { tools::Long nOldPos; tools::Long nNewPos; diff --git a/sc/source/ui/view/tabview5.cxx b/sc/source/ui/view/tabview5.cxx index 6db05da9c94e..20c52ea03bf4 100644 --- a/sc/source/ui/view/tabview5.cxx +++ b/sc/source/ui/view/tabview5.cxx @@ -107,10 +107,10 @@ void ScTabView::Init() explicitly because the parent frame window is already RTL disabled. */ pTabControl->EnableRTL( AllSettings::GetLayoutRTL() ); - InitScrollBar( *aHScrollLeft, aViewData.GetDocument().MaxCol()+1 ); - InitScrollBar( *aHScrollRight, aViewData.GetDocument().MaxCol()+1 ); - InitScrollBar( *aVScrollTop, aViewData.GetDocument().MaxRow()+1 ); - InitScrollBar( *aVScrollBottom, aViewData.GetDocument().MaxRow()+1 ); + InitScrollBar( *aHScrollLeft, aViewData.GetDocument().MaxCol()+1, LINK(this, ScTabView, HScrollLeftHdl) ); + InitScrollBar( *aHScrollRight, aViewData.GetDocument().MaxCol()+1, LINK(this, ScTabView, HScrollRightHdl) ); + InitScrollBar( *aVScrollTop, aViewData.GetDocument().MaxRow()+1, LINK(this, ScTabView, VScrollTopHdl) ); + InitScrollBar( *aVScrollBottom, aViewData.GetDocument().MaxRow()+1, LINK(this, ScTabView, VScrollBottomHdl) ); /* #i97900# scrollbars remain in correct RTL mode, needed mirroring etc. is now handled correctly at the respective places. */ diff --git a/svtools/source/control/scrolladaptor.cxx b/svtools/source/control/scrolladaptor.cxx index ebf9d9dea14a..492adf403607 100644 --- a/svtools/source/control/scrolladaptor.cxx +++ b/svtools/source/control/scrolladaptor.cxx @@ -95,6 +95,10 @@ void ScrollAdaptor::SetThumbPos(tools::Long nThumbPos) tools::Long ScrollAdaptor::GetThumbPos() const { return m_xScrollBar->adjustment_get_value(); } +ScrollType ScrollAdaptor::GetScrollType() const { return m_xScrollBar->get_scroll_type(); } + +void ScrollAdaptor::EnableRTL(bool bEnable) { m_xScrollBar->set_direction(bEnable); } + void ScrollAdaptor::SetScrollHdl(const Link<weld::Scrollbar&, void>& rLink) { m_aLink = rLink; commit 8c4e8818fe9f5ac1f6cdf908299cc109d67f1e50 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Thu Aug 4 16:38:47 2022 +0100 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Fri Aug 5 09:52:36 2022 +0200 nDelta overwritten on all branches except default which claims to only exist to avoid a compiler warning. So drop GetDelta() call and fold the default into the Drag case instead Change-Id: I978bb38ccff34687bb70453abe416a9c73228655 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137808 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/sc/source/ui/view/tabview.cxx b/sc/source/ui/view/tabview.cxx index 898181c49f6e..c737317764dc 100644 --- a/sc/source/ui/view/tabview.cxx +++ b/sc/source/ui/view/tabview.cxx @@ -1086,7 +1086,7 @@ IMPL_LINK( ScTabView, ScrollHdl, ScrollBar*, pScroll, void ) } } - tools::Long nDelta = pScroll->GetDelta(); + tools::Long nDelta(0); switch ( eType ) { case ScrollType::LineUp: @@ -1109,6 +1109,7 @@ IMPL_LINK( ScTabView, ScrollHdl, ScrollBar*, pScroll, void ) if ( pScroll == aVScrollBottom.get() ) nDelta = aViewData.VisibleCellsY( SC_SPLIT_BOTTOM ); if (nDelta==0) nDelta=1; break; + default: // added to avoid warnings case ScrollType::Drag: { // only scroll in the correct direction, do not jitter around hidden ranges @@ -1133,10 +1134,6 @@ IMPL_LINK( ScTabView, ScrollHdl, ScrollBar*, pScroll, void ) nPrevDragPos = nScrollPos; } break; - default: - { - // added to avoid warnings - } } if (nDelta)