[Libreoffice-commits] core.git: dbaccess/source extensions/source extensions/uiconfig include/svtools include/svx svx/source

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Fri Aug 30 20:19:38 UTC 2019


 dbaccess/source/ext/macromigration/macromigrationpages.cxx |    2 
 dbaccess/source/ext/macromigration/macromigrationpages.hxx |    2 
 extensions/source/abpilot/abpfinalpage.cxx                 |  115 ++---
 extensions/source/abpilot/abpfinalpage.hxx                 |   35 -
 extensions/source/abpilot/abspage.cxx                      |   29 -
 extensions/source/abpilot/abspage.hxx                      |    7 
 extensions/source/abpilot/abspilot.cxx                     |   92 +---
 extensions/source/abpilot/abspilot.hxx                     |   10 
 extensions/source/abpilot/admininvokationimpl.cxx          |   10 
 extensions/source/abpilot/admininvokationimpl.hxx          |    7 
 extensions/source/abpilot/admininvokationpage.cxx          |   30 -
 extensions/source/abpilot/admininvokationpage.hxx          |   11 
 extensions/source/abpilot/fieldmappingimpl.cxx             |    9 
 extensions/source/abpilot/fieldmappingimpl.hxx             |    5 
 extensions/source/abpilot/fieldmappingpage.cxx             |   33 -
 extensions/source/abpilot/fieldmappingpage.hxx             |   16 
 extensions/source/abpilot/tableselectionpage.cxx           |   43 --
 extensions/source/abpilot/tableselectionpage.hxx           |   16 
 extensions/source/abpilot/typeselectionpage.cxx            |   77 +--
 extensions/source/abpilot/typeselectionpage.hxx            |   28 -
 extensions/source/abpilot/unodialogabp.cxx                 |    7 
 extensions/uiconfig/sabpilot/ui/datasourcepage.ui          |   65 +--
 extensions/uiconfig/sabpilot/ui/fieldassignpage.ui         |   35 -
 extensions/uiconfig/sabpilot/ui/invokeadminpage.ui         |   38 -
 extensions/uiconfig/sabpilot/ui/selecttablepage.ui         |   63 ++-
 extensions/uiconfig/sabpilot/ui/selecttypepage.ui          |   32 -
 include/svtools/inettbc.hxx                                |    1 
 include/svx/databaselocationinput.hxx                      |   53 ++
 svx/source/form/databaselocationinput.cxx                  |  259 +++++++++++--
 29 files changed, 638 insertions(+), 492 deletions(-)

New commits:
commit 69fbf74d5bf9c474a6ec04101426dfe79b4ad9bf
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Thu Aug 29 20:17:53 2019 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Fri Aug 30 22:18:37 2019 +0200

    weld addressbook wizard
    
    Change-Id: I118ed34ddaf7d62e5bb15497399cd10533339328
    Reviewed-on: https://gerrit.libreoffice.org/78287
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/dbaccess/source/ext/macromigration/macromigrationpages.cxx b/dbaccess/source/ext/macromigration/macromigrationpages.cxx
index 3820a688ba1e..6c49497934de 100644
--- a/dbaccess/source/ext/macromigration/macromigrationpages.cxx
+++ b/dbaccess/source/ext/macromigration/macromigrationpages.cxx
@@ -81,7 +81,7 @@ namespace dbmm
         get(m_pStartMigration, "startmigrate");
         get(m_pBrowseSaveAsLocation, "browse");
         get(m_pSaveAsLocation, "location");
-        m_pLocationController.reset( new svx::DatabaseLocationInputController(
+        m_pLocationController.reset( new svx::SvxDatabaseLocationInputController(
             _rParentDialog.getComponentContext(), *m_pSaveAsLocation, *m_pBrowseSaveAsLocation) );
 
         m_pSaveAsLocation->SetModifyHdl( LINK( this, SaveDBDocPage, OnLocationModified ) );
diff --git a/dbaccess/source/ext/macromigration/macromigrationpages.hxx b/dbaccess/source/ext/macromigration/macromigrationpages.hxx
index 171f1d8cad61..f04b41fa6a70 100644
--- a/dbaccess/source/ext/macromigration/macromigrationpages.hxx
+++ b/dbaccess/source/ext/macromigration/macromigrationpages.hxx
@@ -83,7 +83,7 @@ namespace dbmm
         VclPtr< ::svt::OFileURLControl>  m_pSaveAsLocation;
         VclPtr<PushButton>             m_pBrowseSaveAsLocation;
         VclPtr<FixedText>              m_pStartMigration;
-        std::unique_ptr<svx::DatabaseLocationInputController> m_pLocationController;
+        std::unique_ptr<svx::SvxDatabaseLocationInputController> m_pLocationController;
 
         // IWizardPageController overridables
         virtual void        initializePage() override;
diff --git a/extensions/source/abpilot/abpfinalpage.cxx b/extensions/source/abpilot/abpfinalpage.cxx
index e32374b7ed43..730b669e4062 100644
--- a/extensions/source/abpilot/abpfinalpage.cxx
+++ b/extensions/source/abpilot/abpfinalpage.cxx
@@ -42,28 +42,30 @@ namespace abp
         return pFilter;
     }
 
-    FinalPage::FinalPage( OAddressBookSourcePilot* _pParent )
-        : AddressBookSourcePage(_pParent, "DataSourcePage",
-            "modules/sabpilot/ui/datasourcepage.ui")
-    {
-        get(m_pLocation, "location");
-        get(m_pBrowse, "browse");
-        get(m_pRegisterName, "available");
-        get(m_pEmbed, "embed");
-        get(m_pNameLabel, "nameft");
-        get(m_pLocationLabel, "locationft");
-        get(m_pName, "name");
-        get(m_pDuplicateNameError, "warning");
-        m_pLocationController.reset( new svx::DatabaseLocationInputController(_pParent->getORB(),
-            *m_pLocation, *m_pBrowse) );
-
-        m_pName->SetModifyHdl( LINK(this, FinalPage, OnNameModified) );
-        m_pLocation->SetModifyHdl( LINK(this, FinalPage, OnNameModified) );
-        m_pRegisterName->SetClickHdl( LINK( this, FinalPage, OnRegister ) );
-        m_pRegisterName->Check();
-        m_pEmbed->SetClickHdl( LINK( this, FinalPage, OnEmbed ) );
-        m_pEmbed->Check();
-        OnEmbed(m_pEmbed);
+    FinalPage::FinalPage(OAddressBookSourcePilot* pDialog, TabPageParent pPageParent)
+        : AddressBookSourcePage(pDialog, pPageParent, "modules/sabpilot/ui/datasourcepage.ui",
+                                "DataSourcePage")
+        , m_xLocation(new URLBox(m_xBuilder->weld_combo_box("location")))
+        , m_xBrowse(m_xBuilder->weld_button("browse"))
+        , m_xRegisterName(m_xBuilder->weld_check_button("available"))
+        , m_xEmbed(m_xBuilder->weld_check_button("embed"))
+        , m_xNameLabel(m_xBuilder->weld_label("nameft"))
+        , m_xLocationLabel(m_xBuilder->weld_label("locationft"))
+        , m_xName(m_xBuilder->weld_entry("name"))
+        , m_xDuplicateNameError(m_xBuilder->weld_label("warning"))
+    {
+        m_xLocation->SetSmartProtocol(INetProtocol::File);
+        m_xLocation->DisableHistory();
+
+        m_xLocationController.reset( new svx::DatabaseLocationInputController(pDialog->getORB(),
+            *m_xLocation, *m_xBrowse, *pPageParent.GetFrameWeld()) );
+
+        m_xName->connect_changed( LINK(this, FinalPage, OnEntryNameModified) );
+        m_xLocation->connect_changed( LINK(this, FinalPage, OnComboNameModified) );
+        m_xRegisterName->connect_clicked( LINK( this, FinalPage, OnRegister ) );
+        m_xRegisterName->set_active(true);
+        m_xEmbed->connect_clicked( LINK( this, FinalPage, OnEmbed ) );
+        m_xEmbed->set_active(true);
     }
 
     FinalPage::~FinalPage()
@@ -73,21 +75,13 @@ namespace abp
 
     void FinalPage::dispose()
     {
-        m_pLocationController.reset();
-        m_pLocation.clear();
-        m_pBrowse.clear();
-        m_pRegisterName.clear();
-        m_pEmbed.clear();
-        m_pNameLabel.clear();
-        m_pLocationLabel.clear();
-        m_pName.clear();
-        m_pDuplicateNameError.clear();
+        m_xLocationController.reset();
         AddressBookSourcePage::dispose();
     }
 
     bool FinalPage::isValidName() const
     {
-        OUString sCurrentName(m_pName->GetText());
+        OUString sCurrentName(m_xName->get_text());
 
         if (sCurrentName.isEmpty())
             // the name must not be empty
@@ -122,16 +116,16 @@ namespace abp
         }
         OSL_ENSURE( aURL.GetProtocol() != INetProtocol::NotValid ,"No valid file name!");
         rSettings.sDataSourceName = aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE );
-        m_pLocationController->setURL( rSettings.sDataSourceName );
+        m_xLocationController->setURL( rSettings.sDataSourceName );
         OUString sName = aURL.getName( );
         sal_Int32 nPos = sName.indexOf(aURL.GetFileExtension());
         if ( nPos != -1 )
         {
             sName = sName.replaceAt(nPos-1, 4, "");
         }
-        m_pName->SetText(sName);
+        m_xName->set_text(sName);
 
-        OnRegister(m_pRegisterName);
+        OnRegister(*m_xRegisterName);
     }
 
 
@@ -142,28 +136,26 @@ namespace abp
         setFields();
     }
 
-
     bool FinalPage::commitPage( ::vcl::WizardTypes::CommitPageReason _eReason )
     {
         if (!AddressBookSourcePage::commitPage(_eReason))
             return false;
 
         if  (   ( ::vcl::WizardTypes::eTravelBackward != _eReason )
-            &&  ( !m_pLocationController->prepareCommit() )
+            &&  ( !m_xLocationController->prepareCommit() )
             )
             return false;
 
         AddressSettings& rSettings = getSettings();
-        rSettings.sDataSourceName = m_pLocationController->getURL();
-        rSettings.bRegisterDataSource = m_pRegisterName->IsChecked();
+        rSettings.sDataSourceName = m_xLocationController->getURL();
+        rSettings.bRegisterDataSource = m_xRegisterName->get_active();
         if ( rSettings.bRegisterDataSource )
-            rSettings.sRegisteredDataSourceName = m_pName->GetText();
-        rSettings.bEmbedDataSource = m_pEmbed->IsChecked();
+            rSettings.sRegisteredDataSourceName = m_xName->get_text();
+        rSettings.bEmbedDataSource = m_xEmbed->get_active();
 
         return true;
     }
 
-
     void FinalPage::ActivatePage()
     {
         AddressBookSourcePage::ActivatePage();
@@ -173,12 +165,13 @@ namespace abp
         aContext.getDataSourceNames( m_aInvalidDataSourceNames );
 
         // give the name edit the focus
-        m_pLocation->GrabFocus();
+        m_xLocation->grab_focus();
 
         // default the finish button
         getDialog()->defaultButton( WizardButtonFlags::FINISH );
-    }
 
+        OnEmbed(*m_xEmbed);
+    }
 
     void FinalPage::DeactivatePage()
     {
@@ -196,41 +189,43 @@ namespace abp
         return false;
     }
 
-
     void FinalPage::implCheckName()
     {
         bool bValidName = isValidName();
-        bool bEmptyName = m_pName->GetText().isEmpty();
-        bool bEmptyLocation = m_pLocation->GetText().isEmpty();
+        bool bEmptyName = m_xName->get_text().isEmpty();
+        bool bEmptyLocation = m_xLocation->get_active_text().isEmpty();
 
         // enable or disable the finish button
-        getDialog()->enableButtons( WizardButtonFlags::FINISH, !bEmptyLocation && (!m_pRegisterName->IsChecked() || bValidName) );
+        getDialog()->enableButtons( WizardButtonFlags::FINISH, !bEmptyLocation && (!m_xRegisterName->get_active() || bValidName) );
 
         // show the error message for an invalid name
-        m_pDuplicateNameError->Show( !bValidName && !bEmptyName );
+        m_xDuplicateNameError->set_visible(!bValidName && !bEmptyName);
     }
 
-
-    IMPL_LINK_NOARG( FinalPage, OnNameModified, Edit&, void )
+    IMPL_LINK_NOARG( FinalPage, OnEntryNameModified, weld::Entry&, void )
     {
         implCheckName();
     }
 
+    IMPL_LINK_NOARG( FinalPage, OnComboNameModified, weld::ComboBox&, void )
+    {
+        implCheckName();
+    }
 
-    IMPL_LINK_NOARG(FinalPage, OnRegister, Button*, void)
+    IMPL_LINK_NOARG(FinalPage, OnRegister, weld::Button&, void)
     {
-        bool bEnable = m_pRegisterName->IsChecked();
-        m_pNameLabel->Enable(bEnable);
-        m_pName->Enable(bEnable);
+        bool bEnable = m_xRegisterName->get_active();
+        m_xNameLabel->set_sensitive(bEnable);
+        m_xName->set_sensitive(bEnable);
         implCheckName();
     }
 
-    IMPL_LINK_NOARG(FinalPage, OnEmbed, Button*, void)
+    IMPL_LINK_NOARG(FinalPage, OnEmbed, weld::Button&, void)
     {
-        bool bEmbed = m_pEmbed->IsChecked();
-        m_pLocationLabel->Enable(!bEmbed);
-        m_pLocation->Enable(!bEmbed);
-        m_pBrowse->Enable(!bEmbed);
+        bool bEmbed = m_xEmbed->get_active();
+        m_xLocationLabel->set_sensitive(!bEmbed);
+        m_xLocation->set_sensitive(!bEmbed);
+        m_xBrowse->set_sensitive(!bEmbed);
     }
 
 }   // namespace abp
diff --git a/extensions/source/abpilot/abpfinalpage.hxx b/extensions/source/abpilot/abpfinalpage.hxx
index 719d894be872..c44f6659e3ca 100644
--- a/extensions/source/abpilot/abpfinalpage.hxx
+++ b/extensions/source/abpilot/abpfinalpage.hxx
@@ -34,22 +34,22 @@ namespace abp
 
     class FinalPage final : public AddressBookSourcePage
     {
-        VclPtr< ::svt::OFileURLControl>  m_pLocation;
-        VclPtr<PushButton>       m_pBrowse;
-        VclPtr<CheckBox>         m_pRegisterName;
-        VclPtr<CheckBox>         m_pEmbed;
-        VclPtr<FixedText>        m_pNameLabel;
-        VclPtr<FixedText>        m_pLocationLabel;
-        VclPtr<Edit>             m_pName;
-        VclPtr<FixedText>        m_pDuplicateNameError;
+        std::unique_ptr<URLBox> m_xLocation;
+        std::unique_ptr<weld::Button> m_xBrowse;
+        std::unique_ptr<weld::CheckButton> m_xRegisterName;
+        std::unique_ptr<weld::CheckButton> m_xEmbed;
+        std::unique_ptr<weld::Label> m_xNameLabel;
+        std::unique_ptr<weld::Label> m_xLocationLabel;
+        std::unique_ptr<weld::Entry> m_xName;
+        std::unique_ptr<weld::Label> m_xDuplicateNameError;
 
         std::unique_ptr<svx::DatabaseLocationInputController>
-                        m_pLocationController;
+                        m_xLocationController;
 
         StringBag       m_aInvalidDataSourceNames;
 
     public:
-        explicit FinalPage(OAddressBookSourcePilot* _pParent);
+        explicit FinalPage(OAddressBookSourcePilot* pDialog, TabPageParent pPageParent);
         virtual ~FinalPage() override;
         virtual void dispose() override;
 
@@ -65,19 +65,18 @@ namespace abp
         // OImportPage overridables
         virtual bool        canAdvance() const override;
 
-        DECL_LINK( OnNameModified, Edit&, void );
-        DECL_LINK(OnRegister, Button*, void);
-        DECL_LINK(OnEmbed, Button*, void);
+        DECL_LINK(OnEntryNameModified, weld::Entry&, void);
+        DECL_LINK(OnComboNameModified, weld::ComboBox&, void);
+        DECL_LINK(OnRegister, weld::Button&, void);
+        DECL_LINK(OnEmbed, weld::Button&, void);
 
-        bool    isValidName() const;
-        void        implCheckName();
-        void        setFields();
+        bool isValidName() const;
+        void implCheckName();
+        void setFields();
     };
 
-
 }   // namespace abp
 
-
 #endif // INCLUDED_EXTENSIONS_SOURCE_ABPILOT_ABPFINALPAGE_HXX
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/abpilot/abspage.cxx b/extensions/source/abpilot/abspage.cxx
index b62d13f52b17..33770402a664 100644
--- a/extensions/source/abpilot/abspage.cxx
+++ b/extensions/source/abpilot/abspage.cxx
@@ -29,48 +29,49 @@ namespace abp
     using namespace ::com::sun::star::uno;
     using namespace ::com::sun::star::lang;
 
-    AddressBookSourcePage::AddressBookSourcePage(OAddressBookSourcePilot* _pParent, const OString& rID, const OUString& rUIXMLDescription)
-        :AddressBookSourcePage_Base(_pParent, rID, rUIXMLDescription)
+    AddressBookSourcePage::AddressBookSourcePage(OAddressBookSourcePilot* pParent, TabPageParent pPageParent, const OUString& rUIXMLDescription, const OString& rID)
+        : AddressBookSourcePage_Base(pPageParent, rUIXMLDescription, rID)
+        , m_pDialog(pParent)
     {
     }
 
+    void AddressBookSourcePage::ActivatePage()
+    {
+        AddressBookSourcePage_Base::ActivatePage();
+        m_pDialog->updateTravelUI();
+    }
+
     void AddressBookSourcePage::DeactivatePage()
     {
         AddressBookSourcePage_Base::DeactivatePage();
-        getDialog()->enableButtons(WizardButtonFlags::NEXT, true);
+        m_pDialog->enableButtons(WizardButtonFlags::NEXT, true);
     }
 
-
     OAddressBookSourcePilot* AddressBookSourcePage::getDialog()
     {
-        return static_cast<OAddressBookSourcePilot*>(GetParent());
+        return m_pDialog;
     }
 
-
     const OAddressBookSourcePilot* AddressBookSourcePage::getDialog() const
     {
-        return static_cast<const OAddressBookSourcePilot*>(GetParent());
+        return m_pDialog;
     }
 
-
     AddressSettings& AddressBookSourcePage::getSettings()
     {
-        return getDialog()->getSettings();
+        return m_pDialog->getSettings();
     }
 
-
     const AddressSettings&  AddressBookSourcePage::getSettings() const
     {
-        return getDialog()->getSettings();
+        return m_pDialog->getSettings();
     }
 
-
     const Reference< XComponentContext > & AddressBookSourcePage::getORB()
     {
-        return getDialog()->getORB();
+        return m_pDialog->getORB();
     }
 
-
 }   // namespace abp
 
 
diff --git a/extensions/source/abpilot/abspage.hxx b/extensions/source/abpilot/abspage.hxx
index 257e9735b858..89f50fbd2112 100644
--- a/extensions/source/abpilot/abspage.hxx
+++ b/extensions/source/abpilot/abspage.hxx
@@ -38,19 +38,22 @@ namespace abp
     /// the base class for all tab pages in the address book source wizard
     class AddressBookSourcePage : public AddressBookSourcePage_Base
     {
+        OAddressBookSourcePilot* m_pDialog;
+
     protected:
-        AddressBookSourcePage(OAddressBookSourcePilot *pParent, const OString& rID, const OUString& rUIXMLDescription);
+        AddressBookSourcePage(OAddressBookSourcePilot *pParent, TabPageParent pPageParent, const OUString& rUIXMLDescription, const OString& rID);
 
     protected:
         // helper
         OAddressBookSourcePilot* getDialog();
-        const OAddressBookSourcePilot*   getDialog() const;
+        const OAddressBookSourcePilot* getDialog() const;
         const css::uno::Reference< css::uno::XComponentContext > &
                                 getORB();
         AddressSettings&        getSettings();
         const AddressSettings&  getSettings() const;
 
         // TabDialog overridables
+        virtual void        ActivatePage() override;
         virtual void        DeactivatePage() override;
     };
 
diff --git a/extensions/source/abpilot/abspilot.cxx b/extensions/source/abpilot/abspilot.cxx
index faf99e5184da..e7d929a8dd98 100644
--- a/extensions/source/abpilot/abspilot.cxx
+++ b/extensions/source/abpilot/abspilot.cxx
@@ -50,21 +50,16 @@ namespace abp
 #define PATH_NO_FIELDS              3
 #define PATH_NO_SETTINGS_NO_FIELDS  4
 
-#define WINDOW_SIZE_X   240
-#define WINDOW_SIZE_Y   185
-
     using namespace ::svt;
     using namespace ::com::sun::star::uno;
     using namespace ::com::sun::star::lang;
 
-    OAddressBookSourcePilot::OAddressBookSourcePilot(vcl::Window* _pParent, const Reference< XComponentContext >& _rxORB)
+    OAddressBookSourcePilot::OAddressBookSourcePilot(weld::Window* _pParent, const Reference< XComponentContext >& _rxORB)
         :OAddressBookSourcePilot_Base( _pParent )
         ,m_xORB(_rxORB)
         ,m_aNewDataSource(_rxORB)
         ,m_eNewDataSourceType( AST_INVALID )
     {
-        SetPageSizePixel(LogicToPixel(Size(WINDOW_SIZE_X, WINDOW_SIZE_Y), MapMode(MapUnit::MapAppFont)));
-
         declarePath( PATH_COMPLETE,
             {STATE_SELECT_ABTYPE,
             STATE_INVOKE_ADMIN_DIALOG,
@@ -90,13 +85,11 @@ namespace abp
             STATE_FINAL_CONFIRM}
         );
 
-        m_pPrevPage->SetHelpId(HID_ABSPILOT_PREVIOUS);
-        m_pNextPage->SetHelpId(HID_ABSPILOT_NEXT);
-        m_pCancel->SetHelpId(HID_ABSPILOT_CANCEL);
-        m_pFinish->SetHelpId(HID_ABSPILOT_FINISH);
-        m_pHelp->SetHelpId(UID_ABSPILOT_HELP);
-
-        m_pCancel->SetClickHdl( LINK( this, OAddressBookSourcePilot, OnCancelClicked) );
+        m_xPrevPage->set_help_id(HID_ABSPILOT_PREVIOUS);
+        m_xNextPage->set_help_id(HID_ABSPILOT_NEXT);
+        m_xCancel->set_help_id(HID_ABSPILOT_CANCEL);
+        m_xFinish->set_help_id(HID_ABSPILOT_FINISH);
+        m_xHelp->set_help_id(UID_ABSPILOT_HELP);
 
         // some initial settings
 #ifdef UNX
@@ -117,12 +110,13 @@ namespace abp
         defaultButton(WizardButtonFlags::NEXT);
         enableButtons(WizardButtonFlags::FINISH, false);
         ActivatePage();
+        m_xAssistant->set_current_page(0);
 
         typeSelectionChanged( m_aSettings.eType );
 
         OUString sDialogTitle = compmodule::ModuleRes(RID_STR_ABSOURCEDIALOGTITLE);
         setTitleBase(sDialogTitle);
-        SetHelpId(HID_ABSPILOT);
+        m_xAssistant->set_help_id(HID_ABSPILOT);
     }
 
     OUString OAddressBookSourcePilot::getStateDisplayName( WizardState _nState ) const
@@ -147,7 +141,6 @@ namespace abp
         return sDisplayName;
     }
 
-
     void OAddressBookSourcePilot::implCommitAll()
     {
         // in real, the data source already exists in the data source context
@@ -169,34 +162,21 @@ namespace abp
         fieldmapping::writeTemplateAddressFieldMapping( getORB(), m_aSettings.aFieldMapping );
     }
 
-
     void OAddressBookSourcePilot::implCleanup()
     {
         if ( m_aNewDataSource.isValid() )
             m_aNewDataSource.remove();
     }
 
-
-    IMPL_LINK_NOARG( OAddressBookSourcePilot, OnCancelClicked, Button*, void )
+    short OAddressBookSourcePilot::run()
     {
-        // do cleanups
-        implCleanup();
-
-        // reset the click hdl
-        m_pCancel->SetClickHdl( Link<Button*, void>() );
-        // simulate the click again - this time, the default handling of the button will strike ....
-        m_pCancel->Click();
-    }
+        short nRet = OAddressBookSourcePilot_Base::run();
 
-
-    bool OAddressBookSourcePilot::Close()
-    {
         implCleanup();
 
-        return OAddressBookSourcePilot_Base::Close();
+        return nRet;
     }
 
-
     bool OAddressBookSourcePilot::onFinish()
     {
         if ( !OAddressBookSourcePilot_Base::onFinish() )
@@ -209,7 +189,6 @@ namespace abp
         return true;
     }
 
-
     void OAddressBookSourcePilot::enterState( WizardState _nState )
     {
         switch ( _nState )
@@ -264,7 +243,7 @@ namespace abp
 
             if ( aTables.empty() )
             {
-                std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(GetFrameWeld(),
+                std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(m_xAssistant.get(),
                                                           VclMessageType::Question, VclButtonsType::YesNo,
                                                           compmodule::ModuleRes(getSettings().eType == AST_EVOLUTION_GROUPWISE ? RID_STR_QRY_NO_EVO_GW : RID_STR_QRY_NOTABLES)));
 
@@ -289,7 +268,6 @@ namespace abp
         return bAllow;
     }
 
-
     void OAddressBookSourcePilot::implDefaultTableName()
     {
         const StringBag& rTableNames = getDataSource().getTableNames();
@@ -314,7 +292,6 @@ namespace abp
             getSettings().sSelectedTable = sGuess;
     }
 
-
     void OAddressBookSourcePilot::implDoAutoFieldMapping()
     {
         DBG_ASSERT( !needManualFieldMapping( ), "OAddressBookSourcePilot::implDoAutoFieldMapping: invalid call!" );
@@ -322,7 +299,6 @@ namespace abp
         fieldmapping::defaultMapping( getORB(), m_aSettings.aFieldMapping );
     }
 
-
     void OAddressBookSourcePilot::implCreateDataSource()
     {
         if (m_aNewDataSource.isValid())
@@ -379,44 +355,52 @@ namespace abp
         m_eNewDataSourceType = m_aSettings.eType;
     }
 
-
     bool OAddressBookSourcePilot::connectToDataSource( bool _bForceReConnect )
     {
         DBG_ASSERT( m_aNewDataSource.isValid(), "OAddressBookSourcePilot::implConnect: invalid current data source!" );
 
-        WaitObject aWaitCursor( this );
+        weld::WaitObject aWaitCursor(m_xAssistant.get());
         if ( _bForceReConnect && m_aNewDataSource.isConnected( ) )
             m_aNewDataSource.disconnect( );
 
-        return m_aNewDataSource.connect(GetFrameWeld());
+        return m_aNewDataSource.connect(m_xAssistant.get());
     }
 
-
     VclPtr<TabPage> OAddressBookSourcePilot::createPage(WizardState _nState)
     {
+        OString sIdent(OString::number(_nState));
+        weld::Container* pPageContainer = m_xAssistant->append_page(sIdent);
+        // TODO eventually pass DialogController as distinct argument instead of bundling into TabPageParent
+        TabPageParent aParent(pPageContainer, this);
+
+        VclPtr<vcl::OWizardPage> pRet;
+
         switch (_nState)
         {
             case STATE_SELECT_ABTYPE:
-                return VclPtr<TypeSelectionPage>::Create( this );
-
+                pRet = VclPtr<TypeSelectionPage>::Create( this, aParent );
+                break;
             case STATE_INVOKE_ADMIN_DIALOG:
-                return VclPtr<AdminDialogInvokationPage>::Create( this );
-
+                pRet = VclPtr<AdminDialogInvokationPage>::Create( this, aParent );
+                break;
             case STATE_TABLE_SELECTION:
-                return VclPtr<TableSelectionPage>::Create( this );
-
+                pRet = VclPtr<TableSelectionPage>::Create( this, aParent );
+                break;
             case STATE_MANUAL_FIELD_MAPPING:
-                return VclPtr<FieldMappingPage>::Create( this );
-
+                pRet = VclPtr<FieldMappingPage>::Create( this, aParent );
+                break;
             case STATE_FINAL_CONFIRM:
-                return VclPtr<FinalPage>::Create( this );
-
+                pRet = VclPtr<FinalPage>::Create( this, aParent );
+                break;
             default:
-                OSL_FAIL("OAddressBookSourcePilot::createPage: invalid state!");
-                return nullptr;
+                assert(false && "OAddressBookSourcePilot::createPage: invalid state!");
+                break;
         }
-    }
 
+        m_xAssistant->set_page_title(sIdent, getStateDisplayName(_nState));
+
+        return pRet;
+    }
 
     void OAddressBookSourcePilot::impl_updateRoadmap( AddressSourceType _eType )
     {
@@ -446,7 +430,6 @@ namespace abp
         );
     }
 
-
     void OAddressBookSourcePilot::typeSelectionChanged( AddressSourceType _eType )
     {
         PathId nCurrentPathID( PATH_COMPLETE );
@@ -469,7 +452,6 @@ namespace abp
         impl_updateRoadmap( _eType );
     }
 
-
 }   // namespace abp
 
 
