diff options
author | Caolán McNamara <caolanm@redhat.com> | 2019-03-28 21:25:30 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2019-04-01 15:45:07 +0200 |
commit | e6f7e778aa0a91e567e6f7d19fecf4af6b8d089f (patch) | |
tree | 25f86c784ffea3efc527f00807fc7f76333017d3 | |
parent | 330df37c7e2af0564bcd2de1f171bed4befcc074 (diff) |
weld SwAssignFieldsDialog
Change-Id: I1242f89b4a2809c730b9bc7c2b6b7207edabd47f
Reviewed-on: https://gerrit.libreoffice.org/70015
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r-- | extras/source/glade/libreoffice-catalog.xml.in | 3 | ||||
-rw-r--r-- | sw/UIConfig_swriter.mk | 1 | ||||
-rw-r--r-- | sw/source/ui/dbui/createaddresslistdialog.cxx | 1 | ||||
-rw-r--r-- | sw/source/ui/dbui/mmaddressblockpage.cxx | 465 | ||||
-rw-r--r-- | sw/source/ui/dbui/mmaddressblockpage.hxx | 32 | ||||
-rw-r--r-- | sw/source/ui/dbui/mmgreetingspage.cxx | 5 | ||||
-rw-r--r-- | sw/uiconfig/swriter/ui/assignfieldsdialog.ui | 159 | ||||
-rw-r--r-- | sw/uiconfig/swriter/ui/assignfragment.ui | 22 |
8 files changed, 339 insertions, 349 deletions
diff --git a/extras/source/glade/libreoffice-catalog.xml.in b/extras/source/glade/libreoffice-catalog.xml.in index 57106338489d..f89e0d3ddbcd 100644 --- a/extras/source/glade/libreoffice-catalog.xml.in +++ b/extras/source/glade/libreoffice-catalog.xml.in @@ -203,9 +203,6 @@ <glade-widget-class title="Address Preview" name="swlo-SwAddressPreview" generic-name="Address Preview" parent="GtkDrawingArea" icon-name="widget-gtk-drawingarea"/> - <glade-widget-class title="Assign Fields Control" name="swuilo-SwAssignFieldsControl" - generic-name="Assign Fields Control" parent="GtkDrawingArea" - icon-name="widget-gtk-drawingarea"/> <glade-widget-class title="Chart Light Button" name="chartcontrollerlo-LightButton" generic-name="ChartLightButton" parent="GtkButton" icon-name="widget-gtk-button"/> diff --git a/sw/UIConfig_swriter.mk b/sw/UIConfig_swriter.mk index b285bc0dc4ad..b8fad62dce47 100644 --- a/sw/UIConfig_swriter.mk +++ b/sw/UIConfig_swriter.mk @@ -94,6 +94,7 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/swriter,\ sw/uiconfig/swriter/ui/asciifilterdialog \ sw/uiconfig/swriter/ui/asksearchdialog \ sw/uiconfig/swriter/ui/assignfieldsdialog \ + sw/uiconfig/swriter/ui/assignfragment \ sw/uiconfig/swriter/ui/assignstylesdialog \ sw/uiconfig/swriter/ui/attachnamedialog \ sw/uiconfig/swriter/ui/authenticationsettingsdialog \ diff --git a/sw/source/ui/dbui/createaddresslistdialog.cxx b/sw/source/ui/dbui/createaddresslistdialog.cxx index 3950bb7952d9..9e9626ae0356 100644 --- a/sw/source/ui/dbui/createaddresslistdialog.cxx +++ b/sw/source/ui/dbui/createaddresslistdialog.cxx @@ -54,7 +54,6 @@ using namespace ::com::sun::star::ui::dialogs; struct SwAddressFragment { std::unique_ptr<weld::Builder> m_xBuilder; - std::unique_ptr<weld::Container> m_xOrigContainer; std::unique_ptr<weld::Label> m_xLabel; std::unique_ptr<weld::Entry> m_xEntry; diff --git a/sw/source/ui/dbui/mmaddressblockpage.cxx b/sw/source/ui/dbui/mmaddressblockpage.cxx index 4ff0595800aa..b5bec37c60d6 100644 --- a/sw/source/ui/dbui/mmaddressblockpage.cxx +++ b/sw/source/ui/dbui/mmaddressblockpage.cxx @@ -51,13 +51,6 @@ using namespace ::com::sun::star::sdb; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::sdbcx; -static void lcl_Move(Control* pCtrl, long nYOffset) -{ - Point aPos(pCtrl->GetPosPixel()); - aPos.AdjustY(nYOffset ); - pCtrl->SetPosPixel(aPos); -} - SwMailMergeAddressBlockPage::SwMailMergeAddressBlockPage( SwMailMergeWizard* _pParent) : svt::OWizardPage(_pParent, "MMAddressBlockPage", "modules/swriter/ui/mmaddressblockpage.ui") @@ -221,10 +214,8 @@ IMPL_LINK(SwMailMergeAddressBlockPage, AssignHdl_Impl, Button*, pButton, void) SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); const sal_uInt16 nSel = m_pSettingsWIN->GetSelectedAddress(); const uno::Sequence< OUString> aBlocks = rConfigItem.GetAddressBlocks(); - ScopedVclPtr<SwAssignFieldsDialog> pDlg( - VclPtr<SwAssignFieldsDialog>::Create( - pButton, m_pWizard->GetConfigItem(), aBlocks[nSel], true)); - if(RET_OK == pDlg->Execute()) + SwAssignFieldsDialog aDlg(pButton->GetFrameWeld(), m_pWizard->GetConfigItem(), aBlocks[nSel], true); + if(RET_OK == aDlg.run()) { //preview update InsertDataHdl_Impl(nullptr); @@ -789,81 +780,69 @@ OUString SwCustomizeAddressBlockDialog::GetAddress() return sAddress; } -class SwAssignFieldsControl : public Control +struct SwAssignFragment { - friend class SwAssignFieldsDialog; - VclPtr<ScrollBar> m_aVScroll; - VclPtr<HeaderBar> m_aHeaderHB; - VclPtr<Window> m_aWindow; + std::unique_ptr<weld::Builder> m_xBuilder; + std::unique_ptr<weld::Label> m_xLabel; + std::unique_ptr<weld::ComboBox> m_xComboBox; + std::unique_ptr<weld::Label> m_xPreview; - std::vector<VclPtr<FixedText> > m_aFieldNames; - std::vector<VclPtr<ListBox> > m_aMatches; - std::vector<VclPtr<FixedText> > m_aPreviews; + SwAssignFragment(weld::Container* pGrid, int nLine) + : m_xBuilder(Application::CreateBuilder(pGrid, "modules/swriter/ui/assignfragment.ui")) + , m_xLabel(m_xBuilder->weld_label("label")) + , m_xComboBox(m_xBuilder->weld_combo_box("combobox")) + , m_xPreview(m_xBuilder->weld_label("preview")) + { + m_xLabel->set_grid_left_attach(0); + m_xLabel->set_grid_top_attach(nLine); - SwMailMergeConfigItem* m_rConfigItem; + m_xComboBox->set_grid_left_attach(1); + m_xComboBox->set_grid_top_attach(nLine); - Link<LinkParamNone*,void> m_aModifyHdl; + m_xPreview->set_grid_left_attach(2); + m_xPreview->set_grid_top_attach(nLine); + } +}; - long m_nLBStartTopPos; - long m_nYOffset; - long m_nFirstYPos; +class SwAssignFieldsControl +{ + friend class SwAssignFieldsDialog; + std::unique_ptr<weld::ScrolledWindow> m_xVScroll; + std::unique_ptr<weld::Container> m_xGrid; - DECL_LINK(ScrollHdl_Impl, ScrollBar*, void); - DECL_LINK(MatchHdl_Impl, ListBox&, void); - DECL_LINK(GotFocusHdl_Impl, Control&, void); + std::vector<SwAssignFragment> m_aFields; - virtual bool PreNotify( NotifyEvent& rNEvt ) override; - virtual void Command( const CommandEvent& rCEvt ) override; + SwMailMergeConfigItem* m_rConfigItem; - void MakeVisible( sal_Int32 nIndex ); -public: - SwAssignFieldsControl(vcl::Window* pParent, WinBits nBits); - virtual ~SwAssignFieldsControl() override; - virtual void dispose() override; + Link<LinkParamNone*,void> m_aModifyHdl; - void Init(SwMailMergeConfigItem& rConfigItem); - void SetModifyHdl(const Link<LinkParamNone*,void>& rModifyHdl) - { - m_aModifyHdl = rModifyHdl; - m_aModifyHdl.Call(nullptr); - } - virtual void Resize() override; - virtual Size GetOptimalSize() const override; -}; + DECL_LINK(MatchHdl_Impl, weld::ComboBox&, void); + DECL_LINK(GotFocusHdl_Impl, weld::Widget&, void); -VCL_BUILDER_FACTORY_ARGS(SwAssignFieldsControl, WB_BORDER) + void MakeVisible(const tools::Rectangle & rRect); +public: + SwAssignFieldsControl(std::unique_ptr<weld::ScrolledWindow> xWindow, + std::unique_ptr<weld::Container> xGrid); -SwAssignFieldsControl::SwAssignFieldsControl(vcl::Window* pParent, WinBits nBits) : - Control(pParent, nBits | WB_DIALOGCONTROL | WB_TABSTOP), - m_aVScroll(VclPtr<ScrollBar>::Create(this)), - m_aHeaderHB(VclPtr<HeaderBar>::Create(this, WB_BUTTONSTYLE | WB_BOTTOMBORDER)), - m_aWindow(VclPtr<vcl::Window>::Create(this, WB_BORDER | WB_DIALOGCONTROL)), - m_rConfigItem(nullptr), - m_nLBStartTopPos(0), - m_nYOffset(0), - m_nFirstYPos(0) -{ - long nHBHeight = m_aHeaderHB->CalcWindowSizePixel().Height(); - Size aOutputSize(GetOutputSize()); - m_aVScroll->Show(); - m_aHeaderHB->SetSizePixel( - Size(aOutputSize.Width(), nHBHeight)); - m_aHeaderHB->Show(); - m_aWindow->SetPosPixel(Point( 0, nHBHeight) ); - m_aWindow->SetSizePixel(Size(aOutputSize.Width() - m_aVScroll->GetSizePixel().Width(), aOutputSize.Height() - nHBHeight)); - m_aWindow->Show(); -} + void Init(SwAssignFieldsDialog* pDialog, SwMailMergeConfigItem& rConfigItem); + void SetModifyHdl(const Link<LinkParamNone*,void>& rModifyHdl) + { + m_aModifyHdl = rModifyHdl; + m_aModifyHdl.Call(nullptr); + } +}; -Size SwAssignFieldsControl::GetOptimalSize() const +SwAssignFieldsControl::SwAssignFieldsControl(std::unique_ptr<weld::ScrolledWindow> xWindow, + std::unique_ptr<weld::Container> xGrid) + : m_xVScroll(std::move(xWindow)) + , m_xGrid(std::move(xGrid)) + , m_rConfigItem(nullptr) { - return LogicToPixel(Size(248, 120), MapMode(MapUnit::MapAppFont)); } -void SwAssignFieldsControl::Init(SwMailMergeConfigItem& rConfigItem) +void SwAssignFieldsControl::Init(SwAssignFieldsDialog* pDialog, SwMailMergeConfigItem& rConfigItem) { m_rConfigItem = &rConfigItem; - Size aOutputSize(GetOutputSize()); - long nHBHeight = m_aHeaderHB->CalcWindowSizePixel().Height(); //get the name of the default headers const std::vector<std::pair<OUString, int>>& rHeaders = rConfigItem.GetDefaultAddressHeaders(); @@ -880,226 +859,85 @@ void SwAssignFieldsControl::Init(SwMailMergeConfigItem& rConfigItem) //each position in this sequence matches the position in the header array rHeaders //if no assignment is available an empty sequence will be returned uno::Sequence< OUString> aAssignments = rConfigItem.GetColumnAssignment( rConfigItem.GetCurrentDBData() ); - Link<ListBox&,void> aMatchHdl = LINK(this, SwAssignFieldsControl, MatchHdl_Impl); - Link<Control&,void> aFocusHdl = LINK(this, SwAssignFieldsControl, GotFocusHdl_Impl); + Link<weld::ComboBox&,void> aMatchHdl = LINK(this, SwAssignFieldsControl, MatchHdl_Impl); + Link<weld::Widget&,void> aFocusHdl = LINK(this, SwAssignFieldsControl, GotFocusHdl_Impl); + + int nLabelWidth(0), nComboBoxWidth(0), nPreviewWidth(0); //fill the controls - long nControlWidth = aOutputSize.Width() / 3; - long nControlHeight = -1; for (size_t i = 0; i < rHeaders.size(); ++i) { + m_aFields.emplace_back(m_xGrid.get(), i); + const OUString rHeader = rHeaders[i].first; - VclPtr<FixedText> pNewText = VclPtr<FixedText>::Create(m_aWindow.get(), WB_VCENTER); - pNewText->SetText("<" + rHeader + ">"); - VclPtr<ListBox> pNewLB = VclPtr<ListBox>::Create(m_aWindow.get(), WB_DROPDOWN | WB_VCENTER | WB_TABSTOP); - pNewText->set_mnemonic_widget(pNewLB); - pNewLB->InsertEntry(SwResId(SW_STR_NONE)); - pNewLB->SelectEntryPos(0); - pNewLB->SetDropDownLineCount(5); - - if (nControlHeight == -1) //first time - { - nControlHeight = std::max(pNewLB->get_preferred_size().Height(), - pNewText->get_preferred_size().Height()); - } + weld::ComboBox& rNewLB = *m_aFields.back().m_xComboBox; + rNewLB.append_text(SwResId(SW_STR_NONE)); + rNewLB.set_active(0); - for(sal_Int32 nField = 0; nField < aFields.getLength(); ++nField) - pNewLB->InsertEntry(pFields[nField]); - VclPtr<FixedText> pNewPreview = VclPtr<FixedText>::Create(m_aWindow.get(), WB_VCENTER); - pNewText->SetSizePixel(Size(nControlWidth - 6, nControlHeight)); - pNewLB->SetSizePixel(Size(nControlWidth - 6, nControlHeight)); - pNewPreview->SetSizePixel(Size(aOutputSize.Width() - 2 * nControlWidth, nControlHeight)); + for (sal_Int32 nField = 0; nField < aFields.getLength(); ++nField) + rNewLB.append_text(pFields[nField]); //select the ListBox //if there is an assignment if(static_cast<sal_uInt32>(aAssignments.getLength()) > i && !aAssignments[i].isEmpty()) - pNewLB->SelectEntry(aAssignments[i]); + rNewLB.set_active_text(aAssignments[i]); else //otherwise the current column name may match one of the db columns - pNewLB->SelectEntry(rHeader); + rNewLB.set_active_text(rHeader); + + weld::Label& rNewText = *m_aFields.back().m_xLabel; + rNewText.set_label("<" + rHeader + ">"); + + weld::Label& rNewPreview = *m_aFields.back().m_xPreview; //then the preview can be filled accordingly - if(xColAccess.is() && pNewLB->GetSelectedEntryPos() > 0 && - xColAccess->hasByName(pNewLB->GetSelectedEntry())) + if (xColAccess.is() && rNewLB.get_active() > 0 && + xColAccess->hasByName(rNewLB.get_active_text())) { - uno::Any aCol = xColAccess->getByName(pNewLB->GetSelectedEntry()); + uno::Any aCol = xColAccess->getByName(rNewLB.get_active_text()); uno::Reference< XColumn > xColumn; aCol >>= xColumn; if(xColumn.is()) { try { - pNewPreview->SetText(xColumn->getString()); + rNewPreview.set_label(xColumn->getString()); } catch (const SQLException&) { } } } - if(!i) - { - //determine the vertical offset, use the bottom position of the ListBox - m_nFirstYPos = m_nYOffset = pNewLB->GetPosPixel().Y(); - m_nLBStartTopPos = m_nYOffset; - m_nYOffset += pNewLB->GetSizePixel().Height() + 6; - } - - long nMove = m_nYOffset * i; - pNewLB->SetSelectHdl(aMatchHdl); - pNewLB->SetGetFocusHdl(aFocusHdl); - - m_aFieldNames.push_back(pNewText); - m_aMatches.push_back(pNewLB); - m_aPreviews.push_back(pNewPreview); - pNewText->Show(); - pNewText->SetPosPixel(Point(6, nMove)); - pNewLB->Show(); - pNewLB->SetPosPixel(Point(nControlWidth, nMove)); - pNewPreview->Show(); - pNewPreview->SetPosPixel(Point(2 * nControlWidth + 6, nMove)); - } - m_aVScroll->SetRange(Range(0, rHeaders.size())); - m_aVScroll->SetPageSize((aOutputSize.Height() - nHBHeight - m_nLBStartTopPos)/ m_nYOffset); - m_aVScroll->EnableDrag(); - m_aVScroll->SetVisibleSize(m_aVScroll->GetPageSize()); - m_aVScroll->SetScrollHdl(LINK(this, SwAssignFieldsControl, ScrollHdl_Impl)); - - m_aVScroll->SetPosPixel(Point(aOutputSize.Width() - m_aVScroll->GetSizePixel().Width(), nHBHeight)); - m_aVScroll->SetSizePixel(Size(m_aVScroll->GetSizePixel().Width(), aOutputSize.Height() - nHBHeight)); -} - -SwAssignFieldsControl::~SwAssignFieldsControl() -{ - disposeOnce(); -} -void SwAssignFieldsControl::dispose() -{ - for(auto& rFIItem : m_aFieldNames) - rFIItem.disposeAndClear(); - for(auto& rLBItem : m_aMatches) - rLBItem.disposeAndClear(); - for(auto& rFIItem : m_aPreviews) - rFIItem.disposeAndClear(); - - m_aFieldNames.clear(); - m_aMatches.clear(); - m_aPreviews.clear(); - - m_aVScroll.disposeAndClear(); - m_aHeaderHB.disposeAndClear(); - m_aWindow.disposeAndClear(); - Control::dispose(); -} - -void SwAssignFieldsControl::Resize() -{ - Window::Resize(); - - Size aOutputSize = GetOutputSize(); - long nHBHeight = m_aHeaderHB->CalcWindowSizePixel().Height(); - - m_aWindow->SetSizePixel(Size(aOutputSize.Width() - m_aVScroll->GetSizePixel().Width(), aOutputSize.Height() - nHBHeight)); - - m_aVScroll->SetPosPixel(Point(aOutputSize.Width() - m_aVScroll->GetSizePixel().Width(), nHBHeight)); - m_aVScroll->SetSizePixel(Size(m_aVScroll->GetSizePixel().Width(), aOutputSize.Height() - nHBHeight)); - if(m_nYOffset) - m_aVScroll->SetPageSize((aOutputSize.Height() - nHBHeight - m_nLBStartTopPos)/ m_nYOffset); - m_aVScroll->SetVisibleSize(m_aVScroll->GetPageSize()); - m_aVScroll->DoScroll(0); - - sal_Int32 nColWidth = aOutputSize.Width() / 3; - m_aHeaderHB->SetSizePixel(Size(aOutputSize.Width(), nHBHeight)); - m_aHeaderHB->SetItemSize(1, nColWidth); - m_aHeaderHB->SetItemSize(2, nColWidth); - m_aHeaderHB->SetItemSize(3, nColWidth); - - if (m_aFieldNames.empty() || m_aMatches.empty()) - return; - - long nControlHeight = std::max(m_aFieldNames[0]->get_preferred_size().Height(), - m_aMatches[0]->get_preferred_size().Height()); - - for(auto& rFIItem : m_aFieldNames) - rFIItem->SetSizePixel(Size(nColWidth - 6, nControlHeight)); - for(auto& rLBItem : m_aMatches) - { - long nPosY = rLBItem->GetPosPixel().Y(); - rLBItem->SetPosSizePixel(Point(nColWidth, nPosY), Size(nColWidth - 6, nControlHeight)); - } - for(auto& rFIItem : m_aPreviews) - { - long nPosY = rFIItem->GetPosPixel().Y(); - rFIItem->SetPosSizePixel(Point(2 * nColWidth + 6, nPosY), Size(nColWidth, nControlHeight)); - } -} - -void SwAssignFieldsControl::Command( const CommandEvent& rCEvt ) -{ - switch ( rCEvt.GetCommand() ) - { - case CommandEventId::Wheel: - case CommandEventId::StartAutoScroll: - case CommandEventId::AutoScroll: + if (i == 0) { - const CommandWheelData* pWheelData = rCEvt.GetWheelData(); - if(pWheelData && !pWheelData->IsHorz() && CommandWheelMode::ZOOM != pWheelData->GetMode()) - { - HandleScrollCommand( rCEvt, nullptr, m_aVScroll.get() ); - } + auto nLineHeight = m_xGrid->get_preferred_size().Height(); + m_xVScroll->set_size_request(m_xVScroll->get_approximate_digit_width() * 65, + nLineHeight * 6); + nComboBoxWidth = rNewLB.get_preferred_size().Width(); } - break; - default: - Control::Command(rCEvt); - } -} -bool SwAssignFieldsControl::PreNotify( NotifyEvent& rNEvt ) -{ - if(rNEvt.GetType() == MouseNotifyEvent::COMMAND) - { - const CommandEvent* pCEvt = rNEvt.GetCommandEvent(); - if( pCEvt->GetCommand() == CommandEventId::Wheel ) - { - Command(*pCEvt); - return true; - } + nLabelWidth = std::max<int>(nLabelWidth, rNewText.get_preferred_size().Width()); + nPreviewWidth = std::max<int>(nPreviewWidth, rNewPreview.get_preferred_size().Width()); + + rNewLB.connect_changed(aMatchHdl); + rNewLB.connect_focus_in(aFocusHdl); + rNewText.show(); + rNewLB.show(); + rNewPreview.show(); } - return Control::PreNotify(rNEvt); + pDialog->ConnectSizeGroups(nLabelWidth, nComboBoxWidth, nPreviewWidth); } -void SwAssignFieldsControl::MakeVisible( sal_Int32 nIndex ) +void SwAssignFieldsControl::MakeVisible(const tools::Rectangle & rRect) { - long nThumb = m_aVScroll->GetThumbPos(); - long nPage = m_aVScroll->GetPageSize(); - if(nThumb > nIndex) - m_aVScroll->SetThumbPos( nIndex ); - else if( (nThumb + nPage) < nIndex) - m_aVScroll->SetThumbPos( nIndex - nPage ); - else - return; - ScrollHdl_Impl( m_aVScroll.get() ); + //determine range of visible positions + auto nMinVisiblePos = m_xVScroll->vadjustment_get_value(); + auto nMaxVisiblePos = nMinVisiblePos + m_xVScroll->vadjustment_get_page_size(); + if (rRect.Top() < nMinVisiblePos || rRect.Bottom() > nMaxVisiblePos) + m_xVScroll->vadjustment_set_value(rRect.Top()); } -IMPL_LINK(SwAssignFieldsControl, ScrollHdl_Impl, ScrollBar*, pScroll, void) +IMPL_LINK(SwAssignFieldsControl, MatchHdl_Impl, weld::ComboBox&, rBox, void) { - long nThumb = pScroll->GetThumbPos(); - // the scrollbar moves on a per line basis - // the height of a line is stored in m_nYOffset - // nThumb determines which line has to be set at the top (m_nYOffset) - // The first line has to be -(nThumb * m_nYOffset) in the negative - long nMove = m_nFirstYPos - (*m_aMatches.begin())->GetPosPixel().Y() - (nThumb * m_nYOffset); - - SetUpdateMode(false); - for(auto& rFIItem : m_aFieldNames) - lcl_Move(rFIItem, nMove); - for(auto& rLBItem : m_aMatches) - lcl_Move(rLBItem, nMove); - for(auto& rFIItem : m_aPreviews) - lcl_Move(rFIItem, nMove); - SetUpdateMode(true); -} - -IMPL_LINK(SwAssignFieldsControl, MatchHdl_Impl, ListBox&, rBox, void) -{ - const OUString sColumn = rBox.GetSelectedEntry(); + const OUString sColumn = rBox.get_active_text(); uno::Reference< XColumnsSupplier > xColsSupp( m_rConfigItem->GetResultSet(), uno::UNO_QUERY); uno::Reference <XNameAccess> xColAccess = xColsSupp.is() ? xColsSupp->getColumns() : nullptr; OUString sPreview; @@ -1119,87 +957,63 @@ IMPL_LINK(SwAssignFieldsControl, MatchHdl_Impl, ListBox&, rBox, void) } } } - auto aLBIter = std::find(m_aMatches.begin(), m_aMatches.end(), &rBox); - if(aLBIter != m_aMatches.end()) + auto aLBIter = std::find_if(m_aFields.begin(), m_aFields.end(), [&rBox](const SwAssignFragment& rFragment){ + return &rBox == rFragment.m_xComboBox.get(); }); + if (aLBIter != m_aFields.end()) { - auto nIndex = static_cast<sal_Int32>(std::distance(m_aMatches.begin(), aLBIter)); - m_aPreviews[nIndex]->SetText(sPreview); + auto nIndex = static_cast<sal_Int32>(std::distance(m_aFields.begin(), aLBIter)); + m_aFields[nIndex].m_xPreview->set_label(sPreview); } m_aModifyHdl.Call(nullptr); } -IMPL_LINK(SwAssignFieldsControl, GotFocusHdl_Impl, Control&, rControl, void) +IMPL_LINK(SwAssignFieldsControl, GotFocusHdl_Impl, weld::Widget&, rBox, void) { - ListBox* pBox = static_cast<ListBox*>(&rControl); - if(GetFocusFlags::Tab & pBox->GetGetFocusFlags()) - { - auto aLBIter = std::find(m_aMatches.begin(), m_aMatches.end(), pBox); - if(aLBIter != m_aMatches.end()) - { - auto nIndex = static_cast<sal_Int32>(std::distance(m_aMatches.begin(), aLBIter)); - MakeVisible(nIndex); - } - } + int x, y, width, height; + rBox.get_extents_relative_to(*m_xGrid, x, y, width, height); + // the container has a border of 3 in the .ui + tools::Rectangle aRect(Point(x - 3, y - 3), Size(width + 6, height + 6)); + MakeVisible(aRect); } SwAssignFieldsDialog::SwAssignFieldsDialog( - vcl::Window* pParent, SwMailMergeConfigItem& rConfigItem, + weld::Window* pParent, SwMailMergeConfigItem& rConfigItem, const OUString& rPreview, - bool bIsAddressBlock) : - SfxModalDialog(pParent, "AssignFieldsDialog", "modules/swriter/ui/assignfieldsdialog.ui"), - m_sNone(SwResId(SW_STR_NONE)), - m_rPreviewString(rPreview), - m_rConfigItem(rConfigItem) -{ - get(m_pMatchingFI, "MATCHING_LABEL"); - get(m_pPreviewFI, "PREVIEW_LABEL"); - get(m_pOK, "ok"); - get(m_pPreviewWIN, "PREVIEW"); - Size aSize(LogicToPixel(Size(248, 45), MapMode(MapUnit::MapAppFont))); - m_pPreviewWIN->set_width_request(aSize.Width()); - m_pPreviewWIN->set_height_request(aSize.Height()); - get(m_pFieldsControl, "FIELDS"); - m_pFieldsControl->Init(rConfigItem); - //resize the HeaderBar - OUString sAddressElement( SwResId(ST_ADDRESSELEMENT) ); + bool bIsAddressBlock) + : SfxDialogController(pParent, "modules/swriter/ui/assignfieldsdialog.ui", "AssignFieldsDialog") + , m_sNone(SwResId(SW_STR_NONE)) + , m_rPreviewString(rPreview) + , m_rConfigItem(rConfigItem) + , m_xPreview(new AddressPreview(m_xBuilder->weld_scrolled_window("previewwin"))) + , m_xMatchingFI(m_xBuilder->weld_label("MATCHING_LABEL")) + , m_xAddressTitle(m_xBuilder->weld_label("addresselem")) + , m_xMatchTitle(m_xBuilder->weld_label("matchelem")) + , m_xPreviewTitle(m_xBuilder->weld_label("previewelem")) + , m_xPreviewFI(m_xBuilder->weld_label("PREVIEW_LABEL")) + , m_xOK(m_xBuilder->weld_button("ok")) + , m_xPreviewWin(new weld::CustomWeld(*m_xBuilder, "PREVIEW", *m_xPreview)) + , m_xFieldsControl(new SwAssignFieldsControl(m_xBuilder->weld_scrolled_window("scroll"), + m_xBuilder->weld_container("FIELDS"))) +{ + m_xPreviewWin->set_size_request(m_xMatchingFI->get_approximate_digit_width() * 45, + m_xMatchingFI->get_text_height() * 5); + m_xFieldsControl->Init(this, rConfigItem); + const OUString sMatchesTo( SwResId(ST_MATCHESTO) ); - const OUString sPreview( SwResId(ST_PREVIEW) ); - if(!bIsAddressBlock) + if (!bIsAddressBlock) { - m_pPreviewFI->SetText(SwResId(ST_SALUTATIONPREVIEW)); - m_pMatchingFI->SetText(SwResId(ST_SALUTATIONMATCHING)); - sAddressElement = SwResId(ST_SALUTATIONELEMENT); + m_xPreviewFI->set_label(SwResId(ST_SALUTATIONPREVIEW)); + m_xMatchingFI->set_label(SwResId(ST_SALUTATIONMATCHING)); + m_xAddressTitle->set_label(SwResId(ST_SALUTATIONELEMENT)); } - Size aOutputSize(m_pFieldsControl->m_aHeaderHB->GetSizePixel()); - sal_Int32 nFirstWidth; - sal_Int32 nSecondWidth = nFirstWidth = aOutputSize.Width() / 3; - const HeaderBarItemBits nHeadBits = HeaderBarItemBits::FIXED| HeaderBarItemBits::FIXEDPOS; - m_pFieldsControl->m_aHeaderHB->InsertItem( 1, sAddressElement, nFirstWidth, nHeadBits|HeaderBarItemBits::LEFT); - m_pFieldsControl->m_aHeaderHB->InsertItem( 2, sMatchesTo, nSecondWidth, nHeadBits|HeaderBarItemBits::LEFT); - m_pFieldsControl->m_aHeaderHB->InsertItem( 3, sPreview, - aOutputSize.Width() - nFirstWidth - nSecondWidth, nHeadBits|HeaderBarItemBits::LEFT); - - m_pFieldsControl->SetModifyHdl(LINK(this, SwAssignFieldsDialog, AssignmentModifyHdl_Impl )); - - m_pMatchingFI->SetText(m_pMatchingFI->GetText().replaceAll("%1", sMatchesTo)); - - m_pOK->SetClickHdl(LINK(this, SwAssignFieldsDialog, OkHdl_Impl)); + m_xFieldsControl->SetModifyHdl(LINK(this, SwAssignFieldsDialog, AssignmentModifyHdl_Impl )); + m_xMatchingFI->set_label(m_xMatchingFI->get_label().replaceAll("%1", sMatchesTo)); + m_xOK->connect_clicked(LINK(this, SwAssignFieldsDialog, OkHdl_Impl)); } SwAssignFieldsDialog::~SwAssignFieldsDialog() { - disposeOnce(); -} - -void SwAssignFieldsDialog::dispose() -{ - m_pMatchingFI.clear(); - m_pFieldsControl.clear(); - m_pPreviewFI.clear(); - m_pPreviewWIN.clear(); - m_pOK.clear(); - SfxModalDialog::dispose(); } uno::Sequence< OUString > SwAssignFieldsDialog::CreateAssignments() @@ -1208,21 +1022,21 @@ uno::Sequence< OUString > SwAssignFieldsDialog::CreateAssignments() m_rConfigItem.GetDefaultAddressHeaders().size()); OUString* pAssignments = aAssignments.getArray(); sal_Int32 nIndex = 0; - for(const auto& rLBItem : m_pFieldsControl->m_aMatches) + for (const auto& rLBItem : m_xFieldsControl->m_aFields) { - const OUString sSelect = rLBItem->GetSelectedEntry(); + const OUString sSelect = rLBItem.m_xComboBox->get_active_text(); pAssignments[nIndex] = (m_sNone != sSelect) ? sSelect : OUString(); ++nIndex; } return aAssignments; } -IMPL_LINK_NOARG(SwAssignFieldsDialog, OkHdl_Impl, Button*, void) +IMPL_LINK_NOARG(SwAssignFieldsDialog, OkHdl_Impl, weld::Button&, void) { m_rConfigItem.SetColumnAssignment( m_rConfigItem.GetCurrentDBData(), CreateAssignments() ); - EndDialog(RET_OK); + m_xDialog->response(RET_OK); } IMPL_LINK_NOARG(SwAssignFieldsDialog, AssignmentModifyHdl_Impl, LinkParamNone*, void) @@ -1230,7 +1044,14 @@ IMPL_LINK_NOARG(SwAssignFieldsDialog, AssignmentModifyHdl_Impl, LinkParamNone*, uno::Sequence< OUString > aAssignments = CreateAssignments(); const OUString sPreview = SwAddressPreview::FillData( m_rPreviewString, m_rConfigItem, &aAssignments); - m_pPreviewWIN->SetAddress(sPreview); + m_xPreview->SetAddress(sPreview); +} + +void SwAssignFieldsDialog::ConnectSizeGroups(int nLabelWidth, int nComboBoxWidth, int nPreviewWidth) +{ + m_xAddressTitle->set_size_request(nLabelWidth, -1); + m_xMatchTitle->set_size_request(nComboBoxWidth, -1); + m_xPreviewTitle->set_size_request(nPreviewWidth, -1); } DDListBox::DDListBox(vcl::Window* pParent, WinBits nStyle) diff --git a/sw/source/ui/dbui/mmaddressblockpage.hxx b/sw/source/ui/dbui/mmaddressblockpage.hxx index 4c8560988517..3d33daf8246c 100644 --- a/sw/source/ui/dbui/mmaddressblockpage.hxx +++ b/sw/source/ui/dbui/mmaddressblockpage.hxx @@ -243,32 +243,40 @@ public: }; class SwAssignFieldsControl; -class SwAssignFieldsDialog : public SfxModalDialog +class SwAssignFieldsDialog : public SfxDialogController { - VclPtr<FixedText> m_pMatchingFI; - VclPtr<SwAssignFieldsControl> m_pFieldsControl; - - VclPtr<FixedText> m_pPreviewFI; - VclPtr<SwAddressPreview> m_pPreviewWIN; - - VclPtr<OKButton> m_pOK; - OUString const m_sNone; OUString const m_rPreviewString; SwMailMergeConfigItem& m_rConfigItem; + std::unique_ptr<AddressPreview> m_xPreview; + std::unique_ptr<weld::Label> m_xMatchingFI; + std::unique_ptr<weld::Label> m_xAddressTitle; + std::unique_ptr<weld::Label> m_xMatchTitle; + std::unique_ptr<weld::Label> m_xPreviewTitle; + std::unique_ptr<weld::Label> m_xPreviewFI; + std::unique_ptr<weld::Button> m_xOK; + std::unique_ptr<weld::CustomWeld> m_xPreviewWin; + std::unique_ptr<SwAssignFieldsControl> m_xFieldsControl; + + std::unique_ptr<weld::SizeGroup> m_xLabelGroup; + std::unique_ptr<weld::SizeGroup> m_xComboGroup; + std::unique_ptr<weld::SizeGroup> m_xPreviewGroup; + css::uno::Sequence< OUString > CreateAssignments(); - DECL_LINK(OkHdl_Impl, Button*, void); + DECL_LINK(OkHdl_Impl, weld::Button&, void); DECL_LINK(AssignmentModifyHdl_Impl, LinkParamNone*, void); public: - SwAssignFieldsDialog(vcl::Window* pParent, + SwAssignFieldsDialog(weld::Window* pParent, SwMailMergeConfigItem& rConfigItem, const OUString& rPreview, bool bIsAddressBlock); + + void ConnectSizeGroups(int nLabelWidth, int nComboBoxWidth, int nPreviewWidth); + virtual ~SwAssignFieldsDialog() override; - virtual void dispose() override; }; #endif diff --git a/sw/source/ui/dbui/mmgreetingspage.cxx b/sw/source/ui/dbui/mmgreetingspage.cxx index 2723fb04849e..b017e509893a 100644 --- a/sw/source/ui/dbui/mmgreetingspage.cxx +++ b/sw/source/ui/dbui/mmgreetingspage.cxx @@ -109,9 +109,8 @@ void SwGreetingsHandler::UpdatePreview() IMPL_LINK_NOARG(SwMailMergeGreetingsPage, AssignHdl_Impl, weld::Button&, void) { const OUString sPreview(m_xFemaleLB->get_active_text() + "\n" + m_xMaleLB->get_active_text()); - ScopedVclPtr<SwAssignFieldsDialog> pDlg( - VclPtr<SwAssignFieldsDialog>::Create(nullptr /*TODO*/, m_rConfigItem, sPreview, false)); - if(RET_OK == pDlg->Execute()) + SwAssignFieldsDialog aDlg(GetFrameWeld(), m_rConfigItem, sPreview, false); + if (RET_OK == aDlg.run()) { UpdatePreview(); m_pWizard->UpdateRoadmap(); diff --git a/sw/uiconfig/swriter/ui/assignfieldsdialog.ui b/sw/uiconfig/swriter/ui/assignfieldsdialog.ui index 8242e31a37c4..200652fb1110 100644 --- a/sw/uiconfig/swriter/ui/assignfieldsdialog.ui +++ b/sw/uiconfig/swriter/ui/assignfieldsdialog.ui @@ -1,13 +1,18 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.16.1 --> +<!-- Generated with glade 3.22.1 --> <interface domain="sw"> - <requires lib="LibreOffice" version="1.0"/> <requires lib="gtk+" version="3.18"/> <object class="GtkDialog" id="AssignFieldsDialog"> <property name="can_focus">False</property> <property name="border_width">6</property> <property name="title" translatable="yes" context="assignfieldsdialog|AssignFieldsDialog">Match Fields</property> + <property name="modal">True</property> + <property name="default_width">0</property> + <property name="default_height">0</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> @@ -22,6 +27,7 @@ <property name="label">gtk-ok</property> <property name="visible">True</property> <property name="can_focus">True</property> + <property name="can_default">True</property> <property name="has_default">True</property> <property name="receives_default">True</property> <property name="use_stock">True</property> @@ -81,7 +87,7 @@ <property name="halign">start</property> <property name="label" translatable="yes" context="assignfieldsdialog|MATCHING_LABEL">Assign the fields from your data source to match the address elements.</property> <property name="use_underline">True</property> - <property name="mnemonic_widget">FIELDS:border</property> + <property name="mnemonic_widget">FIELDS</property> </object> <packing> <property name="expand">False</property> @@ -90,12 +96,134 @@ </packing> </child> <child> - <object class="swuilo-SwAssignFieldsControl" id="FIELDS:border"> + <object class="GtkGrid"> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <child> + <object class="GtkScrolledWindow" id="scroll"> + <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="GtkViewport"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <child> + <object class="GtkGrid" id="FIELDS"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="border_width">6</property> + <property name="orientation">vertical</property> + <property name="row_spacing">6</property> + <property name="column_spacing">6</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="border_width">6</property> + <property name="column_spacing">6</property> + <child> + <object class="GtkLabel" id="addresselem"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="assignfieldsdialog|ST_ADDRESSELEMENT">Address elements</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="previewelem"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="assignfieldsdialog|ST_PREVIEW">Preview</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">2</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="matchelem"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="label" translatable="yes" context="assignfieldsdialog|ST_MATCHESTO">Matches to field</property> + <property name="xalign">0</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> + <property name="top_attach">0</property> + </packing> + </child> </object> <packing> - <property name="expand">True</property> + <property name="expand">False</property> <property name="fill">True</property> <property name="position">1</property> </packing> @@ -107,7 +235,7 @@ <property name="halign">start</property> <property name="label" translatable="yes" context="assignfieldsdialog|PREVIEW_LABEL">Address block preview</property> <property name="use_underline">True</property> - <property name="mnemonic_widget">PREVIEW:border</property> + <property name="mnemonic_widget">PREVIEW</property> </object> <packing> <property name="expand">False</property> @@ -116,9 +244,24 @@ </packing> </child> <child> - <object class="swlo-SwAddressPreview" id="PREVIEW:border"> + <object class="GtkScrolledWindow" id="previewwin"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">never</property> + <property name="vscrollbar_policy">never</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkViewport"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkDrawingArea" id="PREVIEW"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + </object> + </child> </object> <packing> <property name="expand">False</property> diff --git a/sw/uiconfig/swriter/ui/assignfragment.ui b/sw/uiconfig/swriter/ui/assignfragment.ui new file mode 100644 index 000000000000..08234ea58f99 --- /dev/null +++ b/sw/uiconfig/swriter/ui/assignfragment.ui @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sw"> + <requires lib="gtk+" version="3.18"/> + <object class="GtkLabel" id="label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">combobox</property> + <property name="xalign">0</property> + </object> + <object class="GtkComboBoxText" id="combobox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + </object> + <object class="GtkLabel" id="preview"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + </object> +</interface> |