ITEM: Refactor ItemType
[LibreOffice.git] / sw / source / ui / dbui / addresslistdialog.cxx
blobab86aa33f0bceb15c566484099064c1c54f6d961
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
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 <swtypes.hxx>
21 #include <comphelper/propertyvalue.hxx>
22 #include "addresslistdialog.hxx"
23 #include "selectdbtabledialog.hxx"
24 #include "createaddresslistdialog.hxx"
25 #include <mailmergewizard.hxx>
26 #include <mmconfigitem.hxx>
27 #include "mmaddressblockpage.hxx"
28 #include <dbmgr.hxx>
29 #include <dbconfig.hxx>
30 #include <unotools/tempfile.hxx>
31 #include <vcl/svapp.hxx>
32 #include <tools/urlobj.hxx>
33 #include <comphelper/processfactory.hxx>
34 #include <comphelper/types.hxx>
35 #include <com/sun/star/sdbc/XCloseable.hpp>
36 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
37 #include <com/sun/star/container/XNameAccess.hpp>
38 #include <com/sun/star/sdb/DatabaseContext.hpp>
39 #include <com/sun/star/sdb/XCompletedConnection.hpp>
40 #include <com/sun/star/sdb/CommandType.hpp>
41 #include <com/sun/star/sdb/FilterDialog.hpp>
42 #include <com/sun/star/sdb/XDocumentDataSource.hpp>
43 #include <com/sun/star/sdbc/XRowSet.hpp>
44 #include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp>
45 #include <com/sun/star/sdbcx/XTablesSupplier.hpp>
46 #include <com/sun/star/sdb/XQueriesSupplier.hpp>
47 #include <com/sun/star/task/InteractionHandler.hpp>
48 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
49 #include <com/sun/star/frame/XStorable.hpp>
50 #include <o3tl/safeint.hxx>
51 #include <swunohelper.hxx>
52 #include <unotools/pathoptions.hxx>
53 #include <comphelper/diagnose_ex.hxx>
54 #include <svl/urihelper.hxx>
55 #include <strings.hrc>
56 #include <view.hxx>
58 using namespace ::com::sun::star;
59 using namespace ::com::sun::star::uno;
60 using namespace ::com::sun::star::lang;
61 using namespace ::com::sun::star::container;
62 using namespace ::com::sun::star::sdb;
63 using namespace ::com::sun::star::sdbc;
64 using namespace ::com::sun::star::sdbcx;
65 using namespace ::com::sun::star::task;
66 using namespace ::com::sun::star::beans;
67 using namespace ::com::sun::star::ui::dialogs;
69 struct AddressUserData_Impl
71 uno::Reference<XDataSource> xSource;
72 SharedConnection xConnection;
73 uno::Reference< XColumnsSupplier> xColumnsSupplier;
74 uno::Reference< sdbc::XResultSet> xResultSet;
75 OUString sFilter;
76 OUString sURL; // data is editable
77 sal_Int32 nCommandType;
78 sal_Int32 nTableAndQueryCount;
79 AddressUserData_Impl() :
80 nCommandType(0),
81 nTableAndQueryCount(-1)
85 static OUString lcl_getFlatURL( uno::Reference<beans::XPropertySet> const & xSourceProperties )
87 if(xSourceProperties.is())
89 OUString sDBURL;
90 xSourceProperties->getPropertyValue(u"URL"_ustr) >>= sDBURL;
91 if (sDBURL.startsWith("sdbc:flat:"))
93 uno::Sequence<OUString> aFilters;
94 xSourceProperties->getPropertyValue(u"TableFilter"_ustr) >>= aFilters;
95 uno::Sequence<PropertyValue> aInfo;
96 xSourceProperties->getPropertyValue(u"Info"_ustr) >>= aInfo;
97 if(aFilters.getLength() == 1 && aInfo.hasElements() )
99 OUString sExtension;
100 OUString sCharSet;
101 for (const auto& rInfo : aInfo)
103 if(rInfo.Name == "Extension")
104 rInfo.Value >>= sExtension;
105 else if(rInfo.Name == "CharSet")
106 rInfo.Value >>= sCharSet;
108 if (sCharSet=="UTF-8")
110 //#i97577# at this point the 'URL' can also be a file name!
111 return URIHelper::SmartRel2Abs( INetURLObject(), sDBURL.copy(10) )
112 + "/" + aFilters[0] + "." + sExtension;
117 return OUString();
120 SwAddressListDialog::SwAddressListDialog(SwMailMergeAddressBlockPage* pParent)
121 : SfxDialogController(pParent->GetWizard()->getDialog(), u"modules/swriter/ui/selectaddressdialog.ui"_ustr, u"SelectAddressDialog"_ustr)
122 , m_bInSelectHdl(false)
123 , m_pAddressPage(pParent)
124 , m_xDescriptionFI(m_xBuilder->weld_label(u"desc"_ustr))
125 , m_xConnecting(m_xBuilder->weld_label(u"connecting"_ustr))
126 , m_xListLB(m_xBuilder->weld_tree_view(u"sources"_ustr))
127 , m_xLoadListPB(m_xBuilder->weld_button(u"add"_ustr))
128 , m_xRemovePB(m_xBuilder->weld_button(u"remove"_ustr))
129 , m_xCreateListPB(m_xBuilder->weld_button(u"create"_ustr))
130 , m_xFilterPB(m_xBuilder->weld_button(u"filter"_ustr))
131 , m_xEditPB(m_xBuilder->weld_button(u"edit"_ustr))
132 , m_xTablePB(m_xBuilder->weld_button(u"changetable"_ustr))
133 , m_xOK(m_xBuilder->weld_button(u"ok"_ustr))
134 , m_xIter(m_xListLB->make_iterator())
136 m_sConnecting = m_xConnecting->get_label();
138 const OUString sTemp(m_xDescriptionFI->get_label()
139 .replaceFirst("%1", m_xLoadListPB->strip_mnemonic(m_xLoadListPB->get_label()))
140 .replaceFirst("%2", m_xCreateListPB->strip_mnemonic(m_xCreateListPB->get_label())));
141 m_xDescriptionFI->set_label(sTemp);
142 m_xFilterPB->connect_clicked( LINK( this, SwAddressListDialog, FilterHdl_Impl ));
143 m_xLoadListPB->connect_clicked( LINK( this, SwAddressListDialog, LoadHdl_Impl ));
144 m_xRemovePB->connect_clicked( LINK(this, SwAddressListDialog, RemoveHdl_Impl ));
145 m_xCreateListPB->connect_clicked( LINK( this, SwAddressListDialog,CreateHdl_Impl ));
146 m_xEditPB->connect_clicked(LINK( this, SwAddressListDialog, EditHdl_Impl));
147 m_xTablePB->connect_clicked(LINK( this, SwAddressListDialog, TableSelectHdl_Impl));
149 m_xListLB->set_size_request(m_xListLB->get_approximate_digit_width() * 52,
150 m_xListLB->get_height_rows(9));
152 std::vector<int> aWidths
154 o3tl::narrowing<int>(m_xListLB->get_approximate_digit_width() * 26)
156 m_xListLB->set_column_fixed_widths(aWidths);
158 m_xListLB->make_sorted();
159 m_xOK->connect_clicked(LINK(this, SwAddressListDialog, OKHdl_Impl));
161 const uno::Reference<XComponentContext>& xContext( ::comphelper::getProcessComponentContext() );
162 m_xDBContext = DatabaseContext::create(xContext);
164 SwMailMergeConfigItem& rConfigItem = m_pAddressPage->GetWizard()->GetConfigItem();
165 const SwDBData& rCurrentData = rConfigItem.GetCurrentDBData();
167 bool bEnableEdit = false;
168 bool bEnableOK = true;
169 bool bSelected = false;
170 m_xListLB->unselect_all();
172 SwDBConfig aDb;
173 const OUString sBibliography = aDb.GetBibliographySource().sDataSource;
174 const uno::Sequence< OUString> aNames = m_xDBContext->getElementNames();
175 for(const OUString& rName : aNames)
177 if ( rName == sBibliography )
178 continue;
179 m_xListLB->append(m_xIter.get());
180 m_xListLB->set_text(*m_xIter, rName, 0);
181 m_aUserData.emplace_back(new AddressUserData_Impl);
182 AddressUserData_Impl* pUserData = m_aUserData.back().get();
183 m_xListLB->set_id(*m_xIter, weld::toId(pUserData));
184 if (rName == rCurrentData.sDataSource)
186 m_xListLB->select(*m_xIter);
187 bSelected = true;
188 m_xListLB->set_text(*m_xIter, rCurrentData.sCommand, 1);
189 pUserData->nCommandType = rCurrentData.nCommandType;
190 pUserData->xSource = rConfigItem.GetSource();
191 pUserData->xConnection = rConfigItem.GetConnection();
192 pUserData->xColumnsSupplier = rConfigItem.GetColumnsSupplier();
193 pUserData->xResultSet = rConfigItem.GetResultSet();
194 pUserData->sFilter = rConfigItem.GetFilter();
195 //is the data source editable (csv, Unicode, single table)
196 uno::Reference<beans::XPropertySet> xSourceProperties;
199 m_xDBContext->getByName(rName) >>= xSourceProperties;
200 pUserData->sURL = lcl_getFlatURL( xSourceProperties );
201 bEnableEdit = !pUserData->sURL.isEmpty() &&
202 SWUnoHelper::UCB_IsFile( pUserData->sURL ) && //#i97577#
203 !SWUnoHelper::UCB_IsReadOnlyFileName( pUserData->sURL );
205 catch (const uno::Exception&)
207 bEnableOK = false;
209 m_aDBData = rCurrentData;
213 bool bHasChildren = m_xListLB->n_children() > 0;
214 if (bHasChildren && !bSelected)
215 m_xListLB->select(0); // select the first entry if nothing else selected
216 m_xOK->set_sensitive(bHasChildren && bEnableOK);
217 m_xEditPB->set_sensitive(bEnableEdit);
218 m_xRemovePB->set_sensitive(m_xListLB->n_children() > 0);
219 m_xFilterPB->set_sensitive(m_xListLB->n_children() > 0);
220 m_xTablePB->set_sensitive(m_xListLB->n_children() > 0);
221 m_xListLB->connect_selection_changed(LINK(this, SwAddressListDialog, ListBoxSelectHdl_Impl));
222 TableSelectHdl(nullptr);
225 SwAddressListDialog::~SwAddressListDialog()
229 IMPL_LINK_NOARG(SwAddressListDialog, FilterHdl_Impl, weld::Button&, void)
231 int nSelect = m_xListLB->get_selected_index();
232 uno::Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() );
233 if (nSelect == -1)
234 return;
236 const OUString sCommand = m_xListLB->get_text(nSelect, 1);
237 if (sCommand.isEmpty())
238 return;
240 AddressUserData_Impl* pUserData = weld::fromId<AddressUserData_Impl*>(m_xListLB->get_id(nSelect));
241 if (!pUserData->xConnection.is() )
242 return;
246 uno::Reference<lang::XMultiServiceFactory> xConnectFactory(pUserData->xConnection, UNO_QUERY_THROW);
247 uno::Reference<XSingleSelectQueryComposer> xComposer(
248 xConnectFactory->createInstance(u"com.sun.star.sdb.SingleSelectQueryComposer"_ustr), UNO_QUERY_THROW);
250 uno::Reference<XRowSet> xRowSet(
251 xMgr->createInstance(u"com.sun.star.sdb.RowSet"_ustr), UNO_QUERY);
252 uno::Reference<XPropertySet> xRowProperties(xRowSet, UNO_QUERY);
253 xRowProperties->setPropertyValue(u"DataSourceName"_ustr,
254 Any(m_xListLB->get_text(nSelect, 0)));
255 xRowProperties->setPropertyValue(u"Command"_ustr, Any(sCommand));
256 xRowProperties->setPropertyValue(u"CommandType"_ustr, Any(pUserData->nCommandType));
257 xRowProperties->setPropertyValue(u"ActiveConnection"_ustr, Any(pUserData->xConnection.getTyped()));
258 xRowSet->execute();
260 OUString sQuery;
261 xRowProperties->getPropertyValue(u"ActiveCommand"_ustr)>>= sQuery;
262 xComposer->setQuery(sQuery);
263 if(!pUserData->sFilter.isEmpty())
264 xComposer->setFilter(pUserData->sFilter);
266 uno::Reference< XExecutableDialog> xDialog = sdb::FilterDialog::createWithQuery( comphelper::getComponentContext(xMgr),
267 xComposer,xRowSet, uno::Reference<awt::XWindow>() );
269 if ( RET_OK == xDialog->execute() )
271 weld::WaitObject aWait(m_xDialog.get());
272 pUserData->sFilter = xComposer->getFilter();
274 ::comphelper::disposeComponent(xRowSet);
276 catch (const Exception&)
278 TOOLS_WARN_EXCEPTION( "sw", "exception caught in SwAddressListDialog::FilterHdl_Impl");
282 IMPL_LINK_NOARG(SwAddressListDialog, LoadHdl_Impl, weld::Button&, void)
284 SwView* pView = m_pAddressPage->GetWizard()->GetSwView();
286 const OUString sNewSource = SwDBManager::LoadAndRegisterDataSource(m_xDialog.get(), pView ? pView->GetDocShell() : nullptr);
287 if(!sNewSource.isEmpty())
289 m_xListLB->append(m_xIter.get());
290 m_xListLB->set_text(*m_xIter, sNewSource, 0);
291 m_aUserData.emplace_back(new AddressUserData_Impl);
292 AddressUserData_Impl* pUserData = m_aUserData.back().get();
293 m_xListLB->set_id(*m_xIter, weld::toId(pUserData));
294 m_xListLB->select(*m_xIter);
295 ListBoxSelectHdl_Impl(*m_xListLB);
296 m_xRemovePB->set_sensitive(true);
300 IMPL_LINK_NOARG(SwAddressListDialog, RemoveHdl_Impl, weld::Button&, void)
302 int nEntry = m_xListLB->get_selected_index();
303 if (nEntry == -1)
304 return;
306 std::unique_ptr<weld::MessageDialog> xQuery(Application::CreateMessageDialog(getDialog(),
307 VclMessageType::Question, VclButtonsType::YesNo, SwResId(ST_DELETE_CONFIRM)));
308 if (xQuery->run() != RET_YES)
309 return;
311 // Remove data source connection
312 SwDBManager::RevokeDataSource(m_xListLB->get_selected_text());
313 // Remove item from the list
314 m_xListLB->remove(nEntry);
315 // If this was the last item, disable the Remove & Edit buttons and enable Create
316 if (m_xListLB->n_children() < 1 )
318 m_xRemovePB->set_sensitive(false);
319 m_xEditPB->set_sensitive(false);
320 m_xFilterPB->set_sensitive(false);
321 m_xCreateListPB->set_sensitive(true);
327 IMPL_LINK_NOARG(SwAddressListDialog, CreateHdl_Impl, weld::Button&, void)
329 SwCreateAddressListDialog aDlg(m_xDialog.get(), /*sInputURL*/OUString(), m_pAddressPage->GetWizard()->GetConfigItem());
330 if (RET_OK != aDlg.run())
331 return;
333 //register the URL a new datasource
334 const OUString sURL = aDlg.GetURL();
337 uno::Reference<XInterface> xNewInstance = m_xDBContext->createInstance();
338 INetURLObject aURL( sURL );
339 const OUString sNewName = aURL.getBase();
340 //find a unique name if sNewName already exists
341 OUString sFind(sNewName);
342 sal_Int32 nIndex = 0;
343 while(m_xDBContext->hasByName(sFind))
345 sFind = sNewName + OUString::number(++nIndex);
347 uno::Reference<XPropertySet> xDataProperties(xNewInstance, UNO_QUERY);
349 //only the 'path' has to be added
350 INetURLObject aTempURL(aURL);
351 aTempURL.removeSegment();
352 aTempURL.removeFinalSlash();
353 const OUString sDBURL("sdbc:flat:" + aTempURL.GetMainURL(INetURLObject::DecodeMechanism::NONE));
354 xDataProperties->setPropertyValue(u"URL"_ustr, Any(sDBURL));
355 //set the filter to the file name without extension
356 uno::Sequence<OUString> aFilters { sNewName };
357 xDataProperties->setPropertyValue(u"TableFilter"_ustr, Any(aFilters));
359 uno::Sequence<PropertyValue> aInfo
361 comphelper::makePropertyValue(u"FieldDelimiter"_ustr, OUString('\t')),
362 comphelper::makePropertyValue(u"StringDelimiter"_ustr, OUString('"')),
363 comphelper::makePropertyValue(u"Extension"_ustr, aURL.getExtension()), //"csv
364 comphelper::makePropertyValue(u"CharSet"_ustr, u"UTF-8"_ustr)
366 xDataProperties->setPropertyValue(u"Info"_ustr, Any(aInfo));
368 uno::Reference<sdb::XDocumentDataSource> xDS(xNewInstance, UNO_QUERY_THROW);
369 uno::Reference<frame::XStorable> xStore(xDS->getDatabaseDocument(), UNO_QUERY_THROW);
370 OUString sTmpName;
372 OUString sHomePath(SvtPathOptions().GetWorkPath());
373 utl::TempFileNamed aTempFile(sFind, true, u".odb", &sHomePath);
374 aTempFile.EnableKillingFile();
375 sTmpName = aTempFile.GetURL();
377 xStore->storeAsURL(sTmpName, Sequence< PropertyValue >());
379 m_xDBContext->registerObject( sFind, xNewInstance );
380 //now insert the new source into the ListBox
381 m_xListLB->append(m_xIter.get());
382 m_xListLB->set_text(*m_xIter, sFind, 0);
383 m_xListLB->set_text(*m_xIter, aFilters[0], 1);
384 m_aUserData.emplace_back(new AddressUserData_Impl);
385 AddressUserData_Impl* pUserData = m_aUserData.back().get();
386 m_xListLB->set_id(*m_xIter, weld::toId(pUserData));
387 m_xListLB->select(*m_xIter);
388 ListBoxSelectHdl_Impl(*m_xListLB);
389 m_xCreateListPB->set_sensitive(false);
390 m_xRemovePB->set_sensitive(true);
392 catch (const Exception&)
397 IMPL_LINK_NOARG(SwAddressListDialog, EditHdl_Impl, weld::Button&, void)
399 int nEntry = m_xListLB->get_selected_index();
400 AddressUserData_Impl* pUserData = nEntry != -1 ? weld::fromId<AddressUserData_Impl*>(m_xListLB->get_id(nEntry)) : nullptr;
401 if (!pUserData || pUserData->sURL.isEmpty())
402 return;
404 if(pUserData->xResultSet.is())
406 SwMailMergeConfigItem& rConfigItem = m_pAddressPage->GetWizard()->GetConfigItem();
407 if(rConfigItem.GetResultSet() != pUserData->xResultSet)
408 ::comphelper::disposeComponent( pUserData->xResultSet );
409 pUserData->xResultSet = nullptr;
411 rConfigItem.DisposeResultSet();
413 pUserData->xSource.clear();
414 pUserData->xColumnsSupplier.clear();
415 pUserData->xConnection.clear();
416 // will automatically close if it was the las reference
417 SwCreateAddressListDialog aDlg(m_xDialog.get(), pUserData->sURL,
418 m_pAddressPage->GetWizard()->GetConfigItem());
419 aDlg.run();
422 IMPL_LINK_NOARG(SwAddressListDialog, ListBoxSelectHdl_Impl, weld::TreeView&, void)
424 sal_IntPtr nSelect = m_xListLB->get_selected_index();
425 Application::PostUserEvent( LINK( this, SwAddressListDialog,
426 StaticListBoxSelectHdl_Impl ), reinterpret_cast<void*>(nSelect) );
429 IMPL_LINK(SwAddressListDialog, StaticListBoxSelectHdl_Impl, void*, p, void)
431 int nSelect = reinterpret_cast<sal_IntPtr>(p);
432 //prevent nested calls of the select handler
433 if (m_bInSelectHdl)
434 return;
435 weld::WaitObject aWait(m_xDialog.get());
436 m_bInSelectHdl = true;
437 AddressUserData_Impl* pUserData = nullptr;
438 if (nSelect != -1)
440 const OUString sTable(m_xListLB->get_text(nSelect, 1));
441 if (sTable.isEmpty())
443 m_xListLB->set_text(nSelect, m_sConnecting, 1);
446 pUserData = weld::fromId<AddressUserData_Impl*>(m_xListLB->get_id(nSelect));
447 if(pUserData->nTableAndQueryCount > 1 || pUserData->nTableAndQueryCount == -1)
449 DetectTablesAndQueries(nSelect, sTable.isEmpty());
451 else
453 //otherwise set the selected db-data
454 m_aDBData.sDataSource = m_xListLB->get_text(nSelect, 0);
455 m_aDBData.sCommand = m_xListLB->get_text(nSelect, 1);
456 m_aDBData.nCommandType = pUserData->nCommandType;
457 m_xOK->set_sensitive(true);
459 if (m_xListLB->get_text(nSelect, 1) == m_sConnecting)
460 m_xListLB->set_text(nSelect, OUString(), 1);
462 m_xEditPB->set_sensitive(pUserData && !pUserData->sURL.isEmpty() &&
463 SWUnoHelper::UCB_IsFile( pUserData->sURL ) && //#i97577#
464 !SWUnoHelper::UCB_IsReadOnlyFileName( pUserData->sURL ) );
465 m_bInSelectHdl = false;
468 // detect the number of tables for a data source
469 // if only one is available then set it at the entry
470 void SwAddressListDialog::DetectTablesAndQueries(
471 int nSelect,
472 bool bWidthDialog)
476 AddressUserData_Impl* pUserData = weld::fromId<AddressUserData_Impl*>(m_xListLB->get_id(nSelect));
477 uno::Reference<XCompletedConnection> xComplConnection;
478 if(!pUserData->xConnection.is())
480 m_aDBData.sDataSource = m_xListLB->get_text(nSelect, 0);
481 m_xDBContext->getByName(m_aDBData.sDataSource) >>= xComplConnection;
482 pUserData->xSource.set(xComplConnection, UNO_QUERY);
484 const uno::Reference< XComponentContext >& xContext( ::comphelper::getProcessComponentContext() );
485 uno::Reference< XInteractionHandler > xHandler = InteractionHandler::createWithParent(xContext, nullptr);
486 pUserData->xConnection = SharedConnection( xComplConnection->connectWithCompletion( xHandler ) );
488 if(pUserData->xConnection.is())
490 sal_Int32 nTables = 0;
491 uno::Sequence<OUString> aTables;
492 uno::Sequence<OUString> aQueries;
493 uno::Reference<XTablesSupplier> xTSupplier(pUserData->xConnection, UNO_QUERY);
494 if(xTSupplier.is())
496 uno::Reference<XNameAccess> xTables = xTSupplier->getTables();
497 aTables = xTables->getElementNames();
498 nTables += aTables.getLength();
500 uno::Reference<XQueriesSupplier> xQSupplier(pUserData->xConnection, UNO_QUERY);
501 if(xQSupplier.is())
503 uno::Reference<XNameAccess> xQueries = xQSupplier->getQueries();
504 aQueries = xQueries->getElementNames();
505 nTables += aQueries.getLength();
507 pUserData->nTableAndQueryCount = nTables;
508 if(nTables > 1 && bWidthDialog)
510 //now call the table select dialog - if more than one table exists
511 SwSelectDBTableDialog aDlg(m_xDialog.get(), pUserData->xConnection);
512 const OUString sTable = m_xListLB->get_text(nSelect, 1);
513 if(!sTable.isEmpty())
514 aDlg.SetSelectedTable(sTable, pUserData->nCommandType == CommandType::TABLE);
515 if(RET_OK == aDlg.run())
517 bool bIsTable;
518 m_aDBData.sCommand = aDlg.GetSelectedTable(bIsTable);
519 m_aDBData.nCommandType = bIsTable ? CommandType::TABLE : CommandType::QUERY;
520 pUserData->nCommandType = m_aDBData.nCommandType;
523 else if(nTables == 1)
525 if(aTables.hasElements())
527 m_aDBData.sCommand = aTables[0];
528 m_aDBData.nCommandType = CommandType::TABLE;
530 else
532 m_aDBData.sCommand = aQueries[0];
533 m_aDBData.nCommandType = CommandType::QUERY;
537 if ( !m_aDBData.sCommand.isEmpty() )
539 uno::Reference<beans::XPropertySet> xSourceProperties;
540 m_xDBContext->getByName(m_aDBData.sDataSource) >>= xSourceProperties;
541 pUserData->sURL = lcl_getFlatURL( xSourceProperties );
543 pUserData->xColumnsSupplier = SwDBManager::GetColumnSupplier(pUserData->xConnection,
544 m_aDBData.sCommand,
545 m_aDBData.nCommandType == CommandType::TABLE ?
546 SwDBSelect::TABLE : SwDBSelect::QUERY );
547 //#i97577#
548 if( pUserData->xColumnsSupplier.is() )
549 m_xListLB->set_text(nSelect, m_aDBData.sCommand, 1);
550 else
551 m_xListLB->set_text(nSelect, OUString(), 1);
553 const OUString sCommand = m_xListLB->get_text(nSelect, 1);
554 m_xOK->set_sensitive(!sCommand.isEmpty());
555 m_xFilterPB->set_sensitive( pUserData->xConnection.is() && !sCommand.isEmpty() );
556 m_xTablePB->set_sensitive( pUserData->nTableAndQueryCount > 1 );
558 catch (const Exception&)
560 TOOLS_WARN_EXCEPTION( "sw", "exception caught in SwAddressListDialog::DetectTablesAndQueries");
561 m_xOK->set_sensitive(false);
565 IMPL_LINK(SwAddressListDialog, TableSelectHdl_Impl, weld::Button&, rButton, void)
567 TableSelectHdl(&rButton);
570 void SwAddressListDialog::TableSelectHdl(const weld::Button* pButton)
572 weld::WaitObject aWait(m_xDialog.get());
574 int nSelect = m_xListLB->get_selected_index();
575 if (nSelect != -1)
577 AddressUserData_Impl* pUserData = weld::fromId<AddressUserData_Impl*>(m_xListLB->get_id(nSelect));
578 //only call the table select dialog if tables have not been searched for or there
579 //are more than 1
580 const OUString sTable = m_xListLB->get_text(nSelect, 1);
581 if( pUserData->nTableAndQueryCount > 1 || pUserData->nTableAndQueryCount == -1)
583 DetectTablesAndQueries(nSelect, (pButton != nullptr) || sTable.isEmpty());
588 IMPL_LINK_NOARG(SwAddressListDialog, OKHdl_Impl, weld::Button&, void)
590 m_xDialog->response(RET_OK);
593 uno::Reference< XDataSource> SwAddressListDialog::GetSource() const
595 uno::Reference< XDataSource> xRet;
596 int nSelect = m_xListLB->get_selected_index();
597 if (nSelect != -1)
599 AddressUserData_Impl* pUserData = weld::fromId<AddressUserData_Impl*>(m_xListLB->get_id(nSelect));
600 xRet = pUserData->xSource;
602 return xRet;
606 SharedConnection SwAddressListDialog::GetConnection() const
608 SharedConnection xRet;
609 int nSelect = m_xListLB->get_selected_index();
610 if (nSelect != -1)
612 AddressUserData_Impl* pUserData = weld::fromId<AddressUserData_Impl*>(m_xListLB->get_id(nSelect));
613 xRet = pUserData->xConnection;
615 return xRet;
618 uno::Reference< XColumnsSupplier> SwAddressListDialog::GetColumnsSupplier() const
620 uno::Reference< XColumnsSupplier> xRet;
621 int nSelect = m_xListLB->get_selected_index();
622 if (nSelect != -1)
624 AddressUserData_Impl* pUserData = weld::fromId<AddressUserData_Impl*>(m_xListLB->get_id(nSelect));
625 xRet = pUserData->xColumnsSupplier;
627 return xRet;
630 OUString SwAddressListDialog::GetFilter() const
632 int nSelect = m_xListLB->get_selected_index();
633 if (nSelect != -1)
635 AddressUserData_Impl* pUserData = weld::fromId<AddressUserData_Impl*>(m_xListLB->get_id(nSelect));
636 return pUserData->sFilter;
638 return OUString();
641 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */