[Libreoffice-commits] core.git: cui/source desktop/source desktop/uiconfig extras/source include/sfx2 include/svtools include/svx include/vcl sfx2/source solenv/sanitizers starmath/inc starmath/source svtools/source svx/source sw/source vcl/source vcl/unx

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Wed Feb 27 21:18:56 UTC 2019


 cui/source/dialogs/colorpicker.cxx               |   30 +
 cui/source/dialogs/cuigrfflt.cxx                 |    4 
 cui/source/inc/cuigrfflt.hxx                     |    2 
 desktop/source/deployment/gui/license_dialog.cxx |  285 ++++++-----------
 desktop/uiconfig/ui/licensedialog.ui             |   62 +--
 extras/source/glade/libreoffice-catalog.xml.in   |    3 
 include/sfx2/charwin.hxx                         |    2 
 include/svtools/valueset.hxx                     |    4 
 include/svx/charmap.hxx                          |    6 
 include/svx/connctrl.hxx                         |    2 
 include/svx/dialcontrol.hxx                      |    6 
 include/svx/dlgctrl.hxx                          |    4 
 include/svx/frmsel.hxx                           |    2 
 include/svx/measctrl.hxx                         |    2 
 include/vcl/customweld.hxx                       |   12 
 include/vcl/layout.hxx                           |   21 -
 include/vcl/vclmedit.hxx                         |    4 
 include/vcl/weld.hxx                             |   45 +-
 sfx2/source/control/charwin.cxx                  |    4 
 solenv/sanitizers/ui/desktop.suppr               |    1 
 starmath/inc/dialog.hxx                          |    4 
 starmath/source/dialog.cxx                       |    7 
 svtools/source/control/valueset.cxx              |   10 
 svx/source/dialog/charmap.cxx                    |   12 
 svx/source/dialog/connctrl.cxx                   |    4 
 svx/source/dialog/dialcontrol.cxx                |    9 
 svx/source/dialog/dlgctrl.cxx                    |    9 
 svx/source/dialog/frmsel.cxx                     |    4 
 svx/source/dialog/measctrl.cxx                   |    4 
 sw/source/uibase/dbui/mailmergehelper.cxx        |    3 
 sw/source/uibase/inc/mailmergehelper.hxx         |    2 
 vcl/source/app/customweld.cxx                    |   12 
 vcl/source/app/salvtables.cxx                    |  116 ++++++-
 vcl/source/edit/vclmedit.cxx                     |  155 +++------
 vcl/unx/gtk3/gtk3gtkinst.cxx                     |  373 ++++++++++++++---------
 35 files changed, 666 insertions(+), 559 deletions(-)

New commits:
commit cfe41185bc8514949d1938ee1d7cd56968682510
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Sat Feb 23 13:42:55 2019 +0000
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Wed Feb 27 22:18:22 2019 +0100

    weld LicenseDialogImpl
    
    Change-Id: I4b2dbd2446779e7179d2b79bf81cc2ff879377bf
    Reviewed-on: https://gerrit.libreoffice.org/68389
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/cui/source/dialogs/colorpicker.cxx b/cui/source/dialogs/colorpicker.cxx
index ffb214140e35..4587f52660cc 100644
--- a/cui/source/dialogs/colorpicker.cxx
+++ b/cui/source/dialogs/colorpicker.cxx
@@ -208,9 +208,9 @@ public:
 
     virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override;
     virtual void Resize() override;
-    virtual void MouseButtonDown(const MouseEvent& rMEvt) override;
-    virtual void MouseMove(const MouseEvent& rMEvt) override;
-    virtual void MouseButtonUp(const MouseEvent& rMEvt) override;
+    virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
+    virtual bool MouseMove(const MouseEvent& rMEvt) override;
+    virtual bool MouseButtonUp(const MouseEvent& rMEvt) override;
 
     void UpdateBitmap();
     void ShowPosition( const Point& rPos, bool bUpdate );
@@ -418,27 +418,30 @@ void ColorFieldControl::ShowPosition( const Point& rPos, bool bUpdate )
     }
 }
 
-void ColorFieldControl::MouseButtonDown(const MouseEvent& rMEvt)
+bool ColorFieldControl::MouseButtonDown(const MouseEvent& rMEvt)
 {
     CaptureMouse();
     mbMouseCaptured = true;
     ShowPosition(rMEvt.GetPosPixel(), true);
     Modify();
+    return true;
 }
 
-void ColorFieldControl::MouseMove(const MouseEvent& rMEvt)
+bool ColorFieldControl::MouseMove(const MouseEvent& rMEvt)
 {
     if (mbMouseCaptured)
     {
         ShowPosition(rMEvt.GetPosPixel(), true);
         Modify();
     }
+    return true;
 }
 
-void ColorFieldControl::MouseButtonUp(const MouseEvent&)
+bool ColorFieldControl::MouseButtonUp(const MouseEvent&)
 {
     ReleaseMouse();
     mbMouseCaptured = false;
+    return true;
 }
 
 void ColorFieldControl::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&)
@@ -507,9 +510,9 @@ public:
 
     virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override;
 
-    virtual void MouseButtonDown(const MouseEvent& rMEvt) override;
-    virtual void MouseMove(const MouseEvent& rMEvt) override;
-    virtual void MouseButtonUp(const MouseEvent& rMEvt) override;
+    virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
+    virtual bool MouseMove(const MouseEvent& rMEvt) override;
+    virtual bool MouseButtonUp(const MouseEvent& rMEvt) override;
     virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&) override;
     virtual void Resize() override;
 
@@ -641,25 +644,28 @@ void ColorSliderControl::ChangePosition(long nY)
     mdValue = double(nHeight - nY) / double(nHeight);
 }
 
-void ColorSliderControl::MouseButtonDown(const MouseEvent& rMEvt)
+bool ColorSliderControl::MouseButtonDown(const MouseEvent& rMEvt)
 {
     CaptureMouse();
     ChangePosition(rMEvt.GetPosPixel().Y());
     Modify();
+    return true;
 }
 
-void ColorSliderControl::MouseMove(const MouseEvent& rMEvt)
+bool ColorSliderControl::MouseMove(const MouseEvent& rMEvt)
 {
     if (IsMouseCaptured())
     {
         ChangePosition(rMEvt.GetPosPixel().Y());
         Modify();
     }
+    return true;
 }
 
-void ColorSliderControl::MouseButtonUp(const MouseEvent&)
+bool ColorSliderControl::MouseButtonUp(const MouseEvent&)
 {
     ReleaseMouse();
+    return true;
 }
 
 void ColorSliderControl::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&)
diff --git a/cui/source/dialogs/cuigrfflt.cxx b/cui/source/dialogs/cuigrfflt.cxx
index 02e93b287074..fe1d523b6874 100644
--- a/cui/source/dialogs/cuigrfflt.cxx
+++ b/cui/source/dialogs/cuigrfflt.cxx
@@ -396,7 +396,7 @@ Graphic GraphicFilterPoster::GetFilteredGraphic( const Graphic& rGraphic, double
     return aRet;
 }
 
-void EmbossControl::MouseButtonDown( const MouseEvent& rEvt )
+bool EmbossControl::MouseButtonDown( const MouseEvent& rEvt )
 {
     const RectPoint eOldRP = GetActualRP();
 
@@ -404,6 +404,8 @@ void EmbossControl::MouseButtonDown( const MouseEvent& rEvt )
 
     if( GetActualRP() != eOldRP )
         maModifyHdl.Call( nullptr );
+
+    return true;
 }
 
 void EmbossControl::SetDrawingArea(weld::DrawingArea* pDrawingArea)
diff --git a/cui/source/inc/cuigrfflt.hxx b/cui/source/inc/cuigrfflt.hxx
index 396cfeb82ecd..31b51ca47a44 100644
--- a/cui/source/inc/cuigrfflt.hxx
+++ b/cui/source/inc/cuigrfflt.hxx
@@ -157,7 +157,7 @@ class EmbossControl : public SvxRectCtl
 {
 private:
     Link<LinkParamNone*, void> maModifyHdl;
-    virtual void MouseButtonDown( const MouseEvent& rEvt ) override;
+    virtual bool MouseButtonDown( const MouseEvent& rEvt ) override;
     virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override;
 public:
     EmbossControl()
diff --git a/desktop/source/deployment/gui/license_dialog.cxx b/desktop/source/deployment/gui/license_dialog.cxx
index b64ba25d4399..aa8d45d4cf65 100644
--- a/desktop/source/deployment/gui/license_dialog.cxx
+++ b/desktop/source/deployment/gui/license_dialog.cxx
@@ -22,6 +22,7 @@
 #include <unotools/configmgr.hxx>
 #include <comphelper/unwrapargs.hxx>
 #include <i18nlangtag/mslangid.hxx>
+#include <vcl/event.hxx>
 #include <vcl/svapp.hxx>
 #include <toolkit/helper/vclunohelper.hxx>
 #include <com/sun/star/lang/XServiceInfo.hpp>
@@ -32,6 +33,7 @@
 #include <vcl/scrbar.hxx>
 #include <vcl/threadex.hxx>
 #include <vcl/builderfactory.hxx>
+#include <vcl/weld.hxx>
 
 #include "license_dialog.hxx"
 
@@ -43,235 +45,162 @@ using namespace ::com::sun::star::uno;
 
 namespace dp_gui {
 
-class LicenseView : public MultiLineEdit, public SfxListener
+struct LicenseDialogImpl : public weld::GenericDialogController
 {
-    bool            mbEndReached;
-    Link<LicenseView&,void> maEndReachedHdl;
-    Link<LicenseView&,void> maScrolledHdl;
-
-public:
-    LicenseView( vcl::Window* pParent, WinBits nStyle );
-    virtual ~LicenseView() override;
-    virtual void dispose() override;
-
-    void ScrollDown( ScrollType eScroll );
+    bool m_bLicenseRead;
+    Idle m_aResized;
+    AutoTimer m_aRepeat;
+
+    std::unique_ptr<weld::Label> m_xFtHead;
+    std::unique_ptr<weld::Widget> m_xArrow1;
+    std::unique_ptr<weld::Widget> m_xArrow2;
+    std::unique_ptr<weld::TextView> m_xLicense;
+    std::unique_ptr<weld::Button> m_xDown;
+    std::unique_ptr<weld::Button> m_xAcceptButton;
+    std::unique_ptr<weld::Button> m_xDeclineButton;
+
+    void PageDown();
+    DECL_LINK(ScrollTimerHdl, Timer*, void);
+    DECL_LINK(ScrolledHdl, weld::TextView&, void);
+    DECL_LINK(ResizedHdl, Timer*, void);
+    DECL_LINK(CancelHdl, weld::Button&, void);
+    DECL_LINK(AcceptHdl, weld::Button&, void);
+    DECL_LINK(KeyInputHdl, const KeyEvent&, bool);
+    DECL_STATIC_LINK(LicenseDialogImpl, KeyReleaseHdl, const KeyEvent&, bool);
+    DECL_LINK(MousePressHdl, const MouseEvent&, bool);
+    DECL_LINK(MouseReleaseHdl, const MouseEvent&, bool);
+    DECL_LINK(SizeAllocHdl, const Size&, void);
+
+    LicenseDialogImpl(weld::Window * pParent,
+                      const OUString & sExtensionName,
+                      const OUString & sLicenseText);
 
     bool IsEndReached() const;
-    bool EndReached() const { return mbEndReached; }
-
-    void SetEndReachedHdl( const Link<LicenseView&,void>& rHdl ) { maEndReachedHdl = rHdl; }
-
-    void SetScrolledHdl( const Link<LicenseView&,void>& rHdl ) { maScrolledHdl = rHdl; }
-
-    virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override;
 };
 
-struct LicenseDialogImpl : public ModalDialog
+LicenseDialogImpl::LicenseDialogImpl(
+    weld::Window * pParent,
+    const OUString & sExtensionName,
+    const OUString & sLicenseText)
+    : GenericDialogController(pParent, "desktop/ui/licensedialog.ui", "LicenseDialog")
+    , m_bLicenseRead(false)
+    , m_xFtHead(m_xBuilder->weld_label("head"))
+    , m_xArrow1(m_xBuilder->weld_widget("arrow1"))
+    , m_xArrow2(m_xBuilder->weld_widget("arrow2"))
+    , m_xLicense(m_xBuilder->weld_text_view("textview"))
+    , m_xDown(m_xBuilder->weld_button("down"))
+    , m_xAcceptButton(m_xBuilder->weld_button("ok"))
+    , m_xDeclineButton(m_xBuilder->weld_button("cancel"))
 {
-    VclPtr<FixedText> m_pFtHead;
-    VclPtr<FixedImage> m_pArrow1;
-    VclPtr<FixedImage> m_pArrow2;
-    VclPtr<LicenseView> m_pLicense;
-    VclPtr<PushButton> m_pDown;
-
-    VclPtr<PushButton> m_pAcceptButton;
-    VclPtr<PushButton> m_pDeclineButton;
+    m_xArrow1->show();
+    m_xArrow2->hide();
 
-    DECL_LINK(PageDownHdl, Button*, void);
-    DECL_LINK(ScrolledHdl, LicenseView&, void);
-    DECL_LINK(EndReachedHdl, LicenseView&, void);
-    DECL_LINK(CancelHdl, Button*, void);
-    DECL_LINK(AcceptHdl, Button*, void);
+    m_xLicense->connect_size_allocate(LINK(this, LicenseDialogImpl, SizeAllocHdl));
+    m_xLicense->set_size_request(m_xLicense->get_approximate_digit_width() * 72,
+                                     m_xLicense->get_height_rows(21));
 
-    bool m_bLicenseRead;
+    m_xLicense->set_text(sLicenseText);
+    m_xFtHead->set_label(m_xFtHead->get_label() + "\n" + sExtensionName);
 
-    LicenseDialogImpl(
-        vcl::Window * pParent,
-        const OUString & sExtensionName,
-        const OUString & sLicenseText);
-    virtual ~LicenseDialogImpl() override { disposeOnce(); }
-    virtual void dispose() override;
+    m_xAcceptButton->connect_clicked( LINK(this, LicenseDialogImpl, AcceptHdl) );
+    m_xDeclineButton->connect_clicked( LINK(this, LicenseDialogImpl, CancelHdl) );
 
-    virtual void Activate() override;
+    m_xLicense->connect_vadjustment_changed(LINK(this, LicenseDialogImpl, ScrolledHdl));
+    m_xDown->connect_mouse_press(LINK(this, LicenseDialogImpl, MousePressHdl));
+    m_xDown->connect_mouse_release(LINK(this, LicenseDialogImpl, MouseReleaseHdl));
+    m_xDown->connect_key_press(LINK(this, LicenseDialogImpl, KeyInputHdl));
+    m_xDown->connect_key_release(LINK(this, LicenseDialogImpl, KeyReleaseHdl));
 
-};
+    m_aRepeat.SetTimeout(Application::GetSettings().GetMouseSettings().GetButtonRepeat());
+    m_aRepeat.SetInvokeHandler(LINK(this, LicenseDialogImpl, ScrollTimerHdl));
 
-void LicenseDialogImpl::dispose()
-{
-    m_pFtHead.clear();
-    m_pArrow1.clear();
-    m_pArrow2.clear();
-    m_pLicense.clear();
-    m_pDown.clear();
-    m_pAcceptButton.clear();
-    m_pDeclineButton.clear();
-    ModalDialog::dispose();
+    m_aResized.SetPriority(TaskPriority::LOWEST);
+    m_aResized.SetInvokeHandler(LINK(this, LicenseDialogImpl, ResizedHdl));
 }
 
-
-LicenseView::LicenseView( vcl::Window* pParent, WinBits nStyle )
-    : MultiLineEdit( pParent, nStyle )
+IMPL_LINK_NOARG(LicenseDialogImpl, SizeAllocHdl, const Size&, void)
 {
-    SetLeftMargin( 5 );
-    mbEndReached = IsEndReached();
-    StartListening( *GetTextEngine() );
+    m_aResized.Start();
 }
 
-VCL_BUILDER_FACTORY_CONSTRUCTOR(LicenseView, WB_CLIPCHILDREN|WB_LEFT|WB_VSCROLL)
-
-LicenseView::~LicenseView()
+IMPL_LINK_NOARG(LicenseDialogImpl, AcceptHdl, weld::Button&, void)
 {
-    disposeOnce();
+    m_xDialog->response(RET_OK);
 }
 
-void LicenseView::dispose()
+IMPL_LINK_NOARG(LicenseDialogImpl, CancelHdl, weld::Button&, void)
 {
-    maEndReachedHdl = Link<LicenseView&,void>();
-    maScrolledHdl   = Link<LicenseView&,void>();
-    EndListeningAll();
-    MultiLineEdit::dispose();
+    m_xDialog->response(RET_CANCEL);
 }
 
-void LicenseView::ScrollDown( ScrollType eScroll )
+bool LicenseDialogImpl::IsEndReached() const
 {
-    ScrollBar*  pScroll = GetVScrollBar();
-    if ( pScroll )
-        pScroll->DoScrollAction( eScroll );
-}
-
-bool LicenseView::IsEndReached() const
-{
-    bool bEndReached;
-
-    TextView*       pView = GetTextView();
-    ExtTextEngine*  pEdit = GetTextEngine();
-    const long      nHeight = pEdit->GetTextHeight();
-    Size            aOutSize = pView->GetWindow()->GetOutputSizePixel();
-    Point           aBottom( 0, aOutSize.Height() );
-
-    bEndReached = pView->GetDocPos( aBottom ).Y() >= nHeight - 1;
-
-    return bEndReached;
+    return m_xLicense->vadjustment_get_value() + m_xLicense->vadjustment_get_page_size() >= m_xLicense->vadjustment_get_upper();
 }
 
-void LicenseView::Notify( SfxBroadcaster&, const SfxHint& rHint )
+IMPL_LINK_NOARG(LicenseDialogImpl, ScrolledHdl, weld::TextView&, void)
 {
-    const TextHint* pTextHint = dynamic_cast<const TextHint*>(&rHint);
-    if ( pTextHint )
+    if (IsEndReached())
     {
-        bool    bLastVal = EndReached();
-        const SfxHintId nId = pTextHint->GetId();
+        m_xDown->set_sensitive(false);
+        m_aRepeat.Stop();
 
-        if ( nId == SfxHintId::TextParaInserted )
+        if (!m_bLicenseRead)
         {
-            if ( bLastVal )
-                mbEndReached = IsEndReached();
-        }
-        else if ( nId == SfxHintId::TextViewScrolled )
-        {
-            if ( ! mbEndReached )
-                mbEndReached = IsEndReached();
-            maScrolledHdl.Call( *this );
-        }
-
-        if ( EndReached() && !bLastVal )
-        {
-            maEndReachedHdl.Call( *this );
+            m_xAcceptButton->set_sensitive(true);
+            m_xAcceptButton->grab_focus();
+            m_xArrow1->hide();
+            m_xArrow2->show();
+            m_bLicenseRead = true;
         }
     }
+    else
+        m_xDown->set_sensitive(true);
 }
 
-
-LicenseDialogImpl::LicenseDialogImpl(
-    vcl::Window * pParent,
-    const OUString & sExtensionName,
-    const OUString & sLicenseText)
-    : ModalDialog(pParent, "LicenseDialog", "desktop/ui/licensedialog.ui")
-    , m_bLicenseRead(false)
+void LicenseDialogImpl::PageDown()
 {
-    get(m_pFtHead, "head");
-    get(m_pArrow1, "arrow1");
-    get(m_pArrow2, "arrow2");
-    get(m_pDown, "down");
-    get(m_pAcceptButton, "accept");
-    get(m_pDeclineButton, "decline");
-    m_pArrow1->Show();
-    m_pArrow2->Show(false);
-    get(m_pLicense, "textview");
-
-    Size aSize(m_pLicense->LogicToPixel(Size(290, 170), MapMode(MapUnit::MapAppFont)));
-    m_pLicense->set_width_request(aSize.Width());
-    m_pLicense->set_height_request(aSize.Height());
-
-    m_pLicense->SetText(sLicenseText);
-    m_pFtHead->SetText(m_pFtHead->GetText() + "\n" + sExtensionName);
-
-    m_pAcceptButton->SetClickHdl( LINK(this, LicenseDialogImpl, AcceptHdl) );
-    m_pDeclineButton->SetClickHdl( LINK(this, LicenseDialogImpl, CancelHdl) );
-
-    m_pLicense->SetEndReachedHdl( LINK(this, LicenseDialogImpl, EndReachedHdl) );
-    m_pLicense->SetScrolledHdl( LINK(this, LicenseDialogImpl, ScrolledHdl) );
-    m_pDown->SetClickHdl( LINK(this, LicenseDialogImpl, PageDownHdl) );
-
-    // We want a automatic repeating page down button
-    WinBits aStyle = m_pDown->GetStyle();
-    aStyle |= WB_REPEAT;
-    m_pDown->SetStyle( aStyle );
+    m_xLicense->vadjustment_set_value(m_xLicense->vadjustment_get_value() +
+                                      m_xLicense->vadjustment_get_page_size());
+    ScrolledHdl(*m_xLicense);
 }
 
-IMPL_LINK_NOARG(LicenseDialogImpl, AcceptHdl, Button*, void)
+IMPL_LINK(LicenseDialogImpl, KeyInputHdl, const KeyEvent&, rKEvt, bool)
 {
-    EndDialog(RET_OK);
+    vcl::KeyCode aKeyCode = rKEvt.GetKeyCode();
+    if (aKeyCode.GetCode() == KEY_RETURN || aKeyCode.GetCode() == KEY_SPACE)
+        PageDown();
+    return false;
 }
 
-IMPL_LINK_NOARG(LicenseDialogImpl, CancelHdl, Button*, void)
+IMPL_LINK_NOARG(LicenseDialogImpl, ResizedHdl, Timer*, void)
 {
-    EndDialog();
+    ScrolledHdl(*m_xLicense);
 }
 
-void LicenseDialogImpl::Activate()
+IMPL_LINK_NOARG(LicenseDialogImpl, ScrollTimerHdl, Timer*, void)
 {
-    if (!m_bLicenseRead)
-    {
-        //Only enable the scroll down button if the license text does not fit into the window
-        if (m_pLicense->IsEndReached())
-        {
-            m_pDown->Disable();
-            m_pAcceptButton->Enable();
-            m_pAcceptButton->GrabFocus();
-        }
-        else
-        {
-            m_pDown->Enable();
-            m_pDown->GrabFocus();
-            m_pAcceptButton->Disable();
-        }
-    }
+    PageDown();
 }
 
-IMPL_LINK_NOARG(LicenseDialogImpl, ScrolledHdl, LicenseView&, void)
+IMPL_STATIC_LINK_NOARG(LicenseDialogImpl, KeyReleaseHdl, const KeyEvent&, bool)
 {
-    if (m_pLicense->IsEndReached())
-        m_pDown->Disable();
-    else
-        m_pDown->Enable();
+    return false;
 }
 
-IMPL_LINK_NOARG(LicenseDialogImpl, PageDownHdl, Button*, void)
+IMPL_LINK_NOARG(LicenseDialogImpl, MousePressHdl, const MouseEvent&, bool)
 {
-    m_pLicense->ScrollDown( ScrollType::PageDown );
+    PageDown();
+    m_aRepeat.Start();
+    return false;
 }
 
-IMPL_LINK_NOARG(LicenseDialogImpl, EndReachedHdl, LicenseView&, void)
+IMPL_LINK_NOARG(LicenseDialogImpl, MouseReleaseHdl, const MouseEvent&, bool)
 {
-    m_pAcceptButton->Enable();
-    m_pAcceptButton->GrabFocus();
-    m_pArrow1->Show(false);
-    m_pArrow2->Show();
-    m_bLicenseRead = true;
+    m_aRepeat.Stop();
+    return false;
 }
 
-
 LicenseDialog::LicenseDialog( Sequence<Any> const& args,
                           Reference<XComponentContext> const& )
 {
@@ -282,10 +211,8 @@ LicenseDialog::LicenseDialog( Sequence<Any> const& args,
 
 void LicenseDialog::setTitle( OUString const & )
 {
-
 }
 
-
 sal_Int16 LicenseDialog::execute()
 {
     return vcl::solarthread::syncExecute(
@@ -294,10 +221,8 @@ sal_Int16 LicenseDialog::execute()
 
 sal_Int16 LicenseDialog::solar_execute()
 {
-    ScopedVclPtrInstance<LicenseDialogImpl> dlg(
-            VCLUnoHelper::GetWindow(m_parent), m_sExtensionName, m_sLicenseText);
-
-    return dlg->Execute();
+    LicenseDialogImpl dlg(Application::GetFrameWeld(m_parent), m_sExtensionName, m_sLicenseText);
+    return dlg.run();
 }
 
 } // namespace dp_gui
diff --git a/desktop/uiconfig/ui/licensedialog.ui b/desktop/uiconfig/ui/licensedialog.ui
index d7e77615b29a..bb139219e353 100644
--- a/desktop/uiconfig/ui/licensedialog.ui
+++ b/desktop/uiconfig/ui/licensedialog.ui
@@ -1,12 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
 <interface domain="dkt">
   <requires lib="gtk+" version="3.18"/>
-  <requires lib="LibreOffice" version="1.0"/>
   <object class="GtkDialog" id="LicenseDialog">
     <property name="can_focus">False</property>
     <property name="border_width">6</property>
     <property name="title" translatable="yes" context="licensedialog|LicenseDialog">Extension Software License Agreement</property>
     <property name="type_hint">dialog</property>
+    <child>
+      <placeholder/>
+    </child>
     <child internal-child="vbox">
       <object class="GtkBox" id="dialog-vbox1">
         <property name="can_focus">False</property>
@@ -17,7 +20,7 @@
             <property name="can_focus">False</property>
             <property name="layout_style">end</property>
             <child>
-              <object class="GtkButton" id="accept">
+              <object class="GtkButton" id="ok">
                 <property name="label" translatable="yes" context="licensedialog|accept">Accept</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
@@ -32,7 +35,7 @@
               </packing>
             </child>
             <child>
-              <object class="GtkButton" id="decline">
+              <object class="GtkButton" id="cancel">
                 <property name="label" translatable="yes" context="licensedialog|decline">Decline</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
@@ -63,14 +66,12 @@
               <object class="GtkLabel" id="head">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="xalign">0</property>
                 <property name="label" translatable="yes" context="licensedialog|head">Please follow these steps to proceed with the installation of the extension:</property>
+                <property name="xalign">0</property>
               </object>
               <packing>
                 <property name="left_attach">0</property>
                 <property name="top_attach">1</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
               </packing>
             </child>
             <child>
@@ -86,14 +87,12 @@
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
                     <property name="valign">start</property>
-                    <property name="xalign">0</property>
                     <property name="label" translatable="yes" context="licensedialog|label2">1.</property>
+                    <property name="xalign">0</property>
                   </object>
                   <packing>
                     <property name="left_attach">1</property>
                     <property name="top_attach">0</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
                   </packing>
                 </child>
                 <child>
@@ -101,14 +100,12 @@
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
                     <property name="valign">start</property>
-                    <property name="xalign">0</property>
                     <property name="label" translatable="yes" context="licensedialog|label3">2.</property>
+                    <property name="xalign">0</property>
                   </object>
                   <packing>
                     <property name="left_attach">1</property>
                     <property name="top_attach">1</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
                   </packing>
                 </child>
                 <child>
@@ -116,13 +113,11 @@
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
                     <property name="valign">start</property>
-                    <property name="pixbuf">res/sc06300.png</property>
+                    <property name="icon_name">res/sc06300.png</property>
                   </object>
                   <packing>
                     <property name="left_attach">0</property>
                     <property name="top_attach">0</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
                   </packing>
                 </child>
                 <child>
@@ -130,13 +125,11 @@
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
                     <property name="valign">start</property>
-                    <property name="pixbuf">res/sc06300.png</property>
+                    <property name="icon_name">res/sc06300.png</property>
                   </object>
                   <packing>
                     <property name="left_attach">0</property>
                     <property name="top_attach">1</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
                   </packing>
                 </child>
                 <child>
@@ -145,16 +138,15 @@
                     <property name="can_focus">False</property>
                     <property name="valign">start</property>
                     <property name="hexpand">True</property>
-                    <property name="xalign">0</property>
                     <property name="label" translatable="yes" context="licensedialog|label4">Read the complete License Agreement. Use the scroll bar or the 'Scroll Down' button in this dialog to view the entire license text.</property>
                     <property name="wrap">True</property>
+                    <property name="width_chars">55</property>
                     <property name="max_width_chars">55</property>
+                    <property name="xalign">0</property>
                   </object>
                   <packing>
                     <property name="left_attach">2</property>
                     <property name="top_attach">0</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
                   </packing>
                 </child>
                 <child>
@@ -163,16 +155,15 @@
                     <property name="can_focus">False</property>
                     <property name="valign">start</property>
                     <property name="hexpand">True</property>
-                    <property name="xalign">0</property>
                     <property name="label" translatable="yes" context="licensedialog|label5">Accept the License Agreement for the extension by pressing the 'Accept' button.</property>
                     <property name="wrap">True</property>
+                    <property name="width_chars">55</property>
                     <property name="max_width_chars">55</property>
+                    <property name="xalign">0</property>
                   </object>
                   <packing>
                     <property name="left_attach">2</property>
                     <property name="top_attach">1</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
                   </packing>
                 </child>
                 <child>
@@ -181,13 +172,13 @@
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
                     <property name="receives_default">True</property>
+                    <property name="events">GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
                     <property name="valign">start</property>
                     <property name="use_underline">True</property>
                   </object>
                   <packing>
                     <property name="left_attach">3</property>
                     <property name="top_attach">0</property>
-                    <property name="width">1</property>
                     <property name="height">2</property>
                   </packing>
                 </child>
@@ -195,23 +186,28 @@
               <packing>
                 <property name="left_attach">0</property>
                 <property name="top_attach">2</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
               </packing>
             </child>
             <child>
-              <object class="deploymentgui-LicenseView" id="textview:border">
+              <object class="GtkScrolledWindow">
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="hexpand">True</property>
                 <property name="vexpand">True</property>
-                <property name="editable">False</property>
+                <property name="shadow_type">in</property>
+                <child>
+                  <object class="GtkTextView" id="textview">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hexpand">True</property>
+                    <property name="vexpand">True</property>
+                    <property name="editable">False</property>
+                  </object>
+                </child>
               </object>
               <packing>
                 <property name="left_attach">0</property>
                 <property name="top_attach">0</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
               </packing>
             </child>
           </object>
@@ -224,8 +220,8 @@
       </object>
     </child>
     <action-widgets>
-      <action-widget response="0">accept</action-widget>
-      <action-widget response="0">decline</action-widget>
+      <action-widget response="-5">ok</action-widget>
+      <action-widget response="-6">cancel</action-widget>
     </action-widgets>
   </object>
 </interface>
diff --git a/extras/source/glade/libreoffice-catalog.xml.in b/extras/source/glade/libreoffice-catalog.xml.in
index abd450bb1d0a..6dc2fd503938 100644
--- a/extras/source/glade/libreoffice-catalog.xml.in
+++ b/extras/source/glade/libreoffice-catalog.xml.in
@@ -172,9 +172,6 @@
     <glade-widget-class title="Cui Custom MultiLine Edit" name="cuilo-CuiCustomMultilineEdit"
                         generic-name="CuiCustomMultiLineEdit" parent="GtkTextView"
                         icon-name="widget-gtk-textview"/>
-    <glade-widget-class title="LicenseView" name="deploymentgui-LicenseView"
-                        generic-name="LicenseView" parent="GtkTextView"
-                        icon-name="widget-gtk-textview"/>
     <glade-widget-class title="SvtValueSet" name="svtlo-ValueSet"
                         generic-name="Set of Value Options" parent="GtkDrawingArea"
                         icon-name="widget-gtk-drawingarea"/>
diff --git a/include/sfx2/charwin.hxx b/include/sfx2/charwin.hxx
index 2dd88b7e33e1..2915c7b05ed1 100644
--- a/include/sfx2/charwin.hxx
+++ b/include/sfx2/charwin.hxx
@@ -42,7 +42,7 @@ private:
 
     virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override;
     virtual void Resize() override;
-    virtual void MouseButtonDown(const MouseEvent&) override;
+    virtual bool MouseButtonDown(const MouseEvent&) override;
     virtual void GetFocus() override;
     virtual void LoseFocus() override;
     virtual bool KeyInput(const KeyEvent&) override;
diff --git a/include/svtools/valueset.hxx b/include/svtools/valueset.hxx
index da25780b02cd..5ebc98267b72 100644
--- a/include/svtools/valueset.hxx
+++ b/include/svtools/valueset.hxx
@@ -478,8 +478,8 @@ public:
 
     virtual void    SetDrawingArea(weld::DrawingArea* pDrawingArea) override;
 
-    virtual void    MouseButtonDown( const MouseEvent& rMEvt ) override;
-    virtual void    MouseMove( const MouseEvent& rMEvt ) override;
+    virtual bool    MouseButtonDown( const MouseEvent& rMEvt ) override;
+    virtual bool    MouseMove( const MouseEvent& rMEvt ) override;
     virtual bool    KeyInput( const KeyEvent& rKEvt ) override;
     virtual void    Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override;
     virtual void    GetFocus() override;
diff --git a/include/svx/charmap.hxx b/include/svx/charmap.hxx
index d4a5caa941dc..b513f1ab593b 100644
--- a/include/svx/charmap.hxx
+++ b/include/svx/charmap.hxx
@@ -112,9 +112,9 @@ private:
     virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override;
     virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override;
     virtual void Resize() override;
-    virtual void MouseButtonDown(const MouseEvent& rMEvt) override;
-    virtual void MouseMove(const MouseEvent& rMEvt) override;
-    virtual void MouseButtonUp(const MouseEvent& rMEvt) override;
+    virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
+    virtual bool MouseMove(const MouseEvent& rMEvt) override;
+    virtual bool MouseButtonUp(const MouseEvent& rMEvt) override;
     virtual void GetFocus() override;
     virtual void LoseFocus() override;
     virtual bool KeyInput(const KeyEvent&) override;
diff --git a/include/svx/connctrl.hxx b/include/svx/connctrl.hxx
index 45cc99588d4f..bafcc6c892e8 100644
--- a/include/svx/connctrl.hxx
+++ b/include/svx/connctrl.hxx
@@ -60,7 +60,7 @@ public:
 
     virtual void Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect ) override;
     virtual void Resize() override;
-    virtual void MouseButtonDown(const MouseEvent& rMEvt) override;
+    virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
 
     void         SetAttributes( const SfxItemSet& rInAttrs );
     sal_uInt16   GetLineDeltaCount();
diff --git a/include/svx/dialcontrol.hxx b/include/svx/dialcontrol.hxx
index 6c8be018e053..7a15736372cf 100644
--- a/include/svx/dialcontrol.hxx
+++ b/include/svx/dialcontrol.hxx
@@ -149,9 +149,9 @@ public:
 
     virtual void        StyleUpdated() override;
 
-    virtual void        MouseButtonDown( const MouseEvent& rMEvt ) override;
-    virtual void        MouseMove( const MouseEvent& rMEvt ) override;
-    virtual void        MouseButtonUp( const MouseEvent& rMEvt ) override;
+    virtual bool        MouseButtonDown( const MouseEvent& rMEvt ) override;
+    virtual bool        MouseMove( const MouseEvent& rMEvt ) override;
+    virtual bool        MouseButtonUp( const MouseEvent& rMEvt ) override;
     virtual bool        KeyInput(const KeyEvent& rKEvt) override;
     virtual void        LoseFocus() override;
 
diff --git a/include/svx/dlgctrl.hxx b/include/svx/dlgctrl.hxx
index 08cb40dea074..de0d65259c50 100644
--- a/include/svx/dlgctrl.hxx
+++ b/include/svx/dlgctrl.hxx
@@ -113,7 +113,7 @@ public:
 
     virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&) override;
     virtual void Resize() override;
-    virtual void MouseButtonDown(const MouseEvent&) override;
+    virtual bool MouseButtonDown(const MouseEvent&) override;
     virtual bool KeyInput(const KeyEvent&) override;
     virtual void GetFocus() override;
     virtual void LoseFocus() override;
@@ -178,7 +178,7 @@ public:
 
     virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override;
     virtual void Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect ) override;
-    virtual void MouseButtonDown( const MouseEvent& rMEvt ) override;
+    virtual bool MouseButtonDown( const MouseEvent& rMEvt ) override;
     virtual void Resize() override;
     virtual tools::Rectangle GetFocusRect() override;
 
diff --git a/include/svx/frmsel.hxx b/include/svx/frmsel.hxx
index 99816c6086a7..7e3bdcdf73dc 100644
--- a/include/svx/frmsel.hxx
+++ b/include/svx/frmsel.hxx
@@ -180,7 +180,7 @@ public:
 
 protected:
     virtual void        Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect ) override;
-    virtual void        MouseButtonDown( const MouseEvent& rMEvt ) override;
+    virtual bool        MouseButtonDown( const MouseEvent& rMEvt ) override;
     virtual bool        KeyInput( const KeyEvent& rKEvt ) override;
     virtual void        GetFocus() override;
     virtual void        LoseFocus() override;
diff --git a/include/svx/measctrl.hxx b/include/svx/measctrl.hxx
index db1380f6a34f..77eba3d8c818 100644
--- a/include/svx/measctrl.hxx
+++ b/include/svx/measctrl.hxx
@@ -45,7 +45,7 @@ public:
 
     virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override;
     virtual void Resize() override;
-    virtual void MouseButtonDown(const MouseEvent& rMEvt) override;
+    virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
 
     void SetAttributes(const SfxItemSet& rInAttrs);
 };
