summaryrefslogtreecommitdiff
path: root/dbaccess/source/ui/dlg/generalpage.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'dbaccess/source/ui/dlg/generalpage.cxx')
-rw-r--r--dbaccess/source/ui/dlg/generalpage.cxx638
1 files changed, 638 insertions, 0 deletions
diff --git a/dbaccess/source/ui/dlg/generalpage.cxx b/dbaccess/source/ui/dlg/generalpage.cxx
new file mode 100644
index 000000000000..060f83d43853
--- /dev/null
+++ b/dbaccess/source/ui/dlg/generalpage.cxx
@@ -0,0 +1,638 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_dbaccess.hxx"
+
+#include "dsnItem.hxx"
+#include "generalpage.hxx"
+#include <connectivity/dbexception.hxx>
+#include "dbu_dlg.hrc"
+#include "dbadmin.hrc"
+#include "dsitems.hxx"
+#include "dbustrings.hrc"
+#include "dbadmin.hxx"
+#include <sfx2/filedlghelper.hxx>
+#include <sfx2/docfilt.hxx>
+#include <vcl/stdtext.hxx>
+#include "localresaccess.hxx"
+#include <vcl/msgbox.hxx>
+#include <svl/stritem.hxx>
+#include <vcl/waitobj.hxx>
+#include <com/sun/star/sdbc/XDriverAccess.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include "DriverSettings.hxx"
+#include "UITools.hxx"
+#include <comphelper/processfactory.hxx>
+#include <unotools/confignode.hxx>
+#include <osl/diagnose.h>
+
+//.........................................................................
+namespace dbaui
+{
+//.........................................................................
+ using namespace ::com::sun::star::uno;
+ using namespace ::com::sun::star::sdbc;
+ using namespace ::com::sun::star::beans;
+ using namespace ::com::sun::star::container;
+
+ //=========================================================================
+ //= OGeneralPage
+ //=========================================================================
+ //-------------------------------------------------------------------------
+ OGeneralPage::OGeneralPage(Window* pParent, const SfxItemSet& _rItems, sal_Bool _bDBWizardMode)
+ :OGenericAdministrationPage(pParent, ModuleRes(PAGE_GENERAL), _rItems)
+ ,m_aFTHeaderText (this, ModuleRes(FT_GENERALHEADERTEXT))
+ ,m_aFTHelpText (this, ModuleRes(FT_GENERALHELPTEXT))
+ ,m_aFT_DatasourceTypeHeader (this, ModuleRes(FT_DATASOURCEHEADER))
+ ,m_aRB_CreateDatabase (this, ModuleRes(RB_CREATEDBDATABASE))
+ ,m_aRB_OpenDocument (this, ModuleRes(RB_OPENEXISTINGDOC))
+ ,m_aRB_GetExistingDatabase (this, ModuleRes(RB_GETEXISTINGDATABASE))
+ ,m_aFT_DocListLabel (this, ModuleRes(FT_DOCLISTLABEL))
+ ,m_pLB_DocumentList ( new OpenDocumentListBox( this, "com.sun.star.sdb.OfficeDatabaseDocument", ModuleRes( LB_DOCUMENTLIST ) ) )
+ ,m_aPB_OpenDocument (this, "com.sun.star.sdb.OfficeDatabaseDocument", ModuleRes(PB_OPENDOCUMENT))
+ ,m_aTypePreLabel (this, ModuleRes(FT_DATASOURCETYPE_PRE))
+ ,m_aDatasourceTypeLabel (this, ModuleRes(FT_DATATYPE))
+ ,m_pDatasourceType ( new ListBox(this, ModuleRes(LB_DATATYPE)))
+ ,m_aFTDataSourceAppendix (this, ModuleRes(FT_DATATYPEAPPENDIX))
+ ,m_aTypePostLabel (this, ModuleRes(FT_DATASOURCETYPE_POST))
+ ,m_aSpecialMessage (this, ModuleRes(FT_SPECIAL_MESSAGE))
+ ,m_DBWizardMode (_bDBWizardMode)
+ ,m_sMySQLEntry (ModuleRes(STR_MYSQLENTRY))
+ ,m_eOriginalCreationMode (eCreateNew)
+ ,m_pCollection (NULL)
+ ,m_eNotSupportedKnownType ( ::dbaccess::DST_UNKNOWN)
+ ,m_eLastMessage (smNone)
+ ,m_bDisplayingInvalid (sal_False)
+ ,m_bUserGrabFocus (sal_True)
+ ,m_bInitTypeList (true)
+ {
+ // 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();
+ OSL_ENSURE(m_pCollection, "OGeneralPage::OGeneralPage : really need a DSN type collection !");
+
+ // If no driver for embedded DBs is installed, and no dBase driver, then hide the "Create new database" option
+ sal_Int32 nCreateNewDBIndex = m_pCollection->getIndexOf( m_pCollection->getEmbeddedDatabase() );
+ if ( nCreateNewDBIndex == -1 )
+ nCreateNewDBIndex = m_pCollection->getIndexOf( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sdbc:dbase:")) );
+ bool bHideCreateNew = ( nCreateNewDBIndex == -1 );
+
+ // also, if our application policies tell us to hide the option, do it
+ ::utl::OConfigurationTreeRoot aConfig( ::utl::OConfigurationTreeRoot::createWithServiceFactory(
+ ::comphelper::getProcessServiceFactory(),
+ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.DataAccess/Policies/Features/Base" ) )
+ ) );
+ sal_Bool bAllowCreateLocalDatabase( sal_True );
+ OSL_VERIFY( aConfig.getNodeValue( "CreateLocalDatabase" ) >>= bAllowCreateLocalDatabase );
+ if ( !bAllowCreateLocalDatabase )
+ bHideCreateNew = true;
+
+ if ( bHideCreateNew )
+ {
+ m_aRB_CreateDatabase.Hide();
+ Window* pWindowsToMove[] = {
+ &m_aRB_OpenDocument, &m_aRB_GetExistingDatabase, &m_aFT_DocListLabel, m_pLB_DocumentList.get(),
+ &m_aPB_OpenDocument, &m_aDatasourceTypeLabel, m_pDatasourceType.get(), &m_aFTDataSourceAppendix,
+ &m_aTypePostLabel
+ };
+ const long nOffset = m_aRB_OpenDocument.GetPosPixel().Y() - m_aRB_CreateDatabase.GetPosPixel().Y();
+ for ( size_t i=0; i < SAL_N_ELEMENTS( pWindowsToMove ); ++i )
+ {
+ Point aPos( pWindowsToMove[i]->GetPosPixel() );
+ aPos.Y() -= nOffset;
+ pWindowsToMove[i]->SetPosPixel( aPos );
+ }
+ }
+
+ if ( bHideCreateNew )
+ m_aRB_GetExistingDatabase.Check();
+ else
+ m_aRB_CreateDatabase.Check();
+
+ // do some knittings
+ m_pDatasourceType->SetSelectHdl(LINK(this, OGeneralPage, OnDatasourceTypeSelected));
+ m_aRB_CreateDatabase.SetClickHdl(LINK(this, OGeneralPage, OnSetupModeSelected));
+ m_aRB_GetExistingDatabase.SetClickHdl(LINK(this, OGeneralPage, OnSetupModeSelected));
+ m_aRB_OpenDocument.SetClickHdl(LINK(this, OGeneralPage, OnSetupModeSelected));
+ m_pLB_DocumentList->SetSelectHdl( LINK( this, OGeneralPage, OnDocumentSelected ) );
+ m_aPB_OpenDocument.SetClickHdl( LINK( this, OGeneralPage, OnOpenDocument ) );
+ }
+
+ //-------------------------------------------------------------------------
+ OGeneralPage::~OGeneralPage()
+ {
+ m_pDatasourceType.reset( NULL );
+ m_pLB_DocumentList.reset( NULL );
+ }
+
+ //-------------------------------------------------------------------------
+ namespace
+ {
+ struct DisplayedType
+ {
+ ::rtl::OUString eType;
+ String sDisplayName;
+
+ DisplayedType( const ::rtl::OUString& _eType, const String& _rDisplayName ) : eType( _eType ), sDisplayName( _rDisplayName ) { }
+ };
+ typedef ::std::vector< DisplayedType > DisplayedTypes;
+
+ struct DisplayedTypeLess : ::std::binary_function< DisplayedType, DisplayedType, bool >
+ {
+ bool operator() ( const DisplayedType& _rLHS, const DisplayedType& _rRHS )
+ {
+ return _rLHS.eType < _rRHS.eType;
+ }
+ };
+ }
+
+ //-------------------------------------------------------------------------
+ void OGeneralPage::initializeTypeList()
+ {
+ if ( m_bInitTypeList )
+ {
+ m_bInitTypeList = false;
+ m_pDatasourceType->Clear();
+
+ if ( m_pCollection )
+ {
+ DisplayedTypes aDisplayedTypes;
+
+ ::dbaccess::ODsnTypeCollection::TypeIterator aEnd = m_pCollection->end();
+ for ( ::dbaccess::ODsnTypeCollection::TypeIterator aTypeLoop = m_pCollection->begin();
+ aTypeLoop != aEnd;
+ ++aTypeLoop
+ )
+ {
+ const ::rtl::OUString sURLPrefix = aTypeLoop.getURLPrefix();
+ if ( sURLPrefix.getLength() )
+ {
+ String sDisplayName = aTypeLoop.getDisplayName();
+ if ( m_pDatasourceType->GetEntryPos( sDisplayName ) == LISTBOX_ENTRY_NOTFOUND
+ && approveDataSourceType( sURLPrefix, sDisplayName ) )
+ {
+ aDisplayedTypes.push_back( DisplayedTypes::value_type( sURLPrefix, sDisplayName ) );
+ }
+ }
+ }
+ ::std::sort( aDisplayedTypes.begin(), aDisplayedTypes.end(), DisplayedTypeLess() );
+ DisplayedTypes::const_iterator aDisplayEnd = aDisplayedTypes.end();
+ for ( DisplayedTypes::const_iterator loop = aDisplayedTypes.begin();
+ loop != aDisplayEnd;
+ ++loop
+ )
+ insertDatasourceTypeEntryData( loop->eType, loop->sDisplayName );
+ }
+ }
+ }
+
+
+
+ //-------------------------------------------------------------------------
+ void OGeneralPage::setParentTitle(const ::rtl::OUString& _sURLPrefix)
+ {
+ if (!m_DBWizardMode)
+ {
+ const String sName = m_pCollection->getTypeDisplayName(_sURLPrefix);
+ if ( m_pAdminDialog )
+ {
+ LocalResourceAccess aStringResAccess( PAGE_GENERAL, RSC_TABPAGE );
+ String sMessage = String(ModuleRes(STR_PARENTTITLE));
+ sMessage.SearchAndReplaceAscii("#",sName);
+ m_pAdminDialog->setTitle(sMessage);
+ }
+ }
+ }
+
+ //-------------------------------------------------------------------------
+ OGeneralPage::CreationMode OGeneralPage::GetDatabaseCreationMode() const
+ {
+ if ( m_aRB_CreateDatabase.IsChecked() )
+ return eCreateNew;
+ if ( m_aRB_GetExistingDatabase.IsChecked() )
+ return eConnectExternal;
+ return eOpenExisting;
+ }
+
+ //-------------------------------------------------------------------------
+ void OGeneralPage::GetFocus()
+ {
+ OGenericAdministrationPage::GetFocus();
+ if ( m_pLB_DocumentList.get() && m_pLB_DocumentList->IsEnabled() )
+ m_pLB_DocumentList->GrabFocus();
+ else if (m_pDatasourceType.get() && m_pDatasourceType->IsEnabled())
+ m_pDatasourceType->GrabFocus();
+ }
+
+ //-------------------------------------------------------------------------
+ void OGeneralPage::switchMessage(const ::rtl::OUString& _sURLPrefix)
+ {
+ SPECIAL_MESSAGE eMessage = smNone;
+ if ( !_sURLPrefix.getLength()/*_eType == m_eNotSupportedKnownType*/ )
+ {
+ eMessage = smUnsupportedType;
+ }
+
+
+ if ( eMessage != m_eLastMessage )
+ {
+ sal_uInt16 nResId = 0;
+ if ( smUnsupportedType == eMessage )
+ nResId = STR_UNSUPPORTED_DATASOURCE_TYPE;
+ String sMessage;
+ if ( nResId )
+ {
+ LocalResourceAccess aStringResAccess( PAGE_GENERAL, RSC_TABPAGE );
+ sMessage = String(ModuleRes(nResId));
+ }
+ m_aSpecialMessage.SetText(sMessage);
+
+ m_eLastMessage = eMessage;
+ }
+ }
+
+ //-------------------------------------------------------------------------
+ void OGeneralPage::onTypeSelected(const ::rtl::OUString& _sURLPrefix)
+ {
+ // the the new URL text as indicated by the selection history
+ implSetCurrentType( _sURLPrefix );
+
+ switchMessage(_sURLPrefix);
+
+ if ( m_aTypeSelectHandler.IsSet() )
+ m_aTypeSelectHandler.Call(this);
+ }
+
+ //-------------------------------------------------------------------------
+ void OGeneralPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
+ {
+ initializeTypeList();
+
+ // 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 (m_DBWizardMode)
+ {
+ m_aTypePreLabel.Hide();
+ m_aTypePostLabel.Hide();
+ m_aSpecialMessage.Hide();
+ SetControlFontWeight(&m_aFTHeaderText);
+ SetText(String());
+
+ LayoutHelper::positionBelow( m_aRB_GetExistingDatabase, *m_pDatasourceType, RelatedControls, INDENT_BELOW_RADIO );
+
+ if ( !bValid || bReadonly )
+ {
+ m_aDatasourceTypeLabel.Enable( false );
+ m_pDatasourceType->Enable( false );
+ m_aFTDataSourceAppendix.Enable( false );
+ m_aPB_OpenDocument.Enable( false );
+ m_aFT_DocListLabel.Enable( false );
+ m_pLB_DocumentList->Enable( false );
+ }
+ else
+ {
+ m_aControlDependencies.enableOnRadioCheck( m_aRB_GetExistingDatabase, m_aDatasourceTypeLabel, *m_pDatasourceType, m_aFTDataSourceAppendix );
+ m_aControlDependencies.enableOnRadioCheck( m_aRB_OpenDocument, m_aPB_OpenDocument, m_aFT_DocListLabel, *m_pLB_DocumentList );
+ }
+
+ m_pLB_DocumentList->SetDropDownLineCount( 20 );
+ if ( m_pLB_DocumentList->GetEntryCount() )
+ m_pLB_DocumentList->SelectEntryPos( 0 );
+
+ m_aDatasourceTypeLabel.Hide();
+ m_aFTDataSourceAppendix.Hide();
+
+ m_eOriginalCreationMode = GetDatabaseCreationMode();
+ }
+ else
+ {
+ m_aFT_DatasourceTypeHeader.Hide();
+ m_aRB_CreateDatabase.Hide();
+ m_aRB_GetExistingDatabase.Hide();
+ m_aRB_OpenDocument.Hide();
+ m_aPB_OpenDocument.Hide();
+ m_aFT_DocListLabel.Hide();
+ m_pLB_DocumentList->Hide();
+ m_aFTHeaderText.Hide();
+ m_aFTHelpText.Hide();
+ m_aTypePreLabel.Enable(bValid);
+ m_aTypePostLabel.Enable(bValid);
+ m_aDatasourceTypeLabel.Enable(bValid);
+ m_pDatasourceType->Enable(bValid);
+ }
+ // if the selection is invalid, disable evrything
+ String sName,sConnectURL;
+ m_bDisplayingInvalid = !bValid;
+ if ( bValid )
+ {
+ // collect some items and some values
+ SFX_ITEMSET_GET(_rSet, pNameItem, SfxStringItem, DSID_NAME, sal_True);
+ SFX_ITEMSET_GET(_rSet, pUrlItem, SfxStringItem, DSID_CONNECTURL, sal_True);
+ OSL_ENSURE(pUrlItem, "OGeneralPage::implInitControls : missing the type attribute !");
+ OSL_ENSURE(pNameItem, "OGeneralPage::implInitControls : missing the type attribute !");
+ sName = pNameItem->GetValue();
+ sConnectURL = pUrlItem->GetValue();
+ }
+
+ ::rtl::OUString eOldSelection = m_eCurrentSelection;
+ m_eNotSupportedKnownType = ::dbaccess::DST_UNKNOWN;
+ implSetCurrentType( ::rtl::OUString() );
+
+ // compare the DSN prefix with the registered ones
+ String sDisplayName;
+
+ if (m_pCollection && bValid)
+ {
+ implSetCurrentType( m_pCollection->getPrefix(sConnectURL) );
+ sDisplayName = m_pCollection->getTypeDisplayName(m_eCurrentSelection);
+ }
+
+ // select the correct datasource type
+ if ( approveDataSourceType( m_eCurrentSelection, sDisplayName )
+ && ( LISTBOX_ENTRY_NOTFOUND == m_pDatasourceType->GetEntryPos( sDisplayName ) )
+ )
+ { // this indicates it's really a type which is known in general, but not supported on the current platform
+ // show a message saying so
+ // eSpecialMessage = smUnsupportedType;
+ insertDatasourceTypeEntryData(m_eCurrentSelection, sDisplayName);
+ // remember this type so we can show the special message again if the user selects this
+ // type again (without changing the data source)
+ m_eNotSupportedKnownType = m_pCollection->determineType(m_eCurrentSelection);
+ }
+
+ if (m_aRB_CreateDatabase.IsChecked() && m_DBWizardMode)
+ sDisplayName = m_pCollection->getTypeDisplayName( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("jdbc:")));
+ m_pDatasourceType->SelectEntry(sDisplayName);
+
+ // notify our listener that our type selection has changed (if so)
+ if ( eOldSelection != m_eCurrentSelection )
+ {
+ setParentTitle(m_eCurrentSelection);
+ onTypeSelected(m_eCurrentSelection);
+ }
+
+ // a special message for the current page state
+ switchMessage(m_eCurrentSelection);
+
+ OGenericAdministrationPage::implInitControls(_rSet, _bSaveValue);
+ }
+
+
+ // For the databaseWizard we only have one entry for the MySQL Database,
+ // because we have a seperate tabpage to retrieve the respective datasource type
+ // ( ::dbaccess::DST_MYSQL_ODBC || ::dbaccess::DST_MYSQL_JDBC). Therefore we use ::dbaccess::DST_MYSQL_JDBC as a temporary
+ // representative for all MySQl databases)
+ // Also, embedded databases (embedded HSQL, at the moment), are not to appear in the list of
+ // databases to connect to.
+ bool OGeneralPage::approveDataSourceType( const ::rtl::OUString& _sURLPrefix, String& _inout_rDisplayName )
+ {
+ const ::dbaccess::DATASOURCE_TYPE eType = m_pCollection->determineType(_sURLPrefix);
+
+ if ( m_DBWizardMode )
+ {
+ switch ( eType )
+ {
+ case ::dbaccess::DST_MYSQL_JDBC:
+ _inout_rDisplayName = m_sMySQLEntry;
+ break;
+ case ::dbaccess::DST_MYSQL_ODBC:
+ case ::dbaccess::DST_MYSQL_NATIVE:
+ // don't display those, the decision whether the user connects via JDBC/ODBC/C-OOo is made on another
+ // page
+ _inout_rDisplayName = String();
+ break;
+ default:
+ break;
+ }
+ }
+
+ if ( eType == ::dbaccess::DST_MYSQL_NATIVE_DIRECT )
+ {
+ // do not display the Connector/OOo driver itself, it is always wrapped via the MySQL-Driver, if
+ // this driver is installed
+ if ( m_pCollection->hasDriver( "sdbc:mysql:mysqlc:" ) )
+ _inout_rDisplayName = String();
+ }
+
+ if ( eType == ::dbaccess::DST_EMBEDDED_HSQLDB )
+ _inout_rDisplayName = String();
+
+ return _inout_rDisplayName.Len() > 0;
+ }
+
+
+ // -----------------------------------------------------------------------
+ void OGeneralPage::insertDatasourceTypeEntryData(const ::rtl::OUString& _sType, String sDisplayName)
+ {
+ // insert a (temporary) entry
+ sal_uInt16 nPos = m_pDatasourceType->InsertEntry(sDisplayName);
+ if ( nPos >= m_aURLPrefixes.size() )
+ m_aURLPrefixes.resize(nPos+1);
+ m_aURLPrefixes[nPos] = _sType;
+ }
+
+ // -----------------------------------------------------------------------
+ void OGeneralPage::fillWindows(::std::vector< ISaveValueWrapper* >& _rControlList)
+ {
+ _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aTypePreLabel));
+ _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aDatasourceTypeLabel));
+ _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aTypePostLabel));
+ _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aSpecialMessage));
+ _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aFTDataSourceAppendix));
+ }
+ // -----------------------------------------------------------------------
+ void OGeneralPage::fillControls(::std::vector< ISaveValueWrapper* >& _rControlList)
+ {
+ _rControlList.push_back(new OSaveValueWrapper<ListBox>(m_pDatasourceType.get()));
+ }
+
+ //-------------------------------------------------------------------------
+ SfxTabPage* OGeneralPage::Create(Window* _pParent, const SfxItemSet& _rAttrSet, sal_Bool _bWizardMode)
+ {
+ return ( new OGeneralPage( _pParent, _rAttrSet, _bWizardMode ) );
+ }
+
+ //-------------------------------------------------------------------------
+ void OGeneralPage::implSetCurrentType( const ::rtl::OUString& _eType )
+ {
+ if ( _eType == m_eCurrentSelection )
+ return;
+
+ m_eCurrentSelection = _eType;
+ }
+
+ //-------------------------------------------------------------------------
+ void OGeneralPage::Reset(const SfxItemSet& _rCoreAttrs)
+ {
+ // reset all locale data
+ implSetCurrentType( ::rtl::OUString() );
+ // 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);
+ }
+
+ //-------------------------------------------------------------------------
+ sal_Bool OGeneralPage::FillItemSet(SfxItemSet& _rCoreAttrs)
+ {
+ sal_Bool bChangedSomething = sal_False;
+
+ bool bCommitTypeSelection = true;
+ if ( m_DBWizardMode )
+ {
+ if ( m_aRB_CreateDatabase.IsChecked() )
+ {
+ _rCoreAttrs.Put(SfxStringItem(DSID_CONNECTURL, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sdbc:dbase:"))));
+ bChangedSomething = sal_True;
+ bCommitTypeSelection = false;
+ }
+ else if ( m_aRB_OpenDocument.IsChecked() )
+ {
+ if ( m_aRB_OpenDocument.GetSavedValue() != m_aRB_OpenDocument.IsChecked() )
+ bChangedSomething = sal_True;
+
+ // TODO
+ bCommitTypeSelection = false;
+ }
+ }
+
+ if ( bCommitTypeSelection )
+ {
+ sal_uInt16 nEntry = m_pDatasourceType->GetSelectEntryPos();
+ ::rtl::OUString sURLPrefix = m_aURLPrefixes[nEntry];
+ if (m_DBWizardMode)
+ {
+ if ( ( m_pDatasourceType->GetSavedValue() != nEntry )
+ || ( GetDatabaseCreationMode() != m_eOriginalCreationMode )
+ )
+ {
+ _rCoreAttrs.Put(SfxStringItem(DSID_CONNECTURL,sURLPrefix ));
+ bChangedSomething = sal_True;
+ }
+ else
+ implSetCurrentType(sURLPrefix);
+ }
+ else
+ {
+ if ( m_pDatasourceType->GetSavedValue() != nEntry)
+ {
+ _rCoreAttrs.Put(SfxStringItem(DSID_CONNECTURL, sURLPrefix));
+ bChangedSomething = sal_True;
+ }
+ }
+ }
+ return bChangedSomething;
+ }
+
+ //-------------------------------------------------------------------------
+ IMPL_LINK(OGeneralPage, OnDatasourceTypeSelected, ListBox*, _pBox)
+ {
+ // get the type from the entry data
+ sal_Int16 nSelected = _pBox->GetSelectEntryPos();
+ const ::rtl::OUString sURLPrefix = m_aURLPrefixes[nSelected];
+
+ setParentTitle(sURLPrefix);
+ // let the impl method do all the stuff
+ onTypeSelected(sURLPrefix);
+ // tell the listener we were modified
+ callModifiedHdl();
+ // outta here
+ return 0L;
+ }
+
+ //-------------------------------------------------------------------------
+ OGeneralPage::DocumentDescriptor OGeneralPage::GetSelectedDocument() const
+ {
+ DocumentDescriptor aDocument;
+ if ( m_aBrowsedDocument.sURL.Len() )
+ aDocument = m_aBrowsedDocument;
+ else
+ {
+ aDocument.sURL = m_pLB_DocumentList->GetSelectedDocumentURL();
+ aDocument.sFilter = m_pLB_DocumentList->GetSelectedDocumentFilter();
+ }
+ return aDocument;
+ }
+
+ //-------------------------------------------------------------------------
+ IMPL_LINK(OGeneralPage, OnSetupModeSelected, RadioButton*, /*_pBox*/)
+ {
+ if ( m_aCreationModeHandler.IsSet() )
+ m_aCreationModeHandler.Call(this);
+ return 1L;
+ }
+
+ //-------------------------------------------------------------------------
+ IMPL_LINK(OGeneralPage, OnDocumentSelected, ListBox*, /*_pBox*/)
+ {
+ m_aDocumentSelectionHandler.Call( this );
+ return 0L;
+ }
+
+ //-------------------------------------------------------------------------
+ IMPL_LINK(OGeneralPage, OnOpenDocument, PushButton*, /*_pBox*/)
+ {
+ ::sfx2::FileDialogHelper aFileDlg( WB_OPEN, ::String::CreateFromAscii("sdatabase") );
+ const SfxFilter* pFilter = getStandardDatabaseFilter();
+ if ( pFilter )
+ {
+ aFileDlg.SetCurrentFilter(pFilter->GetUIName());
+ }
+ if ( aFileDlg.Execute() == ERRCODE_NONE )
+ {
+ String sPath = aFileDlg.GetPath();
+ if ( aFileDlg.GetCurrentFilter() != pFilter->GetUIName() || !pFilter->GetWildcard().Matches(sPath) )
+ {
+ String sMessage(ModuleRes(STR_ERR_USE_CONNECT_TO));
+ InfoBox aError(this, sMessage);
+ aError.Execute();
+ m_aRB_GetExistingDatabase.Check();
+ OnSetupModeSelected(&m_aRB_GetExistingDatabase);
+ return 0L;
+ }
+ m_aBrowsedDocument.sURL = sPath;
+ m_aBrowsedDocument.sFilter = String();
+ m_aChooseDocumentHandler.Call( this );
+ return 1L;
+ }
+
+ return 0L;
+ }
+
+//.........................................................................
+} // namespace dbaui
+//.........................................................................
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */