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>