LibreOffice Module sw (master)  1
mmgreetingspage.cxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  * Licensed to the Apache Software Foundation (ASF) under one or more
12  * contributor license agreements. See the NOTICE file distributed
13  * with this work for additional information regarding copyright
14  * ownership. The ASF licenses this file to you under the Apache
15  * License, Version 2.0 (the "License"); you may not use this file
16  * except in compliance with the License. You may obtain a copy of
17  * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include "mmgreetingspage.hxx"
21 #include <mailmergewizard.hxx>
22 #include <mmconfigitem.hxx>
23 #include "mmaddressblockpage.hxx"
24 #include <swtypes.hxx>
25 #include <dbui.hrc>
26 #include <com/sun/star/sdb/XColumn.hpp>
27 #include <com/sun/star/sdbc/SQLException.hpp>
28 #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
29 #include <com/sun/star/container/XNameAccess.hpp>
30 #include <swmodule.hxx>
31 #include <view.hxx>
32 
33 using namespace svt;
34 using namespace ::com::sun::star;
35 using namespace ::com::sun::star::uno;
36 
38  SwMailMergeConfigItem const & rConfig,
40 {
41  const Sequence< OUString> rEntries = rConfig.GetGreetings(eType);
42  for(const auto& rEntry : rEntries)
43  rBox.append_text(rEntry);
44  rBox.set_active(rConfig.GetCurrentGreeting(eType));
45 }
46 
47 static void lcl_StoreGreetingsBox(const weld::ComboBox& rBox,
48  SwMailMergeConfigItem& rConfig,
50 {
52  OUString* pEntries = aEntries.getArray();
53  for(sal_Int32 nEntry = 0; nEntry < rBox.get_count(); ++nEntry)
54  pEntries[nEntry] = rBox.get_text(nEntry);
55  rConfig.SetGreetings(eType, aEntries);
56  rConfig.SetCurrentGreeting(eType, rBox.get_active());
57 }
58 
60 {
61  bool bIndividual = m_xPersonalizedCB->get_sensitive() && m_xPersonalizedCB->get_active();
62  m_xFemaleFT->set_sensitive(bIndividual);
63  m_xFemaleLB->set_sensitive(bIndividual);
64  m_xFemalePB->set_sensitive(bIndividual);
65  m_xMaleFT->set_sensitive(bIndividual);
66  m_xMaleLB->set_sensitive(bIndividual);
67  m_xMalePB->set_sensitive(bIndividual);
68  m_xFemaleFI->set_sensitive(bIndividual);
69  m_xFemaleColumnFT->set_sensitive(bIndividual);
70  m_xFemaleColumnLB->set_sensitive(bIndividual);
71  m_xFemaleFieldFT->set_sensitive(bIndividual);
72  m_xFemaleFieldCB->set_sensitive(bIndividual);
73 
74  if( m_bIsTabPage )
75  {
76  m_rConfigItem.SetIndividualGreeting(bIndividual, false);
77  m_pWizard->UpdateRoadmap();
78  m_pWizard->enableButtons(WizardButtonFlags::NEXT, m_pWizard->isStateEnabled(MM_LAYOUTPAGE));
79  }
80  UpdatePreview();
81 }
82 
83 IMPL_LINK(SwGreetingsHandler, GreetingHdl_Impl, weld::Button&, rButton, void)
84 {
85  std::unique_ptr<SwCustomizeAddressBlockDialog> xDlg(new SwCustomizeAddressBlockDialog(&rButton, m_rConfigItem,
86  &rButton == m_xMalePB.get() ?
89  if (RET_OK == xDlg->run())
90  {
91  weld::ComboBox* pToInsert = &rButton == m_xMalePB.get() ? m_xMaleLB.get() : m_xFemaleLB.get();
92  pToInsert->append_text(xDlg->GetAddress());
93  pToInsert->set_active(pToInsert->get_count() - 1);
94  if(m_bIsTabPage)
95  {
96  m_pWizard->UpdateRoadmap();
97  m_pWizard->enableButtons(WizardButtonFlags::NEXT, m_pWizard->isStateEnabled(MM_LAYOUTPAGE));
98  }
99  UpdatePreview();
100  }
101 }
102 
104 {
105  //the base class does nothing
106 }
107 
109 {
110  const OUString sPreview(m_xFemaleLB->get_active_text() + "\n" + m_xMaleLB->get_active_text());
111  SwAssignFieldsDialog aDlg(GetFrameWeld(), m_rConfigItem, sPreview, false);
112  if (RET_OK == aDlg.run())
113  {
114  UpdatePreview();
115  m_pWizard->UpdateRoadmap();
116  m_pWizard->enableButtons(WizardButtonFlags::NEXT, m_pWizard->isStateEnabled(MM_LAYOUTPAGE));
117  }
118 }
119 
120 IMPL_LINK_NOARG(SwMailMergeGreetingsPage, GreetingSelectListBoxHdl_Impl, weld::ComboBox&, void)
121 {
122  UpdatePreview();
123 }
124 
125 IMPL_LINK_NOARG(SwMailMergeGreetingsPage, GreetingSelectComboBoxHdl_Impl, weld::ComboBox&, void)
126 {
127  UpdatePreview();
128 }
129 
131 {
132  //find out which type of greeting should be selected:
133  bool bFemale = false;
134  bool bNoValue = !m_xFemaleColumnLB->get_sensitive();
135  if( !bNoValue )
136  {
137  const OUString sFemaleValue = m_xFemaleFieldCB->get_active_text();
138  const OUString sFemaleColumn = m_xFemaleColumnLB->get_active_text();
139  Reference< sdbcx::XColumnsSupplier > xColsSupp( m_rConfigItem.GetResultSet(), UNO_QUERY);
140  Reference < container::XNameAccess> xColAccess = xColsSupp.is() ? xColsSupp->getColumns() : nullptr;
141  if(!sFemaleValue.isEmpty() && !sFemaleColumn.isEmpty() &&
142  xColAccess.is() &&
143  xColAccess->hasByName(sFemaleColumn))
144  {
145  //get the content and exchange it in the address string
146  Any aCol = xColAccess->getByName(sFemaleColumn);
147  Reference< sdb::XColumn > xColumn;
148  aCol >>= xColumn;
149  if(xColumn.is())
150  {
151  try
152  {
153  bFemale = xColumn->getString() == sFemaleValue;
154 
155  //no last name value marks the greeting also as neutral
156  const OUString sLastNameColumn =
157  m_rConfigItem.GetAssignedColumn(MM_PART_LASTNAME);
158  if ( xColAccess->hasByName(sLastNameColumn) )
159  {
160  aCol = xColAccess->getByName(sLastNameColumn);
161  aCol >>= xColumn;
162  bNoValue = xColumn->getString().isEmpty();
163  }
164  }
165  catch (const sdbc::SQLException&)
166  {
167  OSL_FAIL("SQLException caught");
168  }
169  }
170  }
171  }
172 
173  OUString sPreview = bFemale ? m_xFemaleLB->get_active_text() :
174  bNoValue ? m_xNeutralCB->get_active_text() : m_xMaleLB->get_active_text();
175 
176  sPreview = SwAddressPreview::FillData(sPreview, m_rConfigItem);
177  m_xPreview->SetAddress(sPreview);
178 }
179 
180 void SwGreetingsHandler::Contains(bool bContainsGreeting)
181 {
182  m_xPersonalizedCB->set_sensitive(bContainsGreeting);
183  bool bEnablePersonal = bContainsGreeting && m_xPersonalizedCB->get_active();
184  m_xFemaleFT->set_sensitive(bEnablePersonal);
185  m_xFemaleLB->set_sensitive(bEnablePersonal);
186  m_xFemalePB->set_sensitive(bEnablePersonal);
187  m_xMaleFT->set_sensitive(bEnablePersonal);
188  m_xMaleLB->set_sensitive(bEnablePersonal);
189  m_xMalePB->set_sensitive(bEnablePersonal);
190  m_xFemaleFI->set_sensitive(bEnablePersonal);
191  m_xFemaleColumnFT->set_sensitive(bEnablePersonal);
192  m_xFemaleColumnLB->set_sensitive(bEnablePersonal);
193  m_xFemaleFieldFT->set_sensitive(bEnablePersonal);
194  m_xFemaleFieldCB->set_sensitive(bEnablePersonal);
195  m_xNeutralFT->set_sensitive(bContainsGreeting);
196  m_xNeutralCB->set_sensitive(bContainsGreeting);
197 }
198 
200  : vcl::OWizardPage(pParent, "modules/swriter/ui/mmsalutationpage.ui", "MMSalutationPage")
201  , SwGreetingsHandler(pWizard->GetConfigItem(), *m_xBuilder)
202  , m_xPreview(new SwAddressPreview(m_xBuilder->weld_scrolled_window("previewwin")))
203  , m_xPreviewFI(m_xBuilder->weld_label("previewft"))
204  , m_xAssignPB(m_xBuilder->weld_button("assign"))
205  , m_xDocumentIndexFI(m_xBuilder->weld_label("documentindex"))
206  , m_xPrevSetIB(m_xBuilder->weld_button("prev"))
207  , m_xNextSetIB(m_xBuilder->weld_button("next"))
208  , m_xPreviewWIN(new weld::CustomWeld(*m_xBuilder, "preview", *m_xPreview))
209 {
210  m_pWizard = pWizard;
211 
212  Size aSize(m_xPreview->GetDrawingArea()->get_ref_device().LogicToPixel(Size(186, 21), MapMode(MapUnit::MapAppFont)));
213  m_xPreviewWIN->set_size_request(aSize.Width(), aSize.Height());
214  m_sDocument = m_xDocumentIndexFI->get_label();
215 
216  m_bIsTabPage = true;
217 
218  m_xGreetingLineCB->connect_toggled(LINK(this, SwMailMergeGreetingsPage, ContainsHdl_Impl));
219  Link<weld::ToggleButton&,void> aIndividualLink = LINK(this, SwGreetingsHandler, IndividualHdl_Impl);
220  m_xPersonalizedCB->connect_toggled(aIndividualLink);
221  Link<weld::Button&,void> aGreetingLink = LINK(this, SwGreetingsHandler, GreetingHdl_Impl);
222  m_xFemalePB->connect_clicked(aGreetingLink);
223  m_xMalePB->connect_clicked(aGreetingLink);
224  m_xAssignPB->connect_clicked(LINK(this, SwMailMergeGreetingsPage, AssignHdl_Impl));
225  Link<weld::ComboBox&,void> aLBoxLink2 = LINK(this, SwMailMergeGreetingsPage, GreetingSelectListBoxHdl_Impl);
226  m_xFemaleLB->connect_changed(aLBoxLink2);
227  m_xMaleLB->connect_changed(aLBoxLink2);
228  m_xFemaleColumnLB->connect_changed(aLBoxLink2);
229  m_xFemaleFieldCB->connect_changed(LINK(this, SwMailMergeGreetingsPage, GreetingSelectComboBoxHdl_Impl));
230  m_xNeutralCB->connect_changed(LINK(this, SwMailMergeGreetingsPage, GreetingSelectComboBoxHdl_Impl));
231 
232  Link<weld::Button&,void> aDataLink = LINK(this, SwMailMergeGreetingsPage, InsertDataHdl_Impl);
233  m_xPrevSetIB->connect_clicked(aDataLink);
234  m_xNextSetIB->connect_clicked(aDataLink);
235 
236  m_xGreetingLineCB->set_active(m_rConfigItem.IsGreetingLine(false));
238  ContainsHdl_Impl(*m_xGreetingLineCB);
239  aIndividualLink.Call(*m_xPersonalizedCB);
240 
244 
245  m_xDocumentIndexFI->set_label(m_sDocument.replaceFirst("%1", "1"));
246 }
247 
249 {
250  disposeOnce();
251 }
252 
254 {
255  m_xPreviewWIN.reset();
256  m_xPreview.reset();
258 }
259 
261 {
262  //try to find the gender setting
263  m_xFemaleColumnLB->clear();
264  Reference< sdbcx::XColumnsSupplier > xColsSupp = m_rConfigItem.GetColumnsSupplier();
265  if(xColsSupp.is())
266  {
267  Reference < container::XNameAccess> xColAccess = xColsSupp->getColumns();
268  const Sequence< OUString > aColumns = xColAccess->getElementNames();
269  for(const auto& rColumn : aColumns)
270  m_xFemaleColumnLB->append_text(rColumn);
271  }
272 
273  m_xFemaleColumnLB->set_active_text(m_rConfigItem.GetAssignedColumn(MM_PART_GENDER));
274  m_xFemaleColumnLB->save_value();
275 
277  m_xFemaleFieldCB->save_value();
278 
279  UpdatePreview();
280  m_pWizard->enableButtons(WizardButtonFlags::NEXT, m_pWizard->isStateEnabled(MM_LAYOUTPAGE));
281 }
282 
284 {
285  if (m_xFemaleColumnLB->get_value_changed_from_saved())
286  {
287  const SwDBData& rDBData = m_rConfigItem.GetCurrentDBData();
288  Sequence< OUString> aAssignment = m_rConfigItem.GetColumnAssignment( rDBData );
289  if(aAssignment.getLength() <= MM_PART_GENDER)
290  aAssignment.realloc(MM_PART_GENDER + 1);
291  aAssignment[MM_PART_GENDER] = m_xFemaleColumnLB->get_active_text();
292  m_rConfigItem.SetColumnAssignment( rDBData, aAssignment );
293  }
294  if (m_xFemaleFieldCB->get_value_changed_from_saved())
296 
299 
300  sal_Int32 nCurrentTextPos = m_xNeutralCB->find_text(m_xNeutralCB->get_active_text());
301  if (nCurrentTextPos == -1)
302  {
303  m_xNeutralCB->append_text(m_xNeutralCB->get_active_text());
304  m_xNeutralCB->set_active(m_xNeutralCB->get_count() - 1);
305  }
307  m_rConfigItem.SetGreetingLine(m_xGreetingLineCB->get_active(), false);
309  return true;
310 }
311 
312 IMPL_LINK(SwMailMergeGreetingsPage, ContainsHdl_Impl, weld::ToggleButton&, rBox, void)
313 {
314  bool bContainsGreeting = rBox.get_active();
315  SwGreetingsHandler::Contains(bContainsGreeting);
316  m_xPreviewFI->set_sensitive(bContainsGreeting);
317  m_xPreviewWIN->set_sensitive(bContainsGreeting);
318  m_xAssignPB->set_sensitive(bContainsGreeting);
319  m_xDocumentIndexFI->set_sensitive(bContainsGreeting);
320  m_xPrevSetIB->set_sensitive(bContainsGreeting);
321  m_xNextSetIB->set_sensitive(bContainsGreeting);
322  m_rConfigItem.SetGreetingLine(m_xGreetingLineCB->get_active(), false);
323  m_pWizard->UpdateRoadmap();
324  m_pWizard->enableButtons(WizardButtonFlags::NEXT, m_pWizard->isStateEnabled(MM_LAYOUTPAGE));
325 }
326 
327 IMPL_LINK(SwMailMergeGreetingsPage, InsertDataHdl_Impl, weld::Button&, rButton, void)
328 {
329  bool bNext = &rButton == m_xNextSetIB.get();
330  sal_Int32 nPos = m_rConfigItem.GetResultSetPosition();
331  m_rConfigItem.MoveResultSet( bNext ? ++nPos : --nPos);
332  nPos = m_rConfigItem.GetResultSetPosition();
333  bool bEnable = true;
334  if(nPos < 1)
335  {
336  bEnable = false;
337  nPos = 1;
338  }
339  else
340  UpdatePreview();
341  m_xPrevSetIB->set_sensitive(bEnable);
342  m_xNextSetIB->set_sensitive(bEnable);
343  m_xDocumentIndexFI->set_sensitive(bEnable);
344  m_xDocumentIndexFI->set_label(m_sDocument.replaceFirst("%1", OUString::number(nPos)));
345 }
346 
348  : SfxDialogController(pParent, "modules/swriter/ui/mmmailbody.ui", "MailBodyDialog")
349  , SwGreetingsHandler(*GetActiveView()->GetMailMergeConfigItem(), *m_xBuilder)
350  , m_xBodyFT(m_xBuilder->weld_label("bodyft"))
351  , m_xBodyMLE(m_xBuilder->weld_text_view("bodymle"))
352  , m_xOK(m_xBuilder->weld_button("ok"))
353 {
354  m_bIsTabPage = false;
355  m_xBodyMLE->set_size_request(m_xBodyMLE->get_approximate_digit_width() * 45,
356  m_xBodyMLE->get_height_rows(6));
357  m_xGreetingLineCB->connect_toggled(LINK(this, SwMailBodyDialog, ContainsHdl_Impl));
358  Link<weld::ToggleButton&,void> aIndividualLink = LINK(this, SwGreetingsHandler, IndividualHdl_Impl);
359  m_xPersonalizedCB->connect_toggled(aIndividualLink);
360  Link<weld::Button&,void> aGreetingLink = LINK(this, SwGreetingsHandler, GreetingHdl_Impl);
361  m_xFemalePB->connect_clicked(aGreetingLink);
362  m_xMalePB->connect_clicked(aGreetingLink);
363  m_xOK->connect_clicked(LINK(this, SwMailBodyDialog, OKHdl));
364 
367  ContainsHdl_Impl(*m_xGreetingLineCB);
368  aIndividualLink.Call(*m_xPersonalizedCB);
369 
373 
374  //try to find the gender setting
375  m_xFemaleColumnLB->clear();
376  Reference< sdbcx::XColumnsSupplier > xColsSupp = m_rConfigItem.GetColumnsSupplier();
377  if(xColsSupp.is())
378  {
379  Reference < container::XNameAccess> xColAccess = xColsSupp->getColumns();
380  const Sequence< OUString > aColumns = xColAccess->getElementNames();
381  for(const auto& rColumn : aColumns)
382  m_xFemaleColumnLB->append_text(rColumn);
383  }
384 
385  m_xFemaleColumnLB->set_active_text(m_rConfigItem.GetAssignedColumn(MM_PART_GENDER));
386  m_xFemaleColumnLB->save_value();
387 
389  m_xFemaleFieldCB->save_value();
390 }
391 
393 {
394 }
395 
396 IMPL_LINK(SwMailBodyDialog, ContainsHdl_Impl, weld::ToggleButton&, rBox, void)
397 {
398  SwGreetingsHandler::Contains(rBox.get_active());
399  m_rConfigItem.SetGreetingLine(rBox.get_active(), true);
400 }
401 
403 {
404  m_rConfigItem.SetGreetingLine(
405  m_xGreetingLineCB->get_active(), false);
406  m_rConfigItem.SetIndividualGreeting(
407  m_xPersonalizedCB->get_active(), false);
408 
409  if (m_xFemaleColumnLB->get_value_changed_from_saved())
410  {
411  const SwDBData& rDBData = m_rConfigItem.GetCurrentDBData();
412  Sequence< OUString> aAssignment = m_rConfigItem.GetColumnAssignment( rDBData );
413  sal_Int32 nPos = m_xFemaleColumnLB->get_active();
414  if(aAssignment.getLength() < MM_PART_GENDER)
415  aAssignment.realloc(MM_PART_GENDER);
416  if( nPos > 0 )
417  aAssignment[MM_PART_GENDER] = m_xFemaleColumnLB->get_active_text();
418  else
419  aAssignment[MM_PART_GENDER].clear();
420  m_rConfigItem.SetColumnAssignment( rDBData, aAssignment );
421  }
422  if (m_xFemaleFieldCB->get_value_changed_from_saved())
423  m_rConfigItem.SetFemaleGenderValue(m_xFemaleFieldCB->get_active_text());
424 
425  m_xDialog->response(RET_OK);
426 }
427 
428 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
std::unique_ptr< weld::CheckButton > m_xGreetingLineCB
virtual void dispose() override
virtual ~SwMailBodyDialog() override
void SetGreetings(Gender eType, const css::uno::Sequence< OUString > &rBlocks)
std::unique_ptr< weld::Button > m_xPrevSetIB
void SetGreetingLine(bool bSet, bool bInEMail)
SwView * GetActiveView()
Definition: swmodul1.cxx:123
std::unique_ptr< weld::Button > m_xMalePB
IMPL_LINK_NOARG(OCommonPicker, OnCancelPicker, void *, void)
void SetCurrentGreeting(Gender eType, sal_Int32 nIndex)
virtual void ActivatePage() override
virtual OUString get_text(int pos) const =0
void SetIndividualGreeting(bool bSet, bool bInEMail)
std::unique_ptr< weld::ComboBox > m_xMaleLB
const SwDBData & GetCurrentDBData() const
virtual int get_active() const =0
IMPL_LINK(SwGreetingsHandler, GreetingHdl_Impl, weld::Button &, rButton, void)
#define MM_LAYOUTPAGE
virtual int get_count() const =0
virtual ~SwMailMergeGreetingsPage() override
css::uno::Reference< css::sdbcx::XColumnsSupplier > const & GetColumnsSupplier()
std::unique_ptr< weld::Button > m_xFemalePB
static void lcl_FillGreetingsBox(weld::ComboBox &rBox, SwMailMergeConfigItem const &rConfig, SwMailMergeConfigItem::Gender eType)
SwMailMergeWizard * m_pWizard
void Contains(bool bContainsGreeting)
IMPL_LINK_NOARG(SwGreetingsHandler, IndividualHdl_Impl, weld::ToggleButton &, void)
std::unique_ptr< weld::ComboBox > m_xNeutralCB
std::unique_ptr< weld::TextView > m_xBodyMLE
css::uno::Sequence< OUString > GetGreetings(Gender eType) const
SwMailMergeGreetingsPage(SwMailMergeWizard *pWizard, TabPageParent pParent)
virtual void dispose() override
void SetFemaleGenderValue(const OUString &rValue)
std::unique_ptr< weld::ComboBox > m_xFemaleFieldCB
IMPL_LINK(AsyncPickerAction, OnActionDone, void *, pEmptyArg, void)
std::unique_ptr< weld::Button > m_xNextSetIB
weld::Window * GetFrameWeld(SfxFrame *pFrame)
Definition: dialoghelp.cxx:20
virtual void set_active(int pos)=0
static void lcl_StoreGreetingsBox(const weld::ComboBox &rBox, SwMailMergeConfigItem &rConfig, SwMailMergeConfigItem::Gender eType)
std::unique_ptr< weld::Label > m_xDocumentIndexFI
css::uno::Sequence< OUString > GetColumnAssignment(const SwDBData &rDBData) const
sal_Int32 GetCurrentGreeting(Gender eType) const
virtual bool commitPage(::vcl::WizardTypes::CommitPageReason _eReason) override
bool IsIndividualGreeting(bool bInEMail) const
std::unique_ptr< weld::ComboBox > m_xFemaleLB
RET_OK
std::unique_ptr< weld::ComboBox > m_xFemaleColumnLB
OUString GetAssignedColumn(sal_uInt32 nColumn) const
std::unique_ptr< weld::Button > m_xAssignPB
bool IsGreetingLine(bool bInEMail) const
void SetColumnAssignment(const SwDBData &rDBData, const css::uno::Sequence< OUString > &)
std::unique_ptr< weld::Button > m_xOK
const OUString & GetFemaleGenderValue() const
void enableButtons(WizardButtonFlags _nWizardButtonFlags, bool _bEnable)
std::unique_ptr< weld::CheckButton > m_xPersonalizedCB
ScXMLEditAttributeMap::Entry const aEntries[]
virtual void UpdatePreview()
void append_text(const OUString &rStr)
SwMailBodyDialog(weld::Window *pParent)
std::unique_ptr< SwAddressPreview > m_xPreview
sal_Int32 nPos
bool isStateEnabled(WizardTypes::WizardState nState) const
static OUString FillData(const OUString &rAddress, SwMailMergeConfigItem const &rConfigItem, const css::uno::Sequence< OUString > *pAssignments=nullptr)
virtual void UpdatePreview() override
std::unique_ptr< weld::CustomWeld > m_xPreviewWIN
SwMailMergeConfigItem & m_rConfigItem
The mail merge state, available even when m_pWizard is nullptr.