diff --git a/include/vcl/customweld.hxx b/include/vcl/customweld.hxx
index 5399d6c79c41..db60521a195d 100644
--- a/include/vcl/customweld.hxx
+++ b/include/vcl/customweld.hxx
@@ -27,9 +27,9 @@ public:
     }
     virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) = 0;
     virtual void Resize() {}
-    virtual void MouseButtonDown(const MouseEvent&) {}
-    virtual void MouseMove(const MouseEvent&) {}
-    virtual void MouseButtonUp(const MouseEvent&) {}
+    virtual bool MouseButtonDown(const MouseEvent&) { return false; }
+    virtual bool MouseMove(const MouseEvent&) { return false; }
+    virtual bool MouseButtonUp(const MouseEvent&) { return false; }
     virtual void GetFocus() {}
     virtual void LoseFocus() {}
     virtual void StyleUpdated() { Invalidate(); }
@@ -94,9 +94,9 @@ private:
 
     DECL_LINK(DoResize, const Size& rSize, void);
     DECL_LINK(DoPaint, weld::DrawingArea::draw_args, void);
-    DECL_LINK(DoMouseButtonDown, const MouseEvent&, void);
-    DECL_LINK(DoMouseMove, const MouseEvent&, void);
-    DECL_LINK(DoMouseButtonUp, const MouseEvent&, void);
+    DECL_LINK(DoMouseButtonDown, const MouseEvent&, bool);
+    DECL_LINK(DoMouseMove, const MouseEvent&, bool);
+    DECL_LINK(DoMouseButtonUp, const MouseEvent&, bool);
     DECL_LINK(DoGetFocus, weld::Widget&, void);
     DECL_LINK(DoLoseFocus, weld::Widget&, void);
     DECL_LINK(DoKeyPress, const KeyEvent&, bool);
diff --git a/include/vcl/layout.hxx b/include/vcl/layout.hxx
index da4cb16f5d68..33a6db730a85 100644
--- a/include/vcl/layout.hxx
+++ b/include/vcl/layout.hxx
@@ -614,9 +614,9 @@ private:
     void* m_pUserData;
     Link<std::pair<vcl::RenderContext&, const tools::Rectangle&>, void> m_aPaintHdl;
     Link<const Size&, void> m_aResizeHdl;
-    Link<const MouseEvent&, void> m_aMousePressHdl;
-    Link<const MouseEvent&, void> m_aMouseMotionHdl;
-    Link<const MouseEvent&, void> m_aMouseReleaseHdl;
+    Link<const MouseEvent&, bool> m_aMousePressHdl;
+    Link<const MouseEvent&, bool> m_aMouseMotionHdl;
+    Link<const MouseEvent&, bool> m_aMouseReleaseHdl;
     Link<const KeyEvent&, bool> m_aKeyPressHdl;
     Link<const KeyEvent&, bool> m_aKeyReleaseHdl;
     Link<VclDrawingArea&, void> m_aStyleUpdatedHdl;
@@ -633,15 +633,18 @@ private:
     }
     virtual void MouseMove(const MouseEvent& rMEvt) override
     {
-        m_aMouseMotionHdl.Call(rMEvt);
+        if (!m_aMouseMotionHdl.Call(rMEvt))
+            Control::MouseMove(rMEvt);
     }
     virtual void MouseButtonDown(const MouseEvent& rMEvt) override
     {
-        m_aMousePressHdl.Call(rMEvt);
+        if (!m_aMousePressHdl.Call(rMEvt))
+            Control::MouseButtonDown(rMEvt);
     }
     virtual void MouseButtonUp(const MouseEvent& rMEvt) override
     {
-        m_aMouseReleaseHdl.Call(rMEvt);
+        if (!m_aMouseReleaseHdl.Call(rMEvt))
+            Control::MouseButtonUp(rMEvt);
     }
     virtual void KeyInput(const KeyEvent& rKEvt) override
     {
@@ -728,15 +731,15 @@ public:
     {
         m_aResizeHdl = rLink;
     }
-    void SetMousePressHdl(const Link<const MouseEvent&, void>& rLink)
+    void SetMousePressHdl(const Link<const MouseEvent&, bool>& rLink)
     {
         m_aMousePressHdl = rLink;
     }
-    void SetMouseMoveHdl(const Link<const MouseEvent&, void>& rLink)
+    void SetMouseMoveHdl(const Link<const MouseEvent&, bool>& rLink)
     {
         m_aMouseMotionHdl = rLink;
     }
-    void SetMouseReleaseHdl(const Link<const MouseEvent&, void>& rLink)
+    void SetMouseReleaseHdl(const Link<const MouseEvent&, bool>& rLink)
     {
         m_aMouseReleaseHdl = rLink;
     }
diff --git a/include/vcl/vclmedit.hxx b/include/vcl/vclmedit.hxx
index 1cd49adde204..0c5b0c403e95 100644
--- a/include/vcl/vclmedit.hxx
+++ b/include/vcl/vclmedit.hxx
@@ -97,7 +97,6 @@ protected:
 
     TextView*       GetTextView() const;
     ExtTextEngine*  GetTextEngine() const;
-    ScrollBar*      GetVScrollBar() const;
 
     virtual void ApplySettings(vcl::RenderContext& rRenderContext) override;
 public:
@@ -170,7 +169,10 @@ public:
 
     void            EnableCursor( bool bEnable );
 
+    ScrollBar&      GetVScrollBar() const;
+
     TextWindow*     GetTextWindow();
+
     virtual FactoryFunction GetUITestFactory() const override;
 
     virtual bool set_property(const OString &rKey, const OUString &rValue) override;
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index 527167f2f5c8..4673da099fd6 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -71,6 +71,9 @@ protected:
     Link<const Size&, void> m_aSizeAllocateHdl;
     Link<const KeyEvent&, bool> m_aKeyPressHdl;
     Link<const KeyEvent&, bool> m_aKeyReleaseHdl;
+    Link<const MouseEvent&, bool> m_aMousePressHdl;
+    Link<const MouseEvent&, bool> m_aMouseMotionHdl;
+    Link<const MouseEvent&, bool> m_aMouseReleaseHdl;
 
 public:
     virtual void set_sensitive(bool sensitive) = 0;
@@ -156,6 +159,24 @@ public:
         m_aKeyReleaseHdl = rLink;
     }
 
+    virtual void connect_mouse_press(const Link<const MouseEvent&, bool>& rLink)
+    {
+        assert(!m_aMousePressHdl.IsSet() || !rLink.IsSet());
+        m_aMousePressHdl = rLink;
+    }
+
+    virtual void connect_mouse_move(const Link<const MouseEvent&, bool>& rLink)
+    {
+        assert(!m_aMouseMotionHdl.IsSet() || !rLink.IsSet());
+        m_aMouseMotionHdl = rLink;
+    }
+
+    virtual void connect_mouse_release(const Link<const MouseEvent&, bool>& rLink)
+    {
+        assert(!m_aMouseReleaseHdl.IsSet() || !rLink.IsSet());
+        m_aMouseReleaseHdl = rLink;
+    }
+
     virtual void grab_add() = 0;
     virtual bool has_grab() const = 0;
     virtual void grab_remove() = 0;
@@ -1318,8 +1339,10 @@ private:
 
 protected:
     Link<TextView&, void> m_aChangeHdl;
+    Link<TextView&, void> m_aVChangeHdl;
 
     void signal_changed() { m_aChangeHdl.Call(*this); }
+    void signal_vadjustment_changed() { m_aVChangeHdl.Call(*this); }
 
 public:
     virtual void set_text(const OUString& rText) = 0;
@@ -1339,6 +1362,13 @@ public:
     bool get_value_changed_from_saved() const { return m_sSavedValue != get_text(); }
 
     void connect_changed(const Link<TextView&, void>& rLink) { m_aChangeHdl = rLink; }
+
+    virtual int vadjustment_get_value() const = 0;
+    virtual int vadjustment_get_upper() const = 0;
+    virtual int vadjustment_get_lower() const = 0;
+    virtual int vadjustment_get_page_size() const = 0;
+    virtual void vadjustment_set_value(int value) = 0;
+    void connect_vadjustment_changed(const Link<TextView&, void>& rLink) { m_aVChangeHdl = rLink; }
 };
 
 class VCL_DLLPUBLIC Expander : virtual public Container
@@ -1362,9 +1392,6 @@ public:
 
 protected:
     Link<draw_args, void> m_aDrawHdl;
-    Link<const MouseEvent&, void> m_aMousePressHdl;
-    Link<const MouseEvent&, void> m_aMouseMotionHdl;
-    Link<const MouseEvent&, void> m_aMouseReleaseHdl;
     Link<Widget&, void> m_aStyleUpdatedHdl;
     Link<const Point&, bool> m_aPopupMenuHdl;
     Link<Widget&, tools::Rectangle> m_aGetFocusRectHdl;
@@ -1377,18 +1404,6 @@ protected:
 
 public:
     void connect_draw(const Link<draw_args, void>& rLink) { m_aDrawHdl = rLink; }
-    void connect_mouse_press(const Link<const MouseEvent&, void>& rLink)
-    {
-        m_aMousePressHdl = rLink;
-    }
-    void connect_mouse_move(const Link<const MouseEvent&, void>& rLink)
-    {
-        m_aMouseMotionHdl = rLink;
-    }
-    void connect_mouse_release(const Link<const MouseEvent&, void>& rLink)
-    {
-        m_aMouseReleaseHdl = rLink;
-    }
     void connect_style_updated(const Link<Widget&, void>& rLink) { m_aStyleUpdatedHdl = rLink; }
     void connect_popup_menu(const Link<const Point&, bool>& rLink) { m_aPopupMenuHdl = rLink; }
     void connect_focus_rect(const Link<Widget&, tools::Rectangle>& rLink)
diff --git a/sfx2/source/control/charwin.cxx b/sfx2/source/control/charwin.cxx
index 567c2f2ffc95..c6d1b52aac1d 100644
--- a/sfx2/source/control/charwin.cxx
+++ b/sfx2/source/control/charwin.cxx
@@ -62,7 +62,7 @@ void SvxCharView::LoseFocus()
     Invalidate();
 }
 
-void SvxCharView::MouseButtonDown(const MouseEvent& rMEvt)
+bool SvxCharView::MouseButtonDown(const MouseEvent& rMEvt)
 {
     if ( rMEvt.IsLeft() )
     {
@@ -82,6 +82,8 @@ void SvxCharView::MouseButtonDown(const MouseEvent& rMEvt)
         Invalidate();
         createContextMenu();
     }
+
+    return true;
 }
 
 bool SvxCharView::KeyInput(const KeyEvent& rKEvt)
diff --git a/solenv/sanitizers/ui/desktop.suppr b/solenv/sanitizers/ui/desktop.suppr
index d7865ac0ac27..75c93cdb1484 100644
--- a/solenv/sanitizers/ui/desktop.suppr
+++ b/solenv/sanitizers/ui/desktop.suppr
@@ -10,7 +10,6 @@ desktop/uiconfig/ui/licensedialog.ui://GtkImage[@id='arrow1'] no-labelled-by
 desktop/uiconfig/ui/licensedialog.ui://GtkImage[@id='arrow2'] no-labelled-by
 desktop/uiconfig/ui/licensedialog.ui://GtkLabel[@id='label4'] orphan-label
 desktop/uiconfig/ui/licensedialog.ui://GtkLabel[@id='label5'] orphan-label
-desktop/uiconfig/ui/licensedialog.ui://deploymentgui-LicenseView[@id='textview:border'] no-labelled-by
 desktop/uiconfig/ui/updatedialog.ui://GtkLabel[@id='UPDATE_LABEL'] orphan-label
 desktop/uiconfig/ui/updatedialog.ui://GtkLabel[@id='UPDATE_CHECKING'] orphan-label
 desktop/uiconfig/ui/updatedialog.ui://GtkSpinner[@id='THROBBER'] no-labelled-by
diff --git a/starmath/inc/dialog.hxx b/starmath/inc/dialog.hxx
index 6c1ccfb0cb80..da6c6eeaf2c5 100644
--- a/starmath/inc/dialog.hxx
+++ b/starmath/inc/dialog.hxx
@@ -257,7 +257,7 @@ class SmShowSymbolSet : public weld::CustomWidgetController
     Point OffsetPoint(const Point &rPoint) const;
 
     virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override;
-    virtual void MouseButtonDown(const MouseEvent& rMEvt) override;
+    virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
     virtual bool KeyInput(const KeyEvent& rKEvt) override;
 
     DECL_LINK(ScrollHdl, weld::ScrolledWindow&, void);
@@ -289,7 +289,7 @@ private:
     Link<SmShowSymbol&,void> aDblClickHdlLink;
 
     virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&) override;
-    virtual void MouseButtonDown(const MouseEvent& rMEvt) override;
+    virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
 
     void setFontSize(vcl::Font &rFont) const;
 
diff --git a/starmath/source/dialog.cxx b/starmath/source/dialog.cxx
index d75a66267f0f..f1ac1d6eec33 100644
--- a/starmath/source/dialog.cxx
+++ b/starmath/source/dialog.cxx
@@ -1001,7 +1001,7 @@ void SmShowSymbolSet::Paint(vcl::RenderContext& rRenderContext, const tools::Rec
     rRenderContext.Pop();
 }
 
-void SmShowSymbolSet::MouseButtonDown(const MouseEvent& rMEvt)
+bool SmShowSymbolSet::MouseButtonDown(const MouseEvent& rMEvt)
 {
     GrabFocus();
 
@@ -1023,6 +1023,8 @@ void SmShowSymbolSet::MouseButtonDown(const MouseEvent& rMEvt)
         if (rMEvt.GetClicks() > 1)
             aDblClickHdlLink.Call(*this);
     }
+
+    return true;
 }
 
 bool SmShowSymbolSet::KeyInput(const KeyEvent& rKEvt)
@@ -1159,10 +1161,11 @@ void SmShowSymbol::Paint(vcl::RenderContext& rRenderContext, const tools::Rectan
                                   (rRenderContext.GetOutputSize().Height() * 7 / 10)), rText);
 }
 
-void SmShowSymbol::MouseButtonDown(const MouseEvent& rMEvt)
+bool SmShowSymbol::MouseButtonDown(const MouseEvent& rMEvt)
 {
     if (rMEvt.GetClicks() > 1)
         aDblClickHdlLink.Call(*this);
+    return true;
 }
 
 void SmShowSymbol::SetSymbol(const SmSym *pSymbol)
diff --git a/svtools/source/control/valueset.cxx b/svtools/source/control/valueset.cxx
index 3f8c91900fe5..0df2623e2523 100644
--- a/svtools/source/control/valueset.cxx
+++ b/svtools/source/control/valueset.cxx
@@ -2588,7 +2588,7 @@ void SvtValueSet::ImplTracking(const Point& rPos)
     }
 }
 
-void SvtValueSet::MouseButtonDown( const MouseEvent& rMouseEvent )
+bool SvtValueSet::MouseButtonDown( const MouseEvent& rMouseEvent )
 {
     if ( rMouseEvent.IsLeft() )
     {
@@ -2605,19 +2605,19 @@ void SvtValueSet::MouseButtonDown( const MouseEvent& rMouseEvent )
             else if ( rMouseEvent.GetClicks() == 2 )
                 maDoubleClickHdl.Call( this );
 
-            return;
+            return true;
         }
     }
 
-    CustomWidgetController::MouseButtonDown( rMouseEvent );
+    return CustomWidgetController::MouseButtonDown( rMouseEvent );
 }
 
-void SvtValueSet::MouseMove(const MouseEvent& rMouseEvent)
+bool SvtValueSet::MouseMove(const MouseEvent& rMouseEvent)
 {
     // because of SelectionMode
     if ((GetStyle() & WB_MENUSTYLEVALUESET) || (GetStyle() & WB_FLATVALUESET))
         ImplTracking(rMouseEvent.GetPosPixel());
-    CustomWidgetController::MouseMove(rMouseEvent);
+    return CustomWidgetController::MouseMove(rMouseEvent);
 }
 
 void SvtValueSet::RemoveItem( sal_uInt16 nItemId )
diff --git a/svx/source/dialog/charmap.cxx b/svx/source/dialog/charmap.cxx
index c43c1f819651..50e1f5b12544 100644
--- a/svx/source/dialog/charmap.cxx
+++ b/svx/source/dialog/charmap.cxx
@@ -123,7 +123,7 @@ void SvxShowCharSet::LoseFocus()
     SelectIndex(nSelectedIndex);
 }
 
-void SvxShowCharSet::MouseButtonDown(const MouseEvent& rMEvt)
+bool SvxShowCharSet::MouseButtonDown(const MouseEvent& rMEvt)
 {
     if ( rMEvt.IsLeft() )
     {
@@ -151,9 +151,11 @@ void SvxShowCharSet::MouseButtonDown(const MouseEvent& rMEvt)
         SelectIndex( nIndex, true);
         createContextMenu();
     }
+
+    return true;
 }
 
-void SvxShowCharSet::MouseButtonUp(const MouseEvent& rMEvt)
+bool SvxShowCharSet::MouseButtonUp(const MouseEvent& rMEvt)
 {
     if ( bDrag && rMEvt.IsLeft() )
     {
@@ -163,9 +165,11 @@ void SvxShowCharSet::MouseButtonUp(const MouseEvent& rMEvt)
         ReleaseMouse();
         bDrag = false;
     }
+
+    return true;
 }
 
-void SvxShowCharSet::MouseMove(const MouseEvent& rMEvt)
+bool SvxShowCharSet::MouseMove(const MouseEvent& rMEvt)
 {
     if ( rMEvt.IsLeft() && bDrag )
     {
@@ -185,6 +189,8 @@ void SvxShowCharSet::MouseMove(const MouseEvent& rMEvt)
     // Fire the focus event.
         SelectIndex( nIndex, true );
     }
+
+    return true;
 }
 
 sal_uInt16 SvxShowCharSet::GetRowPos(sal_uInt16 _nPos)
diff --git a/svx/source/dialog/connctrl.cxx b/svx/source/dialog/connctrl.cxx
index dd0905875e29..0cc49b19c9dd 100644
--- a/svx/source/dialog/connctrl.cxx
+++ b/svx/source/dialog/connctrl.cxx
@@ -253,7 +253,7 @@ sal_uInt16 SvxXConnectionPreview::GetLineDeltaCount()
     return nCount;
 }
 
-void SvxXConnectionPreview::MouseButtonDown( const MouseEvent& rMEvt )
+bool SvxXConnectionPreview::MouseButtonDown( const MouseEvent& rMEvt )
 {
     bool bZoomIn  = rMEvt.IsLeft() && !rMEvt.IsShift();
     bool bZoomOut = rMEvt.IsRight() || rMEvt.IsShift();
@@ -305,6 +305,8 @@ void SvxXConnectionPreview::MouseButtonDown( const MouseEvent& rMEvt )
             Invalidate();
         }
     }
+
+    return true;
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svx/source/dialog/dialcontrol.cxx b/svx/source/dialog/dialcontrol.cxx
index 72c7aec62853..29aab08d5fde 100644
--- a/svx/source/dialog/dialcontrol.cxx
+++ b/svx/source/dialog/dialcontrol.cxx
@@ -531,7 +531,7 @@ void SvxDialControl::StyleUpdated()
     InvalidateControl();
 }
 
-void SvxDialControl::MouseButtonDown(const MouseEvent& rMEvt)
+bool SvxDialControl::MouseButtonDown(const MouseEvent& rMEvt)
 {
     if( rMEvt.IsLeft() )
     {
@@ -540,15 +540,17 @@ void SvxDialControl::MouseButtonDown(const MouseEvent& rMEvt)
         mpImpl->mnOldAngle = mpImpl->mnAngle;
         HandleMouseEvent( rMEvt.GetPosPixel(), true );
     }
+    return true;
 }
 
-void SvxDialControl::MouseMove( const MouseEvent& rMEvt )
+bool SvxDialControl::MouseMove( const MouseEvent& rMEvt )
 {
     if( IsMouseCaptured() && rMEvt.IsLeft() )
         HandleMouseEvent( rMEvt.GetPosPixel(), false );
+    return true;
 }
 
-void SvxDialControl::MouseButtonUp(const MouseEvent&)
+bool SvxDialControl::MouseButtonUp(const MouseEvent&)
 {
     if( IsMouseCaptured() )
     {
@@ -556,6 +558,7 @@ void SvxDialControl::MouseButtonUp(const MouseEvent&)
         if( mpImpl->mpLinkField )
             mpImpl->mpLinkField->grab_focus();
     }
+    return true;
 }
 
 bool SvxDialControl::KeyInput( const KeyEvent& rKEvt )
diff --git a/svx/source/dialog/dlgctrl.cxx b/svx/source/dialog/dlgctrl.cxx
index e5199dcd4e07..7411da47517d 100644
--- a/svx/source/dialog/dlgctrl.cxx
+++ b/svx/source/dialog/dlgctrl.cxx
@@ -188,7 +188,7 @@ void SvxRectCtl::InitSettings(vcl::RenderContext& rRenderContext)
 
 // The clicked rectangle (3 x 3) is determined and the parent (dialog)
 // is notified that the item was changed
-void SvxRectCtl::MouseButtonDown(const MouseEvent& rMEvt)
+bool SvxRectCtl::MouseButtonDown(const MouseEvent& rMEvt)
 {
     // CompletelyDisabled() added to have a disabled state for SvxRectCtl
     if(!IsCompletelyDisabled())
@@ -200,6 +200,7 @@ void SvxRectCtl::MouseButtonDown(const MouseEvent& rMEvt)
         if (m_pPage)
             m_pPage->PointChanged(GetDrawingArea(), eRP);
     }
+    return true;
 }
 
 bool SvxRectCtl::KeyInput(const KeyEvent& rKeyEvt)
@@ -668,10 +669,10 @@ void SvxPixelCtl::ChangePixel( sal_uInt16 nPixel )
 
 // The clicked rectangle is identified, to change its color
 
-void SvxPixelCtl::MouseButtonDown( const MouseEvent& rMEvt )
+bool SvxPixelCtl::MouseButtonDown( const MouseEvent& rMEvt )
 {
     if (!aRectSize.Width() || !aRectSize.Height())
-        return;
+        return true;
 
     //Grab focus when click in window
     if (!HasFocus())
@@ -685,6 +686,8 @@ void SvxPixelCtl::MouseButtonDown( const MouseEvent& rMEvt )
     {
         m_xAccess->NotifyChild(nIndex,true, true);
     }
+
+    return true;
 }
 
 tools::Rectangle SvxPixelCtl::GetFocusRect()
diff --git a/svx/source/dialog/frmsel.cxx b/svx/source/dialog/frmsel.cxx
index 7e94afe8816a..ee747175db6f 100644
--- a/svx/source/dialog/frmsel.cxx
+++ b/svx/source/dialog/frmsel.cxx
@@ -1065,7 +1065,7 @@ void FrameSelector::Paint(vcl::RenderContext& rRenderContext, const tools::Recta
         mxImpl->DrawAllTrackingRects(rRenderContext);
 }
 
-void FrameSelector::MouseButtonDown( const MouseEvent& rMEvt )
+bool FrameSelector::MouseButtonDown( const MouseEvent& rMEvt )
 {
     /*  Mouse handling:
         * Click on an unselected frame border:
@@ -1149,6 +1149,8 @@ void FrameSelector::MouseButtonDown( const MouseEvent& rMEvt )
             GetSelectHdl().Call( nullptr );
         }
     }
+
+    return true;
 }
 
 bool FrameSelector::KeyInput( const KeyEvent& rKEvt )
diff --git a/svx/source/dialog/measctrl.cxx b/svx/source/dialog/measctrl.cxx
index eb9d4011da2d..507f7ff34329 100644
--- a/svx/source/dialog/measctrl.cxx
+++ b/svx/source/dialog/measctrl.cxx
@@ -94,7 +94,7 @@ void SvxXMeasurePreview::SetAttributes(const SfxItemSet& rInAttrs)
     Invalidate();
 }
 
-void SvxXMeasurePreview::MouseButtonDown(const MouseEvent& rMEvt)
+bool SvxXMeasurePreview::MouseButtonDown(const MouseEvent& rMEvt)
 {
     bool bZoomIn  = rMEvt.IsLeft() && !rMEvt.IsShift();
     bool bZoomOut = rMEvt.IsRight() || rMEvt.IsShift();
@@ -147,6 +147,8 @@ void SvxXMeasurePreview::MouseButtonDown(const MouseEvent& rMEvt)
             Invalidate();
         }
     }
+
+    return true;
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/dbui/mailmergehelper.cxx b/sw/source/uibase/dbui/mailmergehelper.cxx
index 88e10572ea38..7626a0c3972e 100644
--- a/sw/source/uibase/dbui/mailmergehelper.cxx
+++ b/sw/source/uibase/dbui/mailmergehelper.cxx
@@ -660,7 +660,7 @@ void AddressPreview::Paint(vcl::RenderContext& rRenderContext, const tools::Rect
     rRenderContext.SetClipRegion();
 }
 
-void AddressPreview::MouseButtonDown( const MouseEvent& rMEvt )
+bool AddressPreview::MouseButtonDown( const MouseEvent& rMEvt )
 {
     if (rMEvt.IsLeft() && pImpl->nRows && pImpl->nColumns)
     {
@@ -683,6 +683,7 @@ void AddressPreview::MouseButtonDown( const MouseEvent& rMEvt )
         }
         Invalidate();
     }
+    return true;
 }
 
 bool AddressPreview::KeyInput( const KeyEvent& rKEvt )
diff --git a/sw/source/uibase/inc/mailmergehelper.hxx b/sw/source/uibase/inc/mailmergehelper.hxx
index 57aad5174ab1..ebf05e0c700c 100644
--- a/sw/source/uibase/inc/mailmergehelper.hxx
+++ b/sw/source/uibase/inc/mailmergehelper.hxx
@@ -119,7 +119,7 @@ class SW_DLLPUBLIC AddressPreview : public weld::CustomWidgetController
                        const Point& rTopLeft, const Size& rSize, bool bIsSelected);
 
     virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&) override;
-    virtual void MouseButtonDown( const MouseEvent& rMEvt ) override;
+    virtual bool MouseButtonDown( const MouseEvent& rMEvt ) override;
     virtual bool KeyInput( const KeyEvent& rKEvt ) override;
     void UpdateScrollBar();
 
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);
     }
 


More information about the Libreoffice-commits mailing list