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 <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"
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>
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
;
76 OUString sURL
; // data is editable
77 sal_Int32 nCommandType
;
78 sal_Int32 nTableAndQueryCount
;
79 AddressUserData_Impl() :
81 nTableAndQueryCount(-1)
85 static OUString
lcl_getFlatURL( uno::Reference
<beans::XPropertySet
> const & xSourceProperties
)
87 if(xSourceProperties
.is())
90 xSourceProperties
->getPropertyValue("URL") >>= sDBURL
;
91 if (sDBURL
.startsWith("sdbc:flat:"))
93 uno::Sequence
<OUString
> aFilters
;
94 xSourceProperties
->getPropertyValue("TableFilter") >>= aFilters
;
95 uno::Sequence
<PropertyValue
> aInfo
;
96 xSourceProperties
->getPropertyValue("Info") >>= aInfo
;
97 if(aFilters
.getLength() == 1 && aInfo
.hasElements() )
101 for(const auto& rInfo
: std::as_const(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
;
120 SwAddressListDialog::SwAddressListDialog(SwMailMergeAddressBlockPage
* pParent
)
121 : SfxDialogController(pParent
->GetWizard()->getDialog(), "modules/swriter/ui/selectaddressdialog.ui", "SelectAddressDialog")
122 , m_bInSelectHdl(false)
123 , m_pAddressPage(pParent
)
124 , m_xDescriptionFI(m_xBuilder
->weld_label("desc"))
125 , m_xConnecting(m_xBuilder
->weld_label("connecting"))
126 , m_xListLB(m_xBuilder
->weld_tree_view("sources"))
127 , m_xLoadListPB(m_xBuilder
->weld_button("add"))
128 , m_xRemovePB(m_xBuilder
->weld_button("remove"))
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())
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 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();
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
)
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
);
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
&)
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_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() );
236 const OUString sCommand
= m_xListLB
->get_text(nSelect
, 1);
237 if (sCommand
.isEmpty())
240 AddressUserData_Impl
* pUserData
= weld::fromId
<AddressUserData_Impl
*>(m_xListLB
->get_id(nSelect
));
241 if (!pUserData
->xConnection
.is() )
246 uno::Reference
<lang::XMultiServiceFactory
> xConnectFactory(pUserData
->xConnection
, UNO_QUERY_THROW
);
247 uno::Reference
<XSingleSelectQueryComposer
> xComposer(
248 xConnectFactory
->createInstance("com.sun.star.sdb.SingleSelectQueryComposer"), UNO_QUERY_THROW
);
250 uno::Reference
<XRowSet
> xRowSet(
251 xMgr
->createInstance("com.sun.star.sdb.RowSet"), UNO_QUERY
);
252 uno::Reference
<XPropertySet
> xRowProperties(xRowSet
, UNO_QUERY
);
253 xRowProperties
->setPropertyValue("DataSourceName",
254 Any(m_xListLB
->get_text(nSelect
, 0)));
255 xRowProperties
->setPropertyValue("Command", Any(sCommand
));
256 xRowProperties
->setPropertyValue("CommandType", Any(pUserData
->nCommandType
));
257 xRowProperties
->setPropertyValue("ActiveConnection", Any(pUserData
->xConnection
.getTyped()));
261 xRowProperties
->getPropertyValue("ActiveCommand")>>= 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();
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
)
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())
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("URL", Any(sDBURL
));
355 //set the filter to the file name without extension
356 uno::Sequence
<OUString
> aFilters
{ sNewName
};
357 xDataProperties
->setPropertyValue("TableFilter", Any(aFilters
));
359 uno::Sequence
<PropertyValue
> aInfo
361 comphelper::makePropertyValue("FieldDelimiter", OUString('\t')),
362 comphelper::makePropertyValue("StringDelimiter", OUString('"')),
363 comphelper::makePropertyValue("Extension", aURL
.getExtension()), //"csv
364 comphelper::makePropertyValue("CharSet", OUString("UTF-8"))
366 xDataProperties
->setPropertyValue("Info", Any(aInfo
));
368 uno::Reference
<sdb::XDocumentDataSource
> xDS(xNewInstance
, UNO_QUERY_THROW
);
369 uno::Reference
<frame::XStorable
> xStore(xDS
->getDatabaseDocument(), UNO_QUERY_THROW
);
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())
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());
422 IMPL_LINK_NOARG(SwAddressListDialog
, ListBoxSelectHdl_Impl
, weld::TreeView
&, void)
424 int 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
435 weld::WaitObject
aWait(m_xDialog
.get());
436 m_bInSelectHdl
= true;
437 AddressUserData_Impl
* pUserData
= nullptr;
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());
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(
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 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
);
496 uno::Reference
<XNameAccess
> xTables
= xTSupplier
->getTables();
497 aTables
= xTables
->getElementNames();
498 nTables
+= aTables
.getLength();
500 uno::Reference
<XQueriesSupplier
> xQSupplier(pUserData
->xConnection
, UNO_QUERY
);
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())
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
;
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
,
545 m_aDBData
.nCommandType
== CommandType::TABLE
?
546 SwDBSelect::TABLE
: SwDBSelect::QUERY
);
548 if( pUserData
->xColumnsSupplier
.is() )
549 m_xListLB
->set_text(nSelect
, m_aDBData
.sCommand
, 1);
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();
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
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();
599 AddressUserData_Impl
* pUserData
= weld::fromId
<AddressUserData_Impl
*>(m_xListLB
->get_id(nSelect
));
600 xRet
= pUserData
->xSource
;
606 SharedConnection
SwAddressListDialog::GetConnection() const
608 SharedConnection xRet
;
609 int nSelect
= m_xListLB
->get_selected_index();
612 AddressUserData_Impl
* pUserData
= weld::fromId
<AddressUserData_Impl
*>(m_xListLB
->get_id(nSelect
));
613 xRet
= pUserData
->xConnection
;
618 uno::Reference
< XColumnsSupplier
> SwAddressListDialog::GetColumnsSupplier() const
620 uno::Reference
< XColumnsSupplier
> xRet
;
621 int nSelect
= m_xListLB
->get_selected_index();
624 AddressUserData_Impl
* pUserData
= weld::fromId
<AddressUserData_Impl
*>(m_xListLB
->get_id(nSelect
));
625 xRet
= pUserData
->xColumnsSupplier
;
630 OUString
SwAddressListDialog::GetFilter() const
632 int nSelect
= m_xListLB
->get_selected_index();
635 AddressUserData_Impl
* pUserData
= weld::fromId
<AddressUserData_Impl
*>(m_xListLB
->get_id(nSelect
));
636 return pUserData
->sFilter
;
641 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */