diff options
author | Caolán McNamara <caolanm@redhat.com> | 2019-02-23 13:42:55 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2019-02-27 22:18:22 +0100 |
commit | cfe41185bc8514949d1938ee1d7cd56968682510 (patch) | |
tree | 8d990aae964cf0ed6ed49c06a86133057481ae7d /vcl | |
parent | 3e1306c283c2aca372a8384801a1e206f208e1cb (diff) |
weld LicenseDialogImpl
Change-Id: I4b2dbd2446779e7179d2b79bf81cc2ff879377bf
Reviewed-on: https://gerrit.libreoffice.org/68389
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/source/app/customweld.cxx | 12 | ||||
-rw-r--r-- | vcl/source/app/salvtables.cxx | 116 | ||||
-rw-r--r-- | vcl/source/edit/vclmedit.cxx | 155 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkinst.cxx | 373 |
4 files changed, 397 insertions, 259 deletions
diff --git a/vcl/source/app/customweld.cxx b/vcl/source/app/customweld.cxx index 110d2e727a0c..058ee0b7671d 100644 --- a/vcl/source/app/customweld.cxx +++ b/vcl/source/app/customweld.cxx @@ -46,19 +46,19 @@ IMPL_LINK(CustomWeld, DoPaint, weld::DrawingArea::draw_args, aPayload, void) m_rWidgetController.Paint(aPayload.first, aPayload.second); } -IMPL_LINK(CustomWeld, DoMouseButtonDown, const MouseEvent&, rMEvt, void) +IMPL_LINK(CustomWeld, DoMouseButtonDown, const MouseEvent&, rMEvt, bool) { - m_rWidgetController.MouseButtonDown(rMEvt); + return m_rWidgetController.MouseButtonDown(rMEvt); } -IMPL_LINK(CustomWeld, DoMouseMove, const MouseEvent&, rMEvt, void) +IMPL_LINK(CustomWeld, DoMouseMove, const MouseEvent&, rMEvt, bool) { - m_rWidgetController.MouseMove(rMEvt); + return m_rWidgetController.MouseMove(rMEvt); } -IMPL_LINK(CustomWeld, DoMouseButtonUp, const MouseEvent&, rMEvt, void) +IMPL_LINK(CustomWeld, DoMouseButtonUp, const MouseEvent&, rMEvt, bool) { - m_rWidgetController.MouseButtonUp(rMEvt); + return m_rWidgetController.MouseButtonUp(rMEvt); } IMPL_LINK_NOARG(CustomWeld, DoGetFocus, weld::Widget&, void) { m_rWidgetController.GetFocus(); } diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index d865351bec06..ce61bf6c69e5 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -499,6 +499,24 @@ public: weld::Widget::connect_size_allocate(rLink); } + virtual void connect_mouse_press(const Link<const MouseEvent&, bool>& rLink) override + { + ensure_event_listener(); + weld::Widget::connect_mouse_press(rLink); + } + + virtual void connect_mouse_move(const Link<const MouseEvent&, bool>& rLink) override + { + ensure_event_listener(); + weld::Widget::connect_mouse_move(rLink); + } + + virtual void connect_mouse_release(const Link<const MouseEvent&, bool>& rLink) override + { + ensure_event_listener(); + weld::Widget::connect_mouse_release(rLink); + } + virtual void connect_key_press(const Link<const KeyEvent&, bool>& rLink) override { ensure_key_listener(); @@ -604,6 +622,21 @@ void SalInstanceWidget::HandleEventListener(VclWindowEvent& rEvent) m_aFocusOutHdl.Call(*this); else if (rEvent.GetId() == VclEventId::WindowResize) m_aSizeAllocateHdl.Call(m_xWidget->GetSizePixel()); + else if (rEvent.GetId() == VclEventId::WindowMouseButtonDown) + { + const MouseEvent* pMouseEvent = static_cast<const MouseEvent*>(rEvent.GetData()); + m_aMousePressHdl.Call(*pMouseEvent); + } + else if (rEvent.GetId() == VclEventId::WindowMouseButtonUp) + { + const MouseEvent* pMouseEvent = static_cast<const MouseEvent*>(rEvent.GetData()); + m_aMouseReleaseHdl.Call(*pMouseEvent); + } + else if (rEvent.GetId() == VclEventId::WindowMouseMove) + { + const MouseEvent* pMouseEvent = static_cast<const MouseEvent*>(rEvent.GetData()); + m_aMouseMotionHdl.Call(*pMouseEvent); + } } bool SalInstanceWidget::HandleKeyEventListener(VclWindowEvent& rEvent) @@ -624,7 +657,6 @@ bool SalInstanceWidget::HandleKeyEventListener(VclWindowEvent& rEvent) return false; } - IMPL_LINK(SalInstanceWidget, EventListener, VclWindowEvent&, rEvent, void) { HandleEventListener(rEvent); @@ -1256,11 +1288,11 @@ public: } }; -IMPL_LINK_NOARG(SalInstanceScrolledWindow, VscrollHdl, ScrollBar*, void) +IMPL_LINK(SalInstanceScrolledWindow, VscrollHdl, ScrollBar*, pScrollBar, void) { signal_vadjustment_changed(); if (!m_bUserManagedScrolling) - m_aOrigVScrollHdl.Call(&m_xScrolledWindow->getVertScrollBar()); + m_aOrigVScrollHdl.Call(pScrollBar); } IMPL_LINK_NOARG(SalInstanceScrolledWindow, HscrollHdl, ScrollBar*, void) @@ -3241,14 +3273,19 @@ class SalInstanceTextView : public SalInstanceContainer, public virtual weld::Te { private: VclPtr<VclMultiLineEdit> m_xTextView; + Link<ScrollBar*,void> m_aOrigVScrollHdl; DECL_LINK(ChangeHdl, Edit&, void); + DECL_LINK(VscrollHdl, ScrollBar*, void); public: SalInstanceTextView(VclMultiLineEdit* pTextView, SalInstanceBuilder* pBuilder, bool bTakeOwnership) : SalInstanceContainer(pTextView, pBuilder, bTakeOwnership) , m_xTextView(pTextView) { m_xTextView->SetModifyHdl(LINK(this, SalInstanceTextView, ChangeHdl)); + ScrollBar& rVertScrollBar = m_xTextView->GetVScrollBar(); + m_aOrigVScrollHdl = rVertScrollBar.GetScrollHdl(); + rVertScrollBar.SetScrollHdl(LINK(this, SalInstanceTextView, VscrollHdl)); } virtual void set_text(const OUString& rText) override @@ -3299,12 +3336,54 @@ public: m_xTextView->SetControlFont(aFont); } + virtual int vadjustment_get_value() const override + { + ScrollBar& rVertScrollBar = m_xTextView->GetVScrollBar(); + return rVertScrollBar.GetThumbPos(); + } + + virtual void vadjustment_set_value(int value) override + { + ScrollBar& rVertScrollBar = m_xTextView->GetVScrollBar(); + rVertScrollBar.SetThumbPos(value); + m_aOrigVScrollHdl.Call(&rVertScrollBar); + } + + virtual int vadjustment_get_upper() const override + { + ScrollBar& rVertScrollBar = m_xTextView->GetVScrollBar(); + return rVertScrollBar.GetRangeMax(); + } + + virtual int vadjustment_get_lower() const override + { + ScrollBar& rVertScrollBar = m_xTextView->GetVScrollBar(); + return rVertScrollBar.GetRangeMin(); + } + + virtual int vadjustment_get_page_size() const override + { + ScrollBar& rVertScrollBar = m_xTextView->GetVScrollBar(); + return rVertScrollBar.GetVisibleSize(); + } + virtual ~SalInstanceTextView() override { - m_xTextView->SetModifyHdl(Link<Edit&, void>()); + if (!m_xTextView->IsDisposed()) + { + m_xTextView->SetModifyHdl(Link<Edit&, void>()); + ScrollBar& rVertScrollBar = m_xTextView->GetVScrollBar(); + rVertScrollBar.SetScrollHdl(m_aOrigVScrollHdl); + } } }; +IMPL_LINK(SalInstanceTextView, VscrollHdl, ScrollBar*, pScrollBar, void) +{ + signal_vadjustment_changed(); + m_aOrigVScrollHdl.Call(pScrollBar); +} + IMPL_LINK_NOARG(SalInstanceTextView, ChangeHdl, Edit&, void) { signal_changed(); @@ -3354,9 +3433,9 @@ private: typedef std::pair<vcl::RenderContext&, const tools::Rectangle&> target_and_area; DECL_LINK(PaintHdl, target_and_area, void); DECL_LINK(ResizeHdl, const Size&, void); - DECL_LINK(MousePressHdl, const MouseEvent&, void); - DECL_LINK(MouseMoveHdl, const MouseEvent&, void); - DECL_LINK(MouseReleaseHdl, const MouseEvent&, void); + DECL_LINK(MousePressHdl, const MouseEvent&, bool); + DECL_LINK(MouseMoveHdl, const MouseEvent&, bool); + DECL_LINK(MouseReleaseHdl, const MouseEvent&, bool); DECL_LINK(KeyPressHdl, const KeyEvent&, bool); DECL_LINK(KeyReleaseHdl, const KeyEvent&, bool); DECL_LINK(StyleUpdatedHdl, VclDrawingArea&, void); @@ -3368,7 +3447,10 @@ private: // in VclDrawingArea virtual void HandleEventListener(VclWindowEvent& rEvent) override { - if (rEvent.GetId() == VclEventId::WindowResize) + if (rEvent.GetId() == VclEventId::WindowResize || + rEvent.GetId() == VclEventId::WindowMouseButtonDown || + rEvent.GetId() == VclEventId::WindowMouseButtonUp || + rEvent.GetId() == VclEventId::WindowMouseMove) { return; } @@ -3471,9 +3553,9 @@ public: m_xDrawingArea->SetQueryTooltipHdl(Link<tools::Rectangle&, OUString>()); m_xDrawingArea->SetPopupMenuHdl(Link<const Point&, bool>()); m_xDrawingArea->SetStyleUpdatedHdl(Link<VclDrawingArea&, void>()); - m_xDrawingArea->SetMousePressHdl(Link<const MouseEvent&, void>()); - m_xDrawingArea->SetMouseMoveHdl(Link<const MouseEvent&, void>()); - m_xDrawingArea->SetMouseReleaseHdl(Link<const MouseEvent&, void>()); + m_xDrawingArea->SetMousePressHdl(Link<const MouseEvent&, bool>()); + m_xDrawingArea->SetMouseMoveHdl(Link<const MouseEvent&, bool>()); + m_xDrawingArea->SetMouseReleaseHdl(Link<const MouseEvent&, bool>()); m_xDrawingArea->SetKeyPressHdl(Link<const KeyEvent&, bool>()); m_xDrawingArea->SetKeyReleaseHdl(Link<const KeyEvent&, bool>()); m_xDrawingArea->SetResizeHdl(Link<const Size&, void>()); @@ -3499,19 +3581,19 @@ IMPL_LINK(SalInstanceDrawingArea, ResizeHdl, const Size&, rSize, void) m_aSizeAllocateHdl.Call(rSize); } -IMPL_LINK(SalInstanceDrawingArea, MousePressHdl, const MouseEvent&, rEvent, void) +IMPL_LINK(SalInstanceDrawingArea, MousePressHdl, const MouseEvent&, rEvent, bool) { - m_aMousePressHdl.Call(rEvent); + return m_aMousePressHdl.Call(rEvent); } -IMPL_LINK(SalInstanceDrawingArea, MouseMoveHdl, const MouseEvent&, rEvent, void) +IMPL_LINK(SalInstanceDrawingArea, MouseMoveHdl, const MouseEvent&, rEvent, bool) { - m_aMouseMotionHdl.Call(rEvent); + return m_aMouseMotionHdl.Call(rEvent); } -IMPL_LINK(SalInstanceDrawingArea, MouseReleaseHdl, const MouseEvent&, rEvent, void) +IMPL_LINK(SalInstanceDrawingArea, MouseReleaseHdl, const MouseEvent&, rEvent, bool) { - m_aMouseReleaseHdl.Call(rEvent); + return m_aMouseReleaseHdl.Call(rEvent); } IMPL_LINK(SalInstanceDrawingArea, KeyPressHdl, const KeyEvent&, rEvent, bool) diff --git a/vcl/source/edit/vclmedit.cxx b/vcl/source/edit/vclmedit.cxx index 77a168e9ef14..1a16612c650c 100644 --- a/vcl/source/edit/vclmedit.cxx +++ b/vcl/source/edit/vclmedit.cxx @@ -107,15 +107,20 @@ public: void InitFromStyle( WinBits nWinStyle ); TextWindow* GetTextWindow() { return mpTextWindow; } - ScrollBar* GetHScrollBar() { return mpHScrollBar; } - ScrollBar* GetVScrollBar() { return mpVScrollBar; } + ScrollBar& GetHScrollBar() { return *mpHScrollBar; } + ScrollBar& GetVScrollBar() { return *mpVScrollBar; } }; ImpVclMEdit::ImpVclMEdit( VclMultiLineEdit* pEdt, WinBits nWinStyle ) : pVclMultiLineEdit(pEdt) , mpTextWindow(VclPtr<TextWindow>::Create(pEdt)) + , mpHScrollBar(VclPtr<ScrollBar>::Create(pVclMultiLineEdit, WB_HSCROLL|WB_DRAG)) + , mpVScrollBar(VclPtr<ScrollBar>::Create(pVclMultiLineEdit, WB_VSCROLL|WB_DRAG)) + , mpScrollBox(VclPtr<ScrollBarBox>::Create(pVclMultiLineEdit, WB_SIZEABLE)) , mnTextWidth(0) { + mpVScrollBar->SetScrollHdl( LINK( this, ImpVclMEdit, ScrollHdl ) ); + mpHScrollBar->SetScrollHdl( LINK( this, ImpVclMEdit, ScrollHdl ) ); mpTextWindow->Show(); InitFromStyle( nWinStyle ); StartListening( *mpTextWindow->GetTextEngine() ); @@ -123,9 +128,9 @@ ImpVclMEdit::ImpVclMEdit( VclMultiLineEdit* pEdt, WinBits nWinStyle ) void ImpVclMEdit::ImpUpdateSrollBarVis( WinBits nWinStyle ) { - const bool bHaveVScroll = (nullptr != mpVScrollBar); - const bool bHaveHScroll = (nullptr != mpHScrollBar); - const bool bHaveScrollBox = (nullptr != mpScrollBox); + const bool bHaveVScroll = mpVScrollBar->IsVisible(); + const bool bHaveHScroll = mpHScrollBar->IsVisible(); + const bool bHaveScrollBox = mpScrollBox->IsVisible(); bool bNeedVScroll = ( nWinStyle & WB_VSCROLL ) == WB_VSCROLL; const bool bNeedHScroll = ( nWinStyle & WB_HSCROLL ) == WB_HSCROLL; @@ -146,39 +151,19 @@ void ImpVclMEdit::ImpUpdateSrollBarVis( WinBits nWinStyle ) bool bScrollbarsChanged = false; if ( bHaveVScroll != bNeedVScroll ) { - mpVScrollBar.disposeAndClear(); - mpVScrollBar = bNeedVScroll ? VclPtr<ScrollBar>::Create( pVclMultiLineEdit, WB_VSCROLL|WB_DRAG ) : nullptr; - - if ( bNeedVScroll ) - { - mpVScrollBar->Show(); - mpVScrollBar->SetScrollHdl( LINK( this, ImpVclMEdit, ScrollHdl ) ); - } - + mpVScrollBar->Show(bNeedVScroll); bScrollbarsChanged = true; } if ( bHaveHScroll != bNeedHScroll ) { - mpHScrollBar.disposeAndClear(); - mpHScrollBar = bNeedHScroll ? VclPtr<ScrollBar>::Create( pVclMultiLineEdit, WB_HSCROLL|WB_DRAG ) : nullptr; - - if ( bNeedHScroll ) - { - mpHScrollBar->Show(); - mpHScrollBar->SetScrollHdl( LINK( this, ImpVclMEdit, ScrollHdl ) ); - } - + mpHScrollBar->Show(bNeedHScroll); bScrollbarsChanged = true; } if ( bHaveScrollBox != bNeedScrollBox ) { - mpScrollBox.disposeAndClear(); - mpScrollBox = bNeedScrollBox ? VclPtr<ScrollBarBox>::Create( pVclMultiLineEdit, WB_SIZEABLE ) : nullptr; - - if ( bNeedScrollBox ) - mpScrollBox->Show(); + mpScrollBox->Show(bNeedScrollBox); } if ( bScrollbarsChanged ) @@ -229,46 +214,32 @@ ImpVclMEdit::~ImpVclMEdit() void ImpVclMEdit::ImpSetScrollBarRanges() { - if ( mpVScrollBar ) - { - const long nTextHeight = mpTextWindow->GetTextEngine()->GetTextHeight(); - mpVScrollBar->SetRange( Range( 0, nTextHeight-1 ) ); - } - if ( mpHScrollBar ) - { -// sal_uLong nTextWidth = mpTextWindow->GetTextEngine()->CalcTextWidth(); - // there is no Notify by width change -// sal_uLong nW = Max( (sal_uLong)mpTextWindow->GetOutputSizePixel().Width()*5, (sal_uLong)nTextWidth ); -// mpHScrollBar->SetRange( Range( 0, (long)nW ) ); - mpHScrollBar->SetRange( Range( 0, mnTextWidth-1 ) ); - } + const long nTextHeight = mpTextWindow->GetTextEngine()->GetTextHeight(); + mpVScrollBar->SetRange( Range( 0, nTextHeight-1 ) ); + + mpHScrollBar->SetRange( Range( 0, mnTextWidth-1 ) ); } void ImpVclMEdit::ImpInitScrollBars() { static const sal_Unicode sampleChar = { 'x' }; - if ( mpHScrollBar || mpVScrollBar ) - { - ImpSetScrollBarRanges(); - Size aCharBox; - aCharBox.setWidth( mpTextWindow->GetTextWidth( OUString(sampleChar) ) ); - aCharBox.setHeight( mpTextWindow->GetTextHeight() ); - Size aOutSz = mpTextWindow->GetOutputSizePixel(); - if ( mpHScrollBar ) - { - mpHScrollBar->SetVisibleSize( aOutSz.Width() ); - mpHScrollBar->SetPageSize( aOutSz.Width() * 8 / 10 ); - mpHScrollBar->SetLineSize( aCharBox.Width()*10 ); - ImpSetHScrollBarThumbPos(); - } - if ( mpVScrollBar ) - { - mpVScrollBar->SetVisibleSize( aOutSz.Height() ); - mpVScrollBar->SetPageSize( aOutSz.Height() * 8 / 10 ); - mpVScrollBar->SetLineSize( aCharBox.Height() ); - mpVScrollBar->SetThumbPos( mpTextWindow->GetTextView()->GetStartDocPos().Y() ); - } - } + + ImpSetScrollBarRanges(); + + Size aCharBox; + aCharBox.setWidth( mpTextWindow->GetTextWidth( OUString(sampleChar) ) ); + aCharBox.setHeight( mpTextWindow->GetTextHeight() ); + Size aOutSz = mpTextWindow->GetOutputSizePixel(); + + mpHScrollBar->SetVisibleSize( aOutSz.Width() ); + mpHScrollBar->SetPageSize( aOutSz.Width() * 8 / 10 ); + mpHScrollBar->SetLineSize( aCharBox.Width()*10 ); + ImpSetHScrollBarThumbPos(); + + mpVScrollBar->SetVisibleSize( aOutSz.Height() ); + mpVScrollBar->SetPageSize( aOutSz.Height() * 8 / 10 ); + mpVScrollBar->SetLineSize( aCharBox.Height() ); + mpVScrollBar->SetThumbPos( mpTextWindow->GetTextView()->GetStartDocPos().Y() ); } void ImpVclMEdit::ImpSetHScrollBarThumbPos() @@ -372,18 +343,18 @@ void ImpVclMEdit::Resize() long nSBWidth = pVclMultiLineEdit->GetSettings().GetStyleSettings().GetScrollBarSize(); nSBWidth = pVclMultiLineEdit->CalcZoom( nSBWidth ); - if ( mpHScrollBar ) + if (mpHScrollBar->IsVisible()) aSz.AdjustHeight( -(nSBWidth+1) ); - if ( mpVScrollBar ) + if (mpVScrollBar->IsVisible()) aSz.AdjustWidth( -(nSBWidth+1) ); - if ( !mpHScrollBar ) + if (!mpHScrollBar->IsVisible()) mpTextWindow->GetTextEngine()->SetMaxTextWidth( aSz.Width() ); else mpHScrollBar->setPosSizePixel( 0, aEditSize.Height()-nSBWidth, aSz.Width(), nSBWidth ); Point aTextWindowPos; - if ( mpVScrollBar ) + if (mpVScrollBar->IsVisible()) { if( AllSettings::GetLayoutRTL() ) { @@ -394,7 +365,7 @@ void ImpVclMEdit::Resize() mpVScrollBar->setPosSizePixel( aEditSize.Width()-nSBWidth, 0, nSBWidth, aSz.Height() ); } - if ( mpScrollBox ) + if (mpScrollBox->IsVisible()) mpScrollBox->setPosSizePixel( aSz.Width(), aSz.Height(), nSBWidth, nSBWidth ); Size aTextWindowSize( aSz ); @@ -478,9 +449,9 @@ void ImpVclMEdit::Notify( SfxBroadcaster&, const SfxHint& rHint ) switch (pTextHint->GetId()) { case SfxHintId::TextViewScrolled: - if ( mpHScrollBar ) + if (mpHScrollBar->IsVisible()) ImpSetHScrollBarThumbPos(); - if ( mpVScrollBar ) + if (mpVScrollBar->IsVisible()) mpVScrollBar->SetThumbPos( mpTextWindow->GetTextView()->GetStartDocPos().Y() ); break; @@ -496,7 +467,7 @@ void ImpVclMEdit::Notify( SfxBroadcaster&, const SfxHint& rHint ) break; case SfxHintId::TextFormatted: - if ( mpHScrollBar ) + if (mpHScrollBar->IsVisible()) { const long nWidth = mpTextWindow->GetTextEngine()->CalcTextWidth(); if ( nWidth != mnTextWidth ) @@ -598,9 +569,9 @@ Size ImpVclMEdit::CalcMinimumSize() const Size aSz( mpTextWindow->GetTextEngine()->CalcTextWidth(), mpTextWindow->GetTextEngine()->GetTextHeight() ); - if ( mpHScrollBar ) + if (mpHScrollBar->IsVisible()) aSz.AdjustHeight(mpHScrollBar->GetSizePixel().Height() ); - if ( mpVScrollBar ) + if (mpVScrollBar->IsVisible()) aSz.AdjustWidth(mpVScrollBar->GetSizePixel().Width() ); return aSz; @@ -625,9 +596,9 @@ Size ImpVclMEdit::CalcBlockSize( sal_uInt16 nColumns, sal_uInt16 nLines ) const else aSz.setWidth( mpTextWindow->GetTextEngine()->CalcTextWidth() ); - if ( mpHScrollBar ) + if (mpHScrollBar->IsVisible()) aSz.AdjustHeight(mpHScrollBar->GetSizePixel().Height() ); - if ( mpVScrollBar ) + if (mpVScrollBar->IsVisible()) aSz.AdjustWidth(mpVScrollBar->GetSizePixel().Width() ); return aSz; @@ -645,9 +616,9 @@ void ImpVclMEdit::GetMaxVisColumnsAndLines( sal_uInt16& rnCols, sal_uInt16& rnLi void ImpVclMEdit::Enable( bool bEnable ) { mpTextWindow->Enable( bEnable ); - if ( mpHScrollBar ) + if (mpHScrollBar->IsVisible()) mpHScrollBar->Enable( bEnable ); - if ( mpVScrollBar ) + if (mpVScrollBar->IsVisible()) mpVScrollBar->Enable( bEnable ); } @@ -658,7 +629,9 @@ bool ImpVclMEdit::HandleCommand( const CommandEvent& rCEvt ) ( rCEvt.GetCommand() == CommandEventId::StartAutoScroll ) || ( rCEvt.GetCommand() == CommandEventId::AutoScroll ) ) { - (void)mpTextWindow->HandleScrollCommand( rCEvt, mpHScrollBar, mpVScrollBar ); + ScrollBar* pHScrollBar = mpHScrollBar->IsVisible() ? mpHScrollBar.get() : nullptr; + ScrollBar* pVScrollBar = mpVScrollBar->IsVisible() ? mpVScrollBar.get() : nullptr; + (void)mpTextWindow->HandleScrollCommand(rCEvt, pHScrollBar, pVScrollBar); bDone = true; } return bDone; @@ -1437,38 +1410,38 @@ bool VclMultiLineEdit::PreNotify( NotifyEvent& rNEvt ) { case KEY_UP: { - if ( pImpVclMEdit->GetVScrollBar() ) - pImpVclMEdit->GetVScrollBar()->DoScrollAction( ScrollType::LineUp ); + if ( pImpVclMEdit->GetVScrollBar().IsVisible() ) + pImpVclMEdit->GetVScrollBar().DoScrollAction( ScrollType::LineUp ); } break; case KEY_DOWN: { - if ( pImpVclMEdit->GetVScrollBar() ) - pImpVclMEdit->GetVScrollBar()->DoScrollAction( ScrollType::LineDown ); + if ( pImpVclMEdit->GetVScrollBar().IsVisible() ) + pImpVclMEdit->GetVScrollBar().DoScrollAction( ScrollType::LineDown ); } break; case KEY_PAGEUP : { - if ( pImpVclMEdit->GetVScrollBar() ) - pImpVclMEdit->GetVScrollBar()->DoScrollAction( ScrollType::PageUp ); + if ( pImpVclMEdit->GetVScrollBar().IsVisible() ) + pImpVclMEdit->GetVScrollBar().DoScrollAction( ScrollType::PageUp ); } break; case KEY_PAGEDOWN: { - if ( pImpVclMEdit->GetVScrollBar() ) - pImpVclMEdit->GetVScrollBar()->DoScrollAction( ScrollType::PageDown ); + if ( pImpVclMEdit->GetVScrollBar().IsVisible() ) + pImpVclMEdit->GetVScrollBar().DoScrollAction( ScrollType::PageDown ); } break; case KEY_LEFT: { - if ( pImpVclMEdit->GetHScrollBar() ) - pImpVclMEdit->GetHScrollBar()->DoScrollAction( ScrollType::LineUp ); + if ( pImpVclMEdit->GetHScrollBar().IsVisible() ) + pImpVclMEdit->GetHScrollBar().DoScrollAction( ScrollType::LineUp ); } break; case KEY_RIGHT: { - if ( pImpVclMEdit->GetHScrollBar() ) - pImpVclMEdit->GetHScrollBar()->DoScrollAction( ScrollType::LineDown ); + if ( pImpVclMEdit->GetHScrollBar().IsVisible() ) + pImpVclMEdit->GetHScrollBar().DoScrollAction( ScrollType::LineDown ); } break; case KEY_HOME: @@ -1509,7 +1482,7 @@ TextView* VclMultiLineEdit::GetTextView() const return pImpVclMEdit->GetTextWindow()->GetTextView(); } -ScrollBar* VclMultiLineEdit::GetVScrollBar() const +ScrollBar& VclMultiLineEdit::GetVScrollBar() const { return pImpVclMEdit->GetVScrollBar(); } diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index 2bfbd67f6ed1..d33c59ba316e 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -1219,6 +1219,34 @@ namespace } } +static MouseEventModifiers ImplGetMouseButtonMode(sal_uInt16 nButton, sal_uInt16 nCode) +{ + MouseEventModifiers nMode = MouseEventModifiers::NONE; + if ( nButton == MOUSE_LEFT ) + nMode |= MouseEventModifiers::SIMPLECLICK; + if ( (nButton == MOUSE_LEFT) && !(nCode & (MOUSE_MIDDLE | MOUSE_RIGHT)) ) + nMode |= MouseEventModifiers::SELECT; + if ( (nButton == MOUSE_LEFT) && (nCode & KEY_MOD1) && + !(nCode & (MOUSE_MIDDLE | MOUSE_RIGHT | KEY_SHIFT)) ) + nMode |= MouseEventModifiers::MULTISELECT; + if ( (nButton == MOUSE_LEFT) && (nCode & KEY_SHIFT) && + !(nCode & (MOUSE_MIDDLE | MOUSE_RIGHT | KEY_MOD1)) ) + nMode |= MouseEventModifiers::RANGESELECT; + return nMode; +} + +static MouseEventModifiers ImplGetMouseMoveMode(sal_uInt16 nCode) +{ + MouseEventModifiers nMode = MouseEventModifiers::NONE; + if ( !nCode ) + nMode |= MouseEventModifiers::SIMPLEMOVE; + if ( (nCode & MOUSE_LEFT) && !(nCode & KEY_MOD1) ) + nMode |= MouseEventModifiers::DRAGMOVE; + if ( (nCode & MOUSE_LEFT) && (nCode & KEY_MOD1) ) + nMode |= MouseEventModifiers::DRAGCOPY; + return nMode; +} + class GtkInstanceWidget : public virtual weld::Widget { protected: @@ -1252,11 +1280,15 @@ protected: private: bool m_bTakeOwnership; bool m_bFrozen; + sal_uInt16 m_nLastMouseButton; gulong m_nFocusInSignalId; gulong m_nFocusOutSignalId; gulong m_nKeyPressSignalId; gulong m_nKeyReleaseSignalId; gulong m_nSizeAllocateSignalId; + gulong m_nButtonPressSignalId; + gulong m_nMotionSignalId; + gulong m_nButtonReleaseSignalId; static void signalSizeAllocate(GtkWidget*, GdkRectangle* allocation, gpointer widget) { @@ -1278,25 +1310,164 @@ private: return pThis->signal_key(pEvent); } + virtual bool signal_popup_menu(const Point&) + { + return false; + } + + static gboolean signalButton(GtkWidget*, GdkEventButton* pEvent, gpointer widget) + { + GtkInstanceWidget* pThis = static_cast<GtkInstanceWidget*>(widget); + SolarMutexGuard aGuard; + return pThis->signal_button(pEvent); + } + + bool signal_button(GdkEventButton* pEvent) + { + int nClicks = 1; + + SalEvent nEventType = SalEvent::NONE; + switch (pEvent->type) + { + case GDK_BUTTON_PRESS: + if (GdkEvent* pPeekEvent = gdk_event_peek()) + { + bool bSkip = pPeekEvent->type == GDK_2BUTTON_PRESS || + pPeekEvent->type == GDK_3BUTTON_PRESS; + gdk_event_free(pPeekEvent); + if (bSkip) + { + return true; + } + } + nEventType = SalEvent::MouseButtonDown; + break; + case GDK_2BUTTON_PRESS: + nClicks = 2; + nEventType = SalEvent::MouseButtonDown; + break; + case GDK_3BUTTON_PRESS: + nClicks = 3; + nEventType = SalEvent::MouseButtonDown; + break; + case GDK_BUTTON_RELEASE: + nEventType = SalEvent::MouseButtonUp; + break; + default: + return false; + } + + switch (pEvent->button) + { + case 1: + m_nLastMouseButton = MOUSE_LEFT; + break; + case 2: + m_nLastMouseButton = MOUSE_MIDDLE; + break; + case 3: + m_nLastMouseButton = MOUSE_RIGHT; + break; + default: + return false; + } + + Point aPos(pEvent->x, pEvent->y); + if (AllSettings::GetLayoutRTL()) + aPos.setX(gtk_widget_get_allocated_width(m_pWidget) - 1 - aPos.X()); + + if (gdk_event_triggers_context_menu(reinterpret_cast<GdkEvent*>(pEvent)) && pEvent->type == GDK_BUTTON_PRESS) + { + //if handled for context menu, stop processing + if (signal_popup_menu(aPos)) + return true; + } + + sal_uInt32 nModCode = GtkSalFrame::GetMouseModCode(pEvent->state); + sal_uInt16 nCode = m_nLastMouseButton | (nModCode & (KEY_SHIFT | KEY_MOD1 | KEY_MOD2)); + MouseEvent aMEvt(aPos, nClicks, ImplGetMouseButtonMode(m_nLastMouseButton, nModCode), nCode, nCode); + + if (nEventType == SalEvent::MouseButtonDown) + { + if (!m_aMousePressHdl.IsSet()) + return false; + return m_aMousePressHdl.Call(aMEvt); + } + + if (!m_aMouseReleaseHdl.IsSet()) + return false; + return m_aMouseReleaseHdl.Call(aMEvt); + } + + static gboolean signalMotion(GtkWidget*, GdkEventMotion* pEvent, gpointer widget) + { + GtkInstanceWidget* pThis = static_cast<GtkInstanceWidget*>(widget); + SolarMutexGuard aGuard; + return pThis->signal_motion(pEvent); + } + + bool signal_motion(const GdkEventMotion* pEvent) + { + if (!m_aMouseMotionHdl.IsSet()) + return false; + + Point aPos(pEvent->x, pEvent->y); + if (AllSettings::GetLayoutRTL()) + aPos.setX(gtk_widget_get_allocated_width(m_pWidget) - 1 - aPos.X()); + sal_uInt32 nModCode = GtkSalFrame::GetMouseModCode(pEvent->state); + sal_uInt16 nCode = m_nLastMouseButton | (nModCode & (KEY_SHIFT | KEY_MOD1 | KEY_MOD2)); + MouseEvent aMEvt(aPos, 0, ImplGetMouseMoveMode(nModCode), nCode, nCode); + + m_aMouseMotionHdl.Call(aMEvt); + return true; + } + public: GtkInstanceWidget(GtkWidget* pWidget, GtkInstanceBuilder* pBuilder, bool bTakeOwnership) : m_pWidget(pWidget) , m_pBuilder(pBuilder) , m_bTakeOwnership(bTakeOwnership) , m_bFrozen(false) + , m_nLastMouseButton(0) , m_nFocusInSignalId(0) , m_nFocusOutSignalId(0) + , m_nKeyPressSignalId(0) + , m_nKeyReleaseSignalId(0) , m_nSizeAllocateSignalId(0) + , m_nButtonPressSignalId(0) + , m_nMotionSignalId(0) + , m_nButtonReleaseSignalId(0) { - GdkEventMask eEventMask(static_cast<GdkEventMask>(gtk_widget_get_events(pWidget))); - if (eEventMask & GDK_BUTTON_PRESS_MASK) - m_nKeyPressSignalId = g_signal_connect(pWidget, "key-press-event", G_CALLBACK(signalKey), this); - else - m_nKeyPressSignalId = 0; - if (eEventMask & GDK_BUTTON_RELEASE_MASK) - m_nKeyReleaseSignalId = g_signal_connect(pWidget, "key-release-event", G_CALLBACK(signalKey), this); - else - m_nKeyReleaseSignalId = 0; + } + + virtual void connect_key_press(const Link<const KeyEvent&, bool>& rLink) override + { + m_nKeyPressSignalId = g_signal_connect(m_pWidget, "key-press-event", G_CALLBACK(signalKey), this); + weld::Widget::connect_key_press(rLink); + } + + virtual void connect_key_release(const Link<const KeyEvent&, bool>& rLink) override + { + m_nKeyReleaseSignalId = g_signal_connect(m_pWidget, "key-release-event", G_CALLBACK(signalKey), this); + weld::Widget::connect_key_release(rLink); + } + + virtual void connect_mouse_press(const Link<const MouseEvent&, bool>& rLink) override + { + m_nButtonPressSignalId = g_signal_connect(m_pWidget, "button-press-event", G_CALLBACK(signalButton), this); + weld::Widget::connect_mouse_press(rLink); + } + + virtual void connect_mouse_move(const Link<const MouseEvent&, bool>& rLink) override + { + m_nMotionSignalId = g_signal_connect(m_pWidget, "motion-notify-event", G_CALLBACK(signalMotion), this); + weld::Widget::connect_mouse_move(rLink); + } + + virtual void connect_mouse_release(const Link<const MouseEvent&, bool>& rLink) override + { + m_nButtonReleaseSignalId = g_signal_connect(m_pWidget, "button-release-event", G_CALLBACK(signalButton), this); + weld::Widget::connect_mouse_release(rLink); } virtual void set_sensitive(bool sensitive) override @@ -1650,6 +1821,12 @@ public: g_signal_handler_disconnect(m_pWidget, m_nKeyPressSignalId); if (m_nKeyReleaseSignalId) g_signal_handler_disconnect(m_pWidget, m_nKeyReleaseSignalId); + if (m_nButtonPressSignalId) + g_signal_handler_disconnect(m_pWidget, m_nButtonPressSignalId); + if (m_nMotionSignalId) + g_signal_handler_disconnect(m_pWidget, m_nMotionSignalId); + if (m_nButtonReleaseSignalId) + g_signal_handler_disconnect(m_pWidget, m_nButtonReleaseSignalId); if (m_nFocusInSignalId) g_signal_handler_disconnect(m_pWidget, m_nFocusInSignalId); if (m_nFocusOutSignalId) @@ -6626,7 +6803,9 @@ class GtkInstanceTextView : public GtkInstanceContainer, public virtual weld::Te private: GtkTextView* m_pTextView; GtkTextBuffer* m_pTextBuffer; + GtkAdjustment* m_pVAdjustment; gulong m_nChangedSignalId; + gulong m_nVAdjustChangedSignalId; static void signalChanged(GtkTextView*, gpointer widget) { @@ -6635,12 +6814,21 @@ private: pThis->signal_changed(); } + static void signalVAdjustValueChanged(GtkAdjustment*, gpointer widget) + { + GtkInstanceTextView* pThis = static_cast<GtkInstanceTextView*>(widget); + SolarMutexGuard aGuard; + pThis->signal_vadjustment_changed(); + } + public: GtkInstanceTextView(GtkTextView* pTextView, GtkInstanceBuilder* pBuilder, bool bTakeOwnership) : GtkInstanceContainer(GTK_CONTAINER(pTextView), pBuilder, bTakeOwnership) , m_pTextView(pTextView) , m_pTextBuffer(gtk_text_view_get_buffer(pTextView)) + , m_pVAdjustment(gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(pTextView))) , m_nChangedSignalId(g_signal_connect(m_pTextBuffer, "changed", G_CALLBACK(signalChanged), this)) + , m_nVAdjustChangedSignalId(g_signal_connect(m_pVAdjustment, "value-changed", G_CALLBACK(signalVAdjustValueChanged), this)) { } @@ -6715,6 +6903,7 @@ public: virtual void disable_notify_events() override { + g_signal_handler_block(m_pVAdjustment, m_nVAdjustChangedSignalId); g_signal_handler_block(m_pTextBuffer, m_nChangedSignalId); GtkInstanceContainer::disable_notify_events(); } @@ -6723,42 +6912,43 @@ public: { GtkInstanceContainer::enable_notify_events(); g_signal_handler_unblock(m_pTextBuffer, m_nChangedSignalId); + g_signal_handler_unblock(m_pVAdjustment, m_nVAdjustChangedSignalId); + } + + virtual int vadjustment_get_value() const override + { + return gtk_adjustment_get_value(m_pVAdjustment); + } + + virtual void vadjustment_set_value(int value) override + { + disable_notify_events(); + gtk_adjustment_set_value(m_pVAdjustment, value); + enable_notify_events(); + } + + virtual int vadjustment_get_upper() const override + { + return gtk_adjustment_get_upper(m_pVAdjustment); + } + + virtual int vadjustment_get_lower() const override + { + return gtk_adjustment_get_lower(m_pVAdjustment); + } + + virtual int vadjustment_get_page_size() const override + { + return gtk_adjustment_get_page_size(m_pVAdjustment); } virtual ~GtkInstanceTextView() override { + g_signal_handler_disconnect(m_pVAdjustment, m_nVAdjustChangedSignalId); g_signal_handler_disconnect(m_pTextBuffer, m_nChangedSignalId); } }; -static MouseEventModifiers ImplGetMouseButtonMode(sal_uInt16 nButton, sal_uInt16 nCode) -{ - MouseEventModifiers nMode = MouseEventModifiers::NONE; - if ( nButton == MOUSE_LEFT ) - nMode |= MouseEventModifiers::SIMPLECLICK; - if ( (nButton == MOUSE_LEFT) && !(nCode & (MOUSE_MIDDLE | MOUSE_RIGHT)) ) - nMode |= MouseEventModifiers::SELECT; - if ( (nButton == MOUSE_LEFT) && (nCode & KEY_MOD1) && - !(nCode & (MOUSE_MIDDLE | MOUSE_RIGHT | KEY_SHIFT)) ) - nMode |= MouseEventModifiers::MULTISELECT; - if ( (nButton == MOUSE_LEFT) && (nCode & KEY_SHIFT) && - !(nCode & (MOUSE_MIDDLE | MOUSE_RIGHT | KEY_MOD1)) ) - nMode |= MouseEventModifiers::RANGESELECT; - return nMode; -} - -static MouseEventModifiers ImplGetMouseMoveMode(sal_uInt16 nCode) -{ - MouseEventModifiers nMode = MouseEventModifiers::NONE; - if ( !nCode ) - nMode |= MouseEventModifiers::SIMPLEMOVE; - if ( (nCode & MOUSE_LEFT) && !(nCode & KEY_MOD1) ) - nMode |= MouseEventModifiers::DRAGMOVE; - if ( (nCode & MOUSE_LEFT) && (nCode & KEY_MOD1) ) - nMode |= MouseEventModifiers::DRAGCOPY; - return nMode; -} - namespace { AtkObject* (*default_drawing_area_get_accessible)(GtkWidget *widget); @@ -6772,11 +6962,7 @@ private: AtkObject *m_pAccessible; ScopedVclPtrInstance<VirtualDevice> m_xDevice; cairo_surface_t* m_pSurface; - sal_uInt16 m_nLastMouseButton; gulong m_nDrawSignalId; - gulong m_nButtonPressSignalId; - gulong m_nMotionSignalId; - gulong m_nButtonReleaseSignalId; gulong m_nStyleUpdatedSignalId; gulong m_nQueryTooltip; gulong m_nPopupMenu; @@ -6844,7 +7030,7 @@ private: gtk_tooltip_set_tip_area(tooltip, &aGdkHelpArea); return true; } - bool signal_popup_menu(const Point& rPos) + virtual bool signal_popup_menu(const Point& rPos) override { return m_aPopupMenuHdl.Call(rPos); } @@ -6857,102 +7043,6 @@ private: gtk_widget_get_allocated_height(pWidget) / 2); return pThis->signal_popup_menu(aPos); } - static gboolean signalButton(GtkWidget*, GdkEventButton* pEvent, gpointer widget) - { - GtkInstanceDrawingArea* pThis = static_cast<GtkInstanceDrawingArea*>(widget); - SolarMutexGuard aGuard; - return pThis->signal_button(pEvent); - } - bool signal_button(GdkEventButton* pEvent) - { - int nClicks = 1; - - SalEvent nEventType = SalEvent::NONE; - switch (pEvent->type) - { - case GDK_BUTTON_PRESS: - if (GdkEvent* pPeekEvent = gdk_event_peek()) - { - bool bSkip = pPeekEvent->type == GDK_2BUTTON_PRESS || - pPeekEvent->type == GDK_3BUTTON_PRESS; - gdk_event_free(pPeekEvent); - if (bSkip) - { - return true; - } - } - nEventType = SalEvent::MouseButtonDown; - break; - case GDK_2BUTTON_PRESS: - nClicks = 2; - nEventType = SalEvent::MouseButtonDown; - break; - case GDK_3BUTTON_PRESS: - nClicks = 3; - nEventType = SalEvent::MouseButtonDown; - break; - case GDK_BUTTON_RELEASE: - nEventType = SalEvent::MouseButtonUp; - break; - default: - return false; - } - - switch (pEvent->button) - { - case 1: - m_nLastMouseButton = MOUSE_LEFT; - break; - case 2: - m_nLastMouseButton = MOUSE_MIDDLE; - break; - case 3: - m_nLastMouseButton = MOUSE_RIGHT; - break; - default: - return false; - } - - Point aPos(pEvent->x, pEvent->y); - if (AllSettings::GetLayoutRTL()) - aPos.setX(gtk_widget_get_allocated_width(m_pWidget) - 1 - aPos.X()); - - if (gdk_event_triggers_context_menu(reinterpret_cast<GdkEvent*>(pEvent)) && pEvent->type == GDK_BUTTON_PRESS) - { - //if handled for context menu, stop processing - if (signal_popup_menu(aPos)) - return true; - } - - sal_uInt32 nModCode = GtkSalFrame::GetMouseModCode(pEvent->state); - sal_uInt16 nCode = m_nLastMouseButton | (nModCode & (KEY_SHIFT | KEY_MOD1 | KEY_MOD2)); - MouseEvent aMEvt(aPos, nClicks, ImplGetMouseButtonMode(m_nLastMouseButton, nModCode), nCode, nCode); - - if (nEventType == SalEvent::MouseButtonDown) - m_aMousePressHdl.Call(aMEvt); - else - m_aMouseReleaseHdl.Call(aMEvt); - - return true; - } - static gboolean signalMotion(GtkWidget*, GdkEventMotion* pEvent, gpointer widget) - { - GtkInstanceDrawingArea* pThis = static_cast<GtkInstanceDrawingArea*>(widget); - SolarMutexGuard aGuard; - return pThis->signal_motion(pEvent); - } - bool signal_motion(const GdkEventMotion* pEvent) - { - Point aPos(pEvent->x, pEvent->y); - if (AllSettings::GetLayoutRTL()) - aPos.setX(gtk_widget_get_allocated_width(m_pWidget) - 1 - aPos.X()); - sal_uInt32 nModCode = GtkSalFrame::GetMouseModCode(pEvent->state); - sal_uInt16 nCode = m_nLastMouseButton | (nModCode & (KEY_SHIFT | KEY_MOD1 | KEY_MOD2)); - MouseEvent aMEvt(aPos, 0, ImplGetMouseMoveMode(nModCode), nCode, nCode); - - m_aMouseMotionHdl.Call(aMEvt); - return true; - } public: GtkInstanceDrawingArea(GtkDrawingArea* pDrawingArea, GtkInstanceBuilder* pBuilder, const a11yref& rA11y, bool bTakeOwnership) : GtkInstanceWidget(GTK_WIDGET(pDrawingArea), pBuilder, bTakeOwnership) @@ -6961,11 +7051,7 @@ public: , m_pAccessible(nullptr) , m_xDevice(nullptr, Size(1, 1), DeviceFormat::DEFAULT) , m_pSurface(nullptr) - , m_nLastMouseButton(0) , m_nDrawSignalId(g_signal_connect(m_pDrawingArea, "draw", G_CALLBACK(signalDraw), this)) - , m_nButtonPressSignalId(g_signal_connect(m_pDrawingArea, "button-press-event", G_CALLBACK(signalButton), this)) - , m_nMotionSignalId(g_signal_connect(m_pDrawingArea, "motion-notify-event", G_CALLBACK(signalMotion), this)) - , m_nButtonReleaseSignalId(g_signal_connect(m_pDrawingArea, "button-release-event", G_CALLBACK(signalButton), this)) , m_nStyleUpdatedSignalId(g_signal_connect(m_pDrawingArea,"style-updated", G_CALLBACK(signalStyleUpdated), this)) , m_nQueryTooltip(g_signal_connect(m_pDrawingArea, "query-tooltip", G_CALLBACK(signalQueryTooltip), this)) , m_nPopupMenu(g_signal_connect(m_pDrawingArea, "popup-menu", G_CALLBACK(signalPopupMenu), this)) @@ -7060,9 +7146,6 @@ public: g_signal_handler_disconnect(m_pDrawingArea, m_nPopupMenu); g_signal_handler_disconnect(m_pDrawingArea, m_nQueryTooltip); g_signal_handler_disconnect(m_pDrawingArea, m_nStyleUpdatedSignalId); - g_signal_handler_disconnect(m_pDrawingArea, m_nButtonPressSignalId); - g_signal_handler_disconnect(m_pDrawingArea, m_nMotionSignalId); - g_signal_handler_disconnect(m_pDrawingArea, m_nButtonReleaseSignalId); g_signal_handler_disconnect(m_pDrawingArea, m_nDrawSignalId); } |