| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the 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.SetStyle( m_aListLB.GetStyle() | 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( sal_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(sal_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 (sal_uInt16 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(sal_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; |
| } |