1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sw.hxx" 26 #ifdef SW_DLLIMPLEMENTATION 27 #undef SW_DLLIMPLEMENTATION 28 #endif 29 #include <swtypes.hxx> 30 #include <addresslistdialog.hxx> 31 #include <selectdbtabledialog.hxx> 32 #include <createaddresslistdialog.hxx> 33 #include <mailmergewizard.hxx> 34 #include <mmconfigitem.hxx> 35 #include <mmaddressblockpage.hxx> 36 #ifndef _DBMGR_HXX 37 #include <dbmgr.hxx> 38 #endif 39 #include <dbconfig.hxx> 40 #include <unotools/tempfile.hxx> 41 #include <vcl/msgbox.hxx> 42 #include <vcl/svapp.hxx> 43 #include <tools/urlobj.hxx> 44 #include <comphelper/processfactory.hxx> 45 #include <comphelper/types.hxx> 46 #include <com/sun/star/sdbc/XCloseable.hpp> 47 #include <com/sun/star/lang/XSingleServiceFactory.hpp> 48 #include <com/sun/star/container/XNameAccess.hpp> 49 #include <com/sun/star/uno/XNamingService.hpp> 50 #include <com/sun/star/sdb/XCompletedConnection.hpp> 51 #include <com/sun/star/sdb/CommandType.hpp> 52 #include <com/sun/star/sdb/XDocumentDataSource.hpp> 53 #include <com/sun/star/sdbc/XRowSet.hpp> 54 #ifndef _COM_SUN_STAR_SDB_XSINGLESELECTQUERYCOMPOSERFACTORY_HPP_ 55 #include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp> 56 #endif 57 #include <com/sun/star/sdbcx/XTablesSupplier.hpp> 58 #include <com/sun/star/sdb/XQueriesSupplier.hpp> 59 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp> 60 #include <com/sun/star/frame/XStorable.hpp> 61 #include <swunohelper.hxx> 62 #include <vcl/waitobj.hxx> 63 #include <unotools/pathoptions.hxx> 64 #include <svl/urihelper.hxx> 65 #include <addresslistdialog.hrc> 66 #include <dbui.hrc> 67 68 #include <helpid.h> 69 #include <unomid.h> 70 71 72 using namespace ::com::sun::star; 73 using namespace ::com::sun::star::uno; 74 using namespace ::com::sun::star::lang; 75 using namespace ::com::sun::star::container; 76 using namespace ::com::sun::star::sdb; 77 using namespace ::com::sun::star::sdbc; 78 using namespace ::com::sun::star::sdbcx; 79 using namespace ::com::sun::star::task; 80 using namespace ::com::sun::star::beans; 81 using namespace ::com::sun::star::ui::dialogs; 82 using namespace ::rtl; 83 84 #define ITEMID_NAME 1 85 #define ITEMID_TABLE 2 86 87 //typedef SharedUNOComponent< XConnection > SharedConnection; 88 89 static const char* cUTF8 = "UTF-8"; 90 /*-- 07.05.2004 14:11:34--------------------------------------------------- 91 92 -----------------------------------------------------------------------*/ 93 struct AddressUserData_Impl 94 { 95 uno::Reference<XDataSource> xSource; 96 SharedConnection xConnection; 97 uno::Reference< XColumnsSupplier> xColumnsSupplier; 98 uno::Reference< sdbc::XResultSet> xResultSet; 99 ::rtl::OUString sFilter; 100 ::rtl::OUString sURL; // data is editable 101 sal_Int32 nCommandType; 102 sal_Int32 nTableAndQueryCount; 103 AddressUserData_Impl() : 104 nCommandType(0), 105 nTableAndQueryCount(-1) 106 {} 107 }; 108 ::rtl::OUString lcl_getFlatURL( uno::Reference<beans::XPropertySet>& xSourceProperties ) 109 { 110 ::rtl::OUString sURL; 111 if(xSourceProperties.is()) 112 { 113 rtl::OUString sDBURL; 114 xSourceProperties->getPropertyValue(C2U("URL")) >>= sDBURL; 115 if(String(sDBURL).SearchAscii("sdbc:flat:") == 0) 116 { 117 uno::Sequence<OUString> aFilters; 118 xSourceProperties->getPropertyValue(C2U("TableFilter")) >>= aFilters; 119 uno::Sequence<PropertyValue> aInfo; 120 xSourceProperties->getPropertyValue(C2U("Info")) >>= aInfo; 121 if(aFilters.getLength() == 1 && aInfo.getLength() ) 122 { 123 ::rtl::OUString sFieldDelim; 124 ::rtl::OUString sStringDelim; 125 ::rtl::OUString sExtension; 126 ::rtl::OUString sCharSet; 127 for(sal_Int32 nInfo = 0; nInfo < aInfo.getLength(); ++nInfo) 128 { 129 if(aInfo[nInfo].Name == C2U("FieldDelimiter")) 130 aInfo[nInfo].Value >>= sFieldDelim; 131 else if(aInfo[nInfo].Name == C2U("StringDelimiter")) 132 aInfo[nInfo].Value >>= sStringDelim; 133 else if(aInfo[nInfo].Name == C2U("Extension")) 134 aInfo[nInfo].Value >>= sExtension; 135 else if(aInfo[nInfo].Name == C2U("CharSet")) 136 aInfo[nInfo].Value >>= sCharSet; 137 } 138 if(!sCharSet.compareToAscii( cUTF8 )) 139 { 140 sURL = String(sDBURL).Copy( 10 ); 141 //#i97577# at this point the 'URL' can also be a file name! 142 sURL = URIHelper::SmartRel2Abs( INetURLObject(), sURL ); 143 sURL += C2U("/"); 144 sURL += aFilters[0]; 145 sURL += C2U("."); 146 sURL += sExtension; 147 } 148 } 149 } 150 } 151 return sURL; 152 } 153 /*-- 07.04.2004 16:35:43--------------------------------------------------- 154 155 -----------------------------------------------------------------------*/ 156 SwAddressListDialog::SwAddressListDialog(SwMailMergeAddressBlockPage* pParent) : 157 SfxModalDialog(pParent, SW_RES(DLG_MM_ADDRESSLISTDIALOG)), 158 #ifdef MSC 159 #pragma warning (disable : 4355) 160 #endif 161 m_aDescriptionFI( this, SW_RES( FI_DESCRIPTION )), 162 m_aListFT( this, SW_RES( FT_LIST )), 163 m_aListHB( this, WB_BUTTONSTYLE | WB_BOTTOMBORDER), 164 m_aListLB( this, SW_RES( LB_LIST )), 165 m_aLoadListPB( this, SW_RES( PB_LOADLIST )), 166 m_aCreateListPB(this, SW_RES( PB_CREATELIST )), 167 m_aFilterPB( this, SW_RES( PB_FILTER )), 168 m_aEditPB(this, SW_RES( PB_EDIT )), 169 m_aTablePB(this, SW_RES( PB_TABLE )), 170 m_aSeparatorFL(this, SW_RES( FL_SEPARATOR )), 171 m_aOK( this, SW_RES( PB_OK )), 172 m_aCancel( this, SW_RES( PB_CANCEL )), 173 m_aHelp( this, SW_RES( PB_HELP )), 174 #ifdef MSC 175 #pragma warning (default : 4355) 176 #endif 177 m_sName( SW_RES( ST_NAME )), 178 m_sTable( SW_RES( ST_TABLE )), 179 m_sConnecting( SW_RES( ST_CONNECTING )), 180 m_pCreatedDataSource(0), 181 m_bInSelectHdl(false), 182 m_pAddressPage(pParent) 183 { 184 FreeResource(); 185 String sTemp(m_aDescriptionFI.GetText()); 186 sTemp.SearchAndReplaceAscii("%1", m_aLoadListPB.GetText()); 187 sTemp.SearchAndReplaceAscii("%2", m_aCreateListPB.GetText()); 188 m_aDescriptionFI.SetText(sTemp); 189 m_aFilterPB.SetClickHdl( LINK( this, SwAddressListDialog, FilterHdl_Impl )); 190 m_aLoadListPB.SetClickHdl( LINK( this, SwAddressListDialog, LoadHdl_Impl )); 191 m_aCreateListPB.SetClickHdl( LINK( this, SwAddressListDialog,CreateHdl_Impl )); 192 m_aEditPB.SetClickHdl(LINK( this, SwAddressListDialog, EditHdl_Impl)); 193 m_aTablePB.SetClickHdl(LINK( this, SwAddressListDialog, TableSelectHdl_Impl)); 194 195 Size aLBSize(m_aListLB.GetSizePixel()); 196 m_aListHB.SetSizePixel(aLBSize); 197 Size aHeadSize(m_aListHB.CalcWindowSizePixel()); 198 aHeadSize.Width() = aLBSize.Width(); 199 m_aListHB.SetSizePixel(aHeadSize); 200 Point aLBPos(m_aListLB.GetPosPixel()); 201 m_aListHB.SetPosPixel(aLBPos); 202 aLBPos.Y() += aHeadSize.Height(); 203 aLBSize.Height() -= aHeadSize.Height(); 204 m_aListLB.SetPosSizePixel(aLBPos, aLBSize); 205 206 Size aSz(m_aListHB.GetOutputSizePixel()); 207 m_aListHB.InsertItem( ITEMID_NAME, m_sName, 208 aSz.Width()/2, 209 HIB_LEFT | HIB_VCENTER | HIB_FIXED | HIB_FIXEDPOS/*| HIB_CLICKABLE | HIB_UPARROW */); 210 m_aListHB.InsertItem( ITEMID_TABLE, m_sTable, 211 aSz.Width()/2, 212 HIB_LEFT | HIB_VCENTER | HIB_FIXED | HIB_FIXEDPOS /*| HIB_CLICKABLE | HIB_UPARROW */); 213 m_aListHB.SetHelpId(HID_MM_ADDRESSLIST_HB ); 214 m_aListHB.Show(); 215 216 m_aListLB.SetHelpId(HID_MM_ADDRESSLIST_TLB); 217 static long nTabs[] = {2, 0, aSz.Width()/2 }; 218 m_aListLB.SetStyle( m_aListLB.GetStyle() | WB_SORT | WB_HSCROLL | WB_CLIPCHILDREN | WB_TABSTOP ); 219 m_aListLB.SetSelectionMode( SINGLE_SELECTION ); 220 m_aListLB.SetTabs(&nTabs[0], MAP_PIXEL); 221 m_aOK.SetClickHdl( LINK( this, SwAddressListDialog, OKHdl_Impl)); 222 223 uno::Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() ); 224 if( xMgr.is() ) 225 { 226 uno::Reference<XInterface> xInstance = xMgr->createInstance( C2U( "com.sun.star.sdb.DatabaseContext" )); 227 m_xDBContext = uno::Reference<XNameAccess>(xInstance, UNO_QUERY) ; 228 } 229 SwMailMergeConfigItem& rConfigItem = m_pAddressPage->GetWizard()->GetConfigItem(); 230 const SwDBData& rCurrentData = rConfigItem.GetCurrentDBData(); 231 232 DBG_ASSERT(m_xDBContext.is(), "service 'com.sun.star.sdb.DatabaseContext' not found!"); 233 sal_Bool bEnableEdit = sal_False; 234 sal_Bool bEnableOK = sal_True; 235 m_aListLB.SelectAll( sal_False ); 236 237 if(m_xDBContext.is()) 238 { 239 SwDBConfig aDb; 240 ::rtl::OUString sBibliography = aDb.GetBibliographySource().sDataSource; 241 uno::Sequence< ::rtl::OUString> aNames = m_xDBContext->getElementNames(); 242 const ::rtl::OUString* pNames = aNames.getConstArray(); 243 for(sal_Int32 nName = 0; nName < aNames.getLength(); ++nName) 244 { 245 if ( pNames[nName] == sBibliography ) 246 continue; 247 SvLBoxEntry* pEntry = m_aListLB.InsertEntry(pNames[nName]); 248 AddressUserData_Impl* pUserData = new AddressUserData_Impl(); 249 pEntry->SetUserData(pUserData); 250 if(pNames[nName] == rCurrentData.sDataSource) 251 { 252 m_aListLB.Select(pEntry); 253 m_aListLB.SetEntryText(rCurrentData.sCommand, pEntry, ITEMID_TABLE - 1); 254 pUserData->nCommandType = rCurrentData.nCommandType; 255 pUserData->xSource = rConfigItem.GetSource(); 256 pUserData->xConnection = rConfigItem.GetConnection(); 257 pUserData->xColumnsSupplier = rConfigItem.GetColumnsSupplier(); 258 pUserData->xResultSet = rConfigItem.GetResultSet(); 259 pUserData->sFilter = rConfigItem.GetFilter(); 260 //is the data source editable (csv, Unicode, single table) 261 uno::Reference<beans::XPropertySet> xSourceProperties; 262 try 263 { 264 m_xDBContext->getByName(pNames[nName]) >>= xSourceProperties; 265 pUserData->sURL = lcl_getFlatURL( xSourceProperties ); 266 bEnableEdit = pUserData->sURL.getLength() > 0 && 267 SWUnoHelper::UCB_IsFile( pUserData->sURL ) && //#i97577# 268 !SWUnoHelper::UCB_IsReadOnlyFileName( pUserData->sURL ); 269 } 270 catch(const uno::Exception& ) 271 { 272 bEnableOK = sal_False; 273 } 274 m_aDBData = rCurrentData; 275 } 276 } 277 } 278 m_aOK.Enable(m_aListLB.GetEntryCount()>0 && bEnableOK); 279 m_aEditPB.Enable(bEnableEdit); 280 m_aListLB.SetSelectHdl(LINK(this, SwAddressListDialog, ListBoxSelectHdl_Impl)); 281 TableSelectHdl_Impl(NULL); 282 } 283 /*-- 07.04.2004 16:35:43--------------------------------------------------- 284 285 -----------------------------------------------------------------------*/ 286 SwAddressListDialog::~SwAddressListDialog() 287 { 288 SvLBoxEntry* pEntry = m_aListLB.First(); 289 while(pEntry) 290 { 291 AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pEntry->GetUserData()); 292 delete pUserData; 293 pEntry = m_aListLB.Next( pEntry ); 294 } 295 } 296 /*-- 07.04.2004 16:35:44--------------------------------------------------- 297 298 -----------------------------------------------------------------------*/ 299 IMPL_LINK(SwAddressListDialog, FilterHdl_Impl, PushButton*, EMPTYARG) 300 { 301 SvLBoxEntry* pSelect = m_aListLB.FirstSelected(); 302 uno::Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() ); 303 if(pSelect && xMgr.is()) 304 { 305 String sCommand = m_aListLB.GetEntryText(pSelect, ITEMID_TABLE - 1); 306 if ( !sCommand.Len() ) 307 return 0; 308 309 AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); 310 if(pUserData->xConnection.is() ) 311 { 312 try 313 { 314 uno::Reference<lang::XMultiServiceFactory> xConnectFactory(pUserData->xConnection, UNO_QUERY_THROW); 315 uno::Reference<XSingleSelectQueryComposer> xComposer( 316 xConnectFactory->createInstance(C2U("com.sun.star.sdb.SingleSelectQueryComposer")), UNO_QUERY_THROW); 317 318 PropertyValue aSecond; 319 aSecond.Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "RowSet" ) ); 320 uno::Reference<XRowSet> xRowSet( 321 xMgr->createInstance(C2U("com.sun.star.sdb.RowSet")), UNO_QUERY); 322 uno::Reference<XPropertySet> xRowProperties(xRowSet, UNO_QUERY); 323 xRowProperties->setPropertyValue(C2U("DataSourceName"), 324 makeAny(OUString(m_aListLB.GetEntryText(pSelect, ITEMID_NAME - 1)))); 325 xRowProperties->setPropertyValue(C2U("Command"), makeAny( 326 OUString(sCommand))); 327 xRowProperties->setPropertyValue(C2U("CommandType"), makeAny(pUserData->nCommandType)); 328 xRowProperties->setPropertyValue(C2U("ActiveConnection"), makeAny(pUserData->xConnection.getTyped())); 329 xRowSet->execute(); 330 aSecond.Value <<= xRowSet; 331 332 PropertyValue aFirst; 333 aFirst.Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "QueryComposer" ) ); 334 ::rtl::OUString sQuery; 335 xRowProperties->getPropertyValue(C2U("ActiveCommand"))>>= sQuery; 336 xComposer->setQuery(sQuery); 337 if(pUserData->sFilter.getLength()) 338 xComposer->setFilter(pUserData->sFilter); 339 aFirst.Value <<= xComposer; 340 341 uno::Sequence<Any> aInit(2); 342 aInit[0] <<= aFirst; 343 aInit[1] <<= aSecond; 344 345 ::rtl::OUString sDialogServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.FilterDialog" ) ); 346 uno::Reference< XExecutableDialog> xDialog( 347 xMgr->createInstanceWithArguments( sDialogServiceName, aInit ), UNO_QUERY); 348 349 if ( RET_OK == xDialog->execute() ) 350 { 351 WaitObject aWO( NULL ); 352 pUserData->sFilter = xComposer->getFilter(); 353 } 354 ::comphelper::disposeComponent(xRowSet); 355 } 356 catch(Exception& ) 357 { 358 DBG_ERROR("exception caught in SwAddressListDialog::FilterHdl_Impl"); 359 } 360 } 361 } 362 return 0; 363 } 364 /*-- 07.04.2004 16:35:44--------------------------------------------------- 365 366 -----------------------------------------------------------------------*/ 367 IMPL_LINK(SwAddressListDialog, LoadHdl_Impl, PushButton*, EMPTYARG) 368 { 369 String sNewSource = SwNewDBMgr::LoadAndRegisterDataSource(); 370 if(sNewSource.Len()) 371 { 372 SvLBoxEntry* pNewSource = m_aListLB.InsertEntry(sNewSource); 373 pNewSource->SetUserData(new AddressUserData_Impl()); 374 m_aListLB.Select(pNewSource); 375 } 376 return 0; 377 } 378 /*-- 07.04.2004 16:35:44--------------------------------------------------- 379 380 -----------------------------------------------------------------------*/ 381 IMPL_LINK(SwAddressListDialog, CreateHdl_Impl, PushButton*, pButton) 382 { 383 String sInputURL; 384 SwCreateAddressListDialog* pDlg = 385 new SwCreateAddressListDialog( 386 pButton, 387 sInputURL, 388 m_pAddressPage->GetWizard()->GetConfigItem()); 389 if(RET_OK == pDlg->Execute()) 390 { 391 //register the URL a new datasource 392 OUString sURL = pDlg->GetURL(); 393 try 394 { 395 uno::Reference<XSingleServiceFactory> xFact( m_xDBContext, UNO_QUERY); 396 uno::Reference<XInterface> xNewInstance = xFact->createInstance(); 397 INetURLObject aURL( sURL ); 398 OUString sNewName = aURL.getBase(); 399 //find a unique name if sNewName already exists 400 OUString sFind(sNewName); 401 sal_Int32 nIndex = 0; 402 while(m_xDBContext->hasByName(sFind)) 403 { 404 sFind = sNewName; 405 sFind += OUString::valueOf(++nIndex); 406 } 407 uno::Reference<XPropertySet> xDataProperties(xNewInstance, UNO_QUERY); 408 409 OUString sDBURL(C2U("sdbc:flat:")); 410 //only the 'path' has to be added 411 INetURLObject aTempURL(aURL); 412 aTempURL.removeSegment(); 413 aTempURL.removeFinalSlash(); 414 sDBURL += aTempURL.GetMainURL(INetURLObject::NO_DECODE); 415 Any aAny(&sDBURL, ::getCppuType(&sDBURL)); 416 xDataProperties->setPropertyValue(C2U("URL"), aAny); 417 //set the filter to the file name without extension 418 uno::Sequence<OUString> aFilters(1); 419 aFilters[0] = sNewName; 420 aAny <<= aFilters; 421 xDataProperties->setPropertyValue(C2U("TableFilter"), aAny); 422 423 uno::Sequence<PropertyValue> aInfo(4); 424 PropertyValue* pInfo = aInfo.getArray(); 425 pInfo[0].Name = C2U("FieldDelimiter"); 426 pInfo[0].Value <<= OUString(String('\t')); 427 pInfo[1].Name = C2U("StringDelimiter"); 428 pInfo[1].Value <<= OUString('"'); 429 pInfo[2].Name = C2U("Extension"); 430 pInfo[2].Value <<= ::rtl::OUString(aURL.getExtension());//C2U("csv"); 431 pInfo[3].Name = C2U("CharSet"); 432 pInfo[3].Value <<= C2U(cUTF8); 433 aAny <<= aInfo; 434 xDataProperties->setPropertyValue(C2U("Info"), aAny); 435 436 uno::Reference<sdb::XDocumentDataSource> xDS(xNewInstance, UNO_QUERY_THROW); 437 uno::Reference<frame::XStorable> xStore(xDS->getDatabaseDocument(), UNO_QUERY_THROW); 438 String sExt = String::CreateFromAscii(".odb"); 439 String sTmpName; 440 { 441 String sHomePath(SvtPathOptions().GetWorkPath()); 442 utl::TempFile aTempFile(sFind , &sExt, &sHomePath); 443 aTempFile.EnableKillingFile(sal_True); 444 sTmpName = aTempFile.GetURL(); 445 } 446 xStore->storeAsURL(sTmpName, Sequence< PropertyValue >()); 447 448 449 uno::Reference<XNamingService> xNaming(m_xDBContext, UNO_QUERY); 450 xNaming->registerObject( sFind, xNewInstance ); 451 //now insert the new source into the ListBox 452 String sEntry(sFind); 453 sEntry += '\t'; 454 sEntry += String(aFilters[0]); 455 m_pCreatedDataSource = m_aListLB.InsertEntry(sEntry); 456 AddressUserData_Impl* pUserData = new AddressUserData_Impl(); 457 pUserData->sURL = sURL; 458 m_pCreatedDataSource->SetUserData(pUserData); 459 m_aListLB.Select(m_pCreatedDataSource); 460 m_aCreateListPB.Enable(sal_False); 461 462 } 463 catch(Exception& ) 464 { 465 } 466 } 467 delete pDlg; 468 return 0; 469 } 470 /*-- 22.04.2004 10:30:40--------------------------------------------------- 471 472 -----------------------------------------------------------------------*/ 473 IMPL_LINK(SwAddressListDialog, EditHdl_Impl, PushButton*, pButton) 474 { 475 SvLBoxEntry* pEntry = m_aListLB.FirstSelected(); 476 AddressUserData_Impl* pUserData = pEntry ? static_cast<AddressUserData_Impl*>(pEntry->GetUserData()) : 0; 477 if(pUserData && pUserData->sURL.getLength()) 478 { 479 if(pUserData->xResultSet.is()) 480 { 481 SwMailMergeConfigItem& rConfigItem = m_pAddressPage->GetWizard()->GetConfigItem(); 482 if(rConfigItem.GetResultSet() != pUserData->xResultSet) 483 ::comphelper::disposeComponent( pUserData->xResultSet ); 484 pUserData->xResultSet = 0; 485 486 rConfigItem.DisposeResultSet(); 487 } 488 pUserData->xSource.clear(); 489 pUserData->xColumnsSupplier.clear(); 490 pUserData->xConnection.clear(); 491 // will automatically close if it was the las reference 492 SwCreateAddressListDialog* pDlg = 493 new SwCreateAddressListDialog( 494 pButton, 495 pUserData->sURL, 496 m_pAddressPage->GetWizard()->GetConfigItem()); 497 if(RET_OK == pDlg->Execute()) 498 { 499 } 500 delete pDlg; 501 } 502 return 0; 503 }; 504 /*-- 19.04.2004 09:41:05--------------------------------------------------- 505 506 -----------------------------------------------------------------------*/ 507 IMPL_LINK(SwAddressListDialog, ListBoxSelectHdl_Impl, SvTabListBox*, EMPTYARG) 508 { 509 SvLBoxEntry* pSelect = m_aListLB.FirstSelected(); 510 Application::PostUserEvent( STATIC_LINK( this, SwAddressListDialog, 511 StaticListBoxSelectHdl_Impl ), pSelect ); 512 return 0; 513 } 514 IMPL_STATIC_LINK(SwAddressListDialog, StaticListBoxSelectHdl_Impl, SvLBoxEntry*, pSelect) 515 { 516 //prevent nested calls of the select handler 517 if(pThis->m_bInSelectHdl) 518 return 0; 519 pThis->EnterWait(); 520 pThis->m_bInSelectHdl = true; 521 AddressUserData_Impl* pUserData = 0; 522 if(pSelect) 523 { 524 String sTable = pThis->m_aListLB.GetEntryText(pSelect, ITEMID_TABLE - 1); 525 if(!sTable.Len()) 526 { 527 pThis->m_aListLB.SetEntryText(pThis->m_sConnecting, pSelect, ITEMID_TABLE - 1); 528 // allow painting of the new entry 529 pThis->m_aListLB.Window::Invalidate(INVALIDATE_UPDATE); 530 for (sal_uInt16 i = 0; i < 10; i++) 531 Application::Reschedule(); 532 } 533 534 pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); 535 if(pUserData->nTableAndQueryCount > 1 || pUserData->nTableAndQueryCount == -1) 536 { 537 pThis->DetectTablesAndQueries(pSelect, !sTable.Len()); 538 } 539 else 540 { 541 //otherwise set the selected db-data 542 pThis->m_aDBData.sDataSource = pThis->m_aListLB.GetEntryText(pSelect, ITEMID_NAME - 1); 543 pThis->m_aDBData.sCommand = pThis->m_aListLB.GetEntryText(pSelect, ITEMID_TABLE - 1); 544 pThis->m_aDBData.nCommandType = pUserData->nCommandType; 545 pThis->m_aOK.Enable(sal_True); 546 } 547 sTable = pThis->m_aListLB.GetEntryText(pSelect, ITEMID_TABLE - 1); 548 if(sTable == pThis->m_sConnecting) 549 pThis->m_aListLB.SetEntryText(String(), pSelect, ITEMID_TABLE - 1); 550 } 551 pThis->m_aEditPB.Enable(pUserData && pUserData->sURL.getLength() && 552 SWUnoHelper::UCB_IsFile( pUserData->sURL ) && //#i97577# 553 !SWUnoHelper::UCB_IsReadOnlyFileName( pUserData->sURL ) ); 554 pThis->m_bInSelectHdl = false; 555 pThis->LeaveWait(); 556 return 0; 557 } 558 559 /*-- 13.05.2004 14:59:25--------------------------------------------------- 560 detect the number of tables for a data source 561 if only one is available then set it at the entry 562 -----------------------------------------------------------------------*/ 563 void SwAddressListDialog::DetectTablesAndQueries( 564 SvLBoxEntry* pSelect, 565 bool bWidthDialog) 566 { 567 try 568 { 569 AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); 570 uno::Reference<XCompletedConnection> xComplConnection; 571 if(!pUserData->xConnection.is()) 572 { 573 m_aDBData.sDataSource = m_aListLB.GetEntryText(pSelect, ITEMID_NAME - 1); 574 m_xDBContext->getByName(m_aDBData.sDataSource) >>= xComplConnection; 575 pUserData->xSource = uno::Reference<XDataSource>(xComplConnection, UNO_QUERY); 576 577 uno::Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() ); 578 uno::Reference< XInteractionHandler > xHandler( 579 xMgr->createInstance( C2U( "com.sun.star.task.InteractionHandler" )), UNO_QUERY); 580 pUserData->xConnection = SharedConnection( xComplConnection->connectWithCompletion( xHandler ) ); 581 } 582 if(pUserData->xConnection.is()) 583 { 584 sal_Int32 nTables = 0; 585 uno::Sequence<rtl::OUString> aTables; 586 uno::Sequence<rtl::OUString> aQueries; 587 uno::Reference<XTablesSupplier> xTSupplier(pUserData->xConnection, UNO_QUERY); 588 if(xTSupplier.is()) 589 { 590 uno::Reference<XNameAccess> xTbls = xTSupplier->getTables(); 591 aTables = xTbls->getElementNames(); 592 nTables += aTables.getLength(); 593 } 594 uno::Reference<XQueriesSupplier> xQSupplier(pUserData->xConnection, UNO_QUERY); 595 if(xQSupplier.is()) 596 { 597 uno::Reference<XNameAccess> xQueries = xQSupplier->getQueries(); 598 aQueries = xQueries->getElementNames(); 599 nTables += aQueries.getLength(); 600 } 601 pUserData->nTableAndQueryCount = nTables; 602 if(nTables > 1 && bWidthDialog) 603 { 604 //now call the table select dialog - if more than one table exists 605 SwSelectDBTableDialog* pDlg = new SwSelectDBTableDialog(this, pUserData->xConnection); 606 String sTable = m_aListLB.GetEntryText(pSelect, ITEMID_TABLE - 1); 607 if(sTable.Len()) 608 pDlg->SetSelectedTable(sTable, pUserData->nCommandType == CommandType::TABLE); 609 if(RET_OK == pDlg->Execute()) 610 { 611 bool bIsTable; 612 m_aDBData.sCommand = pDlg->GetSelectedTable(bIsTable); 613 m_aDBData.nCommandType = bIsTable ? CommandType::TABLE : CommandType::QUERY; 614 pUserData->nCommandType = m_aDBData.nCommandType; 615 } 616 delete pDlg; 617 } 618 else if(nTables == 1) 619 { 620 if(aTables.getLength()) 621 { 622 m_aDBData.sCommand = aTables[0]; 623 m_aDBData.nCommandType = CommandType::TABLE; 624 } 625 else 626 { 627 m_aDBData.sCommand = aQueries[0]; 628 m_aDBData.nCommandType = CommandType::QUERY; 629 } 630 } 631 } 632 if ( m_aDBData.sCommand.getLength() ) 633 { 634 uno::Reference<beans::XPropertySet> xSourceProperties; 635 m_xDBContext->getByName(m_aDBData.sDataSource) >>= xSourceProperties; 636 pUserData->sURL = lcl_getFlatURL( xSourceProperties ); 637 638 pUserData->xColumnsSupplier = SwNewDBMgr::GetColumnSupplier(pUserData->xConnection, 639 m_aDBData.sCommand, 640 m_aDBData.nCommandType == CommandType::TABLE ? 641 SW_DB_SELECT_TABLE : SW_DB_SELECT_QUERY ); 642 //#i97577# 643 if( pUserData->xColumnsSupplier.is() ) 644 m_aListLB.SetEntryText(m_aDBData.sCommand, pSelect, ITEMID_TABLE - 1); 645 else 646 m_aListLB.SetEntryText(String(), pSelect, ITEMID_TABLE - 1); 647 } 648 String sCommand = m_aListLB.GetEntryText(pSelect, ITEMID_TABLE - 1); 649 m_aOK.Enable(pSelect && sCommand.Len()); 650 m_aFilterPB.Enable( pUserData->xConnection.is() && sCommand.Len() ); 651 m_aTablePB.Enable( pUserData->nTableAndQueryCount > 1 ); 652 } 653 catch(Exception& ) 654 { 655 DBG_ERROR("exception caught in SwAddressListDialog::DetectTablesAndQueries"); 656 m_aOK.Enable( sal_False ); 657 } 658 } 659 660 /*-- 13.05.2004 12:55:40--------------------------------------------------- 661 662 -----------------------------------------------------------------------*/ 663 IMPL_LINK(SwAddressListDialog, TableSelectHdl_Impl, PushButton*, pButton) 664 { 665 EnterWait(); 666 SvLBoxEntry* pSelect = m_aListLB.FirstSelected(); 667 if(pSelect) 668 { 669 AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); 670 //only call the table select dialog if tables have not been searched for or there 671 //are more than 1 672 String sTable = m_aListLB.GetEntryText(pSelect, ITEMID_TABLE - 1); 673 if( pUserData->nTableAndQueryCount > 1 || pUserData->nTableAndQueryCount == -1) 674 { 675 DetectTablesAndQueries(pSelect, (pButton != 0) || (!sTable.Len())); 676 } 677 } 678 679 LeaveWait(); 680 return 0; 681 } 682 683 /*-- 08.04.2004 14:52:11--------------------------------------------------- 684 685 -----------------------------------------------------------------------*/ 686 IMPL_LINK(SwAddressListDialog, OKHdl_Impl, PushButton*, EMPTYARG) 687 { 688 EndDialog(sal_True); 689 return 0; 690 } 691 692 /*-- 07.05.2004 14:17:47--------------------------------------------------- 693 694 -----------------------------------------------------------------------*/ 695 uno::Reference< XDataSource> SwAddressListDialog::GetSource() 696 { 697 uno::Reference< XDataSource> xRet; 698 SvLBoxEntry* pSelect = m_aListLB.FirstSelected(); 699 if(pSelect) 700 { 701 AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); 702 xRet = pUserData->xSource; 703 } 704 return xRet; 705 706 } 707 /*-- 07.05.2004 14:17:48--------------------------------------------------- 708 709 -----------------------------------------------------------------------*/ 710 SharedConnection SwAddressListDialog::GetConnection() 711 { 712 SharedConnection xRet; 713 SvLBoxEntry* pSelect = m_aListLB.FirstSelected(); 714 if(pSelect) 715 { 716 AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); 717 xRet = pUserData->xConnection; 718 } 719 return xRet; 720 } 721 /*-- 07.05.2004 14:17:48--------------------------------------------------- 722 723 -----------------------------------------------------------------------*/ 724 uno::Reference< XColumnsSupplier> SwAddressListDialog::GetColumnsSupplier() 725 { 726 uno::Reference< XColumnsSupplier> xRet; 727 SvLBoxEntry* pSelect = m_aListLB.FirstSelected(); 728 if(pSelect) 729 { 730 AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); 731 xRet = pUserData->xColumnsSupplier; 732 } 733 return xRet; 734 } 735 /*-- 14.05.2004 15:04:09--------------------------------------------------- 736 737 -----------------------------------------------------------------------*/ 738 ::rtl::OUString SwAddressListDialog::GetFilter() 739 { 740 ::rtl::OUString sRet; 741 SvLBoxEntry* pSelect = m_aListLB.FirstSelected(); 742 if(pSelect) 743 { 744 AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); 745 sRet = pUserData->sFilter; 746 } 747 return sRet; 748 } 749