diff --git a/extensions/source/abpilot/abspilot.hxx b/extensions/source/abpilot/abspilot.hxx
index a161181e2518..2ad80c3cdc77 100644
--- a/extensions/source/abpilot/abspilot.hxx
+++ b/extensions/source/abpilot/abspilot.hxx
@@ -29,7 +29,7 @@
 namespace abp
 {
 
-    typedef ::vcl::RoadmapWizard OAddressBookSourcePilot_Base;
+    typedef ::vcl::RoadmapWizardMachine OAddressBookSourcePilot_Base;
     class OAddressBookSourcePilot final : public OAddressBookSourcePilot_Base
     {
         css::uno::Reference< css::uno::XComponentContext >
@@ -42,9 +42,11 @@ namespace abp
     public:
         /// ctor
         OAddressBookSourcePilot(
-            vcl::Window* _pParent,
+            weld::Window* _pParent,
             const css::uno::Reference< css::uno::XComponentContext >& _rxORB);
 
+        virtual short run() override;
+
         /// get the service factory which was used to create the dialog
         const css::uno::Reference< css::uno::XComponentContext >&
                                 getORB() { return m_xORB; }
@@ -70,10 +72,6 @@ namespace abp
         // RoadmapWizard
         virtual OUString            getStateDisplayName( WizardState _nState ) const override;
 
-        virtual bool    Close() override;
-
-        DECL_LINK( OnCancelClicked, Button*, void );
-
         /** creates a new data source of the type indicated by m_aSettings
             <p>If another data source has been created before, this one is deleted.</p>
         */
diff --git a/extensions/source/abpilot/admininvokationimpl.cxx b/extensions/source/abpilot/admininvokationimpl.cxx
index 4795c05e6b95..6243acce482a 100644
--- a/extensions/source/abpilot/admininvokationimpl.cxx
+++ b/extensions/source/abpilot/admininvokationimpl.cxx
@@ -45,8 +45,8 @@ namespace abp
     using namespace ::com::sun::star::sdbc;
 
     OAdminDialogInvokation::OAdminDialogInvokation(const Reference< XComponentContext >& _rxContext,
-                    const css::uno::Reference< css::beans::XPropertySet >& _rxDataSource
-                    , vcl::Window* _pMessageParent)
+                    const css::uno::Reference< css::beans::XPropertySet >& _rxDataSource,
+                    weld::Window* _pMessageParent)
         :m_xContext(_rxContext)
         ,m_xDataSource(_rxDataSource)
         ,m_pMessageParent(_pMessageParent)
@@ -71,7 +71,7 @@ namespace abp
             // the parameters for the call
             Sequence<Any> aArguments(comphelper::InitAnyPropertySequence(
             {
-                {"ParentWindow", Any(VCLUnoHelper::GetInterface(m_pMessageParent))},
+                {"ParentWindow", Any(m_pMessageParent->GetXWindow())},
                 {"Title", Any(compmodule::ModuleRes(RID_STR_ADMINDIALOGTITLE))},
                 {"InitialSelection", Any(m_xDataSource)}, // the name of the new data source
             }));
@@ -82,7 +82,7 @@ namespace abp
             {
                 // creating the dialog service is potentially expensive (if all the libraries invoked need to be loaded)
                 // so we display a wait cursor
-                WaitObject aWaitCursor(m_pMessageParent);
+                weld::WaitObject aWaitCursor(m_pMessageParent);
                 Reference<XInterface> x = m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(s_sDataSourceTypeChangeDialog, aArguments, m_xContext);
                 xDialog.set( x, UNO_QUERY );
 
@@ -103,7 +103,7 @@ namespace abp
                     return true;
             }
             else
-                ShowServiceNotAvailableError(m_pMessageParent->GetFrameWeld(), s_sAdministrationServiceName, true);
+                ShowServiceNotAvailableError(m_pMessageParent, s_sAdministrationServiceName, true);
         }
         catch(const Exception&)
         {
diff --git a/extensions/source/abpilot/admininvokationimpl.hxx b/extensions/source/abpilot/admininvokationimpl.hxx
index e0124a6ba4df..fb7642ded503 100644
--- a/extensions/source/abpilot/admininvokationimpl.hxx
+++ b/extensions/source/abpilot/admininvokationimpl.hxx
@@ -22,9 +22,8 @@
 
 #include <com/sun/star/uno/XComponentContext.hpp>
 #include <com/sun/star/beans/XPropertySet.hpp>
-#include <vcl/vclptr.hxx>
 
-namespace vcl { class Window; }
+namespace weld { class Window; }
 
 namespace abp
 {
@@ -37,13 +36,13 @@ namespace abp
         css::uno::Reference< css::uno::XComponentContext >
                                                         m_xContext;
         css::uno::Reference< css::beans::XPropertySet > m_xDataSource;
-        VclPtr<vcl::Window>         m_pMessageParent;
+        weld::Window*         m_pMessageParent;
 
     public:
         OAdminDialogInvokation(
             const css::uno::Reference< css::uno::XComponentContext >& _rxContext,
             const css::uno::Reference< css::beans::XPropertySet >& _rDataSource,
-            vcl::Window* _pMessageParent
+            weld::Window* _pMessageParent
         );
 
         bool invokeAdministration();
diff --git a/extensions/source/abpilot/admininvokationpage.cxx b/extensions/source/abpilot/admininvokationpage.cxx
index 4cd97989a108..5658677ef63d 100644
--- a/extensions/source/abpilot/admininvokationpage.cxx
+++ b/extensions/source/abpilot/admininvokationpage.cxx
@@ -23,40 +23,34 @@
 
 namespace abp
 {
-    AdminDialogInvokationPage::AdminDialogInvokationPage( OAddressBookSourcePilot* _pParent )
-        : AddressBookSourcePage(_pParent, "InvokeAdminPage",
-            "modules/sabpilot/ui/invokeadminpage.ui")
+    AdminDialogInvokationPage::AdminDialogInvokationPage(OAddressBookSourcePilot* pDialog, TabPageParent pPageParent)
+        : AddressBookSourcePage(pDialog, pPageParent, "modules/sabpilot/ui/invokeadminpage.ui", "InvokeAdminPage")
+        , m_xInvokeAdminDialog(m_xBuilder->weld_button("settings"))
+        , m_xErrorMessage(m_xBuilder->weld_label("warning"))
     {
-        get(m_pInvokeAdminDialog, "settings");
-        get(m_pErrorMessage, "warning");
-        m_pInvokeAdminDialog->SetClickHdl( LINK(this, AdminDialogInvokationPage, OnInvokeAdminDialog) );
+        m_xInvokeAdminDialog->connect_clicked(LINK(this, AdminDialogInvokationPage, OnInvokeAdminDialog));
     }
+
     AdminDialogInvokationPage::~AdminDialogInvokationPage()
     {
-        disposeOnce();
-    }
-    void AdminDialogInvokationPage::dispose()
-    {
-        m_pInvokeAdminDialog.clear();
-        m_pErrorMessage.clear();
-        AddressBookSourcePage::dispose();
     }
+
     void AdminDialogInvokationPage::ActivatePage()
     {
         AddressBookSourcePage::ActivatePage();
-        m_pInvokeAdminDialog->GrabFocus();
+        m_xInvokeAdminDialog->grab_focus();
     }
 
     void AdminDialogInvokationPage::implUpdateErrorMessage()
     {
         const bool bIsConnected = getDialog()->getDataSource().isConnected();
-        m_pErrorMessage->Show( !bIsConnected );
+        m_xErrorMessage->set_visible( !bIsConnected );
     }
 
     void AdminDialogInvokationPage::initializePage()
     {
         AddressBookSourcePage::initializePage();
-        m_pErrorMessage->Hide();
+        m_xErrorMessage->hide();
             // if we're entering this page, we assume we had no connection trial with this data source
     }
 
@@ -81,9 +75,9 @@ namespace abp
     }
 
     // davido: Do we need it?
-    IMPL_LINK_NOARG( AdminDialogInvokationPage, OnInvokeAdminDialog, Button*, void )
+    IMPL_LINK_NOARG(AdminDialogInvokationPage, OnInvokeAdminDialog, weld::Button&, void)
     {
-        OAdminDialogInvokation aInvokation( getORB(), getDialog()->getDataSource().getDataSource(), getDialog() );
+        OAdminDialogInvokation aInvokation(getORB(), getDialog()->getDataSource().getDataSource(), getDialog()->getDialog());
         if ( aInvokation.invokeAdministration() )
         {
             // try to connect to this data source
diff --git a/extensions/source/abpilot/admininvokationpage.hxx b/extensions/source/abpilot/admininvokationpage.hxx
index 22e8ac21cdb0..c29b3dad75a2 100644
--- a/extensions/source/abpilot/admininvokationpage.hxx
+++ b/extensions/source/abpilot/admininvokationpage.hxx
@@ -27,13 +27,12 @@ namespace abp
 {
     class AdminDialogInvokationPage final : public AddressBookSourcePage
     {
-        VclPtr<PushButton> m_pInvokeAdminDialog;
-        VclPtr<FixedText>  m_pErrorMessage;
+        std::unique_ptr<weld::Button> m_xInvokeAdminDialog;
+        std::unique_ptr<weld::Label> m_xErrorMessage;
 
     public:
-        explicit AdminDialogInvokationPage(OAddressBookSourcePilot* _pParent);
+        explicit AdminDialogInvokationPage(OAddressBookSourcePilot* pDialog, TabPageParent pPageParent);
         virtual ~AdminDialogInvokationPage() override;
-        virtual void dispose() override;
     private:
         // TabDialog overridables
         virtual void        ActivatePage() override;
@@ -42,16 +41,14 @@ namespace abp
         // OImportPage overridables
         virtual bool        canAdvance() const override;
 
-        DECL_LINK( OnInvokeAdminDialog, Button*, void );
+        DECL_LINK( OnInvokeAdminDialog, weld::Button&, void );
 
         void implTryConnect();
         void implUpdateErrorMessage();
     };
 
-
 }   // namespace abp
 
-
 #endif // INCLUDED_EXTENSIONS_SOURCE_ABPILOT_ADMININVOKATIONPAGE_HXX
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/abpilot/fieldmappingimpl.cxx b/extensions/source/abpilot/fieldmappingimpl.cxx
index d1ed34353752..dc81dee64764 100644
--- a/extensions/source/abpilot/fieldmappingimpl.cxx
+++ b/extensions/source/abpilot/fieldmappingimpl.cxx
@@ -26,8 +26,8 @@
 #include <com/sun/star/awt/XWindow.hpp>
 #include <com/sun/star/sdb/CommandType.hpp>
 #include <tools/debug.hxx>
-#include <toolkit/helper/vclunohelper.hxx>
 #include <vcl/stdtext.hxx>
+#include <vcl/weld.hxx>
 #include <com/sun/star/util/AliasProgrammaticPair.hpp>
 #include <strings.hrc>
 #include <componentmodule.hxx>
@@ -55,12 +55,9 @@ namespace abp
     static const char sDriverSettingsNodeName[] = "/org.openoffice.Office.DataAccess/DriverSettings/com.sun.star.comp.sdbc.MozabDriver";
     static const char sAddressBookNodeName[] = "/org.openoffice.Office.DataAccess/AddressBook";
 
-
     namespace fieldmapping
     {
-
-
-        bool invokeDialog( const Reference< XComponentContext >& _rxORB, class vcl::Window* _pParent,
+        bool invokeDialog( const Reference< XComponentContext >& _rxORB, class weld::Window* _pParent,
             const Reference< XPropertySet >& _rxDataSource, AddressSettings& _rSettings )
         {
             _rSettings.aFieldMapping.clear();
@@ -74,7 +71,7 @@ namespace abp
             {
 
                 // create an instance of the dialog service
-                Reference< XWindow > xDialogParent = VCLUnoHelper::GetInterface( _pParent );
+                Reference< XWindow > xDialogParent = _pParent->GetXWindow();
                 OUString sTitle(compmodule::ModuleRes(RID_STR_FIELDDIALOGTITLE));
                 Reference< XExecutableDialog > xDialog = AddressBookSourceDialog::createWithDataSource(_rxORB,
                                                            // the parent window
diff --git a/extensions/source/abpilot/fieldmappingimpl.hxx b/extensions/source/abpilot/fieldmappingimpl.hxx
index 3cbe2919bb3a..4d0b26e9c166 100644
--- a/extensions/source/abpilot/fieldmappingimpl.hxx
+++ b/extensions/source/abpilot/fieldmappingimpl.hxx
@@ -36,8 +36,7 @@ namespace com { namespace sun { namespace star {
         class XPropertySet;
     }
 } } }
-namespace vcl { class Window; }
-
+namespace weld { class Window; }
 
 namespace abp
 {
@@ -59,7 +58,7 @@ namespace abp
         */
         bool invokeDialog(
             const css::uno::Reference< css::uno::XComponentContext >& _rxORB,
-            class vcl::Window* _pParent,
+            class weld::Window* _pParent,
             const css::uno::Reference< css::beans::XPropertySet >& _rxDataSource,
             AddressSettings& _rSettings
         );
diff --git a/extensions/source/abpilot/fieldmappingpage.cxx b/extensions/source/abpilot/fieldmappingpage.cxx
index d0962e8f85c0..93a2ca733bda 100644
--- a/extensions/source/abpilot/fieldmappingpage.cxx
+++ b/extensions/source/abpilot/fieldmappingpage.cxx
@@ -25,58 +25,45 @@
 
 namespace abp
 {
-    FieldMappingPage::FieldMappingPage( OAddressBookSourcePilot* _pParent )
-        : AddressBookSourcePage(_pParent, "FieldAssignPage",
-            "modules/sabpilot/ui/fieldassignpage.ui")
+    FieldMappingPage::FieldMappingPage(OAddressBookSourcePilot* pDialog, TabPageParent pPageParent)
+        : AddressBookSourcePage(pDialog, pPageParent, "modules/sabpilot/ui/fieldassignpage.ui", "FieldAssignPage")
+        , m_xInvokeDialog(m_xBuilder->weld_button("assign"))
+        , m_xHint(m_xBuilder->weld_label("hint"))
     {
-        get(m_pInvokeDialog, "assign");
-        get(m_pHint, "hint");
-
-        m_pInvokeDialog->SetClickHdl( LINK( this, FieldMappingPage, OnInvokeDialog ) );
+        m_xInvokeDialog->connect_clicked(LINK(this, FieldMappingPage, OnInvokeDialog));
     }
 
     FieldMappingPage::~FieldMappingPage()
     {
-        disposeOnce();
-    }
-
-    void FieldMappingPage::dispose()
-    {
-        m_pInvokeDialog.clear();
-        m_pHint.clear();
-        AddressBookSourcePage::dispose();
     }
 
     void FieldMappingPage::ActivatePage()
     {
         AddressBookSourcePage::ActivatePage();
-        m_pInvokeDialog->GrabFocus();
+        m_xInvokeDialog->grab_focus();
     }
 
-
     void FieldMappingPage::initializePage()
     {
         AddressBookSourcePage::initializePage();
         implUpdateHint();
     }
 
-
     void FieldMappingPage::implUpdateHint()
     {
         const AddressSettings& rSettings = getSettings();
         OUString sHint;
         if ( rSettings.aFieldMapping.empty() )
             sHint = compmodule::ModuleRes(RID_STR_NOFIELDSASSIGNED);
-        m_pHint->SetText( sHint );
+        m_xHint->set_label(sHint);
     }
 
-
-    IMPL_LINK_NOARG( FieldMappingPage, OnInvokeDialog, Button*, void )
+    IMPL_LINK_NOARG( FieldMappingPage, OnInvokeDialog, weld::Button&, void )
     {
         AddressSettings& rSettings = getSettings();
 
         // invoke the dialog doing the mapping
-        if ( fieldmapping::invokeDialog( getORB(), this, getDialog()->getDataSource().getDataSource(), rSettings ) )
+        if ( fieldmapping::invokeDialog( getORB(), getDialog()->getDialog(), getDialog()->getDataSource().getDataSource(), rSettings ) )
         {
             if ( !rSettings.aFieldMapping.empty() )
                 getDialog()->travelNext();
@@ -85,8 +72,6 @@ namespace abp
         }
     }
 
-
 }   // namespace abp
 
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/abpilot/fieldmappingpage.hxx b/extensions/source/abpilot/fieldmappingpage.hxx
index 8623b6d21220..8aaebbefbfee 100644
--- a/extensions/source/abpilot/fieldmappingpage.hxx
+++ b/extensions/source/abpilot/fieldmappingpage.hxx
@@ -21,21 +21,17 @@
 #define INCLUDED_EXTENSIONS_SOURCE_ABPILOT_FIELDMAPPINGPAGE_HXX
 
 #include "abspage.hxx"
-#include <vcl/vclptr.hxx>
-
+#include <vcl/weld.hxx>
 
 namespace abp
 {
-
     class FieldMappingPage final : public AddressBookSourcePage
     {
-        VclPtr<PushButton>     m_pInvokeDialog;
-        VclPtr<FixedText>      m_pHint;
-
+        std::unique_ptr<weld::Button> m_xInvokeDialog;
+        std::unique_ptr<weld::Label> m_xHint;
     public:
-        explicit FieldMappingPage(OAddressBookSourcePilot* _pParent);
+        explicit FieldMappingPage(OAddressBookSourcePilot* pDialog, TabPageParent pPageParent);
         virtual ~FieldMappingPage() override;
-        virtual void dispose() override;
     private:
         // OWizardPage overridables
         virtual void        initializePage() override;
@@ -43,12 +39,10 @@ namespace abp
         // TabDialog overridables
         virtual void        ActivatePage() override;
 
-        DECL_LINK( OnInvokeDialog, Button*, void );
+        DECL_LINK(OnInvokeDialog, weld::Button&, void);
 
         void implUpdateHint();
     };
-
-
 }   // namespace abp
 
 
diff --git a/extensions/source/abpilot/tableselectionpage.cxx b/extensions/source/abpilot/tableselectionpage.cxx
index 7e68a65e88e9..3d56a33fb8bf 100644
--- a/extensions/source/abpilot/tableselectionpage.cxx
+++ b/extensions/source/abpilot/tableselectionpage.cxx
@@ -27,41 +27,32 @@
 namespace abp
 {
 
-    TableSelectionPage::TableSelectionPage( OAddressBookSourcePilot* _pParent )
-        :AddressBookSourcePage(_pParent, "SelectTablePage",
-          "modules/sabpilot/ui/selecttablepage.ui")
+    TableSelectionPage::TableSelectionPage(OAddressBookSourcePilot* pDialog, TabPageParent pPageParent)
+        : AddressBookSourcePage(pDialog, pPageParent, "modules/sabpilot/ui/selecttablepage.ui", "SelectTablePage")
+        , m_xTableList(m_xBuilder->weld_tree_view("table"))
     {
-        get(m_pTableList, "table");
-        m_pTableList->SetSelectHdl( LINK( this, TableSelectionPage, OnTableSelected ) );
-        m_pTableList->SetDoubleClickHdl( LINK( this, TableSelectionPage, OnTableDoubleClicked ) );
+        m_xTableList->connect_changed( LINK( this, TableSelectionPage, OnTableSelected ) );
+        m_xTableList->connect_row_activated( LINK( this, TableSelectionPage, OnTableDoubleClicked ) );
     }
 
     TableSelectionPage::~TableSelectionPage()
     {
-        disposeOnce();
-    }
-
-    void TableSelectionPage::dispose()
-    {
-        m_pTableList.clear();
-        AddressBookSourcePage::dispose();
     }
 
     void TableSelectionPage::ActivatePage()
     {
         AddressBookSourcePage::ActivatePage();
 
-        m_pTableList->GrabFocus();
+        m_xTableList->grab_focus();
     }
 
-
     void TableSelectionPage::initializePage()
     {
         AddressBookSourcePage::initializePage();
 
         const AddressSettings& rSettings = getSettings();
 
-        m_pTableList->Clear();
+        m_xTableList->clear();
 
         // get the table names
         const StringBag& aTableNames = getDialog()->getDataSource().getTableNames();
@@ -70,46 +61,40 @@ namespace abp
 
         // fill the list
         for (auto const& tableName : aTableNames)
-            m_pTableList->InsertEntry(tableName);
+            m_xTableList->append_text(tableName);
 
         // initially select the proper table
-        m_pTableList->SelectEntry( rSettings.sSelectedTable );
+        m_xTableList->select_text(rSettings.sSelectedTable);
     }
 
-
-    IMPL_LINK_NOARG( TableSelectionPage, OnTableDoubleClicked, ListBox&, void )
+    IMPL_LINK_NOARG( TableSelectionPage, OnTableDoubleClicked, weld::TreeView&, void )
     {
-        if ( 1 == m_pTableList->GetSelectedEntryCount() )
+        if (m_xTableList->count_selected_rows() == 1)
             getDialog()->travelNext();
     }
 
-
-    IMPL_LINK_NOARG( TableSelectionPage, OnTableSelected, ListBox&, void )
+    IMPL_LINK_NOARG( TableSelectionPage, OnTableSelected, weld::TreeView&, void )
     {
         updateDialogTravelUI();
     }
 
-
     bool TableSelectionPage::commitPage( ::vcl::WizardTypes::CommitPageReason _eReason )
     {
         if (!AddressBookSourcePage::commitPage(_eReason))
             return false;
 
         AddressSettings& rSettings = getSettings();
-        rSettings.sSelectedTable = m_pTableList->GetSelectedEntry();
+        rSettings.sSelectedTable = m_xTableList->get_selected_text();
 
         return true;
     }
 
-
     bool TableSelectionPage::canAdvance() const
     {
         return  AddressBookSourcePage::canAdvance()
-            &&  ( 0 < m_pTableList->GetSelectedEntryCount() );
+            &&  (m_xTableList->count_selected_rows() > 0);
     }
 
-
 }   // namespace abp
 
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/abpilot/tableselectionpage.hxx b/extensions/source/abpilot/tableselectionpage.hxx
index 9f58ea945976..f25258bc894a 100644
--- a/extensions/source/abpilot/tableselectionpage.hxx
+++ b/extensions/source/abpilot/tableselectionpage.hxx
@@ -21,21 +21,17 @@
 #define INCLUDED_EXTENSIONS_SOURCE_ABPILOT_TABLESELECTIONPAGE_HXX
 
 #include "abspage.hxx"
-#include <vcl/lstbox.hxx>
-#include <vcl/vclptr.hxx>
-
+#include <vcl/weld.hxx>
 
 namespace abp
 {
-
     class TableSelectionPage final : public AddressBookSourcePage
     {
-        VclPtr<ListBox>        m_pTableList;
+        std::unique_ptr<weld::TreeView> m_xTableList;
 
     public:
-        explicit TableSelectionPage( OAddressBookSourcePilot* _pParent );
+        explicit TableSelectionPage(OAddressBookSourcePilot* pDialog, TabPageParent pPageParent);
         virtual ~TableSelectionPage() override;
-        virtual void dispose() override;
     private:
         // OWizardPage overridables
         virtual void        initializePage() override;
@@ -47,14 +43,12 @@ namespace abp
         // OImportPage overridables
         virtual bool        canAdvance() const override;
 
-        DECL_LINK( OnTableSelected, ListBox&, void );
-        DECL_LINK( OnTableDoubleClicked, ListBox&, void );
+        DECL_LINK(OnTableSelected, weld::TreeView&, void);
+        DECL_LINK(OnTableDoubleClicked, weld::TreeView&, void);
     };
 
-
 }   // namespace abp
 
-
 #endif // INCLUDED_EXTENSIONS_SOURCE_ABPILOT_TABLESELECTIONPAGE_HXX
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/abpilot/typeselectionpage.cxx b/extensions/source/abpilot/typeselectionpage.cxx
index ae72d77a3ce1..a9f68fd1afd3 100644
--- a/extensions/source/abpilot/typeselectionpage.cxx
+++ b/extensions/source/abpilot/typeselectionpage.cxx
@@ -31,19 +31,17 @@ namespace abp
     using namespace ::com::sun::star::sdbc;
 
     // TypeSelectionPage
-    TypeSelectionPage::TypeSelectionPage( OAddressBookSourcePilot* _pParent )
-      : AddressBookSourcePage(_pParent, "SelectTypePage",
-          "modules/sabpilot/ui/selecttypepage.ui")
+    TypeSelectionPage::TypeSelectionPage(OAddressBookSourcePilot* pDialog, TabPageParent pPageParent)
+      : AddressBookSourcePage(pDialog, pPageParent, "modules/sabpilot/ui/selecttypepage.ui", "SelectTypePage")
+      , m_xEvolution(m_xBuilder->weld_radio_button("evolution"))
+      , m_xEvolutionGroupwise(m_xBuilder->weld_radio_button("groupwise"))
+      , m_xEvolutionLdap(m_xBuilder->weld_radio_button("evoldap"))
+      , m_xMORK(m_xBuilder->weld_radio_button("firefox"))
+      , m_xThunderbird(m_xBuilder->weld_radio_button("thunderbird"))
+      , m_xKab(m_xBuilder->weld_radio_button("kde"))
+      , m_xMacab(m_xBuilder->weld_radio_button("macosx"))
+      , m_xOther(m_xBuilder->weld_radio_button("other"))
     {
-        get(m_pEvolution, "evolution");
-        get(m_pEvolutionGroupwise, "groupwise");
-        get(m_pEvolutionLdap, "evoldap");
-        get(m_pMORK, "firefox");
-        get(m_pThunderbird, "thunderbird");
-        get(m_pKab, "kde");
-        get(m_pMacab, "macosx");
-        get(m_pOther, "other");
-
         //TODO:  For now, try to keep offering the same choices like before the
         // Mozilla/MORK cleanup, even if the status of what driver actually
         // provides which functionality is somewhat unclear, see the discussions
@@ -71,7 +69,7 @@ namespace abp
         bool bHaveKab = false;
         bool bHaveMacab = false;
 
-        Reference< XDriverManager2 > xManager = DriverManager::create( _pParent->getORB() );
+        Reference< XDriverManager2 > xManager = DriverManager::create( pDialog->getORB() );
 
         try
         {
@@ -112,29 +110,28 @@ namespace abp
 #endif
 
         // Items are displayed in list order
-        m_aAllTypes.push_back( ButtonItem( m_pEvolution, AST_EVOLUTION, bHaveEvolution ) );
-        m_aAllTypes.push_back( ButtonItem( m_pEvolutionGroupwise, AST_EVOLUTION_GROUPWISE, bHaveEvolution ) );
-        m_aAllTypes.push_back( ButtonItem( m_pEvolutionLdap, AST_EVOLUTION_LDAP, bHaveEvolution ) );
-        m_aAllTypes.push_back( ButtonItem( m_pMORK, AST_MORK, true ) );
-        m_aAllTypes.push_back( ButtonItem( m_pThunderbird, AST_THUNDERBIRD, true ) );
-        m_aAllTypes.push_back( ButtonItem( m_pKab, AST_KAB, bHaveKab ) );
-        m_aAllTypes.push_back( ButtonItem( m_pMacab, AST_MACAB, bHaveMacab ) );
-        m_aAllTypes.push_back( ButtonItem( m_pOther, AST_OTHER, true ) );
-
-        Link<Button*,void> aTypeSelectionHandler = LINK(this, TypeSelectionPage, OnTypeSelected );
+        m_aAllTypes.push_back( ButtonItem( m_xEvolution.get(), AST_EVOLUTION, bHaveEvolution ) );
+        m_aAllTypes.push_back( ButtonItem( m_xEvolutionGroupwise.get(), AST_EVOLUTION_GROUPWISE, bHaveEvolution ) );
+        m_aAllTypes.push_back( ButtonItem( m_xEvolutionLdap.get(), AST_EVOLUTION_LDAP, bHaveEvolution ) );
+        m_aAllTypes.push_back( ButtonItem( m_xMORK.get(), AST_MORK, true ) );
+        m_aAllTypes.push_back( ButtonItem( m_xThunderbird.get(), AST_THUNDERBIRD, true ) );
+        m_aAllTypes.push_back( ButtonItem( m_xKab.get(), AST_KAB, bHaveKab ) );
+        m_aAllTypes.push_back( ButtonItem( m_xMacab.get(), AST_MACAB, bHaveMacab ) );
+        m_aAllTypes.push_back( ButtonItem( m_xOther.get(), AST_OTHER, true ) );
+
+        Link<weld::Button&,void> aTypeSelectionHandler = LINK(this, TypeSelectionPage, OnTypeSelected );
         for (auto const& elem : m_aAllTypes)
         {
             if (!elem.m_bVisible)
-                elem.m_pItem->Hide();
+                elem.m_pItem->hide();
             else
             {
-                elem.m_pItem->SetClickHdl( aTypeSelectionHandler );
-                elem.m_pItem->Show();
+                elem.m_pItem->connect_clicked( aTypeSelectionHandler );
+                elem.m_pItem->show();
             }
         }
     }
 
-
     TypeSelectionPage::~TypeSelectionPage()
     {
         disposeOnce();
@@ -146,27 +143,18 @@ namespace abp
         {
             elem.m_bVisible = false;
         }
-        m_pEvolution.clear();
-        m_pEvolutionGroupwise.clear();
-        m_pEvolutionLdap.clear();
-        m_pMORK.clear();
-        m_pThunderbird.clear();
-        m_pKab.clear();
-        m_pMacab.clear();
-        m_pOther.clear();
         AddressBookSourcePage::dispose();
     }
 
-
     void TypeSelectionPage::ActivatePage()
     {
         AddressBookSourcePage::ActivatePage();
 
         for (auto const& elem : m_aAllTypes)
         {
-            if( elem.m_pItem->IsChecked() && elem.m_bVisible )
+            if( elem.m_pItem->get_active() && elem.m_bVisible )
             {
-                elem.m_pItem->GrabFocus();
+                elem.m_pItem->grab_focus();
                 break;
             }
         }
@@ -174,35 +162,31 @@ namespace abp
         getDialog()->enableButtons(WizardButtonFlags::PREVIOUS, false);
     }
 
-
     void TypeSelectionPage::DeactivatePage()
     {
         AddressBookSourcePage::DeactivatePage();
         getDialog()->enableButtons(WizardButtonFlags::PREVIOUS, true);
     }
 
-
     void TypeSelectionPage::selectType( AddressSourceType _eType )
     {
         for (auto const& elem : m_aAllTypes)
         {
-            elem.m_pItem->Check( _eType == elem.m_eType );
+            elem.m_pItem->set_active( _eType == elem.m_eType );
         }
     }
 
-
     AddressSourceType TypeSelectionPage::getSelectedType() const
     {
         for (auto const& elem : m_aAllTypes)
         {
-            if ( elem.m_pItem->IsChecked() && elem.m_bVisible )
+            if ( elem.m_pItem->get_active() && elem.m_bVisible )
                 return elem.m_eType;
         }
 
         return AST_INVALID;
     }
 
-
     void TypeSelectionPage::initializePage()
     {
         AddressBookSourcePage::initializePage();
@@ -211,7 +195,6 @@ namespace abp
         selectType(rSettings.eType);
     }
 
-
     bool TypeSelectionPage::commitPage( ::vcl::WizardTypes::CommitPageReason _eReason )
     {
         if (!AddressBookSourcePage::commitPage(_eReason))
@@ -219,7 +202,7 @@ namespace abp
 
         if (AST_INVALID == getSelectedType( ))
         {
-            std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(GetFrameWeld(),
+            std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(m_xContainer.get(),
                                                       VclMessageType::Warning, VclButtonsType::Ok,
                                                       compmodule::ModuleRes(RID_STR_NEEDTYPESELECTION)));
             xBox->run();
@@ -240,7 +223,7 @@ namespace abp
     }
 
 
-    IMPL_LINK_NOARG( TypeSelectionPage, OnTypeSelected, Button*, void )
+    IMPL_LINK_NOARG( TypeSelectionPage, OnTypeSelected, weld::Button&, void )
     {
         getDialog()->typeSelectionChanged( getSelectedType() );
         updateDialogTravelUI();
diff --git a/extensions/source/abpilot/typeselectionpage.hxx b/extensions/source/abpilot/typeselectionpage.hxx
index 219afd059bf2..cf5c537b39f0 100644
--- a/extensions/source/abpilot/typeselectionpage.hxx
+++ b/extensions/source/abpilot/typeselectionpage.hxx
@@ -22,30 +22,28 @@
 
 #include "abspage.hxx"
 #include "addresssettings.hxx"
-#include <vcl/edit.hxx>
-#include <vcl/vclptr.hxx>
-
+#include <vcl/weld.hxx>
 
 namespace abp
 {
 
     class TypeSelectionPage final : public AddressBookSourcePage
     {
-        VclPtr<RadioButton> m_pEvolution;
-        VclPtr<RadioButton> m_pEvolutionGroupwise;
-        VclPtr<RadioButton> m_pEvolutionLdap;
-        VclPtr<RadioButton> m_pMORK;
-        VclPtr<RadioButton> m_pThunderbird;
-        VclPtr<RadioButton> m_pKab;
-        VclPtr<RadioButton> m_pMacab;
-        VclPtr<RadioButton> m_pOther;
+        std::unique_ptr<weld::RadioButton> m_xEvolution;
+        std::unique_ptr<weld::RadioButton> m_xEvolutionGroupwise;
+        std::unique_ptr<weld::RadioButton> m_xEvolutionLdap;
+        std::unique_ptr<weld::RadioButton> m_xMORK;
+        std::unique_ptr<weld::RadioButton> m_xThunderbird;
+        std::unique_ptr<weld::RadioButton> m_xKab;
+        std::unique_ptr<weld::RadioButton> m_xMacab;
+        std::unique_ptr<weld::RadioButton> m_xOther;
 
         struct ButtonItem {
-            VclPtr<RadioButton> m_pItem;
+            weld::RadioButton* m_pItem;
             AddressSourceType m_eType;
             bool         m_bVisible;
 
-            ButtonItem( RadioButton *pItem,
+            ButtonItem( weld::RadioButton *pItem,
                         AddressSourceType eType,
                         bool         bVisible ) :
                     m_pItem( pItem ),
@@ -57,7 +55,7 @@ namespace abp
         std::vector< ButtonItem > m_aAllTypes;
 
     public:
-        explicit TypeSelectionPage( OAddressBookSourcePilot* _pParent );
+        explicit TypeSelectionPage(OAddressBookSourcePilot* pDialog, TabPageParent pPageParent);
         virtual ~TypeSelectionPage() override;
         virtual void        dispose() override;
 
@@ -76,7 +74,7 @@ namespace abp
         // OImportPage overridables
         virtual bool        canAdvance() const override;
 
-        DECL_LINK( OnTypeSelected, Button*, void );
+        DECL_LINK( OnTypeSelected, weld::Button&, void );
 
         void                selectType( AddressSourceType _eType );
     };
diff --git a/extensions/source/abpilot/unodialogabp.cxx b/extensions/source/abpilot/unodialogabp.cxx
index ded9cd8c3049..90320dff9fd7 100644
--- a/extensions/source/abpilot/unodialogabp.cxx
+++ b/extensions/source/abpilot/unodialogabp.cxx
@@ -21,7 +21,7 @@
 #include <cppuhelper/typeprovider.hxx>
 #include "abspilot.hxx"
 #include <comphelper/sequence.hxx>
-#include <toolkit/helper/vclunohelper.hxx>
+#include <vcl/svapp.hxx>
 #include <com/sun/star/beans/PropertyAttribute.hpp>
 #include <com/sun/star/beans/PropertyValue.hpp>
 #include <com/sun/star/awt/XWindow.hpp>
@@ -116,10 +116,9 @@ namespace abp
 
     svt::OGenericUnoDialog::Dialog OABSPilotUno::createDialog(const css::uno::Reference<css::awt::XWindow>& rParent)
     {
-        return svt::OGenericUnoDialog::Dialog(VclPtr<OAddressBookSourcePilot>::Create(VCLUnoHelper::GetWindow(rParent), m_aContext));
+        return svt::OGenericUnoDialog::Dialog(std::make_unique<OAddressBookSourcePilot>(Application::GetFrameWeld(rParent), m_aContext));
     }
 
-
     Any SAL_CALL OABSPilotUno::execute( const Sequence< NamedValue >& /*lArgs*/ )
     {
         // not interested in the context, not interested in the args
@@ -139,7 +138,7 @@ namespace abp
     {
         if ( _nExecutionResult == RET_OK )
         {
-            const AddressSettings& aSettings = static_cast<OAddressBookSourcePilot*>(m_aDialog.m_xVclDialog.get())->getSettings();
+            const AddressSettings& aSettings = static_cast<OAddressBookSourcePilot*>(m_aDialog.m_xWeldDialog.get())->getSettings();
             m_sDataSourceName = aSettings.bRegisterDataSource ? aSettings.sRegisteredDataSourceName : aSettings.sDataSourceName;
         }
     }
diff --git a/extensions/uiconfig/sabpilot/ui/datasourcepage.ui b/extensions/uiconfig/sabpilot/ui/datasourcepage.ui
index ac4a90acb281..0b1d770182bc 100644
--- a/extensions/uiconfig/sabpilot/ui/datasourcepage.ui
+++ b/extensions/uiconfig/sabpilot/ui/datasourcepage.ui
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.16.1 -->
+<!-- Generated with glade 3.22.1 -->
 <interface domain="pcr">
   <requires lib="gtk+" version="3.18"/>
-  <requires lib="LibreOffice" version="1.0"/>
   <object class="GtkGrid" id="DataSourcePage">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
@@ -12,22 +11,23 @@
       <object class="GtkLabel" id="label2">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
-        <property name="xalign">0</property>
-        <property name="yalign">0</property>
         <property name="label" translatable="yes" context="datasourcepage|label2">That was all the information necessary to integrate your address data into %PRODUCTNAME.
 
 Now, just enter the name under which you want to register the data source in %PRODUCTNAME.</property>
         <property name="wrap">True</property>
-        <property name="max_width_chars">90</property>
-        <accessibility>
-          <role type="static"/>
-        </accessibility>
+        <property name="width_chars">70</property>
+        <property name="max_width_chars">70</property>
+        <property name="xalign">0</property>
+        <property name="yalign">0</property>
+        <child internal-child="accessible">
+          <object class="AtkObject" id="label2-atkobject">
+            <property name="AtkObject::accessible-role" translatable="no">static</property>
+          </object>
+        </child>
       </object>
       <packing>
         <property name="left_attach">0</property>
         <property name="top_attach">0</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
       </packing>
     </child>
     <child>
@@ -61,16 +61,14 @@ Now, just enter the name under which you want to register the data source in %PR
               <object class="GtkLabel" id="locationft">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="xalign">0</property>
                 <property name="label" translatable="yes" context="datasourcepage|locationft">Location</property>
                 <property name="use_underline">True</property>
                 <property name="mnemonic_widget">location</property>
+                <property name="xalign">0</property>
               </object>
               <packing>
                 <property name="left_attach">0</property>
                 <property name="top_attach">0</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
               </packing>
             </child>
             <child>
@@ -84,12 +82,10 @@ Now, just enter the name under which you want to register the data source in %PR
               <packing>
                 <property name="left_attach">2</property>
                 <property name="top_attach">0</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
               </packing>
             </child>
             <child>
-              <object class="svtlo-OFileURLControl" id="location">
+              <object class="GtkComboBoxText" id="location">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
                 <property name="hexpand">True</property>
@@ -97,22 +93,19 @@ Now, just enter the name under which you want to register the data source in %PR
                 <child internal-child="entry">
                   <object class="GtkEntry" id="comboboxtext-entry">
                     <property name="can_focus">True</property>
+                    <property name="activates_default">True</property>
                   </object>
                 </child>
               </object>
               <packing>
                 <property name="left_attach">1</property>
                 <property name="top_attach">0</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
               </packing>
             </child>
           </object>
           <packing>
             <property name="left_attach">0</property>
             <property name="top_attach">1</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
           </packing>
         </child>
         <child>
@@ -128,8 +121,6 @@ Now, just enter the name under which you want to register the data source in %PR
           <packing>
             <property name="left_attach">0</property>
             <property name="top_attach">2</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
           </packing>
         </child>
         <child>
@@ -154,16 +145,14 @@ Now, just enter the name under which you want to register the data source in %PR
                       <object class="GtkLabel" id="nameft">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="xalign">0</property>
                         <property name="label" translatable="yes" context="datasourcepage|nameft">Address book name</property>
                         <property name="use_underline">True</property>
                         <property name="mnemonic_widget">name</property>
+                        <property name="xalign">0</property>
                       </object>
                       <packing>
                         <property name="left_attach">0</property>
                         <property name="top_attach">0</property>
-                        <property name="width">1</property>
-                        <property name="height">1</property>
                       </packing>
                     </child>
                     <child>
@@ -171,40 +160,38 @@ Now, just enter the name under which you want to register the data source in %PR
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="hexpand">True</property>
+                        <property name="activates_default">True</property>
                       </object>
                       <packing>
                         <property name="left_attach">1</property>
                         <property name="top_attach">0</property>
-                        <property name="width">1</property>
-                        <property name="height">1</property>
                       </packing>
                     </child>
                   </object>
                   <packing>
                     <property name="left_attach">0</property>
                     <property name="top_attach">0</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
                   </packing>
                 </child>
                 <child>
                   <object class="GtkLabel" id="warning">
                     <property name="can_focus">False</property>
                     <property name="no_show_all">True</property>
-                    <property name="xalign">0</property>
-                    <property name="yalign">0</property>
                     <property name="label" translatable="yes" context="datasourcepage|warning">Another data source already has this name. As data sources have to have globally unique names, you need to choose another one.</property>
                     <property name="wrap">True</property>
-                    <property name="max_width_chars">90</property>
-                    <accessibility>
-                      <role type="static"/>
-                    </accessibility>
+                    <property name="width_chars">70</property>
+                    <property name="max_width_chars">70</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <child internal-child="accessible">
+                      <object class="AtkObject" id="warning-atkobject">
+                        <property name="AtkObject::accessible-role" translatable="no">static</property>
+                      </object>
+                    </child>
                   </object>
                   <packing>
                     <property name="left_attach">0</property>
                     <property name="top_attach">1</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
                   </packing>
                 </child>
               </object>
@@ -213,16 +200,12 @@ Now, just enter the name under which you want to register the data source in %PR
           <packing>
             <property name="left_attach">0</property>
             <property name="top_attach">3</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
           </packing>
         </child>
       </object>
       <packing>
         <property name="left_attach">0</property>
         <property name="top_attach">1</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
       </packing>
     </child>
   </object>
diff --git a/extensions/uiconfig/sabpilot/ui/fieldassignpage.ui b/extensions/uiconfig/sabpilot/ui/fieldassignpage.ui
index d86802f8f4a4..410b95459179 100644
--- a/extensions/uiconfig/sabpilot/ui/fieldassignpage.ui
+++ b/extensions/uiconfig/sabpilot/ui/fieldassignpage.ui
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.16.1 -->
+<!-- Generated with glade 3.22.1 -->
 <interface domain="pcr">
   <requires lib="gtk+" version="3.18"/>
   <object class="GtkGrid" id="FieldAssignPage">
@@ -11,24 +11,25 @@
       <object class="GtkLabel" id="label2">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
-        <property name="xalign">0</property>
-        <property name="yalign">0</property>
         <property name="label" translatable="yes" context="fieldassignpage|label2">To incorporate the address data in your templates, %PRODUCTNAME has to know which fields contain which data.
 
 For instance, you could have stored the e-mail addresses in a field named "email", or "E-mail" or "EM" - or something completely different.
 
 Click the button below to open another dialog where you can enter the settings for your data source.</property>
         <property name="wrap">True</property>
-        <property name="max_width_chars">90</property>
-        <accessibility>
-          <role type="static"/>
-        </accessibility>
+        <property name="width_chars">70</property>
+        <property name="max_width_chars">70</property>
+        <property name="xalign">0</property>
+        <property name="yalign">0</property>
+        <child internal-child="accessible">
+          <object class="AtkObject" id="label-atkobject">
+            <property name="AtkObject::accessible-role" translatable="no">static</property>
+          </object>
+        </child>
       </object>
       <packing>
         <property name="left_attach">0</property>
         <property name="top_attach">0</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
       </packing>
     </child>
     <child>
@@ -43,8 +44,6 @@ Click the button below to open another dialog where you can enter the settings f
       <packing>
         <property name="left_attach">0</property>
         <property name="top_attach">1</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
       </packing>
     </child>
     <child>
@@ -52,19 +51,19 @@ Click the button below to open another dialog where you can enter the settings f
         <property name="visible">True</property>
         <property name="can_focus">False</property>
         <property name="vexpand">True</property>
+        <property name="wrap">True</property>
+        <property name="max_width_chars">70</property>
         <property name="xalign">0</property>
         <property name="yalign">0</property>
-        <property name="wrap">True</property>
-        <property name="max_width_chars">90</property>
-        <accessibility>
-          <role type="static"/>
-        </accessibility>
+        <child internal-child="accessible">
+          <object class="AtkObject" id="hint-atkobject">
+            <property name="AtkObject::accessible-role" translatable="no">static</property>
+          </object>
+        </child>
       </object>
       <packing>
         <property name="left_attach">0</property>
         <property name="top_attach">2</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
       </packing>
     </child>
   </object>
diff --git a/extensions/uiconfig/sabpilot/ui/invokeadminpage.ui b/extensions/uiconfig/sabpilot/ui/invokeadminpage.ui
index e8d97f137c06..d3c7a997c333 100644
--- a/extensions/uiconfig/sabpilot/ui/invokeadminpage.ui
+++ b/extensions/uiconfig/sabpilot/ui/invokeadminpage.ui
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.16.1 -->
+<!-- Generated with glade 3.22.1 -->
 <interface domain="pcr">
   <requires lib="gtk+" version="3.18"/>
   <object class="GtkGrid" id="InvokeAdminPage">
@@ -11,22 +11,23 @@
       <object class="GtkLabel" id="label2">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
-        <property name="xalign">0</property>
-        <property name="yalign">0</property>
         <property name="label" translatable="yes" context="invokeadminpage|label2">To set up the new data source, additional information is required.
 
 Click the following button to open another dialog in which you then enter the necessary information.</property>
-        <accessibility>
-          <role type="static"/>
-        </accessibility>
         <property name="wrap">True</property>
-        <property name="max_width_chars">90</property>
+        <property name="width_chars">70</property>
+        <property name="max_width_chars">70</property>
+        <property name="xalign">0</property>
+        <property name="yalign">0</property>
+        <child internal-child="accessible">
+          <object class="AtkObject" id="label2-atkobject">
+            <property name="AtkObject::accessible-role" translatable="no">static</property>
+          </object>
+        </child>
       </object>
       <packing>
         <property name="left_attach">0</property>
         <property name="top_attach">0</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
       </packing>
     </child>
     <child>
@@ -40,29 +41,28 @@ Click the following button to open another dialog in which you then enter the ne
       <packing>
         <property name="left_attach">0</property>
         <property name="top_attach">1</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
       </packing>
     </child>
     <child>
       <object class="GtkLabel" id="warning">
         <property name="can_focus">False</property>
         <property name="no_show_all">True</property>
-        <property name="xalign">0</property>
-        <property name="yalign">0</property>
         <property name="label" translatable="yes" context="invokeadminpage|warning">The connection to the data source could not be established.
 Before you proceed, please check the settings made, or (on the previous page) choose another address data source type.</property>
         <property name="wrap">True</property>
-        <property name="max_width_chars">90</property>
-        <accessibility>
-          <role type="static"/>
-        </accessibility>
+        <property name="width_chars">70</property>
+        <property name="max_width_chars">70</property>
+        <property name="xalign">0</property>
+        <property name="yalign">0</property>
+        <child internal-child="accessible">
+          <object class="AtkObject" id="warning-atkobject">
+            <property name="AtkObject::accessible-role" translatable="no">static</property>
+          </object>
+        </child>
       </object>
       <packing>
         <property name="left_attach">0</property>
         <property name="top_attach">2</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
       </packing>
     </child>
   </object>
diff --git a/extensions/uiconfig/sabpilot/ui/selecttablepage.ui b/extensions/uiconfig/sabpilot/ui/selecttablepage.ui
index a1c87bf94097..ce96a47e115e 100644
--- a/extensions/uiconfig/sabpilot/ui/selecttablepage.ui
+++ b/extensions/uiconfig/sabpilot/ui/selecttablepage.ui
@@ -1,7 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.16.1 -->
+<!-- Generated with glade 3.22.1 -->
 <interface domain="pcr">
   <requires lib="gtk+" version="3.18"/>
+  <object class="GtkTreeStore" id="liststore1">
+    <columns>
+      <!-- column-name text -->
+      <column type="gchararray"/>
+      <!-- column-name id -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
   <object class="GtkGrid" id="SelectTablePage">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
@@ -11,39 +19,64 @@
       <object class="GtkLabel" id="label2">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
-        <property name="xalign">0</property>
-        <property name="yalign">0</property>
         <property name="label" translatable="yes" context="selecttablepage|label2">The external data source you have chosen contains more than one address book.
 Please select the one you mainly want to work with:</property>
+        <property name="use_underline">True</property>
         <property name="wrap">True</property>
-        <property name="max_width_chars">90</property>
-        <accessibility>
-          <role type="static"/>
-        </accessibility>
+        <property name="mnemonic_widget">table</property>
+        <property name="width_chars">70</property>
+        <property name="max_width_chars">70</property>
+        <property name="xalign">0</property>
+        <property name="yalign">0</property>
+        <child internal-child="accessible">
+          <object class="AtkObject" id="label2-atkobject">
+            <property name="AtkObject::accessible-role" translatable="no">static</property>
+          </object>
+        </child>
       </object>
       <packing>
         <property name="left_attach">0</property>
         <property name="top_attach">0</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
       </packing>
     </child>
     <child>
-      <object class="GtkTreeView" id="table:border">
+      <object class="GtkScrolledWindow">
         <property name="visible">True</property>
         <property name="can_focus">True</property>
         <property name="hexpand">True</property>
         <property name="vexpand">True</property>
-        <property name="show_expanders">False</property>
-        <child internal-child="selection">
-          <object class="GtkTreeSelection" id="treeview-selection2"/>
+        <property name="shadow_type">in</property>
+        <child>
+          <object class="GtkTreeView" id="table">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="receives_default">True</property>
+            <property name="hexpand">True</property>
+            <property name="vexpand">True</property>
+            <property name="model">liststore1</property>
+            <property name="headers_visible">False</property>
+            <property name="search_column">0</property>
+            <property name="show_expanders">False</property>
+            <child internal-child="selection">
+              <object class="GtkTreeSelection" id="Macro Library List-selection2"/>
+            </child>
+            <child>
+              <object class="GtkTreeViewColumn" id="treeviewcolumn3">
+                <property name="spacing">6</property>
+                <child>
+                  <object class="GtkCellRendererText" id="cellrenderer4"/>
+                  <attributes>
+                    <attribute name="text">0</attribute>
+                  </attributes>
+                </child>
+              </object>
+            </child>
+          </object>
         </child>
       </object>
       <packing>
         <property name="left_attach">0</property>
         <property name="top_attach">1</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
       </packing>
     </child>
   </object>
diff --git a/extensions/uiconfig/sabpilot/ui/selecttypepage.ui b/extensions/uiconfig/sabpilot/ui/selecttypepage.ui
index ea7fe130589b..82619b95bedc 100644
--- a/extensions/uiconfig/sabpilot/ui/selecttypepage.ui
+++ b/extensions/uiconfig/sabpilot/ui/selecttypepage.ui
@@ -15,12 +15,15 @@
 
 This wizard helps you create the data source.</property>
         <property name="wrap">True</property>
-        <property name="max_width_chars">90</property>
+        <property name="width_chars">70</property>
+        <property name="max_width_chars">70</property>
         <property name="xalign">0</property>
         <property name="yalign">0</property>
-        <accessibility>
-          <role type="static"/>
-        </accessibility>
+        <child internal-child="accessible">
+          <object class="AtkObject" id="label2-atkobject">
+            <property name="AtkObject::accessible-role" translatable="no">static</property>
+          </object>
+        </child>
       </object>
       <packing>
         <property name="left_attach">0</property>
@@ -42,7 +45,6 @@ This wizard helps you create the data source.</property>
             <property name="xalign">0</property>
             <property name="active">True</property>
             <property name="draw_indicator">True</property>
-            <property name="group">groupwise</property>
           </object>
           <packing>
             <property name="left_attach">0</property>
@@ -58,7 +60,7 @@ This wizard helps you create the data source.</property>
             <property name="use_underline">True</property>
             <property name="xalign">0</property>
             <property name="draw_indicator">True</property>
-            <property name="group">evoldap</property>
+            <property name="group">evolution</property>
           </object>
           <packing>
             <property name="left_attach">0</property>
@@ -74,7 +76,7 @@ This wizard helps you create the data source.</property>
             <property name="use_underline">True</property>
             <property name="xalign">0</property>
             <property name="draw_indicator">True</property>
-            <property name="group">firefox</property>
+            <property name="group">evolution</property>
           </object>
           <packing>
             <property name="left_attach">0</property>
@@ -90,7 +92,7 @@ This wizard helps you create the data source.</property>
             <property name="use_underline">True</property>
             <property name="xalign">0</property>
             <property name="draw_indicator">True</property>
-            <property name="group">thunderbird</property>
+            <property name="group">evolution</property>
           </object>
           <packing>
             <property name="left_attach">0</property>
@@ -106,7 +108,7 @@ This wizard helps you create the data source.</property>
             <property name="use_underline">True</property>
             <property name="xalign">0</property>
             <property name="draw_indicator">True</property>
-            <property name="group">kde</property>
+            <property name="group">evolution</property>
           </object>
           <packing>
             <property name="left_attach">0</property>
@@ -122,7 +124,7 @@ This wizard helps you create the data source.</property>
             <property name="use_underline">True</property>
             <property name="xalign">0</property>
             <property name="draw_indicator">True</property>
-            <property name="group">macosx</property>
+            <property name="group">evolution</property>
           </object>
           <packing>
             <property name="left_attach">0</property>
@@ -138,7 +140,7 @@ This wizard helps you create the data source.</property>
             <property name="use_underline">True</property>
             <property name="xalign">0</property>
             <property name="draw_indicator">True</property>
-            <property name="group">other</property>
+            <property name="group">evolution</property>
           </object>
           <packing>
             <property name="left_attach">0</property>
@@ -166,9 +168,11 @@ This wizard helps you create the data source.</property>
             <property name="visible">True</property>
             <property name="can_focus">False</property>
             <property name="label" translatable="yes" context="selecttypepage|label1">Select the type of your external address book:</property>
-            <accessibility>
-              <role type="static"/>
-            </accessibility>
+            <child internal-child="accessible">
+              <object class="AtkObject" id="label1-atkobject">
+                <property name="AtkObject::accessible-role" translatable="no">static</property>
+              </object>
+            </child>
           </object>
           <packing>
             <property name="left_attach">0</property>
diff --git a/include/svtools/inettbc.hxx b/include/svtools/inettbc.hxx
index 13b9bed5cc67..bf61e0ddef2a 100644
--- a/include/svtools/inettbc.hxx
+++ b/include/svtools/inettbc.hxx
@@ -123,6 +123,7 @@ public:
     void                clear() { m_xWidget->clear(); }
     void                connect_entry_activate(const Link<weld::ComboBox&, bool>& rLink) { m_xWidget->connect_entry_activate(rLink); }
     void                connect_changed(const Link<weld::ComboBox&, void>& rLink) { aChangeHdl = rLink; }
+    void                trigger_changed() { aChangeHdl.Call(*m_xWidget); }
     void                connect_focus_out(const Link<weld::Widget&, void>& rLink) { aFocusOutHdl = rLink; }
     void                append_text(const OUString& rStr) { m_xWidget->append_text(rStr); }
     int                 find_text(const OUString& rStr) const { return m_xWidget->find_text(rStr); }
diff --git a/include/svx/databaselocationinput.hxx b/include/svx/databaselocationinput.hxx
index 8b84c7fe7f59..3608bc03e766 100644
--- a/include/svx/databaselocationinput.hxx
+++ b/include/svx/databaselocationinput.hxx
@@ -27,15 +27,15 @@
 
 class PushButton;
 namespace svt { class OFileURLControl; }
+
+class URLBox;
+namespace weld { class Button; class Window; }
 namespace com::sun::star::uno { class XComponentContext; }
 namespace com::sun::star::uno { template <typename > class Reference; }
 
 namespace svx
 {
-
-
     //= DatabaseLocationInputController
-
     class DatabaseLocationInputController_Impl;
     /** helper class to control controls needed to input a database location
 
@@ -50,8 +50,9 @@ namespace svx
     public:
         DatabaseLocationInputController(
             const css::uno::Reference<css::uno::XComponentContext>& _rContext,
-            ::svt::OFileURLControl&                 _rLocationInput,
-            PushButton&                             _rBrowseButton
+            URLBox& _rLocationInput,
+            weld::Button& _rBrowseButton,
+            weld::Window& _rDialog
         );
         ~DatabaseLocationInputController();
 
@@ -78,6 +79,48 @@ namespace svx
                 m_pImpl;
     };
 
+    //= SvxDatabaseLocationInputController
+    class SvxDatabaseLocationInputController_Impl;
+    /** helper class to control controls needed to input a database location
+
+        If you allow, in your dialog, to save a database document, then you usually
+        have a OFileURLControl for inputting the actual location, and a push button
+        to browse for a location.
+
+        This helper class controls such two UI elements.
+    */
+    class SAL_WARN_UNUSED SVX_DLLPUBLIC SvxDatabaseLocationInputController
+    {
+    public:
+        SvxDatabaseLocationInputController(
+            const css::uno::Reference<css::uno::XComponentContext>& _rContext,
+            ::svt::OFileURLControl&                 _rLocationInput,
+            PushButton&                             _rBrowseButton
+        );
+        ~SvxDatabaseLocationInputController();
+
+        /** sets the given URL at the input control, after translating it into a system path
+        */
+        void    setURL( const OUString& _rURL );
+
+        /** returns the current database location, in form of a URL (not a system path)
+        */
+        OUString  getURL() const;
+
+        /** prepares committing the database location entered in the input field
+
+            Effectively, this method checks whether the file in the location already
+            exists, and if so, it asks the user whether to overwrite it.
+
+            If the method is called multiple times, this check only happens when the location
+            changed since the last call.
+        */
+        bool    prepareCommit();
+
+    private:
+        ::std::unique_ptr< SvxDatabaseLocationInputController_Impl >
+                m_pImpl;
+    };
 
 }
 
diff --git a/svx/source/form/databaselocationinput.cxx b/svx/source/form/databaselocationinput.cxx
index 620ab6af29d9..8b90fb2cd7d9 100644
--- a/svx/source/form/databaselocationinput.cxx
+++ b/svx/source/form/databaselocationinput.cxx
@@ -55,10 +55,208 @@ namespace svx
     public:
         DatabaseLocationInputController_Impl(
             const Reference<XComponentContext>&     _rContext,
+            URLBox& _rLocationInput,
+            weld::Button& _rBrowseButton,
+            weld::Window& _rDialog
+        );
+
+        bool     prepareCommit();
+        void     setURL( const OUString& _rURL );
+        OUString getURL() const;
+
+    private:
+        void     impl_initFilterProperties_nothrow();
+        void     impl_onBrowseButtonClicked();
+        OUString impl_getCurrentURL() const;
+
+        DECL_LINK( OnButtonAction, weld::Button&, void );
+
+    private:
+        const Reference<XComponentContext>      m_xContext;
+        URLBox& m_rLocationInput;
+        weld::Button& m_rBrowseButton;
+        weld::Window& m_rDialog;
+        Sequence< OUString >             m_aFilterExtensions;
+        OUString                         m_sFilterUIName;
+        bool                                    m_bNeedExistenceCheck;
+    };
+
+    DatabaseLocationInputController_Impl::DatabaseLocationInputController_Impl(const Reference<XComponentContext>& _rContext,
+            URLBox& _rLocationInput, weld::Button& _rBrowseButton, weld::Window& _rDialog)
+        :m_xContext( _rContext )
+        ,m_rLocationInput( _rLocationInput )
+        ,m_rBrowseButton( _rBrowseButton )
+        ,m_rDialog( _rDialog )
+        ,m_aFilterExtensions()
+        ,m_sFilterUIName()
+        ,m_bNeedExistenceCheck( true )
+    {
+        impl_initFilterProperties_nothrow();
+
+        // forward the allowed extensions to the input control
+        OUStringBuffer aExtensionList;
+        for ( auto const & extension : std::as_const(m_aFilterExtensions) )
+        {
+            aExtensionList.append( extension );
+            aExtensionList.append( ';' );
+        }
+        m_rLocationInput.SetFilter( aExtensionList.makeStringAndClear() );
+        m_rBrowseButton.connect_clicked(LINK(this, DatabaseLocationInputController_Impl, OnButtonAction));
+    }
+
+    bool DatabaseLocationInputController_Impl::prepareCommit()
+    {
+        OUString sURL( impl_getCurrentURL() );
+        if ( sURL.isEmpty() )
+            return false;
+
+        // check if the name exists
+        if ( m_bNeedExistenceCheck )
+        {
+            if ( ::utl::UCBContentHelper::Exists( sURL ) )
+            {
+                std::unique_ptr<weld::MessageDialog> xQueryBox(Application::CreateMessageDialog(m_rLocationInput.getWidget(),
+                                                               VclMessageType::Question, VclButtonsType::YesNo,
+                                                               SvxResId(RID_STR_ALREADYEXISTOVERWRITE)));
+                if (xQueryBox->run() != RET_YES)
+                    return false;
+            }
+        }
+
+        return true;
+    }
+
+    void DatabaseLocationInputController_Impl::setURL( const OUString& _rURL )
+    {
+        ::svt::OFileNotation aTransformer( _rURL );
+        m_rLocationInput.set_entry_text( aTransformer.get( ::svt::OFileNotation::N_SYSTEM ) );
+    }
+
+    OUString DatabaseLocationInputController_Impl::getURL() const
+    {
+        return impl_getCurrentURL();
+    }
+
+    void DatabaseLocationInputController_Impl::impl_initFilterProperties_nothrow()
+    {
+        try
+        {
+            // get the name of the default filter for database documents
+            ::utl::OConfigurationTreeRoot aConfig(
+                ::utl::OConfigurationTreeRoot::createWithComponentContext(
+                    m_xContext,
+                    "/org.openoffice.Setup/Office/Factories/com.sun.star.sdb.OfficeDatabaseDocument"
+            ) );
+            OUString sDatabaseFilter;
+            OSL_VERIFY( aConfig.getNodeValue( "ooSetupFactoryActualFilter" ) >>= sDatabaseFilter );
+
+            // get the type this filter is responsible for
+            Reference< XNameAccess > xFilterFactory(
+                m_xContext->getServiceManager()->createInstanceWithContext("com.sun.star.document.FilterFactory", m_xContext),
+                UNO_QUERY_THROW );
+            ::comphelper::NamedValueCollection aFilterProperties( xFilterFactory->getByName( sDatabaseFilter ) );
+            OUString sDocumentType = aFilterProperties.getOrDefault( "Type", OUString() );
+
+            // get the extension(s) for this type
+            Reference< XNameAccess > xTypeDetection(
+                m_xContext->getServiceManager()->createInstanceWithContext("com.sun.star.document.TypeDetection", m_xContext),
+                UNO_QUERY_THROW );
+
+            ::comphelper::NamedValueCollection aTypeProperties( xTypeDetection->getByName( sDocumentType ) );
+            m_aFilterExtensions = aTypeProperties.getOrDefault( "Extensions", m_aFilterExtensions );
+            m_sFilterUIName = aTypeProperties.getOrDefault( "UIName", m_sFilterUIName );
+        }
+        catch( const Exception& )
+        {
+            DBG_UNHANDLED_EXCEPTION("svx");
+        }
+
+        // ensure we have at least one extension
+        OSL_ENSURE( m_aFilterExtensions.hasElements(),
+            "DatabaseLocationInputController_Impl::impl_initFilterProperties_nothrow: unable to determine the file extension(s)!" );
+        if ( !m_aFilterExtensions.hasElements() )
+        {
+            m_aFilterExtensions.realloc(1);
+            m_aFilterExtensions[0] = "*.odb";
+        }
+    }
+
+    IMPL_LINK_NOARG(DatabaseLocationInputController_Impl, OnButtonAction, weld::Button&, void)
+    {
+        impl_onBrowseButtonClicked();
+    }
+
+    OUString DatabaseLocationInputController_Impl::impl_getCurrentURL() const
+    {
+        OUString sCurrentFile( m_rLocationInput.get_active_text() );
+        if ( !sCurrentFile.isEmpty() )
+        {
+            ::svt::OFileNotation aCurrentFile( sCurrentFile );
+            sCurrentFile = aCurrentFile.get( ::svt::OFileNotation::N_URL );
+        }
+        return sCurrentFile;
+    }
+
+    void DatabaseLocationInputController_Impl::impl_onBrowseButtonClicked()
+    {
+        ::sfx2::FileDialogHelper aFileDlg(
+            TemplateDescription::FILESAVE_AUTOEXTENSION,
+            FileDialogFlags::NONE,
+            &m_rDialog
+        );
+        aFileDlg.SetDisplayDirectory( impl_getCurrentURL() );
+
+        aFileDlg.AddFilter( m_sFilterUIName, "*." + m_aFilterExtensions[0] );
+        aFileDlg.SetCurrentFilter( m_sFilterUIName );
+
+        if ( aFileDlg.Execute() == ERRCODE_NONE )
+        {
+            INetURLObject aURL( aFileDlg.GetPath() );
+            if( aURL.GetProtocol() != INetProtocol::NotValid )
+            {
+                ::svt::OFileNotation aFileNotation( aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ) );
+                m_rLocationInput.set_entry_text(aFileNotation.get(::svt::OFileNotation::N_SYSTEM));
+                m_rLocationInput.trigger_changed();
+                // the dialog already checked for the file's existence, so we don't need to, again
+                m_bNeedExistenceCheck = false;
+            }
+        }
+    }
+
+    DatabaseLocationInputController::DatabaseLocationInputController( const Reference<XComponentContext>& _rContext,
+            URLBox& _rLocationInput, weld::Button& _rBrowseButton, weld::Window& _rDialog )
+        :m_pImpl( new DatabaseLocationInputController_Impl( _rContext, _rLocationInput, _rBrowseButton, _rDialog ) )
+    {
+    }
+
+    DatabaseLocationInputController::~DatabaseLocationInputController()
+    {
+    }
+
+    bool DatabaseLocationInputController::prepareCommit()
+    {
+        return m_pImpl->prepareCommit();
+    }
+
+    void DatabaseLocationInputController::setURL( const OUString& _rURL )
+    {
+        m_pImpl->setURL( _rURL );
+    }
+
+    OUString DatabaseLocationInputController::getURL() const
+    {
+        return m_pImpl->getURL();
+    }
+
+    class SvxDatabaseLocationInputController_Impl
+    {
+    public:
+        SvxDatabaseLocationInputController_Impl(
+            const Reference<XComponentContext>&     _rContext,
             ::svt::OFileURLControl&                 _rLocationInput,
             PushButton&                             _rBrowseButton
         );
-        ~DatabaseLocationInputController_Impl();
+        ~SvxDatabaseLocationInputController_Impl();
 
         bool     prepareCommit();
         void     setURL( const OUString& _rURL );
@@ -80,9 +278,9 @@ namespace svx
         bool                                    m_bNeedExistenceCheck;
     };
 
-
-    DatabaseLocationInputController_Impl::DatabaseLocationInputController_Impl( const Reference<XComponentContext>& _rContext,
-            ::svt::OFileURLControl& _rLocationInput, PushButton& _rBrowseButton )
+    SvxDatabaseLocationInputController_Impl::SvxDatabaseLocationInputController_Impl(const Reference<XComponentContext>& _rContext,
+            ::svt::OFileURLControl&                 _rLocationInput,
+            PushButton&                             _rBrowseButton)
         :m_xContext( _rContext )
         ,m_rLocationInput( _rLocationInput )
         ,m_rBrowseButton( _rBrowseButton )
@@ -100,20 +298,17 @@ namespace svx
             aExtensionList.append( ';' );
         }
         m_rLocationInput.SetFilter( aExtensionList.makeStringAndClear() );
-
-        m_rBrowseButton.AddEventListener( LINK( this, DatabaseLocationInputController_Impl, OnControlAction ) );
-        m_rLocationInput.AddEventListener( LINK( this, DatabaseLocationInputController_Impl, OnControlAction ) );
+        m_rBrowseButton.AddEventListener( LINK( this, SvxDatabaseLocationInputController_Impl, OnControlAction ) );
+        m_rLocationInput.AddEventListener( LINK( this, SvxDatabaseLocationInputController_Impl, OnControlAction ) );
     }
 
-
-    DatabaseLocationInputController_Impl::~DatabaseLocationInputController_Impl()
+    SvxDatabaseLocationInputController_Impl::~SvxDatabaseLocationInputController_Impl()
     {
-        m_rBrowseButton.RemoveEventListener( LINK( this, DatabaseLocationInputController_Impl, OnControlAction ) );
-        m_rLocationInput.RemoveEventListener( LINK( this, DatabaseLocationInputController_Impl, OnControlAction ) );
+        m_rBrowseButton.RemoveEventListener( LINK( this, SvxDatabaseLocationInputController_Impl, OnControlAction ) );
+        m_rLocationInput.RemoveEventListener( LINK( this, SvxDatabaseLocationInputController_Impl, OnControlAction ) );
     }
 
-
-    bool DatabaseLocationInputController_Impl::prepareCommit()
+    bool SvxDatabaseLocationInputController_Impl::prepareCommit()
     {
         OUString sURL( impl_getCurrentURL() );
         if ( sURL.isEmpty() )
@@ -135,21 +330,18 @@ namespace svx
         return true;
     }
 
-
-    void DatabaseLocationInputController_Impl::setURL( const OUString& _rURL )
+    void SvxDatabaseLocationInputController_Impl::setURL( const OUString& _rURL )
     {
         ::svt::OFileNotation aTransformer( _rURL );
         m_rLocationInput.SetText( aTransformer.get( ::svt::OFileNotation::N_SYSTEM ) );
     }
 
-
-    OUString DatabaseLocationInputController_Impl::getURL() const
+    OUString SvxDatabaseLocationInputController_Impl::getURL() const
     {
         return impl_getCurrentURL();
     }
 
-
-    void DatabaseLocationInputController_Impl::impl_initFilterProperties_nothrow()
+    void SvxDatabaseLocationInputController_Impl::impl_initFilterProperties_nothrow()
     {
         try
         {
@@ -193,8 +385,7 @@ namespace svx
         }
     }
 
-
-    IMPL_LINK( DatabaseLocationInputController_Impl, OnControlAction, VclWindowEvent&, _rEvent, void )
+    IMPL_LINK( SvxDatabaseLocationInputController_Impl, OnControlAction, VclWindowEvent&, _rEvent, void )
     {
         if  (   ( _rEvent.GetWindow() == &m_rBrowseButton )
             &&  ( _rEvent.GetId() == VclEventId::ButtonClick )
@@ -211,8 +402,7 @@ namespace svx
         }
     }
 
-
-    OUString DatabaseLocationInputController_Impl::impl_getCurrentURL() const
+    OUString SvxDatabaseLocationInputController_Impl::impl_getCurrentURL() const
     {
         OUString sCurrentFile( m_rLocationInput.GetText() );
         if ( !sCurrentFile.isEmpty() )
@@ -223,8 +413,7 @@ namespace svx
         return sCurrentFile;
     }
 
-

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list