Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
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/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
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 .
18 : */
19 :
20 : #include <config_features.h>
21 : #include "detailpages.hxx"
22 : #include "sqlmessage.hxx"
23 : #include "dsmeta.hxx"
24 : #include "advancedsettings.hxx"
25 : #include "DbAdminImpl.hxx"
26 : #include "dsitems.hxx"
27 : #include "dbfindex.hxx"
28 : #include "localresaccess.hxx"
29 : #include "dsnItem.hxx"
30 :
31 : #include "dbaccess_helpid.hrc"
32 : #include "dbu_dlg.hrc"
33 : #include "dbadmin.hrc"
34 :
35 : #include <svl/itemset.hxx>
36 : #include <svl/stritem.hxx>
37 : #include <svl/eitem.hxx>
38 : #include <svl/intitem.hxx>
39 : #include <vcl/msgbox.hxx>
40 : #include <vcl/mnemonic.hxx>
41 : #include <svl/cjkoptions.hxx>
42 : #if HAVE_FEATURE_JAVA
43 : #include <jvmaccess/virtualmachine.hxx>
44 : #endif
45 : #include <connectivity/CommonTools.hxx>
46 : #include "DriverSettings.hxx"
47 : #include "dbadmin.hxx"
48 : #include <comphelper/types.hxx>
49 : #include "AutoControls.hrc"
50 :
51 : namespace dbaui
52 : {
53 :
54 : using namespace ::com::sun::star::uno;
55 : using namespace ::com::sun::star::sdbc;
56 : using namespace ::com::sun::star::beans;
57 : using namespace ::com::sun::star::lang;
58 : using namespace ::com::sun::star::container;
59 : using namespace ::dbtools;
60 :
61 : // OCommonBehaviourTabPage
62 0 : OCommonBehaviourTabPage::OCommonBehaviourTabPage(Window* pParent, sal_uInt16 nResId, const SfxItemSet& _rCoreAttrs,
63 : sal_uInt32 nControlFlags,bool _bFreeResource)
64 :
65 : :OGenericAdministrationPage(pParent, ModuleRes(nResId), _rCoreAttrs)
66 : ,m_pOptionsLabel(NULL)
67 : ,m_pOptions(NULL)
68 : ,m_pDataConvertFixedLine(NULL)
69 : ,m_pCharsetLabel(NULL)
70 : ,m_pCharset(NULL)
71 : ,m_pAutoFixedLine(NULL)
72 : ,m_pAutoRetrievingEnabled(NULL)
73 : ,m_pAutoIncrementLabel(NULL)
74 : ,m_pAutoIncrement(NULL)
75 : ,m_pAutoRetrievingLabel(NULL)
76 : ,m_pAutoRetrieving(NULL)
77 0 : ,m_nControlFlags(nControlFlags)
78 : {
79 :
80 0 : if ((m_nControlFlags & CBTP_USE_OPTIONS) == CBTP_USE_OPTIONS)
81 : {
82 0 : m_pOptionsLabel = new FixedText(this, ModuleRes(FT_OPTIONS));
83 0 : m_pOptions = new Edit(this, ModuleRes(ET_OPTIONS));
84 0 : m_pOptions->SetModifyHdl(getControlModifiedLink());
85 : }
86 :
87 0 : if ((m_nControlFlags & CBTP_USE_CHARSET) == CBTP_USE_CHARSET)
88 : {
89 0 : m_pDataConvertFixedLine = new FixedLine(this, ModuleRes(FL_DATACONVERT));
90 0 : m_pCharsetLabel = new FixedText(this, ModuleRes(FT_CHARSET));
91 0 : m_pCharset = new CharSetListBox(this, ModuleRes(LB_CHARSET));
92 0 : m_pCharset->SetSelectHdl(getControlModifiedLink());
93 : }
94 :
95 : Window* pWindows[] = { m_pAutoRetrievingEnabled, m_pAutoFixedLine,
96 : m_pAutoIncrementLabel, m_pAutoIncrement,
97 0 : m_pAutoRetrievingLabel, m_pAutoRetrieving };
98 :
99 0 : sal_Int32 nCount = sizeof(pWindows) / sizeof(pWindows[0]);
100 0 : for (sal_Int32 i=1; i < nCount; ++i)
101 : {
102 0 : if ( pWindows[i] )
103 : {
104 0 : Window* pPrev = pWindows[i-1];
105 0 : for (sal_Int32 j = i-1; pPrev == NULL && j >= 0 ; --j)
106 : {
107 0 : pPrev = pWindows[j];
108 : }
109 0 : if ( pPrev )
110 0 : pWindows[i]->SetZOrder(pPrev, WINDOW_ZORDER_BEHIND);
111 : }
112 : }
113 :
114 0 : if ( _bFreeResource )
115 0 : FreeResource();
116 0 : }
117 :
118 0 : OCommonBehaviourTabPage::~OCommonBehaviourTabPage()
119 : {
120 0 : DELETEZ(m_pOptionsLabel);
121 0 : DELETEZ(m_pOptions);
122 :
123 0 : DELETEZ(m_pDataConvertFixedLine);
124 0 : DELETEZ(m_pCharsetLabel);
125 0 : DELETEZ(m_pCharset);
126 :
127 0 : DELETEZ(m_pAutoFixedLine);
128 0 : DELETEZ(m_pAutoIncrementLabel);
129 0 : DELETEZ(m_pAutoIncrement);
130 :
131 0 : DELETEZ(m_pAutoRetrievingEnabled);
132 0 : DELETEZ(m_pAutoRetrievingLabel);
133 0 : DELETEZ(m_pAutoRetrieving);
134 :
135 0 : }
136 :
137 0 : void OCommonBehaviourTabPage::fillWindows(::std::vector< ISaveValueWrapper* >& _rControlList)
138 : {
139 0 : if ((m_nControlFlags & CBTP_USE_OPTIONS) == CBTP_USE_OPTIONS)
140 : {
141 0 : _rControlList.push_back(new ODisableWrapper<FixedText>(m_pOptionsLabel));
142 : }
143 :
144 0 : if ((m_nControlFlags & CBTP_USE_CHARSET) == CBTP_USE_CHARSET)
145 : {
146 0 : _rControlList.push_back(new ODisableWrapper<FixedLine>(m_pDataConvertFixedLine));
147 0 : _rControlList.push_back(new ODisableWrapper<FixedText>(m_pCharsetLabel));
148 : }
149 0 : }
150 0 : void OCommonBehaviourTabPage::fillControls(::std::vector< ISaveValueWrapper* >& _rControlList)
151 : {
152 0 : if ((m_nControlFlags & CBTP_USE_OPTIONS) == CBTP_USE_OPTIONS)
153 0 : _rControlList.push_back(new OSaveValueWrapper<Edit>(m_pOptions));
154 :
155 0 : if ((m_nControlFlags & CBTP_USE_CHARSET) == CBTP_USE_CHARSET)
156 0 : _rControlList.push_back(new OSaveValueWrapper<ListBox>(m_pCharset));
157 0 : }
158 :
159 0 : void OCommonBehaviourTabPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
160 : {
161 : // check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
162 : sal_Bool bValid, bReadonly;
163 0 : getFlags(_rSet, bValid, bReadonly);
164 :
165 : // collect the items
166 0 : SFX_ITEMSET_GET(_rSet, pOptionsItem, SfxStringItem, DSID_ADDITIONALOPTIONS, true);
167 0 : SFX_ITEMSET_GET(_rSet, pCharsetItem, SfxStringItem, DSID_CHARSET, true);
168 :
169 : // forward the values to the controls
170 0 : if (bValid)
171 : {
172 0 : if ((m_nControlFlags & CBTP_USE_OPTIONS) == CBTP_USE_OPTIONS)
173 : {
174 0 : m_pOptions->SetText(pOptionsItem->GetValue());
175 0 : m_pOptions->ClearModifyFlag();
176 : }
177 :
178 0 : if ((m_nControlFlags & CBTP_USE_CHARSET) == CBTP_USE_CHARSET)
179 : {
180 0 : m_pCharset->SelectEntryByIanaName( pCharsetItem->GetValue() );
181 : }
182 : }
183 0 : OGenericAdministrationPage::implInitControls(_rSet, _bSaveValue);
184 0 : }
185 :
186 0 : bool OCommonBehaviourTabPage::FillItemSet(SfxItemSet& _rSet)
187 : {
188 0 : sal_Bool bChangedSomething = sal_False;
189 :
190 0 : if ((m_nControlFlags & CBTP_USE_OPTIONS) == CBTP_USE_OPTIONS)
191 : {
192 0 : fillString(_rSet,m_pOptions,DSID_ADDITIONALOPTIONS,bChangedSomething);
193 : }
194 :
195 0 : if ((m_nControlFlags & CBTP_USE_CHARSET) == CBTP_USE_CHARSET)
196 : {
197 0 : if ( m_pCharset->StoreSelectedCharSet( _rSet, DSID_CHARSET ) )
198 0 : bChangedSomething = sal_True;
199 : }
200 :
201 0 : return bChangedSomething;
202 : }
203 :
204 : // ODbaseDetailsPage
205 0 : ODbaseDetailsPage::ODbaseDetailsPage( Window* pParent, const SfxItemSet& _rCoreAttrs )
206 : :OCommonBehaviourTabPage(pParent, PAGE_DBASE, _rCoreAttrs, CBTP_USE_CHARSET ,false)
207 : ,m_aShowDeleted (this, ModuleRes(CB_SHOWDELETEDROWS))
208 : ,m_aFL_1 (this, ModuleRes( FL_SEPARATOR1) )
209 : ,m_aFT_Message (this, ModuleRes( FT_SPECIAL_MESSAGE) )
210 0 : ,m_aIndexes (this, ModuleRes(PB_INDICIES))
211 : {
212 :
213 0 : m_aIndexes.SetClickHdl(LINK(this, ODbaseDetailsPage, OnButtonClicked));
214 0 : m_aShowDeleted.SetClickHdl(LINK(this, ODbaseDetailsPage, OnButtonClicked));
215 :
216 : // correct the z-order which is mixed-up because the base class constructed some controls before we did
217 0 : m_pCharset->SetZOrder(&m_aShowDeleted, WINDOW_ZORDER_BEFOR);
218 :
219 0 : FreeResource();
220 0 : }
221 :
222 0 : ODbaseDetailsPage::~ODbaseDetailsPage()
223 : {
224 :
225 0 : }
226 :
227 0 : SfxTabPage* ODriversSettings::CreateDbase( Window* pParent, const SfxItemSet& _rAttrSet )
228 : {
229 0 : return ( new ODbaseDetailsPage( pParent, _rAttrSet ) );
230 : }
231 :
232 0 : void ODbaseDetailsPage::fillControls(::std::vector< ISaveValueWrapper* >& _rControlList)
233 : {
234 0 : OCommonBehaviourTabPage::fillControls(_rControlList);
235 0 : _rControlList.push_back(new OSaveValueWrapper<CheckBox>(&m_aShowDeleted));
236 0 : }
237 0 : void ODbaseDetailsPage::fillWindows(::std::vector< ISaveValueWrapper* >& _rControlList)
238 : {
239 0 : OCommonBehaviourTabPage::fillWindows(_rControlList);
240 0 : _rControlList.push_back(new ODisableWrapper<FixedLine>(&m_aFL_1));
241 0 : _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aFT_Message));
242 0 : _rControlList.push_back(new ODisableWrapper<PushButton>(&m_aIndexes));
243 0 : }
244 0 : void ODbaseDetailsPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
245 : {
246 : // check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
247 : sal_Bool bValid, bReadonly;
248 0 : getFlags(_rSet, bValid, bReadonly);
249 :
250 : // get the DSN string (needed for the index dialog)
251 0 : SFX_ITEMSET_GET(_rSet, pUrlItem, SfxStringItem, DSID_CONNECTURL, true);
252 0 : SFX_ITEMSET_GET(_rSet, pTypesItem, DbuTypeCollectionItem, DSID_TYPECOLLECTION, true);
253 0 : ::dbaccess::ODsnTypeCollection* pTypeCollection = pTypesItem ? pTypesItem->getCollection() : NULL;
254 0 : if (pTypeCollection && pUrlItem && pUrlItem->GetValue().getLength())
255 0 : m_sDsn = pTypeCollection->cutPrefix(pUrlItem->GetValue());
256 :
257 : // get the other relevant items
258 0 : SFX_ITEMSET_GET(_rSet, pDeletedItem, SfxBoolItem, DSID_SHOWDELETEDROWS, true);
259 :
260 0 : if ( bValid )
261 : {
262 0 : m_aShowDeleted.Check( pDeletedItem->GetValue() );
263 0 : m_aFT_Message.Show(m_aShowDeleted.IsChecked());
264 : }
265 :
266 0 : OCommonBehaviourTabPage::implInitControls(_rSet, _bSaveValue);
267 0 : }
268 :
269 0 : bool ODbaseDetailsPage::FillItemSet( SfxItemSet& _rSet )
270 : {
271 0 : sal_Bool bChangedSomething = OCommonBehaviourTabPage::FillItemSet(_rSet);
272 :
273 0 : fillBool(_rSet,&m_aShowDeleted,DSID_SHOWDELETEDROWS,bChangedSomething);
274 0 : return bChangedSomething;
275 : }
276 :
277 0 : IMPL_LINK( ODbaseDetailsPage, OnButtonClicked, Button*, pButton )
278 : {
279 0 : if (&m_aIndexes == pButton)
280 : {
281 0 : ODbaseIndexDialog aIndexDialog(this, m_sDsn);
282 0 : aIndexDialog.Execute();
283 : }
284 : else
285 : {
286 0 : m_aFT_Message.Show(m_aShowDeleted.IsChecked());
287 : // it was one of the checkboxes -> we count as modified from now on
288 0 : callModifiedHdl();
289 : }
290 :
291 0 : return 0;
292 : }
293 :
294 : // OAdoDetailsPage
295 0 : OAdoDetailsPage::OAdoDetailsPage( Window* pParent, const SfxItemSet& _rCoreAttrs )
296 0 : :OCommonBehaviourTabPage(pParent, PAGE_ADO, _rCoreAttrs, CBTP_USE_CHARSET )
297 : {
298 :
299 0 : }
300 :
301 0 : OAdoDetailsPage::~OAdoDetailsPage()
302 : {
303 :
304 0 : }
305 0 : SfxTabPage* ODriversSettings::CreateAdo( Window* pParent, const SfxItemSet& _rAttrSet )
306 : {
307 0 : return ( new OAdoDetailsPage( pParent, _rAttrSet ) );
308 : }
309 :
310 : // OOdbcDetailsPage
311 0 : OOdbcDetailsPage::OOdbcDetailsPage( Window* pParent, const SfxItemSet& _rCoreAttrs )
312 : :OCommonBehaviourTabPage(pParent, PAGE_ODBC, _rCoreAttrs, CBTP_USE_CHARSET | CBTP_USE_OPTIONS,false)
313 : ,m_aFL_1 (this, ModuleRes(FL_SEPARATOR1))
314 0 : ,m_aUseCatalog (this, ModuleRes(CB_USECATALOG))
315 : {
316 0 : m_aUseCatalog.SetToggleHdl(getControlModifiedLink());
317 0 : FreeResource();
318 :
319 : Window* pWindows[] = { m_pCharsetLabel, m_pCharset
320 : ,m_pOptionsLabel,m_pOptions,&m_aUseCatalog
321 0 : };
322 :
323 0 : sal_Int32 nCount = sizeof(pWindows) / sizeof(pWindows[0]);
324 0 : for (sal_Int32 i=1; i < nCount; ++i)
325 0 : pWindows[i]->SetZOrder(pWindows[i-1], WINDOW_ZORDER_BEHIND);
326 0 : }
327 :
328 0 : SfxTabPage* ODriversSettings::CreateODBC( Window* pParent, const SfxItemSet& _rAttrSet )
329 : {
330 0 : return ( new OOdbcDetailsPage( pParent, _rAttrSet ) );
331 : }
332 :
333 0 : bool OOdbcDetailsPage::FillItemSet( SfxItemSet& _rSet )
334 : {
335 0 : sal_Bool bChangedSomething = OCommonBehaviourTabPage::FillItemSet(_rSet);
336 0 : fillBool(_rSet,&m_aUseCatalog,DSID_USECATALOG,bChangedSomething);
337 0 : return bChangedSomething;
338 : }
339 0 : void OOdbcDetailsPage::fillControls(::std::vector< ISaveValueWrapper* >& _rControlList)
340 : {
341 0 : OCommonBehaviourTabPage::fillControls(_rControlList);
342 0 : _rControlList.push_back(new OSaveValueWrapper<CheckBox>(&m_aUseCatalog));
343 0 : }
344 0 : void OOdbcDetailsPage::fillWindows(::std::vector< ISaveValueWrapper* >& _rControlList)
345 : {
346 0 : OCommonBehaviourTabPage::fillWindows(_rControlList);
347 0 : _rControlList.push_back(new ODisableWrapper<FixedLine>(&m_aFL_1));
348 0 : }
349 0 : void OOdbcDetailsPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
350 : {
351 : // check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
352 : sal_Bool bValid, bReadonly;
353 0 : getFlags(_rSet, bValid, bReadonly);
354 :
355 0 : SFX_ITEMSET_GET(_rSet, pUseCatalogItem, SfxBoolItem, DSID_USECATALOG, true);
356 :
357 0 : if ( bValid )
358 0 : m_aUseCatalog.Check(pUseCatalogItem->GetValue());
359 :
360 0 : OCommonBehaviourTabPage::implInitControls(_rSet, _bSaveValue);
361 0 : }
362 : // OOdbcDetailsPage
363 0 : OUserDriverDetailsPage::OUserDriverDetailsPage( Window* pParent, const SfxItemSet& _rCoreAttrs )
364 : :OCommonBehaviourTabPage(pParent, PAGE_USERDRIVER, _rCoreAttrs,
365 : CBTP_USE_CHARSET | CBTP_USE_OPTIONS ,false)
366 : ,m_aFTHostname (this, ModuleRes(FT_HOSTNAME))
367 : ,m_aEDHostname (this, ModuleRes(ET_HOSTNAME))
368 : ,m_aPortNumber (this, ModuleRes(FT_PORTNUMBER))
369 : ,m_aNFPortNumber (this, ModuleRes(NF_PORTNUMBER))
370 0 : ,m_aUseCatalog (this, ModuleRes(CB_USECATALOG))
371 : {
372 0 : m_aUseCatalog.SetToggleHdl(getControlModifiedLink());
373 0 : FreeResource();
374 0 : }
375 :
376 0 : SfxTabPage* ODriversSettings::CreateUser( Window* pParent, const SfxItemSet& _rAttrSet )
377 : {
378 0 : return ( new OUserDriverDetailsPage( pParent, _rAttrSet ) );
379 : }
380 :
381 0 : bool OUserDriverDetailsPage::FillItemSet( SfxItemSet& _rSet )
382 : {
383 0 : sal_Bool bChangedSomething = OCommonBehaviourTabPage::FillItemSet(_rSet);
384 :
385 0 : fillInt32(_rSet,&m_aNFPortNumber,DSID_CONN_PORTNUMBER,bChangedSomething);
386 0 : fillString(_rSet,&m_aEDHostname,DSID_CONN_HOSTNAME,bChangedSomething);
387 0 : fillBool(_rSet,&m_aUseCatalog,DSID_USECATALOG,bChangedSomething);
388 :
389 0 : return bChangedSomething;
390 : }
391 0 : void OUserDriverDetailsPage::fillControls(::std::vector< ISaveValueWrapper* >& _rControlList)
392 : {
393 0 : OCommonBehaviourTabPage::fillControls(_rControlList);
394 0 : _rControlList.push_back(new OSaveValueWrapper<Edit>(&m_aEDHostname));
395 0 : _rControlList.push_back(new OSaveValueWrapper<CheckBox>(&m_aUseCatalog));
396 0 : _rControlList.push_back(new OSaveValueWrapper<NumericField>(&m_aNFPortNumber));
397 0 : }
398 0 : void OUserDriverDetailsPage::fillWindows(::std::vector< ISaveValueWrapper* >& _rControlList)
399 : {
400 0 : OCommonBehaviourTabPage::fillWindows(_rControlList);
401 0 : _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aFTHostname));
402 0 : _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aPortNumber));
403 0 : }
404 0 : void OUserDriverDetailsPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
405 : {
406 : // check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
407 : sal_Bool bValid, bReadonly;
408 0 : getFlags(_rSet, bValid, bReadonly);
409 :
410 0 : SFX_ITEMSET_GET(_rSet, pUseCatalogItem, SfxBoolItem, DSID_USECATALOG, true);
411 0 : SFX_ITEMSET_GET(_rSet, pHostName, SfxStringItem, DSID_CONN_HOSTNAME, true);
412 0 : SFX_ITEMSET_GET(_rSet, pPortNumber, SfxInt32Item, DSID_CONN_PORTNUMBER, true);
413 :
414 0 : if ( bValid )
415 : {
416 0 : m_aEDHostname.SetText(pHostName->GetValue());
417 0 : m_aEDHostname.ClearModifyFlag();
418 :
419 0 : m_aNFPortNumber.SetValue(pPortNumber->GetValue());
420 0 : m_aNFPortNumber.ClearModifyFlag();
421 :
422 0 : m_aUseCatalog.Check(pUseCatalogItem->GetValue());
423 : }
424 :
425 0 : OCommonBehaviourTabPage::implInitControls(_rSet, _bSaveValue);
426 0 : }
427 : // OMySQLODBCDetailsPage
428 0 : OMySQLODBCDetailsPage::OMySQLODBCDetailsPage( Window* pParent, const SfxItemSet& _rCoreAttrs )
429 0 : :OCommonBehaviourTabPage(pParent, PAGE_MYSQL_ODBC, _rCoreAttrs, CBTP_USE_CHARSET )
430 : {
431 0 : }
432 :
433 0 : SfxTabPage* ODriversSettings::CreateMySQLODBC( Window* pParent, const SfxItemSet& _rAttrSet )
434 : {
435 0 : return ( new OMySQLODBCDetailsPage( pParent, _rAttrSet ) );
436 : }
437 :
438 : // OMySQLJDBCDetailsPage
439 0 : OGeneralSpecialJDBCDetailsPage::OGeneralSpecialJDBCDetailsPage( Window* pParent,sal_uInt16 _nResId, const SfxItemSet& _rCoreAttrs ,sal_uInt16 _nPortId)
440 : :OCommonBehaviourTabPage(pParent, _nResId, _rCoreAttrs, CBTP_USE_CHARSET ,false)
441 : ,m_aFL_1 (this, ModuleRes( FL_SEPARATOR1) )
442 : ,m_aFTHostname (this, ModuleRes(FT_HOSTNAME))
443 : ,m_aEDHostname (this, ModuleRes(ET_HOSTNAME))
444 : ,m_aPortNumber (this, ModuleRes(FT_PORTNUMBER))
445 : ,m_aNFPortNumber (this, ModuleRes(NF_PORTNUMBER))
446 : ,m_aFTSocket (this, ModuleRes(FT_SOCKET))
447 : ,m_aEDSocket (this, ModuleRes(ET_SOCKET))
448 : ,m_aFTDriverClass (this, ModuleRes(FT_JDBCDRIVERCLASS))
449 : ,m_aEDDriverClass (this, ModuleRes(ET_JDBCDRIVERCLASS))
450 : ,m_aTestJavaDriver (this, ModuleRes(PB_TESTDRIVERCLASS))
451 : ,m_nPortId(_nPortId)
452 0 : ,m_bUseClass(true)
453 : {
454 0 : SFX_ITEMSET_GET(_rCoreAttrs, pUrlItem, SfxStringItem, DSID_CONNECTURL, true);
455 0 : SFX_ITEMSET_GET(_rCoreAttrs, pTypesItem, DbuTypeCollectionItem, DSID_TYPECOLLECTION, true);
456 0 : ::dbaccess::ODsnTypeCollection* pTypeCollection = pTypesItem ? pTypesItem->getCollection() : NULL;
457 0 : if (pTypeCollection && pUrlItem && pUrlItem->GetValue().getLength() )
458 : {
459 0 : m_sDefaultJdbcDriverName = pTypeCollection->getJavaDriverClass(pUrlItem->GetValue());
460 : }
461 0 : if ( m_sDefaultJdbcDriverName.getLength() )
462 : {
463 0 : m_aEDDriverClass.SetModifyHdl(getControlModifiedLink());
464 0 : m_aEDDriverClass.SetModifyHdl(LINK(this, OGeneralSpecialJDBCDetailsPage, OnEditModified));
465 0 : m_aTestJavaDriver.SetClickHdl(LINK(this,OGeneralSpecialJDBCDetailsPage,OnTestJavaClickHdl));
466 : }
467 : else
468 : {
469 0 : m_bUseClass = false;
470 0 : m_aFTDriverClass.Show(false);
471 0 : m_aEDDriverClass.Show(false);
472 0 : m_aTestJavaDriver.Show(false);
473 : }
474 :
475 0 : m_aFTSocket.Show(PAGE_MYSQL_JDBC == _nResId && !m_bUseClass);
476 0 : m_aEDSocket.Show(PAGE_MYSQL_JDBC == _nResId && !m_bUseClass);
477 :
478 0 : m_aEDHostname.SetModifyHdl(getControlModifiedLink());
479 0 : m_aNFPortNumber.SetModifyHdl(getControlModifiedLink());
480 0 : m_aEDSocket.SetModifyHdl(getControlModifiedLink());
481 :
482 : Window* pWindows[] = { &m_aFTHostname,&m_aEDHostname,
483 : &m_aPortNumber,&m_aNFPortNumber,&m_aFTSocket,&m_aEDSocket,
484 : &m_aFTDriverClass, &m_aEDDriverClass,&m_aTestJavaDriver,
485 0 : m_pCharsetLabel, m_pCharset};
486 :
487 0 : sal_Int32 nCount = sizeof(pWindows) / sizeof(pWindows[0]);
488 0 : for (sal_Int32 i=1; i < nCount; ++i)
489 0 : pWindows[i]->SetZOrder(pWindows[i-1], WINDOW_ZORDER_BEHIND);
490 :
491 0 : FreeResource();
492 0 : }
493 :
494 0 : void OGeneralSpecialJDBCDetailsPage::fillControls(::std::vector< ISaveValueWrapper* >& _rControlList)
495 : {
496 0 : OCommonBehaviourTabPage::fillControls(_rControlList);
497 0 : if ( m_bUseClass )
498 0 : _rControlList.push_back(new OSaveValueWrapper<Edit>(&m_aEDDriverClass));
499 0 : _rControlList.push_back(new OSaveValueWrapper<Edit>(&m_aEDHostname));
500 0 : _rControlList.push_back(new OSaveValueWrapper<NumericField>(&m_aNFPortNumber));
501 0 : _rControlList.push_back(new OSaveValueWrapper<Edit>(&m_aEDSocket));
502 0 : }
503 0 : void OGeneralSpecialJDBCDetailsPage::fillWindows(::std::vector< ISaveValueWrapper* >& _rControlList)
504 : {
505 0 : OCommonBehaviourTabPage::fillWindows(_rControlList);
506 0 : _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aFTHostname));
507 0 : _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aPortNumber));
508 0 : _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aFTSocket));
509 0 : if ( m_bUseClass )
510 0 : _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aFTDriverClass));
511 0 : _rControlList.push_back(new ODisableWrapper<FixedLine>(&m_aFL_1));
512 0 : }
513 :
514 0 : bool OGeneralSpecialJDBCDetailsPage::FillItemSet( SfxItemSet& _rSet )
515 : {
516 0 : sal_Bool bChangedSomething = OCommonBehaviourTabPage::FillItemSet(_rSet);
517 0 : if ( m_bUseClass )
518 0 : fillString(_rSet,&m_aEDDriverClass,DSID_JDBCDRIVERCLASS,bChangedSomething);
519 0 : fillString(_rSet,&m_aEDHostname,DSID_CONN_HOSTNAME,bChangedSomething);
520 0 : fillString(_rSet,&m_aEDSocket,DSID_CONN_SOCKET,bChangedSomething);
521 0 : fillInt32(_rSet,&m_aNFPortNumber,m_nPortId,bChangedSomething );
522 :
523 0 : return bChangedSomething;
524 : }
525 0 : void OGeneralSpecialJDBCDetailsPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
526 : {
527 : // check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
528 : sal_Bool bValid, bReadonly;
529 0 : getFlags(_rSet, bValid, bReadonly);
530 :
531 0 : SFX_ITEMSET_GET(_rSet, pDrvItem, SfxStringItem, DSID_JDBCDRIVERCLASS, true);
532 0 : SFX_ITEMSET_GET(_rSet, pHostName, SfxStringItem, DSID_CONN_HOSTNAME, true);
533 0 : SFX_ITEMSET_GET(_rSet, pPortNumber, SfxInt32Item, m_nPortId, true);
534 0 : SFX_ITEMSET_GET(_rSet, pSocket, SfxStringItem, DSID_CONN_SOCKET, true);
535 :
536 0 : if ( bValid )
537 : {
538 0 : if ( m_bUseClass )
539 : {
540 0 : m_aEDDriverClass.SetText(pDrvItem->GetValue());
541 0 : m_aEDDriverClass.ClearModifyFlag();
542 : }
543 :
544 0 : m_aEDHostname.SetText(pHostName->GetValue());
545 0 : m_aEDHostname.ClearModifyFlag();
546 :
547 0 : m_aNFPortNumber.SetValue(pPortNumber->GetValue());
548 0 : m_aNFPortNumber.ClearModifyFlag();
549 :
550 0 : m_aEDSocket.SetText(pSocket->GetValue());
551 0 : m_aEDSocket.ClearModifyFlag();
552 : }
553 :
554 0 : OCommonBehaviourTabPage::implInitControls(_rSet, _bSaveValue);
555 :
556 : // to get the correcxt value when saveValue was called by base class
557 0 : if ( m_bUseClass && m_aEDDriverClass.GetText().isEmpty() )
558 : {
559 0 : m_aEDDriverClass.SetText(m_sDefaultJdbcDriverName);
560 0 : m_aEDDriverClass.SetModifyFlag();
561 : }
562 0 : }
563 0 : IMPL_LINK(OGeneralSpecialJDBCDetailsPage, OnTestJavaClickHdl, PushButton*, /*_pButton*/)
564 : {
565 : OSL_ENSURE(m_pAdminDialog,"No Admin dialog set! ->GPF");
566 : OSL_ENSURE(m_bUseClass,"Who called me?");
567 :
568 0 : sal_Bool bSuccess = sal_False;
569 : #if HAVE_FEATURE_JAVA
570 : try
571 : {
572 0 : if ( !m_aEDDriverClass.GetText().isEmpty() )
573 : {
574 : // TODO change jvmaccess
575 0 : ::rtl::Reference< jvmaccess::VirtualMachine > xJVM = ::connectivity::getJavaVM( m_pAdminDialog->getORB() );
576 0 : bSuccess = ::connectivity::existsJavaClassByName(xJVM,m_aEDDriverClass.GetText());
577 : }
578 : }
579 0 : catch(Exception&)
580 : {
581 : }
582 : #endif
583 0 : const sal_uInt16 nMessage = bSuccess ? STR_JDBCDRIVER_SUCCESS : STR_JDBCDRIVER_NO_SUCCESS;
584 0 : const OSQLMessageBox::MessageType mt = bSuccess ? OSQLMessageBox::Info : OSQLMessageBox::Error;
585 0 : OSQLMessageBox aMsg( this, OUString( ModuleRes( nMessage ) ), OUString(), WB_OK | WB_DEF_OK, mt );
586 0 : aMsg.Execute();
587 0 : return 0L;
588 : }
589 0 : IMPL_LINK(OGeneralSpecialJDBCDetailsPage, OnEditModified, Edit*, _pEdit)
590 : {
591 0 : if ( m_bUseClass && _pEdit == &m_aEDDriverClass )
592 0 : m_aTestJavaDriver.Enable( !m_aEDDriverClass.GetText().isEmpty() );
593 :
594 : // tell the listener we were modified
595 0 : callModifiedHdl();
596 0 : return 0L;
597 : }
598 :
599 : // MySQLNativePage
600 0 : MySQLNativePage::MySQLNativePage( Window* pParent, const SfxItemSet& _rCoreAttrs )
601 : :OCommonBehaviourTabPage(pParent, PAGE_MYSQL_NATIVE, _rCoreAttrs, CBTP_USE_CHARSET, false )
602 : ,m_aSeparator1 ( this, ModuleRes( FL_SEPARATOR1) )
603 0 : ,m_aMySQLSettings ( *this, getControlModifiedLink() )
604 : ,m_aSeparator2 ( this, ModuleRes(FL_SEPARATOR2))
605 : ,m_aUserNameLabel ( this, ModuleRes(FT_USERNAME))
606 : ,m_aUserName ( this, ModuleRes(ET_USERNAME))
607 0 : ,m_aPasswordRequired ( this, ModuleRes(CB_PASSWORD_REQUIRED))
608 : {
609 0 : m_aUserName.SetModifyHdl(getControlModifiedLink());
610 :
611 : Window* pWindows[] = { &m_aMySQLSettings, &m_aSeparator2, &m_aUserNameLabel, &m_aUserName,
612 0 : &m_aPasswordRequired, m_pCharsetLabel, m_pCharset};
613 0 : sal_Int32 nCount = sizeof(pWindows) / sizeof(pWindows[0]);
614 0 : for (sal_Int32 i=1; i < nCount; ++i)
615 0 : pWindows[i]->SetZOrder(pWindows[i-1], WINDOW_ZORDER_BEHIND);
616 :
617 0 : LayoutHelper::positionBelow( m_aSeparator1, m_aMySQLSettings, RelatedControls, 3 );
618 0 : m_aMySQLSettings.Show();
619 :
620 0 : FreeResource();
621 0 : }
622 :
623 0 : void MySQLNativePage::fillControls(::std::vector< ISaveValueWrapper* >& _rControlList)
624 : {
625 0 : OCommonBehaviourTabPage::fillControls( _rControlList );
626 0 : m_aMySQLSettings.fillControls( _rControlList );
627 :
628 0 : _rControlList.push_back(new OSaveValueWrapper<Edit>(&m_aUserName));
629 0 : _rControlList.push_back(new OSaveValueWrapper<CheckBox>(&m_aPasswordRequired));
630 0 : }
631 0 : void MySQLNativePage::fillWindows(::std::vector< ISaveValueWrapper* >& _rControlList)
632 : {
633 0 : OCommonBehaviourTabPage::fillWindows( _rControlList );
634 0 : m_aMySQLSettings.fillWindows( _rControlList);
635 :
636 0 : _rControlList.push_back(new ODisableWrapper<FixedLine>(&m_aSeparator1));
637 0 : _rControlList.push_back(new ODisableWrapper<FixedLine>(&m_aSeparator2));
638 0 : _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aUserNameLabel));
639 0 : }
640 :
641 0 : bool MySQLNativePage::FillItemSet( SfxItemSet& _rSet )
642 : {
643 0 : sal_Bool bChangedSomething = OCommonBehaviourTabPage::FillItemSet( _rSet );
644 :
645 0 : bChangedSomething |= (m_aMySQLSettings.FillItemSet( _rSet ) ? 1 : 0);
646 :
647 0 : if ( m_aUserName.GetText() != m_aUserName.GetSavedValue() )
648 : {
649 0 : _rSet.Put( SfxStringItem( DSID_USER, m_aUserName.GetText() ) );
650 0 : _rSet.Put( SfxStringItem( DSID_PASSWORD, OUString()));
651 0 : bChangedSomething = true;
652 : }
653 0 : fillBool(_rSet,&m_aPasswordRequired,DSID_PASSWORDREQUIRED,bChangedSomething);
654 :
655 0 : return bChangedSomething;
656 : }
657 0 : void MySQLNativePage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
658 : {
659 : // check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
660 : sal_Bool bValid, bReadonly;
661 0 : getFlags(_rSet, bValid, bReadonly);
662 :
663 0 : m_aMySQLSettings.implInitControls( _rSet );
664 :
665 0 : SFX_ITEMSET_GET(_rSet, pUidItem, SfxStringItem, DSID_USER, true);
666 0 : SFX_ITEMSET_GET(_rSet, pAllowEmptyPwd, SfxBoolItem, DSID_PASSWORDREQUIRED, true);
667 :
668 0 : if ( bValid )
669 : {
670 0 : m_aUserName.SetText(pUidItem->GetValue());
671 0 : m_aUserName.ClearModifyFlag();
672 0 : m_aPasswordRequired.Check(pAllowEmptyPwd->GetValue());
673 : }
674 :
675 0 : OCommonBehaviourTabPage::implInitControls(_rSet, _bSaveValue);
676 0 : }
677 :
678 0 : SfxTabPage* ODriversSettings::CreateMySQLJDBC( Window* pParent, const SfxItemSet& _rAttrSet )
679 : {
680 0 : return ( new OGeneralSpecialJDBCDetailsPage( pParent,PAGE_MYSQL_JDBC, _rAttrSet,DSID_MYSQL_PORTNUMBER ) );
681 : }
682 0 : SfxTabPage* ODriversSettings::CreateMySQLNATIVE( Window* pParent, const SfxItemSet& _rAttrSet )
683 : {
684 0 : return ( new MySQLNativePage( pParent, _rAttrSet ) );
685 : }
686 :
687 0 : SfxTabPage* ODriversSettings::CreateOracleJDBC( Window* pParent, const SfxItemSet& _rAttrSet )
688 : {
689 0 : return ( new OGeneralSpecialJDBCDetailsPage( pParent,PAGE_ORACLE_JDBC, _rAttrSet,DSID_ORACLE_PORTNUMBER) );
690 : }
691 :
692 : // OLDAPDetailsPage
693 0 : OLDAPDetailsPage::OLDAPDetailsPage( Window* pParent, const SfxItemSet& _rCoreAttrs )
694 : :OCommonBehaviourTabPage(pParent, PAGE_LDAP, _rCoreAttrs,0,false)
695 : ,m_aFL_1 (this, ModuleRes( FL_SEPARATOR1) )
696 : ,m_aBaseDN (this, ModuleRes(FT_BASEDN))
697 : ,m_aETBaseDN (this, ModuleRes(ET_BASEDN))
698 : ,m_aCBUseSSL (this, ModuleRes(CB_USESSL))
699 : ,m_aPortNumber (this, ModuleRes(FT_PORTNUMBER))
700 : ,m_aNFPortNumber (this, ModuleRes(NF_PORTNUMBER))
701 : ,m_aFTRowCount (this, ModuleRes(FT_LDAPROWCOUNT))
702 0 : ,m_aNFRowCount (this, ModuleRes(NF_LDAPROWCOUNT))
703 : {
704 0 : m_aETBaseDN.SetModifyHdl(getControlModifiedLink());
705 0 : m_aCBUseSSL.SetToggleHdl(getControlModifiedLink());
706 0 : m_aNFPortNumber.SetModifyHdl(getControlModifiedLink());
707 0 : m_aNFRowCount.SetModifyHdl(getControlModifiedLink());
708 :
709 0 : m_aNFRowCount.SetUseThousandSep(false);
710 0 : m_iNormalPort = 389;
711 0 : m_iSSLPort = 636;
712 0 : m_aCBUseSSL.SetClickHdl(LINK(this, OLDAPDetailsPage,OnCheckBoxClick));
713 0 : FreeResource();
714 0 : }
715 :
716 0 : SfxTabPage* ODriversSettings::CreateLDAP( Window* pParent, const SfxItemSet& _rAttrSet )
717 : {
718 0 : return ( new OLDAPDetailsPage( pParent, _rAttrSet ) );
719 : }
720 :
721 0 : bool OLDAPDetailsPage::FillItemSet( SfxItemSet& _rSet )
722 : {
723 0 : sal_Bool bChangedSomething = OCommonBehaviourTabPage::FillItemSet(_rSet);
724 :
725 0 : fillString(_rSet,&m_aETBaseDN,DSID_CONN_LDAP_BASEDN,bChangedSomething);
726 0 : fillInt32(_rSet,&m_aNFPortNumber,DSID_CONN_LDAP_PORTNUMBER,bChangedSomething);
727 0 : fillInt32(_rSet,&m_aNFRowCount,DSID_CONN_LDAP_ROWCOUNT,bChangedSomething);
728 0 : fillBool(_rSet,&m_aCBUseSSL,DSID_CONN_LDAP_USESSL,bChangedSomething);
729 0 : return bChangedSomething;
730 : }
731 0 : IMPL_LINK( OLDAPDetailsPage, OnCheckBoxClick, CheckBox*, pCheckBox )
732 : {
733 0 : callModifiedHdl();
734 0 : if ( pCheckBox == &m_aCBUseSSL)
735 : {
736 0 : if ( m_aCBUseSSL.IsChecked() )
737 : {
738 0 : m_iNormalPort = static_cast<sal_Int32>(m_aNFPortNumber.GetValue());
739 0 : m_aNFPortNumber.SetValue(m_iSSLPort);
740 : }
741 : else
742 : {
743 0 : m_iSSLPort = static_cast<sal_Int32>(m_aNFPortNumber.GetValue());
744 0 : m_aNFPortNumber.SetValue(m_iNormalPort);
745 : }
746 : }
747 0 : return 0;
748 : }
749 :
750 0 : void OLDAPDetailsPage::fillControls(::std::vector< ISaveValueWrapper* >& _rControlList)
751 : {
752 0 : OCommonBehaviourTabPage::fillControls(_rControlList);
753 0 : _rControlList.push_back(new OSaveValueWrapper<Edit>(&m_aETBaseDN));
754 0 : _rControlList.push_back(new OSaveValueWrapper<CheckBox>(&m_aCBUseSSL));
755 0 : _rControlList.push_back(new OSaveValueWrapper<NumericField>(&m_aNFPortNumber));
756 0 : _rControlList.push_back(new OSaveValueWrapper<NumericField>(&m_aNFRowCount));
757 0 : }
758 0 : void OLDAPDetailsPage::fillWindows(::std::vector< ISaveValueWrapper* >& _rControlList)
759 : {
760 0 : OCommonBehaviourTabPage::fillWindows(_rControlList);
761 0 : _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aBaseDN));
762 0 : _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aPortNumber));
763 0 : _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aFTRowCount));
764 0 : _rControlList.push_back(new ODisableWrapper<FixedLine>(&m_aFL_1));
765 0 : }
766 0 : void OLDAPDetailsPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
767 : {
768 : // check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
769 : sal_Bool bValid, bReadonly;
770 0 : getFlags(_rSet, bValid, bReadonly);
771 :
772 0 : SFX_ITEMSET_GET(_rSet, pBaseDN, SfxStringItem, DSID_CONN_LDAP_BASEDN, true);
773 0 : SFX_ITEMSET_GET(_rSet, pUseSSL, SfxBoolItem, DSID_CONN_LDAP_USESSL, true);
774 0 : SFX_ITEMSET_GET(_rSet, pPortNumber, SfxInt32Item, DSID_CONN_LDAP_PORTNUMBER, true);
775 0 : SFX_ITEMSET_GET(_rSet, pRowCount, SfxInt32Item, DSID_CONN_LDAP_ROWCOUNT, true);
776 :
777 0 : if ( bValid )
778 : {
779 0 : m_aETBaseDN.SetText(pBaseDN->GetValue());
780 0 : m_aNFPortNumber.SetValue(pPortNumber->GetValue());
781 0 : m_aNFRowCount.SetValue(pRowCount->GetValue());
782 0 : m_aCBUseSSL.Check(pUseSSL->GetValue());
783 : }
784 :
785 0 : OCommonBehaviourTabPage::implInitControls(_rSet, _bSaveValue);
786 0 : }
787 :
788 : // OTextDetailsPage
789 0 : OTextDetailsPage::OTextDetailsPage( Window* pParent, const SfxItemSet& _rCoreAttrs )
790 0 : :OCommonBehaviourTabPage(pParent, PAGE_TEXT, _rCoreAttrs, 0, false )
791 : {
792 :
793 0 : m_pTextConnectionHelper = new OTextConnectionHelper( this, TC_EXTENSION | TC_HEADER | TC_SEPARATORS | TC_CHARSET );
794 0 : FreeResource();
795 0 : }
796 :
797 0 : OTextDetailsPage::~OTextDetailsPage()
798 : {
799 0 : DELETEZ(m_pTextConnectionHelper);
800 :
801 0 : }
802 :
803 0 : SfxTabPage* ODriversSettings::CreateText( Window* pParent, const SfxItemSet& _rAttrSet )
804 : {
805 0 : return ( new OTextDetailsPage( pParent, _rAttrSet ) );
806 : }
807 0 : void OTextDetailsPage::fillControls(::std::vector< ISaveValueWrapper* >& _rControlList)
808 : {
809 0 : OCommonBehaviourTabPage::fillControls(_rControlList);
810 0 : m_pTextConnectionHelper->fillControls(_rControlList);
811 :
812 0 : }
813 0 : void OTextDetailsPage::fillWindows(::std::vector< ISaveValueWrapper* >& _rControlList)
814 : {
815 0 : OCommonBehaviourTabPage::fillWindows(_rControlList);
816 0 : m_pTextConnectionHelper->fillWindows(_rControlList);
817 :
818 0 : }
819 0 : void OTextDetailsPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
820 : {
821 : // first check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
822 : sal_Bool bValid, bReadonly;
823 0 : getFlags(_rSet, bValid, bReadonly);
824 :
825 0 : m_pTextConnectionHelper->implInitControls(_rSet, bValid);
826 0 : OCommonBehaviourTabPage::implInitControls(_rSet, _bSaveValue);
827 0 : }
828 :
829 0 : bool OTextDetailsPage::FillItemSet( SfxItemSet& rSet )
830 : {
831 0 : sal_Bool bChangedSomething = OCommonBehaviourTabPage::FillItemSet(rSet);
832 0 : bChangedSomething = m_pTextConnectionHelper->FillItemSet(rSet, bChangedSomething);
833 0 : return bChangedSomething;
834 : }
835 :
836 0 : sal_Bool OTextDetailsPage::prepareLeave()
837 : {
838 0 : return m_pTextConnectionHelper->prepareLeave();
839 : }
840 :
841 0 : SfxTabPage* ODriversSettings::CreateGeneratedValuesPage( Window* _pParent, const SfxItemSet& _rAttrSet )
842 : {
843 0 : return new GeneratedValuesPage( _pParent, _rAttrSet );
844 : }
845 :
846 0 : SfxTabPage* ODriversSettings::CreateSpecialSettingsPage( Window* _pParent, const SfxItemSet& _rAttrSet )
847 : {
848 0 : OUString eType = ODbDataSourceAdministrationHelper::getDatasourceType( _rAttrSet );
849 0 : DataSourceMetaData aMetaData( eType );
850 0 : return new SpecialSettingsPage( _pParent, _rAttrSet, aMetaData );
851 : }
852 0 : } // namespace dbaui
853 :
854 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|