weld OConnectionTabPage

Change-Id: Icdbe5d95d0850d131018d21d0a21cb12109d565c
Reviewed-on: https://gerrit.libreoffice.org/62283
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/dbaccess/source/ui/control/curledit.cxx b/dbaccess/source/ui/control/curledit.cxx
index 16e681e..a50a2c1 100644
--- a/dbaccess/source/ui/control/curledit.cxx
+++ b/dbaccess/source/ui/control/curledit.cxx
@@ -150,6 +150,68 @@ void OConnectionURLEdit::ShowPrefix(bool _bShowPrefix)
        m_pForcedPrefix->Show(m_bShowPrefix);
}

DBOConnectionURLEdit::DBOConnectionURLEdit(std::unique_ptr<weld::Entry> xEntry, std::unique_ptr<weld::Label> xForcedPrefix)
    : m_pTypeCollection(nullptr)
    , m_bShowPrefix(false)
    , m_xEntry(std::move(xEntry))
    , m_xForcedPrefix(std::move(xForcedPrefix))
{
}

DBOConnectionURLEdit::~DBOConnectionURLEdit()
{
}

void DBOConnectionURLEdit::SetTextNoPrefix(const OUString& _rText)
{
    m_xEntry->set_text(_rText);
}

OUString DBOConnectionURLEdit::GetTextNoPrefix() const
{
    return m_xEntry->get_text();
}

void DBOConnectionURLEdit::SetText(const OUString& _rStr)
{
    Selection aNoSelection(0,0);
    SetText(_rStr, aNoSelection);
}

void DBOConnectionURLEdit::SetText(const OUString& _rStr, const Selection& /*_rNewSelection*/)
{
    m_xForcedPrefix->show(m_bShowPrefix);

    bool bIsEmpty = _rStr.isEmpty();
    // calc the prefix
    OUString sPrefix;
    if (!bIsEmpty)
    {
        // determine the type of the new URL described by the new text
        sPrefix = m_pTypeCollection->getPrefix(_rStr);
    }

    // the fixed text gets the prefix
    m_xForcedPrefix->set_label(sPrefix);

    // do the real SetText
    OUString sNewText( _rStr );
    if ( !bIsEmpty )
        sNewText  = m_pTypeCollection->cutPrefix( _rStr );
    m_xEntry->set_text(sNewText);
}

OUString DBOConnectionURLEdit::GetText() const
{
    return m_xForcedPrefix->get_label() + m_xEntry->get_text();
}

void DBOConnectionURLEdit::ShowPrefix(bool _bShowPrefix)
{
    m_bShowPrefix = _bShowPrefix;
    m_xForcedPrefix->show(m_bShowPrefix);
}

}   // namespace dbaui

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/dbaccess/source/ui/dlg/ConnectionHelper.cxx b/dbaccess/source/ui/dlg/ConnectionHelper.cxx
index 79b6514..7642114 100644
--- a/dbaccess/source/ui/dlg/ConnectionHelper.cxx
+++ b/dbaccess/source/ui/dlg/ConnectionHelper.cxx
@@ -738,6 +738,651 @@ namespace dbaui
        }
    }

    DBOConnectionHelper::DBOConnectionHelper(TabPageParent pParent, const OUString& _rUIXMLDescription, const OString& _rId, const SfxItemSet& _rCoreAttrs)
        : OGenericAdministrationPage(pParent, _rUIXMLDescription, _rId, _rCoreAttrs)
        , m_bUserGrabFocus(false)
        , m_pCollection(nullptr)
        , m_xFT_Connection(m_xBuilder->weld_label("browseurllabel"))
        , m_xPB_Connection(m_xBuilder->weld_button("browse"))
        , m_xPB_CreateDB(m_xBuilder->weld_button("create"))
        , m_xConnectionURL(new DBOConnectionURLEdit(m_xBuilder->weld_entry("browseurl"), m_xBuilder->weld_label("browselabel")))
    {
        // extract the datasource type collection from the item set
        const DbuTypeCollectionItem* pCollectionItem = dynamic_cast<const DbuTypeCollectionItem*>( _rCoreAttrs.GetItem(DSID_TYPECOLLECTION) );
        if (pCollectionItem)
            m_pCollection = pCollectionItem->getCollection();
        m_xPB_Connection->connect_clicked(LINK(this, DBOConnectionHelper, OnBrowseConnections));
        m_xPB_CreateDB->connect_clicked(LINK(this, DBOConnectionHelper, OnCreateDatabase));
        OSL_ENSURE(m_pCollection, "OConnectionHelper::OConnectionHelper : really need a DSN type collection !");
        m_xConnectionURL->SetTypeCollection(m_pCollection);

        m_xConnectionURL->connect_focus_in(LINK(this, DBOConnectionHelper, GetFocusHdl));
        m_xConnectionURL->connect_focus_out(LINK(this, DBOConnectionHelper, LoseFocusHdl));
    }

    DBOConnectionHelper::~DBOConnectionHelper()
    {
    }

    void DBOConnectionHelper::dispose()
    {
        m_xConnectionURL.reset();
        OGenericAdministrationPage::dispose();
    }

    void DBOConnectionHelper::implInitControls(const SfxItemSet& _rSet, bool _bSaveValue)
    {
        // check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
        bool bValid, bReadonly;
        getFlags(_rSet, bValid, bReadonly);

        m_xFT_Connection->show();
        m_xConnectionURL->show();
        m_xConnectionURL->ShowPrefix( ::dbaccess::DST_JDBC == m_pCollection->determineType(m_eType) );

        bool bEnableBrowseButton = m_pCollection->supportsBrowsing( m_eType );
        m_xPB_Connection->show( bEnableBrowseButton );

        bool bEnableCreateButton = m_pCollection->supportsDBCreation( m_eType );
        m_xPB_CreateDB->show( bEnableCreateButton );

        const SfxStringItem* pUrlItem = _rSet.GetItem<SfxStringItem>(DSID_CONNECTURL);

        // forward the values to the controls
        if ( bValid )
        {
            OUString sUrl = pUrlItem->GetValue();
            setURL( sUrl );

            checkTestConnection();
            m_xConnectionURL->save_value();
        }

        OGenericAdministrationPage::implInitControls(_rSet, _bSaveValue);
    }

    void DBOConnectionHelper::implUpdateURLDependentStates() const
    {
        OSL_PRECOND( m_pAdminDialog && m_pCollection, "OConnectionHelper::implUpdateURLDependentStates: no admin dialog!" );
        if ( !m_pAdminDialog || !m_pCollection )
            return;

        if ( m_pCollection->isFileSystemBased(m_eType) )
            m_pAdminDialog->enableConfirmSettings( !getURLNoPrefix().isEmpty() );
    }

    IMPL_LINK_NOARG(DBOConnectionHelper, OnBrowseConnections, weld::Button&, void)
    {
        OSL_ENSURE(m_pAdminDialog,"No Admin dialog set! ->GPF");
        const ::dbaccess::DATASOURCE_TYPE eType = m_pCollection->determineType(m_eType);
        switch ( eType )
        {
            case  ::dbaccess::DST_DBASE:
            case  ::dbaccess::DST_FLAT:
            {
                try
                {
                    Reference< XFolderPicker2 > xFolderPicker = FolderPicker::create(m_xORB);

                    bool bDoBrowse = false;
                    OUString sOldPath = getURLNoPrefix();
                    do
                    {
                        if (!sOldPath.isEmpty())
                            xFolderPicker->setDisplayDirectory(sOldPath);
                        if (0 == xFolderPicker->execute())
                            // cancelled by the user
                            return;

                        sOldPath = xFolderPicker->getDirectory();
                        switch (checkPathExistence(sOldPath))
                        {
                            case RET_RETRY:
                                bDoBrowse = true;
                                break;
                            case RET_CANCEL:
                                return;
                            default:
                                break;
                        }
                    }
                    while (bDoBrowse);

                    OUString sSelectedDirectory = xFolderPicker->getDirectory();
                    INetURLObject aSelectedDirectory( sSelectedDirectory, INetURLObject::EncodeMechanism::WasEncoded, RTL_TEXTENCODING_UTF8 );

                    // for UI purpose, we don't want to have the path encoded
                    sSelectedDirectory = aSelectedDirectory.GetMainURL( INetURLObject::DecodeMechanism::WithCharset );

                    setURLNoPrefix( sSelectedDirectory );
                    SetRoadmapStateValue(true);
                    callModifiedHdl();
                }
                catch( const Exception& )
                {
                    DBG_UNHANDLED_EXCEPTION("dbaccess");
                }
            }
            break;
            case  ::dbaccess::DST_CALC:
            {
                SvtModuleOptions aModule;
                ::sfx2::FileDialogHelper aFileDlg(
                    ui::dialogs::TemplateDescription::FILEOPEN_READONLY_VERSION,
                    FileDialogFlags::NONE,
                    aModule.GetFactoryEmptyDocumentURL(SvtModuleOptions::EFactory::CALC)
                    ,SfxFilterFlags::IMPORT, SfxFilterFlags::NONE, GetFrameWeld());
                askForFileName(aFileDlg);
            }
            break;
            case  ::dbaccess::DST_WRITER:
            {
                SvtModuleOptions aModule;
                ::sfx2::FileDialogHelper aFileDlg(
                    ui::dialogs::TemplateDescription::FILEOPEN_READONLY_VERSION,
                    FileDialogFlags::NONE,
                    aModule.GetFactoryEmptyDocumentURL(SvtModuleOptions::EFactory::WRITER),
                    SfxFilterFlags::IMPORT, SfxFilterFlags::NONE, GetFrameWeld());
                askForFileName(aFileDlg);
            }
            break;
            case  ::dbaccess::DST_MSACCESS:
            {
                const OUString sExt("*.mdb;*.mde");
                OUString sFilterName(DBA_RES (STR_MSACCESS_FILTERNAME));
                ::sfx2::FileDialogHelper aFileDlg(
                    ui::dialogs::TemplateDescription::FILEOPEN_READONLY_VERSION,
                    FileDialogFlags::NONE, GetFrameWeld());
                aFileDlg.AddFilter(sFilterName,sExt);
                aFileDlg.SetCurrentFilter(sFilterName);
                askForFileName(aFileDlg);
            }
            break;
            case  ::dbaccess::DST_MSACCESS_2007:
            {
                const OUString sAccdb("*.accdb;*.accde");
                OUString sFilterName2(DBA_RES (STR_MSACCESS_2007_FILTERNAME));
                ::sfx2::FileDialogHelper aFileDlg(
                    ui::dialogs::TemplateDescription::FILEOPEN_READONLY_VERSION,
                    FileDialogFlags::NONE, GetFrameWeld());
                aFileDlg.AddFilter(sFilterName2,sAccdb);
                aFileDlg.SetCurrentFilter(sFilterName2);
                askForFileName(aFileDlg);
            }
            break;
            case  ::dbaccess::DST_MYSQL_ODBC:
            case  ::dbaccess::DST_ODBC:
            {
                // collect all ODBC data source names
                OUString sCurrDatasource = getURLNoPrefix();
                OUString sDataSource;
                if ( getSelectedDataSource(sDataSource,sCurrDatasource) && !sDataSource.isEmpty() )
                {
                    setURLNoPrefix(sDataSource);
                    SetRoadmapStateValue(true);
                    callModifiedHdl();
                }
                else
                    return;
            }
            break;
#if defined _WIN32
            case  ::dbaccess::DST_ADO:
            {
                OUString sOldDataSource=getURLNoPrefix();
                OUString sNewDataSource;
                HWND hWnd = GetParent()->GetSystemData()->hWnd;
                sNewDataSource = getAdoDatalink(reinterpret_cast<LONG_PTR>(hWnd),sOldDataSource);
                if ( !sNewDataSource.isEmpty() )
                {
                    setURLNoPrefix(sNewDataSource);
                    SetRoadmapStateValue(true);
                    callModifiedHdl();
                }
                else
                    return;
            }
            break;
#endif
            case  ::dbaccess::DST_MOZILLA:
            case  ::dbaccess::DST_THUNDERBIRD:
            {
                MozillaProductType profileType = MozillaProductType_Mozilla;
                if (eType ==  ::dbaccess::DST_THUNDERBIRD)
                    profileType = MozillaProductType_Thunderbird;

                Reference<XComponentContext> xContext = ::comphelper::getProcessComponentContext();
                Reference<XMozillaBootstrap> xMozillaBootstrap = MozillaBootstrap::create(xContext);

                // collect all Mozilla Profiles
                css::uno::Sequence< OUString > list;

                xMozillaBootstrap->getProfileList( profileType, list );
                const OUString * pArray = list.getConstArray();

                sal_Int32 count = list.getLength();

                std::set<OUString> aProfiles;
                for (sal_Int32 index=0; index < count; index++)
                    aProfiles.insert(pArray[index]);

                // execute the select dialog
                ScopedVclPtrInstance< ODatasourceSelectDialog > aSelector(GetParent(), aProfiles);
                OUString sOldProfile=getURLNoPrefix();

                if (!sOldProfile.isEmpty())
                    aSelector->Select(sOldProfile);
                else
                    aSelector->Select(xMozillaBootstrap->getDefaultProfile(profileType));

                if ( RET_OK == aSelector->Execute() )
                    setURLNoPrefix(aSelector->GetSelected());
                break;
            }
            case ::dbaccess::DST_FIREBIRD:
            {
                const OUString sExt("*.fdb");
                OUString sFilterName(DBA_RES (STR_FIREBIRD_FILTERNAME));
                ::sfx2::FileDialogHelper aFileDlg(
                    ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE,
                    FileDialogFlags::NONE, GetFrameWeld());
                aFileDlg.AddFilter(sFilterName,sExt);
                aFileDlg.SetCurrentFilter(sFilterName);
                askForFileName(aFileDlg);
                break;
            }
            default:
                break;
        }

        checkTestConnection();
    }

    IMPL_LINK_NOARG(DBOConnectionHelper, OnCreateDatabase, weld::Button&, void)
    {
        OSL_ENSURE(m_pAdminDialog,"No Admin dialog set! ->GPF");
        const ::dbaccess::DATASOURCE_TYPE eType = m_pCollection->determineType(m_eType);
        switch ( eType )
        {
        case ::dbaccess::DST_FIREBIRD:
            {
                const OUString sExt("*.fdb");
                OUString sFilterName(DBA_RES (STR_FIREBIRD_FILTERNAME));
                ::sfx2::FileDialogHelper aFileDlg(
                    ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION,
                    FileDialogFlags::NONE, GetFrameWeld());
                aFileDlg.AddFilter(sFilterName,sExt);
                aFileDlg.SetCurrentFilter(sFilterName);
                askForFileName(aFileDlg);
                break;
            }
            default:
                break;
        }

        checkTestConnection();
    }

    bool DBOConnectionHelper::checkTestConnection()
    {
        return true;
    }

    void DBOConnectionHelper::impl_setURL( const OUString& _rURL, bool _bPrefix )
    {
        OUString sURL( comphelper::string::stripEnd(_rURL, '*') );
        OSL_ENSURE( m_pCollection, "OConnectionHelper::impl_setURL: have no interpreter for the URLs!" );

        if ( m_pCollection && !sURL.isEmpty() )
        {
            if ( m_pCollection->isFileSystemBased( m_eType ) )
            {
                // get the two parts: prefix and file URL
                OUString sTypePrefix, sFileURLEncoded;
                if ( _bPrefix )
                {
                    sTypePrefix = m_pCollection->getPrefix( m_eType );
                    sFileURLEncoded = m_pCollection->cutPrefix( sURL );
                }
                else
                {
                    sFileURLEncoded = sURL;
                }

                // substitute any variables
                sFileURLEncoded = SvtPathOptions().SubstituteVariable( sFileURLEncoded );

                // decode the URL
                sURL = sTypePrefix;
                if ( !sFileURLEncoded.isEmpty() )
                {
                    OFileNotation aFileNotation(sFileURLEncoded);
                    // set this decoded URL as text
                    sURL += aFileNotation.get(OFileNotation::N_SYSTEM);
                }
            }
        }

        if ( _bPrefix )
            m_xConnectionURL->SetText( sURL );
        else
            m_xConnectionURL->SetTextNoPrefix( sURL );

        implUpdateURLDependentStates();
    }

    OUString DBOConnectionHelper::impl_getURL() const
    {
        // get the pure text
        OUString sURL = m_xConnectionURL->GetTextNoPrefix();

        OSL_ENSURE( m_pCollection, "OConnectionHelper::impl_getURL: have no interpreter for the URLs!" );

        if ( m_pCollection && !sURL.isEmpty() )
        {
            if ( m_pCollection->isFileSystemBased( m_eType ) )
            {
                // get the two parts: prefix and file URL
                OUString sFileURLDecoded;
                sFileURLDecoded = sURL;

                sURL = OUString();
                if ( !sFileURLDecoded.isEmpty() )
                {
                    OFileNotation aFileNotation( sFileURLDecoded, OFileNotation::N_SYSTEM );
                    sURL += aFileNotation.get( OFileNotation::N_URL );
                }

                // encode the URL
                INetURLObject aFileURL( sFileURLDecoded, INetURLObject::EncodeMechanism::All, RTL_TEXTENCODING_UTF8 );
                sFileURLDecoded = aFileURL.GetMainURL( INetURLObject::DecodeMechanism::NONE );
            }
        }
        return sURL;
    }

    void DBOConnectionHelper::setURL( const OUString& _rURL )
    {
        impl_setURL( _rURL, true );
    }

    OUString DBOConnectionHelper::getURLNoPrefix( ) const
    {
        return impl_getURL();
    }

    void DBOConnectionHelper::setURLNoPrefix( const OUString& _rURL )
    {
        impl_setURL( _rURL, false );
    }

    sal_Int32 DBOConnectionHelper::checkPathExistence(const OUString& _rURL)
    {
        IS_PATH_EXIST e_exists = pathExists(_rURL, false);
        if (!m_pCollection->supportsDBCreation(m_eType) &&
            (( e_exists == PATH_NOT_EXIST) || ( e_exists == PATH_NOT_KNOWN)))
        {
            OUString sQuery(DBA_RES(STR_ASK_FOR_DIRECTORY_CREATION));
            OFileNotation aTransformer(_rURL);
            sQuery = sQuery.replaceFirst("$path$", aTransformer.get(OFileNotation::N_SYSTEM));

            m_bUserGrabFocus = false;
            vcl::Window* pWin = GetParent();
            std::unique_ptr<weld::MessageDialog> xQueryBox(Application::CreateMessageDialog(pWin ? pWin->GetFrameWeld() : nullptr,
                                                           VclMessageType::Question, VclButtonsType::YesNo,
                                                           sQuery));
            xQueryBox->set_default_response(RET_YES);
            sal_Int32 nQueryResult = xQueryBox->run();
            m_bUserGrabFocus = true;

            switch (nQueryResult)
            {
                case RET_YES:
                {
                    bool bTryCreate = false;
                    do
                    {
                        if ( !createDirectoryDeep(_rURL) )
                        {   // could not create the directory
                            sQuery = DBA_RES(STR_COULD_NOT_CREATE_DIRECTORY);
                            sQuery = sQuery.replaceFirst("$name$", aTransformer.get(OFileNotation::N_SYSTEM));

                            m_bUserGrabFocus = false;

                            std::unique_ptr<weld::MessageDialog> xWhatToDo(Application::CreateMessageDialog(pWin ? pWin->GetFrameWeld() : nullptr,
                                                                           VclMessageType::Question, VclButtonsType::NONE,
                                                                           sQuery));
                            xWhatToDo->add_button(Button::GetStandardText(StandardButtonType::Retry), RET_RETRY);
                            xWhatToDo->add_button(Button::GetStandardText(StandardButtonType::Cancel), RET_CANCEL);
                            xWhatToDo->set_default_response(RET_RETRY);
                            nQueryResult = xWhatToDo->run();
                            m_bUserGrabFocus = true;

                            if (RET_RETRY == nQueryResult)
                                bTryCreate = true;
                            else
                            {
                                SetRoadmapStateValue(false);
                                callModifiedHdl();
                                return RET_RETRY;
                            }
                        }
                    }
                    while (bTryCreate);
                }
                break;

                case RET_NO:
                    callModifiedHdl();
                    return RET_OK;

                default:
                    // cancelled
                    SetRoadmapStateValue(false);
                    callModifiedHdl();
                    return RET_CANCEL;
            }
        }
/*        else
        {
            // TODO: error msg
            return RET_CANCEL;
        } */
        SetRoadmapStateValue(true);
        callModifiedHdl();
        return RET_OK;
    }

    IS_PATH_EXIST DBOConnectionHelper::pathExists(const OUString& _rURL, bool bIsFile) const
    {
        ::ucbhelper::Content aCheckExistence;
        IS_PATH_EXIST eExists = PATH_NOT_EXIST;
        Reference< css::task::XInteractionHandler > xInteractionHandler(
            task::InteractionHandler::createWithParent(m_xORB, nullptr), UNO_QUERY );
        OFilePickerInteractionHandler* pHandler = new OFilePickerInteractionHandler(xInteractionHandler);
        xInteractionHandler = pHandler;

        Reference< XCommandEnvironment > xCmdEnv = new ::ucbhelper::CommandEnvironment( xInteractionHandler, Reference< XProgressHandler >() );
        try
        {
            aCheckExistence = ::ucbhelper::Content(_rURL, xCmdEnv, comphelper::getProcessComponentContext());
            const bool bExists = bIsFile? aCheckExistence.isDocument(): aCheckExistence.isFolder();
            eExists = bExists? PATH_EXIST: PATH_NOT_EXIST;
        }
        catch (const Exception&)
        {
            eExists = pHandler->isDoesNotExist() ? PATH_NOT_EXIST : (bIsFile ? PATH_NOT_EXIST : PATH_NOT_KNOWN);
        }
        return eExists;
    }

    IMPL_LINK_NOARG(DBOConnectionHelper, GetFocusHdl, weld::Widget&, void)
    {
        if (!m_pCollection->isFileSystemBased(m_eType))
            return;
        if (!m_bUserGrabFocus)
            return;
        // URL edit field got the focus
        m_xConnectionURL->SaveValueNoPrefix();
    }

    IMPL_LINK_NOARG(DBOConnectionHelper, LoseFocusHdl, weld::Widget&, void)
    {
        if (!m_pCollection->isFileSystemBased(m_eType))
            return;
        if (!m_bUserGrabFocus)
            return;
        // URL edit field lost the focus
        commitURL();
    }

    bool DBOConnectionHelper::createDirectoryDeep(const OUString& _rPathURL)
    {
        // get an URL object analyzing the URL for us ...
        INetURLObject aParser;
        aParser.SetURL(_rPathURL);

        INetProtocol eProtocol = aParser.GetProtocol();

        std::vector< OUString > aToBeCreated;  // the to-be-created levels

        // search a level which exists
        IS_PATH_EXIST eParentExists = PATH_NOT_EXIST;
        while ( eParentExists == PATH_NOT_EXIST && aParser.getSegmentCount())
        {
            aToBeCreated.push_back(aParser.getName());  // remember the local name for creation
            aParser.removeSegment();                    // cut the local name
            eParentExists = pathExists(aParser.GetMainURL(INetURLObject::DecodeMechanism::NONE), false);
        }

        if (!aParser.getSegmentCount())
            return false;

        // create all the missing levels
        try
        {
            // the parent content
            Reference< XCommandEnvironment > xEmptyEnv;
            ::ucbhelper::Content aParent(aParser.GetMainURL(INetURLObject::DecodeMechanism::NONE), xEmptyEnv, comphelper::getProcessComponentContext());

            OUString sContentType;
            if ( INetProtocol::File == eProtocol )
            {
                sContentType = "application/vnd.sun.staroffice.fsys-folder";
                // the file UCP currently does not support the ContentType property
            }
            else
            {
                Any aContentType = aParent.getPropertyValue("ContentType");
                aContentType >>= sContentType;
            }

            // the properties which need to be set on the new content
            Sequence< OUString > aNewDirectoryProperties { "Title" };

            // the values to be set
            Sequence< Any > aNewDirectoryAttributes(1);

            // loop
            for (   std::vector< OUString >::const_reverse_iterator aLocalName = aToBeCreated.rbegin();
                    aLocalName != aToBeCreated.rend();
                    ++aLocalName
                )
            {
                aNewDirectoryAttributes[0] <<= *aLocalName;
                if (!aParent.insertNewContent(sContentType, aNewDirectoryProperties, aNewDirectoryAttributes, aParent))
                    return false;
            }
        }
        catch ( const Exception& )
        {
            DBG_UNHANDLED_EXCEPTION("dbaccess");
            return false;
        }

        return true;
    }

    void DBOConnectionHelper::fillWindows(std::vector< std::unique_ptr<ISaveValueWrapper> >& _rControlList)
    {
        _rControlList.emplace_back(new ODisableWidgetWrapper<weld::Label>(m_xFT_Connection.get()));
        _rControlList.emplace_back(new ODisableWidgetWrapper<weld::Button>(m_xPB_Connection.get()));
        _rControlList.emplace_back(new ODisableWidgetWrapper<weld::Button>(m_xPB_CreateDB.get()));
    }

    void DBOConnectionHelper::fillControls(std::vector< std::unique_ptr<ISaveValueWrapper> >& _rControlList)
    {
        _rControlList.emplace_back( new OSaveValueWidgetWrapper<DBOConnectionURLEdit>( m_xConnectionURL.get() ) );
    }

    void DBOConnectionHelper::commitURL()
    {
        OUString sURL;
        OUString sOldPath;
        sOldPath = m_xConnectionURL->GetSavedValueNoPrefix();
        sURL = m_xConnectionURL->GetTextNoPrefix();

        if ( m_pCollection->isFileSystemBased(m_eType) )
        {
            if ( ( sURL != sOldPath ) && !sURL.isEmpty() )
            {   // the text changed since entering the control

                // the path may be in system notation ....
                OFileNotation aTransformer(sURL);
                sURL = aTransformer.get(OFileNotation::N_URL);

                const ::dbaccess::DATASOURCE_TYPE eType = m_pCollection->determineType(m_eType);

                if ( ( ::dbaccess::DST_CALC == eType) || ( ::dbaccess::DST_WRITER == eType) || ( ::dbaccess::DST_MSACCESS == eType) || ( ::dbaccess::DST_MSACCESS_2007 == eType) )
                {
                    if( pathExists(sURL, true) == PATH_NOT_EXIST )
                    {
                        OUString sFile = DBA_RES( STR_FILE_DOES_NOT_EXIST );
                        sFile = sFile.replaceFirst("$file$", aTransformer.get(OFileNotation::N_SYSTEM));
                        OSQLWarningBox aWarning(GetFrameWeld(), sFile);
                        aWarning.run();
                        setURLNoPrefix(sOldPath);
                        SetRoadmapStateValue(false);
                        callModifiedHdl();
                        return;
                    }
                }
                else
                {
                    switch (checkPathExistence(sURL))
                    {
                        case RET_RETRY:
                            m_bUserGrabFocus = false;
                            m_xConnectionURL->grab_focus();
                            m_bUserGrabFocus = true;
                            return;
                        case RET_CANCEL:
                            setURLNoPrefix(sOldPath);
                            return;
                    }
                }
            }
        }

        setURLNoPrefix(sURL);
        m_xConnectionURL->SaveValueNoPrefix();
    }

    void DBOConnectionHelper::askForFileName(::sfx2::FileDialogHelper& _aFileOpen)
    {
        OUString sOldPath = getURLNoPrefix();
        if ( !sOldPath.isEmpty() )
            _aFileOpen.SetDisplayDirectory(sOldPath);
        else
            _aFileOpen.SetDisplayDirectory( SvtPathOptions().GetWorkPath() );
        if (ERRCODE_NONE == _aFileOpen.Execute())
        {
            setURLNoPrefix(_aFileOpen.GetPath());
            SetRoadmapStateValue(checkTestConnection());
            callModifiedHdl();
        }
    }

}   // namespace dbaui

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/dbaccess/source/ui/dlg/ConnectionHelper.hxx b/dbaccess/source/ui/dlg/ConnectionHelper.hxx
index e7a1a2f..1aa5197 100644
--- a/dbaccess/source/ui/dlg/ConnectionHelper.hxx
+++ b/dbaccess/source/ui/dlg/ConnectionHelper.hxx
@@ -98,6 +98,72 @@ namespace dbaui
        void        implUpdateURLDependentStates() const;
    };

    class DBOConnectionHelper : public OGenericAdministrationPage
    {
        bool            m_bUserGrabFocus;

    public:
        DBOConnectionHelper(TabPageParent pParent, const OUString& _rUIXMLDescription, const OString& _rId, const SfxItemSet& _rCoreAttrs);
        virtual ~DBOConnectionHelper() override;
        virtual void dispose() override;

        OUString     m_eType;          // the type can't be changed in this class, so we hold it as member.
        // setting/retrieving the current connection URL
        // necessary because for some types, the URL must be decoded for display purposes
        ::dbaccess::ODsnTypeCollection* m_pCollection;  /// the DSN type collection instance

        std::unique_ptr<weld::Label> m_xFT_Connection;
        std::unique_ptr<weld::Button> m_xPB_Connection;
        std::unique_ptr<weld::Button> m_xPB_CreateDB;
        std::unique_ptr<DBOConnectionURLEdit> m_xConnectionURL;

    public:

        // <method>OGenericAdministrationPage::fillControls</method>
        virtual void    fillControls(std::vector< std::unique_ptr<ISaveValueWrapper> >& _rControlList) override;
        // <method>OGenericAdministrationPage::fillWindows</method>
        virtual void    fillWindows(std::vector< std::unique_ptr<ISaveValueWrapper> >& _rControlList) override;
        virtual void    implInitControls(const SfxItemSet& _rSet, bool _bSaveValue) override;

        // setting/retrieving the current connection URL
        // necessary because for some types, the URL must be decoded for display purposes
        //String        getURL( OConnectionURLEdit* _m_pConnection ) const;
        //void      setURL( const OUString& _rURL, OConnectionURLEdit* _m_pConnection );

        OUString    getURLNoPrefix( ) const;
        void        setURLNoPrefix( const OUString& _rURL );

        /** checks if the path is existence
            @param  _rURL
                The URL to check.
        */
        sal_Int32   checkPathExistence(const OUString& _rURL);

        IS_PATH_EXIST   pathExists(const OUString& _rURL, bool bIsFile) const;
        bool        createDirectoryDeep(const OUString& _rPathNormalized);
        void        commitURL();

        /** opens the FileOpen dialog and asks for a FileName
            @param  _aFileOpen
                Executes the file open dialog, which must be filled from caller.
        */
        void askForFileName(::sfx2::FileDialogHelper& _aFileOpen);

    protected:
        void            setURL( const OUString& _rURL );
        virtual bool    checkTestConnection();

    private:
        DECL_LINK(OnBrowseConnections, weld::Button&, void);
        DECL_LINK(OnCreateDatabase, weld::Button&, void);
        DECL_LINK(GetFocusHdl, weld::Widget&, void);
        DECL_LINK(LoseFocusHdl, weld::Widget&, void);
        OUString    impl_getURL() const;
        void        impl_setURL( const OUString& _rURL, bool _bPrefix );
        void        implUpdateURLDependentStates() const;
    };


}   // namespace dbaui

#endif // INCLUDED_DBACCESS_SOURCE_UI_DLG_CONNECTIONHELPER_HXX
diff --git a/dbaccess/source/ui/dlg/ConnectionPage.cxx b/dbaccess/source/ui/dlg/ConnectionPage.cxx
index 3fef20d..f896451 100644
--- a/dbaccess/source/ui/dlg/ConnectionPage.cxx
+++ b/dbaccess/source/ui/dlg/ConnectionPage.cxx
@@ -76,33 +76,31 @@ namespace dbaui
    using namespace ::dbtools;
    using namespace ::svt;

    VclPtr<SfxTabPage> OConnectionTabPage::Create( TabPageParent pParent, const SfxItemSet* _rAttrSet )
    VclPtr<SfxTabPage> OConnectionTabPage::Create(TabPageParent pParent, const SfxItemSet* _rAttrSet)
    {
        return VclPtr<OConnectionTabPage>::Create( pParent.pParent, *_rAttrSet );
        return VclPtr<OConnectionTabPage>::Create(pParent, *_rAttrSet);
    }

    // OConnectionTabPage
    OConnectionTabPage::OConnectionTabPage(vcl::Window* pParent, const SfxItemSet& _rCoreAttrs)
        :OConnectionHelper(pParent, "ConnectionPage", "dbaccess/ui/connectionpage.ui", _rCoreAttrs)
    OConnectionTabPage::OConnectionTabPage(TabPageParent pParent, const SfxItemSet& _rCoreAttrs)
        : DBOConnectionHelper(pParent, "dbaccess/ui/connectionpage.ui", "ConnectionPage", _rCoreAttrs)
        , m_xFL2(m_xBuilder->weld_label("userlabel"))
        , m_xUserNameLabel(m_xBuilder->weld_label("userNameLabel"))
        , m_xUserName(m_xBuilder->weld_entry("userNameEntry"))
        , m_xPasswordRequired(m_xBuilder->weld_check_button("passCheckbutton"))
        , m_xFL3(m_xBuilder->weld_label("JDBCLabel"))
        , m_xJavaDriverLabel(m_xBuilder->weld_label("javaDriverLabel"))
        , m_xJavaDriver(m_xBuilder->weld_entry("driverEntry"))
        , m_xTestJavaDriver(m_xBuilder->weld_button("driverButton"))
        , m_xTestConnection(m_xBuilder->weld_button("connectionButton"))
    {
        get(m_pFL2, "userlabel");
        get(m_pUserNameLabel, "userNameLabel");
        get(m_pUserName, "userNameEntry");
        get(m_pPasswordRequired, "passCheckbutton");
        get(m_pFL3, "JDBCLabel");
        get(m_pJavaDriverLabel, "javaDriverLabel");
        get(m_pJavaDriver, "driverEntry");
        get(m_pTestJavaDriver, "driverButton");
        get(m_pTestConnection, "connectionButton");
        m_xConnectionURL->connect_changed(LINK(this, OConnectionTabPage, OnEditModified));
        m_xJavaDriver->connect_changed(LINK(this, OConnectionTabPage, OnEditModified));
        m_xUserName->connect_changed(LINK(this, OGenericAdministrationPage, OnControlEntryModifyHdl));
        m_xPasswordRequired->connect_toggled(LINK(this, OGenericAdministrationPage, OnControlModifiedButtonClick));

        m_pConnectionURL->SetModifyHdl(LINK(this, OConnectionTabPage, OnEditModified));
        m_pJavaDriver->SetModifyHdl(LINK(this, OGenericAdministrationPage, OnControlEditModifyHdl));
        m_pJavaDriver->SetModifyHdl(LINK(this, OConnectionTabPage, OnEditModified));
        m_pUserName->SetModifyHdl(LINK(this, OGenericAdministrationPage, OnControlEditModifyHdl));
        m_pPasswordRequired->SetClickHdl(LINK(this, OGenericAdministrationPage, OnControlModifiedClick));

        m_pTestConnection->SetClickHdl(LINK(this,OGenericAdministrationPage,OnTestConnectionClickHdl));
        m_pTestJavaDriver->SetClickHdl(LINK(this,OConnectionTabPage,OnTestJavaClickHdl));
        m_xTestConnection->connect_clicked(LINK(this,OGenericAdministrationPage,OnTestConnectionButtonClickHdl));
        m_xTestJavaDriver->connect_clicked(LINK(this,OConnectionTabPage,OnTestJavaClickHdl));
    }

    OConnectionTabPage::~OConnectionTabPage()
@@ -110,20 +108,6 @@ namespace dbaui
        disposeOnce();
    }

    void OConnectionTabPage::dispose()
    {
        m_pFL2.clear();
        m_pUserNameLabel.clear();
        m_pUserName.clear();
        m_pPasswordRequired.clear();
        m_pFL3.clear();
        m_pJavaDriverLabel.clear();
        m_pJavaDriver.clear();
        m_pTestJavaDriver.clear();
        m_pTestConnection.clear();
        OConnectionHelper::dispose();
    }

    void OConnectionTabPage::implInitControls(const SfxItemSet& _rSet, bool _bSaveValue)
    {
        // check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
@@ -131,60 +115,60 @@ namespace dbaui
        getFlags(_rSet, bValid, bReadonly);

        m_eType = m_pAdminDialog->getDatasourceType(_rSet);
        OConnectionHelper::implInitControls( _rSet, _bSaveValue);
        DBOConnectionHelper::implInitControls( _rSet, _bSaveValue);

        ::dbaccess::DATASOURCE_TYPE eType = m_pCollection->determineType(m_eType);
        switch( eType )
        {
            case  ::dbaccess::DST_DBASE:
                m_pFT_Connection->SetText(DBA_RES(STR_DBASE_PATH_OR_FILE));
                m_pConnectionURL->SetHelpId(HID_DSADMIN_DBASE_PATH);
                m_xFT_Connection->set_label(DBA_RES(STR_DBASE_PATH_OR_FILE));
                m_xConnectionURL->set_help_id(HID_DSADMIN_DBASE_PATH);
                break;
            case  ::dbaccess::DST_FLAT:
                m_pFT_Connection->SetText(DBA_RES(STR_FLAT_PATH_OR_FILE));
                m_pConnectionURL->SetHelpId(HID_DSADMIN_FLAT_PATH);
                m_xFT_Connection->set_label(DBA_RES(STR_FLAT_PATH_OR_FILE));
                m_xConnectionURL->set_help_id(HID_DSADMIN_FLAT_PATH);
                break;
            case  ::dbaccess::DST_CALC:
                m_pFT_Connection->SetText(DBA_RES(STR_CALC_PATH_OR_FILE));
                m_pConnectionURL->SetHelpId(HID_DSADMIN_CALC_PATH);
                m_xFT_Connection->set_label(DBA_RES(STR_CALC_PATH_OR_FILE));
                m_xConnectionURL->set_help_id(HID_DSADMIN_CALC_PATH);
                break;
            case  ::dbaccess::DST_WRITER:
                m_pFT_Connection->SetText(DBA_RES(STR_WRITER_PATH_OR_FILE));
                m_pConnectionURL->SetHelpId(HID_DSADMIN_WRITER_PATH);
                m_xFT_Connection->set_label(DBA_RES(STR_WRITER_PATH_OR_FILE));
                m_xConnectionURL->set_help_id(HID_DSADMIN_WRITER_PATH);
                break;
            case  ::dbaccess::DST_ADO:
                m_pFT_Connection->SetText(DBA_RES(STR_COMMONURL));
                m_xFT_Connection->set_label(DBA_RES(STR_COMMONURL));
                break;
            case  ::dbaccess::DST_MSACCESS:
            case  ::dbaccess::DST_MSACCESS_2007:
                m_pFT_Connection->SetText(DBA_RES(STR_MSACCESS_MDB_FILE));
                m_pConnectionURL->SetHelpId(HID_DSADMIN_MSACCESS_MDB_FILE);
                m_xFT_Connection->set_label(DBA_RES(STR_MSACCESS_MDB_FILE));
                m_xConnectionURL->set_help_id(HID_DSADMIN_MSACCESS_MDB_FILE);
                break;
            case  ::dbaccess::DST_MYSQL_NATIVE:
            case  ::dbaccess::DST_MYSQL_JDBC:
                m_pFT_Connection->SetText(DBA_RES(STR_MYSQL_DATABASE_NAME));
                m_pConnectionURL->SetHelpId( HID_DSADMIN_MYSQL_DATABASE );
                m_xFT_Connection->set_label(DBA_RES(STR_MYSQL_DATABASE_NAME));
                m_xConnectionURL->set_help_id( HID_DSADMIN_MYSQL_DATABASE );
                break;
            case  ::dbaccess::DST_ORACLE_JDBC:
                m_pFT_Connection->SetText(DBA_RES(STR_ORACLE_DATABASE_NAME));
                m_pConnectionURL->SetHelpId(HID_DSADMIN_ORACLE_DATABASE);
                m_xFT_Connection->set_label(DBA_RES(STR_ORACLE_DATABASE_NAME));
                m_xConnectionURL->set_help_id(HID_DSADMIN_ORACLE_DATABASE);
                break;
            case  ::dbaccess::DST_MYSQL_ODBC:
            case  ::dbaccess::DST_ODBC:
                m_pFT_Connection->SetText(DBA_RES(STR_NAME_OF_ODBC_DATASOURCE));
                m_pConnectionURL->SetHelpId( eType ==  ::dbaccess::DST_MYSQL_ODBC ? HID_DSADMIN_MYSQL_ODBC_DATASOURCE : HID_DSADMIN_ODBC_DATASOURCE);
                m_xFT_Connection->set_label(DBA_RES(STR_NAME_OF_ODBC_DATASOURCE));
                m_xConnectionURL->set_help_id( eType ==  ::dbaccess::DST_MYSQL_ODBC ? HID_DSADMIN_MYSQL_ODBC_DATASOURCE : HID_DSADMIN_ODBC_DATASOURCE);
                break;
            case  ::dbaccess::DST_LDAP:
                m_pFT_Connection->SetText(DBA_RES(STR_HOSTNAME));
                m_pConnectionURL->SetHelpId( HID_DSADMIN_LDAP_HOSTNAME );
                m_xFT_Connection->set_label(DBA_RES(STR_HOSTNAME));
                m_xConnectionURL->set_help_id( HID_DSADMIN_LDAP_HOSTNAME );
                break;
            case  ::dbaccess::DST_MOZILLA:
                m_pFT_Connection->SetText(DBA_RES(STR_MOZILLA_PROFILE_NAME));
                m_pConnectionURL->SetHelpId( HID_DSADMIN_MOZILLA_PROFILE_NAME );
                m_xFT_Connection->set_label(DBA_RES(STR_MOZILLA_PROFILE_NAME));
                m_xConnectionURL->set_help_id( HID_DSADMIN_MOZILLA_PROFILE_NAME );
                break;
            case  ::dbaccess::DST_THUNDERBIRD:
                m_pFT_Connection->SetText(DBA_RES(STR_THUNDERBIRD_PROFILE_NAME));
                m_pConnectionURL->SetHelpId( HID_DSADMIN_THUNDERBIRD_PROFILE_NAME );
                m_xFT_Connection->set_label(DBA_RES(STR_THUNDERBIRD_PROFILE_NAME));
                m_xConnectionURL->set_help_id( HID_DSADMIN_THUNDERBIRD_PROFILE_NAME );
                break;
            case  ::dbaccess::DST_OUTLOOK:
            case  ::dbaccess::DST_OUTLOOKEXP:
@@ -193,18 +177,18 @@ namespace dbaui
            case  ::dbaccess::DST_EVOLUTION_LDAP:
            case  ::dbaccess::DST_KAB:
            case  ::dbaccess::DST_MACAB:
                m_pFT_Connection->SetText(DBA_RES(STR_NO_ADDITIONAL_SETTINGS));
                m_xFT_Connection->set_label(DBA_RES(STR_NO_ADDITIONAL_SETTINGS));
                {
                    OUString sText = m_pFT_Connection->GetText();
                    sText = sText.replaceAll("%test",m_pTestConnection->GetText());
                    OUString sText = m_xFT_Connection->get_label();
                    sText = sText.replaceAll("%test",m_xTestConnection->get_label());
                    sText = sText.replaceAll("~","");
                    m_pFT_Connection->SetText(sText);
                    m_xFT_Connection->set_label(sText);
                }
                m_pConnectionURL->Hide();
                m_xConnectionURL->hide();
                break;
            case  ::dbaccess::DST_JDBC:
            default:
                m_pFT_Connection->SetText(DBA_RES(STR_COMMONURL));
                m_xFT_Connection->set_label(DBA_RES(STR_COMMONURL));
                break;
        }

@@ -212,13 +196,11 @@ namespace dbaui
        bool bShowUserAuthenfication = ( eAuthMode != AuthNone );
        bool bShowUser = ( eAuthMode == AuthUserPwd );

        m_pPB_Connection->SetHelpId(HID_DSADMIN_BROWSECONN);
        m_pFL2->Show( bShowUserAuthenfication );
        m_pUserNameLabel->Show( bShowUser && bShowUserAuthenfication );
        m_pUserName->Show( bShowUser && bShowUserAuthenfication );
        m_pPasswordRequired->Show( bShowUserAuthenfication );
        if ( !bShowUser && bShowUserAuthenfication )
            m_pPasswordRequired->SetPosPixel(m_pUserNameLabel->GetPosPixel());
        m_xPB_Connection->set_help_id(HID_DSADMIN_BROWSECONN);
        m_xFL2->show( bShowUserAuthenfication );
        m_xUserNameLabel->show( bShowUser && bShowUserAuthenfication );
        m_xUserName->show( bShowUser && bShowUserAuthenfication );
        m_xPasswordRequired->show( bShowUserAuthenfication );

        // collect the items
        const SfxStringItem* pUidItem = _rSet.GetItem<SfxStringItem>(DSID_USER);
@@ -230,8 +212,8 @@ namespace dbaui
        // forward the values to the controls
        if ( bValid )
        {
            m_pUserName->SetText(pUidItem->GetValue());
            m_pPasswordRequired->Check(pAllowEmptyPwd->GetValue());
            m_xUserName->set_text(pUidItem->GetValue());
            m_xPasswordRequired->set_active(pAllowEmptyPwd->GetValue());

            const OUString& sUrl = pUrlItem->GetValue();
            setURL( sUrl );
@@ -241,25 +223,22 @@ namespace dbaui
            {
                OUString sDefaultJdbcDriverName = m_pCollection->getJavaDriverClass(m_eType);
                if ( !sDefaultJdbcDriverName.isEmpty() )
                {
                    m_pJavaDriver->SetText(sDefaultJdbcDriverName);
                    m_pJavaDriver->SetModifyFlag();
                }
                    m_xJavaDriver->set_text(sDefaultJdbcDriverName);
            }
            else
                m_pJavaDriver->SetText(pJdbcDrvItem->GetValue());
                m_xJavaDriver->set_text(pJdbcDrvItem->GetValue());

            m_pJavaDriverLabel->Show(bEnableJDBC);
            m_pJavaDriver->Show(bEnableJDBC);
            m_pTestJavaDriver->Show(bEnableJDBC);
            m_pTestJavaDriver->Enable( !m_pJavaDriver->GetText().trim().isEmpty() );
            m_pFL3->Show(bEnableJDBC);
            m_xJavaDriverLabel->show(bEnableJDBC);
            m_xJavaDriver->show(bEnableJDBC);
            m_xTestJavaDriver->show(bEnableJDBC);
            m_xTestJavaDriver->set_sensitive( !m_xJavaDriver->get_text().trim().isEmpty() );
            m_xFL3->show(bEnableJDBC);

            checkTestConnection();

            m_pUserName->ClearModifyFlag();
            m_pConnectionURL->ClearModifyFlag();
            m_pJavaDriver->ClearModifyFlag();
            m_xUserName->save_value();
            m_xConnectionURL->save_value();
            m_xJavaDriver->save_value();
        }
    }

@@ -267,36 +246,36 @@ namespace dbaui
    {
        bool bChangedSomething = false;

        if (m_pUserName->IsValueChangedFromSaved())
        if (m_xUserName->get_value_changed_from_saved())
        {
            _rSet->Put(SfxStringItem(DSID_USER, m_pUserName->GetText()));
            _rSet->Put(SfxStringItem(DSID_USER, m_xUserName->get_text()));
            _rSet->Put(SfxStringItem(DSID_PASSWORD, OUString()));
            bChangedSomething = true;
        }

        fillBool(*_rSet,m_pPasswordRequired,DSID_PASSWORDREQUIRED,bChangedSomething);
        fillBool(*_rSet,m_xPasswordRequired.get(),DSID_PASSWORDREQUIRED,false, bChangedSomething);

        if ( m_pCollection->determineType(m_eType) ==  ::dbaccess::DST_JDBC )
        {
            fillString(*_rSet,m_pJavaDriver, DSID_JDBCDRIVERCLASS, bChangedSomething);
            fillString(*_rSet,m_xJavaDriver.get(), DSID_JDBCDRIVERCLASS, bChangedSomething);
        }

        fillString(*_rSet,m_pConnectionURL, DSID_CONNECTURL, bChangedSomething);
        fillString(*_rSet,m_xConnectionURL.get(), DSID_CONNECTURL, bChangedSomething);

        return bChangedSomething;
    }
    IMPL_LINK_NOARG(OConnectionTabPage, OnTestJavaClickHdl, Button*, void)
    IMPL_LINK_NOARG(OConnectionTabPage, OnTestJavaClickHdl, weld::Button&, void)
    {
        OSL_ENSURE(m_pAdminDialog,"No Admin dialog set! ->GPF");
        bool bSuccess = false;
#if HAVE_FEATURE_JAVA
        try
        {
            if ( !m_pJavaDriver->GetText().trim().isEmpty() )
            if ( !m_xJavaDriver->get_text().trim().isEmpty() )
            {
                ::rtl::Reference< jvmaccess::VirtualMachine > xJVM = ::connectivity::getJavaVM( m_pAdminDialog->getORB() );
                m_pJavaDriver->SetText(m_pJavaDriver->GetText().trim()); // fdo#68341
                bSuccess = ::connectivity::existsJavaClassByName(xJVM,m_pJavaDriver->GetText().trim());
                m_xJavaDriver->set_text(m_xJavaDriver->get_text().trim()); // fdo#68341
                bSuccess = ::connectivity::existsJavaClassByName(xJVM,m_xJavaDriver->get_text().trim());
            }
        }
        catch(Exception&)
@@ -312,16 +291,16 @@ namespace dbaui
    bool OConnectionTabPage::checkTestConnection()
    {
        OSL_ENSURE(m_pAdminDialog,"No Admin dialog set! ->GPF");
        bool bEnableTestConnection = !m_pConnectionURL->IsVisible() || !m_pConnectionURL->GetTextNoPrefix().isEmpty();
        bool bEnableTestConnection = !m_xConnectionURL->get_visible() || !m_xConnectionURL->GetTextNoPrefix().isEmpty();
        if ( m_pCollection->determineType(m_eType) ==  ::dbaccess::DST_JDBC )
            bEnableTestConnection = bEnableTestConnection && (!m_pJavaDriver->GetText().trim().isEmpty());
        m_pTestConnection->Enable(bEnableTestConnection);
            bEnableTestConnection = bEnableTestConnection && (!m_xJavaDriver->get_text().trim().isEmpty());
        m_xTestConnection->set_sensitive(bEnableTestConnection);
        return true;
    }
    IMPL_LINK(OConnectionTabPage, OnEditModified, Edit&, _rEdit, void)
    IMPL_LINK(OConnectionTabPage, OnEditModified, weld::Entry&, rEdit, void)
    {
        if ( &_rEdit == m_pJavaDriver )
            m_pTestJavaDriver->Enable( !m_pJavaDriver->GetText().trim().isEmpty() );
        if (&rEdit == m_xJavaDriver.get())
            m_xTestJavaDriver->set_sensitive( !m_xJavaDriver->get_text().trim().isEmpty() );

        checkTestConnection();
        // tell the listener we were modified
diff --git a/dbaccess/source/ui/dlg/ConnectionPage.hxx b/dbaccess/source/ui/dlg/ConnectionPage.hxx
index 089baf3..d7d4be7 100644
--- a/dbaccess/source/ui/dlg/ConnectionPage.hxx
+++ b/dbaccess/source/ui/dlg/ConnectionPage.hxx
@@ -32,32 +32,31 @@ namespace dbaui

    /** implements the connection page of the data source properties dialog.
    */
    class OConnectionTabPage final : public OConnectionHelper
    class OConnectionTabPage final : public DBOConnectionHelper
    {
        friend class VclPtr<OConnectionTabPage>;
    private:
        // user authentication
        VclPtr<FixedText>          m_pFL2;
        VclPtr<FixedText>          m_pUserNameLabel;
        VclPtr<Edit>               m_pUserName;
        VclPtr<CheckBox>           m_pPasswordRequired;
        std::unique_ptr<weld::Label> m_xFL2;
        std::unique_ptr<weld::Label> m_xUserNameLabel;
        std::unique_ptr<weld::Entry> m_xUserName;
        std::unique_ptr<weld::CheckButton> m_xPasswordRequired;

        // jdbc driver
        VclPtr<FixedText>          m_pFL3;
        VclPtr<FixedText>          m_pJavaDriverLabel;
        VclPtr<Edit>               m_pJavaDriver;
        VclPtr<PushButton>         m_pTestJavaDriver;
        std::unique_ptr<weld::Label> m_xFL3;
        std::unique_ptr<weld::Label> m_xJavaDriverLabel;
        std::unique_ptr<weld::Entry> m_xJavaDriver;
        std::unique_ptr<weld::Button> m_xTestJavaDriver;

        // connection test
        VclPtr<PushButton>         m_pTestConnection;
        std::unique_ptr<weld::Button> m_xTestConnection;

        // called when the test connection button was clicked
        DECL_LINK(OnTestJavaClickHdl, Button*, void);
        DECL_LINK(OnEditModified, Edit&, void);
        DECL_LINK(OnTestJavaClickHdl, weld::Button&, void);
        DECL_LINK(OnEditModified, weld::Entry&, void);

    public:
        virtual ~OConnectionTabPage() override;
        virtual void dispose() override;
        static VclPtr<SfxTabPage> Create( TabPageParent pParent, const SfxItemSet* _rAttrSet );
        virtual bool        FillItemSet (SfxItemSet* _rCoreAttrs) override;

@@ -68,7 +67,7 @@ namespace dbaui
            affect the type may be changed (compared to the previous URL).</p>
        */
    private:
        OConnectionTabPage(vcl::Window* pParent, const SfxItemSet& _rCoreAttrs);
        OConnectionTabPage(TabPageParent pParent, const SfxItemSet& _rCoreAttrs);
            // nControlFlags is a combination of the CBTP_xxx-constants

        /** enables the test connection button, if allowed
diff --git a/dbaccess/source/ui/dlg/adminpages.cxx b/dbaccess/source/ui/dlg/adminpages.cxx
index da98c3f..94563a15 100644
--- a/dbaccess/source/ui/dlg/adminpages.cxx
+++ b/dbaccess/source/ui/dlg/adminpages.cxx
@@ -292,6 +292,14 @@ namespace dbaui
            _bChangedSomething = true;
        }
    }
    void OGenericAdministrationPage::fillString(SfxItemSet& _rSet, const dbaui::DBOConnectionURLEdit* pEdit, sal_uInt16 _nID, bool& _bChangedSomething)
    {
        if (pEdit && pEdit->get_value_changed_from_saved())
        {
            _rSet.Put(SfxStringItem(_nID, pEdit->GetText()));
            _bChangedSomething = true;
        }
    }

    IMPL_LINK_NOARG(OGenericAdministrationPage, OnTestConnectionClickHdl, Button*, void)
    {
@@ -334,6 +342,47 @@ namespace dbaui
        }
    }

    IMPL_LINK_NOARG(OGenericAdministrationPage, OnTestConnectionButtonClickHdl, weld::Button&, void)
    {
        OSL_ENSURE(m_pAdminDialog,"No Admin dialog set! ->GPF");
        bool bSuccess = false;
        if ( m_pAdminDialog )
        {
            m_pAdminDialog->saveDatasource();
            OGenericAdministrationPage::implInitControls(*m_pItemSetHelper->getOutputSet(), true);
            bool bShowMessage = true;
            try
            {
                std::pair< Reference<XConnection>,bool> aConnectionPair = m_pAdminDialog->createConnection();
                bShowMessage = aConnectionPair.second;
                bSuccess = aConnectionPair.first.is();
                ::comphelper::disposeComponent(aConnectionPair.first);
            }
            catch(Exception&)
            {
            }
            if ( bShowMessage )
            {
                MessageType eImage = MessageType::Info;
                OUString aMessage,sTitle;
                sTitle = DBA_RES(STR_CONNECTION_TEST);
                if ( bSuccess )
                {
                    aMessage = DBA_RES(STR_CONNECTION_SUCCESS);
                }
                else
                {
                    eImage = MessageType::Error;
                    aMessage = DBA_RES(STR_CONNECTION_NO_SUCCESS);
                }
                OSQLMessageBox aMsg(GetFrameWeld(), sTitle, aMessage, MessBoxStyle::Ok, eImage);
                aMsg.run();
            }
            if ( !bSuccess )
                m_pAdminDialog->clearPassword();
        }
    }

    // LayoutHelper
    void LayoutHelper::positionBelow( const Control& _rReference, Control& _rControl,
        const long _nIndentAppFont )
diff --git a/dbaccess/source/ui/dlg/adminpages.hxx b/dbaccess/source/ui/dlg/adminpages.hxx
index 1b2b8b9..64c7870 100644
--- a/dbaccess/source/ui/dlg/adminpages.hxx
+++ b/dbaccess/source/ui/dlg/adminpages.hxx
@@ -26,6 +26,7 @@
#include <svtools/wizardmachine.hxx>
#include <vcl/field.hxx>
#include <vcl/fixed.hxx>
#include <curledit.hxx>

class NumericField;
class Edit;
@@ -73,6 +74,17 @@ namespace dbaui
        virtual void Disable() override { m_pSaveValue->set_sensitive(false); }
    };

    template <> class OSaveValueWidgetWrapper<dbaui::DBOConnectionURLEdit> : public ISaveValueWrapper
    {
        dbaui::DBOConnectionURLEdit*  m_pSaveValue;
    public:
        explicit OSaveValueWidgetWrapper(dbaui::DBOConnectionURLEdit* _pSaveValue) : m_pSaveValue(_pSaveValue)
        { OSL_ENSURE(m_pSaveValue,"Illegal argument!"); }

        virtual void SaveValue() override { m_pSaveValue->save_value(); }
        virtual void Disable() override { m_pSaveValue->set_sensitive(false); }
    };

    template <class T> class ODisableWidgetWrapper : public ISaveValueWrapper
    {
        T*  m_pSaveValue;
@@ -238,6 +250,7 @@ namespace dbaui
        */
        static void fillString(SfxItemSet& _rSet,Edit const * _pEdit,sal_uInt16 _nID, bool& _bChangedSomething);
        static void fillString(SfxItemSet& _rSet,const weld::Entry* pEdit,sal_uInt16 _nID, bool& _bChangedSomething);
        static void fillString(SfxItemSet& _rSet,const dbaui::DBOConnectionURLEdit* pEdit,sal_uInt16 _nID, bool& _bChangedSomething);

    protected:
        /** This link be used for controls where the tabpage does not need to take any special action when the control
@@ -251,6 +264,7 @@ namespace dbaui
        DECL_LINK(OnControlModifiedClick, Button*, void);
        DECL_LINK(ControlModifiedCheckBoxHdl, CheckBox&, void);

        DECL_LINK(OnTestConnectionButtonClickHdl, weld::Button&, void);
        DECL_LINK(OnTestConnectionClickHdl, Button*, void);
    };

diff --git a/dbaccess/source/ui/inc/curledit.hxx b/dbaccess/source/ui/inc/curledit.hxx
index a4a40f3..66168e1 100644
--- a/dbaccess/source/ui/inc/curledit.hxx
+++ b/dbaccess/source/ui/inc/curledit.hxx
@@ -22,6 +22,7 @@

#include <vcl/edit.hxx>
#include <vcl/fixed.hxx>
#include <vcl/weld.hxx>
#include <dsntypes.hxx>

namespace dbaui
@@ -67,6 +68,78 @@ public:
    void      SetTypeCollection(::dbaccess::ODsnTypeCollection* _pTypeCollection) { m_pTypeCollection = _pTypeCollection; }
};

class DBOConnectionURLEdit
{
    OUString m_sSavedValue;

    ::dbaccess::ODsnTypeCollection* m_pTypeCollection;
    OUString m_sSaveValueNoPrefix;
    bool m_bShowPrefix; // when <TRUE> the prefix will be visible, otherwise not

    std::unique_ptr<weld::Entry> m_xEntry;
    std::unique_ptr<weld::Label> m_xForcedPrefix;

public:
    DBOConnectionURLEdit(std::unique_ptr<weld::Entry> xEntry, std::unique_ptr<weld::Label> xForcedPrefix);
    ~DBOConnectionURLEdit();

public:
    bool get_visible() const { return m_xEntry->get_visible(); }
    void connect_changed(const Link<weld::Entry&, void>& rLink) { m_xEntry->connect_changed(rLink); }
    void set_help_id(const OString& rName) { m_xEntry->set_help_id(rName); }
    void hide()
    {
        m_xEntry->hide();
        if (m_bShowPrefix)
            m_xForcedPrefix->hide();
    }
    void show()
    {
        m_xEntry->show();
        if (m_bShowPrefix)
            m_xForcedPrefix->show();
    }
    void save_value() { m_sSavedValue = GetText(); }
    bool get_value_changed_from_saved() const { return m_sSavedValue != GetText(); }
    void grab_focus()
    {
        m_xEntry->grab_focus();
    }
    void set_sensitive(bool bSensitive)
    {
        m_xEntry->set_sensitive(bSensitive);
        if (m_bShowPrefix)
            m_xForcedPrefix->set_sensitive(bSensitive);
    }
    void connect_focus_in(const Link<weld::Widget&, void>& rLink)
    {
        m_xEntry->connect_focus_in(rLink);
    }
    void connect_focus_out(const Link<weld::Widget&, void>& rLink)
    {
        m_xEntry->connect_focus_out(rLink);
    }

    // Edit overridables
    void    SetText(const OUString& _rStr);
    void    SetText(const OUString& _rStr, const Selection& _rNewSelection);
    OUString  GetText() const;

    /** Shows the Prefix
        @param  _bShowPrefix
            If <TRUE/> than the prefix will be visible, otherwise not.
    */
    void     ShowPrefix(bool _bShowPrefix);
    /// get the currently set text, excluding the prefix indicating the type
    OUString GetTextNoPrefix() const;
    /// set a new text, leave the current prefix unchanged
    void     SetTextNoPrefix(const OUString& _rText);

    void      SaveValueNoPrefix()             { m_sSaveValueNoPrefix = GetTextNoPrefix(); }
    const OUString&  GetSavedValueNoPrefix() const   { return m_sSaveValueNoPrefix; }
    void      SetTypeCollection(::dbaccess::ODsnTypeCollection* _pTypeCollection) { m_pTypeCollection = _pTypeCollection; }
};

}   // namespace dbaui

#endif // INCLUDED_DBACCESS_SOURCE_UI_INC_CURLEDIT_HXX
diff --git a/dbaccess/uiconfig/ui/connectionpage.ui b/dbaccess/uiconfig/ui/connectionpage.ui
index cdb59e5..7e0faa3 100644
--- a/dbaccess/uiconfig/ui/connectionpage.ui
+++ b/dbaccess/uiconfig/ui/connectionpage.ui
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.3 -->
<!-- Generated with glade 3.22.1 -->
<interface domain="dba">
  <requires lib="gtk+" version="3.18"/>
  <requires lib="LibreOffice" version="1.0"/>
  <object class="GtkBox" id="ConnectionPage">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
@@ -48,17 +47,6 @@
                  </packing>
                </child>
                <child>
                  <object class="dbulo-ConnectionURLEdit" id="browseurl">
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="hexpand">True</property>
                  </object>
                  <packing>
                    <property name="left_attach">0</property>
                    <property name="top_attach">1</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkButton" id="create">
                    <property name="label" translatable="yes" context="connectionpage|create">_Create New</property>
                    <property name="visible">True</property>
@@ -84,6 +72,37 @@
                    <property name="top_attach">1</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkGrid">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <child>
                      <object class="GtkEntry" id="browseurl">
                        <property name="visible">True</property>
                        <property name="can_focus">True</property>
                        <property name="hexpand">True</property>
                      </object>
                      <packing>
                        <property name="left_attach">1</property>
                        <property name="top_attach">0</property>
                      </packing>
                    </child>
                    <child>
                      <object class="GtkLabel" id="browselabel">
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                      </object>
                      <packing>
                        <property name="left_attach">0</property>
                        <property name="top_attach">0</property>
                      </packing>
                    </child>
                  </object>
                  <packing>
                    <property name="left_attach">0</property>
                    <property name="top_attach">1</property>
                  </packing>
                </child>
              </object>
            </child>
          </object>
@@ -133,10 +152,10 @@
                  <object class="GtkLabel" id="userNameLabel">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="xalign">1</property>
                    <property name="label" translatable="yes" context="connectionpage|userNameLabel">_User name:</property>
                    <property name="use_underline">True</property>
                    <property name="mnemonic_widget">userNameEntry</property>
                    <property name="xalign">1</property>
                  </object>
                  <packing>
                    <property name="left_attach">0</property>
@@ -220,10 +239,10 @@
                  <object class="GtkLabel" id="javaDriverLabel">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="xalign">1</property>
                    <property name="label" translatable="yes" context="connectionpage|javaDriverLabel">_JDBC driver class:</property>
                    <property name="use_underline">True</property>
                    <property name="mnemonic_widget">driverEntry</property>
                    <property name="xalign">1</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>