diff options
Diffstat (limited to 'sw/source/ui/dbui/addresslistdialog.cxx')
-rw-r--r-- | sw/source/ui/dbui/addresslistdialog.cxx | 752 |
1 files changed, 752 insertions, 0 deletions
diff --git a/sw/source/ui/dbui/addresslistdialog.cxx b/sw/source/ui/dbui/addresslistdialog.cxx new file mode 100644 index 000000000000..dc007fc68e13 --- /dev/null +++ b/sw/source/ui/dbui/addresslistdialog.cxx @@ -0,0 +1,752 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sw.hxx" +#ifdef SW_DLLIMPLEMENTATION +#undef SW_DLLIMPLEMENTATION +#endif +#include <swtypes.hxx> +#include <addresslistdialog.hxx> +#include <selectdbtabledialog.hxx> +#include <createaddresslistdialog.hxx> +#include <mailmergewizard.hxx> +#include <mmconfigitem.hxx> +#include <mmaddressblockpage.hxx> +#ifndef _DBMGR_HXX +#include <dbmgr.hxx> +#endif +#include <dbconfig.hxx> +#include <unotools/tempfile.hxx> +#include <vcl/msgbox.hxx> +#include <vcl/svapp.hxx> +#include <tools/urlobj.hxx> +#include <comphelper/processfactory.hxx> +#include <comphelper/types.hxx> +#include <com/sun/star/sdbc/XCloseable.hpp> +#include <com/sun/star/lang/XSingleServiceFactory.hpp> +#include <com/sun/star/container/XNameAccess.hpp> +#include <com/sun/star/uno/XNamingService.hpp> +#include <com/sun/star/sdb/XCompletedConnection.hpp> +#include <com/sun/star/sdb/CommandType.hpp> +#include <com/sun/star/sdb/XDocumentDataSource.hpp> +#include <com/sun/star/sdbc/XRowSet.hpp> +#ifndef _COM_SUN_STAR_SDB_XSINGLESELECTQUERYCOMPOSERFACTORY_HPP_ +#include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp> +#endif +#include <com/sun/star/sdbcx/XTablesSupplier.hpp> +#include <com/sun/star/sdb/XQueriesSupplier.hpp> +#include <com/sun/star/ui/dialogs/XExecutableDialog.hpp> +#include <com/sun/star/frame/XStorable.hpp> +#include <swunohelper.hxx> +#include <vcl/waitobj.hxx> +#include <unotools/pathoptions.hxx> +#include <svl/urihelper.hxx> +#include <addresslistdialog.hrc> +#include <dbui.hrc> + +#include <helpid.h> +#include <unomid.h> + + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::sdb; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::sdbcx; +using namespace ::com::sun::star::task; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::ui::dialogs; +using namespace ::rtl; + +#define ITEMID_NAME 1 +#define ITEMID_TABLE 2 + +//typedef SharedUNOComponent< XConnection > SharedConnection; + +static const char* cUTF8 = "UTF-8"; +/*-- 07.05.2004 14:11:34--------------------------------------------------- + + -----------------------------------------------------------------------*/ +struct AddressUserData_Impl +{ + uno::Reference<XDataSource> xSource; + SharedConnection xConnection; + uno::Reference< XColumnsSupplier> xColumnsSupplier; + uno::Reference< sdbc::XResultSet> xResultSet; + ::rtl::OUString sFilter; + ::rtl::OUString sURL; // data is editable + sal_Int32 nCommandType; + sal_Int32 nTableAndQueryCount; + AddressUserData_Impl() : + nCommandType(0), + nTableAndQueryCount(-1) + {} +}; +::rtl::OUString lcl_getFlatURL( uno::Reference<beans::XPropertySet>& xSourceProperties ) +{ + ::rtl::OUString sURL; + if(xSourceProperties.is()) + { + rtl::OUString sDBURL; + xSourceProperties->getPropertyValue(C2U("URL")) >>= sDBURL; + if(String(sDBURL).SearchAscii("sdbc:flat:") == 0) + { + uno::Sequence<OUString> aFilters; + xSourceProperties->getPropertyValue(C2U("TableFilter")) >>= aFilters; + uno::Sequence<PropertyValue> aInfo; + xSourceProperties->getPropertyValue(C2U("Info")) >>= aInfo; + if(aFilters.getLength() == 1 && aInfo.getLength() ) + { + ::rtl::OUString sFieldDelim; + ::rtl::OUString sStringDelim; + ::rtl::OUString sExtension; + ::rtl::OUString sCharSet; + for(sal_Int32 nInfo = 0; nInfo < aInfo.getLength(); ++nInfo) + { + if(aInfo[nInfo].Name == C2U("FieldDelimiter")) + aInfo[nInfo].Value >>= sFieldDelim; + else if(aInfo[nInfo].Name == C2U("StringDelimiter")) + aInfo[nInfo].Value >>= sStringDelim; + else if(aInfo[nInfo].Name == C2U("Extension")) + aInfo[nInfo].Value >>= sExtension; + else if(aInfo[nInfo].Name == C2U("CharSet")) + aInfo[nInfo].Value >>= sCharSet; + } + if(!sCharSet.compareToAscii( cUTF8 )) + { + sURL = String(sDBURL).Copy( 10 ); + //#i97577# at this point the 'URL' can also be a file name! + sURL = URIHelper::SmartRel2Abs( INetURLObject(), sURL ); + sURL += C2U("/"); + sURL += aFilters[0]; + sURL += C2U("."); + sURL += sExtension; + } + } + } + } + return sURL; +} +/*-- 07.04.2004 16:35:43--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwAddressListDialog::SwAddressListDialog(SwMailMergeAddressBlockPage* pParent) : + SfxModalDialog(pParent, SW_RES(DLG_MM_ADDRESSLISTDIALOG)), +#ifdef MSC +#pragma warning (disable : 4355) +#endif + m_aDescriptionFI( this, SW_RES( FI_DESCRIPTION )), + m_aListFT( this, SW_RES( FT_LIST )), + m_aListHB( this, WB_BUTTONSTYLE | WB_BOTTOMBORDER), + m_aListLB( this, SW_RES( LB_LIST )), + m_aLoadListPB( this, SW_RES( PB_LOADLIST )), + m_aCreateListPB(this, SW_RES( PB_CREATELIST )), + m_aFilterPB( this, SW_RES( PB_FILTER )), + m_aEditPB(this, SW_RES( PB_EDIT )), + m_aTablePB(this, SW_RES( PB_TABLE )), + m_aSeparatorFL(this, SW_RES( FL_SEPARATOR )), + m_aOK( this, SW_RES( PB_OK )), + m_aCancel( this, SW_RES( PB_CANCEL )), + m_aHelp( this, SW_RES( PB_HELP )), +#ifdef MSC +#pragma warning (default : 4355) +#endif + m_sName( SW_RES( ST_NAME )), + m_sTable( SW_RES( ST_TABLE )), + m_sConnecting( SW_RES( ST_CONNECTING )), + m_pCreatedDataSource(0), + m_bInSelectHdl(false), + m_pAddressPage(pParent) +{ + FreeResource(); + String sTemp(m_aDescriptionFI.GetText()); + sTemp.SearchAndReplaceAscii("%1", m_aLoadListPB.GetText()); + sTemp.SearchAndReplaceAscii("%2", m_aCreateListPB.GetText()); + m_aDescriptionFI.SetText(sTemp); + m_aFilterPB.SetClickHdl( LINK( this, SwAddressListDialog, FilterHdl_Impl )); + m_aLoadListPB.SetClickHdl( LINK( this, SwAddressListDialog, LoadHdl_Impl )); + m_aCreateListPB.SetClickHdl( LINK( this, SwAddressListDialog,CreateHdl_Impl )); + m_aEditPB.SetClickHdl(LINK( this, SwAddressListDialog, EditHdl_Impl)); + m_aTablePB.SetClickHdl(LINK( this, SwAddressListDialog, TableSelectHdl_Impl)); + + Size aLBSize(m_aListLB.GetSizePixel()); + m_aListHB.SetSizePixel(aLBSize); + Size aHeadSize(m_aListHB.CalcWindowSizePixel()); + aHeadSize.Width() = aLBSize.Width(); + m_aListHB.SetSizePixel(aHeadSize); + Point aLBPos(m_aListLB.GetPosPixel()); + m_aListHB.SetPosPixel(aLBPos); + aLBPos.Y() += aHeadSize.Height(); + aLBSize.Height() -= aHeadSize.Height(); + m_aListLB.SetPosSizePixel(aLBPos, aLBSize); + + Size aSz(m_aListHB.GetOutputSizePixel()); + m_aListHB.InsertItem( ITEMID_NAME, m_sName, + aSz.Width()/2, + HIB_LEFT | HIB_VCENTER | HIB_FIXED | HIB_FIXEDPOS/*| HIB_CLICKABLE | HIB_UPARROW */); + m_aListHB.InsertItem( ITEMID_TABLE, m_sTable, + aSz.Width()/2, + HIB_LEFT | HIB_VCENTER | HIB_FIXED | HIB_FIXEDPOS /*| HIB_CLICKABLE | HIB_UPARROW */); + m_aListHB.SetHelpId(HID_MM_ADDRESSLIST_HB ); + m_aListHB.Show(); + + m_aListLB.SetHelpId(HID_MM_ADDRESSLIST_TLB); + static long nTabs[] = {2, 0, aSz.Width()/2 }; + m_aListLB.SetWindowBits( WB_SORT | WB_HSCROLL | WB_CLIPCHILDREN | WB_TABSTOP ); + m_aListLB.SetSelectionMode( SINGLE_SELECTION ); + m_aListLB.SetTabs(&nTabs[0], MAP_PIXEL); + m_aOK.SetClickHdl( LINK( this, SwAddressListDialog, OKHdl_Impl)); + + uno::Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() ); + if( xMgr.is() ) + { + uno::Reference<XInterface> xInstance = xMgr->createInstance( C2U( "com.sun.star.sdb.DatabaseContext" )); + m_xDBContext = uno::Reference<XNameAccess>(xInstance, UNO_QUERY) ; + } + SwMailMergeConfigItem& rConfigItem = m_pAddressPage->GetWizard()->GetConfigItem(); + const SwDBData& rCurrentData = rConfigItem.GetCurrentDBData(); + + DBG_ASSERT(m_xDBContext.is(), "service 'com.sun.star.sdb.DatabaseContext' not found!"); + sal_Bool bEnableEdit = sal_False; + sal_Bool bEnableOK = sal_True; + m_aListLB.SelectAll( FALSE ); + + if(m_xDBContext.is()) + { + SwDBConfig aDb; + ::rtl::OUString sBibliography = aDb.GetBibliographySource().sDataSource; + uno::Sequence< ::rtl::OUString> aNames = m_xDBContext->getElementNames(); + const ::rtl::OUString* pNames = aNames.getConstArray(); + for(sal_Int32 nName = 0; nName < aNames.getLength(); ++nName) + { + if ( pNames[nName] == sBibliography ) + continue; + SvLBoxEntry* pEntry = m_aListLB.InsertEntry(pNames[nName]); + AddressUserData_Impl* pUserData = new AddressUserData_Impl(); + pEntry->SetUserData(pUserData); + if(pNames[nName] == rCurrentData.sDataSource) + { + m_aListLB.Select(pEntry); + m_aListLB.SetEntryText(rCurrentData.sCommand, pEntry, ITEMID_TABLE - 1); + pUserData->nCommandType = rCurrentData.nCommandType; + pUserData->xSource = rConfigItem.GetSource(); + pUserData->xConnection = rConfigItem.GetConnection(); + pUserData->xColumnsSupplier = rConfigItem.GetColumnsSupplier(); + pUserData->xResultSet = rConfigItem.GetResultSet(); + pUserData->sFilter = rConfigItem.GetFilter(); + //is the data source editable (csv, Unicode, single table) + uno::Reference<beans::XPropertySet> xSourceProperties; + try + { + m_xDBContext->getByName(pNames[nName]) >>= xSourceProperties; + pUserData->sURL = lcl_getFlatURL( xSourceProperties ); + bEnableEdit = pUserData->sURL.getLength() > 0 && + SWUnoHelper::UCB_IsFile( pUserData->sURL ) && //#i97577# + !SWUnoHelper::UCB_IsReadOnlyFileName( pUserData->sURL ); + } + catch(const uno::Exception& ) + { + bEnableOK = sal_False; + } + m_aDBData = rCurrentData; + } + } + } + m_aOK.Enable(m_aListLB.GetEntryCount()>0 && bEnableOK); + m_aEditPB.Enable(bEnableEdit); + m_aListLB.SetSelectHdl(LINK(this, SwAddressListDialog, ListBoxSelectHdl_Impl)); + TableSelectHdl_Impl(NULL); +} +/*-- 07.04.2004 16:35:43--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwAddressListDialog::~SwAddressListDialog() +{ + SvLBoxEntry* pEntry = m_aListLB.First(); + while(pEntry) + { + AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pEntry->GetUserData()); + delete pUserData; + pEntry = m_aListLB.Next( pEntry ); + } +} +/*-- 07.04.2004 16:35:44--------------------------------------------------- + + -----------------------------------------------------------------------*/ +IMPL_LINK(SwAddressListDialog, FilterHdl_Impl, PushButton*, EMPTYARG) +{ + SvLBoxEntry* pSelect = m_aListLB.FirstSelected(); + uno::Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() ); + if(pSelect && xMgr.is()) + { + String sCommand = m_aListLB.GetEntryText(pSelect, ITEMID_TABLE - 1); + if ( !sCommand.Len() ) + return 0; + + AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); + if(pUserData->xConnection.is() ) + { + try + { + uno::Reference<lang::XMultiServiceFactory> xConnectFactory(pUserData->xConnection, UNO_QUERY_THROW); + uno::Reference<XSingleSelectQueryComposer> xComposer( + xConnectFactory->createInstance(C2U("com.sun.star.sdb.SingleSelectQueryComposer")), UNO_QUERY_THROW); + + PropertyValue aSecond; + aSecond.Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "RowSet" ) ); + uno::Reference<XRowSet> xRowSet( + xMgr->createInstance(C2U("com.sun.star.sdb.RowSet")), UNO_QUERY); + uno::Reference<XPropertySet> xRowProperties(xRowSet, UNO_QUERY); + xRowProperties->setPropertyValue(C2U("DataSourceName"), + makeAny(OUString(m_aListLB.GetEntryText(pSelect, ITEMID_NAME - 1)))); + xRowProperties->setPropertyValue(C2U("Command"), makeAny( + OUString(sCommand))); + xRowProperties->setPropertyValue(C2U("CommandType"), makeAny(pUserData->nCommandType)); + xRowProperties->setPropertyValue(C2U("ActiveConnection"), makeAny(pUserData->xConnection.getTyped())); + xRowSet->execute(); + aSecond.Value <<= xRowSet; + + PropertyValue aFirst; + aFirst.Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "QueryComposer" ) ); + ::rtl::OUString sQuery; + xRowProperties->getPropertyValue(C2U("ActiveCommand"))>>= sQuery; + xComposer->setQuery(sQuery); + if(pUserData->sFilter.getLength()) + xComposer->setFilter(pUserData->sFilter); + aFirst.Value <<= xComposer; + + uno::Sequence<Any> aInit(2); + aInit[0] <<= aFirst; + aInit[1] <<= aSecond; + + ::rtl::OUString sDialogServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.FilterDialog" ) ); + uno::Reference< XExecutableDialog> xDialog( + xMgr->createInstanceWithArguments( sDialogServiceName, aInit ), UNO_QUERY); + + if ( RET_OK == xDialog->execute() ) + { + WaitObject aWO( NULL ); + pUserData->sFilter = xComposer->getFilter(); + } + ::comphelper::disposeComponent(xRowSet); + } + catch(Exception& ) + { + DBG_ERROR("exception caught in SwAddressListDialog::FilterHdl_Impl"); + } + } + } + return 0; +} +/*-- 07.04.2004 16:35:44--------------------------------------------------- + + -----------------------------------------------------------------------*/ +IMPL_LINK(SwAddressListDialog, LoadHdl_Impl, PushButton*, EMPTYARG) +{ + String sNewSource = SwNewDBMgr::LoadAndRegisterDataSource(); + if(sNewSource.Len()) + { + SvLBoxEntry* pNewSource = m_aListLB.InsertEntry(sNewSource); + pNewSource->SetUserData(new AddressUserData_Impl()); + m_aListLB.Select(pNewSource); + } + return 0; +} +/*-- 07.04.2004 16:35:44--------------------------------------------------- + + -----------------------------------------------------------------------*/ +IMPL_LINK(SwAddressListDialog, CreateHdl_Impl, PushButton*, pButton) +{ + String sInputURL; + SwCreateAddressListDialog* pDlg = + new SwCreateAddressListDialog( + pButton, + sInputURL, + m_pAddressPage->GetWizard()->GetConfigItem()); + if(RET_OK == pDlg->Execute()) + { + //register the URL a new datasource + OUString sURL = pDlg->GetURL(); + try + { + uno::Reference<XSingleServiceFactory> xFact( m_xDBContext, UNO_QUERY); + uno::Reference<XInterface> xNewInstance = xFact->createInstance(); + INetURLObject aURL( sURL ); + OUString sNewName = aURL.getBase(); + //find a unique name if sNewName already exists + OUString sFind(sNewName); + sal_Int32 nIndex = 0; + while(m_xDBContext->hasByName(sFind)) + { + sFind = sNewName; + sFind += OUString::valueOf(++nIndex); + } + uno::Reference<XPropertySet> xDataProperties(xNewInstance, UNO_QUERY); + + OUString sDBURL(C2U("sdbc:flat:")); + //only the 'path' has to be added + INetURLObject aTempURL(aURL); + aTempURL.removeSegment(); + aTempURL.removeFinalSlash(); + sDBURL += aTempURL.GetMainURL(INetURLObject::NO_DECODE); + Any aAny(&sDBURL, ::getCppuType(&sDBURL)); + xDataProperties->setPropertyValue(C2U("URL"), aAny); + //set the filter to the file name without extension + uno::Sequence<OUString> aFilters(1); + aFilters[0] = sNewName; + aAny <<= aFilters; + xDataProperties->setPropertyValue(C2U("TableFilter"), aAny); + + uno::Sequence<PropertyValue> aInfo(4); + PropertyValue* pInfo = aInfo.getArray(); + pInfo[0].Name = C2U("FieldDelimiter"); + pInfo[0].Value <<= OUString(String('\t')); + pInfo[1].Name = C2U("StringDelimiter"); + pInfo[1].Value <<= OUString('"'); + pInfo[2].Name = C2U("Extension"); + pInfo[2].Value <<= ::rtl::OUString(aURL.getExtension());//C2U("csv"); + pInfo[3].Name = C2U("CharSet"); + pInfo[3].Value <<= C2U(cUTF8); + aAny <<= aInfo; + xDataProperties->setPropertyValue(C2U("Info"), aAny); + + uno::Reference<sdb::XDocumentDataSource> xDS(xNewInstance, UNO_QUERY_THROW); + uno::Reference<frame::XStorable> xStore(xDS->getDatabaseDocument(), UNO_QUERY_THROW); + String sExt = String::CreateFromAscii(".odb"); + String sTmpName; + { + String sHomePath(SvtPathOptions().GetWorkPath()); + utl::TempFile aTempFile(sFind , &sExt, &sHomePath); + aTempFile.EnableKillingFile(sal_True); + sTmpName = aTempFile.GetURL(); + } + xStore->storeAsURL(sTmpName, Sequence< PropertyValue >()); + + + uno::Reference<XNamingService> xNaming(m_xDBContext, UNO_QUERY); + xNaming->registerObject( sFind, xNewInstance ); + //now insert the new source into the ListBox + String sEntry(sFind); + sEntry += '\t'; + sEntry += String(aFilters[0]); + m_pCreatedDataSource = m_aListLB.InsertEntry(sEntry); + AddressUserData_Impl* pUserData = new AddressUserData_Impl(); + pUserData->sURL = sURL; + m_pCreatedDataSource->SetUserData(pUserData); + m_aListLB.Select(m_pCreatedDataSource); + m_aCreateListPB.Enable(FALSE); + + } + catch(Exception& ) + { + } + } + delete pDlg; + return 0; +} +/*-- 22.04.2004 10:30:40--------------------------------------------------- + + -----------------------------------------------------------------------*/ +IMPL_LINK(SwAddressListDialog, EditHdl_Impl, PushButton*, pButton) +{ + SvLBoxEntry* pEntry = m_aListLB.FirstSelected(); + AddressUserData_Impl* pUserData = pEntry ? static_cast<AddressUserData_Impl*>(pEntry->GetUserData()) : 0; + if(pUserData && pUserData->sURL.getLength()) + { + if(pUserData->xResultSet.is()) + { + SwMailMergeConfigItem& rConfigItem = m_pAddressPage->GetWizard()->GetConfigItem(); + if(rConfigItem.GetResultSet() != pUserData->xResultSet) + ::comphelper::disposeComponent( pUserData->xResultSet ); + pUserData->xResultSet = 0; + + rConfigItem.DisposeResultSet(); + } + pUserData->xSource.clear(); + pUserData->xColumnsSupplier.clear(); + pUserData->xConnection.clear(); + // will automatically close if it was the las reference + SwCreateAddressListDialog* pDlg = + new SwCreateAddressListDialog( + pButton, + pUserData->sURL, + m_pAddressPage->GetWizard()->GetConfigItem()); + if(RET_OK == pDlg->Execute()) + { + } + delete pDlg; + } + return 0; +}; +/*-- 19.04.2004 09:41:05--------------------------------------------------- + + -----------------------------------------------------------------------*/ +IMPL_LINK(SwAddressListDialog, ListBoxSelectHdl_Impl, SvTabListBox*, EMPTYARG) +{ + SvLBoxEntry* pSelect = m_aListLB.FirstSelected(); + Application::PostUserEvent( STATIC_LINK( this, SwAddressListDialog, + StaticListBoxSelectHdl_Impl ), pSelect ); + return 0; +} +IMPL_STATIC_LINK(SwAddressListDialog, StaticListBoxSelectHdl_Impl, SvLBoxEntry*, pSelect) +{ + //prevent nested calls of the select handler + if(pThis->m_bInSelectHdl) + return 0; + pThis->EnterWait(); + pThis->m_bInSelectHdl = true; + AddressUserData_Impl* pUserData = 0; + if(pSelect) + { + String sTable = pThis->m_aListLB.GetEntryText(pSelect, ITEMID_TABLE - 1); + if(!sTable.Len()) + { + pThis->m_aListLB.SetEntryText(pThis->m_sConnecting, pSelect, ITEMID_TABLE - 1); + // allow painting of the new entry + pThis->m_aListLB.Window::Invalidate(INVALIDATE_UPDATE); + for (USHORT i = 0; i < 10; i++) + Application::Reschedule(); + } + + pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); + if(pUserData->nTableAndQueryCount > 1 || pUserData->nTableAndQueryCount == -1) + { + pThis->DetectTablesAndQueries(pSelect, !sTable.Len()); + } + else + { + //otherwise set the selected db-data + pThis->m_aDBData.sDataSource = pThis->m_aListLB.GetEntryText(pSelect, ITEMID_NAME - 1); + pThis->m_aDBData.sCommand = pThis->m_aListLB.GetEntryText(pSelect, ITEMID_TABLE - 1); + pThis->m_aDBData.nCommandType = pUserData->nCommandType; + pThis->m_aOK.Enable(sal_True); + } + sTable = pThis->m_aListLB.GetEntryText(pSelect, ITEMID_TABLE - 1); + if(sTable == pThis->m_sConnecting) + pThis->m_aListLB.SetEntryText(String(), pSelect, ITEMID_TABLE - 1); + } + pThis->m_aEditPB.Enable(pUserData && pUserData->sURL.getLength() && + SWUnoHelper::UCB_IsFile( pUserData->sURL ) && //#i97577# + !SWUnoHelper::UCB_IsReadOnlyFileName( pUserData->sURL ) ); + pThis->m_bInSelectHdl = false; + pThis->LeaveWait(); + return 0; +} + +/*-- 13.05.2004 14:59:25--------------------------------------------------- + detect the number of tables for a data source + if only one is available then set it at the entry + -----------------------------------------------------------------------*/ +void SwAddressListDialog::DetectTablesAndQueries( + SvLBoxEntry* pSelect, + bool bWidthDialog) +{ + try + { + AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); + uno::Reference<XCompletedConnection> xComplConnection; + if(!pUserData->xConnection.is()) + { + m_aDBData.sDataSource = m_aListLB.GetEntryText(pSelect, ITEMID_NAME - 1); + m_xDBContext->getByName(m_aDBData.sDataSource) >>= xComplConnection; + pUserData->xSource = uno::Reference<XDataSource>(xComplConnection, UNO_QUERY); + + uno::Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() ); + uno::Reference< XInteractionHandler > xHandler( + xMgr->createInstance( C2U( "com.sun.star.task.InteractionHandler" )), UNO_QUERY); + pUserData->xConnection = SharedConnection( xComplConnection->connectWithCompletion( xHandler ) ); + } + if(pUserData->xConnection.is()) + { + sal_Int32 nTables = 0; + uno::Sequence<rtl::OUString> aTables; + uno::Sequence<rtl::OUString> aQueries; + uno::Reference<XTablesSupplier> xTSupplier(pUserData->xConnection, UNO_QUERY); + if(xTSupplier.is()) + { + uno::Reference<XNameAccess> xTbls = xTSupplier->getTables(); + aTables = xTbls->getElementNames(); + nTables += aTables.getLength(); + } + uno::Reference<XQueriesSupplier> xQSupplier(pUserData->xConnection, UNO_QUERY); + if(xQSupplier.is()) + { + uno::Reference<XNameAccess> xQueries = xQSupplier->getQueries(); + aQueries = xQueries->getElementNames(); + nTables += aQueries.getLength(); + } + pUserData->nTableAndQueryCount = nTables; + if(nTables > 1 && bWidthDialog) + { + //now call the table select dialog - if more than one table exists + SwSelectDBTableDialog* pDlg = new SwSelectDBTableDialog(this, pUserData->xConnection); + String sTable = m_aListLB.GetEntryText(pSelect, ITEMID_TABLE - 1); + if(sTable.Len()) + pDlg->SetSelectedTable(sTable, pUserData->nCommandType == CommandType::TABLE); + if(RET_OK == pDlg->Execute()) + { + bool bIsTable; + m_aDBData.sCommand = pDlg->GetSelectedTable(bIsTable); + m_aDBData.nCommandType = bIsTable ? CommandType::TABLE : CommandType::QUERY; + pUserData->nCommandType = m_aDBData.nCommandType; + } + delete pDlg; + } + else if(nTables == 1) + { + if(aTables.getLength()) + { + m_aDBData.sCommand = aTables[0]; + m_aDBData.nCommandType = CommandType::TABLE; + } + else + { + m_aDBData.sCommand = aQueries[0]; + m_aDBData.nCommandType = CommandType::QUERY; + } + } + } + if ( m_aDBData.sCommand.getLength() ) + { + uno::Reference<beans::XPropertySet> xSourceProperties; + m_xDBContext->getByName(m_aDBData.sDataSource) >>= xSourceProperties; + pUserData->sURL = lcl_getFlatURL( xSourceProperties ); + + pUserData->xColumnsSupplier = SwNewDBMgr::GetColumnSupplier(pUserData->xConnection, + m_aDBData.sCommand, + m_aDBData.nCommandType == CommandType::TABLE ? + SW_DB_SELECT_TABLE : SW_DB_SELECT_QUERY ); + //#i97577# + if( pUserData->xColumnsSupplier.is() ) + m_aListLB.SetEntryText(m_aDBData.sCommand, pSelect, ITEMID_TABLE - 1); + else + m_aListLB.SetEntryText(String(), pSelect, ITEMID_TABLE - 1); + } + String sCommand = m_aListLB.GetEntryText(pSelect, ITEMID_TABLE - 1); + m_aOK.Enable(pSelect && sCommand.Len()); + m_aFilterPB.Enable( pUserData->xConnection.is() && sCommand.Len() ); + m_aTablePB.Enable( pUserData->nTableAndQueryCount > 1 ); + } + catch(Exception& ) + { + DBG_ERROR("exception caught in SwAddressListDialog::DetectTablesAndQueries"); + m_aOK.Enable( sal_False ); + } +} + +/*-- 13.05.2004 12:55:40--------------------------------------------------- + + -----------------------------------------------------------------------*/ +IMPL_LINK(SwAddressListDialog, TableSelectHdl_Impl, PushButton*, pButton) +{ + EnterWait(); + SvLBoxEntry* pSelect = m_aListLB.FirstSelected(); + if(pSelect) + { + AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); + //only call the table select dialog if tables have not been searched for or there + //are more than 1 + String sTable = m_aListLB.GetEntryText(pSelect, ITEMID_TABLE - 1); + if( pUserData->nTableAndQueryCount > 1 || pUserData->nTableAndQueryCount == -1) + { + DetectTablesAndQueries(pSelect, (pButton != 0) || (!sTable.Len())); + } + } + + LeaveWait(); + return 0; +} + +/*-- 08.04.2004 14:52:11--------------------------------------------------- + + -----------------------------------------------------------------------*/ +IMPL_LINK(SwAddressListDialog, OKHdl_Impl, PushButton*, EMPTYARG) +{ + EndDialog(TRUE); + return 0; +} + +/*-- 07.05.2004 14:17:47--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Reference< XDataSource> SwAddressListDialog::GetSource() +{ + uno::Reference< XDataSource> xRet; + SvLBoxEntry* pSelect = m_aListLB.FirstSelected(); + if(pSelect) + { + AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); + xRet = pUserData->xSource; + } + return xRet; + +} +/*-- 07.05.2004 14:17:48--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SharedConnection SwAddressListDialog::GetConnection() +{ + SharedConnection xRet; + SvLBoxEntry* pSelect = m_aListLB.FirstSelected(); + if(pSelect) + { + AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); + xRet = pUserData->xConnection; + } + return xRet; +} +/*-- 07.05.2004 14:17:48--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Reference< XColumnsSupplier> SwAddressListDialog::GetColumnsSupplier() +{ + uno::Reference< XColumnsSupplier> xRet; + SvLBoxEntry* pSelect = m_aListLB.FirstSelected(); + if(pSelect) + { + AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); + xRet = pUserData->xColumnsSupplier; + } + return xRet; +} +/*-- 14.05.2004 15:04:09--------------------------------------------------- + + -----------------------------------------------------------------------*/ +::rtl::OUString SwAddressListDialog::GetFilter() +{ + ::rtl::OUString sRet; + SvLBoxEntry* pSelect = m_aListLB.FirstSelected(); + if(pSelect) + { + AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); + sRet = pUserData->sFilter; + } + return sRet; +} |