office-gobmx/dbaccess/source/ui/dlg/adminpages.cxx

1890 lines
68 KiB
C++

/*************************************************************************
*
* $RCSfile: adminpages.cxx,v $
*
* $Revision: 1.21 $
*
* last change: $Author: fs $ $Date: 2000-12-07 14:27:53 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (the "License"); You may not use this file
* except in compliance with the License. You may obtain a copy of the
* License at http://www.openoffice.org/license.html.
*
* Software provided under this License is provided on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc..
*
* Copyright: 2000 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
#ifndef _DBA_DBACCESS_HELPID_HRC_
#include "dbaccess_helpid.hrc"
#endif
#ifndef _DBAUI_ADMINPAGES_HXX_
#include "adminpages.hxx"
#endif
#ifndef _DBAUI_DBADMIN_HRC_
#include "dbadmin.hrc"
#endif
#ifndef _DBAUI_MODULE_DBU_HXX_
#include "moduledbu.hxx"
#endif
#ifndef _DBAUI_SQLMESSAGE_HXX_
#include "sqlmessage.hxx"
#endif
#ifndef _SFXSTRITEM_HXX
#include <svtools/stritem.hxx>
#endif
#ifndef _SFXENUMITEM_HXX
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXINTITEM_HXX
#include <svtools/intitem.hxx>
#endif
#ifndef _SV_MSGBOX_HXX
#include <vcl/msgbox.hxx>
#endif
#ifndef _DBAUI_DATASOURCEITEMS_HXX_
#include "dsitems.hxx"
#endif
#ifndef _DBU_RESOURCE_HRC_
#include "dbu_resource.hrc"
#endif
#ifndef _DBAUI_DBFINDEX_HXX_
#include "dbfindex.hxx"
#endif
#ifndef _DBAUI_LOCALRESACCESS_HXX_
#include "localresaccess.hxx"
#endif
#ifndef _DBAUI_STRINGLISTITEM_HXX_
#include "stringlistitem.hxx"
#endif
#ifndef _DBAUI_DBADMIN_HXX_
#include "dbadmin.hxx"
#endif
#ifndef _IODLG_HXX
#include <sfx2/iodlg.hxx>
#endif
#ifndef _URLOBJ_HXX
#include <tools/urlobj.hxx>
#endif
#ifndef _DBHELPER_DBEXCEPTION_HXX_
#include <connectivity/dbexception.hxx>
#endif
#ifndef _CONNECTIVITY_DBTOOLS_HXX_
#include <connectivity/dbtools.hxx>
#endif
#ifndef _COM_SUN_STAR_SDB_SQLCONTEXT_HPP_
#include <com/sun/star/sdb/SQLContext.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XCOMPONENT_HPP_
#include <com/sun/star/lang/XComponent.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_XROW_HPP_
#include <com/sun/star/sdbc/XRow.hpp>
#endif
#include <stdlib.h>
#ifndef _OSL_FILE_HXX_
#include <osl/file.hxx>
#endif
#ifndef _DBAUI_DSSELECT_HXX_
#include "dsselect.hxx"
#endif
#ifndef _DBAUI_ODBC_CONFIG_HXX_
#include "odbcconfig.hxx"
#endif
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::ucb;
using namespace ::com::sun::star::sdb;
using namespace ::com::sun::star::sdbc;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::lang;
using namespace ::dbtools;
//.........................................................................
namespace dbaui
{
//.........................................................................
#define FILL_STRING_ITEM(editcontrol, itemset, itemid, modifiedflag) \
if (editcontrol.GetText() != editcontrol.GetSavedValue()) \
{ \
itemset.Put(SfxStringItem(itemid, editcontrol.GetText())); \
modifiedflag = sal_True; \
}
//=========================================================================
//= OGenericAdministrationPage
//=========================================================================
//-------------------------------------------------------------------------
OGenericAdministrationPage::OGenericAdministrationPage(Window* _pParent, const ResId& _rId, const SfxItemSet& _rAttrSet)
:SfxTabPage(_pParent, _rId, _rAttrSet)
{
SetExchangeSupport(sal_True);
}
//-------------------------------------------------------------------------
int OGenericAdministrationPage::DeactivatePage(SfxItemSet* _pSet)
{
if (_pSet)
{
if (!checkItems())
return KEEP_PAGE;
FillItemSet(*_pSet);
}
return LEAVE_PAGE;
}
//-------------------------------------------------------------------------
void OGenericAdministrationPage::Reset(const SfxItemSet& _rCoreAttrs)
{
implInitControls(_rCoreAttrs, sal_False);
}
//-------------------------------------------------------------------------
void OGenericAdministrationPage::ActivatePage(const SfxItemSet& _rSet)
{
implInitControls(_rSet, sal_True);
}
// -----------------------------------------------------------------------
void OGenericAdministrationPage::getFlags(const SfxItemSet& _rSet, sal_Bool& _rValid, sal_Bool& _rReadonly)
{
SFX_ITEMSET_GET(_rSet, pInvalid, SfxBoolItem, DSID_INVALID_SELECTION, sal_True);
_rValid = !pInvalid || !pInvalid->GetValue();
SFX_ITEMSET_GET(_rSet, pReadonly, SfxBoolItem, DSID_READONLY, sal_True);
_rReadonly = !_rValid || (pReadonly && pReadonly->GetValue());
}
// -----------------------------------------------------------------------
IMPL_LINK(OGenericAdministrationPage, OnControlModified, Control*, EMPTYARG)
{
callModifiedHdl();
return 0L;
}
//=========================================================================
//= OGeneralPage
//=========================================================================
//-------------------------------------------------------------------------
OGeneralPage::OGeneralPage(Window* pParent, const SfxItemSet& _rItems)
:OGenericAdministrationPage(pParent, ModuleRes(PAGE_GENERAL), _rItems)
,m_aNameLabel (this, ResId(FT_DATASOURCENAME))
,m_aName (this, ResId(ET_DATASOURCENAME))
,m_aTypeBox (this, ResId(GB_CONNECTION))
,m_aDatasourceTypeLabel (this, ResId(FT_DATATYPE))
,m_aDatasourceType (this, ResId(LB_DATATYPE))
,m_aConnectionLabel (this, ResId(FT_CONNECTURL))
,m_aConnection (this, ResId(ET_CONNECTURL))
,m_aBrowseConnection (this, ResId(PB_BROWSECONNECTION))
// ,m_aTimeoutLabel (this, ResId(FT_LOGINTIMEOUT))
// ,m_aTimeoutNumber (this, ResId(ET_TIMEOUT_NUMBER))
// ,m_aTimeoutUnit (this, ResId(LB_TIMEOUT_UNIT))
,m_aSpecialMessage (this, ResId(FT_SPECIAL_MESSAGE))
,m_pCollection(NULL)
,m_eCurrentSelection(DST_UNKNOWN)
,m_bDisplayingInvalid(sal_False)
{
// fill the listbox with the UI descriptions for the possible types
// and remember the respective DSN prefixes
FreeResource();
// extract the datasource type collection from the item set
DbuTypeCollectionItem* pCollectionItem = PTR_CAST(DbuTypeCollectionItem, _rItems.GetItem(DSID_TYPECOLLECTION));
if (pCollectionItem)
m_pCollection = pCollectionItem->getCollection();
DBG_ASSERT(m_pCollection, "OGeneralPage::OGeneralPage : really need a DSN type collection !");
// initially fill the listbox
if (m_pCollection)
{
for ( ODsnTypeCollection::TypeIterator aTypeLoop = m_pCollection->begin();
aTypeLoop != m_pCollection->end();
++aTypeLoop
)
{
DATASOURCE_TYPE eType = aTypeLoop.getType();
sal_Int32 nPos = m_aDatasourceType.InsertEntry(aTypeLoop.getDisplayName());
m_aDatasourceType.SetEntryData(nPos, reinterpret_cast<void*>(eType));
}
}
// do some knittings
m_aDatasourceType.SetSelectHdl(LINK(this, OGeneralPage, OnDatasourceTypeSelected));
m_aName.SetModifyHdl(LINK(this, OGeneralPage, OnNameModified));
m_aConnection.SetModifyHdl(getControlModifiedLink());
m_aBrowseConnection.SetClickHdl(LINK(this, OGeneralPage, OnBrowseConnections));
}
//-------------------------------------------------------------------------
void OGeneralPage::initializeHistory()
{
m_aSelectionHistory.clear();
if (m_pCollection)
{
for ( ODsnTypeCollection::TypeIterator aTypeLoop = m_pCollection->begin();
aTypeLoop != m_pCollection->end();
++aTypeLoop
)
m_aSelectionHistory[aTypeLoop.getType()] = m_pCollection->getDatasourcePrefix(aTypeLoop.getType());
}
}
//-------------------------------------------------------------------------
void OGeneralPage::GetFocus()
{
OGenericAdministrationPage::GetFocus();
if (m_aName.IsEnabled())
m_aName.GrabFocus();
}
//-------------------------------------------------------------------------
sal_Bool OGeneralPage::isBrowseable(DATASOURCE_TYPE _eType) const
{
switch (_eType)
{
case DST_DBASE:
case DST_TEXT:
case DST_ADABAS:
case DST_ODBC:
return sal_True;
}
return sal_False;
}
//-------------------------------------------------------------------------
void OGeneralPage::onTypeSelected(DATASOURCE_TYPE _eType)
{
m_aBrowseConnection.Enable(isBrowseable(_eType));
// update the selection history
m_aSelectionHistory[m_eCurrentSelection] = m_aConnection.GetText();
// the the new URL text as indicated by the selection history
m_eCurrentSelection = _eType;
m_aConnection.SetText(m_aSelectionHistory[m_eCurrentSelection]);
if (m_aTypeSelectHandler.IsSet())
m_aTypeSelectHandler.Call(this);
}
//-------------------------------------------------------------------------
sal_Bool OGeneralPage::checkItems()
{
if ((0 == m_aName.GetText().Len()) && !m_bDisplayingInvalid)
{
String sErrorMsg(ModuleRes(STR_ERR_EMPTY_DSN_NAME));
ErrorBox aErrorBox(GetParent(), WB_OK, sErrorMsg);
aErrorBox.Execute();
m_aName.GrabFocus();
return sal_False;
}
return sal_True;
}
//-------------------------------------------------------------------------
void OGeneralPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
{
initializeHistory();
// first check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
sal_Bool bValid, bReadonly;
getFlags(_rSet, bValid, bReadonly);
// if the selection is invalid, disable evrything
m_aNameLabel.Enable(bValid);
m_aName.Enable(bValid);
m_aTypeBox.Enable(bValid);
m_aDatasourceTypeLabel.Enable(bValid);
m_aDatasourceType.Enable(bValid);
m_aConnectionLabel.Enable(bValid);
m_aConnection.Enable(bValid);
m_aBrowseConnection.Enable(bValid);
String sConnectURL, sName;
String sMessage;
m_bDisplayingInvalid = !bValid;
if (bValid)
{
// collect some items and some values
SFX_ITEMSET_GET(_rSet, pUrlItem, SfxStringItem, DSID_CONNECTURL, sal_True);
SFX_ITEMSET_GET(_rSet, pNameItem, SfxStringItem, DSID_NAME, sal_True);
DBG_ASSERT(pUrlItem, "OGeneralPage::implInitControls : missing the type attribute !");
DBG_ASSERT(pNameItem, "OGeneralPage::implInitControls : missing the name attribute !");
sConnectURL = pUrlItem->GetValue();
sName = pNameItem->GetValue();
}
else
{
SFX_ITEMSET_GET(_rSet, pDeleted, SfxBoolItem, DSID_DELETEDDATASOURCE, sal_True);
if (pDeleted && pDeleted->GetValue())
{
OLocalResourceAccess aStringResAccess(PAGE_GENERAL, RSC_TABPAGE);
sMessage = String(ResId(STR_DATASOURCEDELETED));
}
}
m_aSpecialMessage.SetText(sMessage);
// compare the DSN prefix with the registered ones
String sDisplayName;
DATASOURCE_TYPE eOldSelection = m_eCurrentSelection;
m_eCurrentSelection = DST_UNKNOWN;
if (m_pCollection && bValid)
{
m_eCurrentSelection = m_pCollection->getType(sConnectURL);
sDisplayName = m_pCollection->getTypeDisplayName(m_eCurrentSelection);
}
m_aBrowseConnection.Enable(bValid && isBrowseable(m_eCurrentSelection));
// select the correct datasource type
m_aDatasourceType.SelectEntry(sDisplayName);
if (_bSaveValue)
m_aDatasourceType.SaveValue();
// notify our listener that our type selection has changed (if so)
if (eOldSelection != m_eCurrentSelection)
onTypeSelected(m_eCurrentSelection);
m_aConnection.SetText(sConnectURL);
if (_bSaveValue)
m_aConnection.SaveValue();
// the datasource name
m_aName.SetText(sName);
if (_bSaveValue)
m_aName.SaveValue();
}
//-------------------------------------------------------------------------
SfxTabPage* OGeneralPage::Create(Window* _pParent, const SfxItemSet& _rAttrSet)
{
return ( new OGeneralPage( _pParent, _rAttrSet ) );
}
//-------------------------------------------------------------------------
void OGeneralPage::Reset(const SfxItemSet& _rCoreAttrs)
{
m_eCurrentSelection = DST_UNKNOWN;
// this ensures that our type selection link will be called, even if the new is is the same as the
// current one
OGenericAdministrationPage::Reset(_rCoreAttrs);
// there are some things which depend on the current name
LINK(this, OGeneralPage, OnNameModified).Call(&m_aName);
}
//-------------------------------------------------------------------------
BOOL OGeneralPage::FillItemSet(SfxItemSet& _rCoreAttrs)
{
sal_Bool bChangedSomething = sal_False;
if (m_aName.GetText() != m_aName.GetSavedValue())
{
_rCoreAttrs.Put(SfxStringItem(DSID_NAME, m_aName.GetText()));
bChangedSomething = sal_True;
}
if ((m_aConnection.GetText() != m_aConnection.GetSavedValue()) || (m_aDatasourceType.GetSavedValue() != m_aDatasourceType.GetSelectEntryPos()))
{
_rCoreAttrs.Put(SfxStringItem(DSID_CONNECTURL, m_aConnection.GetText()));
bChangedSomething = sal_True;
}
return bChangedSomething;
}
//-------------------------------------------------------------------------
IMPL_LINK(OGeneralPage, OnNameModified, Edit*, _pBox)
{
sal_Bool bNewNameValid = sal_True;
if (m_aNameModifiedHandler.IsSet())
bNewNameValid = (0L != m_aNameModifiedHandler.Call(this));
if (m_aName.IsEnabled())
{ // (this way we prevent overwriting a "this datasource is deleted" message)
// show a text if the name is invalid
String sNameMessage;
if (!bNewNameValid)
{
OLocalResourceAccess aStringResAccess(PAGE_GENERAL, RSC_TABPAGE);
sNameMessage = String(ResId(STR_NAMEINVALID));
}
m_aSpecialMessage.SetText(sNameMessage);
}
return 0L;
}
//-------------------------------------------------------------------------
IMPL_LINK(OGeneralPage, OnBrowseConnections, PushButton*, _pButton)
{
switch (GetSelectedType())
{
case DST_DBASE:
case DST_TEXT:
{
SfxFileDialog aFileDlg(GetParent(), WB_3DLOOK | WB_STDMODAL | WB_OPEN | SFXWB_PATHDIALOG);
String sOldPath = m_aConnection.GetTextNoPrefix();
if (sOldPath.Len())
aFileDlg.SetPath(sOldPath);
if (RET_OK == aFileDlg.Execute())
{
m_aConnection.SetTextNoPrefix(aFileDlg.GetPath());
callModifiedHdl();
}
}
break;
case DST_ADABAS:
{
// collect all names from the config dir
// and all dir's of the DBWORK/wrk or DBROOT/wrk dir
// compare the names
// collect the names of the installed databases
StringBag aInstalledDBs;
String sAdabasConfigDir,sAdabasWorkDir;
const char* pAdabasCfg = getenv("DBCONFIG");
const char* pAdabasWrk = getenv("DBWORK");
sal_Bool bOldFashion = sal_False;
if (pAdabasCfg && pAdabasWrk) // for our type of adabas this must apply
{
sAdabasConfigDir.AssignAscii(pAdabasCfg);
sAdabasWorkDir.AssignAscii(pAdabasWrk);
bOldFashion = sal_True;
}
else // we have a normal adabas installation
{ // so we check the local database names in $DBROOT/config
const char* pAdabasRoot = getenv("DBROOT");
if (pAdabasRoot)
{
sAdabasConfigDir.AssignAscii(pAdabasRoot);
sAdabasWorkDir.AssignAscii(pAdabasRoot);
}
}
if(sAdabasConfigDir.Len() && sAdabasWorkDir.Len())
{
aInstalledDBs = getInstalledAdabasDBs(sAdabasConfigDir,sAdabasWorkDir);
if(!aInstalledDBs.size() && bOldFashion)
{
const char* pAdabasRoot = getenv("DBROOT");
if (pAdabasRoot)
{
sAdabasConfigDir.AssignAscii(pAdabasRoot);
sAdabasWorkDir.AssignAscii(pAdabasRoot);
aInstalledDBs = getInstalledAdabasDBs(sAdabasConfigDir,sAdabasWorkDir);
}
}
ODatasourceSelectDialog aSelector(GetParent(), aInstalledDBs, GetSelectedType());
if (RET_OK == aSelector.Execute())
{
String aSelected;
aSelected.AssignAscii(":");
aSelected += aSelector.GetSelected();
m_aConnection.SetTextNoPrefix(aSelected);
callModifiedHdl();
}
}
else
{
OLocalResourceAccess aLocRes(PAGE_GENERAL, RSC_TABPAGE);
String sError(ModuleRes(STR_NO_ADABASE_DATASOURCES));
ErrorBox aBox(this, WB_OK, sError);
aBox.Execute();
}
}
break;
case DST_ODBC:
{
// collect all ODBC data source names
StringBag aOdbcDatasources;
OOdbcEnumeration aEnumeration;
if (!aEnumeration.isLoaded())
{
// show an error message
OLocalResourceAccess aLocRes(PAGE_GENERAL, RSC_TABPAGE);
String sError(ModuleRes(STR_COULDNOTLOAD_ODBCLIB));
sError.SearchAndReplaceAscii("#lib#", aEnumeration.getLibraryName());
ErrorBox aDialog(this, WB_OK, sError);
aDialog.Execute();
return 1L;
}
else
{
aEnumeration.getDatasourceNames(aOdbcDatasources);
// excute the select dialog
ODatasourceSelectDialog aSelector(GetParent(), aOdbcDatasources, GetSelectedType());
if (RET_OK == aSelector.Execute())
{
m_aConnection.SetTextNoPrefix(aSelector.GetSelected());
callModifiedHdl();
}
}
}
break;
}
return 0L;
}
// -----------------------------------------------------------------------------
StringBag OGeneralPage::getInstalledAdabasDBs(const String &_rConfigDir,const String &_rWorkDir)
{
String sAdabasConfigDir(_rConfigDir),sAdabasWorkDir(_rWorkDir);
if (sAdabasConfigDir.Len() && ('/' == sAdabasConfigDir.GetBuffer()[sAdabasConfigDir.Len() - 1]))
sAdabasConfigDir.AppendAscii("config");
else
sAdabasConfigDir.AppendAscii("/config");
if (sAdabasWorkDir.Len() && ('/' == sAdabasWorkDir.GetBuffer()[sAdabasWorkDir.Len() - 1]))
sAdabasWorkDir.AppendAscii("wrk");
else
sAdabasWorkDir.AppendAscii("/wrk");
// collect the names of the installed databases
StringBag aInstalledDBs;
// collect the names of the installed databases
StringBag aConfigDBs,aWrkDBs;
aConfigDBs = getInstalledAdabasDBDirs(sAdabasConfigDir,::ucb::INCLUDE_DOCUMENTS_ONLY);
aWrkDBs = getInstalledAdabasDBDirs(sAdabasWorkDir,::ucb::INCLUDE_FOLDERS_ONLY);
StringBag::const_iterator aOuter = aConfigDBs.begin();
for(;aOuter != aConfigDBs.end();++aOuter)
{
StringBag::const_iterator aInner = aWrkDBs.begin();
for(;aInner != aWrkDBs.end();++aInner)
{
if(*aInner == *aOuter)
{
aInstalledDBs.insert(*aOuter);
break;
}
}
}
return aInstalledDBs;
}
// -----------------------------------------------------------------------------
StringBag OGeneralPage::getInstalledAdabasDBDirs(const String &_rPath,const ::ucb::ResultSetInclude& _reResultSetInclude)
{
INetURLObject aNormalizer;
aNormalizer.SetSmartProtocol(INET_PROT_FILE);
aNormalizer.SetSmartURL(_rPath);
String sAdabasConfigDir = aNormalizer.GetMainURL();
::ucb::Content aAdabasConfigDir;
try
{
aAdabasConfigDir = ::ucb::Content(sAdabasConfigDir, Reference< ::com::sun::star::ucb::XCommandEnvironment >());
}
catch(::com::sun::star::ucb::ContentCreationException&)
{
return StringBag();
}
StringBag aInstalledDBs;
sal_Bool bIsFolder = sal_False;
try
{
bIsFolder = aAdabasConfigDir.isFolder();
}
catch(Exception&) // the exception is thrown when the path doesn't exists
{
}
if (bIsFolder && aAdabasConfigDir.get().is())
{ // we have a content for the directory, loop through all entries
Sequence< ::rtl::OUString > aProperties(1);
aProperties[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Title"));
try
{
Reference< XResultSet > xFiles = aAdabasConfigDir.createCursor(aProperties, _reResultSetInclude);
Reference< XRow > xRow(xFiles, UNO_QUERY);
xFiles->beforeFirst();
while (xFiles->next())
aInstalledDBs.insert(xRow->getString(1));
}
catch(Exception&)
{
DBG_ERROR("OGeneralPage::OnBrowseConnections: could not enumerate the adabas config files!");
}
}
return aInstalledDBs;
}
//-------------------------------------------------------------------------
IMPL_LINK(OGeneralPage, OnDatasourceTypeSelected, ListBox*, _pBox)
{
// get the type from the entry data
sal_Int16 nSelected = _pBox->GetSelectEntryPos();
DATASOURCE_TYPE eSelectedType = static_cast<DATASOURCE_TYPE>(reinterpret_cast<sal_Int32>(_pBox->GetEntryData(nSelected)));
// let the impl method do all the stuff
onTypeSelected(eSelectedType);
// tell the listener we were modified
callModifiedHdl();
// outta here
return 0L;
}
//========================================================================
//= OCommonBehaviourTabPage
//========================================================================
OCommonBehaviourTabPage::OCommonBehaviourTabPage(Window* pParent, USHORT nResId, const SfxItemSet& _rCoreAttrs,
USHORT nControlFlags)
:OGenericAdministrationPage(pParent, ModuleRes(nResId), _rCoreAttrs)
,m_pUserNameLabel(NULL)
,m_pUserName(NULL)
,m_pPasswordRequired(NULL)
,m_pOptionsLabel(NULL)
,m_pOptions(NULL)
,m_pCharsetLabel(NULL)
,m_pCharset(NULL)
,m_nControlFlags(nControlFlags)
{
if ((m_nControlFlags & CBTP_USE_UIDPWD) == CBTP_USE_UIDPWD)
{
m_pUserNameLabel = new FixedText(this, ResId(FT_USERNAME));
m_pUserName = new Edit(this, ResId(ET_USERNAME));
m_pUserName->SetModifyHdl(getControlModifiedLink());
m_pPasswordRequired = new CheckBox(this, ResId(CB_PASSWORD_REQUIRED));
m_pPasswordRequired->SetClickHdl(getControlModifiedLink());
}
if ((m_nControlFlags & CBTP_USE_OPTIONS) == CBTP_USE_OPTIONS)
{
m_pOptionsLabel = new FixedText(this, ResId(FT_OPTIONS));
m_pOptions = new Edit(this, ResId(ET_OPTIONS));
m_pOptions->SetModifyHdl(getControlModifiedLink());
}
if ((m_nControlFlags & CBTP_USE_CHARSET) == CBTP_USE_CHARSET)
{
m_pCharsetLabel = new FixedText(this, ResId(FT_CHARSET));
m_pCharset = new ListBox(this, ResId(LB_CHARSET));
m_pCharset->SetSelectHdl(getControlModifiedLink());
OCharsetDisplay::const_iterator aLoop = m_aCharsets.begin();
while (aLoop != m_aCharsets.end())
{
m_pCharset->InsertEntry((*aLoop).getDisplayName());
++aLoop;
}
}
}
// -----------------------------------------------------------------------
OCommonBehaviourTabPage::~OCommonBehaviourTabPage()
{
DELETEZ(m_pUserNameLabel);
DELETEZ(m_pUserName);
DELETEZ(m_pPasswordRequired);
DELETEZ(m_pOptionsLabel);
DELETEZ(m_pOptions);
DELETEZ(m_pCharsetLabel);
DELETEZ(m_pCharset);
}
// -----------------------------------------------------------------------
void OCommonBehaviourTabPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
{
// check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
sal_Bool bValid, bReadonly;
getFlags(_rSet, bValid, bReadonly);
// collect the items
SFX_ITEMSET_GET(_rSet, pUidItem, SfxStringItem, DSID_USER, sal_True);
SFX_ITEMSET_GET(_rSet, pPwdItem, SfxStringItem, DSID_PASSWORD, sal_True);
SFX_ITEMSET_GET(_rSet, pOptionsItem, SfxStringItem, DSID_ADDITIONALOPTIONS, sal_True);
SFX_ITEMSET_GET(_rSet, pCharsetItem, SfxStringItem, DSID_CHARSET, sal_True);
SFX_ITEMSET_GET(_rSet, pAllowEmptyPwd, SfxBoolItem, DSID_PASSWORDREQUIRED, sal_True);
// forward the values to the controls
if (bValid)
{
if ((m_nControlFlags & CBTP_USE_UIDPWD) == CBTP_USE_UIDPWD)
{
m_pUserName->SetText(pUidItem->GetValue());
m_pPasswordRequired->Check(pAllowEmptyPwd->GetValue());
m_pUserName->ClearModifyFlag();
if (_bSaveValue)
{
m_pUserName->SaveValue();
m_pPasswordRequired->SaveValue();
}
}
if ((m_nControlFlags & CBTP_USE_OPTIONS) == CBTP_USE_OPTIONS)
{
m_pOptions->SetText(pOptionsItem->GetValue());
m_pOptions->ClearModifyFlag();
if (_bSaveValue)
m_pOptions->SaveValue();
}
if ((m_nControlFlags & CBTP_USE_CHARSET) == CBTP_USE_CHARSET)
{
OCharsetDisplay::const_iterator aFind = m_aCharsets.find(pCharsetItem->GetValue(), OCharsetDisplay::IANA());
if (aFind == m_aCharsets.end())
{
DBG_ERROR("OCommonBehaviourTabPage::implInitControls: unjknown charset falling back to system language!");
aFind = m_aCharsets.find(RTL_TEXTENCODING_DONTKNOW);
// fallback: system language
}
if (aFind == m_aCharsets.end())
m_pCharset->SelectEntry(String());
else
m_pCharset->SelectEntry((*aFind).getDisplayName());
if (_bSaveValue)
m_pCharset->SaveValue();
}
}
if (bReadonly)
{
if ((m_nControlFlags & CBTP_USE_UIDPWD) == CBTP_USE_UIDPWD)
{
m_pUserNameLabel->Disable();
m_pUserName->Disable();
m_pPasswordRequired->Disable();
}
if ((m_nControlFlags & CBTP_USE_OPTIONS) == CBTP_USE_OPTIONS)
{
m_pOptionsLabel->Disable();
m_pOptions->Disable();
}
if ((m_nControlFlags & CBTP_USE_CHARSET) == CBTP_USE_CHARSET)
{
m_pCharsetLabel->Disable();
m_pCharset->Disable();
}
}
}
// -----------------------------------------------------------------------
sal_Bool OCommonBehaviourTabPage::FillItemSet(SfxItemSet& _rSet)
{
sal_Bool bChangedSomething = sal_False;
if ((m_nControlFlags & CBTP_USE_UIDPWD) == CBTP_USE_UIDPWD)
{
if (m_pUserName->GetText() != m_pUserName->GetSavedValue())
{
_rSet.Put(SfxStringItem(DSID_USER, m_pUserName->GetText()));
bChangedSomething = sal_True;
}
if (m_pPasswordRequired->IsChecked() != m_pPasswordRequired->GetSavedValue())
{
_rSet.Put(SfxBoolItem(DSID_PASSWORDREQUIRED, m_pPasswordRequired->IsChecked()));
bChangedSomething = sal_True;
}
}
if ((m_nControlFlags & CBTP_USE_OPTIONS) == CBTP_USE_OPTIONS)
{
if( m_pOptions->GetText() != m_pOptions->GetSavedValue() )
{
_rSet.Put(SfxStringItem(DSID_ADDITIONALOPTIONS, m_pOptions->GetText()));
bChangedSomething = sal_True;
}
}
if ((m_nControlFlags & CBTP_USE_CHARSET) == CBTP_USE_CHARSET)
{
if (m_pCharset->GetSelectEntryPos() != m_pCharset->GetSavedValue())
{
OCharsetDisplay::const_iterator aFind = m_aCharsets.find(m_pCharset->GetSelectEntry(), OCharsetDisplay::Display());
DBG_ASSERT(aFind != m_aCharsets.end(), "OCommonBehaviourTabPage::FillItemSet: could not translate the selected character set!");
if (aFind != m_aCharsets.end())
_rSet.Put(SfxStringItem(DSID_CHARSET, (*aFind).getIanaName()));
bChangedSomething = sal_True;
}
}
return bChangedSomething;
}
//========================================================================
//= ODbaseDetailsPage
//========================================================================
//------------------------------------------------------------------------
ODbaseDetailsPage::ODbaseDetailsPage( Window* pParent, const SfxItemSet& _rCoreAttrs )
:OCommonBehaviourTabPage(pParent, PAGE_DBASE, _rCoreAttrs, CBTP_USE_CHARSET)
,m_aFrame (this, ResId(GB_DBASE_MAIN))
,m_aShowDeleted (this, ResId(CB_SHOWDELETEDROWS))
,m_aIndexes (this, ResId(PB_INDICIES))
{
m_aIndexes.SetClickHdl(LINK(this, ODbaseDetailsPage, OnButtonClicked));
m_aShowDeleted.SetClickHdl(LINK(this, ODbaseDetailsPage, OnButtonClicked));
// correct the z-order which is mixed-up because the base class constructed some controls before we did
m_pCharset->SetZOrder(&m_aShowDeleted, WINDOW_ZORDER_BEHIND);
FreeResource();
}
// -----------------------------------------------------------------------
ODbaseDetailsPage::~ODbaseDetailsPage()
{
}
// -----------------------------------------------------------------------
sal_Int32* ODbaseDetailsPage::getDetailIds()
{
static sal_Int32* pRelevantIds = NULL;
if (!pRelevantIds)
{
static sal_Int32 nRelevantIds[] =
{
DSID_SHOWDELETEDROWS,
DSID_CHARSET,
0
};
pRelevantIds = nRelevantIds;
}
return pRelevantIds;
}
// -----------------------------------------------------------------------
SfxTabPage* ODbaseDetailsPage::Create( Window* pParent, const SfxItemSet& _rAttrSet )
{
return ( new ODbaseDetailsPage( pParent, _rAttrSet ) );
}
// -----------------------------------------------------------------------
void ODbaseDetailsPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
{
OCommonBehaviourTabPage::implInitControls(_rSet, _bSaveValue);
// check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
sal_Bool bValid, bReadonly;
getFlags(_rSet, bValid, bReadonly);
// get the DSN string (needed for the index dialog)
SFX_ITEMSET_GET(_rSet, pUrlItem, SfxStringItem, DSID_CONNECTURL, sal_True);
SFX_ITEMSET_GET(_rSet, pTypesItem, DbuTypeCollectionItem, DSID_TYPECOLLECTION, sal_True);
ODsnTypeCollection* pTypeCollection = pTypesItem ? pTypesItem->getCollection() : NULL;
SfxItemState eState = _rSet.GetItemState(DSID_TYPECOLLECTION);
if (pTypeCollection && pUrlItem && (SFX_ITEM_DEFAULT != eState))
m_sDsn = pTypeCollection->cutPrefix(pUrlItem->GetValue());
// get the other relevant items
SFX_ITEMSET_GET(_rSet, pDeletedItem, SfxBoolItem, DSID_SHOWDELETEDROWS, sal_True);
sal_Bool bDeleted = sal_False, bLongNames = sal_False;
if (bValid)
bDeleted = pDeletedItem->GetValue();
m_aShowDeleted.Check(pDeletedItem->GetValue());
if (_bSaveValue)
m_aShowDeleted.SaveValue();
if (bReadonly)
m_aShowDeleted.Disable();
}
// -----------------------------------------------------------------------
sal_Bool ODbaseDetailsPage::FillItemSet( SfxItemSet& _rSet )
{
sal_Bool bChangedSomething = OCommonBehaviourTabPage::FillItemSet(_rSet);
if( m_aShowDeleted.IsChecked() != m_aShowDeleted.GetSavedValue() )
{
_rSet.Put( SfxBoolItem(DSID_SHOWDELETEDROWS, m_aShowDeleted.IsChecked() ) );
bChangedSomething = sal_True;
}
return bChangedSomething;
}
//------------------------------------------------------------------------
IMPL_LINK( ODbaseDetailsPage, OnButtonClicked, Button*, pButton )
{
if (&m_aIndexes == pButton)
{
ODbaseIndexDialog aIndexDialog(this, m_sDsn);
aIndexDialog.Execute();
}
else
// it was one of the checkboxes -> we count as modified from now on
callModifiedHdl();
return 0;
}
//========================================================================
//= OJdbcDetailsPage
//========================================================================
OJdbcDetailsPage::OJdbcDetailsPage( Window* pParent, const SfxItemSet& _rCoreAttrs )
:OCommonBehaviourTabPage(pParent, PAGE_JDBC, _rCoreAttrs, CBTP_USE_UIDPWD | CBTP_USE_CHARSET)
,m_aDriverLabel (this, ResId(FT_JDBCDRIVERCLASS))
,m_aDriver (this, ResId(ET_JDBCDRIVERCLASS))
,m_aJdbcUrlLabel (this, ResId(FT_CONNECTURL))
,m_aJdbcUrl (this, ResId(ET_CONNECTURL))
,m_aSeparator1 (this, ResId(FL_SEPARATOR1))
{
m_aDriver.SetModifyHdl(getControlModifiedLink());
m_aJdbcUrl.SetModifyHdl(getControlModifiedLink());
m_pUserName->SetZOrder(&m_aJdbcUrl, WINDOW_ZORDER_BEHIND);
m_pPasswordRequired->SetZOrder(m_pUserName, WINDOW_ZORDER_BEHIND);
m_pCharset->SetZOrder(m_pPasswordRequired, WINDOW_ZORDER_BEHIND);
FreeResource();
}
// -----------------------------------------------------------------------
OJdbcDetailsPage::~OJdbcDetailsPage()
{
}
// -----------------------------------------------------------------------
sal_Int32* OJdbcDetailsPage::getDetailIds()
{
static sal_Int32* pRelevantIds = NULL;
if (!pRelevantIds)
{
static sal_Int32 nRelevantIds[] =
{
DSID_JDBCDRIVERCLASS,
DSID_CHARSET,
0
};
pRelevantIds = nRelevantIds;
}
return pRelevantIds;
}
// -----------------------------------------------------------------------
SfxTabPage* OJdbcDetailsPage::Create( Window* pParent, const SfxItemSet& _rAttrSet )
{
return ( new OJdbcDetailsPage( pParent, _rAttrSet ) );
}
// -----------------------------------------------------------------------
void OJdbcDetailsPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
{
OCommonBehaviourTabPage::implInitControls(_rSet, _bSaveValue);
// check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
sal_Bool bValid, bReadonly;
getFlags(_rSet, bValid, bReadonly);
SFX_ITEMSET_GET(_rSet, pJdbcDrvItem, SfxStringItem, DSID_JDBCDRIVERCLASS, sal_True);
SFX_ITEMSET_GET(_rSet, pUrlItem, SfxStringItem, DSID_CONNECTURL, sal_True);
String sDriver, sURL;
if (bValid)
{
sDriver = pJdbcDrvItem->GetValue();
sURL = pUrlItem->GetValue();
}
m_aDriver.SetText(sDriver);
m_aJdbcUrl.SetText(sURL);
m_aDriver.ClearModifyFlag();
m_aJdbcUrl.ClearModifyFlag();
if (_bSaveValue)
{
m_aDriver.SaveValue();
m_aJdbcUrl.SaveValue();
}
if (bReadonly)
{
m_aDriverLabel.Disable();
m_aDriver.Disable();
m_aJdbcUrlLabel.Disable();
m_aJdbcUrl.Disable();
}
}
// -----------------------------------------------------------------------
sal_Bool OJdbcDetailsPage::FillItemSet( SfxItemSet& _rSet )
{
sal_Bool bChangedSomething = OCommonBehaviourTabPage::FillItemSet(_rSet);
FILL_STRING_ITEM(m_aDriver, _rSet, DSID_JDBCDRIVERCLASS, bChangedSomething);
FILL_STRING_ITEM(m_aJdbcUrl, _rSet, DSID_CONNECTURL, bChangedSomething);
return bChangedSomething;
}
//========================================================================
//= OOdbcDetailsPage
//========================================================================
OOdbcDetailsPage::OOdbcDetailsPage( Window* pParent, const SfxItemSet& _rCoreAttrs )
:OCommonBehaviourTabPage(pParent, PAGE_ODBC, _rCoreAttrs, CBTP_USE_UIDPWD | CBTP_USE_CHARSET | CBTP_USE_OPTIONS)
,m_aSeparator1 (this, ResId(FL_SEPARATOR1))
{
FreeResource();
}
// -----------------------------------------------------------------------
SfxTabPage* OOdbcDetailsPage::Create( Window* pParent, const SfxItemSet& _rAttrSet )
{
return ( new OOdbcDetailsPage( pParent, _rAttrSet ) );
}
// -----------------------------------------------------------------------
sal_Int32* OOdbcDetailsPage::getDetailIds()
{
static sal_Int32* pRelevantIds = NULL;
if (!pRelevantIds)
{
static sal_Int32 nRelevantIds[] =
{
DSID_ADDITIONALOPTIONS,
DSID_CHARSET,
0
};
pRelevantIds = nRelevantIds;
}
return pRelevantIds;
}
//========================================================================
//= OAdabasDetailsPage
//========================================================================
OAdabasDetailsPage::OAdabasDetailsPage( Window* pParent, const SfxItemSet& _rCoreAttrs )
:OCommonBehaviourTabPage(pParent, PAGE_ODBC, _rCoreAttrs, CBTP_USE_UIDPWD | CBTP_USE_CHARSET)
// Yes, we're using the resource for the ODBC page here. It contains two controls which we don't use
// and except that it's excatly what we need here.
,m_aSeparator1 (this, ResId(FL_SEPARATOR1))
{
// move the charset related control some pixel up (as they are positioned as if above them there are the option
// controls, which is the case for the ODBC page only)
Size aMovesize(LogicToPixel(Size(0, 15), MAP_APPFONT));
Point aPos = m_pCharsetLabel->GetPosPixel();
m_pCharsetLabel->SetPosPixel(Point(aPos.X(), aPos.Y() - aMovesize.Height()));
aPos = m_pCharset->GetPosPixel();
m_pCharset->SetPosPixel(Point(aPos.X(), aPos.Y() - aMovesize.Height()));
FreeResource();
// don't use the ODBC help ids
m_pUserName->SetHelpId(HID_DSADMIN_USER_ADABAS);
m_pPasswordRequired->SetHelpId(HID_DSADMIN_PWDREC_ADABAS);
m_pCharset->SetHelpId(HID_DSADMIN_CHARSET_ADABAS);
}
// -----------------------------------------------------------------------
SfxTabPage* OAdabasDetailsPage::Create( Window* pParent, const SfxItemSet& _rAttrSet )
{
return ( new OAdabasDetailsPage( pParent, _rAttrSet ) );
}
// -----------------------------------------------------------------------
sal_Int32* OAdabasDetailsPage::getDetailIds()
{
static sal_Int32* pRelevantIds = NULL;
if (!pRelevantIds)
{
static sal_Int32 nRelevantIds[] =
{
DSID_CHARSET,
0
};
pRelevantIds = nRelevantIds;
}
return pRelevantIds;
}
//========================================================================
//= OTextDetailsPage
//========================================================================
//------------------------------------------------------------------------
OTextDetailsPage::OTextDetailsPage( Window* pParent, const SfxItemSet& _rCoreAttrs )
:OCommonBehaviourTabPage(pParent, PAGE_TEXT, _rCoreAttrs, CBTP_USE_CHARSET)
,m_aHeader (this, ResId(CB_HEADER))
,m_aFieldSeparatorLabel (this, ResId(FT_FIELDSEPARATOR))
,m_aFieldSeparator (this, ResId(CM_FIELDSEPARATOR))
,m_aTextSeparatorLabel (this, ResId(FT_TEXTSEPARATOR))
,m_aTextSeparator (this, ResId(CM_TEXTSEPARATOR))
,m_aDecimalSeparatorLabel (this, ResId(FT_DECIMALSEPARATOR))
,m_aDecimalSeparator (this, ResId(CM_DECIMALSEPARATOR))
,m_aThousandsSeparatorLabel (this, ResId(FT_THOUSANDSSEPARATOR))
,m_aThousandsSeparator (this, ResId(CM_THOUSANDSSEPARATOR))
,m_aSeparator1 (this, ResId(FL_SEPARATOR1))
,m_aExtensionLabel (this, ResId(FT_EXTENSION))
,m_aExtension (this, ResId(CM_EXTENSION))
,m_aFieldSeparatorList (ResId(STR_FIELDSEPARATORLIST))
,m_aTextSeparatorList (ResId(STR_TEXTSEPARATORLIST))
{
xub_StrLen nCnt = m_aFieldSeparatorList.GetTokenCount( '\t' );
for( xub_StrLen i=0 ; i<nCnt ; i+=2 )
m_aFieldSeparator.InsertEntry( m_aFieldSeparatorList.GetToken( i, '\t' ) );
nCnt = m_aTextSeparatorList.GetTokenCount( '\t' );
for( i=0 ; i<nCnt ; i+=2 )
m_aTextSeparator.InsertEntry( m_aTextSeparatorList.GetToken( i, '\t' ) );
// set the modify handlers
m_aHeader.SetClickHdl(getControlModifiedLink());
m_aFieldSeparator.SetUpdateDataHdl(getControlModifiedLink());
m_aFieldSeparator.SetSelectHdl(getControlModifiedLink());
m_aTextSeparator.SetUpdateDataHdl(getControlModifiedLink());
m_aTextSeparator.SetSelectHdl(getControlModifiedLink());
m_aExtension.SetSelectHdl(getControlModifiedLink());
m_aFieldSeparator.SetModifyHdl(getControlModifiedLink());
m_aTextSeparator.SetModifyHdl(getControlModifiedLink());
m_aDecimalSeparator.SetModifyHdl(getControlModifiedLink());
m_aThousandsSeparator.SetModifyHdl(getControlModifiedLink());
m_aExtension.SetModifyHdl(getControlModifiedLink());
m_pCharset->SetZOrder(&m_aExtension, WINDOW_ZORDER_BEHIND);
FreeResource();
}
// -----------------------------------------------------------------------
OTextDetailsPage::~OTextDetailsPage()
{
}
// -----------------------------------------------------------------------
sal_Int32* OTextDetailsPage::getDetailIds()
{
static sal_Int32* pRelevantIds = NULL;
if (!pRelevantIds)
{
static sal_Int32 nRelevantIds[] =
{
DSID_FIELDDELIMITER,
DSID_TEXTDELIMITER,
DSID_DECIMALDELIMITER,
DSID_THOUSANDSDELIMITER,
DSID_TEXTFILEEXTENSION,
DSID_TEXTFILEHEADER,
DSID_CHARSET,
0
};
pRelevantIds = nRelevantIds;
}
return pRelevantIds;
}
// -----------------------------------------------------------------------
SfxTabPage* OTextDetailsPage::Create( Window* pParent, const SfxItemSet& _rAttrSet )
{
return ( new OTextDetailsPage( pParent, _rAttrSet ) );
}
// -----------------------------------------------------------------------
void OTextDetailsPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
{
OCommonBehaviourTabPage::implInitControls(_rSet, _bSaveValue);
// first check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
sal_Bool bValid, bReadonly;
getFlags(_rSet, bValid, bReadonly);
SFX_ITEMSET_GET(_rSet, pDelItem, SfxStringItem, DSID_FIELDDELIMITER, sal_True);
SFX_ITEMSET_GET(_rSet, pStrItem, SfxStringItem, DSID_TEXTDELIMITER, sal_True);
SFX_ITEMSET_GET(_rSet, pDecdelItem, SfxStringItem, DSID_DECIMALDELIMITER, sal_True);
SFX_ITEMSET_GET(_rSet, pThodelItem, SfxStringItem, DSID_THOUSANDSDELIMITER, sal_True);
SFX_ITEMSET_GET(_rSet, pExtensionItem, SfxStringItem, DSID_TEXTFILEEXTENSION, sal_True);
SFX_ITEMSET_GET(_rSet, pHdrItem, SfxBoolItem, DSID_TEXTFILEHEADER, sal_True);
if (bValid)
{
m_aHeader.Check( pHdrItem->GetValue() );
SetSeparator(m_aFieldSeparator, m_aFieldSeparatorList, pDelItem->GetValue());
SetSeparator(m_aTextSeparator, m_aTextSeparatorList, pStrItem->GetValue());
m_aDecimalSeparator.SetText(pDecdelItem->GetValue());
m_aThousandsSeparator.SetText(pThodelItem->GetValue());
m_aExtension.SetText(pExtensionItem->GetValue());
}
if (_bSaveValue)
{
m_aHeader.SaveValue();
m_aFieldSeparator.SaveValue();
m_aTextSeparator.SaveValue();
m_aDecimalSeparator.SaveValue();
m_aThousandsSeparator.SaveValue();
m_aExtension.SaveValue();
}
if (bReadonly)
{
m_aHeader.Disable();
m_aFieldSeparatorLabel.Disable();
m_aFieldSeparator.Disable();
m_aTextSeparatorLabel.Disable();
m_aTextSeparator.Disable();
m_aDecimalSeparatorLabel.Disable();
m_aDecimalSeparator.Disable();
m_aThousandsSeparatorLabel.Disable();
m_aThousandsSeparator.Disable();
m_aExtensionLabel.Disable();
m_aExtension.Disable();
}
}
// -----------------------------------------------------------------------
sal_Bool OTextDetailsPage::checkItems()
{
OLocalResourceAccess aStringResAccess(PAGE_TEXT, RSC_TABPAGE);
// for accessing the strings which are local to our own resource block
String aErrorText;
Control* pErrorWin = NULL;
// if (!m_aFieldSeparator.GetText().Len())
// bug (#42168) if this line is compiled under OS2 (in a product environent)
// -> use a temporary variable
String aDelText(m_aFieldSeparator.GetText());
if(!aDelText.Len())
{ // Kein FeldTrenner
aErrorText = String(ResId(STR_DELIMITER_MISSING));
aErrorText.SearchAndReplaceAscii("#1",m_aFieldSeparatorLabel.GetText());
pErrorWin = &m_aFieldSeparator;
}
else if (!m_aDecimalSeparator.GetText().Len())
{ // kein Decimaltrenner
aErrorText = String(ResId(STR_DELIMITER_MISSING));
aErrorText.SearchAndReplaceAscii("#1",m_aDecimalSeparatorLabel.GetText());
pErrorWin = &m_aDecimalSeparator;
}
else if (m_aTextSeparator.GetText() == m_aFieldSeparator.GetText())
{ // Feld und TextTrenner duerfen nicht gleich sein
aErrorText = String(ResId(STR_DELIMITER_MUST_DIFFER));
aErrorText.SearchAndReplaceAscii("#1",m_aTextSeparatorLabel.GetText());
aErrorText.SearchAndReplaceAscii("#2",m_aFieldSeparatorLabel.GetText());
pErrorWin = &m_aTextSeparator;
}
else if (m_aDecimalSeparator.GetText() == m_aThousandsSeparator.GetText())
{ // Tausender und DecimalTrenner duerfen nicht gleich sein
aErrorText = String(ResId(STR_DELIMITER_MUST_DIFFER));
aErrorText.SearchAndReplaceAscii("#1",m_aDecimalSeparatorLabel.GetText());
aErrorText.SearchAndReplaceAscii("#2",m_aThousandsSeparatorLabel.GetText());
pErrorWin = &m_aDecimalSeparator;
}
else if (m_aFieldSeparator.GetText() == m_aThousandsSeparator.GetText())
{ // Tausender und FeldTrenner duerfen nicht gleich sein
aErrorText = String(ResId(STR_DELIMITER_MUST_DIFFER));
aErrorText.SearchAndReplaceAscii("#1",m_aFieldSeparatorLabel.GetText());
aErrorText.SearchAndReplaceAscii("#2",m_aThousandsSeparatorLabel.GetText());
pErrorWin = &m_aFieldSeparator;
}
else if (m_aFieldSeparator.GetText() == m_aDecimalSeparator.GetText())
{ // Zehner und FeldTrenner duerfen nicht gleich sein
aErrorText = String(ResId(STR_DELIMITER_MUST_DIFFER));
aErrorText.SearchAndReplaceAscii("#1",m_aFieldSeparatorLabel.GetText());
aErrorText.SearchAndReplaceAscii("#2",m_aDecimalSeparatorLabel.GetText());
pErrorWin = &m_aFieldSeparator;
}
else if (m_aTextSeparator.GetText() == m_aThousandsSeparator.GetText())
{ // Tausender und TextTrenner duerfen nicht gleich sein
aErrorText = String(ResId(STR_DELIMITER_MUST_DIFFER));
aErrorText.SearchAndReplaceAscii("#1",m_aTextSeparatorLabel.GetText());
aErrorText.SearchAndReplaceAscii("#2",m_aThousandsSeparatorLabel.GetText());
pErrorWin = &m_aTextSeparator;
}
else if (m_aTextSeparator.GetText() == m_aDecimalSeparator.GetText())
{ // Zehner und TextTrenner duerfen nicht gleich sein
aErrorText = String(ResId(STR_DELIMITER_MUST_DIFFER));
aErrorText.SearchAndReplaceAscii("#1",m_aTextSeparatorLabel.GetText());
aErrorText.SearchAndReplaceAscii("#2",m_aDecimalSeparatorLabel.GetText());
pErrorWin = &m_aTextSeparator;
}
else if ( (m_aExtension.GetText().Search('*') != STRING_NOTFOUND)
||
(m_aExtension.GetText().Search('?') != STRING_NOTFOUND)
)
{
aErrorText = String(ResId(STR_NO_WILDCARDS));
aErrorText.SearchAndReplaceAscii("#1",m_aExtensionLabel.GetText());
pErrorWin = &m_aExtension;
}
else
return sal_True;
aErrorText.EraseAllChars('~');
ErrorBox(NULL, WB_OK, aErrorText).Execute();
pErrorWin->GrabFocus();
return 0;
}
// -----------------------------------------------------------------------
sal_Bool OTextDetailsPage::FillItemSet( SfxItemSet& rSet )
{
sal_Bool bChangedSomething = OCommonBehaviourTabPage::FillItemSet(rSet);
if( m_aHeader.IsChecked() != m_aHeader.GetSavedValue() )
{
rSet.Put( SfxBoolItem(DSID_TEXTFILEHEADER, m_aHeader.IsChecked() ) );
bChangedSomething = sal_True;
}
if( m_aFieldSeparator.GetText() != m_aFieldSeparator.GetSavedValue() )
{
rSet.Put( SfxStringItem(DSID_FIELDDELIMITER, GetSeparator( m_aFieldSeparator, m_aFieldSeparatorList) ) );
bChangedSomething = sal_True;
}
if( m_aTextSeparator.GetText() != m_aTextSeparator.GetSavedValue() )
{
rSet.Put( SfxStringItem(DSID_TEXTDELIMITER, GetSeparator( m_aTextSeparator, m_aTextSeparatorList) ) );
bChangedSomething = sal_True;
}
if( m_aDecimalSeparator.GetText() != m_aDecimalSeparator.GetSavedValue() )
{
rSet.Put( SfxStringItem(DSID_DECIMALDELIMITER, m_aDecimalSeparator.GetText().Copy(0, 1) ) );
bChangedSomething = sal_True;
}
if( m_aThousandsSeparator.GetText() != m_aThousandsSeparator.GetSavedValue() )
{
rSet.Put( SfxStringItem(DSID_THOUSANDSDELIMITER, m_aThousandsSeparator.GetText().Copy(0,1) ) );
bChangedSomething = sal_True;
}
if( m_aExtension.GetText() != m_aExtension.GetSavedValue() )
{
rSet.Put( SfxStringItem(DSID_TEXTFILEEXTENSION, m_aExtension.GetText()));
bChangedSomething = sal_True;
}
return bChangedSomething;
}
//------------------------------------------------------------------------
String OTextDetailsPage::GetSeparator( const ComboBox& rBox, const String& rList )
{
sal_Unicode nTok = '\t';
sal_Int32 nRet(0);
xub_StrLen nPos(rBox.GetEntryPos( rBox.GetText() ));
if( nPos == COMBOBOX_ENTRY_NOTFOUND )
return rBox.GetText().Copy(0);
else
return String(rList.GetToken((nPos*2)+1, nTok ).ToInt32());
// somewhat strange ... translates for instance an "32" into " "
}
//------------------------------------------------------------------------
void OTextDetailsPage::SetSeparator( ComboBox& rBox, const String& rList, const String& rVal )
{
char nTok = '\t';
xub_StrLen nCnt(rList.GetTokenCount( nTok ));
xub_StrLen i;
for( i=0 ; i<nCnt ; i+=2 )
{
String sTVal(rList.GetToken( i+1, nTok ).ToInt32());
if( sTVal == rVal )
{
rBox.SetText( rList.GetToken( i, nTok ) );
break;
}
}
if( i >= nCnt )
{
rBox.SetText( rVal.Copy(0, 1) );
}
}
//========================================================================
//= OTableSubscriptionPage
//========================================================================
//------------------------------------------------------------------------
OTableSubscriptionPage::OTableSubscriptionPage( Window* pParent, const SfxItemSet& _rCoreAttrs )
:OGenericAdministrationPage( pParent, ModuleRes(PAGE_TABLESUBSCRIPTION), _rCoreAttrs )
,m_aTables (this, ResId(GB_TABLESUBSCRIPTION))
,m_aIncludeAll (this, ResId(RB_INCLUDEALL))
,m_aIncludeNone (this, ResId(RB_INCLUDENONE))
,m_aIncludeSelected (this, ResId(RB_INCLUDESPECIFIC))
,m_aTablesList (this, ResId(CTL_TABLESUBSCRIPTION))
,m_aSuppressVersionColumns(this, ResId(CB_SUPPRESVERSIONCL))
,m_bCheckedAll (sal_True)
,m_bCatalogAtStart (sal_True)
,m_bInitializingControls(sal_False)
,m_pLastCheckedButton (NULL)
,m_pAdminDialog (NULL)
{
m_aIncludeAll.SetClickHdl(LINK(this, OTableSubscriptionPage, OnRadioButtonClicked));
m_aIncludeNone.SetClickHdl(LINK(this, OTableSubscriptionPage, OnRadioButtonClicked));
m_aIncludeSelected.SetClickHdl(LINK(this, OTableSubscriptionPage, OnRadioButtonClicked));
m_aTablesList.SetCheckHandler(getControlModifiedLink());
m_aSuppressVersionColumns.SetClickHdl(getControlModifiedLink());
// initialize the TabListBox
m_aTablesList.SetSelectionMode( MULTIPLE_SELECTION );
m_aTablesList.SetDragDropMode( 0 );
m_aTablesList.EnableInplaceEditing( sal_False );
m_aTablesList.SetWindowBits(WB_BORDER | WB_HASLINES | WB_HASLINESATROOT | WB_SORT | WB_HASBUTTONS | WB_HSCROLL |WB_HASBUTTONSATROOT);
m_aTablesList.Clear();
FreeResource();
m_aTablesList.SetCheckButtonHdl(getControlModifiedLink());
}
//------------------------------------------------------------------------
OTableSubscriptionPage::~OTableSubscriptionPage()
{
}
//------------------------------------------------------------------------
SfxTabPage* OTableSubscriptionPage::Create( Window* pParent, const SfxItemSet& rAttrSet )
{
return ( new OTableSubscriptionPage( pParent, rAttrSet ) );
}
//------------------------------------------------------------------------
void OTableSubscriptionPage::implCheckTables(const Sequence< ::rtl::OUString >& _rTables)
{
// the meta data for the current connection, used for splitting up table names
Reference< XDatabaseMetaData > xMeta;
try
{
if (m_xCurrentConnection.is())
xMeta = m_xCurrentConnection->getMetaData();
}
catch(SQLException&)
{
DBG_ERROR("OTableSubscriptionPage::implCheckTables : could not retrieve the current connection's meta data!");
}
// uncheck all
SvLBoxEntry* pUncheckLoop = m_aTablesList.First();
while (pUncheckLoop)
{
m_aTablesList.SetCheckButtonState(pUncheckLoop, SV_BUTTON_UNCHECKED);
pUncheckLoop = m_aTablesList.Next(pUncheckLoop);
}
// check the ones which are in the list
String aListBoxTable;
::rtl::OUString aCatalog,aSchema,aName;
const ::rtl::OUString* pIncludeTable = _rTables.getConstArray();
for (sal_Int32 i=0; i<_rTables.getLength(); ++i, ++pIncludeTable)
{
if (xMeta.is())
qualifiedNameComponents(xMeta, pIncludeTable->getStr(), aCatalog, aSchema, aName);
else
aName = pIncludeTable->getStr();
SvLBoxEntry* pCatalog = m_aTablesList.GetEntryPosByName(aCatalog);
SvLBoxEntry* pSchema = m_aTablesList.GetEntryPosByName(aSchema,pCatalog);
SvLBoxEntry* pEntry = m_aTablesList.GetEntryPosByName(aName,pSchema);
if(pEntry)
m_aTablesList.SetCheckButtonState(pEntry, SV_BUTTON_CHECKED);
}
m_aTablesList.CheckButtons();
m_bCheckedAll = sal_False;
m_aLastDetailedSelection = _rTables;
}
//------------------------------------------------------------------------
void OTableSubscriptionPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
{
// check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
sal_Bool bValid, bReadonly;
getFlags(_rSet, bValid, bReadonly);
bValid = bValid && m_xCurrentConnection.is();
bReadonly = bReadonly || !bValid;
m_aTables.Enable(!bReadonly);
m_aTablesList.Enable(!bReadonly);
m_aIncludeAll.Enable(!bReadonly);
m_aIncludeNone.Enable(!bReadonly);
m_aIncludeSelected.Enable(!bReadonly);
m_aSuppressVersionColumns.Enable(!bReadonly);
m_bCheckedAll = sal_True;
// get the current table filter
SFX_ITEMSET_GET(_rSet, pTableFilter, OStringListItem, DSID_TABLEFILTER, sal_True);
SFX_ITEMSET_GET(_rSet, pSuppress, SfxBoolItem, DSID_SUPPRESSVERSIONCL, sal_True);
Sequence< ::rtl::OUString > aTableFilter;
sal_Bool bSuppressVersionColumns = sal_True;
if (pTableFilter)
aTableFilter = pTableFilter->getList();
if (pSuppress)
bSuppressVersionColumns = pSuppress->GetValue();
m_bInitializingControls = sal_True;
if (!aTableFilter.getLength())
{ // no tables visible
CheckAll(sal_False);
m_aIncludeNone.Check();
LINK(this, OTableSubscriptionPage, OnRadioButtonClicked).Call(&m_aIncludeNone);
}
else
{
if ((1 == aTableFilter.getLength()) && aTableFilter[0].equalsAsciiL("%", 1))
{ // all tables visible
CheckAll(sal_True);
m_aIncludeAll.Check();
LINK(this, OTableSubscriptionPage, OnRadioButtonClicked).Call(&m_aIncludeAll);
}
else
{
m_aLastDetailedSelection = aTableFilter;
m_aIncludeSelected.Check();
LINK(this, OTableSubscriptionPage, OnRadioButtonClicked).Call(&m_aIncludeSelected);
}
}
m_bInitializingControls = sal_False;
if (!bValid)
m_aSuppressVersionColumns.Check(bSuppressVersionColumns);
if (_bSaveValue)
m_aSuppressVersionColumns.SaveValue();
if (!bValid)
{
if (m_pLastCheckedButton)
m_pLastCheckedButton->Check(sal_False);
m_pLastCheckedButton = NULL;
}
}
//------------------------------------------------------------------------
void OTableSubscriptionPage::CheckAll( sal_Bool bCheck )
{
SvButtonState eState = bCheck ? SV_BUTTON_CHECKED : SV_BUTTON_UNCHECKED;
SvLBoxEntry* pEntry = m_aTablesList.GetModel()->First();
while(pEntry)
{
m_aTablesList.SetCheckButtonState( pEntry, eState);
pEntry = m_aTablesList.GetModel()->Next(pEntry);
}
m_bCheckedAll = bCheck;
}
//------------------------------------------------------------------------
int OTableSubscriptionPage::DeactivatePage(SfxItemSet* _pSet)
{
int nResult = OGenericAdministrationPage::DeactivatePage(_pSet);
// dispose the connection, we don't need it anymore, so we're not wasting resources
Reference< XComponent > xComp(m_xCurrentConnection, UNO_QUERY);
if (xComp.is())
try { xComp->dispose(); } catch (RuntimeException&) { }
m_xCurrentConnection = NULL;
return nResult;
}
//------------------------------------------------------------------------
void OTableSubscriptionPage::ActivatePage(const SfxItemSet& _rSet)
{
DBG_ASSERT(!m_xCurrentConnection.is(), "OTableSubscriptionPage::ActivatePage: already have an active connection! ");
// check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
sal_Bool bValid, bReadonly;
getFlags(_rSet, bValid, bReadonly);
if (bValid)
{ // get the current table list from the connection for the current settings
// the PropertyValues for the current dialog settings
Sequence< PropertyValue > aConnectionParams;
DBG_ASSERT(m_pAdminDialog, "OTableSubscriptionPage::ActivatePage : need a parent dialog doing the translation!");
if (m_pAdminDialog)
if (!m_pAdminDialog->getCurrentSettings(aConnectionParams))
{
OGenericAdministrationPage::ActivatePage(_rSet);
m_aTablesList.Clear();
return;
}
// the current DSN
String sURL;
SFX_ITEMSET_GET(_rSet, pUrlItem, SfxStringItem, DSID_CONNECTURL, sal_True);
sURL = pUrlItem->GetValue();
// fill the table list with this connection information
SQLExceptionInfo aErrorInfo;
try
{
m_xCurrentConnection = m_aTablesList.UpdateTableList(sURL, aConnectionParams);
}
catch (SQLContext& e) { aErrorInfo = SQLExceptionInfo(e); }
catch (SQLWarning& e) { aErrorInfo = SQLExceptionInfo(e); }
catch (SQLException& e) { aErrorInfo = SQLExceptionInfo(e); }
if (aErrorInfo.isValid())
{
// establishing the connection failed. Show an error window and exit.
OSQLMessageBox aMessageBox(GetParent(), aErrorInfo, WB_OK | WB_DEF_OK, OSQLMessageBox::Error);
aMessageBox.Execute();
m_aTablesList.Enable(sal_False);
m_aTables.Enable(sal_False);
m_aSuppressVersionColumns.Enable(sal_False);
m_aTablesList.Clear();
}
else
{
// in addition, we need some infos about the connection used
m_sCatalogSeparator = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".")); // (default)
m_bCatalogAtStart = sal_True; // (default)
try
{
Reference< XDatabaseMetaData > xMeta;
if (m_xCurrentConnection.is())
xMeta = m_xCurrentConnection->getMetaData();
if (xMeta.is())
{
m_sCatalogSeparator = xMeta->getCatalogSeparator();
m_bCatalogAtStart = xMeta->isCatalogAtStart();
}
}
catch(SQLException&)
{
DBG_ERROR("OTableSubscriptionPage::ActivatePage : could not retrieve the qualifier separator for the used connection !");
}
}
}
m_pLastCheckedButton = NULL;
OGenericAdministrationPage::ActivatePage(_rSet);
}
//------------------------------------------------------------------------
Sequence< ::rtl::OUString > OTableSubscriptionPage::collectDetailedSelection() const
{
Sequence< ::rtl::OUString > aTableFilter;
static const ::rtl::OUString sDot(RTL_CONSTASCII_USTRINGPARAM("."));
::rtl::OUString sComposedName;
SvLBoxEntry* pEntry = m_aTablesList.GetModel()->First();
while(pEntry)
{
if(m_aTablesList.GetCheckButtonState(pEntry) == SV_BUTTON_CHECKED && !m_aTablesList.GetModel()->HasChilds(pEntry))
{ // checked and a leaf, which means it's no catalog, not schema, but a real table
::rtl::OUString sCatalog;
if(m_aTablesList.GetModel()->HasParent(pEntry))
{
SvLBoxEntry* pSchema = m_aTablesList.GetModel()->GetParent(pEntry);
if(m_aTablesList.GetModel()->HasParent(pSchema))
{
SvLBoxEntry* pCatalog = m_aTablesList.GetModel()->GetParent(pSchema);
if (m_bCatalogAtStart)
{
sComposedName += m_aTablesList.GetEntryText( pCatalog );
sComposedName += m_sCatalogSeparator;
}
else
{
sCatalog += m_sCatalogSeparator;
sCatalog += m_aTablesList.GetEntryText( pCatalog );
}
}
sComposedName += m_aTablesList.GetEntryText( pSchema );
sComposedName += sDot;
}
sComposedName += m_aTablesList.GetEntryText( pEntry );
if (!m_bCatalogAtStart)
sComposedName += sCatalog;
// need some space
sal_Int32 nOldLen = aTableFilter.getLength();
aTableFilter.realloc(nOldLen + 1);
// add the new name
aTableFilter[nOldLen] = sComposedName;
// reset the composed name
sComposedName = String();
}
pEntry = m_aTablesList.GetModel()->Next(pEntry);
}
return aTableFilter;
}
//------------------------------------------------------------------------
sal_Bool OTableSubscriptionPage::FillItemSet( SfxItemSet& _rCoreAttrs )
{
/////////////////////////////////////////////////////////////////////////
// create the output string which contains all the table names
Sequence< ::rtl::OUString > aTableFilter;
if (m_aIncludeAll.IsChecked())
{
aTableFilter.realloc(1);
aTableFilter[0] = ::rtl::OUString("%", 1, RTL_TEXTENCODING_ASCII_US);
}
else if (m_aIncludeNone.IsChecked())
{
// nothing to do: the sequence is already empty, which means "no tables"
}
else
{
aTableFilter = collectDetailedSelection();
}
_rCoreAttrs.Put( OStringListItem(DSID_TABLEFILTER, aTableFilter) );
if (m_aSuppressVersionColumns.IsChecked() != m_aSuppressVersionColumns.GetSavedValue())
_rCoreAttrs.Put( SfxBoolItem(DSID_SUPPRESSVERSIONCL, m_aSuppressVersionColumns.IsChecked()) );
return sal_True;
}
//------------------------------------------------------------------------
IMPL_LINK( OTableSubscriptionPage, OnRadioButtonClicked, Button*, pButton )
{
if (&m_aIncludeSelected == m_pLastCheckedButton)
m_aLastDetailedSelection = collectDetailedSelection();
m_pLastCheckedButton = static_cast<RadioButton*>(pButton);
if (m_aIncludeAll.IsChecked() || m_aIncludeNone.IsChecked())
{
m_aTablesList.Enable(sal_False);
CheckAll(m_aIncludeAll.IsChecked());
}
else
{
m_aTablesList.Enable(sal_True);
implCheckTables(m_aLastDetailedSelection);
}
// as the enable state has been changed, invalidate the control
m_aTablesList.Invalidate();
if (!m_bInitializingControls)
callModifiedHdl();
return 0L;
}
//.........................................................................
} // namespace dbaui
//.........................................................................
/*************************************************************************
* history:
* $Log: not supported by cvs2svn $
* Revision 1.20 2000/12/07 14:15:42 oj
* #81131# check installed adabas dbs
*
* Revision 1.19 2000/12/01 08:06:01 kso
* #80644# - ::ucb::ContentCreationException -> ::com::sun::star::ucb::ContentCreationException
*
* Revision 1.18 2000/11/30 08:32:30 fs
* #80003# changed some sal_uInt16 to sal_Int32 (need some -1's)
*
* Revision 1.17 2000/11/29 22:29:40 fs
* #80003# implementation of the character set map changed
*
* Revision 1.16 2000/11/28 13:48:15 fs
* #80152# m_bDisplayingDeleted -> m_bDisplayingInvalid
*
* Revision 1.15 2000/11/28 11:41:42 oj
* #80827# check dbroot if dbconfig failed
*
* Revision 1.14 2000/11/22 15:44:05 oj
* #80269# remove property long names
*
* Revision 1.13 2000/11/10 17:35:29 fs
* no parameter in checkItems anymore - did not make sense in the context it is called / some small bug fixes
*
* Revision 1.12 2000/11/02 15:20:04 fs
* #79983# +isBrowseable / #79830# +checkItems
*
* Revision 1.11 2000/11/02 14:18:21 fs
* #79967# check the getenv return against NULL
*
* Revision 1.10 2000/10/30 15:22:25 fs
* no password fields anymore - don't want to have them in and _data source aministration_ dialog
*
* Revision 1.9 2000/10/30 13:48:29 fs
* some help ids
*
* Revision 1.8 2000/10/24 12:11:15 fs
* functionality added: browsing for system data sources (ODBC/Adabas/dbase/text)
*
* Revision 1.7 2000/10/20 09:53:17 fs
* handling for the SuppresVersionColumns property of a data source
*
* Revision 1.6 2000/10/18 08:48:16 obo
* Syntax error with linux compiler #65293#
*
* Revision 1.5 2000/10/13 16:04:22 fs
* Separator changed to string / getDetailIds
*
* Revision 1.4 2000/10/12 16:20:42 fs
* new implementations ... still under construction
*
* Revision 1.3 2000/10/11 11:31:02 fs
* new implementations - still under construction
*
* Revision 1.2 2000/10/09 12:39:28 fs
* some (a lot of) new imlpementations - still under development
*
* Revision 1.1 2000/10/05 10:04:12 fs
* initial checkin
*
*
* Revision 1.0 26.09.00 11:47:18 fs
************************************************************************/