xref: /AOO41X/main/dbaccess/source/ui/dlg/dbwiz.cxx (revision 96de54900b79e13b861fbc62cbf36018b54e21b7)
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_dbaccess.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