LibreOffice Module sw (master)  1
addresslistdialog.cxx
Go to the documentation of this file.
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 <swtypes.hxx>
21 #include "addresslistdialog.hxx"
22 #include "selectdbtabledialog.hxx"
24 #include <mailmergewizard.hxx>
25 #include <mmconfigitem.hxx>
26 #include "mmaddressblockpage.hxx"
27 #include <dbmgr.hxx>
28 #include <dbconfig.hxx>
29 #include <unotools/tempfile.hxx>
30 #include <vcl/svapp.hxx>
31 #include <tools/urlobj.hxx>
33 #include <comphelper/types.hxx>
34 #include <com/sun/star/sdbc/XCloseable.hpp>
35 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
36 #include <com/sun/star/lang/XSingleServiceFactory.hpp>
37 #include <com/sun/star/container/XNameAccess.hpp>
38 #include <com/sun/star/uno/XNamingService.hpp>
39 #include <com/sun/star/sdb/DatabaseContext.hpp>
40 #include <com/sun/star/sdb/XCompletedConnection.hpp>
41 #include <com/sun/star/sdb/CommandType.hpp>
42 #include <com/sun/star/sdb/FilterDialog.hpp>
43 #include <com/sun/star/sdb/XDocumentDataSource.hpp>
44 #include <com/sun/star/sdbc/XRowSet.hpp>
45 #include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp>
46 #include <com/sun/star/sdbcx/XTablesSupplier.hpp>
47 #include <com/sun/star/sdb/XQueriesSupplier.hpp>
48 #include <com/sun/star/task/InteractionHandler.hpp>
49 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
50 #include <com/sun/star/frame/XStorable.hpp>
51 #include <swunohelper.hxx>
52 #include <unotools/pathoptions.hxx>
53 #include <svl/urihelper.hxx>
54 #include <dbui.hrc>
55 #include <view.hxx>
56 
57 #include <unomid.h>
58 
59 using namespace ::com::sun::star;
60 using namespace ::com::sun::star::uno;
61 using namespace ::com::sun::star::lang;
62 using namespace ::com::sun::star::container;
63 using namespace ::com::sun::star::sdb;
64 using namespace ::com::sun::star::sdbc;
65 using namespace ::com::sun::star::sdbcx;
66 using namespace ::com::sun::star::task;
67 using namespace ::com::sun::star::beans;
68 using namespace ::com::sun::star::ui::dialogs;
69 
71 {
72  uno::Reference<XDataSource> xSource;
74  uno::Reference< XColumnsSupplier> xColumnsSupplier;
75  uno::Reference< sdbc::XResultSet> xResultSet;
76  OUString sFilter;
77  OUString sURL; // data is editable
78  sal_Int32 nCommandType;
81  nCommandType(0),
82  nTableAndQueryCount(-1)
83  {}
84 };
85 
86 static OUString lcl_getFlatURL( uno::Reference<beans::XPropertySet> const & xSourceProperties )
87 {
88  if(xSourceProperties.is())
89  {
90  OUString sDBURL;
91  xSourceProperties->getPropertyValue("URL") >>= sDBURL;
92  if (sDBURL.startsWith("sdbc:flat:"))
93  {
94  uno::Sequence<OUString> aFilters;
95  xSourceProperties->getPropertyValue("TableFilter") >>= aFilters;
96  uno::Sequence<PropertyValue> aInfo;
97  xSourceProperties->getPropertyValue("Info") >>= aInfo;
98  if(aFilters.getLength() == 1 && aInfo.hasElements() )
99  {
100  OUString sExtension;
101  OUString sCharSet;
102  for(const auto& rInfo : aInfo)
103  {
104  if(rInfo.Name == "Extension")
105  rInfo.Value >>= sExtension;
106  else if(rInfo.Name == "CharSet")
107  rInfo.Value >>= sCharSet;
108  }
109  if (sCharSet=="UTF-8")
110  {
111  //#i97577# at this point the 'URL' can also be a file name!
112  return URIHelper::SmartRel2Abs( INetURLObject(), sDBURL.copy(10) )
113  + "/" + aFilters[0] + "." + sExtension;
114  }
115  }
116  }
117  }
118  return OUString();
119 }
120 
122  : SfxDialogController(pParent->GetFrameWeld(), "modules/swriter/ui/selectaddressdialog.ui", "SelectAddressDialog")
123  , m_bInSelectHdl(false)
124  , m_xAddressPage(pParent)
125  , m_xDescriptionFI(m_xBuilder->weld_label("desc"))
126  , m_xConnecting(m_xBuilder->weld_label("connecting"))
127  , m_xListLB(m_xBuilder->weld_tree_view("sources"))
128  , m_xLoadListPB(m_xBuilder->weld_button("add"))
129  , m_xCreateListPB(m_xBuilder->weld_button("create"))
130  , m_xFilterPB(m_xBuilder->weld_button("filter"))
131  , m_xEditPB(m_xBuilder->weld_button("edit"))
132  , m_xTablePB(m_xBuilder->weld_button("changetable"))
133  , m_xOK(m_xBuilder->weld_button("ok"))
134  , m_xIter(m_xListLB->make_iterator())
135 {
136  m_sConnecting = m_xConnecting->get_label();
137 
138  const OUString sTemp(m_xDescriptionFI->get_label()
139  .replaceFirst("%1", m_xLoadListPB->get_label())
140  .replaceFirst("%2", 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_xCreateListPB->connect_clicked( LINK( this, SwAddressListDialog,CreateHdl_Impl ));
145  m_xEditPB->connect_clicked(LINK( this, SwAddressListDialog, EditHdl_Impl));
146  m_xTablePB->connect_clicked(LINK( this, SwAddressListDialog, TableSelectHdl_Impl));
147 
148  m_xListLB->set_size_request(m_xListLB->get_approximate_digit_width() * 52,
149  m_xListLB->get_height_rows(9));
150 
151  std::vector<int> aWidths;
152  aWidths.push_back(m_xListLB->get_approximate_digit_width() * 26);
153  m_xListLB->set_column_fixed_widths(aWidths);
154 
155  m_xListLB->make_sorted();
156  m_xOK->connect_clicked(LINK(this, SwAddressListDialog, OKHdl_Impl));
157 
158  uno::Reference<XComponentContext> xContext( ::comphelper::getProcessComponentContext() );
159  m_xDBContext = DatabaseContext::create(xContext);
160 
162  const SwDBData& rCurrentData = rConfigItem.GetCurrentDBData();
163 
164  bool bEnableEdit = false;
165  bool bEnableOK = true;
166  m_xListLB->unselect_all();
167 
168  SwDBConfig aDb;
169  const OUString sBibliography = aDb.GetBibliographySource().sDataSource;
170  uno::Sequence< OUString> aNames = m_xDBContext->getElementNames();
171  for(const OUString& rName : aNames)
172  {
173  if ( rName == sBibliography )
174  continue;
175  m_xListLB->append(m_xIter.get());
176  m_xListLB->set_text(*m_xIter, rName, 0);
177  m_aUserData.emplace_back(new AddressUserData_Impl);
178  AddressUserData_Impl* pUserData = m_aUserData.back().get();
179  m_xListLB->set_id(*m_xIter, OUString::number(reinterpret_cast<sal_Int64>(pUserData)));
180  if (rName == rCurrentData.sDataSource)
181  {
182  m_xListLB->select(*m_xIter);
183  m_xListLB->set_text(*m_xIter, rCurrentData.sCommand, 1);
184  pUserData->nCommandType = rCurrentData.nCommandType;
185  pUserData->xSource = rConfigItem.GetSource();
186  pUserData->xConnection = rConfigItem.GetConnection();
187  pUserData->xColumnsSupplier = rConfigItem.GetColumnsSupplier();
188  pUserData->xResultSet = rConfigItem.GetResultSet();
189  pUserData->sFilter = rConfigItem.GetFilter();
190  //is the data source editable (csv, Unicode, single table)
191  uno::Reference<beans::XPropertySet> xSourceProperties;
192  try
193  {
194  m_xDBContext->getByName(rName) >>= xSourceProperties;
195  pUserData->sURL = lcl_getFlatURL( xSourceProperties );
196  bEnableEdit = !pUserData->sURL.isEmpty() &&
197  SWUnoHelper::UCB_IsFile( pUserData->sURL ) && //#i97577#
199  }
200  catch (const uno::Exception&)
201  {
202  bEnableOK = false;
203  }
204  m_aDBData = rCurrentData;
205  }
206  }
207 
208  m_xOK->set_sensitive(m_xListLB->n_children() > 0 && bEnableOK);
209  m_xEditPB->set_sensitive(bEnableEdit);
210  m_xListLB->connect_changed(LINK(this, SwAddressListDialog, ListBoxSelectHdl_Impl));
211  TableSelectHdl(nullptr);
212 }
213 
215 {
216 }
217 
219 {
220  int nSelect = m_xListLB->get_selected_index();
221  uno::Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() );
222  if (nSelect != -1)
223  {
224  const OUString sCommand = m_xListLB->get_text(nSelect, 1);
225  if (sCommand.isEmpty())
226  return;
227 
228  AddressUserData_Impl* pUserData = reinterpret_cast<AddressUserData_Impl*>(m_xListLB->get_id(nSelect).toInt64());
229  if (pUserData->xConnection.is() )
230  {
231  try
232  {
233  uno::Reference<lang::XMultiServiceFactory> xConnectFactory(pUserData->xConnection, UNO_QUERY_THROW);
234  uno::Reference<XSingleSelectQueryComposer> xComposer(
235  xConnectFactory->createInstance("com.sun.star.sdb.SingleSelectQueryComposer"), UNO_QUERY_THROW);
236 
237  uno::Reference<XRowSet> xRowSet(
238  xMgr->createInstance("com.sun.star.sdb.RowSet"), UNO_QUERY);
239  uno::Reference<XPropertySet> xRowProperties(xRowSet, UNO_QUERY);
240  xRowProperties->setPropertyValue("DataSourceName",
241  makeAny(m_xListLB->get_text(nSelect, 0)));
242  xRowProperties->setPropertyValue("Command", makeAny(sCommand));
243  xRowProperties->setPropertyValue("CommandType", makeAny(pUserData->nCommandType));
244  xRowProperties->setPropertyValue("ActiveConnection", makeAny(pUserData->xConnection.getTyped()));
245  xRowSet->execute();
246 
247  OUString sQuery;
248  xRowProperties->getPropertyValue("ActiveCommand")>>= sQuery;
249  xComposer->setQuery(sQuery);
250  if(!pUserData->sFilter.isEmpty())
251  xComposer->setFilter(pUserData->sFilter);
252 
253  uno::Reference< XExecutableDialog> xDialog = sdb::FilterDialog::createWithQuery( comphelper::getComponentContext(xMgr),
254  xComposer,xRowSet, uno::Reference<awt::XWindow>() );
255 
256  if ( RET_OK == xDialog->execute() )
257  {
258  weld::WaitObject aWait(m_xDialog.get());
259  pUserData->sFilter = xComposer->getFilter();
260  }
261  ::comphelper::disposeComponent(xRowSet);
262  }
263  catch (const Exception&)
264  {
265  OSL_FAIL("exception caught in SwAddressListDialog::FilterHdl_Impl");
266  }
267  }
268  }
269 }
270 
272 {
273  SwView* pView = m_xAddressPage->GetWizard()->GetSwView();
274 
275  const OUString sNewSource = SwDBManager::LoadAndRegisterDataSource(m_xDialog.get(), pView ? pView->GetDocShell() : nullptr);
276  if(!sNewSource.isEmpty())
277  {
278  m_xListLB->append(m_xIter.get());
279  m_xListLB->set_text(*m_xIter, sNewSource, 0);
280  m_aUserData.emplace_back(new AddressUserData_Impl);
281  AddressUserData_Impl* pUserData = m_aUserData.back().get();
282  m_xListLB->set_id(*m_xIter, OUString::number(reinterpret_cast<sal_Int64>(pUserData)));
283  m_xListLB->select(*m_xIter);
284  ListBoxSelectHdl_Impl(*m_xListLB);
285  }
286 }
287 
289 {
290  OUString sInputURL;
291  SwCreateAddressListDialog aDlg(m_xDialog.get(), sInputURL, m_xAddressPage->GetWizard()->GetConfigItem());
292  if (RET_OK == aDlg.run())
293  {
294  //register the URL a new datasource
295  const OUString sURL = aDlg.GetURL();
296  try
297  {
298  uno::Reference<XInterface> xNewInstance = m_xDBContext->createInstance();
299  INetURLObject aURL( sURL );
300  const OUString sNewName = aURL.getBase();
301  //find a unique name if sNewName already exists
302  OUString sFind(sNewName);
303  sal_Int32 nIndex = 0;
304  while(m_xDBContext->hasByName(sFind))
305  {
306  sFind = sNewName + OUString::number(++nIndex);
307  }
308  uno::Reference<XPropertySet> xDataProperties(xNewInstance, UNO_QUERY);
309 
310  //only the 'path' has to be added
311  INetURLObject aTempURL(aURL);
312  aTempURL.removeSegment();
313  aTempURL.removeFinalSlash();
314  const OUString sDBURL("sdbc:flat:" + aTempURL.GetMainURL(INetURLObject::DecodeMechanism::NONE));
315  xDataProperties->setPropertyValue("URL", Any(sDBURL));
316  //set the filter to the file name without extension
317  uno::Sequence<OUString> aFilters { sNewName };
318  xDataProperties->setPropertyValue("TableFilter", Any(aFilters));
319 
320  uno::Sequence<PropertyValue> aInfo(4);
321  PropertyValue* pInfo = aInfo.getArray();
322  pInfo[0].Name = "FieldDelimiter";
323  pInfo[0].Value <<= OUString('\t');
324  pInfo[1].Name = "StringDelimiter";
325  pInfo[1].Value <<= OUString('"');
326  pInfo[2].Name = "Extension";
327  pInfo[2].Value <<= aURL.getExtension();//"csv";
328  pInfo[3].Name = "CharSet";
329  pInfo[3].Value <<= OUString("UTF-8");
330  xDataProperties->setPropertyValue("Info", Any(aInfo));
331 
332  uno::Reference<sdb::XDocumentDataSource> xDS(xNewInstance, UNO_QUERY_THROW);
333  uno::Reference<frame::XStorable> xStore(xDS->getDatabaseDocument(), UNO_QUERY_THROW);
334  OUString const sExt(".odb");
335  OUString sTmpName;
336  {
337  OUString sHomePath(SvtPathOptions().GetWorkPath());
338  utl::TempFile aTempFile(sFind, true, &sExt, &sHomePath);
339  aTempFile.EnableKillingFile();
340  sTmpName = aTempFile.GetURL();
341  }
342  xStore->storeAsURL(sTmpName, Sequence< PropertyValue >());
343 
344  m_xDBContext->registerObject( sFind, xNewInstance );
345  //now insert the new source into the ListBox
346  m_xListLB->append(m_xIter.get());
347  m_xListLB->set_text(*m_xIter, sFind, 0);
348  m_xListLB->set_text(*m_xIter, aFilters[0], 1);
349  m_aUserData.emplace_back(new AddressUserData_Impl);
350  AddressUserData_Impl* pUserData = m_aUserData.back().get();
351  m_xListLB->set_id(*m_xIter, OUString::number(reinterpret_cast<sal_Int64>(pUserData)));
352  m_xListLB->select(*m_xIter);
353  ListBoxSelectHdl_Impl(*m_xListLB);
354  m_xCreateListPB->set_sensitive(false);
355  }
356  catch (const Exception&)
357  {
358  }
359  }
360 }
361 
363 {
364  int nEntry = m_xListLB->get_selected_index();
365  AddressUserData_Impl* pUserData = nEntry != -1 ? reinterpret_cast<AddressUserData_Impl*>(m_xListLB->get_id(nEntry).toInt64()) : nullptr;
366  if (pUserData && !pUserData->sURL.isEmpty())
367  {
368  if(pUserData->xResultSet.is())
369  {
370  SwMailMergeConfigItem& rConfigItem = m_xAddressPage->GetWizard()->GetConfigItem();
371  if(rConfigItem.GetResultSet() != pUserData->xResultSet)
373  pUserData->xResultSet = nullptr;
374 
375  rConfigItem.DisposeResultSet();
376  }
377  pUserData->xSource.clear();
378  pUserData->xColumnsSupplier.clear();
379  pUserData->xConnection.clear();
380  // will automatically close if it was the las reference
381  SwCreateAddressListDialog aDlg(m_xDialog.get(), pUserData->sURL,
382  m_xAddressPage->GetWizard()->GetConfigItem());
383  aDlg.run();
384  }
385 };
386 
387 IMPL_LINK_NOARG(SwAddressListDialog, ListBoxSelectHdl_Impl, weld::TreeView&, void)
388 {
389  int nSelect = m_xListLB->get_selected_index();
391  StaticListBoxSelectHdl_Impl ), reinterpret_cast<void*>(nSelect) );
392 }
393 
394 IMPL_LINK(SwAddressListDialog, StaticListBoxSelectHdl_Impl, void*, p, void)
395 {
396  int nSelect = reinterpret_cast<sal_IntPtr>(p);
397  //prevent nested calls of the select handler
398  if (m_bInSelectHdl)
399  return;
400  weld::WaitObject aWait(m_xDialog.get());
401  m_bInSelectHdl = true;
402  AddressUserData_Impl* pUserData = nullptr;
403  if (nSelect != -1)
404  {
405  const OUString sTable(m_xListLB->get_text(nSelect, 1));
406  if (sTable.isEmpty())
407  {
408  m_xListLB->set_text(nSelect, m_sConnecting, 1);
409  }
410 
411  pUserData = reinterpret_cast<AddressUserData_Impl*>(m_xListLB->get_id(nSelect).toInt64());
412  if(pUserData->nTableAndQueryCount > 1 || pUserData->nTableAndQueryCount == -1)
413  {
414  DetectTablesAndQueries(nSelect, sTable.isEmpty());
415  }
416  else
417  {
418  //otherwise set the selected db-data
419  m_aDBData.sDataSource = m_xListLB->get_text(nSelect, 0);
420  m_aDBData.sCommand = m_xListLB->get_text(nSelect, 1);
421  m_aDBData.nCommandType = pUserData->nCommandType;
422  m_xOK->set_sensitive(true);
423  }
424  if (m_xListLB->get_text(nSelect, 1) == m_sConnecting)
425  m_xListLB->set_text(nSelect, OUString(), 1);
426  }
427  m_xEditPB->set_sensitive(pUserData && !pUserData->sURL.isEmpty() &&
428  SWUnoHelper::UCB_IsFile( pUserData->sURL ) && //#i97577#
429  !SWUnoHelper::UCB_IsReadOnlyFileName( pUserData->sURL ) );
430  m_bInSelectHdl = false;
431 }
432 
433 // detect the number of tables for a data source
434 // if only one is available then set it at the entry
436  int nSelect,
437  bool bWidthDialog)
438 {
439  try
440  {
441  AddressUserData_Impl* pUserData = reinterpret_cast<AddressUserData_Impl*>(m_xListLB->get_id(nSelect).toInt64());
442  uno::Reference<XCompletedConnection> xComplConnection;
443  if(!pUserData->xConnection.is())
444  {
445  m_aDBData.sDataSource = m_xListLB->get_text(nSelect, 0);
446  m_xDBContext->getByName(m_aDBData.sDataSource) >>= xComplConnection;
447  pUserData->xSource.set(xComplConnection, UNO_QUERY);
448 
449  uno::Reference< XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
450  uno::Reference< XInteractionHandler > xHandler = InteractionHandler::createWithParent(xContext, nullptr);
451  pUserData->xConnection = SharedConnection( xComplConnection->connectWithCompletion( xHandler ) );
452  }
453  if(pUserData->xConnection.is())
454  {
455  sal_Int32 nTables = 0;
456  uno::Sequence<OUString> aTables;
457  uno::Sequence<OUString> aQueries;
458  uno::Reference<XTablesSupplier> xTSupplier(pUserData->xConnection, UNO_QUERY);
459  if(xTSupplier.is())
460  {
461  uno::Reference<XNameAccess> xTables = xTSupplier->getTables();
462  aTables = xTables->getElementNames();
463  nTables += aTables.getLength();
464  }
465  uno::Reference<XQueriesSupplier> xQSupplier(pUserData->xConnection, UNO_QUERY);
466  if(xQSupplier.is())
467  {
468  uno::Reference<XNameAccess> xQueries = xQSupplier->getQueries();
469  aQueries = xQueries->getElementNames();
470  nTables += aQueries.getLength();
471  }
472  pUserData->nTableAndQueryCount = nTables;
473  if(nTables > 1 && bWidthDialog)
474  {
475  //now call the table select dialog - if more than one table exists
476  SwSelectDBTableDialog aDlg(m_xDialog.get(), pUserData->xConnection);
477  const OUString sTable = m_xListLB->get_text(nSelect, 1);
478  if(!sTable.isEmpty())
479  aDlg.SetSelectedTable(sTable, pUserData->nCommandType == CommandType::TABLE);
480  if(RET_OK == aDlg.run())
481  {
482  bool bIsTable;
483  m_aDBData.sCommand = aDlg.GetSelectedTable(bIsTable);
484  m_aDBData.nCommandType = bIsTable ? CommandType::TABLE : CommandType::QUERY;
485  pUserData->nCommandType = m_aDBData.nCommandType;
486  }
487  }
488  else if(nTables == 1)
489  {
490  if(aTables.hasElements())
491  {
492  m_aDBData.sCommand = aTables[0];
493  m_aDBData.nCommandType = CommandType::TABLE;
494  }
495  else
496  {
497  m_aDBData.sCommand = aQueries[0];
498  m_aDBData.nCommandType = CommandType::QUERY;
499  }
500  }
501  }
502  if ( !m_aDBData.sCommand.isEmpty() )
503  {
504  uno::Reference<beans::XPropertySet> xSourceProperties;
505  m_xDBContext->getByName(m_aDBData.sDataSource) >>= xSourceProperties;
506  pUserData->sURL = lcl_getFlatURL( xSourceProperties );
507 
510  m_aDBData.nCommandType == CommandType::TABLE ?
512  //#i97577#
513  if( pUserData->xColumnsSupplier.is() )
514  m_xListLB->set_text(nSelect, m_aDBData.sCommand, 1);
515  else
516  m_xListLB->set_text(nSelect, OUString(), 1);
517  }
518  const OUString sCommand = m_xListLB->get_text(nSelect, 1);
519  m_xOK->set_sensitive(!sCommand.isEmpty());
520  m_xFilterPB->set_sensitive( pUserData->xConnection.is() && !sCommand.isEmpty() );
521  m_xTablePB->set_sensitive( pUserData->nTableAndQueryCount > 1 );
522  }
523  catch (const Exception&)
524  {
525  OSL_FAIL("exception caught in SwAddressListDialog::DetectTablesAndQueries");
526  m_xOK->set_sensitive(false);
527  }
528 }
529 
530 IMPL_LINK(SwAddressListDialog, TableSelectHdl_Impl, weld::Button&, rButton, void)
531 {
532  TableSelectHdl(&rButton);
533 }
534 
536 {
537  weld::WaitObject aWait(m_xDialog.get());
538 
539  int nSelect = m_xListLB->get_selected_index();
540  if (nSelect != -1)
541  {
542  AddressUserData_Impl* pUserData = reinterpret_cast<AddressUserData_Impl*>(m_xListLB->get_id(nSelect).toInt64());
543  //only call the table select dialog if tables have not been searched for or there
544  //are more than 1
545  const OUString sTable = m_xListLB->get_text(nSelect, 1);
546  if( pUserData->nTableAndQueryCount > 1 || pUserData->nTableAndQueryCount == -1)
547  {
548  DetectTablesAndQueries(nSelect, (pButton != nullptr) || sTable.isEmpty());
549  }
550  }
551 }
552 
554 {
555  m_xDialog->response(RET_OK);
556 }
557 
558 uno::Reference< XDataSource> SwAddressListDialog::GetSource()
559 {
560  uno::Reference< XDataSource> xRet;
561  int nSelect = m_xListLB->get_selected_index();
562  if (nSelect != -1)
563  {
564  AddressUserData_Impl* pUserData = reinterpret_cast<AddressUserData_Impl*>(m_xListLB->get_id(nSelect).toInt64());
565  xRet = pUserData->xSource;
566  }
567  return xRet;
568 
569 }
570 
572 {
573  SharedConnection xRet;
574  int nSelect = m_xListLB->get_selected_index();
575  if (nSelect != -1)
576  {
577  AddressUserData_Impl* pUserData = reinterpret_cast<AddressUserData_Impl*>(m_xListLB->get_id(nSelect).toInt64());
578  xRet = pUserData->xConnection;
579  }
580  return xRet;
581 }
582 
583 uno::Reference< XColumnsSupplier> SwAddressListDialog::GetColumnsSupplier()
584 {
585  uno::Reference< XColumnsSupplier> xRet;
586  int nSelect = m_xListLB->get_selected_index();
587  if (nSelect != -1)
588  {
589  AddressUserData_Impl* pUserData = reinterpret_cast<AddressUserData_Impl*>(m_xListLB->get_id(nSelect).toInt64());
590  xRet = pUserData->xColumnsSupplier;
591  }
592  return xRet;
593 }
594 
596 {
597  int nSelect = m_xListLB->get_selected_index();
598  if (nSelect != -1)
599  {
600  AddressUserData_Impl* pUserData = reinterpret_cast<AddressUserData_Impl*>(m_xListLB->get_id(nSelect).toInt64());
601  return pUserData->sFilter;
602  }
603  return OUString();
604 }
605 
606 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
const OUString & GetURL() const
sal_Int32 nCommandType
Definition: swdbdata.hxx:32
SwMailMergeConfigItem & GetConfigItem()
static css::uno::Reference< css::sdbcx::XColumnsSupplier > GetColumnSupplier(css::uno::Reference< css::sdbc::XConnection > const &xConnection, const OUString &rTableOrQuery, SwDBSelect eTableOrQuery=SwDBSelect::UNKNOWN)
Definition: dbmgr.cxx:1969
OUString getBase(sal_Int32 nIndex=LAST_SEGMENT, bool bIgnoreFinalSlash=true, DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
css::uno::Reference< css::sdbcx::XColumnsSupplier > GetColumnsSupplier()
bool UCB_IsReadOnlyFileName(const OUString &rURL)
OUString sDataSource
Definition: swdbdata.hxx:30
const css::uno::Reference< INTERFACE > & getTyped() const
uno::Reference< XDataSource > xSource
SharedConnection GetConnection()
static ImplSVEvent * PostUserEvent(const Link< void *, void > &rLink, void *pCaller=nullptr, bool bReferenceLink=false)
const SwDBData & GetCurrentDBData() const
SharedConnection const & GetConnection()
IMPL_LINK_NOARG(SwAddressListDialog, FilterHdl_Impl, weld::Button &, void)
std::unique_ptr< weld::TreeView > m_xListLB
::utl::SharedUNOComponent< css::sdbc::XConnection > SharedConnection
css::uno::Reference< css::sdbc::XDataSource > const & GetSource()
SwMailMergeWizard * GetWizard()
bool UCB_IsFile(const OUString &rURL)
std::unique_ptr< weld::TreeIter > m_xIter
std::unique_ptr< weld::Button > m_xCreateListPB
css::uno::Reference< css::sdbcx::XColumnsSupplier > const & GetColumnsSupplier()
std::unique_ptr< weld::Button > m_xEditPB
SharedConnection xConnection
std::vector< std::unique_ptr< AddressUserData_Impl > > m_aUserData
css::uno::Reference< css::sdbc::XResultSet > const & GetResultSet() const
void TableSelectHdl(weld::Button *pButton)
css::uno::Reference< css::sdbc::XDataSource > GetSource()
OUString const & GetURL() const
void DetectTablesAndQueries(int Select, bool bWidthDialog)
weld::Window * GetFrameWeld(SfxFrame *pFrame)
Definition: dialoghelp.cxx:20
uno::Reference< sdbc::XResultSet > xResultSet
bool removeFinalSlash()
Reference< XComponentContext > getComponentContext(Reference< XMultiServiceFactory > const &factory)
css::uno::Reference< css::sdb::XDatabaseContext > m_xDBContext
SwDocShell * GetDocShell()
Definition: view.cxx:1115
std::unique_ptr< weld::Button > m_xTablePB
OUString GetMainURL(DecodeMechanism eMechanism, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
Reference< XMultiServiceFactory > getProcessServiceFactory()
static OUString lcl_getFlatURL(uno::Reference< beans::XPropertySet > const &xSourceProperties)
VclPtr< SwMailMergeAddressBlockPage > m_xAddressPage
RET_OK
std::unique_ptr< weld::Label > m_xConnecting
Reference< XComponentContext > getProcessComponentContext()
std::unique_ptr< weld::Label > m_xDescriptionFI
std::unique_ptr< weld::Button > m_xOK
void disposeComponent(css::uno::Reference< TYPE > &_rxComp)
static OUString LoadAndRegisterDataSource(weld::Window *pParent, SwDocShell *pDocShell=nullptr)
Loads a data source from file and registers it.
Definition: dbmgr.cxx:2877
const SwDBData & GetBibliographySource()
Definition: dbconfig.cxx:91
uno::Reference< XColumnsSupplier > xColumnsSupplier
std::unique_ptr< weld::Button > m_xFilterPB
OUString & GetFilter() const
IMPL_LINK(SwAddressListDialog, StaticListBoxSelectHdl_Impl, void *, p, void)
SwAddressListDialog(SwMailMergeAddressBlockPage *pParent)
OUString sCommand
Definition: swdbdata.hxx:31
void EnableKillingFile(bool bEnable=true)
Definition: view.hxx:146
std::unique_ptr< weld::Button > m_xLoadListPB
virtual ~SwAddressListDialog() override
OUString getExtension(sal_Int32 nIndex=LAST_SEGMENT, bool bIgnoreFinalSlash=true, DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
bool removeSegment(sal_Int32 nIndex=LAST_SEGMENT, bool bIgnoreFinalSlash=true)
SVL_DLLPUBLIC OUString SmartRel2Abs(INetURLObject const &rTheBaseURIRef, OUString const &rTheRelURIRef, Link< OUString *, bool > const &rMaybeFileHdl=Link< OUString *, bool >(), bool bCheckFileExists=true, bool bIgnoreFragment=false, INetURLObject::EncodeMechanism eEncodeMechanism=INetURLObject::EncodeMechanism::WasEncoded, INetURLObject::DecodeMechanism eDecodeMechanism=INetURLObject::DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8, FSysStyle eStyle=FSysStyle::Detect)
css::uno::Any SAL_CALL makeAny(const SharedUNOComponent< INTERFACE, COMPONENT > &value)