[Libreoffice-commits] core.git: basctl/source basctl/uiconfig chart2/inc chart2/source chart2/uiconfig cui/inc cui/source cui/uiconfig dbaccess/uiconfig desktop/uiconfig extensions/uiconfig extras/source filter/uiconfig include/sfx2 include/vcl sc/inc sc/source sc/uiconfig sd/source sd/uiconfig sfx2/source sfx2/uiconfig solenv/sanitizers starmath/uiconfig svx/uiconfig sw/inc sw/source sw/uiconfig uui/uiconfig vcl/source vcl/uiconfig vcl/unx xmlsecurity/uiconfig

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Mon Nov 19 11:09:53 UTC 2018


 basctl/source/basicide/baside2.cxx                             |    2 
 basctl/source/basicide/basides1.cxx                            |    2 
 basctl/source/basicide/basobj2.cxx                             |   27 
 basctl/source/basicide/bastype2.cxx                            |  684 ++++++++++
 basctl/source/basicide/bastype3.cxx                            |  387 +++++
 basctl/source/basicide/macrodlg.cxx                            |  540 +++----
 basctl/source/basicide/macrodlg.hxx                            |   68 
 basctl/source/basicide/moduldl2.cxx                            |  102 +
 basctl/source/basicide/moduldlg.cxx                            |   96 +
 basctl/source/basicide/moduldlg.hxx                            |    4 
 basctl/source/inc/basobj.hxx                                   |    9 
 basctl/source/inc/bastype2.hxx                                 |   90 +
 basctl/uiconfig/basicide/ui/basicmacrodialog.ui                |  149 +-
 basctl/uiconfig/basicide/ui/managebreakpoints.ui               |    3 
 basctl/uiconfig/basicide/ui/managelanguages.ui                 |    1 
 chart2/inc/chart.hrc                                           |   25 
 chart2/source/controller/dialogs/res_BarGeometry.cxx           |    4 
 chart2/uiconfig/ui/tp_ChartType.ui                             |   18 
 cui/inc/numcategories.hrc                                      |   32 
 cui/inc/twolines.hrc                                           |   44 
 cui/source/tabpages/chardlg.cxx                                |    6 
 cui/source/tabpages/chardlg.h                                  |    7 
 cui/source/tabpages/numfmt.cxx                                 |    4 
 cui/uiconfig/ui/acorexceptpage.ui                              |    2 
 cui/uiconfig/ui/charnamepage.ui                                |    6 
 cui/uiconfig/ui/galleryfilespage.ui                            |    1 
 cui/uiconfig/ui/hyperlinknewdocpage.ui                         |    1 
 cui/uiconfig/ui/insertoleobject.ui                             |    2 
 cui/uiconfig/ui/javaclasspathdialog.ui                         |    2 
 cui/uiconfig/ui/javastartparametersdialog.ui                   |    2 
 cui/uiconfig/ui/movemenu.ui                                    |    2 
 cui/uiconfig/ui/numberingformatpage.ui                         |   49 
 cui/uiconfig/ui/numberingoptionspage.ui                        |    2 
 cui/uiconfig/ui/numberingpositionpage.ui                       |    2 
 cui/uiconfig/ui/optchartcolorspage.ui                          |    1 
 cui/uiconfig/ui/paratabspage.ui                                |    2 
 cui/uiconfig/ui/pastespecial.ui                                |    2 
 cui/uiconfig/ui/personalization_tab.ui                         |    1 
 cui/uiconfig/ui/selectpathdialog.ui                            |    2 
 cui/uiconfig/ui/showcoldialog.ui                               |    2 
 cui/uiconfig/ui/spellingdialog.ui                              |    1 
 cui/uiconfig/ui/tsaurldialog.ui                                |    1 
 cui/uiconfig/ui/twolinespage.ui                                |   56 
 dbaccess/uiconfig/ui/applycolpage.ui                           |    2 
 dbaccess/uiconfig/ui/choosedatasourcedialog.ui                 |    1 
 dbaccess/uiconfig/ui/dbaseindexdialog.ui                       |    4 
 dbaccess/uiconfig/ui/parametersdialog.ui                       |    2 
 dbaccess/uiconfig/ui/sqlexception.ui                           |    2 
 desktop/uiconfig/ui/dependenciesdialog.ui                      |    1 
 extensions/uiconfig/sabpilot/ui/contentfieldpage.ui            |    1 
 extensions/uiconfig/sabpilot/ui/contenttablepage.ui            |    1 
 extensions/uiconfig/sabpilot/ui/gridfieldsselectionpage.ui     |    2 
 extensions/uiconfig/sabpilot/ui/groupradioselectionpage.ui     |    1 
 extensions/uiconfig/sabpilot/ui/optionvaluespage.ui            |    1 
 extensions/uiconfig/sabpilot/ui/selecttablepage.ui             |    1 
 extensions/uiconfig/sabpilot/ui/tableselectionpage.ui          |    2 
 extensions/uiconfig/sbibliography/ui/choosedatasourcedialog.ui |    1 
 extensions/uiconfig/spropctrlr/ui/listselectdialog.ui          |    2 
 extras/source/glade/libreoffice-catalog.xml.in                 |    5 
 filter/uiconfig/ui/warnpdfdialog.ui                            |    2 
 include/sfx2/strings.hrc                                       |    1 
 include/vcl/builder.hxx                                        |    2 
 include/vcl/weld.hxx                                           |   73 -
 sc/inc/subtotals.hrc                                           |   42 
 sc/source/ui/dbgui/tpsubt.cxx                                  |    4 
 sc/uiconfig/scalc/ui/autoformattable.ui                        |    1 
 sc/uiconfig/scalc/ui/consolidatedialog.ui                      |    1 
 sc/uiconfig/scalc/ui/externaldata.ui                           |    2 
 sc/uiconfig/scalc/ui/functionpanel.ui                          |    1 
 sc/uiconfig/scalc/ui/insertsheet.ui                            |    2 
 sc/uiconfig/scalc/ui/movecopysheet.ui                          |    2 
 sc/uiconfig/scalc/ui/namerangesdialog.ui                       |    1 
 sc/uiconfig/scalc/ui/optsortlists.ui                           |    1 
 sc/uiconfig/scalc/ui/selectrange.ui                            |    2 
 sc/uiconfig/scalc/ui/showdetaildialog.ui                       |    2 
 sc/uiconfig/scalc/ui/showsheetdialog.ui                        |    2 
 sc/uiconfig/scalc/ui/subtotalgrppage.ui                        |   38 
 sd/source/core/sdpage.cxx                                      |    2 
 sd/uiconfig/simpress/ui/customslideshows.ui                    |    2 
 sd/uiconfig/simpress/ui/definecustomslideshow.ui               |    4 
 sd/uiconfig/simpress/ui/interactionpage.ui                     |    1 
 sd/uiconfig/simpress/ui/photoalbum.ui                          |    2 
 sd/uiconfig/simpress/ui/publishingdialog.ui                    |    1 
 sfx2/source/appl/appserv.cxx                                   |   10 
 sfx2/source/doc/saveastemplatedlg.cxx                          |    1 
 sfx2/source/doc/templatedlg.cxx                                |    1 
 sfx2/uiconfig/ui/loadtemplatedialog.ui                         |    4 
 sfx2/uiconfig/ui/newstyle.ui                                   |    2 
 sfx2/uiconfig/ui/saveastemplatedlg.ui                          |    7 
 sfx2/uiconfig/ui/templatecategorydlg.ui                        |    7 
 solenv/sanitizers/ui/modules/BasicIDE.suppr                    |    1 
 starmath/uiconfig/smath/ui/fontdialog.ui                       |    2 
 svx/uiconfig/ui/classificationdialog.ui                        |    3 
 svx/uiconfig/ui/docrecoverybrokendialog.ui                     |    2 
 svx/uiconfig/ui/docrecoverysavedialog.ui                       |    1 
 svx/uiconfig/ui/floatingundoredo.ui                            |    1 
 sw/inc/flddinf.hrc                                             |   35 
 sw/inc/fldref.hrc                                              |   36 
 sw/inc/outline.hrc                                             |   40 
 sw/source/ui/fldui/flddinf.cxx                                 |    8 
 sw/source/ui/fldui/flddinf.hxx                                 |    2 
 sw/source/ui/fldui/fldfunc.cxx                                 |    3 
 sw/source/ui/fldui/fldref.cxx                                  |    6 
 sw/source/ui/fldui/fldvar.cxx                                  |    3 
 sw/source/ui/misc/outline.cxx                                  |    4 
 sw/uiconfig/swriter/ui/autoformattable.ui                      |    2 
 sw/uiconfig/swriter/ui/conditionpage.ui                        |    1 
 sw/uiconfig/swriter/ui/customizeaddrlistdialog.ui              |    2 
 sw/uiconfig/swriter/ui/dropdownfielddialog.ui                  |    2 
 sw/uiconfig/swriter/ui/flddbpage.ui                            |    1 
 sw/uiconfig/swriter/ui/flddocinfopage.ui                       |   17 
 sw/uiconfig/swriter/ui/flddocumentpage.ui                      |    3 
 sw/uiconfig/swriter/ui/fldfuncpage.ui                          |   20 
 sw/uiconfig/swriter/ui/fldrefpage.ui                           |   22 
 sw/uiconfig/swriter/ui/fldvarpage.ui                           |   18 
 sw/uiconfig/swriter/ui/insertautotextdialog.ui                 |    1 
 sw/uiconfig/swriter/ui/insertdbcolumnsdialog.ui                |    3 
 sw/uiconfig/swriter/ui/inserttable.ui                          |    2 
 sw/uiconfig/swriter/ui/numberingnamedialog.ui                  |   31 
 sw/uiconfig/swriter/ui/outlinenumberingpage.ui                 |    2 
 sw/uiconfig/swriter/ui/outlinepositionpage.ui                  |    2 
 sw/uiconfig/swriter/ui/selectautotextdialog.ui                 |    2 
 sw/uiconfig/swriter/ui/selectindexdialog.ui                    |    2 
 sw/uiconfig/swriter/ui/sidebarstylepresets.ui                  |    1 
 sw/uiconfig/swriter/ui/sidebartheme.ui                         |    1 
 sw/uiconfig/swriter/ui/tocstylespage.ui                        |    4 
 uui/uiconfig/ui/filterselect.ui                                |    2 
 vcl/source/app/salvtables.cxx                                  |  227 +++
 vcl/source/treelist/treelistbox.cxx                            |   16 
 vcl/source/window/builder.cxx                                  |   15 
 vcl/uiconfig/ui/printdialog.ui                                 |    1 
 vcl/uiconfig/ui/printerdevicepage.ui                           |    4 
 vcl/unx/gtk3/gtk3gtkinst.cxx                                   |  389 +++++
 xmlsecurity/uiconfig/ui/securitytrustpage.ui                   |    1 
 134 files changed, 2904 insertions(+), 732 deletions(-)

New commits:
commit 97bbffc917deba872090667e9dc096ecec99d557
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Mon Nov 5 21:01:23 2018 +0000
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Mon Nov 19 12:09:25 2018 +0100

    weld TreeView
    
    a) use GtkTreeStores for GtkTreeViews
    b) ironically can't store GtkTreeStore contents in .ui apparently
    c) set show_expanders for all non-trees and unconverted cases
    d) on-demand subtrees
    
    Change-Id: I3c1036a222daba2c129b1a22ffeb3fe35005ae31
    Reviewed-on: https://gerrit.libreoffice.org/63336
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/basctl/source/basicide/baside2.cxx b/basctl/source/basicide/baside2.cxx
index 1725324bff3b..81efba1d5b3d 100644
--- a/basctl/source/basicide/baside2.cxx
+++ b/basctl/source/basicide/baside2.cxx
@@ -339,7 +339,7 @@ void ModulWindow::BasicExecute()
             if ( !pMethod )
             {
                 // If not in a method then prompt the user
-                ChooseMacro( uno::Reference< frame::XModel >() );
+                ChooseMacro(GetFrameWeld(), uno::Reference<frame::XModel>());
                 return;
             }
             pMethod->SetDebugFlags(m_aStatus.nBasicFlags);
diff --git a/basctl/source/basicide/basides1.cxx b/basctl/source/basicide/basides1.cxx
index 0d7ff9cb2a00..2bb3aacd395a 100644
--- a/basctl/source/basicide/basides1.cxx
+++ b/basctl/source/basicide/basides1.cxx
@@ -331,7 +331,7 @@ void Shell::ExecuteGlobal( SfxRequest& rReq )
         break;
         case SID_BASICIDE_CHOOSEMACRO:
         {
-            ChooseMacro( nullptr );
+            ChooseMacro(rReq.GetFrameWeld(), nullptr);
         }
         break;
         case SID_BASICIDE_CREATEMACRO:
diff --git a/basctl/source/basicide/basobj2.cxx b/basctl/source/basicide/basobj2.cxx
index be25e26b41a0..c127446433a2 100644
--- a/basctl/source/basicide/basobj2.cxx
+++ b/basctl/source/basicide/basobj2.cxx
@@ -45,11 +45,11 @@ using namespace ::com::sun::star::uno;
 using namespace ::com::sun::star::container;
 
 extern "C" {
-    SAL_DLLPUBLIC_EXPORT rtl_uString* basicide_choose_macro( void* pOnlyInDocument_AsXModel, void* pDocFrame_AsXFrame, sal_Bool bChooseOnly )
+    SAL_DLLPUBLIC_EXPORT rtl_uString* basicide_choose_macro(void* pParent, void* pOnlyInDocument_AsXModel, void* pDocFrame_AsXFrame, sal_Bool bChooseOnly )
     {
         Reference< frame::XModel > aDocument( static_cast< frame::XModel* >( pOnlyInDocument_AsXModel ) );
         Reference< frame::XFrame > aDocFrame( static_cast< frame::XFrame* >( pDocFrame_AsXFrame ) );
-        OUString aScriptURL = basctl::ChooseMacro( aDocument, aDocFrame, bChooseOnly );
+        OUString aScriptURL = basctl::ChooseMacro(static_cast<weld::Window*>(pParent), aDocument, aDocFrame, bChooseOnly);
         rtl_uString* pScriptURL = aScriptURL.pData;
         rtl_uString_acquire( pScriptURL );
 
@@ -235,9 +235,10 @@ namespace
     }
 }
 
-OUString ChooseMacro( const uno::Reference< frame::XModel >& rxLimitToDocument,
-                      const uno::Reference< frame::XFrame >& xDocFrame,
-                      bool bChooseOnly )
+OUString ChooseMacro(weld::Window* pParent,
+                     const uno::Reference< frame::XModel >& rxLimitToDocument,
+                     const uno::Reference< frame::XFrame >& xDocFrame,
+                     bool bChooseOnly)
 {
     EnsureIde();
 
@@ -246,15 +247,17 @@ OUString ChooseMacro( const uno::Reference< frame::XModel >& rxLimitToDocument,
     OUString aScriptURL;
     SbMethod* pMethod = nullptr;
 
-    ScopedVclPtrInstance< MacroChooser > pChooser( nullptr, xDocFrame, true );
+    MacroChooser aChooser(pParent, xDocFrame, true);
     if ( bChooseOnly || !SvtModuleOptions::IsBasicIDE() )
-        pChooser->SetMode(MacroChooser::ChooseOnly);
+        aChooser.SetMode(MacroChooser::ChooseOnly);
 
     if ( !bChooseOnly && rxLimitToDocument.is() )
+    {
         // Hack!
-        pChooser->SetMode(MacroChooser::Recording);
+        aChooser.SetMode(MacroChooser::Recording);
+    }
 
-    short nRetValue = pChooser->Execute();
+    short nRetValue = aChooser.run();
 
     GetExtraData()->ChoosingMacro() = false;
 
@@ -264,9 +267,9 @@ OUString ChooseMacro( const uno::Reference< frame::XModel >& rxLimitToDocument,
         {
             bool bError = false;
 
-            pMethod = pChooser->GetMacro();
-            if ( !pMethod && pChooser->GetMode() == MacroChooser::Recording )
-                pMethod = pChooser->CreateMacro();
+            pMethod = aChooser.GetMacro();
+            if ( !pMethod && aChooser.GetMode() == MacroChooser::Recording )
+                pMethod = aChooser.CreateMacro();
 
             if ( !pMethod )
                 break;
diff --git a/basctl/source/basicide/bastype2.cxx b/basctl/source/basicide/bastype2.cxx
index 8066cf2f8814..b143924fe149 100644
--- a/basctl/source/basicide/bastype2.cxx
+++ b/basctl/source/basicide/bastype2.cxx
@@ -895,6 +895,690 @@ bool TreeListBox::OpenCurrent()
     return false;
 }
 
+SbTreeListBox::SbTreeListBox(std::unique_ptr<weld::TreeView> xControl, weld::Window* pTopLevel)
+    : m_xControl(std::move(xControl))
+    , m_xIter(m_xControl->make_iterator())
+    , m_pTopLevel(pTopLevel)
+    , m_aNotifier(*this)
+{
+    m_xControl->connect_row_activated(LINK(this, SbTreeListBox, OpenCurrentHdl));
+    m_xControl->connect_expanding(LINK(this, SbTreeListBox, RequestingChildrenHdl));
+    nMode = BrowseMode::All;   // everything
+}
+
+SbTreeListBox::~SbTreeListBox()
+{
+    m_aNotifier.dispose();
+
+    bool bValidIter = m_xControl->get_iter_first(*m_xIter);
+    while (bValidIter)
+    {
+        Entry* pBasicEntry = reinterpret_cast<Entry*>(m_xControl->get_id(*m_xIter).toInt64());
+        delete pBasicEntry;
+        bValidIter = m_xControl->iter_next(*m_xIter);
+    }
+}
+
+void SbTreeListBox::ScanEntry( const ScriptDocument& rDocument, LibraryLocation eLocation )
+{
+    OSL_ENSURE( rDocument.isAlive(), "TreeListBox::ScanEntry: illegal document!" );
+    if ( !rDocument.isAlive() )
+        return;
+
+    // can be called multiple times for updating!
+
+    // actually test if basic's in the tree already?!
+    m_xControl->freeze();
+    // level 1: BasicManager (application, document, ...)
+    bool bDocumentRootEntry = FindRootEntry(rDocument, eLocation, *m_xIter);
+    if (bDocumentRootEntry && m_xControl->get_row_expanded(*m_xIter))
+        ImpCreateLibEntries(*m_xIter, rDocument, eLocation);
+    if (!bDocumentRootEntry)
+    {
+        OUString aRootName(GetRootEntryName(rDocument, eLocation));
+        OUString aImage(GetRootEntryBitmaps(rDocument));
+        AddEntry(aRootName, aImage, nullptr, true, o3tl::make_unique<DocumentEntry>(rDocument, eLocation));
+    }
+    m_xControl->thaw();
+}
+
+void SbTreeListBox::ImpCreateLibEntries(weld::TreeIter& rIter, const ScriptDocument& rDocument, LibraryLocation eLocation)
+{
+    // get a sorted list of library names
+    Sequence< OUString > aLibNames( rDocument.getLibraryNames() );
+    sal_Int32 nLibCount = aLibNames.getLength();
+    const OUString* pLibNames = aLibNames.getConstArray();
+
+    for ( sal_Int32 i = 0 ; i < nLibCount ; i++ )
+    {
+        OUString aLibName = pLibNames[ i ];
+
+        if ( eLocation == rDocument.getLibraryLocation( aLibName ) )
+        {
+            // check, if the module library is loaded
+            bool bModLibLoaded = false;
+            Reference< script::XLibraryContainer > xModLibContainer( rDocument.getLibraryContainer( E_SCRIPTS ) );
+            if ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) && xModLibContainer->isLibraryLoaded( aLibName ) )
+                bModLibLoaded = true;
+
+            // check, if the dialog library is loaded
+            bool bDlgLibLoaded = false;
+            Reference< script::XLibraryContainer > xDlgLibContainer( rDocument.getLibraryContainer( E_DIALOGS ) );
+            if ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aLibName ) && xDlgLibContainer->isLibraryLoaded( aLibName ) )
+                bDlgLibLoaded = true;
+
+            bool bLoaded = bModLibLoaded || bDlgLibLoaded;
+
+            // if only one of the libraries is loaded, load also the other
+            if ( bLoaded )
+            {
+                if ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) && !xModLibContainer->isLibraryLoaded( aLibName ) )
+                    xModLibContainer->loadLibrary( aLibName );
+
+                if ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aLibName ) && !xDlgLibContainer->isLibraryLoaded( aLibName ) )
+                    xDlgLibContainer->loadLibrary( aLibName );
+            }
+
+            // create tree list box entry
+            OUString sId;
+            if ( ( nMode & BrowseMode::Dialogs ) && !( nMode & BrowseMode::Modules ) )
+                sId = bLoaded ? OUStringLiteral(RID_BMP_DLGLIB) : OUStringLiteral(RID_BMP_DLGLIBNOTLOADED);
+            else
+                sId = bLoaded ? OUStringLiteral(RID_BMP_MODLIB) : OUStringLiteral(RID_BMP_MODLIBNOTLOADED);
+            std::unique_ptr<weld::TreeIter> xLibRootEntry(m_xControl->make_iterator(&rIter));
+            bool bLibRootEntry = FindEntry(aLibName, OBJ_TYPE_LIBRARY, *xLibRootEntry);
+            if (bLibRootEntry)
+            {
+                SetEntryBitmaps(*xLibRootEntry, sId);
+                if (m_xControl->get_row_expanded(*xLibRootEntry))
+                    ImpCreateLibSubEntries(*xLibRootEntry, rDocument, aLibName);
+            }
+            else
+            {
+                AddEntry(aLibName, sId, &rIter, true, o3tl::make_unique<Entry>(OBJ_TYPE_LIBRARY));
+            }
+        }
+    }
+}
+
+void SbTreeListBox::ImpCreateLibSubEntries(weld::TreeIter& rLibRootEntry, const ScriptDocument& rDocument, const OUString& rLibName)
+{
+    // modules
+    if ( nMode & BrowseMode::Modules )
+    {
+        Reference< script::XLibraryContainer > xModLibContainer( rDocument.getLibraryContainer( E_SCRIPTS ) );
+
+        if ( xModLibContainer.is() && xModLibContainer->hasByName( rLibName ) && xModLibContainer->isLibraryLoaded( rLibName ) )
+        {
+            try
+            {
+                if( rDocument.isInVBAMode() )
+                {
+                    ImpCreateLibSubEntriesInVBAMode(rLibRootEntry, rDocument, rLibName);
+                }
+                else
+                {
+                    // get a sorted list of module names
+                    Sequence< OUString > aModNames = rDocument.getObjectNames( E_SCRIPTS, rLibName );
+                    sal_Int32 nModCount = aModNames.getLength();
+                    const OUString* pModNames = aModNames.getConstArray();
+
+                    auto xTreeIter = m_xControl->make_iterator();
+
+                    for ( sal_Int32 i = 0 ; i < nModCount ; i++ )
+                    {
+                        OUString aModName = pModNames[ i ];
+                        m_xControl->copy_iterator(rLibRootEntry, *xTreeIter);
+                        bool bModuleEntry = FindEntry(aModName, OBJ_TYPE_MODULE, *xTreeIter);
+                        if (!bModuleEntry)
+                        {
+                            AddEntry(aModName, RID_BMP_MODULE, &rLibRootEntry, false, o3tl::make_unique<Entry>(OBJ_TYPE_MODULE));
+                        }
+
+                        // methods
+                        if ( nMode & BrowseMode::Subs )
+                        {
+                            Sequence< OUString > aNames = GetMethodNames( rDocument, rLibName, aModName );
+                            sal_Int32 nCount = aNames.getLength();
+                            const OUString* pNames = aNames.getConstArray();
+
+                            auto xSubTreeIter = m_xControl->make_iterator();
+
+                            for ( sal_Int32 j = 0 ; j < nCount ; j++ )
+                            {
+                                OUString aName = pNames[ j ];
+                                m_xControl->copy_iterator(*xTreeIter, *xSubTreeIter);
+                                bool bEntry = FindEntry(aName, OBJ_TYPE_METHOD, *xSubTreeIter);
+                                if (!bEntry)
+                                {
+                                    AddEntry(aName, RID_BMP_MACRO, xTreeIter.get(), false, o3tl::make_unique<Entry>(OBJ_TYPE_METHOD));
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            catch ( const container::NoSuchElementException& )
+            {
+                DBG_UNHANDLED_EXCEPTION("basctl.basicide");
+            }
+        }
+    }
+
+    // dialogs
+    if ( nMode & BrowseMode::Dialogs )
+    {
+         Reference< script::XLibraryContainer > xDlgLibContainer( rDocument.getLibraryContainer( E_DIALOGS ) );
+
+         if ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( rLibName ) && xDlgLibContainer->isLibraryLoaded( rLibName ) )
+         {
+            try
+            {
+                // get a sorted list of dialog names
+                Sequence< OUString > aDlgNames( rDocument.getObjectNames( E_DIALOGS, rLibName ) );
+                sal_Int32 nDlgCount = aDlgNames.getLength();
+                const OUString* pDlgNames = aDlgNames.getConstArray();
+
+                auto xTreeIter = m_xControl->make_iterator();
+
+                for ( sal_Int32 i = 0 ; i < nDlgCount ; i++ )
+                {
+                    OUString aDlgName = pDlgNames[ i ];
+                    m_xControl->copy_iterator(rLibRootEntry, *xTreeIter);
+                    bool bDialogEntry = FindEntry(aDlgName, OBJ_TYPE_DIALOG, *xTreeIter);
+                    if (!bDialogEntry)
+                    {
+                        AddEntry(aDlgName, RID_BMP_DIALOG, &rLibRootEntry, false, o3tl::make_unique<Entry>(OBJ_TYPE_DIALOG));
+                    }
+                }
+            }
+            catch (const container::NoSuchElementException& )
+            {
+                DBG_UNHANDLED_EXCEPTION("basctl.basicide");
+            }
+        }
+    }
+}
+
+void SbTreeListBox::ImpCreateLibSubEntriesInVBAMode(weld::TreeIter& rLibRootEntry, const ScriptDocument& rDocument, const OUString& rLibName )
+{
+    auto const aEntries = {
+        std::make_pair( OBJ_TYPE_DOCUMENT_OBJECTS, IDEResId(RID_STR_DOCUMENT_OBJECTS) ),
+        std::make_pair( OBJ_TYPE_USERFORMS, IDEResId(RID_STR_USERFORMS) ),
+        std::make_pair( OBJ_TYPE_NORMAL_MODULES, IDEResId(RID_STR_NORMAL_MODULES) ),
+        std::make_pair( OBJ_TYPE_CLASS_MODULES, IDEResId(RID_STR_CLASS_MODULES) ) };
+    for( auto const & iter: aEntries )
+    {
+        EntryType eType = iter.first;
+        OUString const & aEntryName = iter.second;
+        std::unique_ptr<weld::TreeIter> xLibSubRootEntry(m_xControl->make_iterator(&rLibRootEntry));
+        bool bLibSubRootEntry = FindEntry(aEntryName, eType, *xLibSubRootEntry);
+        if (bLibSubRootEntry)
+        {
+            SetEntryBitmaps(*xLibSubRootEntry, RID_BMP_MODLIB);
+            if (m_xControl->get_row_expanded(*xLibSubRootEntry))
+                ImpCreateLibSubSubEntriesInVBAMode(*xLibSubRootEntry, rDocument, rLibName);
+        }
+        else
+        {
+            m_xControl->copy_iterator(rLibRootEntry, *xLibSubRootEntry);
+            AddEntry(aEntryName, RID_BMP_MODLIB, xLibSubRootEntry.get(), true, o3tl::make_unique<Entry>(eType));
+        }
+    }
+}
+
+void SbTreeListBox::ImpCreateLibSubSubEntriesInVBAMode(weld::TreeIter& rLibSubRootEntry, const ScriptDocument& rDocument, const OUString& rLibName)
+{
+    uno::Reference< container::XNameContainer > xLib = rDocument.getOrCreateLibrary( E_SCRIPTS, rLibName );
+    if( !xLib.is() )
+        return;
+
+    try
+    {
+        // get a sorted list of module names
+        Sequence< OUString > aModNames = rDocument.getObjectNames( E_SCRIPTS, rLibName );
+        sal_Int32 nModCount = aModNames.getLength();
+        const OUString* pModNames = aModNames.getConstArray();
+
+        EntryDescriptor aDesc(GetEntryDescriptor(&rLibSubRootEntry));
+        EntryType eCurrentType(aDesc.GetType());
+
+        for ( sal_Int32 i = 0 ; i < nModCount ; i++ )
+        {
+            OUString aModName = pModNames[ i ];
+            EntryType eType = OBJ_TYPE_UNKNOWN;
+            switch( ModuleInfoHelper::getModuleType( xLib, aModName ) )
+            {
+                case script::ModuleType::DOCUMENT:
+                    eType = OBJ_TYPE_DOCUMENT_OBJECTS;
+                    break;
+                case script::ModuleType::FORM:
+                    eType = OBJ_TYPE_USERFORMS;
+                    break;
+                case script::ModuleType::NORMAL:
+                    eType = OBJ_TYPE_NORMAL_MODULES;
+                    break;
+                case script::ModuleType::CLASS:
+                    eType = OBJ_TYPE_CLASS_MODULES;
+                    break;
+            }
+            if( eType != eCurrentType )
+                continue;
+
+            // display a nice friendly name in the ObjectModule tab,
+               // combining the objectname and module name, e.g. Sheet1 ( Financials )
+            OUString aEntryName = aModName;
+            if( eType == OBJ_TYPE_DOCUMENT_OBJECTS )
+            {
+                OUString sObjName;
+                ModuleInfoHelper::getObjectName( xLib, aModName, sObjName );
+                if( !sObjName.isEmpty() )
+                {
+                    aEntryName += " (" + sObjName + ")";
+                }
+            }
+            std::unique_ptr<weld::TreeIter> xModuleEntry(m_xControl->make_iterator(&rLibSubRootEntry));
+            bool bModuleEntry = FindEntry(aEntryName, OBJ_TYPE_MODULE, *xModuleEntry);
+            if (!bModuleEntry)
+            {
+                m_xControl->copy_iterator(rLibSubRootEntry, *xModuleEntry);
+                AddEntry(aEntryName, RID_BMP_MODULE, xModuleEntry.get(), false,
+                         o3tl::make_unique<Entry>(OBJ_TYPE_MODULE));
+            }
+
+            // methods
+            if ( nMode & BrowseMode::Subs )
+            {
+                Sequence< OUString > aNames = GetMethodNames( rDocument, rLibName, aModName );
+                sal_Int32 nCount = aNames.getLength();
+                const OUString* pNames = aNames.getConstArray();
+
+                for ( sal_Int32 j = 0 ; j < nCount ; j++ )
+                {
+                    OUString aName = pNames[ j ];
+                    std::unique_ptr<weld::TreeIter> xEntry(m_xControl->make_iterator(xModuleEntry.get()));
+                    bool bEntry = FindEntry(aName, OBJ_TYPE_METHOD, *xEntry);
+                    if (!bEntry)
+                    {
+                        AddEntry(aName, RID_BMP_MACRO, xModuleEntry.get(), false, o3tl::make_unique<Entry>(OBJ_TYPE_METHOD));
+                    }
+                }
+            }
+        }
+    }
+    catch ( const container::NoSuchElementException& )
+    {
+        DBG_UNHANDLED_EXCEPTION("basctl.basicide");
+    }
+}
+
+bool SbTreeListBox::ImpFindEntry(weld::TreeIter& rIter, const OUString& rText)
+{
+    bool bValidIter = m_xControl->iter_children(rIter);
+    while (bValidIter)
+    {
+        if (rText == m_xControl->get_text(rIter))
+            return true;
+        bValidIter = m_xControl->iter_next_sibling(rIter);
+    }
+    return false;
+}
+
+void SbTreeListBox::onDocumentCreated( const ScriptDocument& /*_rDocument*/ )
+{
+    UpdateEntries();
+}
+
+void SbTreeListBox::onDocumentOpened( const ScriptDocument& /*_rDocument*/ )
+{
+    UpdateEntries();
+}
+
+void SbTreeListBox::onDocumentSave( const ScriptDocument& /*_rDocument*/ )
+{
+    // not interested in
+}
+
+void SbTreeListBox::onDocumentSaveDone( const ScriptDocument& /*_rDocument*/ )
+{
+    // not interested in
+}
+
+void SbTreeListBox::onDocumentSaveAs( const ScriptDocument& /*_rDocument*/ )
+{
+    // not interested in
+}
+
+void SbTreeListBox::onDocumentSaveAsDone( const ScriptDocument& /*_rDocument*/ )
+{
+    UpdateEntries();
+}
+
+void SbTreeListBox::onDocumentClosed( const ScriptDocument& rDocument )
+{
+    UpdateEntries();
+    // The document is not yet actually deleted, so we need to remove its entry
+    // manually.
+    RemoveEntry(rDocument);
+}
+
+void SbTreeListBox::onDocumentTitleChanged( const ScriptDocument& /*_rDocument*/ )
+{
+    // not interested in
+}
+
+void SbTreeListBox::onDocumentModeChanged( const ScriptDocument& /*_rDocument*/ )
+{
+    // not interested in
+}
+
+void SbTreeListBox::UpdateEntries()
+{
+    bool bValidIter = m_xControl->get_selected(m_xIter.get());
+    EntryDescriptor aCurDesc(GetEntryDescriptor(bValidIter ? m_xIter.get() : nullptr));
+
+    // removing the invalid entries
+    std::unique_ptr<weld::TreeIter> xLastValid(m_xControl->make_iterator(nullptr));
+    bool bLastValid = false;
+    bValidIter = m_xControl->get_iter_first(*m_xIter);
+    while (bValidIter)
+    {
+        if (IsValidEntry(*m_xIter))
+        {
+            m_xControl->copy_iterator(*m_xIter, *xLastValid);
+            bLastValid = true;
+        }
+        else
+            RemoveEntry(*m_xIter);
+        if (bLastValid)
+        {
+            m_xControl->copy_iterator(*xLastValid, *m_xIter);
+            bValidIter = m_xControl->iter_next(*m_xIter);
+        }
+        else
+            bValidIter = m_xControl->get_iter_first(*m_xIter);
+    }
+
+    ScanAllEntries();
+
+    SetCurrentEntry( aCurDesc );
+}
+
+// Removes the entry from the tree.
+void SbTreeListBox::RemoveEntry(const weld::TreeIter& rIter)
+{
+    // removing the associated user data
+    Entry* pBasicEntry = reinterpret_cast<Entry*>(m_xControl->get_id(rIter).toInt64());
+    delete pBasicEntry;
+    // removing the entry
+    m_xControl->remove(rIter);
+}
+
+// Removes the entry of rDocument.
+void SbTreeListBox::RemoveEntry (ScriptDocument const& rDocument)
+{
+    // finding the entry of rDocument
+    bool bValidIter = m_xControl->get_iter_first(*m_xIter);
+    while (bValidIter)
+    {
+        if (rDocument == GetEntryDescriptor(m_xIter.get()).GetDocument())
+        {
+            RemoveEntry(*m_xIter);
+            break;
+        }
+        bValidIter = m_xControl->iter_next(*m_xIter);
+    }
+}
+
+bool SbTreeListBox::FindEntry(const OUString& rText, EntryType eType, weld::TreeIter& rIter)
+{
+    bool bValidIter = m_xControl->iter_children(rIter);
+    while (bValidIter)
+    {
+        Entry* pBasicEntry = reinterpret_cast<Entry*>(m_xControl->get_id(rIter).toInt64());
+        assert(pBasicEntry && "FindEntry: no Entry ?!");
+        if (pBasicEntry->GetType() == eType && rText == m_xControl->get_text(rIter))
+            return true;
+        bValidIter = m_xControl->iter_next_sibling(rIter);
+    }
+    return false;
+}
+
+bool SbTreeListBox::IsEntryProtected(weld::TreeIter* pEntry)
+{
+    bool bProtected = false;
+    if (pEntry && m_xControl->get_iter_depth(*pEntry) == 1)
+    {
+        EntryDescriptor aDesc(GetEntryDescriptor(pEntry));
+        const ScriptDocument& rDocument( aDesc.GetDocument() );
+        OSL_ENSURE( rDocument.isAlive(), "TreeListBox::IsEntryProtected: no document, or document is dead!" );
+        if ( rDocument.isAlive() )
+        {
+            const OUString& aOULibName( aDesc.GetLibName() );
+            Reference< script::XLibraryContainer > xModLibContainer( rDocument.getLibraryContainer( E_SCRIPTS ) );
+            if ( xModLibContainer.is() && xModLibContainer->hasByName( aOULibName ) )
+            {
+                Reference< script::XLibraryContainerPassword > xPasswd( xModLibContainer, UNO_QUERY );
+                if ( xPasswd.is() && xPasswd->isLibraryPasswordProtected( aOULibName ) && !xPasswd->isLibraryPasswordVerified( aOULibName ) )
+                {
+                    bProtected = true;
+                }
+            }
+        }
+    }
+    return bProtected;
+}
+
+void SbTreeListBox::AddEntry(
+    const OUString& rText,
+    const OUString& rImage,
+    weld::TreeIter* pParent,
+    bool bChildrenOnDemand,
+    std::unique_ptr<Entry>&& rUserData)
+{
+    OUString sId(OUString::number(reinterpret_cast<sal_uInt64>(rUserData.release())));
+    m_xControl->insert(pParent, -1, rText, &sId, nullptr, nullptr, &rImage, bChildrenOnDemand);
+}
+
+void SbTreeListBox::SetEntryBitmaps(weld::TreeIter& rIter, const OUString& rImage)
+{
+    m_xControl->set_expander_image(rIter, rImage);
+}
+
+LibraryType SbTreeListBox::GetLibraryType() const
+{
+    LibraryType eType = LibraryType::All;
+    if ( ( nMode & BrowseMode::Modules ) && !( nMode & BrowseMode::Dialogs ) )
+        eType = LibraryType::Module;
+    else if ( !( nMode & BrowseMode::Modules ) && ( nMode & BrowseMode::Dialogs ) )
+        eType = LibraryType::Dialog;
+    return eType;
+}
+
+OUString SbTreeListBox::GetRootEntryName( const ScriptDocument& rDocument, LibraryLocation eLocation ) const
+{
+    return rDocument.getTitle( eLocation, GetLibraryType() );
+}
+
+OUString SbTreeListBox::GetRootEntryBitmaps(const ScriptDocument& rDocument)
+{
+    OSL_ENSURE( rDocument.isValid(), "TreeListBox::GetRootEntryBitmaps: illegal document!" );
+    if (!rDocument.isValid())
+        return OUString();
+
+    if ( rDocument.isDocument() )
+    {
+        OUString sFactoryURL;
+        Reference<uno::XComponentContext> xContext( ::comphelper::getProcessComponentContext() );
+        Reference< frame::XModuleManager2 > xModuleManager( frame::ModuleManager::create(xContext) );
+        try
+        {
+            OUString sModule( xModuleManager->identify( rDocument.getDocument() ) );
+            Reference< container::XNameAccess > xModuleConfig( xModuleManager, UNO_QUERY );
+            if ( xModuleConfig.is() )
+            {
+                Sequence< beans::PropertyValue > aModuleDescr;
+                xModuleConfig->getByName( sModule ) >>= aModuleDescr;
+                sal_Int32 nCount = aModuleDescr.getLength();
+                const beans::PropertyValue* pModuleDescr = aModuleDescr.getConstArray();
+                for ( sal_Int32 i = 0; i < nCount; ++i )
+                {
+                    if ( pModuleDescr[ i ].Name == "ooSetupFactoryEmptyDocumentURL" )
+                    {
+                        pModuleDescr[ i ].Value >>= sFactoryURL;
+                        break;
+                    }
+                }
+            }
+        }
+        catch( const Exception& )
+        {
+            DBG_UNHANDLED_EXCEPTION("basctl.basicide");
+        }
+
+        if ( !sFactoryURL.isEmpty() )
+        {
+            return SvFileInformationManager::GetFileImageId(INetURLObject(sFactoryURL));
+        }
+        else
+        {
+            // default icon
+            return OUString(RID_BMP_DOCUMENT);
+        }
+    }
+    return OUString(RID_BMP_INSTALLATION);
+}
+
+void SbTreeListBox::SetCurrentEntry (EntryDescriptor const & rDesc)
+{
+    bool bCurEntry = false;
+    auto xCurIter = m_xControl->make_iterator();
+    EntryDescriptor aDesc = rDesc;
+    if ( aDesc.GetType() == OBJ_TYPE_UNKNOWN )
+    {
+        aDesc = EntryDescriptor(
+            ScriptDocument::getApplicationScriptDocument(),
+            LIBRARY_LOCATION_USER, "Standard",
+            OUString(), ".", OBJ_TYPE_UNKNOWN
+        );
+    }
+    ScriptDocument aDocument = aDesc.GetDocument();
+    OSL_ENSURE( aDocument.isValid(), "TreeListBox::SetCurrentEntry: invalid document!" );
+    LibraryLocation eLocation = aDesc.GetLocation();
+    bool bRootEntry = FindRootEntry(aDocument, eLocation, *m_xIter);
+    if (bRootEntry)
+    {
+        m_xControl->copy_iterator(*m_xIter, *xCurIter);
+        bCurEntry = true;
+        const OUString& aLibName( aDesc.GetLibName() );
+        if ( !aLibName.isEmpty() )
+        {
+            m_xControl->expand_row(*m_xIter);
+            auto xLibIter = m_xControl->make_iterator(m_xIter.get());
+            bool bLibEntry = FindEntry(aLibName, OBJ_TYPE_LIBRARY, *xLibIter);
+            if (bLibEntry)
+            {
+                m_xControl->copy_iterator(*xLibIter, *xCurIter);
+                const OUString& aLibSubName( aDesc.GetLibSubName() );
+                if( !aLibSubName.isEmpty() )
+                {
+                    m_xControl->expand_row(*xLibIter);
+                    auto xSubLibIter = m_xControl->make_iterator(xLibIter.get());
+                    bool bSubLibEntry = ImpFindEntry(*xSubLibIter, aLibSubName);
+                    if (bSubLibEntry)
+                    {
+                        m_xControl->copy_iterator(*xSubLibIter, *xCurIter);
+                    }
+                }
+                const OUString& aName( aDesc.GetName() );
+                if ( !aName.isEmpty() )
+                {
+                    m_xControl->expand_row(*xCurIter);
+                    EntryType eType = OBJ_TYPE_MODULE;
+                    if ( aDesc.GetType() == OBJ_TYPE_DIALOG )
+                        eType = OBJ_TYPE_DIALOG;
+                    auto xEntryIter = m_xControl->make_iterator(xCurIter.get());
+                    bool bEntry = FindEntry(aName, eType, *xEntryIter);
+                    if (bEntry)
+                    {
+                        m_xControl->copy_iterator(*xEntryIter, *xCurIter);
+                        const OUString& aMethodName( aDesc.GetMethodName() );
+                        if (!aMethodName.isEmpty())
+                        {
+                            m_xControl->expand_row(*xCurIter);
+                            auto xSubEntryIter = m_xControl->make_iterator(xCurIter.get());
+                            bool bSubEntry = FindEntry(aMethodName, OBJ_TYPE_METHOD, *xSubEntryIter);
+                            if (bSubEntry)
+                            {
+                                m_xControl->copy_iterator(*xSubEntryIter, *xCurIter);
+                            }
+                            else
+                            {
+                                m_xControl->copy_iterator(*xCurIter, *xSubEntryIter);
+                                if (m_xControl->iter_children(*xSubEntryIter))
+                                    m_xControl->copy_iterator(*xSubEntryIter, *xCurIter);
+                            }
+                        }
+                    }
+                    else
+                    {
+                        auto xSubEntryIter = m_xControl->make_iterator(xCurIter.get());
+                        if (m_xControl->iter_children(*xSubEntryIter))
+                            m_xControl->copy_iterator(*xSubEntryIter, *xCurIter);
+                    }
+                }
+            }
+            else
+            {
+                auto xSubLibIter = m_xControl->make_iterator(m_xIter.get());
+                if (m_xControl->iter_children(*xSubLibIter))
+                    m_xControl->copy_iterator(*xLibIter, *xCurIter);
+            }
+        }
+    }
+    else
+    {
+        bCurEntry = m_xControl->get_iter_first(*xCurIter);
+    }
+
+    if (!bCurEntry)
+        return;
+
+    m_xControl->set_cursor(*xCurIter);
+}
+
+IMPL_LINK_NOARG(SbTreeListBox, OpenCurrentHdl, weld::TreeView&, void)
+{
+    bool bValidIter = m_xControl->get_cursor(m_xIter.get());
+    if (!bValidIter)
+        return;
+    EntryDescriptor aDesc = GetEntryDescriptor(m_xIter.get());
+    switch (aDesc.GetType())
+    {
+        case OBJ_TYPE_METHOD:
+        case OBJ_TYPE_MODULE:
+        case OBJ_TYPE_DIALOG:
+            if (SfxDispatcher* pDispatcher = GetDispatcher())
+            {
+                SbxItem aSbxItem(
+                    SID_BASICIDE_ARG_SBX, aDesc.GetDocument(),
+                    aDesc.GetLibName(), aDesc.GetName(), aDesc.GetMethodName(),
+                    ConvertType(aDesc.GetType())
+                );
+                pDispatcher->ExecuteList(
+                    SID_BASICIDE_SHOWSBX, SfxCallMode::SYNCHRON,
+                    { &aSbxItem }
+                );
+                return;
+            }
+            break;
+
+        default:
+            m_xControl->expand_row(*m_xIter);
+            break;
+    }
+}
+
 } // namespace basctl
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/basctl/source/basicide/bastype3.cxx b/basctl/source/basicide/bastype3.cxx
index c4ce7d832fca..d891994bf6e7 100644
--- a/basctl/source/basicide/bastype3.cxx
+++ b/basctl/source/basicide/bastype3.cxx
@@ -129,6 +129,93 @@ void TreeListBox::RequestingChildren( SvTreeListEntry* pEntry )
     }
 }
 
+IMPL_LINK(SbTreeListBox, RequestingChildrenHdl, weld::TreeIter&, rEntry, bool)
+{
+    EntryDescriptor aDesc = GetEntryDescriptor(&rEntry);
+    const ScriptDocument& aDocument = aDesc.GetDocument();
+    OSL_ENSURE( aDocument.isAlive(), "basctl::TreeListBox::RequestingChildren: invalid document!" );
+    if (!aDocument.isAlive())
+        return false;
+
+    LibraryLocation eLocation = aDesc.GetLocation();
+    EntryType eType = aDesc.GetType();
+
+    if ( eType == OBJ_TYPE_DOCUMENT )
+    {
+        ImpCreateLibEntries( rEntry, aDocument, eLocation );
+    }
+    else if ( eType == OBJ_TYPE_LIBRARY )
+    {
+        const OUString& aOULibName( aDesc.GetLibName() );
+
+        // check password
+        bool bOK = true;
+        Reference< script::XLibraryContainer > xModLibContainer( aDocument.getLibraryContainer( E_SCRIPTS ) );
+        if ( xModLibContainer.is() && xModLibContainer->hasByName( aOULibName ) )
+        {
+            Reference< script::XLibraryContainerPassword > xPasswd( xModLibContainer, UNO_QUERY );
+            if ( xPasswd.is() && xPasswd->isLibraryPasswordProtected( aOULibName ) && !xPasswd->isLibraryPasswordVerified( aOULibName ) )
+            {
+                OUString aPassword;
+                bOK = QueryPassword( xModLibContainer, aOULibName, aPassword );
+            }
+        }
+
+        if ( bOK )
+        {
+            // load module library
+            bool bModLibLoaded = false;
+            if ( xModLibContainer.is() && xModLibContainer->hasByName( aOULibName ) )
+            {
+                if ( !xModLibContainer->isLibraryLoaded( aOULibName ) )
+                {
+                    weld::WaitObject aWait(m_pTopLevel);
+                    xModLibContainer->loadLibrary( aOULibName );
+                }
+                bModLibLoaded = xModLibContainer->isLibraryLoaded( aOULibName );
+            }
+
+            // load dialog library
+            bool bDlgLibLoaded = false;
+            Reference< script::XLibraryContainer > xDlgLibContainer( aDocument.getLibraryContainer( E_DIALOGS ), UNO_QUERY );
+            if ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aOULibName ) )
+            {
+                if ( !xDlgLibContainer->isLibraryLoaded( aOULibName ) )
+                {
+                    weld::WaitObject aWait(m_pTopLevel);
+                    xDlgLibContainer->loadLibrary( aOULibName );
+                }
+                bDlgLibLoaded = xDlgLibContainer->isLibraryLoaded( aOULibName );
+            }
+
+            if ( bModLibLoaded || bDlgLibLoaded )
+            {
+                // create the sub entries
+                ImpCreateLibSubEntries( rEntry, aDocument, aOULibName );
+
+                // exchange image
+                const bool bDlgMode = (nMode & BrowseMode::Dialogs) && !(nMode & BrowseMode::Modules);
+                OUString aImage(bDlgMode ? OUStringLiteral(RID_BMP_DLGLIB) : OUStringLiteral(RID_BMP_MODLIB));
+                SetEntryBitmaps(rEntry, aImage);
+            }
+            else
+            {
+                OSL_FAIL( "basctl::TreeListBox::RequestingChildren: Error loading library!" );
+            }
+        }
+    }
+    else if ( eType == OBJ_TYPE_DOCUMENT_OBJECTS
+            || eType == OBJ_TYPE_USERFORMS
+            || eType == OBJ_TYPE_NORMAL_MODULES
+            || eType == OBJ_TYPE_CLASS_MODULES )
+    {
+        const OUString& aLibName( aDesc.GetLibName() );
+        ImpCreateLibSubSubEntriesInVBAMode( rEntry, aDocument, aLibName );
+    }
+
+    return true;
+}
+
 void TreeListBox::ExpandedHdl()
 {
     SvTreeListEntry* pEntry = GetHdlEntry();
@@ -157,6 +244,19 @@ void TreeListBox::ScanAllEntries()
     }
 }
 
+void SbTreeListBox::ScanAllEntries()
+{
+    ScanEntry( ScriptDocument::getApplicationScriptDocument(), LIBRARY_LOCATION_USER );
+    ScanEntry( ScriptDocument::getApplicationScriptDocument(), LIBRARY_LOCATION_SHARE );
+
+    ScriptDocuments aDocuments( ScriptDocument::getAllScriptDocuments( ScriptDocument::DocumentsSorted ) );
+    for (auto const& doc : aDocuments)
+    {
+        if ( doc.isAlive() )
+            ScanEntry(doc, LIBRARY_LOCATION_DOCUMENT);
+    }
+}
+
 SbxVariable* TreeListBox::FindVariable( SvTreeListEntry* pEntry )
 {
     if ( !pEntry )
@@ -250,6 +350,100 @@ SbxVariable* TreeListBox::FindVariable( SvTreeListEntry* pEntry )
     return pVar;
 }
 
+SbxVariable* SbTreeListBox::FindVariable(weld::TreeIter* pEntry)
+{
+    if ( !pEntry )
+        return nullptr;
+
+    ScriptDocument aDocument( ScriptDocument::getApplicationScriptDocument() );
+    std::unique_ptr<weld::TreeIter> xIter(m_xControl->make_iterator(pEntry));
+    std::vector<std::pair<Entry*, OUString>> aEntries;
+    bool bValidIter = true;
+    do
+    {
+        sal_uInt16 nDepth = m_xControl->get_iter_depth(*xIter);
+        Entry* pBE = reinterpret_cast<Entry*>(m_xControl->get_id(*xIter).toInt64());
+        switch (nDepth)
+        {
+            case 4:
+            case 3:
+            case 2:
+            case 1:
+            {
+                aEntries.emplace_back(pBE, m_xControl->get_text(*xIter));
+            }
+            break;
+            case 0:
+            {
+                aDocument = static_cast<DocumentEntry*>(pBE)->GetDocument();
+            }
+            break;
+        }
+        bValidIter = m_xControl->iter_parent(*xIter);
+    } while (bValidIter);
+
+    SbxVariable* pVar = nullptr;
+    if (!aEntries.empty())
+    {
+        std::reverse(aEntries.begin(), aEntries.end());
+        bool bDocumentObjects = false;
+        for (auto& pair : aEntries)
+        {
+            Entry* pBE = pair.first;
+            assert(pBE && "No data found in entry!");
+            OUString aName(pair.second);
+
+            switch ( pBE->GetType() )
+            {
+            case OBJ_TYPE_LIBRARY:
+                if (BasicManager* pBasMgr = aDocument.getBasicManager())
+                    pVar = pBasMgr->GetLib( aName );
+                break;
+            case OBJ_TYPE_MODULE:
+                DBG_ASSERT(dynamic_cast<StarBASIC*>(pVar), "FindVariable: invalid Basic");
+                if(!pVar)
+                {
+                    break;
+                }
+                // extract the module name from the string like "Sheet1 (Example1)"
+                if( bDocumentObjects )
+                {
+                    sal_Int32 nIndex = 0;
+                    aName = aName.getToken( 0, ' ', nIndex );
+                }
+                pVar = static_cast<StarBASIC*>(pVar)->FindModule( aName );
+                break;
+            case OBJ_TYPE_METHOD:
+                DBG_ASSERT(dynamic_cast<SbxObject*>(pVar), "FindVariable: invalid module/object");
+                if(!pVar)
+                {
+                    break;
+                }
+                pVar = static_cast<SbxObject*>(pVar)->GetMethods()->Find(aName, SbxClassType::Method);
+                break;
+            case OBJ_TYPE_DIALOG:
+                // sbx dialogs removed
+                break;
+            case OBJ_TYPE_DOCUMENT_OBJECTS:
+                bDocumentObjects = true;
+                SAL_FALLTHROUGH;
+            case OBJ_TYPE_USERFORMS:
+            case OBJ_TYPE_NORMAL_MODULES:
+            case OBJ_TYPE_CLASS_MODULES:
+                // skip, to find the child entry.
+                continue;
+            default:
+                OSL_FAIL( "FindVariable: unknown type" );
+                pVar = nullptr;
+                break;
+            }
+            if ( !pVar )
+                break;
+        }
+    }
+    return pVar;
+}
+
 EntryDescriptor TreeListBox::GetEntryDescriptor( SvTreeListEntry* pEntry )
 {
     ScriptDocument aDocument( ScriptDocument::getApplicationScriptDocument() );
@@ -351,6 +545,111 @@ EntryDescriptor TreeListBox::GetEntryDescriptor( SvTreeListEntry* pEntry )
     return EntryDescriptor( aDocument, eLocation, aLibName, aLibSubName, aName, aMethodName, eType );
 }
 
+EntryDescriptor SbTreeListBox::GetEntryDescriptor(weld::TreeIter* pEntry)
+{
+    ScriptDocument aDocument( ScriptDocument::getApplicationScriptDocument() );
+    LibraryLocation eLocation = LIBRARY_LOCATION_UNKNOWN;
+    OUString aLibName;
+    OUString aLibSubName;
+    OUString aName;
+    OUString aMethodName;
+    EntryType eType = OBJ_TYPE_UNKNOWN;
+
+    if ( !pEntry )
+        return EntryDescriptor( aDocument, eLocation, aLibName, aLibSubName, aName, aMethodName, eType );
+
+    std::vector<std::pair<Entry*, OUString>> aEntries;
+
+    m_xControl->get_text(*pEntry);
+    std::unique_ptr<weld::TreeIter> xIter(m_xControl->make_iterator(pEntry));
+    m_xControl->get_text(*xIter);
+    bool bValidIter = true;
+    do
+    {
+        sal_uInt16 nDepth = m_xControl->get_iter_depth(*xIter);
+        Entry* pBE = reinterpret_cast<Entry*>(m_xControl->get_id(*xIter).toInt64());
+        switch (nDepth)
+        {
+            case 4:
+            case 3:
+            case 2:
+            case 1:
+            {
+                aEntries.emplace_back(pBE, m_xControl->get_text(*xIter));
+            }
+            break;
+            case 0:
+            {
+                if (DocumentEntry* pDocumentEntry = static_cast<DocumentEntry*>(pBE))
+                {
+                    aDocument = pDocumentEntry->GetDocument();
+                    eLocation = pDocumentEntry->GetLocation();
+                    eType = OBJ_TYPE_DOCUMENT;
+                }
+            }
+            break;
+        }
+        bValidIter = m_xControl->iter_parent(*xIter);
+    } while (bValidIter);
+
+    if ( !aEntries.empty() )
+    {
+        for (auto& pair : aEntries)
+        {
+            Entry* pBE = pair.first;
+            assert(pBE && "No data found in entry!");
+
+            switch ( pBE->GetType() )
+            {
+                case OBJ_TYPE_LIBRARY:
+                {
+                    aLibName = pair.second;
+                    eType = pBE->GetType();
+                }
+                break;
+                case OBJ_TYPE_MODULE:
+                {
+                    aName = pair.second;
+                    eType = pBE->GetType();
+                }
+                break;
+                case OBJ_TYPE_METHOD:
+                {
+                    aMethodName = pair.second;
+                    eType = pBE->GetType();
+                }
+                break;
+                case OBJ_TYPE_DIALOG:
+                {
+                    aName = pair.second;
+                    eType = pBE->GetType();
+                }
+                break;
+                case OBJ_TYPE_DOCUMENT_OBJECTS:
+                case OBJ_TYPE_USERFORMS:
+                case OBJ_TYPE_NORMAL_MODULES:
+                case OBJ_TYPE_CLASS_MODULES:
+                {
+                    aLibSubName = pair.second;
+                    eType = pBE->GetType();
+                }
+                break;
+                default:
+                {
+                    OSL_FAIL( "GetEntryDescriptor: unknown type" );
+                    eType = OBJ_TYPE_UNKNOWN;
+                }
+                break;
+            }
+
+            if ( eType == OBJ_TYPE_UNKNOWN )
+                break;
+        }
+    }
+
+    return EntryDescriptor( aDocument, eLocation, aLibName, aLibSubName, aName, aMethodName, eType );
+}
+
 ItemType TreeListBox::ConvertType (EntryType eType)
 {
     switch (eType)
@@ -365,6 +664,20 @@ ItemType TreeListBox::ConvertType (EntryType eType)
     }
 }
 
+ItemType SbTreeListBox::ConvertType (EntryType eType)
+{
+    switch (eType)
+    {
+        case OBJ_TYPE_DOCUMENT:  return TYPE_SHELL;
+        case OBJ_TYPE_LIBRARY:   return TYPE_LIBRARY;
+        case OBJ_TYPE_MODULE:    return TYPE_MODULE;
+        case OBJ_TYPE_DIALOG:    return TYPE_DIALOG;
+        case OBJ_TYPE_METHOD:    return TYPE_METHOD;
+        default:
+            return static_cast<ItemType>(OBJ_TYPE_UNKNOWN);
+    }
+}
+
 bool TreeListBox::IsValidEntry( SvTreeListEntry* pEntry )
 {
     bool bIsValid = false;
@@ -420,11 +733,71 @@ bool TreeListBox::IsValidEntry( SvTreeListEntry* pEntry )
     return bIsValid;
 }
 
+bool SbTreeListBox::IsValidEntry(weld::TreeIter& rEntry)
+{
+    bool bIsValid = false;
+
+    EntryDescriptor aDesc(GetEntryDescriptor(&rEntry));
+    const ScriptDocument& aDocument( aDesc.GetDocument() );
+    LibraryLocation eLocation( aDesc.GetLocation() );
+    const OUString& aLibName( aDesc.GetLibName() );
+    const OUString& aName( aDesc.GetName() );
+    const OUString& aMethodName( aDesc.GetMethodName() );
+    EntryType eType( aDesc.GetType() );
+
+    switch ( eType )
+    {
+        case OBJ_TYPE_DOCUMENT:
+        {
+            bIsValid = aDocument.isAlive()
+                && (aDocument.isApplication()
+                    || GetRootEntryName(aDocument, eLocation) == m_xControl->get_text(rEntry));
+        }
+        break;
+        case OBJ_TYPE_LIBRARY:
+        {
+            bIsValid = aDocument.hasLibrary( E_SCRIPTS, aLibName ) || aDocument.hasLibrary( E_DIALOGS, aLibName );
+        }
+        break;
+        case OBJ_TYPE_MODULE:
+        {
+            bIsValid = aDocument.hasModule( aLibName, aName );
+        }
+        break;
+        case OBJ_TYPE_DIALOG:
+        {
+            bIsValid = aDocument.hasDialog( aLibName, aName );
+        }
+        break;
+        case OBJ_TYPE_METHOD:
+        {
+            bIsValid = HasMethod( aDocument, aLibName, aName, aMethodName );
+        }
+        break;
+        case OBJ_TYPE_DOCUMENT_OBJECTS:
+        case OBJ_TYPE_USERFORMS:
+        case OBJ_TYPE_NORMAL_MODULES:
+        case OBJ_TYPE_CLASS_MODULES:
+        {
+            bIsValid = true;
+        }
+        break;
+        default: ;
+    }
+
+    return bIsValid;
+}
+
 SbModule* TreeListBox::FindModule( SvTreeListEntry* pEntry )
 {
     return dynamic_cast<SbModule*>(FindVariable(pEntry));
 }
 
+SbModule* SbTreeListBox::FindModule(weld::TreeIter* pEntry)
+{
+    return dynamic_cast<SbModule*>(FindVariable(pEntry));
+}
+
 SvTreeListEntry* TreeListBox::FindRootEntry( const ScriptDocument& rDocument, LibraryLocation eLocation )
 {
     OSL_ENSURE( rDocument.isValid(), "basctl::TreeListBox::FindRootEntry: invalid document!" );
@@ -441,6 +814,20 @@ SvTreeListEntry* TreeListBox::FindRootEntry( const ScriptDocument& rDocument, Li
     return nullptr;
 }
 
+bool SbTreeListBox::FindRootEntry( const ScriptDocument& rDocument, LibraryLocation eLocation, weld::TreeIter& rIter)
+{
+    OSL_ENSURE( rDocument.isValid(), "basctl::TreeListBox::FindRootEntry: invalid document!" );
+    bool bValidIter = m_xControl->get_iter_first(rIter);
+    while (bValidIter)
+    {
+        DocumentEntry* pBDEntry = reinterpret_cast<DocumentEntry*>(m_xControl->get_id(rIter).toInt64());
+        if (pBDEntry && pBDEntry->GetDocument() == rDocument && pBDEntry->GetLocation() == eLocation)
+            return true;
+        bValidIter = m_xControl->iter_next_sibling(rIter);
+    }
+    return false;
+}
+
 OUString CreateMgrAndLibStr( const OUString& rMgrName, const OUString& rLibName )
 {
     return "[" + rMgrName + "]." + rLibName;
diff --git a/basctl/source/basicide/macrodlg.cxx b/basctl/source/basicide/macrodlg.cxx
index 25f94c59c12e..182627597940 100644
--- a/basctl/source/basicide/macrodlg.cxx
+++ b/basctl/source/basicide/macrodlg.cxx
@@ -45,108 +45,85 @@ using std::map;
 using namespace ::com::sun::star;
 using namespace ::com::sun::star::uno;
 
-MacroChooser::MacroChooser( vcl::Window* pParnt, const Reference< frame::XFrame >& xDocFrame, bool bCreateEntries )
-    : SfxModalDialog(pParnt, "BasicMacroDialog", "modules/BasicIDE/ui/basicmacrodialog.ui")
+MacroChooser::MacroChooser(weld::Window* pParnt, const Reference< frame::XFrame >& xDocFrame, bool bCreateEntries)
+    : SfxDialogController(pParnt, "modules/BasicIDE/ui/basicmacrodialog.ui", "BasicMacroDialog")
     , m_xDocumentFrame(xDocFrame)
-    , bNewDelIsDel(true)
     // the Sfx doesn't ask the BasicManager whether modified or not
     // => start saving in case of a change without a into the BasicIDE.
     , bForceStoreBasic(false)
     , nMode(All)
+    , m_xMacroNameEdit(m_xBuilder->weld_entry("macronameedit"))
+    , m_xMacroFromTxT(m_xBuilder->weld_label("macrofromft"))
+    , m_xMacrosSaveInTxt(m_xBuilder->weld_label("macrotoft"))
+    , m_xBasicBox(new SbTreeListBox(m_xBuilder->weld_tree_view("libraries"), m_xDialog.get()))
+    , m_xBasicBoxIter(m_xBasicBox->make_iterator())
+    , m_xMacrosInTxt(m_xBuilder->weld_label("existingmacrosft"))
+    , m_xMacroBox(m_xBuilder->weld_tree_view("macros"))
+    , m_xMacroBoxIter(m_xMacroBox->make_iterator())
+    , m_xRunButton(m_xBuilder->weld_button("ok"))
+    , m_xCloseButton(m_xBuilder->weld_button("close"))
+    , m_xAssignButton(m_xBuilder->weld_button("assign"))
+    , m_xEditButton(m_xBuilder->weld_button("edit"))
+    , m_xDelButton(m_xBuilder->weld_button("delete"))
+    , m_xNewButton(m_xBuilder->weld_button("new"))
+    , m_xOrganizeButton(m_xBuilder->weld_button("organize"))
+    , m_xNewLibButton(m_xBuilder->weld_button("newlibrary"))
+    , m_xNewModButton(m_xBuilder->weld_button("newmodule"))
 {
-    get(m_pMacroNameEdit, "macronameedit");
-    get(m_pMacroFromTxT, "macrofromft");
-    get(m_pMacrosSaveInTxt, "macrotoft");
-    get(m_pBasicBox, "libraries");
-    get(m_pMacrosInTxt, "existingmacrosft");
-    m_aMacrosInTxtBaseStr = m_pMacrosInTxt->GetText();
-    get(m_pMacroBox, "macros");
-    get(m_pRunButton, "run");
-    get(m_pCloseButton, "close");
-    get(m_pAssignButton, "assign");
-    get(m_pEditButton, "edit");
-    get(m_pDelButton, "delete");
-    get(m_pOrganizeButton, "organize");
-    get(m_pNewLibButton, "newlibrary");
-    get(m_pNewModButton, "newmodule");
-
-    m_pMacroBox->SetSelectionMode( SelectionMode::Single );
-    m_pMacroBox->SetHighlightRange(); // select over the whole width
-
-    m_pRunButton->SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
-    m_pCloseButton->SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
-    m_pAssignButton->SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
-    m_pEditButton->SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
-    m_pDelButton->SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
-    m_pOrganizeButton->SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
+    m_xBasicBox->set_size_request(m_xBasicBox->get_approximate_digit_width() * 30, m_xBasicBox->get_height_rows(18));
+    m_xMacroBox->set_size_request(m_xMacroBox->get_approximate_digit_width() * 30, m_xMacroBox->get_height_rows(18));
 
-    // Buttons only for MacroChooser::Recording
-    m_pNewLibButton->SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
-    m_pNewModButton->SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
-    m_pNewLibButton->Hide();       // default
-    m_pNewModButton->Hide();       // default
-    m_pMacrosSaveInTxt->Hide();    // default
+    m_aMacrosInTxtBaseStr = m_xMacrosInTxt->get_label();
+
+    m_xRunButton->connect_clicked( LINK( this, MacroChooser, ButtonHdl ) );
+    m_xCloseButton->connect_clicked( LINK( this, MacroChooser, ButtonHdl ) );
+    m_xAssignButton->connect_clicked( LINK( this, MacroChooser, ButtonHdl ) );
+    m_xEditButton->connect_clicked( LINK( this, MacroChooser, ButtonHdl ) );
+    m_xDelButton->connect_clicked( LINK( this, MacroChooser, ButtonHdl ) );
+    m_xNewButton->connect_clicked( LINK( this, MacroChooser, ButtonHdl ) );
+    m_xOrganizeButton->connect_clicked( LINK( this, MacroChooser, ButtonHdl ) );
 
-    m_pMacrosInTxt->SetStyle( WB_NOMULTILINE | WB_PATHELLIPSIS );
+    // Buttons only for MacroChooser::Recording
+    m_xNewLibButton->connect_clicked( LINK( this, MacroChooser, ButtonHdl ) );
+    m_xNewModButton->connect_clicked( LINK( this, MacroChooser, ButtonHdl ) );
+    m_xNewLibButton->hide();       // default
+    m_xNewModButton->hide();       // default
+    m_xMacrosSaveInTxt->hide();    // default
 
-    m_pMacroNameEdit->SetModifyHdl( LINK( this, MacroChooser, EditModifyHdl ) );
+    m_xMacroNameEdit->connect_changed( LINK( this, MacroChooser, EditModifyHdl ) );
 
-    m_pBasicBox->SetSelectHdl( LINK( this, MacroChooser, BasicSelectHdl ) );
+    m_xBasicBox->connect_changed( LINK( this, MacroChooser, BasicSelectHdl ) );
 
-    m_pMacroBox->SetDoubleClickHdl( LINK( this, MacroChooser, MacroDoubleClickHdl ) );
-    m_pMacroBox->SetSelectHdl( LINK( this, MacroChooser, MacroSelectHdl ) );
+    m_xMacroBox->connect_row_activated( LINK( this, MacroChooser, MacroDoubleClickHdl ) );
+    m_xMacroBox->connect_changed( LINK( this, MacroChooser, MacroSelectHdl ) );
 
-    m_pBasicBox->SetMode( BrowseMode::Modules );
-    m_pBasicBox->SetStyle( WB_TABSTOP | WB_BORDER |
-                        WB_HASLINES | WB_HASLINESATROOT |
-                        WB_HASBUTTONS | WB_HASBUTTONSATROOT |
-                        WB_HSCROLL );
+    m_xBasicBox->SetMode( BrowseMode::Modules );
 
     if (SfxDispatcher* pDispatcher = GetDispatcher())
         pDispatcher->Execute( SID_BASICIDE_STOREALLMODULESOURCES );
 
-    if ( bCreateEntries )
-        m_pBasicBox->ScanAllEntries();
+    if (bCreateEntries)
+        m_xBasicBox->ScanAllEntries();
 }
 
 MacroChooser::~MacroChooser()
 {
-    disposeOnce();
-}
-
-void MacroChooser::dispose()
-{
-    if ( bForceStoreBasic )
+    if (bForceStoreBasic)
     {
         SfxGetpApp()->SaveBasicAndDialogContainer();
         bForceStoreBasic = false;
     }
-    m_pMacroNameEdit.clear();
-    m_pMacroFromTxT.clear();
-    m_pMacrosSaveInTxt.clear();
-    m_pBasicBox.clear();
-    m_pMacrosInTxt.clear();
-    m_pMacroBox.clear();
-    m_pRunButton.clear();
-    m_pCloseButton.clear();
-    m_pAssignButton.clear();
-    m_pEditButton.clear();
-    m_pDelButton.clear();
-    m_pOrganizeButton.clear();
-    m_pNewLibButton.clear();
-    m_pNewModButton.clear();
-    SfxModalDialog::dispose();
 }
 
 void MacroChooser::StoreMacroDescription()
 {
-    EntryDescriptor aDesc = m_pBasicBox->GetEntryDescriptor(m_pBasicBox->FirstSelected());
+    m_xBasicBox->get_selected(m_xBasicBoxIter.get());
+    EntryDescriptor aDesc = m_xBasicBox->GetEntryDescriptor(m_xBasicBoxIter.get());
     OUString aMethodName;
-    SvTreeListEntry* pEntry = m_pMacroBox->FirstSelected();
-    if ( pEntry )
-        aMethodName = m_pMacroBox->GetEntryText( pEntry );
+    if (m_xMacroBox->get_selected(m_xMacroBoxIter.get()))
+        aMethodName = m_xMacroBox->get_text(*m_xMacroBoxIter);
     else
-        aMethodName = m_pMacroNameEdit->GetText();
+        aMethodName = m_xMacroNameEdit->get_text();
     if ( !aMethodName.isEmpty() )
     {
         aDesc.SetMethodName( aMethodName );
@@ -171,68 +148,57 @@ void MacroChooser::RestoreMacroDescription()
             aDesc = pData->GetLastEntryDescriptor();
     }
 
-    m_pBasicBox->SetCurrentEntry( aDesc );
+    m_xBasicBox->SetCurrentEntry( aDesc );
 
     OUString aLastMacro( aDesc.GetMethodName() );
-    if ( !aLastMacro.isEmpty() )
+    if (!aLastMacro.isEmpty())
     {
         // find entry in macro box
-        SvTreeListEntry* pEntry = nullptr;
-        sal_uLong nPos = 0;
-        SvTreeListEntry* pE = m_pMacroBox->GetEntry( nPos );
-        while ( pE )
-        {
-            if ( m_pMacroBox->GetEntryText( pE ) == aLastMacro )
-            {
-                pEntry = pE;
-                break;
-            }
-            pE = m_pMacroBox->GetEntry( ++nPos );
-        }
-
-        if ( pEntry )
-            m_pMacroBox->SetCurEntry( pEntry );
+        auto nIndex = m_xMacroBox->find_text(aLastMacro);
+        if (nIndex != -1)
+            m_xMacroBox->select(nIndex);
         else
         {
-            m_pMacroNameEdit->SetText( aLastMacro );
-            m_pMacroNameEdit->SetSelection( Selection( 0, 0 ) );
+            m_xMacroNameEdit->set_text(aLastMacro);
+            m_xMacroNameEdit->select_region(0, 0);
         }
     }
 }
 
-short MacroChooser::Execute()
+short MacroChooser::run()
 {
     RestoreMacroDescription();
-    m_pRunButton->GrabFocus();
+    m_xRunButton->grab_focus();
 
     // #104198 Check if "wrong" document is active
-    SvTreeListEntry* pSelectedEntry = m_pBasicBox->GetCurEntry();
-    EntryDescriptor aDesc( m_pBasicBox->GetEntryDescriptor( pSelectedEntry ) );
-    const ScriptDocument& rSelectedDoc( aDesc.GetDocument() );
+    bool bSelectedEntry = m_xBasicBox->get_cursor(m_xBasicBoxIter.get());
+    EntryDescriptor aDesc(m_xBasicBox->GetEntryDescriptor(bSelectedEntry ? m_xBasicBoxIter.get() : nullptr));
+    const ScriptDocument& rSelectedDoc(aDesc.GetDocument());
 
     // App Basic is always ok, so only check if shell was found
     if( rSelectedDoc.isDocument() && !rSelectedDoc.isActive() )
     {
         // Search for the right entry
-        sal_uLong nRootPos = 0;
-        SvTreeListEntry* pRootEntry = m_pBasicBox->GetEntry( nRootPos );
-        while( pRootEntry )
+        bool bValidIter = m_xBasicBox->get_iter_first(*m_xBasicBoxIter);
+        while (bValidIter)
         {
-            EntryDescriptor aCmpDesc( m_pBasicBox->GetEntryDescriptor( pRootEntry ) );
+            EntryDescriptor aCmpDesc(m_xBasicBox->GetEntryDescriptor(m_xBasicBoxIter.get()));
             const ScriptDocument& rCmpDoc( aCmpDesc.GetDocument() );
-            if ( rCmpDoc.isDocument() && rCmpDoc.isActive() )
+            if (rCmpDoc.isDocument() && rCmpDoc.isActive())
             {
-                SvTreeListEntry* pEntry = pRootEntry;
-                SvTreeListEntry* pLastValid = pEntry;
-                while ( pEntry )
+                std::unique_ptr<weld::TreeIter> xEntry(m_xBasicBox->make_iterator());
+                m_xBasicBox->copy_iterator(*m_xBasicBoxIter, *xEntry);
+                std::unique_ptr<weld::TreeIter> xLastValid(m_xBasicBox->make_iterator());
+                bool bValidEntryIter = true;
+                do
                 {
-                    pLastValid = pEntry;
-                    pEntry = m_pBasicBox->FirstChild( pEntry );
+                    m_xBasicBox->copy_iterator(*xEntry, *xLastValid);
+                    bValidEntryIter = m_xBasicBox->iter_children(*xEntry);
                 }
-                if( pLastValid )
-                    m_pBasicBox->SetCurEntry( pLastValid );
+                while (bValidEntryIter);
+                m_xBasicBox->set_cursor(*xLastValid);
             }
-            pRootEntry = m_pBasicBox->GetEntry( ++nRootPos );
+            bValidIter = m_xBasicBox->iter_next_sibling(*m_xBasicBoxIter);
         }
     }
 
@@ -240,36 +206,35 @@ short MacroChooser::Execute()
     UpdateFields();
 
     if ( StarBASIC::IsRunning() )
-        m_pCloseButton->GrabFocus();
+        m_xCloseButton->grab_focus();
 
-    return ModalDialog::Execute();
+    return SfxDialogController::run();
 }
 
-void MacroChooser::EnableButton( Button& rButton, bool bEnable )
+void MacroChooser::EnableButton(weld::Button& rButton, bool bEnable)
 {
     if ( bEnable )
     {
         if (nMode == ChooseOnly || nMode == Recording)
-            rButton.Enable(&rButton == m_pRunButton);
+            rButton.set_sensitive(&rButton == m_xRunButton.get());
         else
-            rButton.Enable();
+            rButton.set_sensitive(true);
     }
     else
-        rButton.Disable();
+        rButton.set_sensitive(false);
 }
 
-
 SbMethod* MacroChooser::GetMacro()
 {
     SbMethod* pMethod = nullptr;
-    SbModule* pModule = m_pBasicBox->FindModule( m_pBasicBox->GetCurEntry() );
-    if ( pModule )
+    m_xBasicBox->get_cursor(m_xBasicBoxIter.get());
+    SbModule* pModule = m_xBasicBox->FindModule(m_xBasicBoxIter.get());
+    if (pModule)
     {
-        SvTreeListEntry* pEntry = m_pMacroBox->FirstSelected();
-        if ( pEntry )
+        if (m_xMacroBox->get_selected(m_xMacroBoxIter.get()))
         {
-            OUString aMacroName( m_pMacroBox->GetEntryText( pEntry ) );
-            pMethod = pModule->FindMethod( aMacroName, SbxClassType::Method );
+            OUString aMacroName(m_xMacroBox->get_text(*m_xMacroBoxIter));
+            pMethod = pModule->FindMethod(aMacroName, SbxClassType::Method);
         }
     }
     return pMethod;
@@ -280,7 +245,7 @@ void MacroChooser::DeleteMacro()
 {
     SbMethod* pMethod = GetMacro();
     DBG_ASSERT( pMethod, "DeleteMacro: No Macro !" );
-    if (pMethod && QueryDelMacro(pMethod->GetName(), GetFrameWeld()))
+    if (pMethod && QueryDelMacro(pMethod->GetName(), m_xDialog.get()))
     {
         if (SfxDispatcher* pDispatcher = GetDispatcher())
             pDispatcher->Execute( SID_BASICIDE_STOREALLMODULESOURCES );
@@ -312,9 +277,9 @@ void MacroChooser::DeleteMacro()
         OUString aModName = pModule->GetName();
         OSL_VERIFY( aDocument.updateModule( aLibName, aModName, aSource ) );
 
-        SvTreeListEntry* pEntry = m_pMacroBox->FirstSelected();
-        DBG_ASSERT( pEntry, "DeleteMacro: Entry ?!" );
-        m_pMacroBox->GetModel()->Remove( pEntry );
+        bool bSelected = m_xMacroBox->get_selected(m_xMacroBoxIter.get());
+        DBG_ASSERT(bSelected, "DeleteMacro: Entry ?!");
+        m_xMacroBox->remove(*m_xMacroBoxIter);
         bForceStoreBasic = true;
     }
 }
@@ -322,8 +287,8 @@ void MacroChooser::DeleteMacro()
 SbMethod* MacroChooser::CreateMacro()
 {
     SbMethod* pMethod = nullptr;
-    SvTreeListEntry* pCurEntry = m_pBasicBox->GetCurEntry();
-    EntryDescriptor aDesc = m_pBasicBox->GetEntryDescriptor(pCurEntry);
+    m_xBasicBox->get_cursor(m_xBasicBoxIter.get());
+    EntryDescriptor aDesc = m_xBasicBox->GetEntryDescriptor(m_xBasicBoxIter.get());
     const ScriptDocument& aDocument( aDesc.GetDocument() );
     OSL_ENSURE( aDocument.isAlive(), "MacroChooser::CreateMacro: no document!" );
     if ( !aDocument.isAlive() )
@@ -365,11 +330,11 @@ SbMethod* MacroChooser::CreateMacro()
 
         // Retain the desired macro name before the macro dialog box is forced to close
         // by opening the module name dialog window when no module exists in the current library.
-        OUString aSubName = m_pMacroNameEdit->GetText();
+        OUString aSubName = m_xMacroNameEdit->get_text();
 
         if ( !pModule )
         {
-            pModule = createModImpl(GetFrameWeld(), aDocument, *m_pBasicBox, aLibName, aModName, false);
+            pModule = createModImpl(m_xDialog.get(), aDocument, *m_xBasicBox, aLibName, aModName, false);
         }
 
         DBG_ASSERT( !pModule || !pModule->FindMethod( aSubName, SbxClassType::Method ), "Macro exists already!" );
@@ -379,28 +344,30 @@ SbMethod* MacroChooser::CreateMacro()
     return pMethod;
 }
 
-void MacroChooser::SaveSetCurEntry( SvTreeListBox& rBox, SvTreeListEntry* pEntry )
+void MacroChooser::SaveSetCurEntry(weld::TreeView& rBox, weld::TreeIter& rEntry)
 {
     // the edit would be killed by the highlight otherwise:
 
-    OUString aSaveText( m_pMacroNameEdit->GetText() );
-    Selection aCurSel( m_pMacroNameEdit->GetSelection() );
+    OUString aSaveText(m_xMacroNameEdit->get_text());
+    int nStartPos, nEndPos;
+    m_xMacroNameEdit->get_selection_bounds(nStartPos, nEndPos);
 
-    rBox.SetCurEntry( pEntry );
-    m_pMacroNameEdit->SetText( aSaveText );
-    m_pMacroNameEdit->SetSelection( aCurSel );
+    rBox.set_cursor(rEntry);
+
+    m_xMacroNameEdit->set_text(aSaveText);
+    m_xMacroNameEdit->select_region(nStartPos, nEndPos);
 }
 
 void MacroChooser::CheckButtons()
 {
-    SvTreeListEntry* pCurEntry = m_pBasicBox->GetCurEntry();
-    EntryDescriptor aDesc = m_pBasicBox->GetEntryDescriptor(pCurEntry);
-    SvTreeListEntry* pMacroEntry = m_pMacroBox->FirstSelected();
+    const bool bCurEntry = m_xBasicBox->get_cursor(m_xBasicBoxIter.get());
+    EntryDescriptor aDesc = m_xBasicBox->GetEntryDescriptor(bCurEntry ? m_xBasicBoxIter.get() : nullptr);
+    const bool bMacroEntry = m_xMacroBox->get_selected(nullptr);
     SbMethod* pMethod = GetMacro();
 
     // check, if corresponding libraries are readonly
     bool bReadOnly = false;
-    sal_uInt16 nDepth = pCurEntry ? m_pBasicBox->GetModel()->GetDepth( pCurEntry ) : 0;
+    sal_uInt16 nDepth = bCurEntry ? m_xBasicBox->get_iter_depth(*m_xBasicBoxIter) : 0;
     if ( nDepth == 1 || nDepth == 2 )
     {
         const ScriptDocument& aDocument( aDesc.GetDocument() );
@@ -420,45 +387,52 @@ void MacroChooser::CheckButtons()
         bool bEnable = pMethod != nullptr;
         if (nMode != ChooseOnly && StarBASIC::IsRunning())
             bEnable = false;
-        EnableButton(*m_pRunButton, bEnable);
+        EnableButton(*m_xRunButton, bEnable);
     }
 
     // organising still possible?
 
     // Assign...
-    EnableButton(*m_pAssignButton, pMethod != nullptr);
+    EnableButton(*m_xAssignButton, pMethod != nullptr);
 
     // Edit...
-    EnableButton(*m_pEditButton, pMacroEntry != nullptr);
+    EnableButton(*m_xEditButton, bMacroEntry);
 
     // Organizer...
-    EnableButton(*m_pOrganizeButton, !StarBASIC::IsRunning() && nMode == All);
+    EnableButton(*m_xOrganizeButton, !StarBASIC::IsRunning() && nMode == All);
 
-    // m_pDelButton->...
-    bool bProtected = m_pBasicBox->IsEntryProtected( pCurEntry );
+    // m_xDelButton/m_xNewButton ->...
+    bool bProtected = bCurEntry && m_xBasicBox->IsEntryProtected(m_xBasicBoxIter.get());
     bool bShare = ( aDesc.GetLocation() == LIBRARY_LOCATION_SHARE );
-    EnableButton(*m_pDelButton, !StarBASIC::IsRunning() && nMode == All && !bProtected && !bReadOnly && !bShare);
-    bool bPrev = bNewDelIsDel;
-    bNewDelIsDel = pMethod != nullptr;
-    if (bPrev != bNewDelIsDel && nMode == All)
+    bool bEnable = !StarBASIC::IsRunning() && nMode == All && !bProtected && !bReadOnly && !bShare;
+    EnableButton(*m_xDelButton, bEnable);
+    EnableButton(*m_xNewButton, bEnable);
+    if (nMode == All)
     {
-        OUString aBtnText( bNewDelIsDel ? IDEResId(RID_STR_BTNDEL) : IDEResId(RID_STR_BTNNEW) );
-        m_pDelButton->SetText( aBtnText );
+        if (pMethod)
+        {
+            m_xDelButton->show();
+            m_xNewButton->hide();
+        }
+        else
+        {
+            m_xNewButton->show();
+            m_xDelButton->hide();
+        }
     }
 
     if (nMode == Recording)
     {
         // save button
-        m_pRunButton->Enable(!bProtected && !bReadOnly && !bShare);
+        m_xRunButton->set_sensitive(!bProtected && !bReadOnly && !bShare);
         // new library button
-        m_pNewLibButton->Enable(!bShare);
+        m_xNewLibButton->set_sensitive(!bShare);
         // new module button
-        m_pNewModButton->Enable(!bProtected && !bReadOnly && !bShare);
+        m_xNewModButton->set_sensitive(!bProtected && !bReadOnly && !bShare);
     }
 }
 
-
-IMPL_LINK_NOARG(MacroChooser, MacroDoubleClickHdl, SvTreeListBox*, bool)
+IMPL_LINK_NOARG(MacroChooser, MacroDoubleClickHdl, weld::TreeView&, void)
 {
     SbMethod* pMethod = GetMacro();
     SbModule* pModule = pMethod ? pMethod->GetModule() : nullptr;
@@ -468,51 +442,36 @@ IMPL_LINK_NOARG(MacroChooser, MacroDoubleClickHdl, SvTreeListBox*, bool)
     if (aDocument.isDocument() && !aDocument.allowMacros())
     {
         std::unique_ptr<weld::MessageDialog> xError(
-            Application::CreateMessageDialog(GetFrameWeld(), VclMessageType::Warning,
+            Application::CreateMessageDialog(m_xDialog.get(), VclMessageType::Warning,
                                              VclButtonsType::Ok, IDEResId(RID_STR_CANNOTRUNMACRO)));
         xError->run();
-        return false;
+        return;
     }
 
     StoreMacroDescription();
     if (nMode == Recording)
     {
-        if (pMethod && !QueryReplaceMacro(pMethod->GetName(), GetFrameWeld()))
-            return false;
+        if (pMethod && !QueryReplaceMacro(pMethod->GetName(), m_xDialog.get()))
+            return;
     }
 
-    EndDialog(Macro_OkRun);
-    return false;
+    m_xDialog->response(Macro_OkRun);
 }
 
-IMPL_LINK( MacroChooser, MacroSelectHdl, SvTreeListBox *, pBox, void )
+IMPL_LINK_NOARG(MacroChooser, MacroSelectHdl, weld::TreeView&, void)
 {
-    // Is also called if deselected!
-    // Two function calls in every SelectHdl because
-    // there's no separate DeselectHDL.
-    // So find out if select or deselect:
-    if ( pBox->IsSelected( pBox->GetHdlEntry() ) )
-    {
-        UpdateFields();
-        CheckButtons();
-    }
+    UpdateFields();
+    CheckButtons();
 }
 
-IMPL_LINK( MacroChooser, BasicSelectHdl, SvTreeListBox *, pBox, void )
+IMPL_LINK_NOARG(MacroChooser, BasicSelectHdl, weld::TreeView&, void)
 {
-    // Is also called if deselected!
-    // Two function calls in every SelectHdl because
-    // there's no separate DeselectHDL.
-    // So find out if select or deselect:
-    if ( !pBox->IsSelected( pBox->GetHdlEntry() ) )
-        return;
-
-    SbModule* pModule = m_pBasicBox->FindModule( m_pBasicBox->GetCurEntry() );
-
-    m_pMacroBox->Clear();
-    if ( pModule )
+    m_xBasicBox->get_cursor(m_xBasicBoxIter.get());
+    SbModule* pModule = m_xBasicBox->FindModule(m_xBasicBoxIter.get());
+    m_xMacroBox->clear();
+    if (pModule)
     {
-        m_pMacrosInTxt->SetText( m_aMacrosInTxtBaseStr + " " + pModule->GetName() );
+        m_xMacrosInTxt->set_label(m_aMacrosInTxtBaseStr + " " + pModule->GetName());
 
         // The macros should be called in the same order that they
         // are written down in the module.
@@ -530,16 +489,15 @@ IMPL_LINK( MacroChooser, BasicSelectHdl, SvTreeListBox *, pBox, void )
             aMacros.emplace( nStart, pMethod );
         }
 
-        m_pMacroBox->SetUpdateMode(false);
+        m_xMacroBox->freeze();
         for (auto const& macro : aMacros)
-            m_pMacroBox->InsertEntry( macro.second->GetName() );
-        m_pMacroBox->SetUpdateMode(true);
+            m_xMacroBox->append_text(macro.second->GetName());
+        m_xMacroBox->thaw();
 
-        if ( m_pMacroBox->GetEntryCount() )
+        if (m_xMacroBox->n_children())
         {
-            SvTreeListEntry* pEntry = m_pMacroBox->GetEntry( 0 );
-            DBG_ASSERT( pEntry, "Entry ?!" );
-            m_pMacroBox->SetCurEntry( pEntry );
+            m_xMacroBox->get_iter_first(*m_xMacroBoxIter);
+            m_xMacroBox->set_cursor(*m_xMacroBoxIter);
         }
     }
 
@@ -547,56 +505,58 @@ IMPL_LINK( MacroChooser, BasicSelectHdl, SvTreeListBox *, pBox, void )
     CheckButtons();
 }
 
-
-IMPL_LINK_NOARG( MacroChooser, EditModifyHdl, Edit&, void )
+IMPL_LINK_NOARG(MacroChooser, EditModifyHdl, weld::Entry&, void)
 {
     // select the module in which the macro is put at "new",
     // if BasicManager or Lib is selecting
-    SvTreeListEntry* pCurEntry = m_pBasicBox->GetCurEntry();
-    if ( pCurEntry )
+    if (m_xBasicBox->get_cursor(m_xBasicBoxIter.get()))
     {
-        sal_uInt16 nDepth = m_pBasicBox->GetModel()->GetDepth( pCurEntry );
-        if ( ( nDepth == 1 ) && ( m_pBasicBox->IsEntryProtected( pCurEntry ) ) )
+        sal_uInt16 nDepth = m_xBasicBox->get_iter_depth(*m_xBasicBoxIter);
+        if (nDepth == 1 && m_xBasicBox->IsEntryProtected(m_xBasicBoxIter.get()))
         {
             // then put to the respective Std-Lib...
-            SvTreeListEntry* pManagerEntry = m_pBasicBox->GetModel()->GetParent( pCurEntry );
-            pCurEntry = m_pBasicBox->GetModel()->FirstChild( pManagerEntry );
+            m_xBasicBox->iter_parent(*m_xBasicBoxIter);
+            m_xBasicBox->iter_children(*m_xBasicBoxIter);
         }
-        if ( nDepth < 2 )
+        if (nDepth < 2)
         {
-            SvTreeListEntry* pNewEntry = pCurEntry;
-            while ( pCurEntry && ( nDepth < 2 ) )
+            std::unique_ptr<weld::TreeIter> xNewEntry(m_xBasicBox->make_iterator());
+            m_xBasicBox->copy_iterator(*m_xBasicBoxIter, *xNewEntry);
+            bool bCurEntry = true;
+            do
             {
-                pCurEntry = m_pBasicBox->FirstChild( pCurEntry );
-                if ( pCurEntry )
+                bCurEntry = m_xBasicBox->iter_children(*m_xBasicBoxIter);
+                if (bCurEntry)
                 {
-                    pNewEntry = pCurEntry;
-                    nDepth = m_pBasicBox->GetModel()->GetDepth( pCurEntry );
+                    m_xBasicBox->copy_iterator(*m_xBasicBoxIter, *xNewEntry);
+                    nDepth = m_xBasicBox->get_iter_depth(*m_xBasicBoxIter);
                 }
             }
-            SaveSetCurEntry( *m_pBasicBox, pNewEntry );
+            while (bCurEntry && (nDepth < 2));
+            SaveSetCurEntry(m_xBasicBox->get_widget(), *xNewEntry);
         }
-        if ( m_pMacroBox->GetEntryCount() )
+        auto nCount = m_xMacroBox->n_children();
+        if (nCount)
         {
-            OUString aEdtText( m_pMacroNameEdit->GetText() );
+            OUString aEdtText(m_xMacroNameEdit->get_text());
             bool bFound = false;
-            for ( sal_uLong n = 0; n < m_pMacroBox->GetEntryCount(); n++ )
+            bool bValidIter = m_xMacroBox->get_iter_first(*m_xMacroBoxIter);
+            while (bValidIter)
             {
-                SvTreeListEntry* pEntry = m_pMacroBox->GetEntry( n );
-                DBG_ASSERT( pEntry, "Entry ?!" );
-                if ( m_pMacroBox->GetEntryText( pEntry ).equalsIgnoreAsciiCase( aEdtText ) )
+                if (m_xMacroBox->get_text(*m_xMacroBoxIter).equalsIgnoreAsciiCase(aEdtText))
                 {
-                    SaveSetCurEntry(*m_pMacroBox, pEntry);
+                    SaveSetCurEntry(*m_xMacroBox, *m_xMacroBoxIter);
                     bFound = true;
                     break;
                 }
+                bValidIter = m_xMacroBox->iter_next_sibling(*m_xMacroBoxIter);
             }
-            if ( !bFound )
+            if (!bFound)
             {
-                SvTreeListEntry* pEntry = m_pMacroBox->FirstSelected();
+                bValidIter = m_xMacroBox->get_selected(m_xMacroBoxIter.get());
                 // if the entry exists ->Select ->Description...
-                if ( pEntry )
-                    m_pMacroBox->Select( pEntry, false );
+                if (bValidIter)
+                    m_xMacroBox->unselect(*m_xMacroBoxIter);
             }
         }
     }
@@ -604,11 +564,10 @@ IMPL_LINK_NOARG( MacroChooser, EditModifyHdl, Edit&, void )
     CheckButtons();
 }
 
-
-IMPL_LINK( MacroChooser, ButtonHdl, Button *, pButton, void )
+IMPL_LINK(MacroChooser, ButtonHdl, weld::Button&, rButton, void)
 {
     // apart from New/Record the Description is done by LoseFocus
-    if (pButton == m_pRunButton)
+    if (&rButton == m_xRunButton.get())
     {
         StoreMacroDescription();
 
@@ -624,7 +583,7 @@ IMPL_LINK( MacroChooser, ButtonHdl, Button *, pButton, void )
                 ScriptDocument aDocument( ScriptDocument::getDocumentForBasicManager( pBasMgr ) );
                 if ( aDocument.isDocument() && !aDocument.allowMacros() )
                 {
-                    std::unique_ptr<weld::MessageDialog> xError(Application::CreateMessageDialog(GetFrameWeld(),
+                    std::unique_ptr<weld::MessageDialog> xError(Application::CreateMessageDialog(m_xDialog.get(),
                                                                 VclMessageType::Warning, VclButtonsType::Ok, IDEResId(RID_STR_CANNOTRUNMACRO)));
                     xError->run();
                     return;
@@ -633,32 +592,32 @@ IMPL_LINK( MacroChooser, ButtonHdl, Button *, pButton, void )
         }
         else if (nMode == Recording )
         {
-            if ( !IsValidSbxName(m_pMacroNameEdit->GetText()) )
+            if ( !IsValidSbxName(m_xMacroNameEdit->get_text()) )
             {
-                std::unique_ptr<weld::MessageDialog> xError(Application::CreateMessageDialog(GetFrameWeld(),
+                std::unique_ptr<weld::MessageDialog> xError(Application::CreateMessageDialog(m_xDialog.get(),
                                                             VclMessageType::Warning, VclButtonsType::Ok, IDEResId(RID_STR_BADSBXNAME)));
                 xError->run();
-                m_pMacroNameEdit->SetSelection( Selection( 0, m_pMacroNameEdit->GetText().getLength() ) );
-                m_pMacroNameEdit->GrabFocus();
+                m_xMacroNameEdit->select_region(0, -1);
+                m_xMacroNameEdit->grab_focus();
                 return;
             }
 
             SbMethod* pMethod = GetMacro();
-            if (pMethod && !QueryReplaceMacro(pMethod->GetName(), GetFrameWeld()))
+            if (pMethod && !QueryReplaceMacro(pMethod->GetName(), m_xDialog.get()))
                 return;
         }
 
-        EndDialog(Macro_OkRun);
+        m_xDialog->response(Macro_OkRun);
     }
-    else if (pButton == m_pCloseButton)
+    else if (&rButton == m_xCloseButton.get())
     {
         StoreMacroDescription();
-        EndDialog(Macro_Close);
+        m_xDialog->response(Macro_Close);
     }
-    else if ((pButton == m_pEditButton) || (pButton == m_pDelButton))
+    else if (&rButton == m_xEditButton.get() || &rButton == m_xDelButton.get() || &rButton == m_xNewButton.get())
     {
-        SvTreeListEntry* pCurEntry = m_pBasicBox->GetCurEntry();
-        EntryDescriptor aDesc = m_pBasicBox->GetEntryDescriptor(pCurEntry);
+        m_xBasicBox->get_cursor(m_xBasicBoxIter.get());
+        EntryDescriptor aDesc = m_xBasicBox->GetEntryDescriptor(m_xBasicBoxIter.get());
         const ScriptDocument& aDocument( aDesc.GetDocument() );
         DBG_ASSERT( aDocument.isAlive(), "MacroChooser::ButtonHdl: no document, or document is dead!" );
         if ( !aDocument.isAlive() )
@@ -674,11 +633,10 @@ IMPL_LINK( MacroChooser, ButtonHdl, Button *, pButton, void )
         }
         const OUString& aSub( aDesc.GetMethodName() );
         SfxMacroInfoItem aInfoItem( SID_BASICIDE_ARG_MACROINFO, pBasMgr, aLib, aMod, aSub, OUString() );
-        if (pButton == m_pEditButton)
+        if (&rButton == m_xEditButton.get())
         {
-            SvTreeListEntry* pEntry = m_pMacroBox->FirstSelected();
-            if ( pEntry )
-                aInfoItem.SetMethod( m_pMacroBox->GetEntryText( pEntry ) );
+            if (m_xMacroBox->get_selected(m_xMacroBoxIter.get()))
+                aInfoItem.SetMethod(m_xMacroBox->get_text(*m_xMacroBoxIter));
             StoreMacroDescription();
             SfxAllItemSet aArgs( SfxGetpApp()->GetPool() );
             SfxRequest aRequest( SID_BASICIDE_APPEAR, SfxCallMode::SYNCHRON, aArgs );
@@ -689,11 +647,11 @@ IMPL_LINK( MacroChooser, ButtonHdl, Button *, pButton, void )
                 pDispatcher->ExecuteList(SID_BASICIDE_EDITMACRO,
                         SfxCallMode::ASYNCHRON, { &aInfoItem });
             }
-            EndDialog(Macro_Edit);
+            m_xDialog->response(Macro_Edit);
         }
         else
         {
-            if ( bNewDelIsDel )
+            if (&rButton == m_xDelButton.get())
             {
                 DeleteMacro();
                 if (SfxDispatcher* pDispatcher = GetDispatcher())
@@ -703,18 +661,18 @@ IMPL_LINK( MacroChooser, ButtonHdl, Button *, pButton, void )
                 }
                 CheckButtons();
                 UpdateFields();
-                //if ( m_pMacroBox->GetCurEntry() )    // OV-Bug ?
-                //  m_pMacroBox->Select( m_pMacroBox->GetCurEntry() );
+                //if ( m_xMacroBox->GetCurEntry() )    // OV-Bug ?
+                //  m_xMacroBox->Select( m_xMacroBox->GetCurEntry() );
             }
             else
             {
-                if ( !IsValidSbxName(m_pMacroNameEdit->GetText()) )
+                if ( !IsValidSbxName(m_xMacroNameEdit->get_text()) )
                 {
-                    std::unique_ptr<weld::MessageDialog> xError(Application::CreateMessageDialog(GetFrameWeld(),
+                    std::unique_ptr<weld::MessageDialog> xError(Application::CreateMessageDialog(m_xDialog.get(),
                                                                 VclMessageType::Warning, VclButtonsType::Ok, IDEResId(RID_STR_BADSBXNAME)));
                     xError->run();
-                    m_pMacroNameEdit->SetSelection( Selection( 0, m_pMacroNameEdit->GetText().getLength() ) );
-                    m_pMacroNameEdit->GrabFocus();
+                    m_xMacroNameEdit->select_region(0, -1);
+                    m_xMacroNameEdit->grab_focus();
                     return;
                 }
                 SbMethod* pMethod = CreateMacro();
@@ -733,15 +691,15 @@ IMPL_LINK( MacroChooser, ButtonHdl, Button *, pButton, void )
                                 SfxCallMode::ASYNCHRON, { &aInfoItem });
                     }
                     StoreMacroDescription();
-                    EndDialog(Macro_New);
+                    m_xDialog->response(Macro_New);
                 }
             }
         }
     }
-    else if (pButton == m_pAssignButton)
+    else if (&rButton == m_xAssignButton.get())
     {
-        SvTreeListEntry* pCurEntry = m_pBasicBox->GetCurEntry();
-        EntryDescriptor aDesc = m_pBasicBox->GetEntryDescriptor(pCurEntry);
+        m_xBasicBox->get_cursor(m_xBasicBoxIter.get());
+        EntryDescriptor aDesc = m_xBasicBox->GetEntryDescriptor(m_xBasicBoxIter.get());
         const ScriptDocument& aDocument( aDesc.GetDocument() );
         DBG_ASSERT( aDocument.isAlive(), "MacroChooser::ButtonHdl: no document, or document is dead!" );
         if ( !aDocument.isAlive() )
@@ -749,7 +707,7 @@ IMPL_LINK( MacroChooser, ButtonHdl, Button *, pButton, void )
         BasicManager* pBasMgr = aDocument.getBasicManager();
         const OUString& aLib( aDesc.GetLibName() );
         const OUString& aMod( aDesc.GetName() );
-        OUString aSub( m_pMacroNameEdit->GetText() );
+        OUString aSub( m_xMacroNameEdit->get_text() );
         SbMethod* pMethod = GetMacro();
         DBG_ASSERT( pBasMgr, "BasMgr?" );
         DBG_ASSERT( pMethod, "Method?" );
@@ -765,33 +723,34 @@ IMPL_LINK( MacroChooser, ButtonHdl, Button *, pButton, void )
         aRequest.AppendItem( aItem );
         SfxGetpApp()->ExecuteSlot( aRequest );
     }
-    else if (pButton == m_pNewLibButton)
+    else if (&rButton == m_xNewLibButton.get())
     {
-        SvTreeListEntry* pCurEntry = m_pBasicBox->GetCurEntry();
-        EntryDescriptor aDesc = m_pBasicBox->GetEntryDescriptor(pCurEntry);
+        m_xBasicBox->get_cursor(m_xBasicBoxIter.get());
+        EntryDescriptor aDesc = m_xBasicBox->GetEntryDescriptor(m_xBasicBoxIter.get());
         const ScriptDocument& aDocument( aDesc.GetDocument() );
-        createLibImpl(GetFrameWeld(), aDocument, nullptr, m_pBasicBox);
+        createLibImpl(m_xDialog.get(), aDocument, nullptr, m_xBasicBox.get());
     }
-    else if (pButton == m_pNewModButton)
+    else if (&rButton == m_xNewModButton.get())
     {
-        SvTreeListEntry* pCurEntry = m_pBasicBox->GetCurEntry();
-        EntryDescriptor aDesc = m_pBasicBox->GetEntryDescriptor(pCurEntry);
+        m_xBasicBox->get_cursor(m_xBasicBoxIter.get());
+        EntryDescriptor aDesc = m_xBasicBox->GetEntryDescriptor(m_xBasicBoxIter.get());
         const ScriptDocument& aDocument( aDesc.GetDocument() );
         const OUString& aLibName( aDesc.GetLibName() );
-        createModImpl(GetFrameWeld(), aDocument, *m_pBasicBox, aLibName, OUString(), true);
+        createModImpl(m_xDialog.get(), aDocument, *m_xBasicBox, aLibName, OUString(), true);
     }
-    else if (pButton == m_pOrganizeButton)
+    else if (&rButton == m_xOrganizeButton.get())
     {
         StoreMacroDescription();
 
-        EntryDescriptor aDesc = m_pBasicBox->GetEntryDescriptor(m_pBasicBox->FirstSelected());
-        VclPtrInstance< OrganizeDialog > pDlg( this, 0, aDesc );
+        m_xBasicBox->get_selected(m_xBasicBoxIter.get());
+        EntryDescriptor aDesc = m_xBasicBox->GetEntryDescriptor(m_xBasicBoxIter.get());
+        VclPtrInstance< OrganizeDialog > pDlg( nullptr, 0, aDesc ); //TODO
         sal_uInt16 nRet = pDlg->Execute();
         pDlg.reset();
 
         if ( nRet ) // not only closed
         {
-            EndDialog(Macro_Edit);
+            m_xDialog->response(Macro_Edit);
             return;
         }
 
@@ -799,18 +758,17 @@ IMPL_LINK( MacroChooser, ButtonHdl, Button *, pButton, void )
         if ( pShell && pShell->IsAppBasicModified() )
             bForceStoreBasic = true;
 
-        m_pBasicBox->UpdateEntries();
+        m_xBasicBox->UpdateEntries();
     }
 }
 
 
 void MacroChooser::UpdateFields()
 {
-    SvTreeListEntry*    pMacroEntry = m_pMacroBox->GetCurEntry();
-
-    m_pMacroNameEdit->SetText( "" );
-    if ( pMacroEntry )
-        m_pMacroNameEdit->SetText( m_pMacroBox->GetEntryText( pMacroEntry ) );
+    auto nMacroEntry = m_xMacroBox->get_selected_index();
+    m_xMacroNameEdit->set_text("");
+    if (nMacroEntry != -1)
+        m_xMacroNameEdit->set_text(m_xMacroBox->get_text(nMacroEntry));
 }
 
 void MacroChooser::SetMode (Mode nM)
@@ -820,35 +778,39 @@ void MacroChooser::SetMode (Mode nM)
     {
         case All:
         {
-            m_pRunButton->SetText(IDEResId(RID_STR_RUN));
-            EnableButton(*m_pDelButton, true);
-            EnableButton(*m_pOrganizeButton, true);
+            m_xRunButton->set_label(IDEResId(RID_STR_RUN));
+            EnableButton(*m_xDelButton, true);
+            EnableButton(*m_xNewButton, true);
+            EnableButton(*m_xOrganizeButton, true);
             break;
         }
 
         case ChooseOnly:
         {
-            m_pRunButton->SetText(IDEResId(RID_STR_CHOOSE));
-            EnableButton(*m_pDelButton, false);
-            EnableButton(*m_pOrganizeButton, false);
+            m_xRunButton->set_label(IDEResId(RID_STR_CHOOSE));
+            EnableButton(*m_xDelButton, false);
+            EnableButton(*m_xNewButton, false);
+            EnableButton(*m_xOrganizeButton, false);
             break;
         }
 
         case Recording:
         {
-            m_pRunButton->SetText(IDEResId(RID_STR_RECORD));
-            EnableButton(*m_pDelButton, false);
-            EnableButton(*m_pOrganizeButton, false);
-
-            m_pAssignButton->Hide();
-            m_pEditButton->Hide();
-            m_pDelButton->Hide();
-            m_pOrganizeButton->Hide();
-            m_pMacroFromTxT->Hide();
-
-            m_pNewLibButton->Show();
-            m_pNewModButton->Show();
-            m_pMacrosSaveInTxt->Show();
+            m_xRunButton->set_label(IDEResId(RID_STR_RECORD));
+            EnableButton(*m_xDelButton, false);
+            EnableButton(*m_xNewButton, false);
+            EnableButton(*m_xOrganizeButton, false);
+
+            m_xAssignButton->hide();
+            m_xEditButton->hide();
+            m_xDelButton->hide();
+            m_xNewButton->hide();
+            m_xOrganizeButton->hide();
+            m_xMacroFromTxT->hide();
+
+            m_xNewLibButton->show();
+            m_xNewModButton->show();
+            m_xMacrosSaveInTxt->show();
 
             break;
         }
diff --git a/basctl/source/basicide/macrodlg.hxx b/basctl/source/basicide/macrodlg.hxx
index 8a0e1ff16a93..35e54799b734 100644
--- a/basctl/source/basicide/macrodlg.hxx
+++ b/basctl/source/basicide/macrodlg.hxx
@@ -22,22 +22,20 @@
 
 #include <bastype2.hxx>
 #include <sfx2/basedlgs.hxx>
-
 #include <com/sun/star/frame/XFrame.hpp>
-
-#include <vcl/button.hxx>
+#include <vcl/weld.hxx>
 
 namespace basctl
 {
 
 enum MacroExitCode {
-    Macro_Close = 10,
-    Macro_OkRun = 11,
-    Macro_New   = 12,
-    Macro_Edit  = 14,
+    Macro_Close = 110,
+    Macro_OkRun = 111,
+    Macro_New   = 112,
+    Macro_Edit  = 114,
 };
 
-class MacroChooser : public SfxModalDialog
+class MacroChooser : public SfxDialogController
 {
 public:
     enum Mode {
@@ -47,58 +45,58 @@ public:
     };
 
 private:
-    VclPtr<Edit>                   m_pMacroNameEdit;
-    VclPtr<FixedText>              m_pMacroFromTxT;
-    VclPtr<FixedText>              m_pMacrosSaveInTxt;
-    VclPtr<TreeListBox>            m_pBasicBox;
-    VclPtr<FixedText>              m_pMacrosInTxt;
     OUString                       m_aMacrosInTxtBaseStr;
-    VclPtr<SvTreeListBox>          m_pMacroBox;
-
-    VclPtr<PushButton>             m_pRunButton;
-    VclPtr<CloseButton>            m_pCloseButton;
-    VclPtr<PushButton>             m_pAssignButton;
-    VclPtr<PushButton>             m_pEditButton;
-    VclPtr<PushButton>             m_pDelButton;
-    VclPtr<PushButton>             m_pOrganizeButton;
-    VclPtr<PushButton>             m_pNewLibButton;
-    VclPtr<PushButton>             m_pNewModButton;
 
     // For forwarding to Assign dialog
     ::css::uno::Reference< ::css::frame::XFrame > m_xDocumentFrame;
 
-    bool                    bNewDelIsDel;
     bool                    bForceStoreBasic;
 
     Mode                    nMode;
 
-    DECL_LINK( MacroSelectHdl, SvTreeListBox *, void );
-    DECL_LINK( MacroDoubleClickHdl, SvTreeListBox*, bool );
-    DECL_LINK( BasicSelectHdl, SvTreeListBox *, void );
-    DECL_LINK( EditModifyHdl, Edit&, void );
-    DECL_LINK( ButtonHdl, Button *, void );
+    DECL_LINK(MacroSelectHdl, weld::TreeView&, void);
+    DECL_LINK(MacroDoubleClickHdl, weld::TreeView&, void);
+    DECL_LINK(BasicSelectHdl, weld::TreeView&, void);
+    DECL_LINK(EditModifyHdl, weld::Entry&, void);
+    DECL_LINK(ButtonHdl, weld::Button&, void);
 
     void                CheckButtons();
-    void                SaveSetCurEntry( SvTreeListBox& rBox, SvTreeListEntry* pEntry );
+    void                SaveSetCurEntry(weld::TreeView& rBox, weld::TreeIter& rEntry);
     void                UpdateFields();
 
-    void                EnableButton( Button& rButton, bool bEnable );
+    void                EnableButton(weld::Button& rButton, bool bEnable);
 
     static OUString     GetInfo( SbxVariable* pVar );
 
     void                StoreMacroDescription();
     void                RestoreMacroDescription();
 
+    std::unique_ptr<weld::Entry> m_xMacroNameEdit;
+    std::unique_ptr<weld::Label> m_xMacroFromTxT;
+    std::unique_ptr<weld::Label> m_xMacrosSaveInTxt;
+    std::unique_ptr<SbTreeListBox> m_xBasicBox;
+    std::unique_ptr<weld::TreeIter> m_xBasicBoxIter;
+    std::unique_ptr<weld::Label> m_xMacrosInTxt;
+    std::unique_ptr<weld::TreeView> m_xMacroBox;
+    std::unique_ptr<weld::TreeIter> m_xMacroBoxIter;
+    std::unique_ptr<weld::Button> m_xRunButton;
+    std::unique_ptr<weld::Button> m_xCloseButton;
+    std::unique_ptr<weld::Button> m_xAssignButton;
+    std::unique_ptr<weld::Button> m_xEditButton;
+    std::unique_ptr<weld::Button> m_xDelButton;
+    std::unique_ptr<weld::Button> m_xNewButton;
+    std::unique_ptr<weld::Button> m_xOrganizeButton;
+    std::unique_ptr<weld::Button> m_xNewLibButton;
+    std::unique_ptr<weld::Button> m_xNewModButton;
 public:
-                        MacroChooser( vcl::Window* pParent, const ::css::uno::Reference< ::css::frame::XFrame >& xDocFrame, bool bCreateEntries );
-                        virtual ~MacroChooser() override;
-    virtual void        dispose() override;
+    MacroChooser(weld::Window *pParent, const ::css::uno::Reference< ::css::frame::XFrame >& xDocFrame, bool bCreateEntries);
+    virtual ~MacroChooser() override;
 
     SbMethod*           GetMacro();
     void                DeleteMacro();
     SbMethod*           CreateMacro();
 
-    virtual short       Execute() override;
+    virtual short       run() override;
 
     void                SetMode (Mode);
     Mode                GetMode () const { return nMode; }
diff --git a/basctl/source/basicide/moduldl2.cxx b/basctl/source/basicide/moduldl2.cxx
index 2e13017bb80f..7c16245fd392 100644
--- a/basctl/source/basicide/moduldl2.cxx
+++ b/basctl/source/basicide/moduldl2.cxx
@@ -698,7 +698,7 @@ IMPL_LINK( LibPage, CheckPasswordHdl, SvxPasswordDialog *, pDlg, bool )
 
 void LibPage::NewLib()
 {
-    createLibImpl(GetFrameWeld(), m_aCurDocument, m_pLibBox, nullptr);
+    createLibImpl(GetFrameWeld(), m_aCurDocument, m_pLibBox, static_cast<SbTreeListBox*>(nullptr));
 }
 
 void LibPage::InsertLib()
@@ -1552,6 +1552,106 @@ void createLibImpl(weld::Window* pWin, const ScriptDocument& rDocument,
         }
     }
 }
+
+void createLibImpl(weld::Window* pWin, const ScriptDocument& rDocument,
+                   CheckBox* pLibBox, SbTreeListBox* pBasicBox)
+{
+    OSL_ENSURE( rDocument.isAlive(), "createLibImpl: invalid document!" );
+    if ( !rDocument.isAlive() )
+        return;
+
+    // create library name
+    OUString aLibName;
+    bool bValid = false;
+    sal_Int32 i = 1;
+    while ( !bValid )
+    {
+        aLibName = "Library" + OUString::number( i );
+        if ( !rDocument.hasLibrary( E_SCRIPTS, aLibName ) && !rDocument.hasLibrary( E_DIALOGS, aLibName ) )
+            bValid = true;
+        i++;
+    }
+
+    NewObjectDialog aNewDlg(pWin, ObjectMode::Library);
+    aNewDlg.SetObjectName(aLibName);
+
+    if (aNewDlg.run())
+    {
+        if (!aNewDlg.GetObjectName().isEmpty())
+            aLibName = aNewDlg.GetObjectName();
+
+        if ( aLibName.getLength() > 30 )
+        {
+            std::unique_ptr<weld::MessageDialog> xErrorBox(Application::CreateMessageDialog(pWin,
+                                                           VclMessageType::Warning, VclButtonsType::Ok, IDEResId(RID_STR_LIBNAMETOLONG)));
+            xErrorBox->run();
+        }
+        else if ( !IsValidSbxName( aLibName ) )
+        {
+            std::unique_ptr<weld::MessageDialog> xErrorBox(Application::CreateMessageDialog(pWin,
+                                                           VclMessageType::Warning, VclButtonsType::Ok, IDEResId(RID_STR_BADSBXNAME)));
+            xErrorBox->run();
+        }
+        else if ( rDocument.hasLibrary( E_SCRIPTS, aLibName ) || rDocument.hasLibrary( E_DIALOGS, aLibName ) )
+        {
+            std::unique_ptr<weld::MessageDialog> xErrorBox(Application::CreateMessageDialog(pWin,
+                                                           VclMessageType::Warning, VclButtonsType::Ok, IDEResId(RID_STR_SBXNAMEALLREADYUSED2)));
+            xErrorBox->run();
+        }
+        else
+        {
+            try
+            {
+                // create module and dialog library
+                Reference< container::XNameContainer > xModLib( rDocument.getOrCreateLibrary( E_SCRIPTS, aLibName ) );
+                Reference< container::XNameContainer > xDlgLib( rDocument.getOrCreateLibrary( E_DIALOGS, aLibName ) );
+
+                if( pLibBox )
+                {
+                    SvTreeListEntry* pEntry = pLibBox->DoInsertEntry( aLibName );
+                    pEntry->SetUserData( new LibUserData( rDocument ) );
+                    pLibBox->SetCurEntry( pEntry );
+                }
+
+                // create a module
+                OUString aModName = rDocument.createObjectName( E_SCRIPTS, aLibName );
+                OUString sModuleCode;
+                if ( !rDocument.createModule( aLibName, aModName, true, sModuleCode ) )
+                    throw Exception("could not create module " + aModName, nullptr);
+
+                SbxItem aSbxItem( SID_BASICIDE_ARG_SBX, rDocument, aLibName, aModName, TYPE_MODULE );
+                if (SfxDispatcher* pDispatcher = GetDispatcher())
+                    pDispatcher->ExecuteList(SID_BASICIDE_SBXINSERTED,
+                                          SfxCallMode::SYNCHRON, { &aSbxItem });
+
+                if( pBasicBox )
+                {
+                    std::unique_ptr<weld::TreeIter> xIter(pBasicBox->make_iterator(nullptr));
+                    bool bValidIter = pBasicBox->get_cursor(xIter.get());
+                    std::unique_ptr<weld::TreeIter> xRootEntry(pBasicBox->make_iterator(xIter.get()));
+                    while (bValidIter)
+                    {
+                        pBasicBox->copy_iterator(*xIter, *xRootEntry);
+                        bValidIter = pBasicBox->iter_parent(*xIter);
+                    }
+
+                    BrowseMode nMode = pBasicBox->GetMode();
+                    bool bDlgMode = ( nMode & BrowseMode::Dialogs ) && !( nMode & BrowseMode::Modules );
+                    const OUString sId = bDlgMode ? OUStringLiteral(RID_BMP_DLGLIB) : OUStringLiteral(RID_BMP_MODLIB);
+                    pBasicBox->AddEntry(aLibName, sId, xRootEntry.get(), false, o3tl::make_unique<Entry>(OBJ_TYPE_LIBRARY));
+                    pBasicBox->AddEntry(aModName, RID_BMP_MODULE, xRootEntry.get(), false, o3tl::make_unique<Entry>(OBJ_TYPE_MODULE));
+                    pBasicBox->set_cursor(*xRootEntry);
+                    pBasicBox->select(*xRootEntry);
+                }
+            }
+            catch (const uno::Exception& )
+            {
+                DBG_UNHANDLED_EXCEPTION("basctl.basicide");
+            }
+        }
+    }
+}
+
 } // namespace basctl
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/basctl/source/basicide/moduldlg.cxx b/basctl/source/basicide/moduldlg.cxx
index 1a2af91d35de..1f525beb7c26 100644
--- a/basctl/source/basicide/moduldlg.cxx
+++ b/basctl/source/basicide/moduldlg.cxx
@@ -1055,6 +1055,102 @@ SbModule* createModImpl(weld::Window* pWin, const ScriptDocument& rDocument,
     return pModule;
 }
 
+SbModule* createModImpl(weld::Window* pWin, const ScriptDocument& rDocument,
+    SbTreeListBox& rBasicBox, const OUString& rLibName, const OUString& _aModName, bool bMain )
+{
+    OSL_ENSURE( rDocument.isAlive(), "createModImpl: invalid document!" );
+    if ( !rDocument.isAlive() )
+        return nullptr;
+
+    SbModule* pModule = nullptr;
+
+    OUString aLibName( rLibName );
+    if ( aLibName.isEmpty() )
+        aLibName = "Standard" ;
+    rDocument.getOrCreateLibrary( E_SCRIPTS, aLibName );
+    OUString aModName = _aModName;
+    if ( aModName.isEmpty() )
+        aModName = rDocument.createObjectName( E_SCRIPTS, aLibName );
+
+    NewObjectDialog aNewDlg(pWin, ObjectMode::Module, true);
+    aNewDlg.SetObjectName(aModName);
+
+    if (aNewDlg.run() != RET_CANCEL)
+    {
+        if (!aNewDlg.GetObjectName().isEmpty())
+            aModName = aNewDlg.GetObjectName();
+
+        try
+        {
+            OUString sModuleCode;
+            // the module has existed
+            if( rDocument.hasModule( aLibName, aModName ) )
+                return nullptr;
+            rDocument.createModule( aLibName, aModName, bMain, sModuleCode );
+            BasicManager* pBasMgr = rDocument.getBasicManager();
+            StarBASIC* pBasic = pBasMgr? pBasMgr->GetLib( aLibName ) : nullptr;
+                if ( pBasic )
+                    pModule = pBasic->FindModule( aModName );
+                SbxItem aSbxItem( SID_BASICIDE_ARG_SBX, rDocument, aLibName, aModName, TYPE_MODULE );
+            if (SfxDispatcher* pDispatcher = GetDispatcher())
+            {
+                pDispatcher->ExecuteList( SID_BASICIDE_SBXINSERTED,
+                      SfxCallMode::SYNCHRON, { &aSbxItem });
+            }
+            LibraryLocation eLocation = rDocument.getLibraryLocation( aLibName );
+            std::unique_ptr<weld::TreeIter> xIter(rBasicBox.make_iterator());
+            bool bRootEntry = rBasicBox.FindRootEntry(rDocument, eLocation, *xIter);
+            if (bRootEntry)
+            {
+                if (!rBasicBox.get_row_expanded(*xIter))
+                    rBasicBox.expand_row(*xIter);
+                bool bLibEntry = rBasicBox.FindEntry(aLibName, OBJ_TYPE_LIBRARY, *xIter);
+                DBG_ASSERT( bLibEntry, "LibEntry not found!" );
+                if (bLibEntry)
+                {

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list