196de5490SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
396de5490SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
496de5490SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
596de5490SAndrew Rist  * distributed with this work for additional information
696de5490SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
796de5490SAndrew Rist  * to you under the Apache License, Version 2.0 (the
896de5490SAndrew Rist  * "License"); you may not use this file except in compliance
996de5490SAndrew Rist  * with the License.  You may obtain a copy of the License at
1096de5490SAndrew Rist  *
1196de5490SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
1296de5490SAndrew Rist  *
1396de5490SAndrew Rist  * Unless required by applicable law or agreed to in writing,
1496de5490SAndrew Rist  * software distributed under the License is distributed on an
1596de5490SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1696de5490SAndrew Rist  * KIND, either express or implied.  See the License for the
1796de5490SAndrew Rist  * specific language governing permissions and limitations
1896de5490SAndrew Rist  * under the License.
1996de5490SAndrew Rist  *
2096de5490SAndrew Rist  *************************************************************/
2196de5490SAndrew Rist 
2296de5490SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_dbaccess.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include "dsnItem.hxx"
28cdf0e10cSrcweir #include "generalpage.hxx"
29cdf0e10cSrcweir #include <connectivity/dbexception.hxx>
30cdf0e10cSrcweir #include "dbu_dlg.hrc"
31cdf0e10cSrcweir #include "dbadmin.hrc"
32cdf0e10cSrcweir #include "dsitems.hxx"
33cdf0e10cSrcweir #include "dbustrings.hrc"
34cdf0e10cSrcweir #include "dbadmin.hxx"
35cdf0e10cSrcweir #include <sfx2/filedlghelper.hxx>
36cdf0e10cSrcweir #include <sfx2/docfilt.hxx>
37cdf0e10cSrcweir #include <vcl/stdtext.hxx>
38cdf0e10cSrcweir #include "localresaccess.hxx"
39cdf0e10cSrcweir #include <vcl/msgbox.hxx>
40cdf0e10cSrcweir #include <svl/stritem.hxx>
41cdf0e10cSrcweir #include <vcl/waitobj.hxx>
42cdf0e10cSrcweir #include <com/sun/star/sdbc/XDriverAccess.hpp>
43cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp>
44cdf0e10cSrcweir #include <com/sun/star/uno/Sequence.hxx>
45cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp>
46cdf0e10cSrcweir #include "DriverSettings.hxx"
47cdf0e10cSrcweir #include "UITools.hxx"
48cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
49cdf0e10cSrcweir #include <unotools/confignode.hxx>
50cdf0e10cSrcweir 
51cdf0e10cSrcweir //.........................................................................
52cdf0e10cSrcweir namespace dbaui
53cdf0e10cSrcweir {
54cdf0e10cSrcweir //.........................................................................
55cdf0e10cSrcweir 	using namespace ::com::sun::star::uno;
56cdf0e10cSrcweir 	using namespace ::com::sun::star::sdbc;
57cdf0e10cSrcweir 	using namespace ::com::sun::star::beans;
58cdf0e10cSrcweir 	using namespace ::com::sun::star::container;
59cdf0e10cSrcweir 
60cdf0e10cSrcweir     //=========================================================================
61cdf0e10cSrcweir 	//= OGeneralPage
62cdf0e10cSrcweir 	//=========================================================================
63cdf0e10cSrcweir 	//-------------------------------------------------------------------------
64cdf0e10cSrcweir 	OGeneralPage::OGeneralPage(Window* pParent, const SfxItemSet& _rItems, sal_Bool _bDBWizardMode)
65cdf0e10cSrcweir 		:OGenericAdministrationPage(pParent, ModuleRes(PAGE_GENERAL), _rItems)
66cdf0e10cSrcweir         ,m_aFTHeaderText                (this, ModuleRes(FT_GENERALHEADERTEXT))
67cdf0e10cSrcweir         ,m_aFTHelpText                  (this, ModuleRes(FT_GENERALHELPTEXT))
68cdf0e10cSrcweir         ,m_aFT_DatasourceTypeHeader     (this, ModuleRes(FT_DATASOURCEHEADER))
69cdf0e10cSrcweir         ,m_aRB_CreateDatabase           (this, ModuleRes(RB_CREATEDBDATABASE))
70cdf0e10cSrcweir         ,m_aRB_OpenDocument             (this, ModuleRes(RB_OPENEXISTINGDOC))
71cdf0e10cSrcweir         ,m_aRB_GetExistingDatabase      (this, ModuleRes(RB_GETEXISTINGDATABASE))
72cdf0e10cSrcweir         ,m_aFT_DocListLabel             (this, ModuleRes(FT_DOCLISTLABEL))
73cdf0e10cSrcweir         ,m_pLB_DocumentList             ( new OpenDocumentListBox( this, "com.sun.star.sdb.OfficeDatabaseDocument", ModuleRes( LB_DOCUMENTLIST ) ) )
74cdf0e10cSrcweir         ,m_aPB_OpenDocument             (this, "com.sun.star.sdb.OfficeDatabaseDocument", ModuleRes(PB_OPENDOCUMENT))
75cdf0e10cSrcweir         ,m_aTypePreLabel		        (this, ModuleRes(FT_DATASOURCETYPE_PRE))
76cdf0e10cSrcweir 		,m_aDatasourceTypeLabel	        (this, ModuleRes(FT_DATATYPE))
77cdf0e10cSrcweir 		,m_pDatasourceType		        ( new ListBox(this, ModuleRes(LB_DATATYPE)))
78cdf0e10cSrcweir         ,m_aFTDataSourceAppendix        (this, ModuleRes(FT_DATATYPEAPPENDIX))
79cdf0e10cSrcweir 		,m_aTypePostLabel		        (this, ModuleRes(FT_DATASOURCETYPE_POST))
80cdf0e10cSrcweir 		,m_aSpecialMessage		        (this, ModuleRes(FT_SPECIAL_MESSAGE))
81cdf0e10cSrcweir         ,m_DBWizardMode                 (_bDBWizardMode)
82cdf0e10cSrcweir         ,m_sMySQLEntry					(ModuleRes(STR_MYSQLENTRY))
83cdf0e10cSrcweir         ,m_eOriginalCreationMode        (eCreateNew)
84cdf0e10cSrcweir         ,m_pCollection                  (NULL)
85cdf0e10cSrcweir 		,m_eNotSupportedKnownType       ( ::dbaccess::DST_UNKNOWN)
86cdf0e10cSrcweir 		,m_eLastMessage                 (smNone)
87cdf0e10cSrcweir         ,m_bDisplayingInvalid           (sal_False)
88cdf0e10cSrcweir 		,m_bUserGrabFocus               (sal_True)
89cdf0e10cSrcweir         ,m_bInitTypeList                (true)
90cdf0e10cSrcweir 	{
91cdf0e10cSrcweir 		// fill the listbox with the UI descriptions for the possible types
92cdf0e10cSrcweir 		// and remember the respective DSN prefixes
93cdf0e10cSrcweir 		FreeResource();
94cdf0e10cSrcweir 		// extract the datasource type collection from the item set
95cdf0e10cSrcweir 		DbuTypeCollectionItem* pCollectionItem = PTR_CAST(DbuTypeCollectionItem, _rItems.GetItem(DSID_TYPECOLLECTION));
96cdf0e10cSrcweir 		if (pCollectionItem)
97cdf0e10cSrcweir 			m_pCollection = pCollectionItem->getCollection();
98cdf0e10cSrcweir 		DBG_ASSERT(m_pCollection, "OGeneralPage::OGeneralPage : really need a DSN type collection !");
99cdf0e10cSrcweir 
100cdf0e10cSrcweir         // If no driver for embedded DBs is installed, and no dBase driver, then hide the "Create new database" option
101cdf0e10cSrcweir         sal_Int32 nCreateNewDBIndex = m_pCollection->getIndexOf( m_pCollection->getEmbeddedDatabase() );
102cdf0e10cSrcweir         if ( nCreateNewDBIndex == -1 )
103cdf0e10cSrcweir             nCreateNewDBIndex = m_pCollection->getIndexOf( ::rtl::OUString::createFromAscii( "sdbc:dbase:" ) );
104cdf0e10cSrcweir         bool bHideCreateNew = ( nCreateNewDBIndex == -1 );
105cdf0e10cSrcweir 
106cdf0e10cSrcweir         // also, if our application policies tell us to hide the option, do it
107cdf0e10cSrcweir         ::utl::OConfigurationTreeRoot aConfig( ::utl::OConfigurationTreeRoot::createWithServiceFactory(
108cdf0e10cSrcweir             ::comphelper::getProcessServiceFactory(),
109cdf0e10cSrcweir             ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.DataAccess/Policies/Features/Base" ) )
110cdf0e10cSrcweir         ) );
111cdf0e10cSrcweir         sal_Bool bAllowCreateLocalDatabase( sal_True );
112cdf0e10cSrcweir         OSL_VERIFY( aConfig.getNodeValue( "CreateLocalDatabase" ) >>= bAllowCreateLocalDatabase );
113cdf0e10cSrcweir         if ( !bAllowCreateLocalDatabase )
114cdf0e10cSrcweir             bHideCreateNew = true;
115cdf0e10cSrcweir 
116cdf0e10cSrcweir         if ( bHideCreateNew )
117cdf0e10cSrcweir         {
118cdf0e10cSrcweir             m_aRB_CreateDatabase.Hide();
119cdf0e10cSrcweir             Window* pWindowsToMove[] = {
120cdf0e10cSrcweir                 &m_aRB_OpenDocument, &m_aRB_GetExistingDatabase, &m_aFT_DocListLabel, m_pLB_DocumentList.get(),
121cdf0e10cSrcweir                 &m_aPB_OpenDocument, &m_aDatasourceTypeLabel, m_pDatasourceType.get(), &m_aFTDataSourceAppendix,
122cdf0e10cSrcweir                 &m_aTypePostLabel
123cdf0e10cSrcweir             };
124cdf0e10cSrcweir             const long nOffset = m_aRB_OpenDocument.GetPosPixel().Y() - m_aRB_CreateDatabase.GetPosPixel().Y();
125cdf0e10cSrcweir             for ( size_t i=0; i < sizeof( pWindowsToMove ) / sizeof( pWindowsToMove[0] ); ++i )
126cdf0e10cSrcweir             {
127cdf0e10cSrcweir                 Point aPos( pWindowsToMove[i]->GetPosPixel() );
128cdf0e10cSrcweir                 aPos.Y() -= nOffset;
129cdf0e10cSrcweir                 pWindowsToMove[i]->SetPosPixel( aPos );
130cdf0e10cSrcweir             }
131cdf0e10cSrcweir         }
132cdf0e10cSrcweir 
133cdf0e10cSrcweir         if ( bHideCreateNew )
134cdf0e10cSrcweir             m_aRB_GetExistingDatabase.Check();
135cdf0e10cSrcweir         else
136cdf0e10cSrcweir             m_aRB_CreateDatabase.Check();
137cdf0e10cSrcweir 
138cdf0e10cSrcweir 		// do some knittings
139cdf0e10cSrcweir 		m_pDatasourceType->SetSelectHdl(LINK(this, OGeneralPage, OnDatasourceTypeSelected));
140cdf0e10cSrcweir    		m_aRB_CreateDatabase.SetClickHdl(LINK(this, OGeneralPage, OnSetupModeSelected));
141cdf0e10cSrcweir    		m_aRB_GetExistingDatabase.SetClickHdl(LINK(this, OGeneralPage, OnSetupModeSelected));
142cdf0e10cSrcweir    		m_aRB_OpenDocument.SetClickHdl(LINK(this, OGeneralPage, OnSetupModeSelected));
143cdf0e10cSrcweir         m_pLB_DocumentList->SetSelectHdl( LINK( this, OGeneralPage, OnDocumentSelected ) );
144cdf0e10cSrcweir         m_aPB_OpenDocument.SetClickHdl( LINK( this, OGeneralPage, OnOpenDocument ) );
145cdf0e10cSrcweir 	}
146cdf0e10cSrcweir 
147cdf0e10cSrcweir     //-------------------------------------------------------------------------
148cdf0e10cSrcweir     OGeneralPage::~OGeneralPage()
149cdf0e10cSrcweir     {
150*3d762826SHerbert Dürr         m_pDatasourceType.reset();
151*3d762826SHerbert Dürr         m_pLB_DocumentList.reset();
152cdf0e10cSrcweir     }
153cdf0e10cSrcweir 
154cdf0e10cSrcweir     //-------------------------------------------------------------------------
155cdf0e10cSrcweir     namespace
156cdf0e10cSrcweir     {
157cdf0e10cSrcweir         struct DisplayedType
158cdf0e10cSrcweir         {
159cdf0e10cSrcweir             ::rtl::OUString eType;
160cdf0e10cSrcweir             String          sDisplayName;
161cdf0e10cSrcweir 
162cdf0e10cSrcweir             DisplayedType( const ::rtl::OUString& _eType, const String& _rDisplayName ) : eType( _eType ), sDisplayName( _rDisplayName ) { }
163cdf0e10cSrcweir         };
164cdf0e10cSrcweir         typedef ::std::vector< DisplayedType > DisplayedTypes;
165cdf0e10cSrcweir 
166cdf0e10cSrcweir         struct DisplayedTypeLess : ::std::binary_function< DisplayedType, DisplayedType, bool >
167cdf0e10cSrcweir         {
168cdf0e10cSrcweir             bool operator() ( const DisplayedType& _rLHS, const DisplayedType& _rRHS )
169cdf0e10cSrcweir             {
170cdf0e10cSrcweir                 return _rLHS.eType < _rRHS.eType;
171cdf0e10cSrcweir             }
172cdf0e10cSrcweir         };
173cdf0e10cSrcweir     }
174cdf0e10cSrcweir 
175cdf0e10cSrcweir     //-------------------------------------------------------------------------
176cdf0e10cSrcweir 	void OGeneralPage::initializeTypeList()
177cdf0e10cSrcweir 	{
178cdf0e10cSrcweir         if ( m_bInitTypeList )
179cdf0e10cSrcweir         {
180cdf0e10cSrcweir             m_bInitTypeList = false;
181cdf0e10cSrcweir             m_pDatasourceType->Clear();
182cdf0e10cSrcweir 
183cdf0e10cSrcweir 		    if ( m_pCollection )
184cdf0e10cSrcweir 		    {
185cdf0e10cSrcweir                 DisplayedTypes aDisplayedTypes;
186cdf0e10cSrcweir 
187cdf0e10cSrcweir                 ::dbaccess::ODsnTypeCollection::TypeIterator aEnd = m_pCollection->end();
188cdf0e10cSrcweir 			    for (	::dbaccess::ODsnTypeCollection::TypeIterator aTypeLoop =  m_pCollection->begin();
189cdf0e10cSrcweir 					    aTypeLoop != aEnd;
190cdf0e10cSrcweir 					    ++aTypeLoop
191cdf0e10cSrcweir 				    )
192cdf0e10cSrcweir 			    {
193cdf0e10cSrcweir                     const ::rtl::OUString sURLPrefix = aTypeLoop.getURLPrefix();
194cdf0e10cSrcweir                     if ( sURLPrefix.getLength() )
195cdf0e10cSrcweir                     {
196cdf0e10cSrcweir 				        String sDisplayName = aTypeLoop.getDisplayName();
197cdf0e10cSrcweir 				        if (   m_pDatasourceType->GetEntryPos( sDisplayName ) == LISTBOX_ENTRY_NOTFOUND
198cdf0e10cSrcweir                             && approveDataSourceType( sURLPrefix, sDisplayName ) )
199cdf0e10cSrcweir 				        {
200cdf0e10cSrcweir                             aDisplayedTypes.push_back( DisplayedTypes::value_type( sURLPrefix, sDisplayName ) );
201cdf0e10cSrcweir 				        }
202cdf0e10cSrcweir                     }
203cdf0e10cSrcweir 			    }
204cdf0e10cSrcweir                 ::std::sort( aDisplayedTypes.begin(), aDisplayedTypes.end(), DisplayedTypeLess() );
205cdf0e10cSrcweir                 DisplayedTypes::const_iterator aDisplayEnd = aDisplayedTypes.end();
206cdf0e10cSrcweir                 for (   DisplayedTypes::const_iterator loop = aDisplayedTypes.begin();
207cdf0e10cSrcweir                         loop != aDisplayEnd;
208cdf0e10cSrcweir                         ++loop
209cdf0e10cSrcweir                     )
210cdf0e10cSrcweir                     insertDatasourceTypeEntryData( loop->eType, loop->sDisplayName );
211cdf0e10cSrcweir 		    } // if ( m_pCollection )
212cdf0e10cSrcweir         }
213cdf0e10cSrcweir 	}
214cdf0e10cSrcweir 
215cdf0e10cSrcweir 
216cdf0e10cSrcweir 
217cdf0e10cSrcweir 	//-------------------------------------------------------------------------
218cdf0e10cSrcweir 	void OGeneralPage::setParentTitle(const ::rtl::OUString& _sURLPrefix)
219cdf0e10cSrcweir 	{
220cdf0e10cSrcweir         if (!m_DBWizardMode)
221cdf0e10cSrcweir         {
222cdf0e10cSrcweir 		    const String sName = m_pCollection->getTypeDisplayName(_sURLPrefix);
223cdf0e10cSrcweir 		    if ( m_pAdminDialog )
224cdf0e10cSrcweir 		    {
225cdf0e10cSrcweir 			    LocalResourceAccess aStringResAccess( PAGE_GENERAL, RSC_TABPAGE );
226cdf0e10cSrcweir 			    String sMessage = String(ModuleRes(STR_PARENTTITLE));
227cdf0e10cSrcweir 			    sMessage.SearchAndReplaceAscii("#",sName);
228cdf0e10cSrcweir 			    m_pAdminDialog->setTitle(sMessage);
229cdf0e10cSrcweir 		    }
230cdf0e10cSrcweir         }
231cdf0e10cSrcweir 	}
232cdf0e10cSrcweir 
233cdf0e10cSrcweir     //-------------------------------------------------------------------------
234cdf0e10cSrcweir     OGeneralPage::CreationMode OGeneralPage::GetDatabaseCreationMode() const
235cdf0e10cSrcweir     {
236cdf0e10cSrcweir         if ( m_aRB_CreateDatabase.IsChecked() )
237cdf0e10cSrcweir             return eCreateNew;
238cdf0e10cSrcweir         if ( m_aRB_GetExistingDatabase.IsChecked() )
239cdf0e10cSrcweir             return eConnectExternal;
240cdf0e10cSrcweir         return eOpenExisting;
241cdf0e10cSrcweir     }
242cdf0e10cSrcweir 
243cdf0e10cSrcweir     //-------------------------------------------------------------------------
244cdf0e10cSrcweir 	void OGeneralPage::GetFocus()
245cdf0e10cSrcweir 	{
246cdf0e10cSrcweir 		OGenericAdministrationPage::GetFocus();
247cdf0e10cSrcweir         if ( m_pLB_DocumentList.get() && m_pLB_DocumentList->IsEnabled() )
248cdf0e10cSrcweir             m_pLB_DocumentList->GrabFocus();
249cdf0e10cSrcweir         else if (m_pDatasourceType.get() && m_pDatasourceType->IsEnabled())
250cdf0e10cSrcweir             m_pDatasourceType->GrabFocus();
251cdf0e10cSrcweir 	}
252cdf0e10cSrcweir 
253cdf0e10cSrcweir 	//-------------------------------------------------------------------------
254cdf0e10cSrcweir 	void OGeneralPage::switchMessage(const ::rtl::OUString& _sURLPrefix)
255cdf0e10cSrcweir 	{
256cdf0e10cSrcweir 		SPECIAL_MESSAGE eMessage = smNone;
257cdf0e10cSrcweir 		if ( !_sURLPrefix.getLength()/*_eType == m_eNotSupportedKnownType*/ )
258cdf0e10cSrcweir 		{
259cdf0e10cSrcweir 			eMessage = smUnsupportedType;
260cdf0e10cSrcweir 		}
261cdf0e10cSrcweir 
262cdf0e10cSrcweir 
263cdf0e10cSrcweir 		if ( eMessage != m_eLastMessage )
264cdf0e10cSrcweir 		{
265cdf0e10cSrcweir 			sal_uInt16 nResId = 0;
266cdf0e10cSrcweir 			if ( smUnsupportedType == eMessage )
267cdf0e10cSrcweir 			    nResId = STR_UNSUPPORTED_DATASOURCE_TYPE;
268cdf0e10cSrcweir 			String sMessage;
269cdf0e10cSrcweir 			if ( nResId )
270cdf0e10cSrcweir 			{
271cdf0e10cSrcweir 				LocalResourceAccess aStringResAccess( PAGE_GENERAL, RSC_TABPAGE );
272cdf0e10cSrcweir 				sMessage = String(ModuleRes(nResId));
273cdf0e10cSrcweir 			}
274cdf0e10cSrcweir 			m_aSpecialMessage.SetText(sMessage);
275cdf0e10cSrcweir 
276cdf0e10cSrcweir 			m_eLastMessage = eMessage;
277cdf0e10cSrcweir 		}
278cdf0e10cSrcweir 	}
279cdf0e10cSrcweir 
280cdf0e10cSrcweir 	//-------------------------------------------------------------------------
281cdf0e10cSrcweir 	void OGeneralPage::onTypeSelected(const ::rtl::OUString& _sURLPrefix)
282cdf0e10cSrcweir 	{
283cdf0e10cSrcweir 		// the the new URL text as indicated by the selection history
284cdf0e10cSrcweir 		implSetCurrentType( _sURLPrefix );
285cdf0e10cSrcweir 
286cdf0e10cSrcweir 		switchMessage(_sURLPrefix);
287cdf0e10cSrcweir 
288cdf0e10cSrcweir 		if ( m_aTypeSelectHandler.IsSet() )
289cdf0e10cSrcweir 			m_aTypeSelectHandler.Call(this);
290cdf0e10cSrcweir 	}
291cdf0e10cSrcweir 
292cdf0e10cSrcweir 	//-------------------------------------------------------------------------
293cdf0e10cSrcweir 	void OGeneralPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
294cdf0e10cSrcweir 	{
295cdf0e10cSrcweir 		initializeTypeList();
296cdf0e10cSrcweir 
297cdf0e10cSrcweir 		// first check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
298cdf0e10cSrcweir 		sal_Bool bValid, bReadonly;
299cdf0e10cSrcweir 		getFlags(_rSet, bValid, bReadonly);
300cdf0e10cSrcweir         if (m_DBWizardMode)
301cdf0e10cSrcweir         {
302cdf0e10cSrcweir 		    m_aTypePreLabel.Hide();
303cdf0e10cSrcweir 		    m_aTypePostLabel.Hide();
304cdf0e10cSrcweir 		    m_aSpecialMessage.Hide();
305cdf0e10cSrcweir             SetControlFontWeight(&m_aFTHeaderText);
306cdf0e10cSrcweir             SetText(String());
307cdf0e10cSrcweir 
308cdf0e10cSrcweir             LayoutHelper::positionBelow( m_aRB_GetExistingDatabase, *m_pDatasourceType, RelatedControls, INDENT_BELOW_RADIO );
309cdf0e10cSrcweir 
310cdf0e10cSrcweir             if ( !bValid || bReadonly )
311cdf0e10cSrcweir             {
312cdf0e10cSrcweir                 m_aDatasourceTypeLabel.Enable( false );
313cdf0e10cSrcweir                 m_pDatasourceType->Enable( false );
314cdf0e10cSrcweir                 m_aFTDataSourceAppendix.Enable( false );
315cdf0e10cSrcweir                 m_aPB_OpenDocument.Enable( false );
316cdf0e10cSrcweir                 m_aFT_DocListLabel.Enable( false );
317cdf0e10cSrcweir                 m_pLB_DocumentList->Enable( false );
318cdf0e10cSrcweir             }
319cdf0e10cSrcweir             else
320cdf0e10cSrcweir             {
321cdf0e10cSrcweir                 m_aControlDependencies.enableOnRadioCheck( m_aRB_GetExistingDatabase, m_aDatasourceTypeLabel, *m_pDatasourceType, m_aFTDataSourceAppendix );
322cdf0e10cSrcweir                 m_aControlDependencies.enableOnRadioCheck( m_aRB_OpenDocument, m_aPB_OpenDocument, m_aFT_DocListLabel, *m_pLB_DocumentList );
323cdf0e10cSrcweir             }
324cdf0e10cSrcweir 
325cdf0e10cSrcweir             m_pLB_DocumentList->SetDropDownLineCount( 20 );
326cdf0e10cSrcweir             if ( m_pLB_DocumentList->GetEntryCount() )
327cdf0e10cSrcweir                 m_pLB_DocumentList->SelectEntryPos( 0 );
328cdf0e10cSrcweir 
329cdf0e10cSrcweir             m_aDatasourceTypeLabel.Hide();
330cdf0e10cSrcweir             m_aFTDataSourceAppendix.Hide();
331cdf0e10cSrcweir 
332cdf0e10cSrcweir 			m_eOriginalCreationMode = GetDatabaseCreationMode();
333cdf0e10cSrcweir         }
334cdf0e10cSrcweir         else
335cdf0e10cSrcweir         {
336cdf0e10cSrcweir             m_aFT_DatasourceTypeHeader.Hide();
337cdf0e10cSrcweir             m_aRB_CreateDatabase.Hide();
338cdf0e10cSrcweir             m_aRB_GetExistingDatabase.Hide();
339cdf0e10cSrcweir             m_aRB_OpenDocument.Hide();
340cdf0e10cSrcweir             m_aPB_OpenDocument.Hide();
341cdf0e10cSrcweir             m_aFT_DocListLabel.Hide();
342cdf0e10cSrcweir             m_pLB_DocumentList->Hide();
343cdf0e10cSrcweir             m_aFTHeaderText.Hide();
344cdf0e10cSrcweir             m_aFTHelpText.Hide();
345cdf0e10cSrcweir 		    m_aTypePreLabel.Enable(bValid);
346cdf0e10cSrcweir 		    m_aTypePostLabel.Enable(bValid);
347cdf0e10cSrcweir 		    m_aDatasourceTypeLabel.Enable(bValid);
348cdf0e10cSrcweir 		    m_pDatasourceType->Enable(bValid);
349cdf0e10cSrcweir         }
350cdf0e10cSrcweir 		// if the selection is invalid, disable evrything
351cdf0e10cSrcweir 		String sName,sConnectURL;
352cdf0e10cSrcweir 		m_bDisplayingInvalid = !bValid;
353cdf0e10cSrcweir 		if ( bValid )
354cdf0e10cSrcweir 		{
355cdf0e10cSrcweir 			// collect some items and some values
356cdf0e10cSrcweir 			SFX_ITEMSET_GET(_rSet, pNameItem, SfxStringItem, DSID_NAME, sal_True);
357cdf0e10cSrcweir 			SFX_ITEMSET_GET(_rSet, pUrlItem, SfxStringItem, DSID_CONNECTURL, sal_True);
358cdf0e10cSrcweir 			DBG_ASSERT(pUrlItem, "OGeneralPage::implInitControls : missing the type attribute !");
359cdf0e10cSrcweir 			DBG_ASSERT(pNameItem, "OGeneralPage::implInitControls : missing the type attribute !");
360cdf0e10cSrcweir 			sName = pNameItem->GetValue();
361cdf0e10cSrcweir 			sConnectURL = pUrlItem->GetValue();
362cdf0e10cSrcweir 		}
363cdf0e10cSrcweir 
364cdf0e10cSrcweir 		::rtl::OUString eOldSelection = m_eCurrentSelection;
365cdf0e10cSrcweir 		m_eNotSupportedKnownType =  ::dbaccess::DST_UNKNOWN;
366cdf0e10cSrcweir 		implSetCurrentType(  ::rtl::OUString() );
367cdf0e10cSrcweir 
368cdf0e10cSrcweir 		// compare the DSN prefix with the registered ones
369cdf0e10cSrcweir 		String sDisplayName;
370cdf0e10cSrcweir 
371cdf0e10cSrcweir 		if (m_pCollection && bValid)
372cdf0e10cSrcweir 		{
373cdf0e10cSrcweir 			implSetCurrentType( m_pCollection->getPrefix(sConnectURL) );
374cdf0e10cSrcweir 			sDisplayName = m_pCollection->getTypeDisplayName(m_eCurrentSelection);
375cdf0e10cSrcweir 		}
376cdf0e10cSrcweir 
377cdf0e10cSrcweir         // select the correct datasource type
378cdf0e10cSrcweir 		if  (   approveDataSourceType( m_eCurrentSelection, sDisplayName )
379cdf0e10cSrcweir             &&  ( LISTBOX_ENTRY_NOTFOUND == m_pDatasourceType->GetEntryPos( sDisplayName ) )
380cdf0e10cSrcweir             )
381cdf0e10cSrcweir 		{	// this indicates it's really a type which is known in general, but not supported on the current platform
382cdf0e10cSrcweir 			// show a message saying so
383cdf0e10cSrcweir 			//	eSpecialMessage = smUnsupportedType;
384cdf0e10cSrcweir 			insertDatasourceTypeEntryData(m_eCurrentSelection, sDisplayName);
385cdf0e10cSrcweir 			// remember this type so we can show the special message again if the user selects this
386cdf0e10cSrcweir 			// type again (without changing the data source)
387cdf0e10cSrcweir 			m_eNotSupportedKnownType = m_pCollection->determineType(m_eCurrentSelection);
388cdf0e10cSrcweir 		}
389cdf0e10cSrcweir 
390cdf0e10cSrcweir 		if (m_aRB_CreateDatabase.IsChecked() && m_DBWizardMode)
391cdf0e10cSrcweir             sDisplayName = m_pCollection->getTypeDisplayName( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("jdbc:")));
392cdf0e10cSrcweir 		m_pDatasourceType->SelectEntry(sDisplayName);
393cdf0e10cSrcweir 
394cdf0e10cSrcweir 		// notify our listener that our type selection has changed (if so)
395cdf0e10cSrcweir 		if ( eOldSelection != m_eCurrentSelection )
396cdf0e10cSrcweir 		{
397cdf0e10cSrcweir 			setParentTitle(m_eCurrentSelection);
398cdf0e10cSrcweir 			onTypeSelected(m_eCurrentSelection);
399cdf0e10cSrcweir 		}
400cdf0e10cSrcweir 
401cdf0e10cSrcweir 		// a special message for the current page state
402cdf0e10cSrcweir 		switchMessage(m_eCurrentSelection);
403cdf0e10cSrcweir 
404cdf0e10cSrcweir 		OGenericAdministrationPage::implInitControls(_rSet, _bSaveValue);
405cdf0e10cSrcweir 	}
406cdf0e10cSrcweir 
407cdf0e10cSrcweir 
408cdf0e10cSrcweir 	// For the databaseWizard we only have one entry for the MySQL Database,
409cdf0e10cSrcweir 	// because we have a seperate tabpage to retrieve the respective datasource type
410cdf0e10cSrcweir 	// ( ::dbaccess::DST_MYSQL_ODBC ||  ::dbaccess::DST_MYSQL_JDBC). Therefore we use  ::dbaccess::DST_MYSQL_JDBC as a temporary
411cdf0e10cSrcweir 	// representative for all MySQl databases)
412cdf0e10cSrcweir     // Also, embedded databases (embedded HSQL, at the moment), are not to appear in the list of
413cdf0e10cSrcweir     // databases to connect to.
414cdf0e10cSrcweir 	bool OGeneralPage::approveDataSourceType( const ::rtl::OUString& _sURLPrefix, String& _inout_rDisplayName )
415cdf0e10cSrcweir 	{
416cdf0e10cSrcweir         const ::dbaccess::DATASOURCE_TYPE eType = m_pCollection->determineType(_sURLPrefix);
417cdf0e10cSrcweir 
418cdf0e10cSrcweir         if ( m_DBWizardMode )
419cdf0e10cSrcweir         {
420cdf0e10cSrcweir             switch ( eType )
421cdf0e10cSrcweir             {
422cdf0e10cSrcweir             case ::dbaccess::DST_MYSQL_JDBC:
423cdf0e10cSrcweir 			    _inout_rDisplayName = m_sMySQLEntry;
424cdf0e10cSrcweir                 break;
425cdf0e10cSrcweir             case ::dbaccess::DST_MYSQL_ODBC:
426cdf0e10cSrcweir             case ::dbaccess::DST_MYSQL_NATIVE:
427cdf0e10cSrcweir                 // don't display those, the decision whether the user connects via JDBC/ODBC/C-OOo is made on another
428cdf0e10cSrcweir                 // page
429cdf0e10cSrcweir                 _inout_rDisplayName = String();
430cdf0e10cSrcweir                 break;
431cdf0e10cSrcweir             default:
432cdf0e10cSrcweir                 break;
433cdf0e10cSrcweir             }
434cdf0e10cSrcweir         }
435cdf0e10cSrcweir 
436cdf0e10cSrcweir         if ( eType == ::dbaccess::DST_MYSQL_NATIVE_DIRECT )
437cdf0e10cSrcweir         {
438cdf0e10cSrcweir             // do not display the Connector/OOo driver itself, it is always wrapped via the MySQL-Driver, if
439cdf0e10cSrcweir             // this driver is installed
440cdf0e10cSrcweir             if ( m_pCollection->hasDriver( "sdbc:mysql:mysqlc:" ) )
441cdf0e10cSrcweir                 _inout_rDisplayName = String();
442cdf0e10cSrcweir         }
443cdf0e10cSrcweir 
444cdf0e10cSrcweir         if ( eType ==  ::dbaccess::DST_EMBEDDED_HSQLDB )
445cdf0e10cSrcweir             _inout_rDisplayName = String();
446cdf0e10cSrcweir 
447cdf0e10cSrcweir         return _inout_rDisplayName.Len() > 0;
448cdf0e10cSrcweir 	}
449cdf0e10cSrcweir 
450cdf0e10cSrcweir 
451cdf0e10cSrcweir 	// -----------------------------------------------------------------------
452cdf0e10cSrcweir 	void OGeneralPage::insertDatasourceTypeEntryData(const ::rtl::OUString& _sType, String sDisplayName)
453cdf0e10cSrcweir 	{
454cdf0e10cSrcweir         // insert a (temporary) entry
455cdf0e10cSrcweir 		sal_uInt16 nPos = m_pDatasourceType->InsertEntry(sDisplayName);
456cdf0e10cSrcweir         if ( nPos >= m_aURLPrefixes.size() )
457cdf0e10cSrcweir             m_aURLPrefixes.resize(nPos+1);
458cdf0e10cSrcweir         m_aURLPrefixes[nPos] = _sType;
459cdf0e10cSrcweir 	}
460cdf0e10cSrcweir 
461cdf0e10cSrcweir 	// -----------------------------------------------------------------------
462cdf0e10cSrcweir 	void OGeneralPage::fillWindows(::std::vector< ISaveValueWrapper* >& _rControlList)
463cdf0e10cSrcweir 	{
464cdf0e10cSrcweir 		_rControlList.push_back(new ODisableWrapper<FixedText>(&m_aTypePreLabel));
465cdf0e10cSrcweir 		_rControlList.push_back(new ODisableWrapper<FixedText>(&m_aDatasourceTypeLabel));
466cdf0e10cSrcweir 		_rControlList.push_back(new ODisableWrapper<FixedText>(&m_aTypePostLabel));
467cdf0e10cSrcweir 		_rControlList.push_back(new ODisableWrapper<FixedText>(&m_aSpecialMessage));
468cdf0e10cSrcweir         _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aFTDataSourceAppendix));
469cdf0e10cSrcweir 	}
470cdf0e10cSrcweir 	// -----------------------------------------------------------------------
471cdf0e10cSrcweir 	void OGeneralPage::fillControls(::std::vector< ISaveValueWrapper* >& _rControlList)
472cdf0e10cSrcweir 	{
473cdf0e10cSrcweir 		_rControlList.push_back(new OSaveValueWrapper<ListBox>(m_pDatasourceType.get()));
474cdf0e10cSrcweir 	}
475cdf0e10cSrcweir 
476cdf0e10cSrcweir 	//-------------------------------------------------------------------------
477cdf0e10cSrcweir 	SfxTabPage*	OGeneralPage::Create(Window* _pParent, const SfxItemSet& _rAttrSet, sal_Bool _bWizardMode)
478cdf0e10cSrcweir 	{
479cdf0e10cSrcweir    		return ( new OGeneralPage( _pParent, _rAttrSet, _bWizardMode ) );
480cdf0e10cSrcweir 	}
481cdf0e10cSrcweir 
482cdf0e10cSrcweir 	//-------------------------------------------------------------------------
483cdf0e10cSrcweir 	void OGeneralPage::implSetCurrentType( const ::rtl::OUString& _eType )
484cdf0e10cSrcweir 	{
485cdf0e10cSrcweir 		if ( _eType == m_eCurrentSelection )
486cdf0e10cSrcweir 			return;
487cdf0e10cSrcweir 
488cdf0e10cSrcweir 		m_eCurrentSelection = _eType;
489cdf0e10cSrcweir 	}
490cdf0e10cSrcweir 
491cdf0e10cSrcweir 	//-------------------------------------------------------------------------
492cdf0e10cSrcweir 	void OGeneralPage::Reset(const SfxItemSet& _rCoreAttrs)
493cdf0e10cSrcweir 	{
494cdf0e10cSrcweir 		// reset all locale data
495cdf0e10cSrcweir 		implSetCurrentType(  ::rtl::OUString() );
496cdf0e10cSrcweir 			// this ensures that our type selection link will be called, even if the new is is the same as the
497cdf0e10cSrcweir 			// current one
498cdf0e10cSrcweir 		OGenericAdministrationPage::Reset(_rCoreAttrs);
499cdf0e10cSrcweir 	}
500cdf0e10cSrcweir 
501cdf0e10cSrcweir 	//-------------------------------------------------------------------------
502cdf0e10cSrcweir 	sal_Bool OGeneralPage::FillItemSet(SfxItemSet& _rCoreAttrs)
503cdf0e10cSrcweir 	{
504cdf0e10cSrcweir 		sal_Bool bChangedSomething = sal_False;
505cdf0e10cSrcweir 
506cdf0e10cSrcweir         bool bCommitTypeSelection = true;
507cdf0e10cSrcweir         if ( m_DBWizardMode )
508cdf0e10cSrcweir         {
509cdf0e10cSrcweir             if ( m_aRB_CreateDatabase.IsChecked() )
510cdf0e10cSrcweir             {
511cdf0e10cSrcweir                 _rCoreAttrs.Put(SfxStringItem(DSID_CONNECTURL, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sdbc:dbase:"))));
512cdf0e10cSrcweir 		        bChangedSomething = sal_True;
513cdf0e10cSrcweir                 bCommitTypeSelection = false;
514cdf0e10cSrcweir             }
515cdf0e10cSrcweir             else if ( m_aRB_OpenDocument.IsChecked() )
516cdf0e10cSrcweir             {
517cdf0e10cSrcweir                 if ( m_aRB_OpenDocument.GetSavedValue() != m_aRB_OpenDocument.IsChecked() )
518cdf0e10cSrcweir 		            bChangedSomething = sal_True;
519cdf0e10cSrcweir 
520cdf0e10cSrcweir                 // TODO
521cdf0e10cSrcweir                 bCommitTypeSelection = false;
522cdf0e10cSrcweir             }
523cdf0e10cSrcweir         }
524cdf0e10cSrcweir 
525cdf0e10cSrcweir         if ( bCommitTypeSelection )
526cdf0e10cSrcweir         {
527cdf0e10cSrcweir 		    sal_uInt16 nEntry = m_pDatasourceType->GetSelectEntryPos();
528cdf0e10cSrcweir 			::rtl::OUString sURLPrefix = m_aURLPrefixes[nEntry];
529cdf0e10cSrcweir 			if (m_DBWizardMode)
530cdf0e10cSrcweir 			{
531cdf0e10cSrcweir                 if  (  ( m_pDatasourceType->GetSavedValue() != nEntry )
532cdf0e10cSrcweir                     || ( GetDatabaseCreationMode() != m_eOriginalCreationMode )
533cdf0e10cSrcweir                     )
534cdf0e10cSrcweir 				{
535cdf0e10cSrcweir 					_rCoreAttrs.Put(SfxStringItem(DSID_CONNECTURL,sURLPrefix ));
536cdf0e10cSrcweir 					bChangedSomething = sal_True;
537cdf0e10cSrcweir 				}
538cdf0e10cSrcweir 				else
539cdf0e10cSrcweir 					implSetCurrentType(sURLPrefix);
540cdf0e10cSrcweir 			}
541cdf0e10cSrcweir 			else
542cdf0e10cSrcweir 			{
543cdf0e10cSrcweir 				if ( m_pDatasourceType->GetSavedValue() != nEntry)
544cdf0e10cSrcweir 				{
545cdf0e10cSrcweir 					_rCoreAttrs.Put(SfxStringItem(DSID_CONNECTURL, sURLPrefix));
546cdf0e10cSrcweir 					bChangedSomething = sal_True;
547cdf0e10cSrcweir 				}
548cdf0e10cSrcweir 			}
549cdf0e10cSrcweir         }
550cdf0e10cSrcweir 		return bChangedSomething;
551cdf0e10cSrcweir 	}
552cdf0e10cSrcweir 
553cdf0e10cSrcweir 	//-------------------------------------------------------------------------
554cdf0e10cSrcweir 	IMPL_LINK(OGeneralPage, OnDatasourceTypeSelected, ListBox*, _pBox)
555cdf0e10cSrcweir 	{
556cdf0e10cSrcweir 		// get the type from the entry data
557cdf0e10cSrcweir 		sal_Int16 nSelected = _pBox->GetSelectEntryPos();
558cdf0e10cSrcweir         const ::rtl::OUString sURLPrefix = m_aURLPrefixes[nSelected];
559cdf0e10cSrcweir 
560cdf0e10cSrcweir 		setParentTitle(sURLPrefix);
561cdf0e10cSrcweir 		// let the impl method do all the stuff
562cdf0e10cSrcweir 		onTypeSelected(sURLPrefix);
563cdf0e10cSrcweir 		// tell the listener we were modified
564cdf0e10cSrcweir 		callModifiedHdl();
565cdf0e10cSrcweir 		// outta here
566cdf0e10cSrcweir 		return 0L;
567cdf0e10cSrcweir 	}
568cdf0e10cSrcweir 
569cdf0e10cSrcweir 	//-------------------------------------------------------------------------
570cdf0e10cSrcweir     OGeneralPage::DocumentDescriptor OGeneralPage::GetSelectedDocument() const
571cdf0e10cSrcweir     {
572cdf0e10cSrcweir         DocumentDescriptor aDocument;
573cdf0e10cSrcweir         if ( m_aBrowsedDocument.sURL.Len() )
574cdf0e10cSrcweir             aDocument = m_aBrowsedDocument;
575cdf0e10cSrcweir         else
576cdf0e10cSrcweir         {
577cdf0e10cSrcweir             aDocument.sURL = m_pLB_DocumentList->GetSelectedDocumentURL();
578cdf0e10cSrcweir             aDocument.sFilter = m_pLB_DocumentList->GetSelectedDocumentFilter();
579cdf0e10cSrcweir         }
580cdf0e10cSrcweir         return aDocument;
581cdf0e10cSrcweir     }
582cdf0e10cSrcweir 
583cdf0e10cSrcweir 	//-------------------------------------------------------------------------
584cdf0e10cSrcweir     IMPL_LINK(OGeneralPage, OnSetupModeSelected, RadioButton*, /*_pBox*/)
585cdf0e10cSrcweir     {
586cdf0e10cSrcweir 		if ( m_aCreationModeHandler.IsSet() )
587cdf0e10cSrcweir 			m_aCreationModeHandler.Call(this);
588cdf0e10cSrcweir         return 1L;
589cdf0e10cSrcweir     }
590cdf0e10cSrcweir 
591cdf0e10cSrcweir 	//-------------------------------------------------------------------------
592cdf0e10cSrcweir     IMPL_LINK(OGeneralPage, OnDocumentSelected, ListBox*, /*_pBox*/)
593cdf0e10cSrcweir     {
594cdf0e10cSrcweir         m_aDocumentSelectionHandler.Call( this );
595cdf0e10cSrcweir         return 0L;
596cdf0e10cSrcweir     }
597cdf0e10cSrcweir 
598cdf0e10cSrcweir     //-------------------------------------------------------------------------
599cdf0e10cSrcweir     IMPL_LINK(OGeneralPage, OnOpenDocument, PushButton*, /*_pBox*/)
600cdf0e10cSrcweir     {
601cdf0e10cSrcweir         ::sfx2::FileDialogHelper aFileDlg( WB_OPEN, ::String::CreateFromAscii("sdatabase") );
602cdf0e10cSrcweir         const SfxFilter* pFilter = getStandardDatabaseFilter();
603cdf0e10cSrcweir 		if ( pFilter )
604cdf0e10cSrcweir 		{
605cdf0e10cSrcweir //			aFileDlg.AddFilter(pFilter->GetUIName(),pFilter->GetDefaultExtension());
606cdf0e10cSrcweir 			aFileDlg.SetCurrentFilter(pFilter->GetUIName());
607cdf0e10cSrcweir 		}
608cdf0e10cSrcweir 		if ( aFileDlg.Execute() == ERRCODE_NONE )
609cdf0e10cSrcweir         {
610cdf0e10cSrcweir             String sPath = aFileDlg.GetPath();
611cdf0e10cSrcweir             if ( aFileDlg.GetCurrentFilter() != pFilter->GetUIName() || !pFilter->GetWildcard().Matches(sPath) )
612cdf0e10cSrcweir             {
613cdf0e10cSrcweir                 String sMessage(ModuleRes(STR_ERR_USE_CONNECT_TO));
614cdf0e10cSrcweir 			    InfoBox aError(this, sMessage);
615cdf0e10cSrcweir 			    aError.Execute();
616cdf0e10cSrcweir                 m_aRB_GetExistingDatabase.Check();
617cdf0e10cSrcweir                 OnSetupModeSelected(&m_aRB_GetExistingDatabase);
618cdf0e10cSrcweir                 return 0L;
619cdf0e10cSrcweir             }
620cdf0e10cSrcweir 			m_aBrowsedDocument.sURL = sPath;
621cdf0e10cSrcweir             m_aBrowsedDocument.sFilter = String();
622cdf0e10cSrcweir             m_aChooseDocumentHandler.Call( this );
623cdf0e10cSrcweir             return 1L;
624cdf0e10cSrcweir         }
625cdf0e10cSrcweir 
626cdf0e10cSrcweir         return 0L;
627cdf0e10cSrcweir     }
628cdf0e10cSrcweir 
629cdf0e10cSrcweir //.........................................................................
630cdf0e10cSrcweir }	// namespace dbaui
631cdf0e10cSrcweir //.........................................................................
632cdf0e10cSrcweir 
633