sw/source/ui/dbui/addresslistdialog.cxx | 345 ++++++++++---------------- sw/source/ui/dbui/addresslistdialog.hxx | 54 ++-- sw/source/ui/dbui/mmaddressblockpage.cxx | 14 - sw/uiconfig/swriter/ui/selectaddressdialog.ui | 109 ++++---- 4 files changed, 236 insertions(+), 286 deletions(-)
New commits: commit 3963bab7c1cd31b946646131cdc5576894675293 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Thu Feb 28 14:52:50 2019 +0000 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Fri Mar 1 11:04:25 2019 +0100 weld SwCreateAddressListDialog Change-Id: I3ae15af8a2c7475394dfc5f6e54b89950d2238c0 Reviewed-on: https://gerrit.libreoffice.org/68511 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@redhat.com> diff --git a/sw/source/ui/dbui/addresslistdialog.cxx b/sw/source/ui/dbui/addresslistdialog.cxx index 9d62691d751c..20633a13e692 100644 --- a/sw/source/ui/dbui/addresslistdialog.cxx +++ b/sw/source/ui/dbui/addresslistdialog.cxx @@ -71,9 +71,6 @@ using namespace ::com::sun::star::task; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::ui::dialogs; -#define ITEMID_NAME 1 -#define ITEMID_TABLE 2 - struct AddressUserData_Impl { uno::Reference<XDataSource> xSource; @@ -125,90 +122,52 @@ static OUString lcl_getFlatURL( uno::Reference<beans::XPropertySet> const & xSou return OUString(); } -class SwAddrSourceLB : public SvSimpleTable -{ -public: - explicit SwAddrSourceLB(SvSimpleTableContainer& rParent) - : SvSimpleTable(rParent, 0) - { - } - virtual void Resize() override; - void setColSizes(); -}; - -void SwAddrSourceLB::Resize() -{ - SvSimpleTable::Resize(); - setColSizes(); -} - -void SwAddrSourceLB::setColSizes() +SwAddressListDialog::SwAddressListDialog(SwMailMergeAddressBlockPage* pParent) + : SfxDialogController(pParent->GetFrameWeld(), "modules/swriter/ui/selectaddressdialog.ui", "SelectAddressDialog") + , m_bInSelectHdl(false) + , m_xAddressPage(pParent) + , m_xDescriptionFI(m_xBuilder->weld_label("desc")) + , m_xConnecting(m_xBuilder->weld_label("connecting")) + , m_xListLB(m_xBuilder->weld_tree_view("sources")) + , m_xLoadListPB(m_xBuilder->weld_button("add")) + , m_xCreateListPB(m_xBuilder->weld_button("create")) + , m_xFilterPB(m_xBuilder->weld_button("filter")) + , m_xEditPB(m_xBuilder->weld_button("edit")) + , m_xTablePB(m_xBuilder->weld_button("changetable")) + , m_xOK(m_xBuilder->weld_button("ok")) + , m_xIter(m_xListLB->make_iterator()) { - HeaderBar &rHB = GetTheHeaderBar(); - if (rHB.GetItemCount() < 2) - return; + m_sConnecting = m_xConnecting->get_label(); - long nWidth = rHB.GetSizePixel().Width(); + const OUString sTemp(m_xDescriptionFI->get_label() + .replaceFirst("%1", m_xLoadListPB->get_label()) + .replaceFirst("%2", m_xCreateListPB->get_label())); + m_xDescriptionFI->set_label(sTemp); + m_xFilterPB->connect_clicked( LINK( this, SwAddressListDialog, FilterHdl_Impl )); + m_xLoadListPB->connect_clicked( LINK( this, SwAddressListDialog, LoadHdl_Impl )); + m_xCreateListPB->connect_clicked( LINK( this, SwAddressListDialog,CreateHdl_Impl )); + m_xEditPB->connect_clicked(LINK( this, SwAddressListDialog, EditHdl_Impl)); + m_xTablePB->connect_clicked(LINK( this, SwAddressListDialog, TableSelectHdl_Impl)); - long nTabs[] = { 0, nWidth/2 }; + m_xListLB->set_size_request(m_xListLB->get_approximate_digit_width() * 52, + m_xListLB->get_height_rows(9)); - SvSimpleTable::SetTabs(SAL_N_ELEMENTS(nTabs), nTabs, MapUnit::MapPixel); -} - -SwAddressListDialog::SwAddressListDialog(SwMailMergeAddressBlockPage* pParent) - : SfxModalDialog(pParent, "SelectAddressDialog", - "modules/swriter/ui/selectaddressdialog.ui") + std::vector<int> aWidths; + aWidths.push_back(m_xListLB->get_approximate_digit_width() * 26); + m_xListLB->set_column_fixed_widths(aWidths); - , - - m_pCreatedDataSource(nullptr), - m_bInSelectHdl(false), - m_pAddressPage(pParent) -{ - get(m_pDescriptionFI, "desc"); - get(m_pLoadListPB, "add"); - get(m_pCreateListPB, "create"); - get(m_pFilterPB, "filter"); - get(m_pEditPB, "edit"); - get(m_pTablePB, "changetable"); - get(m_pOK, "ok"); - - OUString sName = get<FixedText>("name")->GetText(); - OUString sTable = get<FixedText>("table")->GetText(); - m_sConnecting = get<FixedText>("connecting")->GetText(); - - const OUString sTemp(m_pDescriptionFI->GetText() - .replaceFirst("%1", m_pLoadListPB->GetText()) - .replaceFirst("%2", m_pCreateListPB->GetText())); - m_pDescriptionFI->SetText(sTemp); - m_pFilterPB->SetClickHdl( LINK( this, SwAddressListDialog, FilterHdl_Impl )); - m_pLoadListPB->SetClickHdl( LINK( this, SwAddressListDialog, LoadHdl_Impl )); - m_pCreateListPB->SetClickHdl( LINK( this, SwAddressListDialog,CreateHdl_Impl )); - m_pEditPB->SetClickHdl(LINK( this, SwAddressListDialog, EditHdl_Impl)); - m_pTablePB->SetClickHdl(LINK( this, SwAddressListDialog, TableSelectHdl_Impl)); - - SvSimpleTableContainer *pHeaderTreeContainer = get<SvSimpleTableContainer>("sources"); - Size aSize = pHeaderTreeContainer->LogicToPixel(Size(182 , 102), MapMode(MapUnit::MapAppFont)); - pHeaderTreeContainer->set_width_request(aSize.Width()); - pHeaderTreeContainer->set_height_request(aSize.Height()); - m_pListLB = VclPtr<SwAddrSourceLB>::Create(*pHeaderTreeContainer); - - m_pListLB->InsertHeaderEntry(sName + "\t" + sTable); - m_pListLB->setColSizes(); - - m_pListLB->SetStyle( m_pListLB->GetStyle() | WB_SORT | WB_HSCROLL | WB_CLIPCHILDREN | WB_TABSTOP ); - m_pListLB->SetSelectionMode( SelectionMode::Single ); - m_pOK->SetClickHdl( LINK( this, SwAddressListDialog, OKHdl_Impl)); + m_xListLB->make_sorted(); + m_xOK->connect_clicked(LINK(this, SwAddressListDialog, OKHdl_Impl)); uno::Reference<XComponentContext> xContext( ::comphelper::getProcessComponentContext() ); m_xDBContext = DatabaseContext::create(xContext); - SwMailMergeConfigItem& rConfigItem = m_pAddressPage->GetWizard()->GetConfigItem(); + SwMailMergeConfigItem& rConfigItem = m_xAddressPage->GetWizard()->GetConfigItem(); const SwDBData& rCurrentData = rConfigItem.GetCurrentDBData(); bool bEnableEdit = false; bool bEnableOK = true; - m_pListLB->SelectAll( false ); + m_xListLB->unselect_all(); SwDBConfig aDb; const OUString sBibliography = aDb.GetBibliographySource().sDataSource; @@ -218,13 +177,15 @@ SwAddressListDialog::SwAddressListDialog(SwMailMergeAddressBlockPage* pParent) { if ( pNames[nName] == sBibliography ) continue; - SvTreeListEntry* pEntry = m_pListLB->InsertEntry(pNames[nName]); - AddressUserData_Impl* pUserData = new AddressUserData_Impl(); - pEntry->SetUserData(pUserData); - if(pNames[nName] == rCurrentData.sDataSource) + m_xListLB->append(m_xIter.get()); + m_xListLB->set_text(*m_xIter, pNames[nName], 0); + m_aUserData.emplace_back(new AddressUserData_Impl); + AddressUserData_Impl* pUserData = m_aUserData.back().get(); + m_xListLB->set_id(*m_xIter, OUString::number(reinterpret_cast<sal_Int64>(pUserData))); + if (pNames[nName] == rCurrentData.sDataSource) { - m_pListLB->Select(pEntry); - m_pListLB->SetEntryText(rCurrentData.sCommand, pEntry, ITEMID_TABLE - 1); + m_xListLB->select(*m_xIter); + m_xListLB->set_text(*m_xIter, rCurrentData.sCommand, 1); pUserData->nCommandType = rCurrentData.nCommandType; pUserData->xSource = rConfigItem.GetSource(); pUserData->xConnection = rConfigItem.GetConnection(); @@ -249,50 +210,28 @@ SwAddressListDialog::SwAddressListDialog(SwMailMergeAddressBlockPage* pParent) } } - m_pOK->Enable(m_pListLB->GetEntryCount()>0 && bEnableOK); - m_pEditPB->Enable(bEnableEdit); - m_pListLB->SetSelectHdl(LINK(this, SwAddressListDialog, ListBoxSelectHdl_Impl)); - TableSelectHdl_Impl(nullptr); + m_xOK->set_sensitive(m_xListLB->n_children() > 0 && bEnableOK); + m_xEditPB->set_sensitive(bEnableEdit); + m_xListLB->connect_changed(LINK(this, SwAddressListDialog, ListBoxSelectHdl_Impl)); + TableSelectHdl(nullptr); } SwAddressListDialog::~SwAddressListDialog() { - disposeOnce(); -} - -void SwAddressListDialog::dispose() -{ - SvTreeListEntry* pEntry = m_pListLB->First(); - while(pEntry) - { - AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pEntry->GetUserData()); - delete pUserData; - pEntry = m_pListLB->Next( pEntry ); - } - m_pListLB.disposeAndClear(); - m_pAddressPage.clear(); - m_pDescriptionFI.clear(); - m_pLoadListPB.clear(); - m_pCreateListPB.clear(); - m_pFilterPB.clear(); - m_pEditPB.clear(); - m_pTablePB.clear(); - m_pOK.clear(); - SfxModalDialog::dispose(); } -IMPL_LINK_NOARG(SwAddressListDialog, FilterHdl_Impl, Button*, void) +IMPL_LINK_NOARG(SwAddressListDialog, FilterHdl_Impl, weld::Button&, void) { - SvTreeListEntry* pSelect = m_pListLB->FirstSelected(); + int nSelect = m_xListLB->get_selected_index(); uno::Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() ); - if(pSelect) + if (nSelect != -1) { - const OUString sCommand = SvTabListBox::GetEntryText(pSelect, ITEMID_TABLE - 1); + const OUString sCommand = m_xListLB->get_text(nSelect, 1); if (sCommand.isEmpty()) return; - AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); - if(pUserData->xConnection.is() ) + AddressUserData_Impl* pUserData = reinterpret_cast<AddressUserData_Impl*>(m_xListLB->get_id(nSelect).toInt64()); + if (pUserData->xConnection.is() ) { try { @@ -304,7 +243,7 @@ IMPL_LINK_NOARG(SwAddressListDialog, FilterHdl_Impl, Button*, void) xMgr->createInstance("com.sun.star.sdb.RowSet"), UNO_QUERY); uno::Reference<XPropertySet> xRowProperties(xRowSet, UNO_QUERY); xRowProperties->setPropertyValue("DataSourceName", - makeAny(SvTabListBox::GetEntryText(pSelect, ITEMID_NAME - 1))); + makeAny(m_xListLB->get_text(nSelect, 0))); xRowProperties->setPropertyValue("Command", makeAny(sCommand)); xRowProperties->setPropertyValue("CommandType", makeAny(pUserData->nCommandType)); xRowProperties->setPropertyValue("ActiveConnection", makeAny(pUserData->xConnection.getTyped())); @@ -321,7 +260,7 @@ IMPL_LINK_NOARG(SwAddressListDialog, FilterHdl_Impl, Button*, void) if ( RET_OK == xDialog->execute() ) { - WaitObject aWO( nullptr ); + weld::WaitObject aWait(m_xDialog.get()); pUserData->sFilter = xComposer->getFilter(); } ::comphelper::disposeComponent(xRowSet); @@ -334,23 +273,27 @@ IMPL_LINK_NOARG(SwAddressListDialog, FilterHdl_Impl, Button*, void) } } -IMPL_LINK_NOARG(SwAddressListDialog, LoadHdl_Impl, Button*, void) +IMPL_LINK_NOARG(SwAddressListDialog, LoadHdl_Impl, weld::Button&, void) { - SwView* pView = m_pAddressPage->GetWizard()->GetSwView(); + SwView* pView = m_xAddressPage->GetWizard()->GetSwView(); - const OUString sNewSource = SwDBManager::LoadAndRegisterDataSource(GetFrameWeld(), pView ? pView->GetDocShell() : nullptr); + const OUString sNewSource = SwDBManager::LoadAndRegisterDataSource(m_xDialog.get(), pView ? pView->GetDocShell() : nullptr); if(!sNewSource.isEmpty()) { - SvTreeListEntry* pNewSource = m_pListLB->InsertEntry(sNewSource); - pNewSource->SetUserData(new AddressUserData_Impl()); - m_pListLB->Select(pNewSource); + m_xListLB->append(m_xIter.get()); + m_xListLB->set_text(*m_xIter, sNewSource, 0); + m_aUserData.emplace_back(new AddressUserData_Impl); + AddressUserData_Impl* pUserData = m_aUserData.back().get(); + m_xListLB->set_id(*m_xIter, OUString::number(reinterpret_cast<sal_Int64>(pUserData))); + m_xListLB->select(*m_xIter); + ListBoxSelectHdl_Impl(*m_xListLB); } } -IMPL_LINK_NOARG(SwAddressListDialog, CreateHdl_Impl, Button*, void) +IMPL_LINK_NOARG(SwAddressListDialog, CreateHdl_Impl, weld::Button&, void) { OUString sInputURL; - SwCreateAddressListDialog aDlg(GetFrameWeld(), sInputURL, m_pAddressPage->GetWizard()->GetConfigItem()); + SwCreateAddressListDialog aDlg(m_xDialog.get(), sInputURL, m_xAddressPage->GetWizard()->GetConfigItem()); if (RET_OK == aDlg.run()) { //register the URL a new datasource @@ -407,13 +350,15 @@ IMPL_LINK_NOARG(SwAddressListDialog, CreateHdl_Impl, Button*, void) uno::Reference<XNamingService> xNaming(m_xDBContext, UNO_QUERY); xNaming->registerObject( sFind, xNewInstance ); //now insert the new source into the ListBox - m_pCreatedDataSource = m_pListLB->InsertEntry(sFind + "\t" + aFilters[0]); - AddressUserData_Impl* pUserData = new AddressUserData_Impl(); - pUserData->sURL = sURL; - m_pCreatedDataSource->SetUserData(pUserData); - m_pListLB->Select(m_pCreatedDataSource); - m_pCreateListPB->Enable(false); - + m_xListLB->append(m_xIter.get()); + m_xListLB->set_text(*m_xIter, sFind, 0); + m_xListLB->set_text(*m_xIter, aFilters[0], 1); + m_aUserData.emplace_back(new AddressUserData_Impl); + AddressUserData_Impl* pUserData = m_aUserData.back().get(); + m_xListLB->set_id(*m_xIter, OUString::number(reinterpret_cast<sal_Int64>(pUserData))); + m_xListLB->select(*m_xIter); + ListBoxSelectHdl_Impl(*m_xListLB); + m_xCreateListPB->set_sensitive(false); } catch (const Exception&) { @@ -421,15 +366,15 @@ IMPL_LINK_NOARG(SwAddressListDialog, CreateHdl_Impl, Button*, void) } } -IMPL_LINK_NOARG(SwAddressListDialog, EditHdl_Impl, Button*, void) +IMPL_LINK_NOARG(SwAddressListDialog, EditHdl_Impl, weld::Button&, void) { - SvTreeListEntry* pEntry = m_pListLB->FirstSelected(); - AddressUserData_Impl* pUserData = pEntry ? static_cast<AddressUserData_Impl*>(pEntry->GetUserData()) : nullptr; - if(pUserData && !pUserData->sURL.isEmpty()) + int nEntry = m_xListLB->get_selected_index(); + AddressUserData_Impl* pUserData = nEntry != -1 ? reinterpret_cast<AddressUserData_Impl*>(m_xListLB->get_id(nEntry).toInt64()) : nullptr; + if (pUserData && !pUserData->sURL.isEmpty()) { if(pUserData->xResultSet.is()) { - SwMailMergeConfigItem& rConfigItem = m_pAddressPage->GetWizard()->GetConfigItem(); + SwMailMergeConfigItem& rConfigItem = m_xAddressPage->GetWizard()->GetConfigItem(); if(rConfigItem.GetResultSet() != pUserData->xResultSet) ::comphelper::disposeComponent( pUserData->xResultSet ); pUserData->xResultSet = nullptr; @@ -440,87 +385,71 @@ IMPL_LINK_NOARG(SwAddressListDialog, EditHdl_Impl, Button*, void) pUserData->xColumnsSupplier.clear(); pUserData->xConnection.clear(); // will automatically close if it was the las reference - SwCreateAddressListDialog aDlg(GetFrameWeld(), pUserData->sURL, - m_pAddressPage->GetWizard()->GetConfigItem()); + SwCreateAddressListDialog aDlg(m_xDialog.get(), pUserData->sURL, + m_xAddressPage->GetWizard()->GetConfigItem()); aDlg.run(); } }; -IMPL_LINK_NOARG(SwAddressListDialog, ListBoxSelectHdl_Impl, SvTreeListBox*, void) +IMPL_LINK_NOARG(SwAddressListDialog, ListBoxSelectHdl_Impl, weld::TreeView&, void) { - SvTreeListEntry* pSelect = m_pListLB->FirstSelected(); + int nSelect = m_xListLB->get_selected_index(); Application::PostUserEvent( LINK( this, SwAddressListDialog, - StaticListBoxSelectHdl_Impl ), pSelect, true ); + StaticListBoxSelectHdl_Impl ), reinterpret_cast<void*>(nSelect) ); } IMPL_LINK(SwAddressListDialog, StaticListBoxSelectHdl_Impl, void*, p, void) { - SvTreeListEntry* pSelect = static_cast<SvTreeListEntry*>(p); + int nSelect = reinterpret_cast<sal_IntPtr>(p); //prevent nested calls of the select handler - if(m_bInSelectHdl) + if (m_bInSelectHdl) return; - EnterWait(); + weld::WaitObject aWait(m_xDialog.get()); m_bInSelectHdl = true; AddressUserData_Impl* pUserData = nullptr; - if(pSelect) + if (nSelect != -1) { - const OUString sTable(SvTabListBox::GetEntryText(pSelect, ITEMID_TABLE - 1)); - if(sTable.isEmpty()) + const OUString sTable(m_xListLB->get_text(nSelect, 1)); + if (sTable.isEmpty()) { - m_pListLB->SetEntryText(m_sConnecting, pSelect, ITEMID_TABLE - 1); - // allow painting of the new entry - m_pListLB->Window::Invalidate(InvalidateFlags::Update); - Application::Reschedule( true ); + m_xListLB->set_text(nSelect, m_sConnecting, 1); } - pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); + pUserData = reinterpret_cast<AddressUserData_Impl*>(m_xListLB->get_id(nSelect).toInt64()); if(pUserData->nTableAndQueryCount > 1 || pUserData->nTableAndQueryCount == -1) { - /* - * We're a callback from a selection from a list box, which takes - * place on mouse down before mouse up. The next dialog also has a - * list box. Spawning it means this list box doesn't get the mouse - * down event. So it sticks on "making selection" mode. So if you - * cancel the next dialog and just move the mouse out of this entry - * and back then the dialog pops up again, without requiring a click - * - * Most expedient thing to do is to manually end the parent selection - * here. - */ - m_pListLB->EndSelection(); - DetectTablesAndQueries(pSelect, sTable.isEmpty()); + DetectTablesAndQueries(nSelect, sTable.isEmpty()); } else { //otherwise set the selected db-data - m_aDBData.sDataSource = SvTabListBox::GetEntryText(pSelect, ITEMID_NAME - 1); - m_aDBData.sCommand = SvTabListBox::GetEntryText(pSelect, ITEMID_TABLE - 1); + m_aDBData.sDataSource = m_xListLB->get_text(nSelect, 0); + m_aDBData.sCommand = m_xListLB->get_text(nSelect, 1); m_aDBData.nCommandType = pUserData->nCommandType; - m_pOK->Enable(); + m_xOK->set_sensitive(true); } - if(SvTabListBox::GetEntryText(pSelect, ITEMID_TABLE - 1) == m_sConnecting) - m_pListLB->SetEntryText(OUString(), pSelect, ITEMID_TABLE - 1); + if (m_xListLB->get_text(nSelect, 1) == m_sConnecting) + m_xListLB->set_text(nSelect, OUString(), 1); } - m_pEditPB->Enable(pUserData && !pUserData->sURL.isEmpty() && + m_xEditPB->set_sensitive(pUserData && !pUserData->sURL.isEmpty() && SWUnoHelper::UCB_IsFile( pUserData->sURL ) && //#i97577# !SWUnoHelper::UCB_IsReadOnlyFileName( pUserData->sURL ) ); m_bInSelectHdl = false; - LeaveWait(); } // detect the number of tables for a data source // if only one is available then set it at the entry void SwAddressListDialog::DetectTablesAndQueries( - SvTreeListEntry* pSelect, + int nSelect, bool bWidthDialog) { try { - AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); + AddressUserData_Impl* pUserData = reinterpret_cast<AddressUserData_Impl*>(m_xListLB->get_id(nSelect).toInt64()); uno::Reference<XCompletedConnection> xComplConnection; if(!pUserData->xConnection.is()) { - m_aDBData.sDataSource = SvTabListBox::GetEntryText(pSelect, ITEMID_NAME - 1); + m_aDBData.sDataSource = m_xListLB->get_text(nSelect, 0); m_xDBContext->getByName(m_aDBData.sDataSource) >>= xComplConnection; pUserData->xSource.set(xComplConnection, UNO_QUERY); @@ -551,8 +480,8 @@ void SwAddressListDialog::DetectTablesAndQueries( if(nTables > 1 && bWidthDialog) { //now call the table select dialog - if more than one table exists - SwSelectDBTableDialog aDlg(GetFrameWeld(), pUserData->xConnection); - const OUString sTable = SvTabListBox::GetEntryText(pSelect, ITEMID_TABLE - 1); + SwSelectDBTableDialog aDlg(m_xDialog.get(), pUserData->xConnection); + const OUString sTable = m_xListLB->get_text(nSelect, 1); if(!sTable.isEmpty()) aDlg.SetSelectedTable(sTable, pUserData->nCommandType == CommandType::TABLE); if(RET_OK == aDlg.run()) @@ -589,53 +518,57 @@ void SwAddressListDialog::DetectTablesAndQueries( SwDBSelect::TABLE : SwDBSelect::QUERY ); //#i97577# if( pUserData->xColumnsSupplier.is() ) - m_pListLB->SetEntryText(m_aDBData.sCommand, pSelect, ITEMID_TABLE - 1); + m_xListLB->set_text(nSelect, m_aDBData.sCommand, 1); else - m_pListLB->SetEntryText(OUString(), pSelect, ITEMID_TABLE - 1); + m_xListLB->set_text(nSelect, OUString(), 1); } - const OUString sCommand = SvTabListBox::GetEntryText(pSelect, ITEMID_TABLE - 1); - m_pOK->Enable(pSelect && !sCommand.isEmpty()); - m_pFilterPB->Enable( pUserData->xConnection.is() && !sCommand.isEmpty() ); - m_pTablePB->Enable( pUserData->nTableAndQueryCount > 1 ); + const OUString sCommand = m_xListLB->get_text(nSelect, 1); + m_xOK->set_sensitive(!sCommand.isEmpty()); + m_xFilterPB->set_sensitive( pUserData->xConnection.is() && !sCommand.isEmpty() ); + m_xTablePB->set_sensitive( pUserData->nTableAndQueryCount > 1 ); } catch (const Exception&) { OSL_FAIL("exception caught in SwAddressListDialog::DetectTablesAndQueries"); - m_pOK->Enable( false ); + m_xOK->set_sensitive(false); } } -IMPL_LINK(SwAddressListDialog, TableSelectHdl_Impl, Button*, pButton, void) +IMPL_LINK(SwAddressListDialog, TableSelectHdl_Impl, weld::Button&, rButton, void) +{ + TableSelectHdl(&rButton); +} + +void SwAddressListDialog::TableSelectHdl(weld::Button* pButton) { - EnterWait(); - SvTreeListEntry* pSelect = m_pListLB->FirstSelected(); - if(pSelect) + weld::WaitObject aWait(m_xDialog.get()); + + int nSelect = m_xListLB->get_selected_index(); + if (nSelect != -1) { - AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); + AddressUserData_Impl* pUserData = reinterpret_cast<AddressUserData_Impl*>(m_xListLB->get_id(nSelect).toInt64()); //only call the table select dialog if tables have not been searched for or there //are more than 1 - const OUString sTable = SvTabListBox::GetEntryText(pSelect, ITEMID_TABLE - 1); + const OUString sTable = m_xListLB->get_text(nSelect, 1); if( pUserData->nTableAndQueryCount > 1 || pUserData->nTableAndQueryCount == -1) { - DetectTablesAndQueries(pSelect, (pButton != nullptr) || sTable.isEmpty()); + DetectTablesAndQueries(nSelect, (pButton != nullptr) || sTable.isEmpty()); } } - - LeaveWait(); } -IMPL_LINK_NOARG(SwAddressListDialog, OKHdl_Impl, Button*, void) +IMPL_LINK_NOARG(SwAddressListDialog, OKHdl_Impl, weld::Button&, void) { - EndDialog(RET_OK); + m_xDialog->response(RET_OK); } uno::Reference< XDataSource> SwAddressListDialog::GetSource() { uno::Reference< XDataSource> xRet; - SvTreeListEntry* pSelect = m_pListLB->FirstSelected(); - if(pSelect) + int nSelect = m_xListLB->get_selected_index(); + if (nSelect != -1) { - AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); + AddressUserData_Impl* pUserData = reinterpret_cast<AddressUserData_Impl*>(m_xListLB->get_id(nSelect).toInt64()); xRet = pUserData->xSource; } return xRet; @@ -645,10 +578,10 @@ uno::Reference< XDataSource> SwAddressListDialog::GetSource() SharedConnection SwAddressListDialog::GetConnection() { SharedConnection xRet; - SvTreeListEntry* pSelect = m_pListLB->FirstSelected(); - if(pSelect) + int nSelect = m_xListLB->get_selected_index(); + if (nSelect != -1) { - AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); + AddressUserData_Impl* pUserData = reinterpret_cast<AddressUserData_Impl*>(m_xListLB->get_id(nSelect).toInt64()); xRet = pUserData->xConnection; } return xRet; @@ -657,21 +590,21 @@ SharedConnection SwAddressListDialog::GetConnection() uno::Reference< XColumnsSupplier> SwAddressListDialog::GetColumnsSupplier() { uno::Reference< XColumnsSupplier> xRet; - SvTreeListEntry* pSelect = m_pListLB->FirstSelected(); - if(pSelect) + int nSelect = m_xListLB->get_selected_index(); + if (nSelect != -1) { - AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); + AddressUserData_Impl* pUserData = reinterpret_cast<AddressUserData_Impl*>(m_xListLB->get_id(nSelect).toInt64()); xRet = pUserData->xColumnsSupplier; } return xRet; } -OUString SwAddressListDialog::GetFilter() +OUString SwAddressListDialog::GetFilter() { - SvTreeListEntry* pSelect = m_pListLB->FirstSelected(); - if(pSelect) + int nSelect = m_xListLB->get_selected_index(); + if (nSelect != -1) { - AddressUserData_Impl* pUserData = static_cast<AddressUserData_Impl*>(pSelect->GetUserData()); + AddressUserData_Impl* pUserData = reinterpret_cast<AddressUserData_Impl*>(m_xListLB->get_id(nSelect).toInt64()); return pUserData->sFilter; } return OUString(); diff --git a/sw/source/ui/dbui/addresslistdialog.hxx b/sw/source/ui/dbui/addresslistdialog.hxx index 9e94c7f55457..1f56408bcb45 100644 --- a/sw/source/ui/dbui/addresslistdialog.hxx +++ b/sw/source/ui/dbui/addresslistdialog.hxx @@ -41,50 +41,50 @@ namespace com{namespace sun{namespace star{ } }}} class SwMailMergeAddressBlockPage; -class SwAddrSourceLB; -class SwAddressListDialog : public SfxModalDialog -{ - VclPtr<FixedText> m_pDescriptionFI; - - VclPtr<SwAddrSourceLB> m_pListLB; - - VclPtr<PushButton> m_pLoadListPB; - VclPtr<PushButton> m_pCreateListPB; - VclPtr<PushButton> m_pFilterPB; - VclPtr<PushButton> m_pEditPB; - VclPtr<PushButton> m_pTablePB; - - VclPtr<OKButton> m_pOK; +struct AddressUserData_Impl; +class SwAddressListDialog : public SfxDialogController +{ OUString m_sConnecting; - SvTreeListEntry* m_pCreatedDataSource; - bool m_bInSelectHdl; - VclPtr<SwMailMergeAddressBlockPage> m_pAddressPage; + VclPtr<SwMailMergeAddressBlockPage> m_xAddressPage; css::uno::Reference< css::sdb::XDatabaseContext> m_xDBContext; SwDBData m_aDBData; - void DetectTablesAndQueries(SvTreeListEntry* pSelect, bool bWidthDialog); - - DECL_LINK(FilterHdl_Impl, Button*, void); - DECL_LINK(LoadHdl_Impl, Button*, void); - DECL_LINK(CreateHdl_Impl, Button*, void); - DECL_LINK(ListBoxSelectHdl_Impl, SvTreeListBox*, void); - DECL_LINK(EditHdl_Impl, Button*, void); - DECL_LINK(TableSelectHdl_Impl, Button*, void); - DECL_LINK(OKHdl_Impl, Button*, void); + std::vector<std::unique_ptr<AddressUserData_Impl>> m_aUserData; + + std::unique_ptr<weld::Label> m_xDescriptionFI; + std::unique_ptr<weld::Label> m_xConnecting; + std::unique_ptr<weld::TreeView> m_xListLB; + std::unique_ptr<weld::Button> m_xLoadListPB; + std::unique_ptr<weld::Button> m_xCreateListPB; + std::unique_ptr<weld::Button> m_xFilterPB; + std::unique_ptr<weld::Button> m_xEditPB; + std::unique_ptr<weld::Button> m_xTablePB; + std::unique_ptr<weld::Button> m_xOK; + std::unique_ptr<weld::TreeIter> m_xIter; + + void DetectTablesAndQueries(int Select, bool bWidthDialog); + + DECL_LINK(FilterHdl_Impl, weld::Button&, void); + DECL_LINK(LoadHdl_Impl, weld::Button&, void); + DECL_LINK(CreateHdl_Impl, weld::Button&, void); + DECL_LINK(ListBoxSelectHdl_Impl, weld::TreeView&, void); + DECL_LINK(EditHdl_Impl, weld::Button&, void); + DECL_LINK(TableSelectHdl_Impl, weld::Button&, void); + void TableSelectHdl(weld::Button* pButton); + DECL_LINK(OKHdl_Impl, weld::Button&, void); DECL_LINK(StaticListBoxSelectHdl_Impl, void*, void); public: SwAddressListDialog(SwMailMergeAddressBlockPage* pParent); virtual ~SwAddressListDialog() override; - virtual void dispose() override; css::uno::Reference< css::sdbc::XDataSource> GetSource(); diff --git a/sw/source/ui/dbui/mmaddressblockpage.cxx b/sw/source/ui/dbui/mmaddressblockpage.cxx index 2e50668fef41..4ff0595800aa 100644 --- a/sw/source/ui/dbui/mmaddressblockpage.cxx +++ b/sw/source/ui/dbui/mmaddressblockpage.cxx @@ -168,16 +168,16 @@ IMPL_LINK_NOARG(SwMailMergeAddressBlockPage, AddressListHdl_Impl, Button*, void) { try { - ScopedVclPtrInstance< SwAddressListDialog > xAddrDialog(this); - if(RET_OK == xAddrDialog->Execute()) + SwAddressListDialog aAddrDialog(this); + if (RET_OK == aAddrDialog.run()) { SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); rConfigItem.SetCurrentConnection( - xAddrDialog->GetSource(), - xAddrDialog->GetConnection(), - xAddrDialog->GetColumnsSupplier(), - xAddrDialog->GetDBData()); - OUString sFilter = xAddrDialog->GetFilter(); + aAddrDialog.GetSource(), + aAddrDialog.GetConnection(), + aAddrDialog.GetColumnsSupplier(), + aAddrDialog.GetDBData()); + OUString sFilter = aAddrDialog.GetFilter(); rConfigItem.SetFilter( sFilter ); InsertDataHdl_Impl(nullptr); GetWizard()->UpdateRoadmap(); diff --git a/sw/uiconfig/swriter/ui/selectaddressdialog.ui b/sw/uiconfig/swriter/ui/selectaddressdialog.ui index a4c872614123..fee262987398 100644 --- a/sw/uiconfig/swriter/ui/selectaddressdialog.ui +++ b/sw/uiconfig/swriter/ui/selectaddressdialog.ui @@ -1,14 +1,26 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.18.3 --> +<!-- Generated with glade 3.22.1 --> <interface domain="sw"> <requires lib="gtk+" version="3.18"/> - <requires lib="LibreOffice" version="1.0"/> + <object class="GtkTreeStore" id="liststore1"> + <columns> + <!-- column-name text --> + <column type="gchararray"/> + <!-- column-name text2 --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gchararray"/> + </columns> + </object> <object class="GtkDialog" id="SelectAddressDialog"> <property name="can_focus">False</property> <property name="border_width">6</property> <property name="title" translatable="yes" context="selectaddressdialog|SelectAddressDialog">Select Address List</property> <property name="resizable">False</property> <property name="type_hint">dialog</property> + <child> + <placeholder/> + </child> <child internal-child="vbox"> <object class="GtkBox" id="dialog-vbox1"> <property name="can_focus">False</property> @@ -82,10 +94,11 @@ <object class="GtkLabel" id="desc"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="xalign">0</property> <property name="label" translatable="yes" context="selectaddressdialog|desc">Select an address list. Click '%1' to select recipients from a different list. If you do not have an address list you can create one by clicking '%2'.</property> <property name="wrap">True</property> + <property name="width_chars">52</property> <property name="max_width_chars">52</property> + <property name="xalign">0</property> </object> <packing> <property name="left_attach">0</property> @@ -104,8 +117,8 @@ <object class="GtkLabel" id="label2"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="xalign">0</property> <property name="label" translatable="yes" context="selectaddressdialog|label2">Your recipients are currently selected from:</property> + <property name="xalign">0</property> </object> <packing> <property name="left_attach">0</property> @@ -197,48 +210,63 @@ </packing> </child> <child> - <object class="GtkGrid" id="grid3"> - <property name="visible">True</property> + <object class="GtkLabel" id="connecting"> <property name="can_focus">False</property> + <property name="no_show_all">True</property> + <property name="label" translatable="yes" context="selectaddressdialog|connecting">Connecting to data source...</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow"> + <property name="visible">True</property> + <property name="can_focus">True</property> <property name="hexpand">True</property> <property name="vexpand">True</property> + <property name="shadow_type">in</property> <child> - <object class="svtlo-SvSimpleTableContainer" id="sources:border"> + <object class="GtkTreeView" id="sources"> <property name="visible">True</property> <property name="can_focus">True</property> + <property name="receives_default">True</property> <property name="hexpand">True</property> <property name="vexpand">True</property> + <property name="model">liststore1</property> + <property name="search_column">0</property> + <property name="show_expanders">False</property> <child internal-child="selection"> - <object class="GtkTreeSelection" id="Simple Table Container-selection4"/> + <object class="GtkTreeSelection" id="Macro Library List-selection1"/> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn1"> + <property name="resizable">True</property> + <property name="spacing">6</property> + <property name="title" translatable="yes" context="selectaddressdialog|name">Name</property> + <child> + <object class="GtkCellRendererText" id="cellrenderer1"/> + <attributes> + <attribute name="text">0</attribute> + </attributes> + </child> + </object> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn2"> + <property name="resizable">True</property> + <property name="spacing">6</property> + <property name="title" translatable="yes" context="selectaddressdialog|table">Table</property> + <child> + <object class="GtkCellRendererText" id="cellrenderer2"/> + <attributes> + <attribute name="text">1</attribute> + </attributes> + </child> + </object> </child> </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">1</property> - <property name="width">2</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="name"> - <property name="can_focus">False</property> - <property name="no_show_all">True</property> - <property name="label" translatable="yes" context="selectaddressdialog|name">Name</property> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="table"> - <property name="can_focus">False</property> - <property name="no_show_all">True</property> - <property name="label" translatable="yes" context="selectaddressdialog|table">Table</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">0</property> - </packing> </child> </object> <packing> @@ -246,17 +274,6 @@ <property name="top_attach">1</property> </packing> </child> - <child> - <object class="GtkLabel" id="connecting"> - <property name="can_focus">False</property> - <property name="no_show_all">True</property> - <property name="label" translatable="yes" context="selectaddressdialog|connecting">Connecting to data source...</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">0</property> - </packing> - </child> </object> <packing> <property name="left_attach">0</property> _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits