[Libreoffice-commits] core.git: Branch 'libreoffice-6-3' - cui/source desktop/source desktop/uiconfig desktop/UIConfig_deployment.mk extras/source include/sfx2 solenv/bin solenv/sanitizers

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Fri Jun 14 18:34:41 UTC 2019


 cui/source/factory/dlgfact.cxx                             |    4 
 cui/source/factory/dlgfact.hxx                             |    2 
 desktop/UIConfig_deployment.mk                             |    1 
 desktop/source/deployment/gui/dp_gui_dialog2.cxx           |  599 +++++--------
 desktop/source/deployment/gui/dp_gui_dialog2.hxx           |  111 +-
 desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx |   62 +
 desktop/source/deployment/gui/dp_gui_extlistbox.cxx        |  302 +++---
 desktop/source/deployment/gui/dp_gui_extlistbox.hxx        |   29 
 desktop/source/deployment/gui/dp_gui_service.cxx           |    4 
 desktop/source/deployment/gui/dp_gui_theextmgr.cxx         |   99 +-
 desktop/source/deployment/gui/dp_gui_theextmgr.hxx         |   26 
 desktop/uiconfig/ui/extensionmanager.ui                    |   55 -
 desktop/uiconfig/ui/extensionmenu.ui                       |    9 
 desktop/uiconfig/ui/updaterequireddialog.ui                |  187 ++--
 extras/source/glade/libreoffice-catalog.xml.in             |    6 
 include/sfx2/sfxdlg.hxx                                    |    2 
 solenv/bin/native-code.py                                  |    2 
 solenv/sanitizers/ui/desktop.suppr                         |    4 
 18 files changed, 721 insertions(+), 783 deletions(-)

New commits:
commit 9e3ed3b9fc64882335586e9ff9c155f36a22ade2
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Wed Jun 12 11:32:40 2019 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Fri Jun 14 20:33:54 2019 +0200

    weld ExtMgrDialog and UpdateRequiredDialog
    
    Change-Id: I97e5cda847fd7f98990a87d0b1ca6d6b8b3f9d0f
    Reviewed-on: https://gerrit.libreoffice.org/74051
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/cui/source/factory/dlgfact.cxx b/cui/source/factory/dlgfact.cxx
index 0c1fbe4612c8..af99be370a81 100644
--- a/cui/source/factory/dlgfact.cxx
+++ b/cui/source/factory/dlgfact.cxx
@@ -1565,9 +1565,9 @@ VclPtr<SvxAbstractNewTableDialog> AbstractDialogFactory_Impl::CreateSvxNewTableD
 }
 
 VclPtr<VclAbstractDialog> AbstractDialogFactory_Impl::CreateOptionsDialog(
-    vcl::Window* pParent, const OUString& rExtensionId )
+    weld::Window* /*pParent*/, const OUString& rExtensionId )
 {
-    return VclPtr<CuiVclAbstractDialog_Impl>::Create( VclPtr<OfaTreeOptionsDialog>::Create( pParent, rExtensionId ) );
+    return VclPtr<CuiVclAbstractDialog_Impl>::Create( VclPtr<OfaTreeOptionsDialog>::Create(nullptr /* TODO: pParent*/, rExtensionId ) );
 }
 
 VclPtr<SvxAbstractInsRowColDlg> AbstractDialogFactory_Impl::CreateSvxInsRowColDlg(weld::Window* pParent, bool bCol, const OString& rHelpId)
diff --git a/cui/source/factory/dlgfact.hxx b/cui/source/factory/dlgfact.hxx
index 58548d82463b..ca07530a4f94 100644
--- a/cui/source/factory/dlgfact.hxx
+++ b/cui/source/factory/dlgfact.hxx
@@ -844,7 +844,7 @@ public:
     virtual VclPtr<SvxAbstractNewTableDialog> CreateSvxNewTableDialog(weld::Window* pParent) override ;
 
     virtual VclPtr<VclAbstractDialog>          CreateOptionsDialog(
-        vcl::Window* pParent, const OUString& rExtensionId ) override;
+        weld::Window* pParent, const OUString& rExtensionId ) override;
 
     virtual VclPtr<SvxAbstractInsRowColDlg> CreateSvxInsRowColDlg(weld::Window* pParent, bool bCol, const OString& rHelpId) override;
 
diff --git a/desktop/UIConfig_deployment.mk b/desktop/UIConfig_deployment.mk
index a1e08c8b599b..80e5e96c121a 100644
--- a/desktop/UIConfig_deployment.mk
+++ b/desktop/UIConfig_deployment.mk
@@ -12,6 +12,7 @@ $(eval $(call gb_UIConfig_UIConfig,desktop))
 $(eval $(call gb_UIConfig_add_uifiles,desktop,\
     desktop/uiconfig/ui/dependenciesdialog \
     desktop/uiconfig/ui/extensionmanager \
+    desktop/uiconfig/ui/extensionmenu \
     desktop/uiconfig/ui/installforalldialog \
     desktop/uiconfig/ui/licensedialog \
     desktop/uiconfig/ui/showlicensedialog \
diff --git a/desktop/source/deployment/gui/dp_gui_dialog2.cxx b/desktop/source/deployment/gui/dp_gui_dialog2.cxx
index 778b141ee671..a3c1f554e586 100644
--- a/desktop/source/deployment/gui/dp_gui_dialog2.cxx
+++ b/desktop/source/deployment/gui/dp_gui_dialog2.cxx
@@ -101,35 +101,23 @@ struct StrAllFiles : public rtl::StaticWithInit< OUString, StrAllFiles >
     }
 };
 
-//                            ExtBoxWithBtns_Impl
-
-enum MENU_COMMAND
-{
-    CMD_NONE    = 0,
-    CMD_REMOVE  = 1,
-    CMD_ENABLE,
-    CMD_DISABLE,
-    CMD_UPDATE,
-    CMD_SHOW_LICENSE
-};
-
+// ExtBoxWithBtns_Impl
 class ExtBoxWithBtns_Impl : public ExtensionBox_Impl
 {
     bool            m_bInterfaceLocked;
 
-    VclPtr<ExtMgrDialog>   m_pParent;
+    ExtMgrDialog*   m_pParent;
 
     void            SetButtonStatus( const TEntry_Impl& rEntry );
-    MENU_COMMAND    ShowPopupMenu( const Point &rPos, const long nPos );
+    OString         ShowPopupMenu( const Point &rPos, const long nPos );
 
 public:
-    explicit ExtBoxWithBtns_Impl(vcl::Window* pParent);
-    virtual ~ExtBoxWithBtns_Impl() override;
-    virtual void dispose() override;
+    explicit ExtBoxWithBtns_Impl(std::unique_ptr<weld::ScrolledWindow> xScroll);
 
     void InitFromDialog(ExtMgrDialog *pParentDialog);
 
-    virtual void    MouseButtonDown( const MouseEvent& rMEvt ) override;
+    virtual bool    MouseButtonDown( const MouseEvent& rMEvt ) override;
+    virtual bool    ContextMenu( const CommandEvent& rCEvt ) override;
 
     virtual void    RecalcAll() override;
     virtual void    selectEntry( const long nPos ) override;
@@ -137,8 +125,8 @@ public:
     void            enableButtons( bool bEnable );
 };
 
-ExtBoxWithBtns_Impl::ExtBoxWithBtns_Impl(vcl::Window* pParent)
-    : ExtensionBox_Impl(pParent)
+ExtBoxWithBtns_Impl::ExtBoxWithBtns_Impl(std::unique_ptr<weld::ScrolledWindow> xScroll)
+    : ExtensionBox_Impl(std::move(xScroll))
     , m_bInterfaceLocked(false)
     , m_pParent(nullptr)
 {
@@ -151,23 +139,6 @@ void ExtBoxWithBtns_Impl::InitFromDialog(ExtMgrDialog *pParentDialog)
     m_pParent = pParentDialog;
 }
 
-extern "C" SAL_DLLPUBLIC_EXPORT void makeExtBoxWithBtns(VclPtr<vcl::Window> & rRet, VclPtr<vcl::Window> & pParent, VclBuilder::stringmap &)
-{
-    rRet = VclPtr<ExtBoxWithBtns_Impl>::Create(pParent);
-}
-
-ExtBoxWithBtns_Impl::~ExtBoxWithBtns_Impl()
-{
-    disposeOnce();
-}
-
-void ExtBoxWithBtns_Impl::dispose()
-{
-    m_pParent.clear();
-    ExtensionBox_Impl::dispose();
-}
-
-
 void ExtBoxWithBtns_Impl::RecalcAll()
 {
     const sal_Int32 nActive = getSelIndex();
@@ -243,15 +214,44 @@ void ExtBoxWithBtns_Impl::SetButtonStatus(const TEntry_Impl& rEntry)
     }
 }
 
-MENU_COMMAND ExtBoxWithBtns_Impl::ShowPopupMenu( const Point & rPos, const long nPos )
+bool ExtBoxWithBtns_Impl::ContextMenu(const CommandEvent& rCEvt)
+{
+    if (rCEvt.GetCommand() != CommandEventId::ContextMenu)
+        return false;
+
+    const Point aMousePos(rCEvt.GetMousePosPixel());
+    const auto nPos = PointToPos(aMousePos);
+    OString sCommand = ShowPopupMenu(aMousePos, nPos);
+
+    if (sCommand == "CMD_ENABLE")
+        m_pParent->enablePackage( GetEntryData( nPos )->m_xPackage, true );
+    else if (sCommand == "CMD_DISABLE")
+        m_pParent->enablePackage( GetEntryData( nPos )->m_xPackage, false );
+    else if (sCommand == "CMD_UPDATE")
+        m_pParent->updatePackage( GetEntryData( nPos )->m_xPackage );
+    else if (sCommand == "CMD_REMOVE")
+        m_pParent->removePackage( GetEntryData( nPos )->m_xPackage );
+    else if (sCommand == "CMD_SHOW_LICENSE")
+    {
+        m_pParent->incBusy();
+        ShowLicenseDialog aLicenseDlg(m_pParent->getDialog(), GetEntryData(nPos)->m_xPackage);
+        aLicenseDlg.run();
+        m_pParent->decBusy();
+    }
+
+    return true;
+}
+
+OString ExtBoxWithBtns_Impl::ShowPopupMenu( const Point & rPos, const long nPos )
 {
     if ( nPos >= static_cast<long>(getItemCount()) )
-        return CMD_NONE;
+        return "CMD_NONE";
 
-    ScopedVclPtrInstance<PopupMenu> aPopup;
+    std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(nullptr, "desktop/ui/extensionmenu.ui"));
+    std::unique_ptr<weld::Menu> xPopup(xBuilder->weld_menu("menu"));
 
 #if ENABLE_EXTENSION_UPDATE
-    aPopup->InsertItem( CMD_UPDATE, DpResId( RID_CTX_ITEM_CHECK_UPDATE ) );
+    xPopup->append("CMD_UPDATE", DpResId( RID_CTX_ITEM_CHECK_UPDATE ) );
 #endif
 
     if ( ! GetEntryData( nPos )->m_bLocked )
@@ -259,61 +259,27 @@ MENU_COMMAND ExtBoxWithBtns_Impl::ShowPopupMenu( const Point & rPos, const long
         if ( GetEntryData( nPos )->m_bUser )
         {
             if ( GetEntryData( nPos )->m_eState == REGISTERED )
-                aPopup->InsertItem( CMD_DISABLE, DpResId( RID_CTX_ITEM_DISABLE ) );
+                xPopup->append("CMD_DISABLE", DpResId(RID_CTX_ITEM_DISABLE));
             else if ( GetEntryData( nPos )->m_eState != NOT_AVAILABLE )
-                aPopup->InsertItem( CMD_ENABLE, DpResId( RID_CTX_ITEM_ENABLE ) );
+                xPopup->append("CMD_ENABLE", DpResId(RID_CTX_ITEM_ENABLE));
         }
         if (!officecfg::Office::ExtensionManager::ExtensionSecurity::DisableExtensionRemoval::get())
         {
-            aPopup->InsertItem( CMD_REMOVE, DpResId( RID_CTX_ITEM_REMOVE ) );
+            xPopup->append("CMD_REMOVE", DpResId(RID_CTX_ITEM_REMOVE));
         }
     }
 
     if ( !GetEntryData( nPos )->m_sLicenseText.isEmpty() )
-        aPopup->InsertItem( CMD_SHOW_LICENSE, DpResId( RID_STR_SHOW_LICENSE_CMD ) );
+        xPopup->append("CMD_SHOW_LICENSE", DpResId(RID_STR_SHOW_LICENSE_CMD));
 
-    return static_cast<MENU_COMMAND>(aPopup->Execute( this, rPos ));
+    return xPopup->popup_at_rect(GetDrawingArea(), tools::Rectangle(rPos, Size(1, 1)));
 }
 
-
-void ExtBoxWithBtns_Impl::MouseButtonDown( const MouseEvent& rMEvt )
+bool ExtBoxWithBtns_Impl::MouseButtonDown( const MouseEvent& rMEvt )
 {
-    if ( m_bInterfaceLocked )
-        return;
-
-    const Point aMousePos( rMEvt.GetPosPixel() );
-    const long nPos = PointToPos( aMousePos );
-
-    if ( rMEvt.IsRight() )
-    {
-        switch( ShowPopupMenu( aMousePos, nPos ) )
-        {
-            case CMD_NONE:      break;
-            case CMD_ENABLE:    m_pParent->enablePackage( GetEntryData( nPos )->m_xPackage, true );
-                                break;
-            case CMD_DISABLE:   m_pParent->enablePackage( GetEntryData( nPos )->m_xPackage, false );
-                                break;
-            case CMD_UPDATE:    m_pParent->updatePackage( GetEntryData( nPos )->m_xPackage );
-                                break;
-            case CMD_REMOVE:    m_pParent->removePackage( GetEntryData( nPos )->m_xPackage );
-                                break;
-            case CMD_SHOW_LICENSE:
-                {
-                    ShowLicenseDialog aLicenseDlg(m_pParent->GetFrameWeld(), GetEntryData(nPos)->m_xPackage);
-                    aLicenseDlg.run();
-                    break;
-                }
-        }
-    }
-    else if ( rMEvt.IsLeft() )
-    {
-        const SolarMutexGuard aGuard;
-        if ( rMEvt.IsMod1() && HasActive() )
-            selectEntry( ExtensionBox_Impl::ENTRY_NOTFOUND );
-                // selecting a not existing entry will deselect the current one
-        else
-            selectEntry( nPos );
-    }
+    if (m_bInterfaceLocked)
+        return false;
+    return ExtensionBox_Impl::MouseButtonDown(rMEvt);
 }
 
 void ExtBoxWithBtns_Impl::enableButtons( bool bEnable )
@@ -337,8 +303,8 @@ void ExtBoxWithBtns_Impl::enableButtons( bool bEnable )
 //                             DialogHelper
 
 DialogHelper::DialogHelper(const uno::Reference< uno::XComponentContext > &xContext,
-                           Dialog *pWindow)
-    : m_xVCLWindow(pWindow)
+                           weld::Window* pWindow)
+    : m_pWindow(pWindow)
     , m_nEventID(nullptr)
 {
     m_xContext = xContext;
@@ -458,14 +424,13 @@ void DialogHelper::PostUserEvent( const Link<void*,void>& rLink, void* pCaller )
     if ( m_nEventID )
         Application::RemoveUserEvent( m_nEventID );
 
-    m_nEventID = Application::PostUserEvent( rLink, pCaller, true/*bReferenceLink*/ );
+    m_nEventID = Application::PostUserEvent(rLink, pCaller);
 }
 
 //                             ExtMgrDialog
-ExtMgrDialog::ExtMgrDialog(vcl::Window *pParent, TheExtensionManager *pManager, Dialog::InitFlag eFlag)
-    : ModelessDialog(pParent, "ExtensionManagerDialog", "desktop/ui/extensionmanager.ui", eFlag)
-    , DialogHelper(pManager->getContext(), static_cast<Dialog*>(this))
-    , m_xRestartParent(pParent ? pParent : Application::GetDefDialogParent())
+ExtMgrDialog::ExtMgrDialog(weld::Window *pParent, TheExtensionManager *pManager)
+    : GenericDialogController(pParent, "desktop/ui/extensionmanager.ui", "ExtensionManagerDialog")
+    , DialogHelper(pManager->getContext(), m_xDialog.get())
     , m_sAddPackages(DpResId(RID_STR_ADD_PACKAGES))
     , m_bHasProgress(false)
     , m_bProgressChanged(false)
@@ -477,60 +442,60 @@ ExtMgrDialog::ExtMgrDialog(vcl::Window *pParent, TheExtensionManager *pManager,
     , m_bClosed(false)
     , m_nProgress(0)
     , m_pManager(pManager)
-{
-    get(m_pExtensionBox, "extensions");
-    get(m_pOptionsBtn, "optionsbtn");
-    get(m_pAddBtn, "addbtn");
-    get(m_pRemoveBtn, "removebtn");
-    get(m_pEnableBtn, "enablebtn");
-    get(m_pUpdateBtn, "updatebtn");
-    get(m_pCloseBtn, "close");
-    get(m_pBundledCbx, "bundled");
-    get(m_pSharedCbx, "shared");
-    get(m_pUserCbx, "user");
-    get(m_pGetExtensions, "getextensions");
-    get(m_pProgressText, "progressft");
-    get(m_pProgressBar, "progressbar");
-    get(m_pCancelBtn, "cancel");
-
-    m_pExtensionBox->InitFromDialog(this);
-
-    m_pEnableBtn->SetHelpId( HID_EXTENSION_MANAGER_LISTBOX_ENABLE );
-
-    m_pOptionsBtn->SetClickHdl( LINK( this, ExtMgrDialog, HandleOptionsBtn ) );
-    m_pAddBtn->SetClickHdl( LINK( this, ExtMgrDialog, HandleAddBtn ) );
-    m_pRemoveBtn->SetClickHdl( LINK( this, ExtMgrDialog, HandleRemoveBtn ) );
-    m_pEnableBtn->SetClickHdl( LINK( this, ExtMgrDialog, HandleEnableBtn ) );
-    m_pCloseBtn->SetClickHdl( LINK( this, ExtMgrDialog, HandleCloseBtn ) );
-
-    m_pCancelBtn->SetClickHdl( LINK( this, ExtMgrDialog, HandleCancelBtn ) );
-
-    m_pBundledCbx->SetClickHdl( LINK( this, ExtMgrDialog, HandleExtTypeCbx ) );
-    m_pSharedCbx->SetClickHdl( LINK( this, ExtMgrDialog, HandleExtTypeCbx ) );
-    m_pUserCbx->SetClickHdl( LINK( this, ExtMgrDialog, HandleExtTypeCbx ) );
-
-    m_pBundledCbx->Check();
-    m_pSharedCbx->Check();
-    m_pUserCbx->Check();
-
-    m_pProgressBar->Hide();
+    , m_xExtensionBox(new ExtBoxWithBtns_Impl(m_xBuilder->weld_scrolled_window("scroll")))
+    , m_xExtensionBoxWnd(new weld::CustomWeld(*m_xBuilder, "extensions", *m_xExtensionBox))
+    , m_xOptionsBtn(m_xBuilder->weld_button("optionsbtn"))
+    , m_xAddBtn(m_xBuilder->weld_button("addbtn"))
+    , m_xRemoveBtn(m_xBuilder->weld_button("removebtn"))
+    , m_xEnableBtn(m_xBuilder->weld_button("enablebtn"))
+    , m_xUpdateBtn(m_xBuilder->weld_button("updatebtn"))
+    , m_xCloseBtn(m_xBuilder->weld_button("close"))
+    , m_xBundledCbx(m_xBuilder->weld_check_button("bundled"))
+    , m_xSharedCbx(m_xBuilder->weld_check_button("shared"))
+    , m_xUserCbx(m_xBuilder->weld_check_button("user"))
+    , m_xGetExtensions(m_xBuilder->weld_link_button("getextensions"))
+    , m_xProgressText(m_xBuilder->weld_label("progressft"))
+    , m_xProgressBar(m_xBuilder->weld_progress_bar("progressbar"))
+    , m_xCancelBtn(m_xBuilder->weld_button("cancel"))
+{
+    m_xExtensionBox->InitFromDialog(this);
+
+    m_xEnableBtn->set_help_id(HID_EXTENSION_MANAGER_LISTBOX_ENABLE);
+
+    m_xOptionsBtn->connect_clicked( LINK( this, ExtMgrDialog, HandleOptionsBtn ) );
+    m_xAddBtn->connect_clicked( LINK( this, ExtMgrDialog, HandleAddBtn ) );
+    m_xRemoveBtn->connect_clicked( LINK( this, ExtMgrDialog, HandleRemoveBtn ) );
+    m_xEnableBtn->connect_clicked( LINK( this, ExtMgrDialog, HandleEnableBtn ) );
+    m_xCloseBtn->connect_clicked( LINK( this, ExtMgrDialog, HandleCloseBtn ) );
+
+    m_xCancelBtn->connect_clicked( LINK( this, ExtMgrDialog, HandleCancelBtn ) );
+
+    m_xBundledCbx->connect_clicked( LINK( this, ExtMgrDialog, HandleExtTypeCbx ) );
+    m_xSharedCbx->connect_clicked( LINK( this, ExtMgrDialog, HandleExtTypeCbx ) );
+    m_xUserCbx->connect_clicked( LINK( this, ExtMgrDialog, HandleExtTypeCbx ) );
+
+    m_xBundledCbx->set_active(true);
+    m_xSharedCbx->set_active(true);
+    m_xUserCbx->set_active(true);
+
+    m_xProgressBar->hide();
 
 #if ENABLE_EXTENSION_UPDATE
-    m_pUpdateBtn->SetClickHdl( LINK( this, ExtMgrDialog, HandleUpdateBtn ) );
-    m_pUpdateBtn->Enable(false);
+    m_xUpdateBtn->connect_clicked( LINK( this, ExtMgrDialog, HandleUpdateBtn ) );
+    m_xUpdateBtn->set_sensitive(false);
 #else
-    m_pUpdateBtn->Hide();
+    m_xUpdateBtn->hide();
 #endif
 
     if (officecfg::Office::ExtensionManager::ExtensionSecurity::DisableExtensionInstallation::get())
     {
-        m_pAddBtn->Disable();
-        m_pAddBtn->SetQuickHelpText(DpResId(RID_STR_WARNING_INSTALL_EXTENSION_DISABLED));
+        m_xAddBtn->set_sensitive(false);
+        m_xAddBtn->set_tooltip_text(DpResId(RID_STR_WARNING_INSTALL_EXTENSION_DISABLED));
     }
     if (officecfg::Office::ExtensionManager::ExtensionSecurity::DisableExtensionRemoval::get())
     {
-        m_pRemoveBtn->Disable();
-        m_pRemoveBtn->SetQuickHelpText(DpResId(RID_STR_WARNING_REMOVE_EXTENSION_DISABLED));
+        m_xRemoveBtn->set_sensitive(false);
+        m_xRemoveBtn->set_tooltip_text(DpResId(RID_STR_WARNING_REMOVE_EXTENSION_DISABLED));
     }
 
     m_aIdle.SetPriority(TaskPriority::LOWEST);
@@ -538,75 +503,52 @@ ExtMgrDialog::ExtMgrDialog(vcl::Window *pParent, TheExtensionManager *pManager,
     m_aIdle.SetInvokeHandler( LINK( this, ExtMgrDialog, TimeOutHdl ) );
 }
 
-
 ExtMgrDialog::~ExtMgrDialog()
 {
-    disposeOnce();
-}
-
-void ExtMgrDialog::dispose()
-{
     m_aIdle.Stop();
-    m_pExtensionBox.clear();
-    m_pOptionsBtn.clear();
-    m_pAddBtn.clear();
-    m_pRemoveBtn.clear();
-    m_pEnableBtn.clear();
-    m_pUpdateBtn.clear();
-    m_pCloseBtn.clear();
-    m_pBundledCbx.clear();
-    m_pSharedCbx.clear();
-    m_pUserCbx.clear();
-    m_pGetExtensions.clear();
-    m_pProgressText.clear();
-    m_pProgressBar.clear();
-    m_pCancelBtn.clear();
-    m_xRestartParent.clear();
-    ModelessDialog::dispose();
 }
 
-
 void ExtMgrDialog::setGetExtensionsURL( const OUString &rURL )
 {
-    m_pGetExtensions->SetURL( rURL );
+    m_xGetExtensions->set_uri( rURL );
 }
 
 void ExtMgrDialog::addPackageToList( const uno::Reference< deployment::XPackage > &xPackage,
                                      bool bLicenseMissing )
 {
     const SolarMutexGuard aGuard;
-    m_pUpdateBtn->Enable();
+    m_xUpdateBtn->set_sensitive(true);
 
-    if (m_pBundledCbx->IsChecked() && (xPackage->getRepositoryName() == BUNDLED_PACKAGE_MANAGER) )
+    if (m_xBundledCbx->get_active() && (xPackage->getRepositoryName() == BUNDLED_PACKAGE_MANAGER) )
     {
-        m_pExtensionBox->addEntry( xPackage, bLicenseMissing );
+        m_xExtensionBox->addEntry( xPackage, bLicenseMissing );
     }
-    else if (m_pSharedCbx->IsChecked() && (xPackage->getRepositoryName() == SHARED_PACKAGE_MANAGER) )
+    else if (m_xSharedCbx->get_active() && (xPackage->getRepositoryName() == SHARED_PACKAGE_MANAGER) )
     {
-        m_pExtensionBox->addEntry( xPackage, bLicenseMissing );
+        m_xExtensionBox->addEntry( xPackage, bLicenseMissing );
     }
-    else if (m_pUserCbx->IsChecked() && (xPackage->getRepositoryName() == USER_PACKAGE_MANAGER ))
+    else if (m_xUserCbx->get_active() && (xPackage->getRepositoryName() == USER_PACKAGE_MANAGER ))
     {
-        m_pExtensionBox->addEntry( xPackage, bLicenseMissing );
+        m_xExtensionBox->addEntry( xPackage, bLicenseMissing );
     }
 }
 
 void ExtMgrDialog::prepareChecking()
 {
-    m_pExtensionBox->prepareChecking();
+    m_xExtensionBox->prepareChecking();
 }
 
 void ExtMgrDialog::checkEntries()
 {
     const SolarMutexGuard guard;
-    m_pExtensionBox->checkEntries();
+    m_xExtensionBox->checkEntries();
 }
 
 bool ExtMgrDialog::removeExtensionWarn(const OUString &rExtensionName)
 {
     const SolarMutexGuard guard;
     incBusy();
-    std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(GetFrameWeld(),
+    std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(m_xDialog.get(),
                                                   VclMessageType::Warning, VclButtonsType::OkCancel,
                                                   DpResId(RID_STR_WARNING_REMOVE_EXTENSION)));
 
@@ -629,12 +571,12 @@ void ExtMgrDialog::enablePackage( const uno::Reference< deployment::XPackage > &
 
     if ( bEnable )
     {
-        if (!continueOnSharedExtension(xPackage, GetFrameWeld(), RID_STR_WARNING_ENABLE_SHARED_EXTENSION, m_bEnableWarning))
+        if (!continueOnSharedExtension(xPackage, m_xDialog.get(), RID_STR_WARNING_ENABLE_SHARED_EXTENSION, m_bEnableWarning))
             return;
     }
     else
     {
-        if (!continueOnSharedExtension(xPackage, GetFrameWeld(), RID_STR_WARNING_DISABLE_SHARED_EXTENSION, m_bDisableWarning))
+        if (!continueOnSharedExtension(xPackage, m_xDialog.get(), RID_STR_WARNING_DISABLE_SHARED_EXTENSION, m_bDisableWarning))
             return;
     }
 
@@ -653,7 +595,7 @@ void ExtMgrDialog::removePackage( const uno::Reference< deployment::XPackage > &
             return;
     }
 
-    if (!continueOnSharedExtension(xPackage, GetFrameWeld(), RID_STR_WARNING_REMOVE_SHARED_EXTENSION, m_bDeleteWarning))
+    if (!continueOnSharedExtension(xPackage, m_xDialog.get(), RID_STR_WARNING_REMOVE_SHARED_EXTENSION, m_bDeleteWarning))
         return;
 
     m_pManager->getCmdQueue()->removeExtension( xPackage );
@@ -692,7 +634,7 @@ bool ExtMgrDialog::acceptLicense( const uno::Reference< deployment::XPackage > &
 
 uno::Sequence< OUString > ExtMgrDialog::raiseAddPicker()
 {
-    sfx2::FileDialogHelper aDlgHelper(ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, FileDialogFlags::NONE, GetFrameWeld());
+    sfx2::FileDialogHelper aDlgHelper(ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, FileDialogFlags::NONE, m_xDialog.get());
     const uno::Reference<ui::dialogs::XFilePicker3>& xFilePicker = aDlgHelper.GetFilePicker();
     xFilePicker->setTitle( m_sAddPackages );
 
@@ -757,43 +699,43 @@ uno::Sequence< OUString > ExtMgrDialog::raiseAddPicker()
 
 void ExtMgrDialog::enableOptionsButton( bool bEnable )
 {
-    m_pOptionsBtn->Enable( bEnable );
+    m_xOptionsBtn->set_sensitive( bEnable );
 }
 
 void ExtMgrDialog::enableRemoveButton( bool bEnable )
 {
-    m_pRemoveBtn->Enable( bEnable && !officecfg::Office::ExtensionManager::ExtensionSecurity::DisableExtensionRemoval::get());
+    m_xRemoveBtn->set_sensitive( bEnable && !officecfg::Office::ExtensionManager::ExtensionSecurity::DisableExtensionRemoval::get());
 
     if (officecfg::Office::ExtensionManager::ExtensionSecurity::DisableExtensionRemoval::get())
     {
-        m_pRemoveBtn->SetQuickHelpText(DpResId(RID_STR_WARNING_REMOVE_EXTENSION_DISABLED));
+        m_xRemoveBtn->set_tooltip_text(DpResId(RID_STR_WARNING_REMOVE_EXTENSION_DISABLED));
     }
     else
     {
-        m_pRemoveBtn->SetQuickHelpText("");
+        m_xRemoveBtn->set_tooltip_text("");
     }
 }
 
 void ExtMgrDialog::enableEnableButton( bool bEnable )
 {
-    m_pEnableBtn->Enable( bEnable );
+    m_xEnableBtn->set_sensitive( bEnable );
 }
 
 void ExtMgrDialog::enableButtontoEnable( bool bEnable )
 {
     if (bEnable)
     {
-        m_pEnableBtn->SetText( DpResId( RID_CTX_ITEM_ENABLE ) );
-        m_pEnableBtn->SetHelpId( HID_EXTENSION_MANAGER_LISTBOX_ENABLE );
+        m_xEnableBtn->set_label( DpResId( RID_CTX_ITEM_ENABLE ) );
+        m_xEnableBtn->set_help_id( HID_EXTENSION_MANAGER_LISTBOX_ENABLE );
     }
     else
     {
-        m_pEnableBtn->SetText( DpResId( RID_CTX_ITEM_DISABLE ) );
-        m_pEnableBtn->SetHelpId( HID_EXTENSION_MANAGER_LISTBOX_DISABLE );
+        m_xEnableBtn->set_label( DpResId( RID_CTX_ITEM_DISABLE ) );
+        m_xEnableBtn->set_help_id( HID_EXTENSION_MANAGER_LISTBOX_DISABLE );
     }
 }
 
-IMPL_LINK_NOARG(ExtMgrDialog, HandleCancelBtn, Button*, void)
+IMPL_LINK_NOARG(ExtMgrDialog, HandleCancelBtn, weld::Button&, void)
 {
     if ( m_xAbortChannel.is() )
     {
@@ -808,11 +750,28 @@ IMPL_LINK_NOARG(ExtMgrDialog, HandleCancelBtn, Button*, void)
     }
 }
 
-IMPL_LINK_NOARG(ExtMgrDialog, HandleCloseBtn, Button*, void)
+IMPL_LINK_NOARG(ExtMgrDialog, HandleCloseBtn, weld::Button&, void)
 {
-    Close();
-}
+    bool bCallClose = true;
+
+    //only suggest restart if modified and this is the first close attempt
+    if (!m_bClosed && m_pManager->isModified())
+    {
+        m_pManager->clearModified();
+
+        //only suggest restart if we're actually running, e.g. not from standalone unopkg gui
+        if (dp_misc::office_is_running())
+        {
+            SolarMutexGuard aGuard;
+            bCallClose = !::svtools::executeRestartDialog(comphelper::getProcessComponentContext(),
+                                                          m_xDialog.get(),
+                                                          svtools::RESTART_REASON_EXTENSION_INSTALL);
+        }
+    }
 
+    if (bCallClose)
+        m_xDialog->response(RET_CANCEL);
+}
 
 IMPL_LINK( ExtMgrDialog, startProgress, void*, _bLockInterface, void )
 {
@@ -824,8 +783,8 @@ IMPL_LINK( ExtMgrDialog, startProgress, void*, _bLockInterface, void )
 
     if ( m_bStopProgress )
     {
-        if ( m_pProgressBar->IsVisible() )
-            m_pProgressBar->SetValue( 100 );
+        if ( m_xProgressBar->get_visible() )
+            m_xProgressBar->set_percentage( 100 );
         m_xAbortChannel.clear();
 
         SAL_INFO( "desktop.deployment", " startProgress handler: stop" );
@@ -835,19 +794,19 @@ IMPL_LINK( ExtMgrDialog, startProgress, void*, _bLockInterface, void )
         SAL_INFO( "desktop.deployment", " startProgress handler: start" );
     }
 
-    m_pCancelBtn->Enable( bLockInterface );
-    m_pAddBtn->Enable( !bLockInterface && !officecfg::Office::ExtensionManager::ExtensionSecurity::DisableExtensionInstallation::get());
+    m_xCancelBtn->set_sensitive( bLockInterface );
+    m_xAddBtn->set_sensitive( !bLockInterface && !officecfg::Office::ExtensionManager::ExtensionSecurity::DisableExtensionInstallation::get());
     if (officecfg::Office::ExtensionManager::ExtensionSecurity::DisableExtensionInstallation::get())
     {
-        m_pAddBtn->SetQuickHelpText(DpResId(RID_STR_WARNING_INSTALL_EXTENSION_DISABLED));
+        m_xAddBtn->set_tooltip_text(DpResId(RID_STR_WARNING_INSTALL_EXTENSION_DISABLED));
     }
     else
     {
-        m_pAddBtn->SetQuickHelpText("");
+        m_xAddBtn->set_tooltip_text("");
     }
 
-    m_pUpdateBtn->Enable( !bLockInterface && m_pExtensionBox->getItemCount() );
-    m_pExtensionBox->enableButtons( !bLockInterface );
+    m_xUpdateBtn->set_sensitive( !bLockInterface && m_xExtensionBox->getItemCount() );
+    m_xExtensionBox->enableButtons( !bLockInterface );
 
     clearEventID();
 }
@@ -903,25 +862,25 @@ void ExtMgrDialog::updateProgress( const OUString &rText,
 void ExtMgrDialog::updatePackageInfo( const uno::Reference< deployment::XPackage > &xPackage )
 {
     const SolarMutexGuard aGuard;
-    m_pExtensionBox->updateEntry( xPackage );
+    m_xExtensionBox->updateEntry( xPackage );
 }
 
-IMPL_LINK_NOARG(ExtMgrDialog, HandleOptionsBtn, Button*, void)
+IMPL_LINK_NOARG(ExtMgrDialog, HandleOptionsBtn, weld::Button&, void)
 {
-    const sal_Int32 nActive = m_pExtensionBox->getSelIndex();
+    const sal_Int32 nActive = m_xExtensionBox->getSelIndex();
 
     if ( nActive != ExtensionBox_Impl::ENTRY_NOTFOUND )
     {
         SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
 
-        OUString sExtensionId = m_pExtensionBox->GetEntryData( nActive )->m_xPackage->getIdentifier().Value;
-        ScopedVclPtr<VclAbstractDialog> pDlg(pFact->CreateOptionsDialog( this, sExtensionId ));
+        OUString sExtensionId = m_xExtensionBox->GetEntryData( nActive )->m_xPackage->getIdentifier().Value;
+        ScopedVclPtr<VclAbstractDialog> pDlg(pFact->CreateOptionsDialog(m_xDialog.get(), sExtensionId));
 
         pDlg->Execute();
     }
 }
 
-IMPL_LINK_NOARG(ExtMgrDialog, HandleAddBtn, Button*, void)
+IMPL_LINK_NOARG(ExtMgrDialog, HandleAddBtn, weld::Button&, void)
 {
     incBusy();
 
@@ -935,24 +894,24 @@ IMPL_LINK_NOARG(ExtMgrDialog, HandleAddBtn, Button*, void)
     decBusy();
 }
 
-IMPL_LINK_NOARG(ExtMgrDialog, HandleRemoveBtn, Button*, void)
+IMPL_LINK_NOARG(ExtMgrDialog, HandleRemoveBtn, weld::Button&, void)
 {
-    const sal_Int32 nActive = m_pExtensionBox->getSelIndex();
+    const sal_Int32 nActive = m_xExtensionBox->getSelIndex();
 
     if ( nActive != ExtensionBox_Impl::ENTRY_NOTFOUND )
     {
-        TEntry_Impl pEntry = m_pExtensionBox->GetEntryData( nActive );
+        TEntry_Impl pEntry = m_xExtensionBox->GetEntryData( nActive );
         removePackage( pEntry->m_xPackage );
     }
 }
 
-IMPL_LINK_NOARG(ExtMgrDialog, HandleEnableBtn, Button*, void)
+IMPL_LINK_NOARG(ExtMgrDialog, HandleEnableBtn, weld::Button&, void)
 {
-    const sal_Int32 nActive = m_pExtensionBox->getSelIndex();
+    const sal_Int32 nActive = m_xExtensionBox->getSelIndex();
 
     if ( nActive != ExtensionBox_Impl::ENTRY_NOTFOUND )
     {
-        TEntry_Impl pEntry = m_pExtensionBox->GetEntryData( nActive );
+        TEntry_Impl pEntry = m_xExtensionBox->GetEntryData( nActive );
 
         if ( pEntry->m_bMissingLic )
             acceptLicense( pEntry->m_xPackage );
@@ -964,7 +923,7 @@ IMPL_LINK_NOARG(ExtMgrDialog, HandleEnableBtn, Button*, void)
     }
 }
 
-IMPL_LINK_NOARG(ExtMgrDialog, HandleExtTypeCbx, Button*, void)
+IMPL_LINK_NOARG(ExtMgrDialog, HandleExtTypeCbx, weld::Button&, void)
 {
     // re-creates the list of packages with addEntry selecting the packages
     prepareChecking();
@@ -972,7 +931,7 @@ IMPL_LINK_NOARG(ExtMgrDialog, HandleExtTypeCbx, Button*, void)
     checkEntries();
 }
 
-IMPL_LINK_NOARG(ExtMgrDialog, HandleUpdateBtn, Button*, void)
+IMPL_LINK_NOARG(ExtMgrDialog, HandleUpdateBtn, weld::Button&, void)
 {
 #if ENABLE_EXTENSION_UPDATE
     m_pManager->checkUpdates();
@@ -987,83 +946,43 @@ IMPL_LINK_NOARG(ExtMgrDialog, TimeOutHdl, Timer *, void)
     {
         m_bHasProgress = false;
         m_bStopProgress = false;
-        m_pProgressText->Hide();
-        m_pProgressBar->Hide();
-        m_pCancelBtn->Hide();
+        m_xProgressText->hide();
+        m_xProgressBar->hide();
+        m_xCancelBtn->hide();
     }
     else
     {
         if ( m_bProgressChanged )
         {
             m_bProgressChanged = false;
-            m_pProgressText->SetText(m_sProgressText);
+            m_xProgressText->set_label(m_sProgressText);
         }
 
         if ( m_bStartProgress )
         {
             m_bStartProgress = false;
             m_bHasProgress = true;
-            m_pProgressBar->Show();
-            m_pProgressText->Show();
-            m_pCancelBtn->Enable();
-            m_pCancelBtn->Show();
+            m_xProgressBar->show();
+            m_xProgressText->show();
+            m_xCancelBtn->set_sensitive(true);
+            m_xCancelBtn->show();
         }
 
-        if ( m_pProgressBar->IsVisible() )
-            m_pProgressBar->SetValue( static_cast<sal_uInt16>(m_nProgress) );
+        if ( m_xProgressBar->get_visible() )
+            m_xProgressBar->set_percentage( static_cast<sal_uInt16>(m_nProgress) );
     }
 }
 
-
-// VCL::Window / Dialog
-
-bool ExtMgrDialog::EventNotify( NotifyEvent& rNEvt )
+void ExtMgrDialog::Close()
 {
-    bool bHandled = false;
-
-    if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
-    {
-        const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
-        vcl::KeyCode aKeyCode = pKEvt->GetKeyCode();
-
-        if ( aKeyCode.GetGroup() == KEYGROUP_CURSOR )
-            bHandled = m_pExtensionBox->EventNotify(rNEvt);
-    }
-// VclEventId::WindowClose
-    if ( !bHandled )
-        return ModelessDialog::EventNotify(rNEvt);
-    else
-        return true;
-}
-
-IMPL_STATIC_LINK(ExtMgrDialog, Restart, void*, pParent, void)
-{
-    SolarMutexGuard aGuard;
-    ::svtools::executeRestartDialog(comphelper::getProcessComponentContext(),
-                                    pParent ? static_cast<vcl::Window*>(pParent)->GetFrameWeld() : nullptr,
-                                    svtools::RESTART_REASON_EXTENSION_INSTALL);
-}
-
-bool ExtMgrDialog::Close()
-{
-    bool bRet = ModelessDialog::Close();
     m_pManager->terminateDialog();
-    //only suggest restart if modified and this is the first close attempt
-    if (!m_bClosed && m_pManager->isModified())
-    {
-        m_pManager->clearModified();
-        //only suggest restart if we're actually running, e.g. not from standalone unopkg gui
-        if (dp_misc::office_is_running())
-            Application::PostUserEvent(LINK(nullptr, ExtMgrDialog, Restart), m_xRestartParent);
-    }
     m_bClosed = true;
-    return bRet;
 }
 
 //UpdateRequiredDialog
-UpdateRequiredDialog::UpdateRequiredDialog(vcl::Window *pParent, TheExtensionManager *pManager)
-    : ModalDialog(pParent, "UpdateRequiredDialog", "desktop/ui/updaterequireddialog.ui")
-    , DialogHelper(pManager->getContext(), static_cast<Dialog*>(this))
+UpdateRequiredDialog::UpdateRequiredDialog(weld::Window *pParent, TheExtensionManager *pManager)
+    : GenericDialogController(pParent, "desktop/ui/updaterequireddialog.ui", "UpdateRequiredDialog")
+    , DialogHelper(pManager->getContext(), m_xDialog.get())
     , m_sCloseText(DpResId(RID_STR_CLOSE_BTN))
     , m_bHasProgress(false)
     , m_bProgressChanged(false)
@@ -1072,28 +991,29 @@ UpdateRequiredDialog::UpdateRequiredDialog(vcl::Window *pParent, TheExtensionMan
     , m_bHasLockedEntries(false)
     , m_nProgress(0)
     , m_pManager(pManager)
-{
-    get(m_pExtensionBox, "extensions");
-    m_pExtensionBox->setExtensionManager(pManager);
-    get(m_pUpdateNeeded, "updatelabel");
-    get(m_pUpdateBtn, "check");
-    get(m_pCloseBtn, "disable");
-    get(m_pCancelBtn, "cancel");
-    get(m_pProgressText, "progresslabel");
-    get(m_pProgressBar, "progress");
-
-    m_pUpdateBtn->SetClickHdl( LINK( this, UpdateRequiredDialog, HandleUpdateBtn ) );
-    m_pCloseBtn->SetClickHdl( LINK( this, UpdateRequiredDialog, HandleCloseBtn ) );
-    m_pCancelBtn->SetClickHdl( LINK( this, UpdateRequiredDialog, HandleCancelBtn ) );
-
-    OUString aText = m_pUpdateNeeded->GetText();
+    , m_xExtensionBox(new ExtensionBox_Impl(m_xBuilder->weld_scrolled_window("scroll")))
+    , m_xExtensionBoxWnd(new weld::CustomWeld(*m_xBuilder, "extensions", *m_xExtensionBox))
+    , m_xUpdateNeeded(m_xBuilder->weld_label("updatelabel"))
+    , m_xUpdateBtn(m_xBuilder->weld_button("ok"))
+    , m_xCloseBtn(m_xBuilder->weld_button("disable"))
+    , m_xCancelBtn(m_xBuilder->weld_button("cancel"))
+    , m_xProgressText(m_xBuilder->weld_label("progresslabel"))
+    , m_xProgressBar(m_xBuilder->weld_progress_bar("progress"))
+{
+    m_xExtensionBox->setExtensionManager(pManager);
+
+    m_xUpdateBtn->connect_clicked( LINK( this, UpdateRequiredDialog, HandleUpdateBtn ) );
+    m_xCloseBtn->connect_clicked( LINK( this, UpdateRequiredDialog, HandleCloseBtn ) );
+    m_xCancelBtn->connect_clicked( LINK( this, UpdateRequiredDialog, HandleCancelBtn ) );
+
+    OUString aText = m_xUpdateNeeded->get_label();
     aText = aText.replaceAll(
         "%PRODUCTNAME", utl::ConfigManager::getProductName());
-    m_pUpdateNeeded->SetText(aText);
+    m_xUpdateNeeded->set_label(aText);
 
-    m_pProgressBar->Hide();
-    m_pUpdateBtn->Enable( false );
-    m_pCloseBtn->GrabFocus();
+    m_xProgressBar->hide();
+    m_xUpdateBtn->set_sensitive( false );
+    m_xCloseBtn->grab_focus();
 
     m_aIdle.SetPriority( TaskPriority::LOWEST );
     m_aIdle.SetDebugName( "UpdateRequiredDialog m_aIdle TimeOutHdl" );
@@ -1102,20 +1022,7 @@ UpdateRequiredDialog::UpdateRequiredDialog(vcl::Window *pParent, TheExtensionMan
 
 UpdateRequiredDialog::~UpdateRequiredDialog()
 {
-    disposeOnce();
-}
-
-void UpdateRequiredDialog::dispose()
-{
     m_aIdle.Stop();
-    m_pExtensionBox.clear();
-    m_pUpdateNeeded.clear();
-    m_pUpdateBtn.clear();
-    m_pCloseBtn.clear();
-    m_pCancelBtn.clear();
-    m_pProgressText.clear();
-    m_pProgressBar.clear();
-    ModalDialog::dispose();
 }
 
 void UpdateRequiredDialog::addPackageToList( const uno::Reference< deployment::XPackage > &xPackage,
@@ -1126,32 +1033,32 @@ void UpdateRequiredDialog::addPackageToList( const uno::Reference< deployment::X
     {
         m_bHasLockedEntries |= m_pManager->isReadOnly( xPackage );
         const SolarMutexGuard aGuard;
-        m_pUpdateBtn->Enable();
-        m_pExtensionBox->addEntry( xPackage );
+        m_xUpdateBtn->set_sensitive(true);
+        m_xExtensionBox->addEntry( xPackage );
     }
 }
 
 
 void UpdateRequiredDialog::prepareChecking()
 {
-    m_pExtensionBox->prepareChecking();
+    m_xExtensionBox->prepareChecking();
 }
 
 
 void UpdateRequiredDialog::checkEntries()
 {
     const SolarMutexGuard guard;
-    m_pExtensionBox->checkEntries();
+    m_xExtensionBox->checkEntries();
 
     if ( ! hasActiveEntries() )
     {
-        m_pCloseBtn->SetText( m_sCloseText );
-        m_pCloseBtn->GrabFocus();
+        m_xCloseBtn->set_label( m_sCloseText );
+        m_xCloseBtn->grab_focus();
     }
 }
 
 
-IMPL_LINK_NOARG(UpdateRequiredDialog, HandleCancelBtn, Button*, void)
+IMPL_LINK_NOARG(UpdateRequiredDialog, HandleCancelBtn, weld::Button&, void)
 {
     if ( m_xAbortChannel.is() )
     {
@@ -1177,8 +1084,8 @@ IMPL_LINK( UpdateRequiredDialog, startProgress, void*, _bLockInterface, void )
 
     if ( m_bStopProgress )
     {
-        if ( m_pProgressBar->IsVisible() )
-            m_pProgressBar->SetValue( 100 );
+        if ( m_xProgressBar->get_visible() )
+            m_xProgressBar->set_percentage( 100 );
         m_xAbortChannel.clear();
         SAL_INFO( "desktop.deployment", " startProgress handler: stop" );
     }
@@ -1187,8 +1094,8 @@ IMPL_LINK( UpdateRequiredDialog, startProgress, void*, _bLockInterface, void )
         SAL_INFO( "desktop.deployment", " startProgress handler: start" );
     }
 
-    m_pCancelBtn->Enable( bLockInterface );
-    m_pUpdateBtn->Enable( false );
+    m_xCancelBtn->set_sensitive( bLockInterface );
+    m_xUpdateBtn->set_sensitive( false );
     clearEventID();
 }
 
@@ -1247,28 +1154,28 @@ void UpdateRequiredDialog::updatePackageInfo( const uno::Reference< deployment::
     // of the 'disable all' button
     const SolarMutexGuard aGuard;
     if ( isEnabled( xPackage ) && checkDependencies( xPackage ) )
-        m_pExtensionBox->removeEntry( xPackage );
+        m_xExtensionBox->removeEntry( xPackage );
     else
-        m_pExtensionBox->updateEntry( xPackage );
+        m_xExtensionBox->updateEntry( xPackage );
 
     if ( ! hasActiveEntries() )
     {
-        m_pCloseBtn->SetText( m_sCloseText );
-        m_pCloseBtn->GrabFocus();
+        m_xCloseBtn->set_label( m_sCloseText );
+        m_xCloseBtn->grab_focus();
     }
 }
 
 
-IMPL_LINK_NOARG(UpdateRequiredDialog, HandleUpdateBtn, Button*, void)
+IMPL_LINK_NOARG(UpdateRequiredDialog, HandleUpdateBtn, weld::Button&, void)
 {
     ::osl::ClearableMutexGuard aGuard( m_aMutex );
 
     std::vector< uno::Reference< deployment::XPackage > > vUpdateEntries;
-    sal_Int32 nCount = m_pExtensionBox->GetEntryCount();
+    sal_Int32 nCount = m_xExtensionBox->GetEntryCount();
 
     for ( sal_Int32 i = 0; i < nCount; ++i )
     {
-        TEntry_Impl pEntry = m_pExtensionBox->GetEntryData( i );
+        TEntry_Impl pEntry = m_xExtensionBox->GetEntryData( i );
         vUpdateEntries.push_back( pEntry->m_xPackage );
     }
 
@@ -1278,18 +1185,18 @@ IMPL_LINK_NOARG(UpdateRequiredDialog, HandleUpdateBtn, Button*, void)
 }
 
 
-IMPL_LINK_NOARG(UpdateRequiredDialog, HandleCloseBtn, Button*, void)
+IMPL_LINK_NOARG(UpdateRequiredDialog, HandleCloseBtn, weld::Button&, void)
 {
     ::osl::MutexGuard aGuard( m_aMutex );
 
     if ( !isBusy() )
     {
         if ( m_bHasLockedEntries )
-            EndDialog( -1 );
+            m_xDialog->response(-1);
         else if ( hasActiveEntries() )
             disableAllEntries();
         else
-            EndDialog();
+            m_xDialog->response(RET_CANCEL);
     }
 }
 
@@ -1300,35 +1207,35 @@ IMPL_LINK_NOARG(UpdateRequiredDialog, TimeOutHdl, Timer *, void)
     {
         m_bHasProgress = false;
         m_bStopProgress = false;
-        m_pProgressText->Hide();
-        m_pProgressBar->Hide();
-        m_pCancelBtn->Hide();
+        m_xProgressText->hide();
+        m_xProgressBar->hide();
+        m_xCancelBtn->hide();
     }
     else
     {
         if ( m_bProgressChanged )
         {
             m_bProgressChanged = false;
-            m_pProgressText->SetText( m_sProgressText );
+            m_xProgressText->set_label( m_sProgressText );
         }
 
         if ( m_bStartProgress )
         {
             m_bStartProgress = false;
             m_bHasProgress = true;
-            m_pProgressBar->Show();
-            m_pProgressText->Show();
-            m_pCancelBtn->Enable();
-            m_pCancelBtn->Show();
+            m_xProgressBar->show();
+            m_xProgressText->show();
+            m_xCancelBtn->set_sensitive(true);
+            m_xCancelBtn->show();
         }
 
-        if ( m_pProgressBar->IsVisible() )
-            m_pProgressBar->SetValue( static_cast<sal_uInt16>(m_nProgress) );
+        if (m_xProgressBar->get_visible())
+            m_xProgressBar->set_percentage(m_nProgress);
     }
 }
 
 // VCL::Dialog
-short UpdateRequiredDialog::Execute()
+short UpdateRequiredDialog::run()
 {
     //ToDo
     //I believe m_bHasLockedEntries was used to prevent showing extensions which cannot
@@ -1340,35 +1247,15 @@ short UpdateRequiredDialog::Execute()
     if ( m_bHasLockedEntries )
     {
         // Set other text, disable update btn, remove not shared entries from list;
-        m_pUpdateNeeded->SetText( DpResId( RID_STR_NO_ADMIN_PRIVILEGE ) );
-        m_pCloseBtn->SetText( DpResId( RID_STR_EXIT_BTN ) );
-        m_pUpdateBtn->Enable( false );
-        m_pExtensionBox->RemoveUnlocked();
-        Resize();
-    }
-
-    return Dialog::Execute();
-}
-
-// VCL::Dialog
-bool UpdateRequiredDialog::Close()
-{
-    ::osl::MutexGuard aGuard( m_aMutex );
-
-    if ( !isBusy() )
-    {
-        if ( m_bHasLockedEntries )
-            EndDialog( -1 );
-        else if ( hasActiveEntries() )
-            disableAllEntries();
-        else
-            EndDialog();
+        m_xUpdateNeeded->set_label( DpResId( RID_STR_NO_ADMIN_PRIVILEGE ) );
+        m_xCloseBtn->set_label( DpResId( RID_STR_EXIT_BTN ) );
+        m_xUpdateBtn->set_sensitive( false );
+        m_xExtensionBox->RemoveUnlocked();
     }
 
-    return false;
+    return GenericDialogController::run();
 }
 
-
 // Check dependencies of all packages
 
 bool UpdateRequiredDialog::isEnabled( const uno::Reference< deployment::XPackage > &xPackage )
@@ -1415,10 +1302,10 @@ bool UpdateRequiredDialog::hasActiveEntries()
     ::osl::MutexGuard aGuard( m_aMutex );
 
     bool bRet = false;
-    long nCount = m_pExtensionBox->GetEntryCount();
+    long nCount = m_xExtensionBox->GetEntryCount();
     for ( long nIndex = 0; nIndex < nCount; nIndex++ )
     {
-        TEntry_Impl pEntry = m_pExtensionBox->GetEntryData( nIndex );
+        TEntry_Impl pEntry = m_xExtensionBox->GetEntryData( nIndex );
 
         if ( isEnabled(pEntry->m_xPackage) && !checkDependencies( pEntry->m_xPackage ) )
         {
@@ -1437,17 +1324,17 @@ void UpdateRequiredDialog::disableAllEntries()
 
     incBusy();
 
-    long nCount = m_pExtensionBox->GetEntryCount();
+    long nCount = m_xExtensionBox->GetEntryCount();
     for ( long nIndex = 0; nIndex < nCount; nIndex++ )
     {
-        TEntry_Impl pEntry = m_pExtensionBox->GetEntryData( nIndex );
+        TEntry_Impl pEntry = m_xExtensionBox->GetEntryData( nIndex );
         m_pManager->getCmdQueue()->enableExtension( pEntry->m_xPackage, false );
     }
 
     decBusy();
 
     if ( ! hasActiveEntries() )
-        m_pCloseBtn->SetText( m_sCloseText );
+        m_xCloseBtn->set_label( m_sCloseText );
 }
 
 //                             ShowLicenseDialog
diff --git a/desktop/source/deployment/gui/dp_gui_dialog2.hxx b/desktop/source/deployment/gui/dp_gui_dialog2.hxx
index afb375fb16cd..84a755677843 100644
--- a/desktop/source/deployment/gui/dp_gui_dialog2.hxx
+++ b/desktop/source/deployment/gui/dp_gui_dialog2.hxx
@@ -22,14 +22,10 @@
 
 #include <config_extensions.h>
 
-#include <vcl/dialog.hxx>
-#include <vcl/button.hxx>
-#include <vcl/fixed.hxx>
-#include <vcl/fixedhyper.hxx>
-#include <vcl/prgsbar.hxx>
 #include <vcl/timer.hxx>
 #include <vcl/idle.hxx>
 #include <vcl/waitobj.hxx>
+#include <vcl/customweld.hxx>
 #include <vcl/weld.hxx>
 
 #include <osl/conditn.hxx>
@@ -60,18 +56,17 @@ class TheExtensionManager;
 class DialogHelper
 {
     css::uno::Reference< css::uno::XComponentContext > m_xContext;
-    VclPtr<Dialog>  m_xVCLWindow;
+    weld::Window*   m_pWindow;
     ImplSVEvent *   m_nEventID;
     TopLevelWindowLocker m_aBusy;
 
 public:
-                    DialogHelper( const css::uno::Reference< css::uno::XComponentContext > &,
-                                  Dialog *pWindow );
+                    DialogHelper(const css::uno::Reference< css::uno::XComponentContext > &,
+                                 weld::Window* pWindow);
     virtual        ~DialogHelper();
 
     void            openWebBrowser(const OUString& rURL, const OUString& rTitle);
-    Dialog*         getWindow() const { return m_xVCLWindow; };
-    weld::Window*   getFrameWeld() const { return m_xVCLWindow ? m_xVCLWindow->GetFrameWeld() : nullptr; }
+    weld::Window*   getFrameWeld() const { return m_pWindow; }
     void            PostUserEvent( const Link<void*,void>& rLink, void* pCaller );
     void            clearEventID() { m_nEventID = nullptr; }
 
@@ -93,31 +88,16 @@ public:
                                                const char* pResID,
                                                bool &bHadWarning );
 
-    void            incBusy() { m_aBusy.incBusy(m_xVCLWindow->GetFrameWeld()); }
+    void            incBusy() { m_aBusy.incBusy(m_pWindow); }
     void            decBusy() { m_aBusy.decBusy(); }
     bool            isBusy() const { return m_aBusy.isBusy(); }
     bool            installExtensionWarn(const OUString &rExtensionURL);
     bool            installForAllUsers(bool &bInstallForAll);
 };
 
-class ExtMgrDialog : public ModelessDialog,
-                     public DialogHelper
+class ExtMgrDialog : public weld::GenericDialogController
+                   , public DialogHelper
 {
-    VclPtr<vcl::Window> m_xRestartParent;
-    VclPtr<ExtBoxWithBtns_Impl> m_pExtensionBox;
-    VclPtr<PushButton>          m_pOptionsBtn;
-    VclPtr<PushButton>          m_pAddBtn;
-    VclPtr<PushButton>          m_pRemoveBtn;
-    VclPtr<PushButton>          m_pEnableBtn;
-    VclPtr<PushButton>          m_pUpdateBtn;
-    VclPtr<CloseButton>         m_pCloseBtn;
-    VclPtr<CheckBox>            m_pBundledCbx;
-    VclPtr<CheckBox>            m_pSharedCbx;
-    VclPtr<CheckBox>            m_pUserCbx;
-    VclPtr<FixedHyperlink>      m_pGetExtensions;
-    VclPtr<FixedText>           m_pProgressText;
-    VclPtr<ProgressBar>         m_pProgressBar;
-    VclPtr<CancelButton>        m_pCancelBtn;
     const OUString       m_sAddPackages;
     OUString             m_sProgressText;
     OUString             m_sLastFolderURL;
@@ -136,27 +116,38 @@ class ExtMgrDialog : public ModelessDialog,
 
     css::uno::Reference< css::task::XAbortChannel > m_xAbortChannel;
 
+    std::unique_ptr<ExtBoxWithBtns_Impl> m_xExtensionBox;
+    std::unique_ptr<weld::CustomWeld> m_xExtensionBoxWnd;
+    std::unique_ptr<weld::Button> m_xOptionsBtn;
+    std::unique_ptr<weld::Button> m_xAddBtn;
+    std::unique_ptr<weld::Button> m_xRemoveBtn;
+    std::unique_ptr<weld::Button> m_xEnableBtn;
+    std::unique_ptr<weld::Button> m_xUpdateBtn;
+    std::unique_ptr<weld::Button> m_xCloseBtn;
+    std::unique_ptr<weld::CheckButton> m_xBundledCbx;
+    std::unique_ptr<weld::CheckButton> m_xSharedCbx;
+    std::unique_ptr<weld::CheckButton> m_xUserCbx;
+    std::unique_ptr<weld::LinkButton> m_xGetExtensions;
+    std::unique_ptr<weld::Label> m_xProgressText;
+    std::unique_ptr<weld::ProgressBar> m_xProgressBar;
+    std::unique_ptr<weld::Button> m_xCancelBtn;
+
     bool removeExtensionWarn(const OUString &rExtensionTitle);
 
-    DECL_LINK( HandleOptionsBtn, Button*, void );
-    DECL_LINK( HandleAddBtn, Button*, void );
-    DECL_LINK( HandleRemoveBtn, Button*, void );
-    DECL_LINK( HandleEnableBtn, Button*, void );
-    DECL_LINK( HandleUpdateBtn, Button*, void );
-    DECL_LINK( HandleCancelBtn, Button*, void );
-    DECL_LINK( HandleCloseBtn, Button*, void );
-    DECL_LINK( HandleExtTypeCbx, Button*, void );
+    DECL_LINK( HandleOptionsBtn, weld::Button&, void );
+    DECL_LINK( HandleAddBtn, weld::Button&, void );
+    DECL_LINK( HandleRemoveBtn, weld::Button&, void );
+    DECL_LINK( HandleEnableBtn, weld::Button&, void );
+    DECL_LINK( HandleUpdateBtn, weld::Button&, void );
+    DECL_LINK( HandleCancelBtn, weld::Button&, void );
+    DECL_LINK( HandleCloseBtn, weld::Button&, void );
+    DECL_LINK( HandleExtTypeCbx, weld::Button&, void );
     DECL_LINK( TimeOutHdl, Timer *, void );
     DECL_LINK( startProgress, void *, void );
-    DECL_STATIC_LINK( ExtMgrDialog, Restart, void *, void );
 
 public:
-                    ExtMgrDialog( vcl::Window * pParent, TheExtensionManager *pManager, Dialog::InitFlag eFlag = Dialog::InitFlag::Default );
-    virtual        ~ExtMgrDialog() override;
-    virtual void    dispose() override;
-
-    virtual bool    EventNotify( NotifyEvent& rNEvt ) override;
-    virtual bool    Close() override;
+    ExtMgrDialog(weld::Window * pParent, TheExtensionManager *pManager);
+    virtual ~ExtMgrDialog() override;
 
     virtual void    showProgress( bool bStart ) override;
     virtual void    updateProgress( const OUString &rText,
@@ -174,6 +165,8 @@ public:
     void updatePackage(const css::uno::Reference< css::deployment::XPackage > &xPackage );
     bool acceptLicense(const css::uno::Reference< css::deployment::XPackage > &xPackage );
 
+    void Close();
+
     TheExtensionManager*    getExtensionManager() const { return m_pManager; }
 
     virtual void    prepareChecking() override;
@@ -192,16 +185,9 @@ public:
 };
 
 
-class UpdateRequiredDialog : public ModalDialog,
-                             public DialogHelper
+class UpdateRequiredDialog : public weld::GenericDialogController
+                           , public DialogHelper
 {
-    VclPtr<ExtensionBox_Impl>   m_pExtensionBox;
-    VclPtr<FixedText>           m_pUpdateNeeded;
-    VclPtr<PushButton>          m_pUpdateBtn;
-    VclPtr<PushButton>          m_pCloseBtn;
-    VclPtr<CancelButton>        m_pCancelBtn;
-    VclPtr<FixedText>           m_pProgressText;
-    VclPtr<ProgressBar>         m_pProgressBar;
     const OUString       m_sCloseText;
     OUString             m_sProgressText;
     ::osl::Mutex         m_aMutex;
@@ -216,9 +202,18 @@ class UpdateRequiredDialog : public ModalDialog,
 
     css::uno::Reference< css::task::XAbortChannel > m_xAbortChannel;
 
-    DECL_LINK( HandleUpdateBtn, Button*, void );
-    DECL_LINK( HandleCloseBtn, Button*, void );
-    DECL_LINK( HandleCancelBtn, Button*, void );
+    std::unique_ptr<ExtensionBox_Impl> m_xExtensionBox;
+    std::unique_ptr<weld::CustomWeld> m_xExtensionBoxWnd;
+    std::unique_ptr<weld::Label> m_xUpdateNeeded;
+    std::unique_ptr<weld::Button> m_xUpdateBtn;
+    std::unique_ptr<weld::Button> m_xCloseBtn;
+    std::unique_ptr<weld::Button> m_xCancelBtn;
+    std::unique_ptr<weld::Label> m_xProgressText;
+    std::unique_ptr<weld::ProgressBar> m_xProgressBar;
+
+    DECL_LINK( HandleUpdateBtn, weld::Button&, void );
+    DECL_LINK( HandleCloseBtn, weld::Button&, void );
+    DECL_LINK( HandleCancelBtn, weld::Button&, void );
     DECL_LINK( TimeOutHdl, Timer *, void );
     DECL_LINK( startProgress, void *, void );
 
@@ -228,12 +223,10 @@ class UpdateRequiredDialog : public ModalDialog,
     void            disableAllEntries();
 
 public:
-                    UpdateRequiredDialog( vcl::Window * pParent, TheExtensionManager *pManager );
+    UpdateRequiredDialog(weld::Window * pParent, TheExtensionManager *pManager);
     virtual        ~UpdateRequiredDialog() override;
-    virtual void    dispose() override;
 
-    virtual short   Execute() override;
-    virtual bool    Close() override;
+    virtual short   run() override;
 
     virtual void    showProgress( bool bStart ) override;
     virtual void    updateProgress( const OUString &rText,
diff --git a/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx b/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx
index 9d60a0a607db..9fada8ce9db3 100644
--- a/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx
+++ b/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx
@@ -375,8 +375,12 @@ void ProgressCmdEnv::handle( uno::Reference< task::XInteractionRequest > const &
         }
         {
             SolarMutexGuard guard;
-            DependencyDialog aDlg(m_pDialogHelper ? m_pDialogHelper->getFrameWeld() : nullptr, deps);
+            if (m_pDialogHelper)
+                m_pDialogHelper->incBusy();
+            DependencyDialog aDlg(activeDialog(), deps);
             short n = aDlg.run();
+            if (m_pDialogHelper)
+                m_pDialogHelper->decBusy();
             // Distinguish between closing the dialog and programmatically
             // canceling the dialog (headless VCL):
             approve = n == RET_OK
@@ -386,11 +390,17 @@ void ProgressCmdEnv::handle( uno::Reference< task::XInteractionRequest > const &
     else if (request >>= licExc)
     {
         SolarMutexGuard guard;
+
+        weld::Window *pTopLevel = activeDialog();
+        if (m_pDialogHelper)
+            m_pDialogHelper->incBusy();
         uno::Reference< ui::dialogs::XExecutableDialog > xDialog(
             deployment::ui::LicenseDialog::create(
-            m_xContext, VCLUnoHelper::GetInterface( m_pDialogHelper? m_pDialogHelper->getWindow() : nullptr ),
+            m_xContext, pTopLevel ? pTopLevel->GetXWindow() : nullptr,
             licExc.ExtensionName, licExc.Text ) );
         sal_Int16 res = xDialog->execute();
+        if (m_pDialogHelper)
+            m_pDialogHelper->decBusy();
         if ( res == ui::dialogs::ExecutableDialogResults::CANCEL )
             abort = true;
         else if ( res == ui::dialogs::ExecutableDialogResults::OK )
@@ -421,7 +431,11 @@ void ProgressCmdEnv::handle( uno::Reference< task::XInteractionRequest > const &
             verExc.Deployed->getDisplayName();
         {
             SolarMutexGuard guard;
-            std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(m_pDialogHelper ? m_pDialogHelper->getFrameWeld() : nullptr,
+
+            if (m_pDialogHelper)
+                m_pDialogHelper->incBusy();
+
+            std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(activeDialog(),
                                                       VclMessageType::Warning, VclButtonsType::OkCancel, DpResId(id)));
             OUString s;
             if (bEqualNames)
@@ -449,6 +463,8 @@ void ProgressCmdEnv::handle( uno::Reference< task::XInteractionRequest > const &
             s = s.replaceAll("$DEPLOYED", getVersion(verExc.Deployed));
             xBox->set_primary_text(s);
             approve = xBox->run() == RET_OK;
+            if (m_pDialogHelper)
+                m_pDialogHelper->decBusy();
             abort = !approve;
         }
     }
@@ -476,9 +492,13 @@ void ProgressCmdEnv::handle( uno::Reference< task::XInteractionRequest > const &
         SolarMutexGuard guard;
         OUString sMsg(DpResId(RID_STR_UNSUPPORTED_PLATFORM));
         sMsg = sMsg.replaceAll("%Name", platExc.package->getDisplayName());
-        std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(m_pDialogHelper ? m_pDialogHelper->getFrameWeld() : nullptr,
+        if (m_pDialogHelper)
+            m_pDialogHelper->incBusy();
+        std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(activeDialog(),
                                                   VclMessageType::Warning, VclButtonsType::Ok, sMsg));
         xBox->run();
+        if (m_pDialogHelper)
+            m_pDialogHelper->decBusy();
         approve = true;
     }
 
@@ -540,9 +560,13 @@ void ProgressCmdEnv::update_( uno::Any const & rStatus )
             text = ::comphelper::anyToString( rStatus ); // fallback
 
         const SolarMutexGuard aGuard;
-        std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(m_pDialogHelper ? m_pDialogHelper->getFrameWeld() : nullptr,
+        if (m_pDialogHelper)
+            m_pDialogHelper->incBusy();
+        std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(activeDialog(),
                                                   VclMessageType::Warning, VclButtonsType::Ok, text));
         xBox->run();
+        if (m_pDialogHelper)
+            m_pDialogHelper->decBusy();
     }
     ++m_nCurrentProgress;
     updateProgress();
@@ -783,12 +807,17 @@ void ExtensionCmdQueue::Thread::execute()
                     msg = ::comphelper::anyToString(exc);
 
                 const SolarMutexGuard guard;
+                if (m_pDialogHelper)
+                    m_pDialogHelper->incBusy();
+
                 std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(currentCmdEnv->activeDialog(),
                                                           VclMessageType::Warning, VclButtonsType::Ok, msg));
                 if (m_pDialogHelper)
-                    xBox->set_title(m_pDialogHelper->getWindow()->GetText());
+                    xBox->set_title(m_pDialogHelper->getFrameWeld()->get_title());
                 xBox->run();
-                    //Continue with installation of the remaining extensions
+                if (m_pDialogHelper)
+                    m_pDialogHelper->decBusy();
+                //Continue with installation of the remaining extensions
             }
             {
                 osl::MutexGuard aGuard( m_mutex );
@@ -895,12 +924,19 @@ void ExtensionCmdQueue::Thread::_checkForUpdates(
 {
     const SolarMutexGuard guard;
 
+    if (m_pDialogHelper)
+        m_pDialogHelper->incBusy();
+
     std::vector< UpdateData > vData;
-    UpdateDialog aUpdateDialog(m_xContext, m_pDialogHelper? m_pDialogHelper->getFrameWeld() : nullptr, vExtensionList, &vData);
+    UpdateDialog aUpdateDialog(m_xContext, m_pDialogHelper ? m_pDialogHelper->getFrameWeld() : nullptr, vExtensionList, &vData);
 
     aUpdateDialog.notifyMenubar( true, false ); // prepare the checking, if there updates to be notified via menu bar icon
 
-    if (aUpdateDialog.run() == RET_OK && !vData.empty())
+    bool bOk = aUpdateDialog.run() == RET_OK;
+    if (m_pDialogHelper)
+        m_pDialogHelper->decBusy();
+
+    if (bOk && !vData.empty())
     {
         // If there is at least one directly downloadable extension then we
         // open the install dialog.
@@ -915,8 +951,12 @@ void ExtensionCmdQueue::Thread::_checkForUpdates(
         short nDialogResult = RET_OK;
         if ( !dataDownload.empty() )
         {
-            UpdateInstallDialog aDlg(m_pDialogHelper? m_pDialogHelper->getFrameWeld() : nullptr, dataDownload, m_xContext);
+            if (m_pDialogHelper)
+                m_pDialogHelper->incBusy();
+            UpdateInstallDialog aDlg(m_pDialogHelper ? m_pDialogHelper->getFrameWeld() : nullptr, dataDownload, m_xContext);
             nDialogResult = aDlg.run();
+            if (m_pDialogHelper)
+                m_pDialogHelper->decBusy();
             aUpdateDialog.notifyMenubar( false, true ); // Check, if there are still pending updates to be notified via menu bar icon
         }
         else
@@ -928,7 +968,7 @@ void ExtensionCmdQueue::Thread::_checkForUpdates(
             for (auto const& data : vData)
             {
                 if ( m_pDialogHelper && ( !data.sWebsiteURL.isEmpty() ) )
-                    m_pDialogHelper->openWebBrowser( data.sWebsiteURL, m_pDialogHelper->getWindow()->GetText() );
+                    m_pDialogHelper->openWebBrowser( data.sWebsiteURL, m_pDialogHelper->getFrameWeld()->get_title() );
             }
         }
     }
diff --git a/desktop/source/deployment/gui/dp_gui_extlistbox.cxx b/desktop/source/deployment/gui/dp_gui_extlistbox.cxx
index 9d987b18bfce..e0691e6430ee 100644
--- a/desktop/source/deployment/gui/dp_gui_extlistbox.cxx
+++ b/desktop/source/deployment/gui/dp_gui_extlistbox.cxx
@@ -33,11 +33,14 @@
 #include <com/sun/star/deployment/DependencyException.hpp>
 #include <com/sun/star/deployment/DeploymentException.hpp>
 #include <com/sun/star/deployment/ExtensionRemovedException.hpp>
+#include <com/sun/star/system/XSystemShellExecute.hpp>
+#include <com/sun/star/system/SystemShellExecuteFlags.hpp>
+#include <com/sun/star/system/SystemShellExecute.hpp>
 #include <cppuhelper/weakref.hxx>
 #include <i18nlangtag/languagetag.hxx>
 #include <vcl/event.hxx>
+#include <vcl/ptrstyle.hxx>
 #include <vcl/settings.hxx>
-#include <vcl/builderfactory.hxx>
 #include <vcl/commandevent.hxx>
 #include <algorithm>
 
@@ -81,7 +84,6 @@ Entry_Impl::Entry_Impl( const uno::Reference< deployment::XPackage > &xPackage,
     m_bHasButtons( false ),
     m_bMissingLic( false ),
     m_eState( eState ),
-    m_pPublisher( nullptr ),
     m_xPackage( xPackage )
 {
     try
@@ -175,37 +177,32 @@ ExtensionRemovedListener::~ExtensionRemovedListener()
 
 
 // ExtensionBox_Impl
-ExtensionBox_Impl::ExtensionBox_Impl(vcl::Window* pParent) :
-    Control( pParent, WB_BORDER | WB_TABSTOP ),
-    m_bHasScrollBar( false ),
-    m_bHasActive( false ),
-    m_bNeedsRecalc( true ),
-    m_bInCheckMode( false ),
-    m_bAdjustActive( false ),
-    m_bInDelete( false ),
-    m_nActive( 0 ),
-    m_nTopIndex( 0 ),
-    m_nActiveHeight( 0 ),
-    m_aSharedImage(StockImage::Yes, RID_BMP_SHARED),
-    m_aLockedImage(StockImage::Yes, RID_BMP_LOCKED),
-    m_aWarningImage(StockImage::Yes, RID_BMP_WARNING),
-    m_aDefaultImage(StockImage::Yes, RID_BMP_EXTENSION),
-    m_pScrollBar( nullptr ),
-    m_pManager( nullptr )
+ExtensionBox_Impl::ExtensionBox_Impl(std::unique_ptr<weld::ScrolledWindow> xScroll)
+    : m_bHasScrollBar( false )
+    , m_bHasActive( false )
+    , m_bNeedsRecalc( true )
+    , m_bInCheckMode( false )
+    , m_bAdjustActive( false )
+    , m_bInDelete( false )
+    , m_nActive( 0 )
+    , m_nTopIndex( 0 )
+    , m_nActiveHeight( 0 )
+    , m_aSharedImage(StockImage::Yes, RID_BMP_SHARED)
+    , m_aLockedImage(StockImage::Yes, RID_BMP_LOCKED)
+    , m_aWarningImage(StockImage::Yes, RID_BMP_WARNING)
+    , m_aDefaultImage(StockImage::Yes, RID_BMP_EXTENSION)
+    , m_pManager( nullptr )
+    , m_xScrollBar(std::move(xScroll))
 {
-    Init();
 }
 
 void ExtensionBox_Impl::Init()
 {
-    m_pScrollBar = VclPtr<ScrollBar>::Create( this, WB_VERT );
-    m_pScrollBar->SetScrollHdl( LINK( this, ExtensionBox_Impl, ScrollHdl ) );
-    m_pScrollBar->EnableDrag();
+    m_xScrollBar->set_user_managed_scrolling();
+    m_xScrollBar->connect_vadjustment_changed( LINK( this, ExtensionBox_Impl, ScrollHdl ) );
 
-    SetPaintTransparent( true );
-    SetPosPixel( Point( RSC_SP_DLG_INNERBORDER_LEFT, RSC_SP_DLG_INNERBORDER_TOP ) );
-    long nIconHeight = 2*TOP_OFFSET + SMALL_ICON_SIZE;
-    long nTitleHeight = 2*TOP_OFFSET + GetTextHeight();
+    auto nIconHeight = 2*TOP_OFFSET + SMALL_ICON_SIZE;
+    auto nTitleHeight = 2*TOP_OFFSET + GetTextHeight();
     if ( nIconHeight < nTitleHeight )
         m_nStdHeight = nTitleHeight;
     else
@@ -218,29 +215,15 @@ void ExtensionBox_Impl::Init()
 
     m_nActiveHeight = m_nStdHeight;
 
-    const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
-    if( IsControlBackground() )
-        SetBackground( GetControlBackground() );
-    else
-        SetBackground( rStyleSettings.GetFieldColor() );
-
     m_xRemoveListener = new ExtensionRemovedListener( this );
 
     m_pLocale.reset( new lang::Locale( Application::GetSettings().GetLanguageTag().getLocale() ) );
     m_pCollator.reset( new CollatorWrapper( ::comphelper::getProcessComponentContext() ) );
     m_pCollator->loadDefaultCollator( *m_pLocale, i18n::CollatorOptions::CollatorOptions_IGNORE_CASE );
-
-    Show();
 }
 
-
 ExtensionBox_Impl::~ExtensionBox_Impl()
 {
-    disposeOnce();
-}
-
-void ExtensionBox_Impl::dispose()
-{
     if ( ! m_bInDelete )
         DeleteRemoved();
 
@@ -248,22 +231,17 @@ void ExtensionBox_Impl::dispose()
 
     for (auto const& entry : m_vEntries)
     {
-        entry->m_pPublisher.disposeAndClear();
         entry->m_xPackage->removeEventListener( m_xRemoveListener.get() );
     }
 
     m_vEntries.clear();
 
-    m_pScrollBar.disposeAndClear();
-
     m_xRemoveListener.clear();
 
     m_pLocale.reset();
     m_pCollator.reset();
-    Control::dispose();
 }
 
-
 sal_Int32 ExtensionBox_Impl::getItemCount() const
 {
     return static_cast< sal_Int32 >( m_vEntries.size() );
@@ -299,7 +277,7 @@ void ExtensionBox_Impl::CalcActiveHeight( const long nPos )
     // calc description height
     Size aSize = GetOutputSizePixel();
     if ( m_bHasScrollBar )
-        aSize.AdjustWidth( -(m_pScrollBar->GetSizePixel().Width()) );
+        aSize.AdjustWidth(-m_xScrollBar->get_vscroll_width());
 
     aSize.AdjustWidth( -(ICON_OFFSET) );
     aSize.setHeight( 10000 );
@@ -309,8 +287,8 @@ void ExtensionBox_Impl::CalcActiveHeight( const long nPos )
         aText += "\n";
     aText += m_vEntries[ nPos ]->m_sDescription;
 
-    tools::Rectangle aRect = GetTextRect( tools::Rectangle( Point(), aSize ), aText,
-                                   DrawTextFlags::MultiLine | DrawTextFlags::WordBreak );
+    tools::Rectangle aRect = GetDrawingArea()->get_ref_device().GetTextRect(tools::Rectangle( Point(), aSize ), aText,
+                                                                            DrawTextFlags::MultiLine | DrawTextFlags::WordBreak);
     aTextHeight += aRect.GetHeight();
 
     if ( aTextHeight < m_nStdHeight )
@@ -329,7 +307,7 @@ tools::Rectangle ExtensionBox_Impl::GetEntryRect( const long nPos ) const
     Size aSize( GetOutputSizePixel() );
 
     if ( m_bHasScrollBar )
-        aSize.AdjustWidth( -(m_pScrollBar->GetSizePixel().Width()) );
+        aSize.AdjustWidth(-m_xScrollBar->get_vscroll_width());
 
     if ( m_vEntries[ nPos ]->m_bActive )
         aSize.setHeight( m_nActiveHeight );
@@ -350,15 +328,7 @@ void ExtensionBox_Impl::DeleteRemoved()
 
     m_bInDelete = true;
 
-    if ( ! m_vRemovedEntries.empty() )
-    {
-        for (auto const& removedEntry : m_vRemovedEntries)
-        {
-            removedEntry->m_pPublisher.disposeAndClear();
-        }
-
-        m_vRemovedEntries.clear();
-    }
+    m_vRemovedEntries.clear();
 
     m_bInDelete = false;
 }
@@ -424,8 +394,6 @@ void ExtensionBox_Impl::DrawRow(vcl::RenderContext& rRenderContext, const tools:
         rRenderContext.SetTextColor(rStyleSettings.GetHighlightTextColor());
     else if ((rEntry->m_eState != REGISTERED) && (rEntry->m_eState != NOT_AVAILABLE))
         rRenderContext.SetTextColor(rStyleSettings.GetDisableColor());
-    else if (IsControlForeground())
-        rRenderContext.SetTextColor(GetControlForeground());
     else
         rRenderContext.SetTextColor(rStyleSettings.GetFieldTextColor());
 
@@ -437,11 +405,7 @@ void ExtensionBox_Impl::DrawRow(vcl::RenderContext& rRenderContext, const tools:
     }
     else
     {
-        if (IsControlBackground())
-            rRenderContext.SetBackground(GetControlBackground());
-        else
-            rRenderContext.SetBackground(rStyleSettings.GetFieldColor());
-
+        rRenderContext.SetBackground(rStyleSettings.GetFieldColor());
         rRenderContext.SetTextFillColor();
         rRenderContext.Erase(rRect);
     }
@@ -463,37 +427,31 @@ void ExtensionBox_Impl::DrawRow(vcl::RenderContext& rRenderContext, const tools:
         rRenderContext.DrawImage(aPos, Size(ICON_WIDTH, ICON_HEIGHT), aImage);
 
     // Setup fonts
+    // expand the point size of the desired font to the equivalent pixel size
+    if (vcl::Window* pDefaultDevice = dynamic_cast<vcl::Window*>(Application::GetDefaultDevice()))
+        pDefaultDevice->SetPointFont(rRenderContext, GetDrawingArea()->get_font());
     vcl::Font aStdFont(rRenderContext.GetFont());
     vcl::Font aBoldFont(aStdFont);
     aBoldFont.SetWeight(WEIGHT_BOLD);
     rRenderContext.SetFont(aBoldFont);
-    long aTextHeight = rRenderContext.GetTextHeight();
-
-    // Init publisher link here
-    if (!rEntry->m_pPublisher && !rEntry->m_sPublisher.isEmpty())
-    {
-        rEntry->m_pPublisher = VclPtr<FixedHyperlink>::Create(this);
-        rEntry->m_pPublisher->SetBackground();
-        rEntry->m_pPublisher->SetPaintTransparent(true);
-        rEntry->m_pPublisher->SetURL(rEntry->m_sPublisherURL);
-        rEntry->m_pPublisher->SetText(rEntry->m_sPublisher);
-        Size aSize = FixedText::CalcMinimumTextSize(rEntry->m_pPublisher);
-        rEntry->m_pPublisher->SetSizePixel(aSize);
-    }
+    auto aTextHeight = rRenderContext.GetTextHeight();
 
     // Get max title width
-    long nMaxTitleWidth = rRect.GetWidth() - ICON_OFFSET;
+    auto nMaxTitleWidth = rRect.GetWidth() - ICON_OFFSET;
     nMaxTitleWidth -= (2 * SMALL_ICON_SIZE) + (4 * SPACE_BETWEEN);
-    if (rEntry->m_pPublisher)
+    rRenderContext.SetFont(aStdFont);
+    long nLinkWidth = 0;
+    if (!rEntry->m_sPublisher.isEmpty())
     {
-        nMaxTitleWidth -= rEntry->m_pPublisher->GetSizePixel().Width() + (2 * SPACE_BETWEEN);
+        nLinkWidth = rRenderContext.GetTextWidth(rEntry->m_sPublisher);
+        nMaxTitleWidth -= nLinkWidth + (2 * SPACE_BETWEEN);
     }
-
     long aVersionWidth = rRenderContext.GetTextWidth(rEntry->m_sVersion);
     long aTitleWidth = rRenderContext.GetTextWidth(rEntry->m_sTitle) + (aTextHeight / 3);
 
     aPos = rRect.TopLeft() + Point(ICON_OFFSET, TOP_OFFSET);
 
+    rRenderContext.SetFont(aBoldFont);
     if (aTitleWidth > nMaxTitleWidth - aVersionWidth)
     {
         aTitleWidth = nMaxTitleWidth - aVersionWidth - (aTextHeight / 3);
@@ -541,18 +499,27 @@ void ExtensionBox_Impl::DrawRow(vcl::RenderContext& rRenderContext, const tools:
     {
         //replace LF to space, so words do not stick together in one line view
         sDescription = sDescription.replace(0x000A, ' ');
-        const long nWidth = GetTextWidth( sDescription );
+        const long nWidth = rRenderContext.GetTextWidth( sDescription );
         if (nWidth > rRect.GetWidth() - aPos.X())
             sDescription = rRenderContext.GetEllipsisString(sDescription, rRect.GetWidth() - aPos.X());
         rRenderContext.DrawText(aPos, sDescription);
     }
 
     // Draw publisher link
-    if (rEntry->m_pPublisher)
+    if (!rEntry->m_sPublisher.isEmpty())
     {
-        rEntry->m_pPublisher->Show();
         aPos = rRect.TopLeft() + Point( ICON_OFFSET + nMaxTitleWidth + (2*SPACE_BETWEEN), TOP_OFFSET );
-        rEntry->m_pPublisher->SetPosPixel(aPos);
+
+        rRenderContext.Push(PushFlags::FONT | PushFlags::TEXTCOLOR | PushFlags::TEXTFILLCOLOR);
+        rRenderContext.SetTextColor(rStyleSettings.GetLinkColor());
+        rRenderContext.SetTextFillColor(rStyleSettings.GetFieldColor());
+        vcl::Font aFont = rRenderContext.GetFont();
+        // to underline
+        aFont.SetUnderline(LINESTYLE_SINGLE);
+        rRenderContext.SetFont(aFont);
+        rRenderContext.DrawText(aPos, rEntry->m_sPublisher);
+        rEntry->m_aLinkRect = tools::Rectangle(aPos, Size(nLinkWidth, aTextHeight));
+        rRenderContext.Pop();
     }
 
     // Draw status icons
@@ -618,7 +585,7 @@ void ExtensionBox_Impl::RecalcAll()
             }
 
             if ( m_bHasScrollBar )
-                m_pScrollBar->SetThumbPos( m_nTopIndex );
+                m_xScrollBar->vadjustment_set_value( m_nTopIndex );
         }
     }
 
@@ -683,7 +650,7 @@ void ExtensionBox_Impl::Paint(vcl::RenderContext& rRenderContext, const tools::R
     Size aSize(GetOutputSizePixel());
 
     if ( m_bHasScrollBar )
-        aSize.AdjustWidth( -(m_pScrollBar->GetSizePixel().Width()) );
+        aSize.AdjustWidth(-m_xScrollBar->get_vscroll_width());
 
     const ::osl::MutexGuard aGuard( m_entriesMutex );
 
@@ -713,8 +680,7 @@ long ExtensionBox_Impl::GetTotalHeight() const
 void ExtensionBox_Impl::SetupScrollBar()
 {
     const Size aSize = GetOutputSizePixel();
-    const long nScrBarSize = GetSettings().GetStyleSettings().GetScrollBarSize();
-    const long nTotalHeight = GetTotalHeight();
+    const auto nTotalHeight = GetTotalHeight();
     const bool bNeedsScrollBar = ( nTotalHeight > aSize.Height() );
 
     if ( bNeedsScrollBar )
@@ -722,20 +688,16 @@ void ExtensionBox_Impl::SetupScrollBar()
         if ( m_nTopIndex + aSize.Height() > nTotalHeight )
             m_nTopIndex = nTotalHeight - aSize.Height();
 
-        m_pScrollBar->SetPosSizePixel( Point( aSize.Width() - nScrBarSize, 0 ),
-                                       Size( nScrBarSize, aSize.Height() ) );
-        m_pScrollBar->SetRangeMax( nTotalHeight );
-        m_pScrollBar->SetVisibleSize( aSize.Height() );
-        m_pScrollBar->SetPageSize( ( aSize.Height() * 4 ) / 5 );
-        m_pScrollBar->SetLineSize( m_nStdHeight );
-        m_pScrollBar->SetThumbPos( m_nTopIndex );
+        m_xScrollBar->vadjustment_configure(m_nTopIndex, 0, nTotalHeight,
+                                            m_nStdHeight, ( aSize.Height() * 4 ) / 5,
+                                            aSize.Height());
 
-        if ( !m_bHasScrollBar )
-            m_pScrollBar->Show();
+        if (!m_bHasScrollBar)
+            m_xScrollBar->set_vpolicy(VclPolicyType::ALWAYS);
     }
     else if ( m_bHasScrollBar )
     {
-        m_pScrollBar->Hide();
+        m_xScrollBar->set_vpolicy(VclPolicyType::NEVER);
         m_nTopIndex = 0;
     }
 
@@ -748,14 +710,14 @@ void ExtensionBox_Impl::Resize()
     RecalcAll();
 }
 
-Size ExtensionBox_Impl::GetOptimalSize() const
+void ExtensionBox_Impl::SetDrawingArea(weld::DrawingArea* pDrawingArea)
 {
-    return LogicToPixel(Size(250, 150), MapMode(MapUnit::MapAppFont));
-}
+    Size aSize = pDrawingArea->get_ref_device().LogicToPixel(Size(250, 150), MapMode(MapUnit::MapAppFont));
+    pDrawingArea->set_size_request(aSize.Width(), aSize.Height());
+    CustomWidgetController::SetDrawingArea(pDrawingArea);
+    SetOutputSizePixel(aSize);
 
-extern "C" SAL_DLLPUBLIC_EXPORT void makeExtensionBox(VclPtr<vcl::Window> & rRet, VclPtr<vcl::Window> & pParent, VclBuilder::stringmap &)
-{
-    rRet = VclPtr<ExtensionBox_Impl>::Create(pParent);
+    Init();
 }
 
 long ExtensionBox_Impl::PointToPos( const Point& rPos )
@@ -773,64 +735,93 @@ long ExtensionBox_Impl::PointToPos( const Point& rPos )
     return nPos;
 }
 
-
-void ExtensionBox_Impl::MouseButtonDown( const MouseEvent& rMEvt )
+bool ExtensionBox_Impl::MouseMove( const MouseEvent& rMEvt )
 {
-    long nPos = PointToPos( rMEvt.GetPosPixel() );
+    bool bOverHyperlink = false;
 
-    if ( rMEvt.IsLeft() )
+    auto nPos = PointToPos( rMEvt.GetPosPixel() );
+    if ( ( nPos >= 0 ) && ( nPos < static_cast<long>(m_vEntries.size()) ) )
     {
-        if ( rMEvt.IsMod1() && m_bHasActive )
-            selectEntry( m_vEntries.size() );   // Selecting a not existing entry will deselect the current one
-        else
-            selectEntry( nPos );
+        const auto& rEntry = m_vEntries[nPos];
+        bOverHyperlink = !rEntry->m_sPublisher.isEmpty() && rEntry->m_aLinkRect.IsInside(rMEvt.GetPosPixel());
     }
-}
-
 
-bool ExtensionBox_Impl::EventNotify( NotifyEvent& rNEvt )
-{
-    if ( !m_bInDelete )
-        DeleteRemoved();
+    if (bOverHyperlink)
+        SetPointer(PointerStyle::RefHand);
+    else
+        SetPointer(PointerStyle::Arrow);
 
-    bool bHandled = false;
+    return false;
+}
 
-    if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
+OUString ExtensionBox_Impl::RequestHelp(tools::Rectangle& rRect)
+{
+    auto nPos = PointToPos( rRect.TopLeft() );
+    if ( ( nPos >= 0 ) && ( nPos < static_cast<long>(m_vEntries.size()) ) )
     {
-        const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
-        vcl::KeyCode aKeyCode = pKEvt->GetKeyCode();
-        sal_uInt16 nKeyCode = aKeyCode.GetCode();
-
-        if ( nKeyCode == KEY_TAB )
-             ;
-        else if ( aKeyCode.GetGroup() == KEYGROUP_CURSOR )
-            bHandled = HandleCursorKey( nKeyCode );
+        const auto& rEntry = m_vEntries[nPos];
+        bool bOverHyperlink = !rEntry->m_sPublisher.isEmpty() && rEntry->m_aLinkRect.IsInside(rRect);
+        if (bOverHyperlink)
+        {
+            rRect = rEntry->m_aLinkRect;
+            return rEntry->m_sPublisherURL;
+        }
     }
 
-    if ( rNEvt.GetType() == MouseNotifyEvent::COMMAND )
+    return OUString();
+}
+
+bool ExtensionBox_Impl::MouseButtonDown( const MouseEvent& rMEvt )
+{
+    if ( rMEvt.IsLeft() )
     {
-        if ( m_bHasScrollBar &&
-             ( rNEvt.GetCommandEvent()->GetCommand() == CommandEventId::Wheel ) )
+        if (rMEvt.IsMod1() && m_bHasActive)
+            selectEntry(ExtensionBox_Impl::ENTRY_NOTFOUND);   // Selecting a not existing entry will deselect the current one
+        else
         {
-            const CommandWheelData* pData = rNEvt.GetCommandEvent()->GetWheelData();
-            if ( pData->GetMode() == CommandWheelMode::SCROLL )
+            auto nPos = PointToPos( rMEvt.GetPosPixel() );
+
+            if ( ( nPos >= 0 ) && ( nPos < static_cast<long>(m_vEntries.size()) ) )
             {
-                long nThumbPos = m_pScrollBar->GetThumbPos();
-                if ( pData->GetDelta() < 0 )
-                    m_pScrollBar->DoScroll( nThumbPos + m_nStdHeight );
-                else
-                    m_pScrollBar->DoScroll( nThumbPos - m_nStdHeight );
-                bHandled = true;
+                const auto& rEntry = m_vEntries[nPos];
+                if (!rEntry->m_sPublisher.isEmpty() && rEntry->m_aLinkRect.IsInside(rMEvt.GetPosPixel()))
+                {
+                    try
+                    {
+                        css::uno::Reference<css::system::XSystemShellExecute> xSystemShellExecute(
+                            css::system::SystemShellExecute::create(comphelper::getProcessComponentContext()));
+                        //throws css::lang::IllegalArgumentException, css::system::SystemShellExecuteException
+                        xSystemShellExecute->execute(rEntry->m_sPublisherURL, OUString(), css::system::SystemShellExecuteFlags::URIS_ONLY);
+                    }
+                    catch (...)
+                    {
+                    }
+                    return true;
+                }
             }
+
+            selectEntry( nPos );
         }
+        return true;
     }
 
-    if ( !bHandled )
-        return Control::EventNotify(rNEvt);
-    else
-        return true;
+    return false;
 }
 
+bool ExtensionBox_Impl::KeyInput(const KeyEvent& rKEvt)
+{
+    if ( !m_bInDelete )
+        DeleteRemoved();
+
+    vcl::KeyCode aKeyCode = rKEvt.GetKeyCode();
+    sal_uInt16 nKeyCode = aKeyCode.GetCode();
+
+    bool bHandled = false;
+    if (nKeyCode != KEY_TAB && aKeyCode.GetGroup() == KEYGROUP_CURSOR)
+        bHandled = HandleCursorKey(nKeyCode);
+
+    return bHandled;
+}
 
 bool ExtensionBox_Impl::FindEntryPos( const TEntry_Impl& rEntry, const long nStart,
                                       const long nEnd, long &nPos )
@@ -1149,23 +1140,10 @@ void ExtensionBox_Impl::checkEntries()
     }
 }
 
-
-void ExtensionBox_Impl::DoScroll( long nDelta )
-{
-    m_nTopIndex += nDelta;
-    Point aNewSBPt( m_pScrollBar->GetPosPixel() );
-
-    tools::Rectangle aScrRect( Point(), GetOutputSizePixel() );
-    aScrRect.AdjustRight( -(m_pScrollBar->GetSizePixel().Width()) );
-    Scroll( 0, -nDelta, aScrRect );
-
-    m_pScrollBar->SetPosPixel( aNewSBPt );
-}
-
-
-IMPL_LINK( ExtensionBox_Impl, ScrollHdl, ScrollBar*, pScrBar, void )
+IMPL_LINK(ExtensionBox_Impl, ScrollHdl, weld::ScrolledWindow&, rScrBar, void)
 {
-    DoScroll( pScrBar->GetDelta() );
+    m_nTopIndex = rScrBar.vadjustment_get_value();
+    Invalidate();
 }
 
 } //namespace dp_gui
diff --git a/desktop/source/deployment/gui/dp_gui_extlistbox.hxx b/desktop/source/deployment/gui/dp_gui_extlistbox.hxx
index 79397f30ddbb..ccdc63e42526 100644
--- a/desktop/source/deployment/gui/dp_gui_extlistbox.hxx
+++ b/desktop/source/deployment/gui/dp_gui_extlistbox.hxx
@@ -25,6 +25,8 @@
 #include <vcl/fixed.hxx>
 #include <vcl/fixedhyper.hxx>
 #include <vcl/dialog.hxx>
+#include <vcl/customweld.hxx>
+#include <vcl/weld.hxx>
 
 #include <cppuhelper/implbase.hxx>
 #include <cppuhelper/weakref.hxx>
@@ -74,7 +76,7 @@ struct Entry_Impl
     OUString        m_sErrorText;
     OUString        m_sLicenseText;
     Image           m_aIcon;
-    VclPtr<FixedHyperlink> m_pPublisher;
+    tools::Rectangle m_aLinkRect;
 
     css::uno::Reference<css::deployment::XPackage> m_xPackage;
 
@@ -91,7 +93,7 @@ class ExtensionBox_Impl;
 
 class ExtensionRemovedListener : public ::cppu::WeakImplHelper<css::lang::XEventListener>
 {
-    VclPtr<ExtensionBox_Impl>   m_pParent;
+    ExtensionBox_Impl*   m_pParent;
 
 public:
 
@@ -103,7 +105,7 @@ public:
     virtual void SAL_CALL disposing(css::lang::EventObject const& evt) override;
 };
 
-class ExtensionBox_Impl : public Control
+class ExtensionBox_Impl : public weld::CustomWidgetController
 {
     bool m_bHasScrollBar : 1;
     bool m_bHasActive : 1;
@@ -122,8 +124,6 @@ class ExtensionBox_Impl : public Control
     Image m_aWarningImage;
     Image m_aDefaultImage;
 
-    VclPtr<ScrollBar>      m_pScrollBar;
-
     rtl::Reference<ExtensionRemovedListener> m_xRemoveListener;
 
     TheExtensionManager      *m_pManager;
@@ -144,6 +144,9 @@ class ExtensionBox_Impl : public Control
     //Holds weak references to extensions to which is we have added an XEventListener
     std::vector< css::uno::WeakReference<
         css::deployment::XPackage> > m_vListenerAdded;
+
+    std::unique_ptr<weld::ScrolledWindow> m_xScrollBar;
+
     //Removes the dead weak references from m_vListenerAdded
     void cleanVecListenerAdded();
     void addEventListenerOnce(css::uno::Reference<css::deployment::XPackage> const & extension);
@@ -156,27 +159,27 @@ class ExtensionBox_Impl : public Control
     bool FindEntryPos( const TEntry_Impl& rEntry, long nStart, long nEnd, long &nFound );
     void DeleteRemoved();
 
-
-    DECL_LINK( ScrollHdl, ScrollBar*, void );
+    DECL_LINK( ScrollHdl, weld::ScrolledWindow&, void );
 
     void Init();
 public:
-    explicit ExtensionBox_Impl(vcl::Window* pParent);
+    explicit ExtensionBox_Impl(std::unique_ptr<weld::ScrolledWindow> xScroll);
     virtual ~ExtensionBox_Impl() override;
-    virtual void dispose() override;
 
-    virtual void MouseButtonDown( 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 &rPaintRect ) override;
     virtual void Resize() override;
-    virtual bool EventNotify( NotifyEvent& rNEvt ) override;
-    virtual Size GetOptimalSize() const override;
+    virtual OUString RequestHelp(tools::Rectangle& rRect) override;
+
+    virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override;
 
     TEntry_Impl const & GetEntryData( long nPos ) { return m_vEntries[ nPos ]; }
     long            GetEntryCount() { return static_cast<long>(m_vEntries.size()); }
     tools::Rectangle       GetEntryRect( const long nPos ) const;
     bool            HasActive() { return m_bHasActive; }
     long            PointToPos( const Point& rPos );
-    void            DoScroll( long nDelta );
     virtual void    RecalcAll();
     void            RemoveUnlocked();
 
diff --git a/desktop/source/deployment/gui/dp_gui_service.cxx b/desktop/source/deployment/gui/dp_gui_service.cxx
index a8e0f37b1388..12683e6af260 100644
--- a/desktop/source/deployment/gui/dp_gui_service.cxx
+++ b/desktop/source/deployment/gui/dp_gui_service.cxx
@@ -262,12 +262,12 @@ void ServiceImpl::startExecuteModal(
             if ( bCloseDialog )
                 myExtMgr->Close();
             else
-                myExtMgr->ToTop( ToTopFlags::RestoreWhenMin );
+                myExtMgr->ToTop();
         }
         else
         {
             myExtMgr->Show();
-            myExtMgr->ToTop( ToTopFlags::RestoreWhenMin );
+            myExtMgr->ToTop();
         }
     }
 
diff --git a/desktop/source/deployment/gui/dp_gui_theextmgr.cxx b/desktop/source/deployment/gui/dp_gui_theextmgr.cxx
index 2693d44836ce..65b4e1c0592c 100644
--- a/desktop/source/deployment/gui/dp_gui_theextmgr.cxx
+++ b/desktop/source/deployment/gui/dp_gui_theextmgr.cxx
@@ -59,8 +59,6 @@ TheExtensionManager::TheExtensionManager( const uno::Reference< awt::XWindow > &
                                           const uno::Reference< uno::XComponentContext > &xContext ) :
     m_xContext( xContext ),
     m_xParent( xParent ),
-    m_pExtMgrDialog( nullptr ),
-    m_pUpdReqDialog( nullptr ),
     m_bModified(false)
 {
     m_xExtensionManager = deployment::ExtensionManager::get( xContext );
@@ -102,72 +100,72 @@ TheExtensionManager::TheExtensionManager( const uno::Reference< awt::XWindow > &
     }
 }
 
-
 TheExtensionManager::~TheExtensionManager()
 {
-    m_pUpdReqDialog.disposeAndClear();
-    m_pExtMgrDialog.disposeAndClear();
+    if (m_xUpdReqDialog)
+        m_xUpdReqDialog->response(RET_CANCEL);
+    assert(!m_xUpdReqDialog);
+    if (m_xExtMgrDialog)
+        m_xExtMgrDialog->response(RET_CANCEL);
+    assert(!m_xExtMgrDialog);
 }
 
-
 void TheExtensionManager::createDialog( const bool bCreateUpdDlg )
 {
     const SolarMutexGuard guard;
 
     if ( bCreateUpdDlg )
     {
-        if ( !m_pUpdReqDialog )
+        if ( !m_xUpdReqDialog )
         {
-            m_pUpdReqDialog = VclPtr<UpdateRequiredDialog>::Create( nullptr, this );
-            m_pExecuteCmdQueue.reset( new ExtensionCmdQueue( m_pUpdReqDialog.get(), this, m_xContext ) );
+            m_xUpdReqDialog.reset(new UpdateRequiredDialog(Application::GetFrameWeld(m_xParent), this));
+            m_xExecuteCmdQueue.reset( new ExtensionCmdQueue( m_xUpdReqDialog.get(), this, m_xContext ) );
             createPackageList();
         }
     }
-    else if ( !m_pExtMgrDialog )
+    else if ( !m_xExtMgrDialog )
     {
-        if (m_xParent.is())
-            m_pExtMgrDialog = VclPtr<ExtMgrDialog>::Create( VCLUnoHelper::GetWindow(m_xParent), this );
-        else
-            m_pExtMgrDialog = VclPtr<ExtMgrDialog>::Create( nullptr, this, Dialog::InitFlag::NoParent );
-        m_pExecuteCmdQueue.reset( new ExtensionCmdQueue( m_pExtMgrDialog.get(), this, m_xContext ) );
-        m_pExtMgrDialog->setGetExtensionsURL( m_sGetExtensionsURL );
+        m_xExtMgrDialog.reset(new ExtMgrDialog(Application::GetFrameWeld(m_xParent), this));
+        m_xExecuteCmdQueue.reset( new ExtensionCmdQueue( m_xExtMgrDialog.get(), this, m_xContext ) );
+        m_xExtMgrDialog->setGetExtensionsURL( m_sGetExtensionsURL );
         createPackageList();
     }
 }
 
-
 void TheExtensionManager::Show()
 {
     const SolarMutexGuard guard;
 
-    getDialog()->Show();
+    weld::DialogController::runAsync(m_xExtMgrDialog, [this](sal_Int32 /*nResult*/) {
+        auto xExtMgrDialog = m_xExtMgrDialog;
+        m_xExtMgrDialog.reset();
+        xExtMgrDialog->Close();
+    });
 }
 
-
 void TheExtensionManager::SetText( const OUString &rTitle )
 {
     const SolarMutexGuard guard;
 
-    getDialog()->SetText( rTitle );
+    getDialog()->set_title( rTitle );
 }
 
 
-void TheExtensionManager::ToTop( ToTopFlags nFlags )
+void TheExtensionManager::ToTop()
 {
     const SolarMutexGuard guard;
 
-    getDialog()->ToTop( nFlags );
+    getDialog()->present();
 }
 
 
 bool TheExtensionManager::Close()
 {
-    if ( m_pExtMgrDialog )
-        return m_pExtMgrDialog->Close();
-    else if ( m_pUpdReqDialog )
-        return m_pUpdReqDialog->Close();
-    else
-        return true;
+    if (m_xExtMgrDialog)
+        m_xExtMgrDialog->response(RET_CANCEL);
+    else if (m_xUpdReqDialog)
+        m_xUpdReqDialog->response(RET_CANCEL);
+    return true;
 }
 
 
@@ -175,10 +173,10 @@ sal_Int16 TheExtensionManager::execute()
 {
     sal_Int16 nRet = 0;
 
-    if ( m_pUpdReqDialog )
+    if ( m_xUpdReqDialog )
     {
-        nRet = m_pUpdReqDialog->Execute();
-        m_pUpdReqDialog.disposeAndClear();
+        nRet = m_xUpdReqDialog->run();
+        m_xUpdReqDialog.reset();
     }
 
     return nRet;
@@ -187,7 +185,7 @@ sal_Int16 TheExtensionManager::execute()
 
 bool TheExtensionManager::isVisible()
 {
-    return getDialog()->IsVisible();
+    return getDialog()->get_visible();
 }
 
 
@@ -221,7 +219,7 @@ void TheExtensionManager::checkUpdates()
         }
     }
 
-    m_pExecuteCmdQueue->checkForUpdates( vEntries );
+    m_xExecuteCmdQueue->checkForUpdates( vEntries );
 }
 
 
@@ -243,9 +241,9 @@ bool TheExtensionManager::installPackage( const OUString &rPackageURL, bool bWar
         return false;
 
     if ( bInstallForAll )
-        m_pExecuteCmdQueue->addExtension( rPackageURL, SHARED_PACKAGE_MANAGER, false );
+        m_xExecuteCmdQueue->addExtension( rPackageURL, SHARED_PACKAGE_MANAGER, false );
     else
-        m_pExecuteCmdQueue->addExtension( rPackageURL, USER_PACKAGE_MANAGER, bWarnUser );
+        m_xExecuteCmdQueue->addExtension( rPackageURL, USER_PACKAGE_MANAGER, bWarnUser );
 
     return true;
 }
@@ -256,8 +254,12 @@ void TheExtensionManager::terminateDialog()
     if ( ! dp_misc::office_is_running() )
     {
         const SolarMutexGuard guard;
-        m_pExtMgrDialog.disposeAndClear();
-        m_pUpdReqDialog.disposeAndClear();
+        if (m_xExtMgrDialog)
+            m_xExtMgrDialog->response(RET_CANCEL);
+        assert(!m_xExtMgrDialog);
+        if (m_xUpdReqDialog)
+            m_xUpdReqDialog->response(RET_CANCEL);
+        assert(!m_xUpdReqDialog);
         Application::Quit();
     }
 }
@@ -421,22 +423,25 @@ void TheExtensionManager::disposing( lang::EventObject const & rEvt )
         if ( dp_misc::office_is_running() )
         {
             const SolarMutexGuard guard;
-            m_pExtMgrDialog.disposeAndClear();
-            m_pUpdReqDialog.disposeAndClear();
+            if (m_xExtMgrDialog)
+                m_xExtMgrDialog->response(RET_CANCEL);
+            assert(!m_xExtMgrDialog);
+            if (m_xUpdReqDialog)
+                m_xUpdReqDialog->response(RET_CANCEL);
+            assert(!m_xUpdReqDialog);
         }
         s_ExtMgr.clear();
     }
 }
 
-
 // XTerminateListener
 void TheExtensionManager::queryTermination( ::lang::EventObject const & )
 {
     DialogHelper *pDialogHelper = getDialogHelper();
 
-    if ( m_pExecuteCmdQueue->isBusy() || ( pDialogHelper && pDialogHelper->isBusy() ) )
+    if ( m_xExecuteCmdQueue->isBusy() || ( pDialogHelper && pDialogHelper->isBusy() ) )
     {
-        ToTop( ToTopFlags::RestoreWhenMin );
+        ToTop();
         throw frame::TerminationVetoException(
             "The office cannot be closed while the Extension Manager is running",
             static_cast<frame::XTerminateListener*>(this));
@@ -444,20 +449,18 @@ void TheExtensionManager::queryTermination( ::lang::EventObject const & )
     else
     {
         clearModified();
-        if ( m_pExtMgrDialog )
-            m_pExtMgrDialog->Close();
-        if ( m_pUpdReqDialog )
-            m_pUpdReqDialog->Close();
+        if (m_xExtMgrDialog)
+            m_xExtMgrDialog->response(RET_CANCEL);
+        if (m_xUpdReqDialog)
+            m_xUpdReqDialog->response(RET_CANCEL);
     }
 }
 
-
 void TheExtensionManager::notifyTermination( ::lang::EventObject const & rEvt )
 {
     disposing( rEvt );
 }
 
-
 // XModifyListener
 void TheExtensionManager::modified( ::lang::EventObject const & /*rEvt*/ )
 {
diff --git a/desktop/source/deployment/gui/dp_gui_theextmgr.hxx b/desktop/source/deployment/gui/dp_gui_theextmgr.hxx
index 4980458f0dfd..c75ec34872b0 100644
--- a/desktop/source/deployment/gui/dp_gui_theextmgr.hxx
+++ b/desktop/source/deployment/gui/dp_gui_theextmgr.hxx
@@ -51,9 +51,9 @@ private:
     css::uno::Reference< css::deployment::XExtensionManager > m_xExtensionManager;
     css::uno::Reference< css::container::XNameAccess >        m_xNameAccessNodes;
     css::uno::Reference< css::awt::XWindow >                  m_xParent;
-    VclPtr<ExtMgrDialog>         m_pExtMgrDialog;
-    VclPtr<UpdateRequiredDialog> m_pUpdReqDialog;
-    std::unique_ptr<ExtensionCmdQueue> m_pExecuteCmdQueue;
+    std::shared_ptr<ExtMgrDialog> m_xExtMgrDialog;
+    std::unique_ptr<UpdateRequiredDialog> m_xUpdReqDialog;
+    std::unique_ptr<ExtensionCmdQueue> m_xExecuteCmdQueue;
 
     OUString                     m_sGetExtensionsURL;
     bool                         m_bModified;
@@ -71,23 +71,25 @@ public:
     bool isModified() const { return m_bModified; }
     void clearModified() { m_bModified = false; }
 
-    Dialog* getDialog()
+    weld::Window* getDialog()
     {
-        if (m_pExtMgrDialog)
-            return m_pExtMgrDialog.get();
-        return m_pUpdReqDialog.get();
+        if (m_xExtMgrDialog)
+            return m_xExtMgrDialog->getDialog();
+        if (m_xUpdReqDialog)
+            return m_xUpdReqDialog->getDialog();
+        return nullptr;
     }
     DialogHelper* getDialogHelper()
     {
-        if (m_pExtMgrDialog)
-            return m_pExtMgrDialog.get();
-        return m_pUpdReqDialog.get();
+        if (m_xExtMgrDialog)
+            return m_xExtMgrDialog.get();
+        return m_xUpdReqDialog.get();
     }
-    ExtensionCmdQueue* getCmdQueue() const { return m_pExecuteCmdQueue.get(); }
+    ExtensionCmdQueue* getCmdQueue() const { return m_xExecuteCmdQueue.get(); }
 
     void SetText( const OUString &rTitle );
     void Show();
-    void ToTop( ToTopFlags nFlags );
+    void ToTop();
     bool Close();
     bool isVisible();
 
diff --git a/desktop/uiconfig/ui/extensionmanager.ui b/desktop/uiconfig/ui/extensionmanager.ui
index da108c5c6d0a..b749f057d806 100644
--- a/desktop/uiconfig/ui/extensionmanager.ui
+++ b/desktop/uiconfig/ui/extensionmanager.ui
@@ -1,13 +1,17 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.20.0 -->
+<!-- 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="ExtensionManagerDialog">
     <property name="can_focus">False</property>
     <property name="border_width">6</property>
     <property name="title" translatable="yes" context="extensionmanager|ExtensionManagerDialog">Extension Manager</property>
+    <property name="default_width">0</property>
+    <property name="default_height">0</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>
@@ -61,9 +65,28 @@
             <property name="orientation">vertical</property>
             <property name="spacing">12</property>
             <child>
-              <object class="deploymentgui-ExtBoxWithBtns" id="extensions">
+              <object class="GtkScrolledWindow" id="scroll">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
+                <property name="can_focus">True</property>
+                <property name="hexpand">True</property>
+                <property name="vexpand">True</property>
+                <property name="hscrollbar_policy">never</property>
+                <property name="shadow_type">in</property>
+                <child>
+                  <object class="GtkViewport">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <child>
+                      <object class="GtkDrawingArea" id="extensions">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="events">GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
+                        <property name="hexpand">True</property>
+                        <property name="vexpand">True</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
               </object>
               <packing>
                 <property name="expand">True</property>
@@ -188,8 +211,8 @@
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
                             <property name="receives_default">False</property>
-                            <property name="use_underline">True</property>
                             <property name="halign">center</property>
+                            <property name="use_underline">True</property>
                             <property name="xalign">0</property>
                             <property name="active">True</property>
                             <property name="draw_indicator">True</property>
@@ -205,8 +228,8 @@
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
                             <property name="receives_default">False</property>
-                            <property name="use_underline">True</property>
                             <property name="halign">start</property>
+                            <property name="use_underline">True</property>
                             <property name="xalign">0</property>
                             <property name="active">True</property>
                             <property name="draw_indicator">True</property>
@@ -222,8 +245,8 @@
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
                             <property name="receives_default">False</property>
-                            <property name="use_underline">True</property>
                             <property name="halign">end</property>
+                            <property name="use_underline">True</property>
                             <property name="xalign">0</property>
                             <property name="active">True</property>
                             <property name="draw_indicator">True</property>
@@ -269,7 +292,6 @@
                   <packing>
                     <property name="left_attach">0</property>
                     <property name="top_attach">0</property>
-                    <property name="width">2</property>
                   </packing>
                 </child>
                 <child>
@@ -281,7 +303,7 @@
                     <property name="use_stock">True</property>
                   </object>
                   <packing>
-                    <property name="left_attach">3</property>
+                    <property name="left_attach">2</property>
                     <property name="top_attach">0</property>
                   </packing>
                 </child>
@@ -289,10 +311,11 @@
                   <object class="GtkProgressBar" id="progressbar">
                     <property name="can_focus">False</property>
                     <property name="no_show_all">True</property>
+                    <property name="valign">center</property>
                     <property name="hexpand">True</property>
                   </object>
                   <packing>
-                    <property name="left_attach">2</property>
+                    <property name="left_attach">1</property>
                     <property name="top_attach">0</property>
                   </packing>
                 </child>
@@ -309,17 +332,9 @@
                   <packing>
                     <property name="left_attach">0</property>
                     <property name="top_attach">1</property>
+                    <property name="width">3</property>
                   </packing>
                 </child>
-                <child>
-                  <placeholder/>

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list