1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <core_resource.hxx>
22 #include <strings.hrc>
23 #include <strings.hxx>
24 #include <dsitems.hxx>
25 #include "dsnItem.hxx"
26 #include "adminpages.hxx"
27 #include "generalpage.hxx"
28 #include <unotools/confignode.hxx>
29 #include "ConnectionPage.hxx"
30 #include "DriverSettings.hxx"
31 #include "DbAdminImpl.hxx"
36 using namespace com::sun::star::uno
;
37 using namespace com::sun::star::sdbc
;
38 using namespace com::sun::star::lang
;
39 using namespace com::sun::star::util
;
40 using namespace com::sun::star::beans
;
41 using namespace com::sun::star::container
;
44 #define CONNECTION_PAGE 1
45 #define ADDITIONAL_PAGE_DBASE 2
46 #define ADDITIONAL_PAGE_FLAT 3
47 #define ADDITIONAL_PAGE_LDAP 4
48 //5 was ADDITIONAL_PAGE_ADABAS
49 #define ADDITIONAL_PAGE_MYSQL_JDBC 6
50 #define ADDITIONAL_PAGE_MYSQL_ODBC 7
51 #define ADDITIONAL_PAGE_ORACLE_JDBC 8
52 #define ADDITIONAL_PAGE_ADO 9
53 #define ADDITIONAL_PAGE_ODBC 10
54 #define ADDITIONAL_USERDEFINED 11
55 #define ADDITIONAL_PAGE_MYSQL_NATIVE 12
58 ODbTypeWizDialog::ODbTypeWizDialog(weld::Window
* _pParent
, SfxItemSet
const * _pItems
,
59 const Reference
< XComponentContext
>& _rxORB
, const css::uno::Any
& _aDataSourceName
)
60 : WizardMachine(_pParent
, WizardButtonFlags::NEXT
| WizardButtonFlags::PREVIOUS
| WizardButtonFlags::FINISH
| WizardButtonFlags::CANCEL
| WizardButtonFlags::HELP
)
62 m_pImpl
.reset(new ODbDataSourceAdministrationHelper(_rxORB
, m_xAssistant
.get(), _pParent
, this));
63 m_pImpl
->setDataSourceOrName(_aDataSourceName
);
64 Reference
< XPropertySet
> xDatasource
= m_pImpl
->getCurrentDataSource();
65 m_pOutSet
.reset(new SfxItemSet( *_pItems
->GetPool(), _pItems
->GetRanges() ));
67 m_pImpl
->translateProperties(xDatasource
, *m_pOutSet
);
68 m_eType
= dbaui::ODbDataSourceAdministrationHelper::getDatasourceType(*m_pOutSet
);
70 defaultButton(WizardButtonFlags::NEXT
);
71 enableButtons(WizardButtonFlags::FINISH
, false);
72 enableAutomaticNextButtonState();
74 m_xPrevPage
->set_help_id(HID_DBWIZ_PREVIOUS
);
75 m_xNextPage
->set_help_id(HID_DBWIZ_NEXT
);
76 m_xCancel
->set_help_id(HID_DBWIZ_CANCEL
);
77 m_xFinish
->set_help_id(HID_DBWIZ_FINISH
);
78 // no local resources needed anymore
80 const DbuTypeCollectionItem
* pCollectionItem
= dynamic_cast<const DbuTypeCollectionItem
*>(_pItems
->GetItem(DSID_TYPECOLLECTION
));
81 assert(pCollectionItem
&& "must exist");
82 m_pCollection
= pCollectionItem
->getCollection();
85 setTitleBase(DBA_RES(STR_DATABASE_TYPE_CHANGE
));
87 m_xAssistant
->set_current_page(0);
90 ODbTypeWizDialog::~ODbTypeWizDialog()
94 IMPL_LINK(ODbTypeWizDialog
, OnTypeSelected
, OGeneralPage
&, _rTabPage
, void)
96 m_eType
= _rTabPage
.GetSelectedType();
97 const bool bURLRequired
= m_pCollection
->isConnectionUrlRequired(m_eType
);
98 enableButtons(WizardButtonFlags::NEXT
,bURLRequired
);
99 enableButtons(WizardButtonFlags::FINISH
,!bURLRequired
);
102 WizardState
ODbTypeWizDialog::determineNextState( WizardState _nCurrentState
) const
104 WizardState nNextState
= WZS_INVALID_STATE
;
105 switch(_nCurrentState
)
108 switch(m_pCollection
->determineType(m_eType
))
110 case ::dbaccess::DST_MOZILLA
:
111 case ::dbaccess::DST_OUTLOOK
:
112 case ::dbaccess::DST_OUTLOOKEXP
:
113 case ::dbaccess::DST_EVOLUTION
:
114 case ::dbaccess::DST_EVOLUTION_GROUPWISE
:
115 case ::dbaccess::DST_EVOLUTION_LDAP
:
116 case ::dbaccess::DST_KAB
:
117 case ::dbaccess::DST_MACAB
:
118 nNextState
= WZS_INVALID_STATE
;
120 case ::dbaccess::DST_MYSQL_NATIVE
:
121 nNextState
= ADDITIONAL_PAGE_MYSQL_NATIVE
;
124 nNextState
= CONNECTION_PAGE
;
128 case CONNECTION_PAGE
:
129 switch(m_pCollection
->determineType(m_eType
))
131 case ::dbaccess::DST_MOZILLA
:
132 case ::dbaccess::DST_THUNDERBIRD
:
133 case ::dbaccess::DST_OUTLOOK
:
134 case ::dbaccess::DST_OUTLOOKEXP
:
135 case ::dbaccess::DST_EVOLUTION
:
136 case ::dbaccess::DST_EVOLUTION_GROUPWISE
:
137 case ::dbaccess::DST_EVOLUTION_LDAP
:
138 case ::dbaccess::DST_KAB
:
139 case ::dbaccess::DST_MACAB
:
140 case ::dbaccess::DST_MSACCESS
:
141 case ::dbaccess::DST_MSACCESS_2007
:
142 case ::dbaccess::DST_JDBC
:
143 case ::dbaccess::DST_CALC
:
144 case ::dbaccess::DST_WRITER
:
145 nNextState
= WZS_INVALID_STATE
;
147 case ::dbaccess::DST_DBASE
:
148 nNextState
= ADDITIONAL_PAGE_DBASE
;
150 case ::dbaccess::DST_FLAT
:
151 nNextState
= ADDITIONAL_PAGE_FLAT
;
153 case ::dbaccess::DST_LDAP
:
154 nNextState
= ADDITIONAL_PAGE_LDAP
;
156 case ::dbaccess::DST_MYSQL_JDBC
:
157 nNextState
= ADDITIONAL_PAGE_MYSQL_JDBC
;
159 case ::dbaccess::DST_MYSQL_ODBC
:
160 nNextState
= ADDITIONAL_PAGE_MYSQL_ODBC
;
162 case ::dbaccess::DST_ORACLE_JDBC
:
163 nNextState
= ADDITIONAL_PAGE_ORACLE_JDBC
;
165 case ::dbaccess::DST_ADO
:
166 nNextState
= ADDITIONAL_PAGE_ADO
;
168 case ::dbaccess::DST_ODBC
:
169 nNextState
= ADDITIONAL_PAGE_ODBC
;
172 nNextState
= WZS_INVALID_STATE
;
181 const SfxItemSet
* ODbTypeWizDialog::getOutputSet() const
183 return m_pOutSet
.get();
186 SfxItemSet
* ODbTypeWizDialog::getWriteOutputSet()
188 return m_pOutSet
.get();
191 std::pair
< Reference
<XConnection
>,bool> ODbTypeWizDialog::createConnection()
193 return m_pImpl
->createConnection();
196 Reference
< XComponentContext
> ODbTypeWizDialog::getORB() const
198 return m_pImpl
->getORB();
201 Reference
< XDriver
> ODbTypeWizDialog::getDriver()
203 return m_pImpl
->getDriver();
206 OUString
ODbTypeWizDialog::getDatasourceType(const SfxItemSet
& _rSet
) const
208 return dbaui::ODbDataSourceAdministrationHelper::getDatasourceType(_rSet
);
211 void ODbTypeWizDialog::clearPassword()
213 m_pImpl
->clearPassword();
216 std::unique_ptr
<BuilderPage
> ODbTypeWizDialog::createPage(WizardState _nState
)
218 TranslateId pStringId
= STR_PAGETITLE_ADVANCED
;
219 std::unique_ptr
<BuilderPage
> xPage
;
221 OUString
sIdent(OUString::number(_nState
));
222 weld::Container
* pPageContainer
= m_xAssistant
->append_page(sIdent
);
226 case START_PAGE
: // start state
228 xPage
= std::make_unique
<OGeneralPageDialog
>(pPageContainer
, this, *m_pOutSet
);
229 OGeneralPage
* pGeneralPage
= static_cast<OGeneralPage
*>(xPage
.get());
230 pGeneralPage
->SetTypeSelectHandler( LINK( this, ODbTypeWizDialog
, OnTypeSelected
));
231 pStringId
= STR_PAGETITLE_GENERAL
;
234 case CONNECTION_PAGE
:
235 xPage
= OConnectionTabPage::Create(pPageContainer
, this, m_pOutSet
.get());
236 pStringId
= STR_PAGETITLE_CONNECTION
;
239 case ADDITIONAL_PAGE_DBASE
:
240 xPage
= ODriversSettings::CreateDbase(pPageContainer
, this, m_pOutSet
.get());
242 case ADDITIONAL_PAGE_FLAT
:
243 xPage
= ODriversSettings::CreateText(pPageContainer
, this, m_pOutSet
.get());
245 case ADDITIONAL_PAGE_LDAP
:
246 xPage
= ODriversSettings::CreateLDAP(pPageContainer
, this, m_pOutSet
.get());
248 case ADDITIONAL_PAGE_MYSQL_JDBC
:
249 xPage
= ODriversSettings::CreateMySQLJDBC(pPageContainer
, this, m_pOutSet
.get());
251 case ADDITIONAL_PAGE_MYSQL_NATIVE
:
252 xPage
= ODriversSettings::CreateMySQLNATIVE(pPageContainer
, this, m_pOutSet
.get());
254 case ADDITIONAL_PAGE_MYSQL_ODBC
:
255 xPage
= ODriversSettings::CreateMySQLODBC(pPageContainer
, this, m_pOutSet
.get());
257 case ADDITIONAL_PAGE_ORACLE_JDBC
:
258 xPage
= ODriversSettings::CreateOracleJDBC(pPageContainer
, this, m_pOutSet
.get());
260 case ADDITIONAL_PAGE_ADO
:
261 xPage
= ODriversSettings::CreateAdo(pPageContainer
, this, m_pOutSet
.get());
263 case ADDITIONAL_PAGE_ODBC
:
264 xPage
= ODriversSettings::CreateODBC(pPageContainer
, this, m_pOutSet
.get());
266 case ADDITIONAL_USERDEFINED
:
267 xPage
= ODriversSettings::CreateUser(pPageContainer
, this, m_pOutSet
.get());
270 OSL_FAIL("Wrong state!");
274 // register ourself as modified listener
277 static_cast<OGenericAdministrationPage
*>(xPage
.get())->SetServiceFactory( m_pImpl
->getORB() );
278 static_cast<OGenericAdministrationPage
*>(xPage
.get())->SetAdminDialog(this,this);
279 m_xAssistant
->set_page_title(sIdent
, DBA_RES(pStringId
));
280 defaultButton( _nState
== START_PAGE
? WizardButtonFlags::NEXT
: WizardButtonFlags::FINISH
);
281 enableButtons( WizardButtonFlags::FINISH
, _nState
!= START_PAGE
);
286 bool ODbTypeWizDialog::leaveState(WizardState _nState
)
288 SfxTabPage
* pPage
= static_cast<SfxTabPage
*>(WizardMachine::GetPage(_nState
));
290 pPage
->FillItemSet(m_pOutSet
.get());
294 void ODbTypeWizDialog::setTitle(const OUString
& _sTitle
)
296 m_xAssistant
->set_title(_sTitle
);
299 void ODbTypeWizDialog::enableConfirmSettings( bool _bEnable
)
301 enableButtons( WizardButtonFlags::FINISH
, _bEnable
);
303 // this is hacky. At the moment, this method is used in only one case.
304 // As soon as it is to be used more wide-spread, we should find a proper concept
305 // for enabling both the Next and Finish buttons, depending on the current page state.
306 // Plus, the concept must also care for the case where those pages are embedded into
307 // a normal tab dialog.
310 void ODbTypeWizDialog::saveDatasource()
312 SfxTabPage
* pPage
= static_cast<SfxTabPage
*>(WizardMachine::GetPage(getCurrentState()));
314 pPage
->FillItemSet(m_pOutSet
.get());
317 if ( m_pImpl
->getCurrentDataSource().is() )
318 m_pImpl
->getCurrentDataSource()->getPropertyValue(PROPERTY_URL
) >>= sOldURL
;
319 DataSourceInfoConverter::convert( getORB(), m_pCollection
,sOldURL
,m_eType
,m_pImpl
->getCurrentDataSource());
322 vcl::IWizardPageController
* ODbTypeWizDialog::getPageController(BuilderPage
* pCurrentPage
) const
324 OGenericAdministrationPage
* pPage
= static_cast<OGenericAdministrationPage
*>(pCurrentPage
);
328 bool ODbTypeWizDialog::onFinish()
331 return m_pImpl
->saveChanges(*m_pOutSet
) && WizardMachine::onFinish();
336 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */