xref: /trunk/main/dbaccess/source/ui/dlg/dbwiz.cxx (revision b63233d8)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_dbui.hxx"
26 
27 #ifndef DBAUI_DBWIZ_HXX
28 #include "dbwiz.hxx"
29 #endif
30 #ifndef _DBAUI_DBADMIN_HRC_
31 #include "dbadmin.hrc"
32 #endif
33 #ifndef _DBU_DLG_HRC_
34 #include "dbu_dlg.hrc"
35 #endif
36 #ifndef _DBAUI_DATASOURCEITEMS_HXX_
37 #include "dsitems.hxx"
38 #endif
39 #include "dsnItem.hxx"
40 #ifndef _SFXSTRITEM_HXX
41 #include <svl/stritem.hxx>
42 #endif
43 #ifndef _SFXENUMITEM_HXX
44 #include <svl/eitem.hxx>
45 #endif
46 #ifndef _SFXINTITEM_HXX
47 #include <svl/intitem.hxx>
48 #endif
49 #ifndef _SV_MSGBOX_HXX
50 #include <vcl/msgbox.hxx>
51 #endif
52 #ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
53 #include "dbustrings.hrc"
54 #endif
55 #ifndef _DBAUI_ADMINPAGES_HXX_
56 #include "adminpages.hxx"
57 #endif
58 #ifndef _DBAUI_GENERALPAGE_HXX_
59 #include "generalpage.hxx"
60 #endif
61 #ifndef _DBAUI_LOCALRESACCESS_HXX_
62 #include "localresaccess.hxx"
63 #endif
64 #ifndef _DBAUI_STRINGLISTITEM_HXX_
65 #include "stringlistitem.hxx"
66 #endif
67 #ifndef _DBAUI_PROPERTYSETITEM_HXX_
68 #include "propertysetitem.hxx"
69 #endif
70 #ifndef _UNOTOOLS_CONFIGNODE_HXX_
71 #include <unotools/confignode.hxx>
72 #endif
73 #ifndef DBAUI_CONNECTIONPAGE_HXX
74 #include "ConnectionPage.hxx"
75 #endif
76 #ifndef DBAUI_DRIVERSETTINGS_HXX
77 #include "DriverSettings.hxx"
78 #endif
79 #ifndef _DBAUI_DBADMINIMPL_HXX_
80 #include "DbAdminImpl.hxx"
81 #endif
82 #ifndef _DBA_DBACCESS_HELPID_HRC_
83 #include "dbaccess_helpid.hrc"
84 #endif
85 
86 //.........................................................................
87 namespace dbaui
88 {
89 //.........................................................................
90 using namespace svt;
91 using namespace com::sun::star::uno;
92 using namespace com::sun::star::sdbc;
93 using namespace com::sun::star::lang;
94 using namespace com::sun::star::util;
95 using namespace com::sun::star::beans;
96 using namespace com::sun::star::container;
97 
98 #define START_PAGE			            0
99 #define CONNECTION_PAGE		            1
100 #define ADDITIONAL_PAGE_DBASE     		2
101 #define ADDITIONAL_PAGE_FLAT            3
102 #define ADDITIONAL_PAGE_LDAP            4
103 #define ADDITIONAL_PAGE_ADABAS          5
104 #define ADDITIONAL_PAGE_MYSQL_JDBC      6
105 #define ADDITIONAL_PAGE_MYSQL_ODBC	    7
106 #define ADDITIONAL_PAGE_ORACLE_JDBC     8
107 #define ADDITIONAL_PAGE_ADO             9
108 #define ADDITIONAL_PAGE_ODBC           10
109 #define ADDITIONAL_USERDEFINED         11
110 #define ADDITIONAL_PAGE_MYSQL_NATIVE   12
111 
112 
DBG_NAME(ODbTypeWizDialog)113 DBG_NAME(ODbTypeWizDialog)
114 //=========================================================================
115 //= ODbTypeWizDialog
116 //=========================================================================
117 //-------------------------------------------------------------------------
118 ODbTypeWizDialog::ODbTypeWizDialog(Window* _pParent
119 							   ,SfxItemSet* _pItems
120 							   ,const Reference< XMultiServiceFactory >& _rxORB
121 							   ,const ::com::sun::star::uno::Any& _aDataSourceName
122 							   )
123 	:OWizardMachine(_pParent, ModuleRes(DLG_DATABASE_TYPE_CHANGE), WZB_NEXT | WZB_PREVIOUS | WZB_FINISH | WZB_CANCEL | WZB_HELP )
124 	,m_pOutSet(NULL)
125 	,m_bResetting(sal_False)
126 	,m_bApplied(sal_False)
127 	,m_bUIEnabled( sal_True )
128 {
129 	DBG_CTOR(ODbTypeWizDialog,NULL);
130 	m_pImpl = ::std::auto_ptr<ODbDataSourceAdministrationHelper>(new ODbDataSourceAdministrationHelper(_rxORB,this,this));
131 	m_pImpl->setDataSourceOrName(_aDataSourceName);
132 	Reference< XPropertySet > xDatasource = m_pImpl->getCurrentDataSource();
133 	m_pOutSet = new SfxItemSet( *_pItems->GetPool(), _pItems->GetRanges() );
134 
135 	m_pImpl->translateProperties(xDatasource, *m_pOutSet);
136 	m_eType = m_pImpl->getDatasourceType(*m_pOutSet);
137 
138 	SetPageSizePixel(LogicToPixel(::Size(PAGE_X, PAGE_Y), MAP_APPFONT));
139 	ShowButtonFixedLine(sal_True);
140 	defaultButton(WZB_NEXT);
141 	enableButtons(WZB_FINISH, sal_False);
142     enableAutomaticNextButtonState( true );
143 
144     m_pPrevPage->SetHelpId(HID_DBWIZ_PREVIOUS);
145 	m_pNextPage->SetHelpId(HID_DBWIZ_NEXT);
146 	m_pCancel->SetHelpId(HID_DBWIZ_CANCEL);
147 	m_pFinish->SetHelpId(HID_DBWIZ_FINISH);
148 	m_pHelp->SetUniqueId(UID_DBWIZ_HELP);
149 	// no local resources needed anymore
150 
151     DbuTypeCollectionItem* pCollectionItem = PTR_CAST(DbuTypeCollectionItem, _pItems->GetItem(DSID_TYPECOLLECTION));
152 	m_pCollection = pCollectionItem->getCollection();
153 
154 	FreeResource();
155 	ActivatePage();
156 }
157 
158 //-------------------------------------------------------------------------
~ODbTypeWizDialog()159 ODbTypeWizDialog::~ODbTypeWizDialog()
160 {
161 	DBG_DTOR(ODbTypeWizDialog,NULL);
162 	delete m_pOutSet;
163 }
164 //-------------------------------------------------------------------------
IMPL_LINK(ODbTypeWizDialog,OnTypeSelected,OGeneralPage *,_pTabPage)165 IMPL_LINK(ODbTypeWizDialog, OnTypeSelected, OGeneralPage*, _pTabPage)
166 {
167     m_eType = _pTabPage->GetSelectedType();
168     const bool bURLRequired = m_pCollection->isConnectionUrlRequired(m_eType);
169     enableButtons(WZB_NEXT,bURLRequired);
170 	enableButtons(WZB_FINISH,!bURLRequired);
171 	return 1L;
172 }
173 //-------------------------------------------------------------------------
determineNextState(WizardState _nCurrentState) const174 WizardTypes::WizardState ODbTypeWizDialog::determineNextState( WizardState _nCurrentState ) const
175 {
176 	WizardTypes::WizardState nNextState = WZS_INVALID_STATE;
177 	switch(_nCurrentState)
178 	{
179 		case START_PAGE:
180             switch(m_pCollection->determineType(m_eType))
181 			{
182 				case  ::dbaccess::DST_MOZILLA:
183 				case  ::dbaccess::DST_OUTLOOK:
184 				case  ::dbaccess::DST_OUTLOOKEXP:
185 				case  ::dbaccess::DST_EVOLUTION:
186 				case  ::dbaccess::DST_EVOLUTION_GROUPWISE:
187 				case  ::dbaccess::DST_EVOLUTION_LDAP:
188 				case  ::dbaccess::DST_KAB:
189 				case  ::dbaccess::DST_MACAB:
190 					nNextState = WZS_INVALID_STATE;
191 					break;
192 				case  ::dbaccess::DST_MYSQL_NATIVE:
193                     nNextState = ADDITIONAL_PAGE_MYSQL_NATIVE;
194                     break;
195                 default:
196 			        nNextState = CONNECTION_PAGE;
197                     break;
198             }
199 			break;
200 		case CONNECTION_PAGE:
201 			switch(m_pCollection->determineType(m_eType))
202 			{
203                 case  ::dbaccess::DST_MOZILLA:
204                 case  ::dbaccess::DST_THUNDERBIRD:
205 				case  ::dbaccess::DST_OUTLOOK:
206 				case  ::dbaccess::DST_OUTLOOKEXP:
207 				case  ::dbaccess::DST_EVOLUTION:
208 				case  ::dbaccess::DST_EVOLUTION_GROUPWISE:
209 				case  ::dbaccess::DST_EVOLUTION_LDAP:
210 				case  ::dbaccess::DST_KAB:
211 				case  ::dbaccess::DST_MACAB:
212 				case  ::dbaccess::DST_MSACCESS:
213                 case  ::dbaccess::DST_MSACCESS_2007:
214 				case  ::dbaccess::DST_JDBC:
215 				case  ::dbaccess::DST_CALC:
216 					nNextState = WZS_INVALID_STATE;
217 					break;
218                 case  ::dbaccess::DST_DBASE:
219                     nNextState = ADDITIONAL_PAGE_DBASE;
220                     break;
221                 case  ::dbaccess::DST_FLAT:
222                     nNextState = ADDITIONAL_PAGE_FLAT;
223                     break;
224                 case  ::dbaccess::DST_LDAP:
225                     nNextState = ADDITIONAL_PAGE_LDAP;
226                     break;
227                 case  ::dbaccess::DST_ADABAS:
228                     nNextState = ADDITIONAL_PAGE_ADABAS;
229                     break;
230                 case  ::dbaccess::DST_MYSQL_JDBC:
231                     nNextState = ADDITIONAL_PAGE_MYSQL_JDBC;
232                     break;
233                 case  ::dbaccess::DST_MYSQL_ODBC:
234                     nNextState = ADDITIONAL_PAGE_MYSQL_ODBC;
235                     break;
236                 case  ::dbaccess::DST_ORACLE_JDBC:
237                     nNextState = ADDITIONAL_PAGE_ORACLE_JDBC;
238                     break;
239                 case  ::dbaccess::DST_ADO:
240                     nNextState = ADDITIONAL_PAGE_ADO;
241                     break;
242                 case  ::dbaccess::DST_ODBC:
243                     nNextState = ADDITIONAL_PAGE_ODBC;
244                     break;
245 				default:
246 					nNextState = WZS_INVALID_STATE;
247 					break;
248 			}
249 			break;
250 	}
251 
252 	return nNextState;
253 }
254 
255 // -----------------------------------------------------------------------------
getOutputSet() const256 const SfxItemSet* ODbTypeWizDialog::getOutputSet() const
257 {
258 	return m_pOutSet;
259 }
260 // -----------------------------------------------------------------------------
getWriteOutputSet()261 SfxItemSet* ODbTypeWizDialog::getWriteOutputSet()
262 {
263 	return m_pOutSet;
264 }
265 // -----------------------------------------------------------------------------
createConnection()266 ::std::pair< Reference<XConnection>,sal_Bool> ODbTypeWizDialog::createConnection()
267 {
268 	return m_pImpl->createConnection();
269 }
270 // -----------------------------------------------------------------------------
getORB() const271 Reference< XMultiServiceFactory > ODbTypeWizDialog::getORB() const
272 {
273 	return m_pImpl->getORB();
274 }
275 // -----------------------------------------------------------------------------
getDriver()276 Reference< XDriver > ODbTypeWizDialog::getDriver()
277 {
278 	return m_pImpl->getDriver();
279 }
280 // -----------------------------------------------------------------------------
getDatasourceType(const SfxItemSet & _rSet) const281 ::rtl::OUString	ODbTypeWizDialog::getDatasourceType(const SfxItemSet& _rSet) const
282 {
283 	return m_pImpl->getDatasourceType(_rSet);
284 }
285 // -----------------------------------------------------------------------------
clearPassword()286 void ODbTypeWizDialog::clearPassword()
287 {
288 	m_pImpl->clearPassword();
289 }
290 
291 // -----------------------------------------------------------------------------
createPage(WizardState _nState)292 TabPage* ODbTypeWizDialog::createPage(WizardState _nState)
293 {
294 	sal_uInt16 nStringId = STR_PAGETITLE_ADVANCED;
295 	TabPage* pPage = NULL;
296 	switch(_nState)
297 	{
298 		case START_PAGE: // start state
299         {
300 			pPage = OGeneralPage::Create(this,*m_pOutSet);
301             OGeneralPage* pGeneralPage = static_cast< OGeneralPage* >( pPage );
302 			pGeneralPage->SetTypeSelectHandler( LINK( this, ODbTypeWizDialog, OnTypeSelected));
303 //            pGeneralPage->SetCreationModeHandler( LINK( this, ODbTypeWizDialog, TODO ) );
304 			nStringId = STR_PAGETITLE_GENERAL;
305         }
306 		break;
307 		case CONNECTION_PAGE:
308 			pPage = OConnectionTabPage::Create(this,*m_pOutSet);
309 			nStringId = STR_PAGETITLE_CONNECTION;
310 			break;
311 
312         case ADDITIONAL_PAGE_DBASE:
313 			pPage = ODriversSettings::CreateDbase(this,*m_pOutSet);
314             break;
315         case ADDITIONAL_PAGE_FLAT:
316 			pPage = ODriversSettings::CreateText(this,*m_pOutSet);
317             break;
318         case ADDITIONAL_PAGE_LDAP:
319 			pPage = ODriversSettings::CreateLDAP(this,*m_pOutSet);
320             break;
321         case ADDITIONAL_PAGE_ADABAS:
322             pPage = ODriversSettings::CreateAdabas(this,*m_pOutSet);
323             break;
324         case ADDITIONAL_PAGE_MYSQL_JDBC:
325             pPage = ODriversSettings::CreateMySQLJDBC(this,*m_pOutSet);
326             break;
327         case ADDITIONAL_PAGE_MYSQL_NATIVE:
328             pPage = ODriversSettings::CreateMySQLNATIVE(this,*m_pOutSet);
329             break;
330         case ADDITIONAL_PAGE_MYSQL_ODBC:
331             pPage = ODriversSettings::CreateMySQLODBC(this,*m_pOutSet);
332             break;
333         case ADDITIONAL_PAGE_ORACLE_JDBC:
334             pPage = ODriversSettings::CreateOracleJDBC(this,*m_pOutSet);
335             break;
336         case ADDITIONAL_PAGE_ADO:
337 			pPage = ODriversSettings::CreateAdo(this,*m_pOutSet);
338             break;
339         case ADDITIONAL_PAGE_ODBC:
340 			pPage = ODriversSettings::CreateODBC(this,*m_pOutSet);
341             break;
342         case ADDITIONAL_USERDEFINED:
343 			pPage = ODriversSettings::CreateUser(this,*m_pOutSet);
344 			break;
345 		default:
346 			OSL_ENSURE(0,"Wrong state!");
347 			break;
348 	}
349 
350 	// register ourself as modified listener
351 	if ( pPage )
352 	{
353 		static_cast<OGenericAdministrationPage*>(pPage)->SetServiceFactory(m_pImpl->getORB());
354 		static_cast<OGenericAdministrationPage*>(pPage)->SetAdminDialog(this,this);
355 		// open our own resource block, as the page titles are strings local to this block
356 		LocalResourceAccess aDummy(DLG_DATABASE_ADMINISTRATION, RSC_TABDIALOG);
357 
358 		pPage->SetText(String(ModuleRes(nStringId)));
359 		defaultButton( _nState == START_PAGE ? WZB_NEXT : WZB_FINISH );
360 		enableButtons( WZB_FINISH, _nState == START_PAGE ? sal_False : sal_True);
361 		pPage->Show();
362 	}
363 	return pPage;
364 }
365 // -----------------------------------------------------------------------------
leaveState(WizardState _nState)366 sal_Bool ODbTypeWizDialog::leaveState(WizardState _nState)
367 {
368 	SfxTabPage* pPage = static_cast<SfxTabPage*>(WizardDialog::GetPage(_nState));
369 	if ( pPage )
370 		pPage->FillItemSet(*m_pOutSet);
371 	return sal_True;
372 }
373 // -----------------------------------------------------------------------------
setTitle(const::rtl::OUString & _sTitle)374 void ODbTypeWizDialog::setTitle(const ::rtl::OUString& _sTitle)
375 {
376 	SetText(_sTitle);
377 }
378 //-------------------------------------------------------------------------
enableConfirmSettings(bool _bEnable)379 void ODbTypeWizDialog::enableConfirmSettings( bool _bEnable )
380 {
381     enableButtons( WZB_FINISH, _bEnable );
382     // TODO:
383     // this is hacky. At the moment, this method is used in only one case (#b6532894#).
384     // As soon as it is to be used more wide-spread, we should find a proper concept
385     // for enabling both the Next and Finish buttons, depending on the current page state.
386     // Plus, the concept must also care for the case where those pages are embedded into
387     // anormal tab dialog.
388 }
389 //-------------------------------------------------------------------------
saveDatasource()390 sal_Bool ODbTypeWizDialog::saveDatasource()
391 {
392 	SfxTabPage* pPage = static_cast<SfxTabPage*>(WizardDialog::GetPage(getCurrentState()));
393 	if ( pPage )
394 		pPage->FillItemSet(*m_pOutSet);
395 
396     DataSourceInfoConverter aConverter(getORB());
397     ::rtl::OUString sOldURL;
398     if ( m_pImpl->getCurrentDataSource().is() )
399         m_pImpl->getCurrentDataSource()->getPropertyValue(PROPERTY_URL) >>= sOldURL;
400     aConverter.convert(m_pCollection,sOldURL,m_eType,m_pImpl->getCurrentDataSource());
401 	return sal_True;
402 }
403 // -----------------------------------------------------------------------------
getPageController(TabPage * _pCurrentPage) const404 IWizardPageController* ODbTypeWizDialog::getPageController( TabPage* _pCurrentPage ) const
405 {
406 	OGenericAdministrationPage* pPage = static_cast<OGenericAdministrationPage*>(_pCurrentPage);
407 	return pPage;
408 }
409 // -----------------------------------------------------------------------------
onFinish()410 sal_Bool ODbTypeWizDialog::onFinish()
411 {
412 	saveDatasource();
413 	return m_pImpl->saveChanges(*m_pOutSet) ? OWizardMachine::onFinish() : sal_False;
414 }
415 //.........................................................................
416 }	// namespace dbaui
417 //.........................................................................
418