/src/libreoffice/sw/source/uibase/dbui/mmconfigitem.cxx
Line | Count | Source |
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 | | |
21 | | #include <mmconfigitem.hxx> |
22 | | #include <comphelper/propertyvalue.hxx> |
23 | | #include <vector> |
24 | | #include <swtypes.hxx> |
25 | | #include <com/sun/star/uno/Any.hxx> |
26 | | #include <com/sun/star/beans/PropertyValue.hpp> |
27 | | #include <com/sun/star/frame/XDispatch.hpp> |
28 | | #include <com/sun/star/sdbc/XDataSource.hpp> |
29 | | #include <com/sun/star/sdbcx/XColumnsSupplier.hpp> |
30 | | #include <com/sun/star/lang/XMultiServiceFactory.hpp> |
31 | | #include <com/sun/star/beans/XPropertySet.hpp> |
32 | | #include <com/sun/star/sdbc/XRowSet.hpp> |
33 | | #include <com/sun/star/view/XSelectionSupplier.hpp> |
34 | | #include <comphelper/processfactory.hxx> |
35 | | #include <comphelper/types.hxx> |
36 | | #include <com/sun/star/sdb/CommandType.hpp> |
37 | | #include <comphelper/sequence.hxx> |
38 | | #include <rtl/ustrbuf.hxx> |
39 | | #include <sal/log.hxx> |
40 | | #include <unotools/configitem.hxx> |
41 | | #include <comphelper/diagnose_ex.hxx> |
42 | | #include <mailmergehelper.hxx> |
43 | | #include <swunohelper.hxx> |
44 | | #include <dbmgr.hxx> |
45 | | #include <view.hxx> |
46 | | #include <unodispatch.hxx> |
47 | | #include <wrtsh.hxx> |
48 | | #include <dbui.hrc> |
49 | | |
50 | | using namespace utl; |
51 | | using namespace ::com::sun::star; |
52 | | using namespace ::com::sun::star::uno; |
53 | | using namespace ::com::sun::star::lang; |
54 | | using namespace ::com::sun::star::beans; |
55 | | using namespace ::com::sun::star::sdb; |
56 | | using namespace ::com::sun::star::sdbc; |
57 | | using namespace ::com::sun::star::sdbcx; |
58 | | |
59 | | constexpr OUString cAddressDataAssignments = u"AddressDataAssignments"_ustr; |
60 | | const char cDBColumnAssignments[] = "DBColumnAssignments"; |
61 | | const char cDataSourceName[] = "DataSource/DataSourceName"; |
62 | | const char cDataTableName[] = "DataSource/DataTableName" ; |
63 | | const char cDataCommandType[] = "DataSource/DataCommandType"; |
64 | | |
65 | | constexpr sal_Int16 SECURE_PORT = 587; |
66 | | constexpr sal_Int16 DEFAULT_PORT = 25; |
67 | | constexpr sal_Int16 POP_PORT = 110; |
68 | | constexpr sal_Int16 POP_SECURE_PORT = 995; |
69 | | constexpr sal_Int16 IMAP_PORT = 143; |
70 | | constexpr sal_Int16 IMAP_SECURE_PORT = 993; |
71 | | |
72 | | namespace { |
73 | | |
74 | | struct DBAddressDataAssignment |
75 | | { |
76 | | SwDBData aDBData; |
77 | | Sequence< OUString> aDBColumnAssignments; |
78 | | //if loaded the name of the node has to be saved |
79 | | OUString sConfigNodeName; |
80 | | //all created or changed assignments need to be stored |
81 | | bool bColumnAssignmentsChanged; |
82 | | |
83 | | DBAddressDataAssignment() : |
84 | 0 | bColumnAssignmentsChanged(false) |
85 | 0 | {} |
86 | | }; |
87 | | |
88 | | } |
89 | | |
90 | | class SwMailMergeConfigItem_Impl : public utl::ConfigItem |
91 | | { |
92 | | friend class SwMailMergeConfigItem; |
93 | | Reference< XDataSource> m_xSource; |
94 | | SharedConnection m_xConnection; |
95 | | Reference< XColumnsSupplier> m_xColumnsSupplier; |
96 | | Reference<XRowSet> m_xResultSet; |
97 | | SwDBData m_aDBData; |
98 | | OUString m_sFilter; |
99 | | sal_Int32 m_nResultSetCursorPos; |
100 | | |
101 | | std::vector<DBAddressDataAssignment> m_aAddressDataAssignments; |
102 | | std::vector< OUString> m_aAddressBlocks; |
103 | | sal_Int32 m_nCurrentAddressBlock; |
104 | | bool m_bIsAddressBlock; |
105 | | bool m_bIsHideEmptyParagraphs; |
106 | | |
107 | | bool m_bIsOutputToLetter; |
108 | | bool m_bIncludeCountry; |
109 | | OUString m_sExcludeCountry; |
110 | | |
111 | | bool m_bIsGreetingLine; |
112 | | bool m_bIsIndividualGreetingLine; |
113 | | std::vector< OUString> m_aFemaleGreetingLines; |
114 | | sal_Int32 m_nCurrentFemaleGreeting; |
115 | | std::vector< OUString> m_aMaleGreetingLines; |
116 | | sal_Int32 m_nCurrentMaleGreeting; |
117 | | std::vector< OUString> m_aNeutralGreetingLines; |
118 | | sal_Int32 m_nCurrentNeutralGreeting; |
119 | | OUString m_sFemaleGenderValue; |
120 | | uno::Sequence< OUString> m_aSavedDocuments; |
121 | | |
122 | | bool m_bIsGreetingLineInMail; |
123 | | bool m_bIsIndividualGreetingLineInMail; |
124 | | |
125 | | //mail settings |
126 | | OUString m_sMailDisplayName; |
127 | | OUString m_sMailAddress; |
128 | | OUString m_sMailReplyTo; |
129 | | OUString m_sMailServer; |
130 | | OUString m_sMailUserName; |
131 | | OUString m_sMailPassword; |
132 | | |
133 | | bool m_bIsSMPTAfterPOP; |
134 | | OUString m_sInServerName; |
135 | | sal_Int16 m_nInServerPort; |
136 | | bool m_bInServerPOP; |
137 | | OUString m_sInServerUserName; |
138 | | OUString m_sInServerPassword; |
139 | | |
140 | | sal_Int16 m_nMailPort; |
141 | | bool m_bIsMailReplyTo; |
142 | | bool m_bIsSecureConnection; |
143 | | bool m_bIsAuthentication; |
144 | | |
145 | | bool m_bIsEMailSupported; |
146 | | |
147 | | std::vector<std::pair<OUString, int>> m_AddressHeaderSA; |
148 | | |
149 | | //these addresses are not stored in the configuration |
150 | | std::vector< SwDocMergeInfo > m_aMergeInfos; |
151 | | |
152 | | //we do overwrite the usersettings in a special case |
153 | | //then we do remind the usersettings here |
154 | | bool m_bUserSettingWereOverwritten; |
155 | | bool m_bIsAddressBlock_LastUserSetting; |
156 | | bool m_bIsGreetingLineInMail_LastUserSetting; |
157 | | bool m_bIsGreetingLine_LastUserSetting; |
158 | | |
159 | | static const Sequence< OUString>& GetPropertyNames(); |
160 | | |
161 | | virtual void ImplCommit() override; |
162 | | |
163 | | public: |
164 | | SwMailMergeConfigItem_Impl(); |
165 | | |
166 | | virtual void Notify( const css::uno::Sequence< OUString >& aPropertyNames ) override; |
167 | | Sequence< OUString> GetAddressBlocks(bool bConvertToConfig = false) const; |
168 | | void SetAddressBlocks( |
169 | | const Sequence< OUString>& rBlocks, |
170 | | bool bConvertFromConfig = false); |
171 | | uno::Sequence< OUString> |
172 | | GetGreetings(SwMailMergeConfigItem::Gender eType, |
173 | | bool bConvertToConfig = false) const; |
174 | | void SetGreetings(SwMailMergeConfigItem::Gender eType, |
175 | | const uno::Sequence< OUString>& rBlocks, |
176 | | bool bConvertFromConfig = false); |
177 | | |
178 | | void SetCurrentAddressBlockIndex( sal_Int32 nSet ); |
179 | | sal_Int32 GetCurrentAddressBlockIndex() const |
180 | 0 | { return m_nCurrentAddressBlock; } |
181 | | sal_Int32 GetCurrentGreeting(SwMailMergeConfigItem::Gender eType) const; |
182 | | void SetCurrentGreeting(SwMailMergeConfigItem::Gender eType, sal_Int32 nIndex); |
183 | | |
184 | | }; |
185 | | |
186 | | SwMailMergeConfigItem_Impl::SwMailMergeConfigItem_Impl() : |
187 | 0 | ConfigItem(u"Office.Writer/MailMergeWizard"_ustr, ConfigItemMode::NONE), |
188 | 0 | m_nResultSetCursorPos(-1), |
189 | 0 | m_nCurrentAddressBlock(0), |
190 | 0 | m_bIsAddressBlock(true), |
191 | 0 | m_bIsHideEmptyParagraphs(false), |
192 | 0 | m_bIsOutputToLetter(true), |
193 | 0 | m_bIncludeCountry(false), |
194 | 0 | m_bIsGreetingLine(true), |
195 | 0 | m_bIsIndividualGreetingLine(false), |
196 | 0 | m_nCurrentFemaleGreeting(0), |
197 | 0 | m_nCurrentMaleGreeting(0), |
198 | 0 | m_nCurrentNeutralGreeting(0), |
199 | 0 | m_bIsGreetingLineInMail(false), |
200 | 0 | m_bIsIndividualGreetingLineInMail(false), |
201 | 0 | m_bIsSMPTAfterPOP(false), |
202 | 0 | m_nInServerPort( POP_SECURE_PORT ), |
203 | 0 | m_bInServerPOP( true ), |
204 | 0 | m_nMailPort(SECURE_PORT), |
205 | 0 | m_bIsMailReplyTo(false), |
206 | 0 | m_bIsSecureConnection(true), |
207 | 0 | m_bIsAuthentication(false), |
208 | | |
209 | 0 | m_bIsEMailSupported(false), |
210 | 0 | m_bUserSettingWereOverwritten(false), |
211 | 0 | m_bIsAddressBlock_LastUserSetting(false), |
212 | 0 | m_bIsGreetingLineInMail_LastUserSetting(false), |
213 | 0 | m_bIsGreetingLine_LastUserSetting(false) |
214 | 0 | { |
215 | 0 | for (auto const& [aName, aID] : SA_ADDRESS_HEADER) |
216 | 0 | { |
217 | 0 | m_AddressHeaderSA.emplace_back(SwResId(aName), aID); |
218 | 0 | } |
219 | |
|
220 | 0 | const Sequence<OUString>& rNames = GetPropertyNames(); |
221 | 0 | Sequence<Any> aValues = GetProperties(rNames); |
222 | 0 | const Any* pValues = aValues.getConstArray(); |
223 | 0 | assert(aValues.getLength() == rNames.getLength()); |
224 | 0 | if(aValues.getLength() == rNames.getLength()) |
225 | 0 | { |
226 | 0 | for(int nProp = 0; nProp < rNames.getLength(); nProp++) |
227 | 0 | { |
228 | 0 | switch(nProp) |
229 | 0 | { |
230 | 0 | case 0: pValues[nProp] >>= m_bIsOutputToLetter; break; |
231 | 0 | case 1: pValues[nProp] >>= m_bIncludeCountry; break; |
232 | 0 | case 2: pValues[nProp] >>= m_sExcludeCountry; break; |
233 | 0 | case 3: |
234 | 0 | { |
235 | 0 | Sequence< OUString> aBlocks; |
236 | 0 | pValues[nProp] >>= aBlocks; |
237 | 0 | SetAddressBlocks(aBlocks, true); |
238 | 0 | } |
239 | 0 | break; |
240 | 0 | case 4: pValues[nProp] >>= m_bIsAddressBlock; break; |
241 | 0 | case 5: pValues[nProp] >>= m_bIsGreetingLine; break; |
242 | 0 | case 6: pValues[nProp] >>= m_bIsIndividualGreetingLine; break; |
243 | 0 | case 7 : |
244 | 0 | case 8 : |
245 | 0 | case 9 : |
246 | 0 | { |
247 | 0 | Sequence< OUString> aGreetings; |
248 | 0 | pValues[nProp] >>= aGreetings; |
249 | 0 | SetGreetings(SwMailMergeConfigItem::Gender( |
250 | 0 | SwMailMergeConfigItem::FEMALE + nProp - 7), aGreetings, true); |
251 | 0 | } |
252 | 0 | break; |
253 | | |
254 | 0 | case 10: pValues[nProp] >>= m_nCurrentFemaleGreeting; break; |
255 | 0 | case 11: pValues[nProp] >>= m_nCurrentMaleGreeting; break; |
256 | 0 | case 12: pValues[nProp] >>= m_nCurrentNeutralGreeting; break; |
257 | 0 | case 13: pValues[nProp] >>= m_sFemaleGenderValue; break; |
258 | 0 | case 14: pValues[nProp] >>= m_sMailDisplayName; break; |
259 | 0 | case 15: pValues[nProp] >>= m_sMailAddress; break; |
260 | 0 | case 16: pValues[nProp] >>= m_bIsMailReplyTo; break; |
261 | 0 | case 17: pValues[nProp] >>= m_sMailReplyTo; break; |
262 | 0 | case 18: pValues[nProp] >>= m_sMailServer; break; |
263 | 0 | case 19: pValues[nProp] >>= m_nMailPort; break; |
264 | 0 | case 20: pValues[nProp] >>= m_bIsSecureConnection; break; |
265 | 0 | case 21: pValues[nProp] >>= m_bIsAuthentication; break; |
266 | 0 | case 22: pValues[nProp] >>= m_sMailUserName; break; |
267 | 0 | case 23: pValues[nProp] >>= m_sMailPassword; break; |
268 | 0 | case 24 :pValues[nProp] >>= m_aDBData.sDataSource; break; |
269 | 0 | case 25 :pValues[nProp] >>= m_aDBData.sCommand; break; |
270 | 0 | case 26 : |
271 | 0 | { |
272 | 0 | short nTemp = 0; |
273 | 0 | if(pValues[nProp] >>= nTemp) |
274 | 0 | m_aDBData.nCommandType = nTemp; |
275 | 0 | } |
276 | 0 | break; |
277 | 0 | case 27: pValues[nProp] >>= m_sFilter; break; |
278 | 0 | case 28: pValues[nProp] >>= m_aSavedDocuments; break; |
279 | 0 | case 29: |
280 | 0 | pValues[nProp] >>= m_bIsEMailSupported; |
281 | 0 | break; |
282 | 0 | case 30: pValues[nProp] >>= m_bIsGreetingLineInMail; break; |
283 | 0 | case 31: pValues[nProp] >>= m_bIsIndividualGreetingLineInMail; break; |
284 | 0 | case 32: pValues[nProp] >>= m_bIsSMPTAfterPOP; break; |
285 | 0 | case 33: pValues[nProp] >>= m_sInServerName; break; |
286 | 0 | case 34: pValues[nProp] >>= m_nInServerPort; break; |
287 | 0 | case 35: pValues[nProp] >>= m_bInServerPOP; break; |
288 | 0 | case 36: pValues[nProp] >>= m_sInServerUserName; break; |
289 | 0 | case 37: pValues[nProp] >>= m_sInServerPassword; break; |
290 | 0 | case 38: pValues[nProp] >>= m_bIsHideEmptyParagraphs; break; |
291 | 0 | case 39: pValues[nProp] >>= m_nCurrentAddressBlock; break; |
292 | 0 | } |
293 | 0 | } |
294 | 0 | ClearModified(); |
295 | 0 | } |
296 | | //read the list of data base assignments |
297 | 0 | Sequence<OUString> aAssignments = GetNodeNames(cAddressDataAssignments); |
298 | 0 | if(aAssignments.hasElements()) |
299 | 0 | { |
300 | | //create a list of property names to load the URLs of all data bases |
301 | 0 | const OUString* pAssignments = aAssignments.getConstArray(); |
302 | 0 | Sequence< OUString > aAssignProperties(4 * aAssignments.getLength()); |
303 | 0 | OUString* pAssignProperties = aAssignProperties.getArray(); |
304 | 0 | sal_Int32 nAssign; |
305 | 0 | for(nAssign = 0; nAssign < aAssignProperties.getLength(); nAssign += 4) |
306 | 0 | { |
307 | 0 | OUString sAssignPath = OUString::Concat(cAddressDataAssignments) + |
308 | 0 | "/" + |
309 | 0 | pAssignments[nAssign / 4] + |
310 | 0 | "/"; |
311 | 0 | pAssignProperties[nAssign] = sAssignPath; |
312 | 0 | pAssignProperties[nAssign] += cDataSourceName; |
313 | 0 | pAssignProperties[nAssign + 1] = sAssignPath; |
314 | 0 | pAssignProperties[nAssign + 1] += cDataTableName; |
315 | 0 | pAssignProperties[nAssign + 2] = sAssignPath; |
316 | 0 | pAssignProperties[nAssign + 2] += cDataCommandType; |
317 | 0 | pAssignProperties[nAssign + 3] = sAssignPath; |
318 | 0 | pAssignProperties[nAssign + 3] += cDBColumnAssignments; |
319 | 0 | } |
320 | 0 | Sequence<Any> aAssignValues = GetProperties(aAssignProperties); |
321 | 0 | const Any* pAssignValues = aAssignValues.getConstArray(); |
322 | 0 | for(nAssign = 0; nAssign < aAssignValues.getLength(); nAssign += 4 ) |
323 | 0 | { |
324 | 0 | DBAddressDataAssignment aAssignment; |
325 | 0 | pAssignValues[nAssign] >>= aAssignment.aDBData.sDataSource; |
326 | 0 | pAssignValues[nAssign + 1] >>= aAssignment.aDBData.sCommand; |
327 | 0 | pAssignValues[nAssign + 2] >>= aAssignment.aDBData.nCommandType; |
328 | 0 | pAssignValues[nAssign + 3] >>= aAssignment.aDBColumnAssignments; |
329 | 0 | aAssignment.sConfigNodeName = pAssignments[nAssign / 4]; |
330 | 0 | m_aAddressDataAssignments.push_back(std::move(aAssignment)); |
331 | 0 | } |
332 | 0 | } |
333 | | //check if the saved documents still exist |
334 | 0 | if(!m_aSavedDocuments.hasElements()) |
335 | 0 | return; |
336 | | |
337 | 0 | uno::Sequence< OUString > aTempDocuments(m_aSavedDocuments.getLength()); |
338 | 0 | auto begin = aTempDocuments.getArray(); |
339 | 0 | OUString* pTempDocuments = std::copy_if(std::cbegin(m_aSavedDocuments), std::cend(m_aSavedDocuments), begin, |
340 | 0 | [](const OUString& rDoc) { return SWUnoHelper::UCB_IsFile( rDoc ); }); |
341 | 0 | sal_Int32 nIndex = static_cast<sal_Int32>(std::distance(begin, pTempDocuments)); |
342 | 0 | if(nIndex < m_aSavedDocuments.getLength()) |
343 | 0 | { |
344 | 0 | m_aSavedDocuments.swap(aTempDocuments); |
345 | 0 | m_aSavedDocuments.realloc(nIndex); |
346 | 0 | } |
347 | 0 | } |
348 | | |
349 | | void SwMailMergeConfigItem_Impl::SetCurrentAddressBlockIndex( sal_Int32 nSet ) |
350 | 0 | { |
351 | 0 | if(m_aAddressBlocks.size() >= sal::static_int_cast<sal_uInt32, sal_Int32>(nSet)) |
352 | 0 | { |
353 | 0 | m_nCurrentAddressBlock = nSet; |
354 | 0 | SetModified(); |
355 | 0 | } |
356 | 0 | } |
357 | | |
358 | | static OUString lcl_CreateNodeName(Sequence<OUString>& rAssignments ) |
359 | 0 | { |
360 | 0 | sal_Int32 nStart = rAssignments.getLength(); |
361 | 0 | OUString sNewName; |
362 | | //search if the name exists |
363 | 0 | while(true) |
364 | 0 | { |
365 | 0 | sNewName = "_" + OUString::number(nStart++); |
366 | 0 | if(comphelper::findValue(rAssignments, sNewName) == -1) |
367 | 0 | break; |
368 | 0 | } |
369 | | // add the new name to the array of existing names |
370 | 0 | rAssignments.realloc(rAssignments.getLength() + 1); |
371 | 0 | rAssignments.getArray()[rAssignments.getLength() - 1] = sNewName; |
372 | 0 | return sNewName; |
373 | 0 | } |
374 | | |
375 | | static void lcl_ConvertToNumbers(OUString& rBlock, const std::vector<std::pair<OUString, int>>& rHeaders ) |
376 | 0 | { |
377 | | //convert the strings used for UI to numbers used for the configuration |
378 | 0 | OUString sBlock(rBlock.replaceAll("\n", "\\n")); |
379 | 0 | for (size_t i = 0; i < rHeaders.size(); ++i) |
380 | 0 | { |
381 | 0 | OUString sHeader = "<" + rHeaders[i].first + ">"; |
382 | 0 | OUString sReplace = "<" + OUStringChar(sal_Unicode('0' + i)) + ">"; |
383 | 0 | sBlock = sBlock.replaceAll(sHeader, sReplace); |
384 | 0 | } |
385 | 0 | rBlock = sBlock; |
386 | 0 | } |
387 | | |
388 | | static void lcl_ConvertFromNumbers(OUString& rBlock, const std::vector<std::pair<OUString, int>>& rHeaders) |
389 | 0 | { |
390 | | //convert the numbers used for the configuration to strings used for UI to numbers |
391 | | //doesn't use ReplaceAll to prevent expansion of numbers inside of the headers |
392 | 0 | SwAddressIterator aGreetingIter(rBlock.replaceAll("\\n", "\n")); |
393 | 0 | OUStringBuffer sBlock; |
394 | 0 | while(aGreetingIter.HasMore()) |
395 | 0 | { |
396 | 0 | SwMergeAddressItem aNext = aGreetingIter.Next(); |
397 | 0 | if(aNext.bIsColumn) |
398 | 0 | { |
399 | | //the text should be 1 characters long |
400 | 0 | sal_Unicode cChar = aNext.sText[0]; |
401 | 0 | if(cChar >= '0' && cChar <= 'c') |
402 | 0 | { |
403 | 0 | sBlock.append("<"); |
404 | 0 | sal_uInt16 nHeader = cChar - '0'; |
405 | 0 | if(nHeader < rHeaders.size()) |
406 | 0 | sBlock.append(rHeaders[nHeader].first); |
407 | 0 | sBlock.append(">"); |
408 | 0 | } |
409 | 0 | else |
410 | 0 | { |
411 | 0 | SAL_WARN("sw.ui", "parse error in address block or greeting line"); |
412 | 0 | } |
413 | 0 | } |
414 | 0 | else |
415 | 0 | sBlock.append(aNext.sText); |
416 | 0 | } |
417 | 0 | rBlock = sBlock.makeStringAndClear(); |
418 | 0 | } |
419 | | |
420 | | const Sequence<OUString>& SwMailMergeConfigItem_Impl::GetPropertyNames() |
421 | 0 | { |
422 | 0 | static Sequence<OUString> aNames { |
423 | 0 | u"OutputToLetter"_ustr, // 0 |
424 | 0 | u"IncludeCountry"_ustr, // 1 |
425 | 0 | u"ExcludeCountry"_ustr, // 2 |
426 | 0 | u"AddressBlockSettings"_ustr, // 3 |
427 | 0 | u"IsAddressBlock"_ustr, // 4 |
428 | 0 | u"IsGreetingLine"_ustr, // 5 |
429 | 0 | u"IsIndividualGreetingLine"_ustr, // 6 |
430 | 0 | u"FemaleGreetingLines"_ustr, // 7 |
431 | 0 | u"MaleGreetingLines"_ustr, // 8 |
432 | 0 | u"NeutralGreetingLines"_ustr, // 9 |
433 | 0 | u"CurrentFemaleGreeting"_ustr, // 10 |
434 | 0 | u"CurrentMaleGreeting"_ustr, // 11 |
435 | 0 | u"CurrentNeutralGreeting"_ustr, // 12 |
436 | 0 | u"FemaleGenderValue"_ustr, // 13 |
437 | 0 | u"MailDisplayName"_ustr, // 14 |
438 | 0 | u"MailAddress"_ustr, // 15 |
439 | 0 | u"IsMailReplyTo"_ustr, // 16 |
440 | 0 | u"MailReplyTo"_ustr, // 17 |
441 | 0 | u"MailServer"_ustr, // 18 |
442 | 0 | u"MailPort"_ustr, // 19 |
443 | 0 | u"IsSecureConnection"_ustr, // 20 |
444 | 0 | u"IsAuthentication"_ustr, // 21 |
445 | 0 | u"MailUserName"_ustr, // 22 |
446 | 0 | u"MailPassword"_ustr, // 23 |
447 | 0 | u"DataSource/DataSourceName"_ustr, // 24 |
448 | 0 | u"DataSource/DataTableName"_ustr, // 25 |
449 | 0 | u"DataSource/DataCommandType"_ustr,// 26 |
450 | 0 | u"Filter"_ustr, // 27 |
451 | 0 | u"SavedDocuments"_ustr, // 28 |
452 | 0 | u"EMailSupported"_ustr, // 29 |
453 | 0 | u"IsEMailGreetingLine"_ustr, //30 |
454 | 0 | u"IsEMailIndividualGreetingLine"_ustr, //31 |
455 | 0 | u"IsSMPTAfterPOP"_ustr, //32 |
456 | 0 | u"InServerName"_ustr, //33 |
457 | 0 | u"InServerPort"_ustr, //34 |
458 | 0 | u"InServerIsPOP"_ustr, //35 |
459 | 0 | u"InServerUserName"_ustr, //36 |
460 | 0 | u"InServerPassword"_ustr, //37 |
461 | 0 | u"IsHideEmptyParagraphs"_ustr, //38 |
462 | 0 | u"CurrentAddressBlock"_ustr //39 |
463 | 0 | }; |
464 | 0 | return aNames; |
465 | 0 | } |
466 | | |
467 | 0 | void SwMailMergeConfigItem_Impl::Notify( const css::uno::Sequence< OUString >& ) {} |
468 | | |
469 | | void SwMailMergeConfigItem_Impl::ImplCommit() |
470 | 0 | { |
471 | 0 | Sequence<OUString> aNames = GetPropertyNames(); |
472 | 0 | Sequence<Any> aValues(aNames.getLength()); |
473 | 0 | Any* pValues = aValues.getArray(); |
474 | |
|
475 | 0 | for(int nProp = 0; nProp < aNames.getLength(); nProp++) |
476 | 0 | { |
477 | 0 | switch(nProp) |
478 | 0 | { |
479 | 0 | case 0: pValues[nProp] <<= m_bIsOutputToLetter; break; |
480 | 0 | case 1: pValues[nProp] <<= m_bIncludeCountry; break; |
481 | 0 | case 2: pValues[nProp] <<= m_sExcludeCountry; break; |
482 | 0 | case 3: pValues[nProp] <<= GetAddressBlocks(true); break; |
483 | 0 | case 4: |
484 | 0 | { |
485 | 0 | if( m_bUserSettingWereOverwritten) |
486 | 0 | pValues[nProp] <<= m_bIsAddressBlock_LastUserSetting; |
487 | 0 | else |
488 | 0 | pValues[nProp] <<= m_bIsAddressBlock; |
489 | 0 | break; |
490 | 0 | } |
491 | 0 | case 5: |
492 | 0 | { |
493 | 0 | if( m_bUserSettingWereOverwritten) |
494 | 0 | pValues[nProp] <<= m_bIsGreetingLine_LastUserSetting; |
495 | 0 | else |
496 | 0 | pValues[nProp] <<= m_bIsGreetingLine; |
497 | 0 | break; |
498 | 0 | } |
499 | 0 | case 6: pValues[nProp] <<= m_bIsIndividualGreetingLine; break; |
500 | 0 | case 7: |
501 | 0 | case 8: |
502 | 0 | case 9: |
503 | 0 | pValues[nProp] <<= GetGreetings( |
504 | 0 | SwMailMergeConfigItem::Gender( |
505 | 0 | SwMailMergeConfigItem::FEMALE + nProp - 7), true); |
506 | 0 | break; |
507 | 0 | case 10: pValues[nProp] <<= m_nCurrentFemaleGreeting; break; |
508 | 0 | case 11: pValues[nProp] <<= m_nCurrentMaleGreeting; break; |
509 | 0 | case 12: pValues[nProp] <<= m_nCurrentNeutralGreeting; break; |
510 | 0 | case 13: pValues[nProp] <<= m_sFemaleGenderValue; break; |
511 | 0 | case 14: pValues[nProp] <<= m_sMailDisplayName; break; |
512 | 0 | case 15: pValues[nProp] <<= m_sMailAddress; break; |
513 | 0 | case 16: pValues[nProp] <<= m_bIsMailReplyTo; break; |
514 | 0 | case 17: pValues[nProp] <<= m_sMailReplyTo; break; |
515 | 0 | case 18: pValues[nProp] <<= m_sMailServer; break; |
516 | 0 | case 19: pValues[nProp] <<= m_nMailPort; break; |
517 | 0 | case 20: pValues[nProp] <<= m_bIsSecureConnection; break; |
518 | 0 | case 21: pValues[nProp] <<= m_bIsAuthentication; break; |
519 | 0 | case 22: pValues[nProp] <<= m_sMailUserName; break; |
520 | 0 | case 23: pValues[nProp] <<= m_sMailPassword; break; |
521 | 0 | case 24 :pValues[nProp] <<= m_aDBData.sDataSource; break; |
522 | 0 | case 25 :pValues[nProp] <<= m_aDBData.sCommand; break; |
523 | 0 | case 26 :pValues[nProp] <<= m_aDBData.nCommandType; break; |
524 | 0 | case 27 :pValues[nProp] <<= m_sFilter; break; |
525 | 0 | case 28 :pValues[nProp] <<= m_aSavedDocuments; break; |
526 | 0 | case 29: pValues[nProp] <<= m_bIsEMailSupported; break; |
527 | 0 | case 30: |
528 | 0 | { |
529 | 0 | if( m_bUserSettingWereOverwritten) |
530 | 0 | pValues[nProp] <<= m_bIsGreetingLineInMail_LastUserSetting; |
531 | 0 | else |
532 | 0 | pValues[nProp] <<= m_bIsGreetingLineInMail; |
533 | 0 | break; |
534 | 0 | } |
535 | 0 | case 31: pValues[nProp] <<= m_bIsIndividualGreetingLineInMail; break; |
536 | 0 | case 32: pValues[nProp] <<= m_bIsSMPTAfterPOP; break; |
537 | 0 | case 33: pValues[nProp] <<= m_sInServerName; break; |
538 | 0 | case 34: pValues[nProp] <<= m_nInServerPort; break; |
539 | 0 | case 35: pValues[nProp] <<= m_bInServerPOP; break; |
540 | 0 | case 36: pValues[nProp] <<= m_sInServerUserName; break; |
541 | 0 | case 37: pValues[nProp] <<= m_sInServerPassword; break; |
542 | 0 | case 38: pValues[nProp] <<= m_bIsHideEmptyParagraphs; break; |
543 | 0 | case 39: pValues[nProp] <<= m_nCurrentAddressBlock; break; |
544 | 0 | } |
545 | 0 | } |
546 | 0 | PutProperties(aNames, aValues); |
547 | | //store the changed / new assignments |
548 | | |
549 | | //load the existing node names to find new names |
550 | 0 | Sequence<OUString> aAssignments = GetNodeNames(cAddressDataAssignments); |
551 | |
|
552 | 0 | for(const auto& rAssignment : m_aAddressDataAssignments) |
553 | 0 | { |
554 | 0 | if(rAssignment.bColumnAssignmentsChanged) |
555 | 0 | { |
556 | | //create a new node name |
557 | 0 | OUString sNewNode = !rAssignment.sConfigNodeName.isEmpty() ? |
558 | 0 | rAssignment.sConfigNodeName : |
559 | 0 | lcl_CreateNodeName(aAssignments); |
560 | 0 | OUString sSlash = u"/"_ustr; |
561 | 0 | OUString sNodePath = cAddressDataAssignments + sSlash + sNewNode + sSlash; |
562 | | //only one new entry is written |
563 | 0 | Sequence< PropertyValue > aNewValues |
564 | 0 | { |
565 | 0 | comphelper::makePropertyValue(sNodePath + cDataSourceName, rAssignment.aDBData.sDataSource), |
566 | 0 | comphelper::makePropertyValue(sNodePath + cDataTableName, rAssignment.aDBData.sCommand), |
567 | 0 | comphelper::makePropertyValue(sNodePath + cDataCommandType, rAssignment.aDBData.nCommandType), |
568 | 0 | comphelper::makePropertyValue(sNodePath + cDBColumnAssignments, rAssignment.aDBColumnAssignments) |
569 | 0 | }; |
570 | 0 | SetSetProperties(cAddressDataAssignments, aNewValues); |
571 | 0 | } |
572 | 0 | } |
573 | |
|
574 | 0 | m_bUserSettingWereOverwritten = false; |
575 | 0 | } |
576 | | |
577 | | Sequence< OUString> SwMailMergeConfigItem_Impl::GetAddressBlocks( |
578 | | bool bConvertToConfig) const |
579 | 0 | { |
580 | 0 | Sequence< OUString> aRet(m_aAddressBlocks.size()); |
581 | 0 | std::transform(m_aAddressBlocks.begin(), m_aAddressBlocks.end(), aRet.getArray(), |
582 | 0 | [this, bConvertToConfig](const OUString& rBlock) -> OUString { |
583 | 0 | OUString sBlock = rBlock; |
584 | 0 | if(bConvertToConfig) |
585 | 0 | lcl_ConvertToNumbers(sBlock, m_AddressHeaderSA); |
586 | 0 | return sBlock; |
587 | 0 | }); |
588 | 0 | return aRet; |
589 | 0 | } |
590 | | |
591 | | void SwMailMergeConfigItem_Impl::SetAddressBlocks( |
592 | | const Sequence< OUString>& rBlocks, |
593 | | bool bConvertFromConfig) |
594 | 0 | { |
595 | 0 | m_aAddressBlocks.clear(); |
596 | 0 | std::transform(rBlocks.begin(), rBlocks.end(), std::back_inserter(m_aAddressBlocks), |
597 | 0 | [this, bConvertFromConfig](const OUString& rBlock) -> OUString { |
598 | 0 | OUString sBlock = rBlock; |
599 | 0 | if(bConvertFromConfig) |
600 | 0 | lcl_ConvertFromNumbers(sBlock, m_AddressHeaderSA); |
601 | 0 | return sBlock; |
602 | 0 | }); |
603 | 0 | m_nCurrentAddressBlock = 0; |
604 | 0 | SetModified(); |
605 | 0 | } |
606 | | |
607 | | Sequence< OUString> SwMailMergeConfigItem_Impl::GetGreetings( |
608 | | SwMailMergeConfigItem::Gender eType, bool bConvertToConfig) const |
609 | 0 | { |
610 | 0 | const std::vector< OUString>& rGreetings = |
611 | 0 | eType == SwMailMergeConfigItem::FEMALE ? m_aFemaleGreetingLines : |
612 | 0 | eType == SwMailMergeConfigItem::MALE ? m_aMaleGreetingLines : |
613 | 0 | m_aNeutralGreetingLines; |
614 | 0 | Sequence< OUString> aRet(rGreetings.size()); |
615 | 0 | std::transform(rGreetings.begin(), rGreetings.end(), aRet.getArray(), |
616 | 0 | [this, bConvertToConfig](const OUString& rGreeting) -> OUString { |
617 | 0 | OUString sGreeting = rGreeting; |
618 | 0 | if(bConvertToConfig) |
619 | 0 | lcl_ConvertToNumbers(sGreeting, m_AddressHeaderSA); |
620 | 0 | return sGreeting; |
621 | 0 | }); |
622 | 0 | return aRet; |
623 | 0 | } |
624 | | |
625 | | void SwMailMergeConfigItem_Impl::SetGreetings( |
626 | | SwMailMergeConfigItem::Gender eType, |
627 | | const Sequence< OUString>& rSetGreetings, |
628 | | bool bConvertFromConfig) |
629 | 0 | { |
630 | 0 | std::vector< OUString>& rGreetings = |
631 | 0 | eType == SwMailMergeConfigItem::FEMALE ? m_aFemaleGreetingLines : |
632 | 0 | eType == SwMailMergeConfigItem::MALE ? m_aMaleGreetingLines : |
633 | 0 | m_aNeutralGreetingLines; |
634 | |
|
635 | 0 | rGreetings.clear(); |
636 | 0 | std::transform(rSetGreetings.begin(), rSetGreetings.end(), std::back_inserter(rGreetings), |
637 | 0 | [this, bConvertFromConfig](const OUString& rGreeting) -> OUString { |
638 | 0 | OUString sGreeting = rGreeting; |
639 | 0 | if(bConvertFromConfig) |
640 | 0 | lcl_ConvertFromNumbers(sGreeting, m_AddressHeaderSA); |
641 | 0 | return sGreeting; |
642 | 0 | }); |
643 | 0 | SetModified(); |
644 | 0 | } |
645 | | |
646 | | sal_Int32 SwMailMergeConfigItem_Impl::GetCurrentGreeting( |
647 | | SwMailMergeConfigItem::Gender eType) const |
648 | 0 | { |
649 | 0 | sal_Int32 nRet; |
650 | 0 | switch(eType) |
651 | 0 | { |
652 | 0 | case SwMailMergeConfigItem::FEMALE: nRet = m_nCurrentFemaleGreeting ; break; |
653 | 0 | case SwMailMergeConfigItem::MALE: nRet = m_nCurrentMaleGreeting ; break; |
654 | 0 | default: nRet = m_nCurrentNeutralGreeting; break; |
655 | 0 | } |
656 | 0 | return nRet; |
657 | 0 | } |
658 | | |
659 | | void SwMailMergeConfigItem_Impl::SetCurrentGreeting( |
660 | | SwMailMergeConfigItem::Gender eType, sal_Int32 nIndex) |
661 | 0 | { |
662 | 0 | bool bChanged = false; |
663 | 0 | switch(eType) |
664 | 0 | { |
665 | 0 | case SwMailMergeConfigItem::FEMALE: |
666 | 0 | bChanged = m_nCurrentFemaleGreeting != nIndex; |
667 | 0 | m_nCurrentFemaleGreeting = nIndex; |
668 | 0 | break; |
669 | 0 | case SwMailMergeConfigItem::MALE: |
670 | 0 | bChanged = m_nCurrentMaleGreeting != nIndex; |
671 | 0 | m_nCurrentMaleGreeting = nIndex; |
672 | 0 | break; |
673 | 0 | default: |
674 | 0 | bChanged = m_nCurrentNeutralGreeting != nIndex; |
675 | 0 | m_nCurrentNeutralGreeting = nIndex; |
676 | 0 | } |
677 | 0 | if(bChanged) |
678 | 0 | SetModified(); |
679 | 0 | } |
680 | | |
681 | | SwMailMergeConfigItem::SwMailMergeConfigItem() : |
682 | 0 | m_pImpl(new SwMailMergeConfigItem_Impl), |
683 | 0 | m_bAddressInserted(false), |
684 | 0 | m_bGreetingInserted(false), |
685 | 0 | m_nGreetingMoves(0), |
686 | 0 | m_nBegin(0), |
687 | 0 | m_nEnd(0), |
688 | 0 | m_pSourceView(nullptr), |
689 | 0 | m_pTargetView(nullptr) |
690 | 0 | { |
691 | 0 | } |
692 | | |
693 | | void SwMailMergeConfigItem::stopDBChangeListening() |
694 | 0 | { |
695 | 0 | if (m_xDBChangedListener.is()) |
696 | 0 | { |
697 | 0 | uno::Reference<view::XSelectionSupplier> xSupplier = m_pSourceView->GetUNOObject(); |
698 | 0 | xSupplier->removeSelectionChangeListener(m_xDBChangedListener); |
699 | 0 | m_xDBChangedListener.clear(); |
700 | 0 | } |
701 | 0 | } |
702 | | |
703 | | void SwMailMergeConfigItem::updateCurrentDBDataFromDocument() |
704 | 0 | { |
705 | 0 | const SwDBData& rDBData = m_pSourceView->GetWrtShell().GetDBData(); |
706 | 0 | SetCurrentDBData(rDBData); |
707 | 0 | } |
708 | | |
709 | | SwMailMergeConfigItem::~SwMailMergeConfigItem() |
710 | 0 | { |
711 | 0 | stopDBChangeListening(); |
712 | 0 | } |
713 | | |
714 | | void SwMailMergeConfigItem::Commit() |
715 | 0 | { |
716 | 0 | if(m_pImpl->IsModified()) |
717 | 0 | m_pImpl->Commit(); |
718 | 0 | } |
719 | | |
720 | | const std::vector<std::pair<OUString, int>>& SwMailMergeConfigItem::GetDefaultAddressHeaders() const |
721 | 0 | { |
722 | 0 | return m_pImpl->m_AddressHeaderSA; |
723 | 0 | } |
724 | | |
725 | | void SwMailMergeConfigItem::SetAddressBlocks( |
726 | | const Sequence< OUString>& rBlocks) |
727 | 0 | { |
728 | 0 | m_pImpl->SetAddressBlocks(rBlocks); |
729 | 0 | } |
730 | | |
731 | | Sequence< OUString> SwMailMergeConfigItem::GetAddressBlocks() const |
732 | 0 | { |
733 | 0 | return m_pImpl->GetAddressBlocks(); |
734 | 0 | } |
735 | | |
736 | | bool SwMailMergeConfigItem::IsAddressBlock()const |
737 | 0 | { |
738 | 0 | return m_pImpl->m_bIsAddressBlock && IsOutputToLetter(); |
739 | 0 | } |
740 | | |
741 | | void SwMailMergeConfigItem::SetAddressBlock(bool bSet) |
742 | 0 | { |
743 | 0 | m_pImpl->m_bUserSettingWereOverwritten = false; |
744 | 0 | if(m_pImpl->m_bIsAddressBlock != bSet) |
745 | 0 | { |
746 | 0 | m_pImpl->m_bIsAddressBlock = bSet; |
747 | 0 | m_pImpl->SetModified(); |
748 | 0 | } |
749 | 0 | } |
750 | | |
751 | | bool SwMailMergeConfigItem::IsHideEmptyParagraphs() const |
752 | 0 | { |
753 | 0 | return m_pImpl->m_bIsHideEmptyParagraphs; |
754 | 0 | } |
755 | | |
756 | | void SwMailMergeConfigItem::SetHideEmptyParagraphs(bool bSet) |
757 | 0 | { |
758 | 0 | if(m_pImpl->m_bIsHideEmptyParagraphs != bSet) |
759 | 0 | { |
760 | 0 | m_pImpl->m_bIsHideEmptyParagraphs = bSet; |
761 | 0 | m_pImpl->SetModified(); |
762 | 0 | } |
763 | 0 | } |
764 | | |
765 | | bool SwMailMergeConfigItem::IsIncludeCountry() const |
766 | 0 | { |
767 | 0 | return m_pImpl->m_bIncludeCountry; |
768 | 0 | } |
769 | | |
770 | | OUString& SwMailMergeConfigItem::GetExcludeCountry() const |
771 | 0 | { |
772 | 0 | return m_pImpl->m_sExcludeCountry; |
773 | 0 | } |
774 | | |
775 | | void SwMailMergeConfigItem::SetCountrySettings(bool bSet, const OUString& rCountry) |
776 | 0 | { |
777 | 0 | if(m_pImpl->m_sExcludeCountry != rCountry || |
778 | 0 | m_pImpl->m_bIncludeCountry != bSet) |
779 | 0 | { |
780 | 0 | m_pImpl->m_bIncludeCountry = bSet; |
781 | 0 | m_pImpl->m_sExcludeCountry = bSet ? rCountry : OUString(); |
782 | 0 | m_pImpl->SetModified(); |
783 | 0 | } |
784 | 0 | } |
785 | | |
786 | | void SwMailMergeConfigItem::SetCurrentConnection( |
787 | | Reference< XDataSource> const & xSource, |
788 | | const SharedConnection& rConnection, |
789 | | Reference< XColumnsSupplier> const & xColumnsSupplier, |
790 | | const SwDBData& rDBData) |
791 | 0 | { |
792 | 0 | m_pImpl->m_xSource = xSource ; |
793 | 0 | m_pImpl->m_xConnection = rConnection ; |
794 | 0 | m_pImpl->m_xColumnsSupplier = xColumnsSupplier; |
795 | 0 | m_pImpl->m_aDBData = rDBData; |
796 | 0 | m_pImpl->m_xResultSet = nullptr; |
797 | 0 | m_pImpl->m_nResultSetCursorPos = 0; |
798 | 0 | m_pImpl->SetModified(); |
799 | 0 | } |
800 | | |
801 | | Reference< XDataSource> const & SwMailMergeConfigItem::GetSource() const |
802 | 0 | { |
803 | 0 | return m_pImpl->m_xSource; |
804 | 0 | } |
805 | | |
806 | | SharedConnection const & SwMailMergeConfigItem::GetConnection() const |
807 | 0 | { |
808 | 0 | return m_pImpl->m_xConnection; |
809 | 0 | } |
810 | | |
811 | | Reference< XColumnsSupplier> const & SwMailMergeConfigItem::GetColumnsSupplier() |
812 | 0 | { |
813 | 0 | if(!m_pImpl->m_xColumnsSupplier.is() && m_pImpl->m_xConnection.is()) |
814 | 0 | { |
815 | 0 | m_pImpl->m_xColumnsSupplier = SwDBManager::GetColumnSupplier(m_pImpl->m_xConnection, |
816 | 0 | m_pImpl->m_aDBData.sCommand, |
817 | 0 | m_pImpl->m_aDBData.nCommandType == CommandType::TABLE ? |
818 | 0 | SwDBSelect::TABLE : SwDBSelect::QUERY ); |
819 | 0 | } |
820 | 0 | return m_pImpl->m_xColumnsSupplier; |
821 | 0 | } |
822 | | |
823 | | const SwDBData& SwMailMergeConfigItem::GetCurrentDBData() const |
824 | 0 | { |
825 | 0 | return m_pImpl->m_aDBData; |
826 | 0 | } |
827 | | |
828 | | void SwMailMergeConfigItem::SetCurrentDBData( const SwDBData& rDBData) |
829 | 0 | { |
830 | 0 | if(m_pImpl->m_aDBData != rDBData) |
831 | 0 | { |
832 | 0 | m_pImpl->m_aDBData = rDBData; |
833 | 0 | m_pImpl->m_xConnection.clear(); |
834 | 0 | m_pImpl->m_xSource = nullptr; |
835 | 0 | m_pImpl->m_xResultSet = nullptr; |
836 | 0 | m_pImpl->m_xColumnsSupplier = nullptr; |
837 | 0 | m_pImpl->SetModified(); |
838 | 0 | } |
839 | 0 | } |
840 | | |
841 | | Reference<XRowSet> const& SwMailMergeConfigItem::GetResultSet() const |
842 | 0 | { |
843 | 0 | if(!m_pImpl->m_xConnection.is() && !m_pImpl->m_aDBData.sDataSource.isEmpty()) |
844 | 0 | { |
845 | 0 | m_pImpl->m_xConnection.reset( |
846 | 0 | SwDBManager::GetConnection(m_pImpl->m_aDBData.sDataSource, m_pImpl->m_xSource, m_pSourceView), |
847 | 0 | SharedConnection::TakeOwnership |
848 | 0 | ); |
849 | 0 | } |
850 | 0 | if(!m_pImpl->m_xResultSet.is() && m_pImpl->m_xConnection.is()) |
851 | 0 | { |
852 | 0 | try |
853 | 0 | { |
854 | 0 | Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() ); |
855 | |
|
856 | 0 | Reference<XRowSet> xRowSet( xMgr->createInstance(u"com.sun.star.sdb.RowSet"_ustr), UNO_QUERY ); |
857 | 0 | Reference<XPropertySet> xRowProperties(xRowSet, UNO_QUERY); |
858 | 0 | xRowProperties->setPropertyValue(u"DataSourceName"_ustr, Any(m_pImpl->m_aDBData.sDataSource)); |
859 | 0 | xRowProperties->setPropertyValue(u"Command"_ustr, Any(m_pImpl->m_aDBData.sCommand)); |
860 | 0 | xRowProperties->setPropertyValue(u"CommandType"_ustr, Any(m_pImpl->m_aDBData.nCommandType)); |
861 | 0 | xRowProperties->setPropertyValue(u"FetchSize"_ustr, Any(sal_Int32(10))); |
862 | 0 | xRowProperties->setPropertyValue(u"ActiveConnection"_ustr, Any(m_pImpl->m_xConnection.getTyped())); |
863 | 0 | try |
864 | 0 | { |
865 | 0 | xRowProperties->setPropertyValue(u"ApplyFilter"_ustr, Any(!m_pImpl->m_sFilter.isEmpty())); |
866 | 0 | xRowProperties->setPropertyValue(u"Filter"_ustr, Any(m_pImpl->m_sFilter)); |
867 | 0 | } |
868 | 0 | catch (const Exception&) |
869 | 0 | { |
870 | 0 | TOOLS_WARN_EXCEPTION("sw.ui", ""); |
871 | 0 | } |
872 | 0 | xRowSet->execute(); |
873 | 0 | m_pImpl->m_xResultSet = xRowSet.get(); |
874 | 0 | m_pImpl->m_xResultSet->first(); |
875 | 0 | m_pImpl->m_nResultSetCursorPos = 1; |
876 | 0 | } |
877 | 0 | catch (const Exception&) |
878 | 0 | { |
879 | 0 | TOOLS_WARN_EXCEPTION("sw.ui", "SwMailMergeConfigItem::GetResultSet()"); |
880 | 0 | } |
881 | 0 | } |
882 | 0 | return m_pImpl->m_xResultSet; |
883 | 0 | } |
884 | | |
885 | | void SwMailMergeConfigItem::DisposeResultSet() |
886 | 0 | { |
887 | 0 | m_pImpl->m_xConnection.clear(); |
888 | 0 | if(m_pImpl->m_xResultSet.is()) |
889 | 0 | { |
890 | 0 | ::comphelper::disposeComponent( m_pImpl->m_xResultSet ); |
891 | 0 | } |
892 | 0 | } |
893 | | |
894 | | OUString& SwMailMergeConfigItem::GetFilter() const |
895 | 0 | { |
896 | 0 | return m_pImpl->m_sFilter; |
897 | 0 | } |
898 | | |
899 | | void SwMailMergeConfigItem::SetFilter(OUString const & rFilter) |
900 | 0 | { |
901 | 0 | if(m_pImpl->m_sFilter == rFilter) |
902 | 0 | return; |
903 | | |
904 | 0 | m_pImpl->m_sFilter = rFilter; |
905 | 0 | m_pImpl->SetModified(); |
906 | 0 | Reference<XPropertySet> xRowProperties(m_pImpl->m_xResultSet, UNO_QUERY); |
907 | 0 | if(!xRowProperties.is()) |
908 | 0 | return; |
909 | | |
910 | 0 | try |
911 | 0 | { |
912 | 0 | xRowProperties->setPropertyValue(u"ApplyFilter"_ustr, Any(!m_pImpl->m_sFilter.isEmpty())); |
913 | 0 | xRowProperties->setPropertyValue(u"Filter"_ustr, Any(m_pImpl->m_sFilter)); |
914 | 0 | assert(m_pImpl->m_xResultSet.is()); |
915 | 0 | m_pImpl->m_xResultSet->execute(); |
916 | 0 | } |
917 | 0 | catch (const Exception&) |
918 | 0 | { |
919 | 0 | TOOLS_WARN_EXCEPTION("sw.ui", "SwMailMergeConfigItem::SetFilter()"); |
920 | 0 | } |
921 | 0 | } |
922 | | |
923 | | sal_Int32 SwMailMergeConfigItem::MoveResultSet(sal_Int32 nTarget) |
924 | 0 | { |
925 | 0 | if(!m_pImpl->m_xResultSet.is()) |
926 | 0 | GetResultSet(); |
927 | 0 | if(m_pImpl->m_xResultSet.is()) |
928 | 0 | { |
929 | 0 | try |
930 | 0 | { |
931 | | //no action if the resultset is already at the right position |
932 | 0 | if(m_pImpl->m_xResultSet->getRow() != nTarget) |
933 | 0 | { |
934 | 0 | if(nTarget > 0) |
935 | 0 | { |
936 | 0 | bool bMoved = m_pImpl->m_xResultSet->absolute(nTarget); |
937 | 0 | if(!bMoved) |
938 | 0 | { |
939 | 0 | if(nTarget > 1) |
940 | 0 | m_pImpl->m_xResultSet->last(); |
941 | 0 | else if(nTarget == 1) |
942 | 0 | m_pImpl->m_xResultSet->first(); |
943 | 0 | } |
944 | 0 | } |
945 | 0 | else if(nTarget == -1) |
946 | 0 | m_pImpl->m_xResultSet->last(); |
947 | 0 | m_pImpl->m_nResultSetCursorPos = m_pImpl->m_xResultSet->getRow(); |
948 | 0 | } |
949 | 0 | } |
950 | 0 | catch (const Exception&) |
951 | 0 | { |
952 | 0 | } |
953 | 0 | } |
954 | 0 | return m_pImpl->m_nResultSetCursorPos; |
955 | 0 | } |
956 | | |
957 | | bool SwMailMergeConfigItem::IsResultSetFirstLast(bool& bIsFirst, bool& bIsLast) |
958 | 0 | { |
959 | 0 | bool bRet = false; |
960 | 0 | if(!m_pImpl->m_xResultSet.is()) |
961 | 0 | GetResultSet(); |
962 | 0 | if(m_pImpl->m_xResultSet.is()) |
963 | 0 | { |
964 | 0 | try |
965 | 0 | { |
966 | 0 | bIsFirst = m_pImpl->m_xResultSet->isFirst(); |
967 | 0 | bIsLast = m_pImpl->m_xResultSet->isLast(); |
968 | 0 | bRet = true; |
969 | 0 | } |
970 | 0 | catch (const Exception&) |
971 | 0 | { |
972 | 0 | } |
973 | 0 | } |
974 | 0 | return bRet; |
975 | 0 | } |
976 | | |
977 | | sal_Int32 SwMailMergeConfigItem::GetResultSetPosition() const |
978 | 0 | { |
979 | 0 | return m_pImpl->m_nResultSetCursorPos; |
980 | 0 | } |
981 | | |
982 | | bool SwMailMergeConfigItem::IsRecordIncluded(sal_uInt32 nRecord) const |
983 | 0 | { return nRecord > m_nBegin && nRecord <= m_nEnd; } |
984 | | |
985 | | bool SwMailMergeConfigItem::IsRecordExcluded(sal_uInt32 nRecord) const |
986 | 0 | { return m_aExcludedRecords.contains(nRecord); } |
987 | | |
988 | | void SwMailMergeConfigItem::ExcludeRecord(sal_Int32 nRecord, bool bExclude) |
989 | 0 | { |
990 | 0 | if(bExclude) |
991 | 0 | m_aExcludedRecords.insert(nRecord); |
992 | 0 | else |
993 | 0 | m_aExcludedRecords.erase(nRecord); |
994 | 0 | } |
995 | | |
996 | | uno::Sequence<uno::Any> SwMailMergeConfigItem::GetSelection() const |
997 | 0 | { |
998 | 0 | if(!m_pImpl->m_xResultSet.is()) |
999 | 0 | GetResultSet(); |
1000 | 0 | if(!m_pImpl->m_xResultSet.is()) |
1001 | 0 | return {}; |
1002 | 0 | m_pImpl->m_xResultSet->last(); |
1003 | 0 | sal_uInt32 nResultSetSize = m_pImpl->m_xResultSet->getRow()+1; |
1004 | 0 | std::vector<uno::Any> vResult; |
1005 | 0 | for(sal_uInt32 nIdx=1; nIdx<nResultSetSize;++nIdx) |
1006 | 0 | if( !IsRecordExcluded(nIdx) && IsRecordIncluded(nIdx) ) |
1007 | 0 | vResult.push_back(uno::Any(sal_uInt32(nIdx))); |
1008 | 0 | return comphelper::containerToSequence(vResult); |
1009 | 0 | } |
1010 | | |
1011 | | |
1012 | | const uno::Sequence< OUString>& |
1013 | | SwMailMergeConfigItem::GetSavedDocuments() const |
1014 | 0 | { |
1015 | 0 | return m_pImpl->m_aSavedDocuments; |
1016 | 0 | } |
1017 | | |
1018 | | bool SwMailMergeConfigItem::IsOutputToLetter()const |
1019 | 0 | { |
1020 | 0 | return m_pImpl->m_bIsOutputToLetter || !IsMailAvailable(); |
1021 | 0 | } |
1022 | | |
1023 | | void SwMailMergeConfigItem::SetOutputToLetter(bool bSet) |
1024 | 0 | { |
1025 | 0 | if(m_pImpl->m_bIsOutputToLetter != bSet) |
1026 | 0 | { |
1027 | 0 | m_pImpl->m_bIsOutputToLetter = bSet; |
1028 | 0 | m_pImpl->SetModified(); |
1029 | 0 | } |
1030 | 0 | } |
1031 | | |
1032 | | bool SwMailMergeConfigItem::IsIndividualGreeting(bool bInEMail) const |
1033 | 0 | { |
1034 | 0 | return bInEMail ? |
1035 | 0 | m_pImpl->m_bIsIndividualGreetingLineInMail : |
1036 | 0 | m_pImpl->m_bIsIndividualGreetingLine; |
1037 | 0 | } |
1038 | | |
1039 | | void SwMailMergeConfigItem::SetIndividualGreeting( |
1040 | | bool bSet, bool bInEMail) |
1041 | 0 | { |
1042 | 0 | if(bInEMail) |
1043 | 0 | { |
1044 | 0 | if(m_pImpl->m_bIsIndividualGreetingLineInMail != bSet) |
1045 | 0 | { |
1046 | 0 | m_pImpl->m_bIsIndividualGreetingLineInMail = bSet; |
1047 | 0 | m_pImpl->SetModified(); |
1048 | 0 | } |
1049 | 0 | } |
1050 | 0 | else |
1051 | 0 | { |
1052 | 0 | if(m_pImpl->m_bIsIndividualGreetingLine != bSet) |
1053 | 0 | { |
1054 | 0 | m_pImpl->m_bIsIndividualGreetingLine = bSet; |
1055 | 0 | m_pImpl->SetModified(); |
1056 | 0 | } |
1057 | 0 | } |
1058 | 0 | } |
1059 | | |
1060 | | bool SwMailMergeConfigItem::IsGreetingLine(bool bInEMail) const |
1061 | 0 | { |
1062 | 0 | return bInEMail ? m_pImpl->m_bIsGreetingLineInMail : m_pImpl->m_bIsGreetingLine; |
1063 | 0 | } |
1064 | | |
1065 | | void SwMailMergeConfigItem::SetGreetingLine(bool bSet, bool bInEMail) |
1066 | 0 | { |
1067 | 0 | m_pImpl->m_bUserSettingWereOverwritten = false; |
1068 | 0 | if(bInEMail) |
1069 | 0 | { |
1070 | 0 | if(m_pImpl->m_bIsGreetingLineInMail != bSet) |
1071 | 0 | { |
1072 | 0 | m_pImpl->m_bIsGreetingLineInMail = bSet; |
1073 | 0 | m_pImpl->SetModified(); |
1074 | 0 | } |
1075 | 0 | } |
1076 | 0 | else |
1077 | 0 | { |
1078 | 0 | if(m_pImpl->m_bIsGreetingLine != bSet) |
1079 | 0 | { |
1080 | 0 | m_pImpl->m_bIsGreetingLine = bSet; |
1081 | 0 | m_pImpl->SetModified(); |
1082 | 0 | } |
1083 | 0 | } |
1084 | 0 | } |
1085 | | |
1086 | | Sequence< OUString> SwMailMergeConfigItem::GetGreetings( |
1087 | | Gender eType ) const |
1088 | 0 | { |
1089 | 0 | return m_pImpl->GetGreetings(eType); |
1090 | 0 | } |
1091 | | |
1092 | | void SwMailMergeConfigItem::SetGreetings( |
1093 | | Gender eType, const Sequence< OUString>& rSetGreetings) |
1094 | 0 | { |
1095 | 0 | m_pImpl->SetGreetings( eType, rSetGreetings); |
1096 | 0 | } |
1097 | | |
1098 | | sal_Int32 SwMailMergeConfigItem::GetCurrentGreeting( |
1099 | | SwMailMergeConfigItem::Gender eType) const |
1100 | 0 | { |
1101 | 0 | return m_pImpl->GetCurrentGreeting(eType); |
1102 | 0 | } |
1103 | | |
1104 | | void SwMailMergeConfigItem::SetCurrentGreeting(Gender eType, sal_Int32 nIndex) |
1105 | 0 | { |
1106 | 0 | m_pImpl->SetCurrentGreeting(eType, nIndex); |
1107 | 0 | } |
1108 | | |
1109 | | const OUString& SwMailMergeConfigItem::GetFemaleGenderValue() const |
1110 | 0 | { |
1111 | 0 | return m_pImpl->m_sFemaleGenderValue; |
1112 | 0 | } |
1113 | | |
1114 | | void SwMailMergeConfigItem::SetFemaleGenderValue(const OUString& rValue) |
1115 | 0 | { |
1116 | 0 | if( m_pImpl->m_sFemaleGenderValue != rValue ) |
1117 | 0 | { |
1118 | 0 | m_pImpl->m_sFemaleGenderValue = rValue; |
1119 | 0 | m_pImpl->SetModified(); |
1120 | 0 | } |
1121 | 0 | } |
1122 | | |
1123 | | Sequence< OUString> SwMailMergeConfigItem::GetColumnAssignment( |
1124 | | const SwDBData& rDBData ) const |
1125 | 0 | { |
1126 | 0 | Sequence< OUString> aRet; |
1127 | 0 | auto aAssignIter = std::find_if(m_pImpl->m_aAddressDataAssignments.begin(), m_pImpl->m_aAddressDataAssignments.end(), |
1128 | 0 | [&rDBData](const DBAddressDataAssignment& rAssignment) { return rAssignment.aDBData == rDBData; }); |
1129 | 0 | if (aAssignIter != m_pImpl->m_aAddressDataAssignments.end()) |
1130 | 0 | { |
1131 | 0 | aRet = aAssignIter->aDBColumnAssignments; |
1132 | 0 | } |
1133 | 0 | return aRet; |
1134 | 0 | } |
1135 | | |
1136 | | // returns the name that is assigned as e-mail column of the current data base |
1137 | | OUString SwMailMergeConfigItem::GetAssignedColumn(sal_uInt32 nColumn) const |
1138 | 0 | { |
1139 | 0 | OUString sRet; |
1140 | 0 | Sequence< OUString> aAssignment = GetColumnAssignment( m_pImpl->m_aDBData ); |
1141 | 0 | if(aAssignment.getLength() > sal::static_int_cast< sal_Int32, sal_uInt32>(nColumn) && !aAssignment[nColumn].isEmpty()) |
1142 | 0 | sRet = aAssignment[nColumn]; |
1143 | 0 | else if(nColumn < m_pImpl->m_AddressHeaderSA.size()) |
1144 | 0 | sRet = m_pImpl->m_AddressHeaderSA[nColumn].first; |
1145 | 0 | return sRet; |
1146 | 0 | } |
1147 | | |
1148 | | void SwMailMergeConfigItem::SetColumnAssignment( const SwDBData& rDBData, |
1149 | | const Sequence< OUString>& rList) |
1150 | 0 | { |
1151 | 0 | auto aAssignIter = std::find_if(m_pImpl->m_aAddressDataAssignments.begin(), m_pImpl->m_aAddressDataAssignments.end(), |
1152 | 0 | [&rDBData](const DBAddressDataAssignment& rAssignment) { return rAssignment.aDBData == rDBData; }); |
1153 | 0 | if (aAssignIter != m_pImpl->m_aAddressDataAssignments.end()) |
1154 | 0 | { |
1155 | 0 | if(aAssignIter->aDBColumnAssignments != rList) |
1156 | 0 | { |
1157 | 0 | aAssignIter->aDBColumnAssignments = rList; |
1158 | 0 | aAssignIter->bColumnAssignmentsChanged = true; |
1159 | 0 | } |
1160 | 0 | } |
1161 | 0 | else |
1162 | 0 | { |
1163 | 0 | DBAddressDataAssignment aAssignment; |
1164 | 0 | aAssignment.aDBData = rDBData; |
1165 | 0 | aAssignment.aDBColumnAssignments = rList; |
1166 | 0 | aAssignment.bColumnAssignmentsChanged = true; |
1167 | 0 | m_pImpl->m_aAddressDataAssignments.push_back(std::move(aAssignment)); |
1168 | 0 | } |
1169 | 0 | m_pImpl->SetModified(); |
1170 | 0 | } |
1171 | | |
1172 | | bool SwMailMergeConfigItem::IsAddressFieldsAssigned() const |
1173 | 0 | { |
1174 | 0 | bool bResult = true; |
1175 | 0 | Reference< XResultSet> xResultSet = GetResultSet(); |
1176 | 0 | uno::Reference< XColumnsSupplier > xColsSupp( xResultSet, UNO_QUERY ); |
1177 | 0 | if(!xColsSupp.is()) |
1178 | 0 | return false; |
1179 | 0 | uno::Reference<container::XNameAccess> xCols = xColsSupp->getColumns(); |
1180 | |
|
1181 | 0 | const std::vector<std::pair<OUString, int>>& rHeaders = GetDefaultAddressHeaders(); |
1182 | 0 | Sequence< OUString> aAssignment = |
1183 | 0 | GetColumnAssignment( GetCurrentDBData() ); |
1184 | 0 | const OUString* pAssignment = aAssignment.getConstArray(); |
1185 | 0 | const Sequence< OUString> aBlocks = GetAddressBlocks(); |
1186 | |
|
1187 | 0 | if(aBlocks.getLength() <= m_pImpl->GetCurrentAddressBlockIndex()) |
1188 | 0 | return false; |
1189 | 0 | SwAddressIterator aIter(aBlocks[m_pImpl->GetCurrentAddressBlockIndex()]); |
1190 | 0 | while(aIter.HasMore()) |
1191 | 0 | { |
1192 | 0 | SwMergeAddressItem aItem = aIter.Next(); |
1193 | 0 | if(aItem.bIsColumn) |
1194 | 0 | { |
1195 | 0 | OUString sConvertedColumn = aItem.sText; |
1196 | 0 | auto nSize = std::min(sal_uInt32(rHeaders.size()), sal_uInt32(aAssignment.getLength())); |
1197 | 0 | for(sal_uInt32 nColumn = 0; nColumn < nSize; ++nColumn) |
1198 | 0 | { |
1199 | 0 | if (rHeaders[nColumn].first == aItem.sText && |
1200 | 0 | !pAssignment[nColumn].isEmpty()) |
1201 | 0 | { |
1202 | 0 | sConvertedColumn = pAssignment[nColumn]; |
1203 | 0 | break; |
1204 | 0 | } |
1205 | 0 | } |
1206 | | //find out if the column exists in the data base |
1207 | 0 | if(!xCols->hasByName(sConvertedColumn)) |
1208 | 0 | { |
1209 | 0 | bResult = false; |
1210 | 0 | break; |
1211 | 0 | } |
1212 | 0 | } |
1213 | 0 | } |
1214 | 0 | return bResult; |
1215 | 0 | } |
1216 | | |
1217 | | bool SwMailMergeConfigItem::IsGreetingFieldsAssigned() const |
1218 | 0 | { |
1219 | 0 | bool bResult = true; |
1220 | |
|
1221 | 0 | if(!IsIndividualGreeting(false)) |
1222 | 0 | return true; |
1223 | | |
1224 | 0 | Reference< XResultSet> xResultSet = GetResultSet(); |
1225 | 0 | uno::Reference< XColumnsSupplier > xColsSupp( xResultSet, UNO_QUERY ); |
1226 | 0 | if(!xColsSupp.is()) |
1227 | 0 | return false; |
1228 | 0 | const std::vector<std::pair<OUString, int>>& rHeaders = GetDefaultAddressHeaders(); |
1229 | 0 | uno::Reference<container::XNameAccess> xCols = xColsSupp->getColumns(); |
1230 | |
|
1231 | 0 | Sequence< OUString> aAssignment = |
1232 | 0 | GetColumnAssignment( GetCurrentDBData() ); |
1233 | 0 | const OUString* pAssignment = aAssignment.getConstArray(); |
1234 | |
|
1235 | 0 | const Sequence< OUString> rFemaleEntries = GetGreetings(SwMailMergeConfigItem::FEMALE); |
1236 | 0 | sal_Int32 nCurrentFemale = GetCurrentGreeting(SwMailMergeConfigItem::FEMALE); |
1237 | 0 | const Sequence< OUString> rMaleEntries = GetGreetings(SwMailMergeConfigItem::MALE); |
1238 | 0 | sal_Int32 nCurrentMale = GetCurrentGreeting(SwMailMergeConfigItem::MALE); |
1239 | 0 | OUString sMale, sFemale; |
1240 | 0 | if(rFemaleEntries.getLength() > nCurrentFemale) |
1241 | 0 | sFemale = rFemaleEntries[nCurrentFemale]; |
1242 | 0 | if(rMaleEntries.getLength() > nCurrentMale) |
1243 | 0 | sMale = rMaleEntries[nCurrentMale]; |
1244 | |
|
1245 | 0 | OUString sAddress = sFemale + sMale; |
1246 | 0 | SwAddressIterator aIter(sAddress); |
1247 | 0 | while(aIter.HasMore()) |
1248 | 0 | { |
1249 | 0 | SwMergeAddressItem aItem = aIter.Next(); |
1250 | 0 | if(aItem.bIsColumn) |
1251 | 0 | { |
1252 | 0 | OUString sConvertedColumn = aItem.sText; |
1253 | 0 | auto nSize = std::min(sal_uInt32(rHeaders.size()), sal_uInt32(aAssignment.getLength())); |
1254 | 0 | for(sal_uInt32 nColumn = 0; nColumn < nSize; ++nColumn) |
1255 | 0 | { |
1256 | 0 | if (rHeaders[nColumn].first == aItem.sText && |
1257 | 0 | !pAssignment[nColumn].isEmpty()) |
1258 | 0 | { |
1259 | 0 | sConvertedColumn = pAssignment[nColumn]; |
1260 | 0 | break; |
1261 | 0 | } |
1262 | 0 | } |
1263 | | //find out if the column exists in the data base |
1264 | 0 | if(!xCols->hasByName(sConvertedColumn)) |
1265 | 0 | { |
1266 | 0 | bResult = false; |
1267 | 0 | break; |
1268 | 0 | } |
1269 | 0 | } |
1270 | 0 | } |
1271 | 0 | return bResult; |
1272 | 0 | } |
1273 | | |
1274 | | OUString const & SwMailMergeConfigItem::GetMailDisplayName() const |
1275 | 0 | { |
1276 | 0 | return m_pImpl->m_sMailDisplayName; |
1277 | 0 | } |
1278 | | |
1279 | | void SwMailMergeConfigItem::SetMailDisplayName(const OUString& rName) |
1280 | 0 | { |
1281 | 0 | if(m_pImpl->m_sMailDisplayName != rName) |
1282 | 0 | { |
1283 | 0 | m_pImpl->m_sMailDisplayName = rName; |
1284 | 0 | m_pImpl->SetModified(); |
1285 | 0 | } |
1286 | 0 | } |
1287 | | |
1288 | | OUString const & SwMailMergeConfigItem::GetMailAddress() const |
1289 | 0 | { |
1290 | 0 | return m_pImpl->m_sMailAddress; |
1291 | 0 | } |
1292 | | |
1293 | | void SwMailMergeConfigItem::SetMailAddress(const OUString& rAddress) |
1294 | 0 | { |
1295 | 0 | if(m_pImpl->m_sMailAddress != rAddress ) |
1296 | 0 | { |
1297 | 0 | m_pImpl->m_sMailAddress = rAddress; |
1298 | 0 | m_pImpl->SetModified(); |
1299 | 0 | } |
1300 | 0 | } |
1301 | | |
1302 | | bool SwMailMergeConfigItem::IsMailReplyTo() const |
1303 | 0 | { |
1304 | 0 | return m_pImpl->m_bIsMailReplyTo; |
1305 | 0 | } |
1306 | | |
1307 | | void SwMailMergeConfigItem::SetMailReplyTo(bool bSet) |
1308 | 0 | { |
1309 | 0 | if(m_pImpl->m_bIsMailReplyTo != bSet) |
1310 | 0 | { |
1311 | 0 | m_pImpl->m_bIsMailReplyTo = bSet; |
1312 | 0 | m_pImpl->SetModified(); |
1313 | 0 | } |
1314 | 0 | } |
1315 | | |
1316 | | OUString const & SwMailMergeConfigItem::GetMailReplyTo() const |
1317 | 0 | { |
1318 | 0 | return m_pImpl->m_sMailReplyTo; |
1319 | 0 | } |
1320 | | |
1321 | | void SwMailMergeConfigItem::SetMailReplyTo(const OUString& rReplyTo) |
1322 | 0 | { |
1323 | 0 | if(m_pImpl->m_sMailReplyTo != rReplyTo) |
1324 | 0 | { |
1325 | 0 | m_pImpl->m_sMailReplyTo = rReplyTo; |
1326 | 0 | m_pImpl->SetModified(); |
1327 | 0 | } |
1328 | 0 | } |
1329 | | |
1330 | | OUString const & SwMailMergeConfigItem::GetMailServer() const |
1331 | 0 | { |
1332 | 0 | return m_pImpl->m_sMailServer; |
1333 | 0 | } |
1334 | | |
1335 | | void SwMailMergeConfigItem::SetMailServer(const OUString& rAddress) |
1336 | 0 | { |
1337 | 0 | if(m_pImpl->m_sMailServer != rAddress) |
1338 | 0 | { |
1339 | 0 | m_pImpl->m_sMailServer = rAddress; |
1340 | 0 | m_pImpl->SetModified(); |
1341 | 0 | } |
1342 | 0 | } |
1343 | | |
1344 | | sal_Int16 SwMailMergeConfigItem::GetMailPort() const |
1345 | 0 | { |
1346 | | // provide appropriate TCP port, based on SSL/STARTTLS status, if current port is one of the defaults |
1347 | 0 | switch (m_pImpl->m_nMailPort) |
1348 | 0 | { |
1349 | 0 | case SECURE_PORT: |
1350 | 0 | case DEFAULT_PORT: |
1351 | 0 | return m_pImpl->m_bIsSecureConnection ? SECURE_PORT : DEFAULT_PORT; |
1352 | 0 | default: |
1353 | 0 | return m_pImpl->m_nMailPort; |
1354 | 0 | } |
1355 | 0 | } |
1356 | | |
1357 | | void SwMailMergeConfigItem::SetMailPort(sal_Int16 nSet) |
1358 | 0 | { |
1359 | 0 | if(m_pImpl->m_nMailPort != nSet) |
1360 | 0 | { |
1361 | 0 | m_pImpl->m_nMailPort = nSet; |
1362 | 0 | m_pImpl->SetModified(); |
1363 | 0 | } |
1364 | 0 | } |
1365 | | |
1366 | | bool SwMailMergeConfigItem::IsSecureConnection() const |
1367 | 0 | { |
1368 | 0 | return m_pImpl->m_bIsSecureConnection; |
1369 | 0 | } |
1370 | | |
1371 | | void SwMailMergeConfigItem::SetSecureConnection(bool bSet) |
1372 | 0 | { |
1373 | 0 | if(m_pImpl->m_bIsSecureConnection != bSet) |
1374 | 0 | { |
1375 | 0 | m_pImpl->m_bIsSecureConnection = bSet; |
1376 | 0 | m_pImpl->SetModified(); |
1377 | 0 | } |
1378 | 0 | } |
1379 | | |
1380 | | bool SwMailMergeConfigItem::IsAuthentication() const |
1381 | 0 | { |
1382 | 0 | return m_pImpl->m_bIsAuthentication; |
1383 | 0 | } |
1384 | | |
1385 | | void SwMailMergeConfigItem::SetAuthentication(bool bSet) |
1386 | 0 | { |
1387 | 0 | if(m_pImpl->m_bIsAuthentication != bSet) |
1388 | 0 | { |
1389 | 0 | m_pImpl->m_bIsAuthentication = bSet; |
1390 | 0 | m_pImpl->SetModified(); |
1391 | 0 | } |
1392 | 0 | } |
1393 | | |
1394 | | OUString const & SwMailMergeConfigItem::GetMailUserName() const |
1395 | 0 | { |
1396 | 0 | return m_pImpl->m_sMailUserName; |
1397 | 0 | } |
1398 | | |
1399 | | void SwMailMergeConfigItem::SetMailUserName(const OUString& rName) |
1400 | 0 | { |
1401 | 0 | if(m_pImpl->m_sMailUserName != rName) |
1402 | 0 | { |
1403 | 0 | m_pImpl->m_sMailUserName = rName; |
1404 | 0 | m_pImpl->SetModified(); |
1405 | 0 | } |
1406 | 0 | } |
1407 | | |
1408 | | OUString const & SwMailMergeConfigItem::GetMailPassword() const |
1409 | 0 | { |
1410 | 0 | return m_pImpl->m_sMailPassword; |
1411 | 0 | } |
1412 | | |
1413 | | void SwMailMergeConfigItem::SetMailPassword(const OUString& rPassword) |
1414 | 0 | { |
1415 | 0 | if(m_pImpl->m_sMailPassword != rPassword) |
1416 | 0 | { |
1417 | 0 | m_pImpl->m_sMailPassword = rPassword; |
1418 | 0 | m_pImpl->SetModified(); |
1419 | 0 | } |
1420 | 0 | } |
1421 | | |
1422 | | bool SwMailMergeConfigItem::IsSMTPAfterPOP() const |
1423 | 0 | { |
1424 | 0 | return m_pImpl->m_bIsSMPTAfterPOP; |
1425 | 0 | } |
1426 | | |
1427 | | void SwMailMergeConfigItem::SetSMTPAfterPOP(bool bSet) |
1428 | 0 | { |
1429 | 0 | if( m_pImpl->m_bIsSMPTAfterPOP != bSet) |
1430 | 0 | { |
1431 | 0 | m_pImpl->m_bIsSMPTAfterPOP = bSet; |
1432 | 0 | m_pImpl->SetModified(); |
1433 | 0 | } |
1434 | 0 | } |
1435 | | |
1436 | | OUString const & SwMailMergeConfigItem::GetInServerName() const |
1437 | 0 | { |
1438 | 0 | return m_pImpl->m_sInServerName; |
1439 | 0 | } |
1440 | | |
1441 | | void SwMailMergeConfigItem::SetInServerName(const OUString& rServer) |
1442 | 0 | { |
1443 | 0 | if(m_pImpl->m_sInServerName != rServer) |
1444 | 0 | { |
1445 | 0 | m_pImpl->m_sInServerName = rServer; |
1446 | 0 | m_pImpl->SetModified(); |
1447 | 0 | } |
1448 | 0 | } |
1449 | | |
1450 | | sal_Int16 SwMailMergeConfigItem::GetInServerPort() const |
1451 | 0 | { |
1452 | | // provide appropriate TCP port as user toggles between POP/IMAP if current port is one of the defaults |
1453 | 0 | switch (m_pImpl->m_nInServerPort) |
1454 | 0 | { |
1455 | 0 | case POP_SECURE_PORT: |
1456 | 0 | case POP_PORT: |
1457 | 0 | case IMAP_SECURE_PORT: |
1458 | 0 | case IMAP_PORT: |
1459 | 0 | if ( m_pImpl->m_bInServerPOP ) |
1460 | 0 | return m_pImpl->m_bIsSecureConnection ? POP_SECURE_PORT : POP_PORT; |
1461 | 0 | else |
1462 | 0 | return m_pImpl->m_bIsSecureConnection ? IMAP_SECURE_PORT : IMAP_PORT; |
1463 | 0 | default: |
1464 | 0 | return m_pImpl->m_nInServerPort; |
1465 | 0 | } |
1466 | 0 | } |
1467 | | |
1468 | | void SwMailMergeConfigItem::SetInServerPort(sal_Int16 nSet) |
1469 | 0 | { |
1470 | 0 | if( m_pImpl->m_nInServerPort != nSet) |
1471 | 0 | { |
1472 | 0 | m_pImpl->m_nInServerPort = nSet; |
1473 | 0 | m_pImpl->SetModified(); |
1474 | 0 | } |
1475 | 0 | } |
1476 | | |
1477 | | bool SwMailMergeConfigItem::IsInServerPOP() const |
1478 | 0 | { |
1479 | 0 | return m_pImpl->m_bInServerPOP; |
1480 | 0 | } |
1481 | | |
1482 | | void SwMailMergeConfigItem::SetInServerPOP(bool bSet) |
1483 | 0 | { |
1484 | 0 | if( m_pImpl->m_bInServerPOP != bSet) |
1485 | 0 | { |
1486 | 0 | m_pImpl->m_bInServerPOP = bSet; |
1487 | 0 | m_pImpl->SetModified(); |
1488 | 0 | } |
1489 | 0 | } |
1490 | | |
1491 | | OUString const & SwMailMergeConfigItem::GetInServerUserName() const |
1492 | 0 | { |
1493 | 0 | return m_pImpl->m_sInServerUserName; |
1494 | 0 | } |
1495 | | |
1496 | | void SwMailMergeConfigItem::SetInServerUserName(const OUString& rName) |
1497 | 0 | { |
1498 | 0 | if( m_pImpl->m_sInServerUserName != rName) |
1499 | 0 | { |
1500 | 0 | m_pImpl->m_sInServerUserName = rName; |
1501 | 0 | m_pImpl->SetModified(); |
1502 | 0 | } |
1503 | 0 | } |
1504 | | |
1505 | | OUString const & SwMailMergeConfigItem::GetInServerPassword() const |
1506 | 0 | { |
1507 | 0 | return m_pImpl->m_sInServerPassword; |
1508 | 0 | } |
1509 | | |
1510 | | void SwMailMergeConfigItem::SetInServerPassword(const OUString& rPassword) |
1511 | 0 | { |
1512 | 0 | if(m_pImpl->m_sInServerPassword != rPassword) |
1513 | 0 | { |
1514 | 0 | m_pImpl->m_sInServerPassword = rPassword; |
1515 | 0 | m_pImpl->SetModified(); |
1516 | 0 | } |
1517 | 0 | } |
1518 | | |
1519 | | void SwMailMergeConfigItem::DocumentReloaded() |
1520 | 0 | { |
1521 | 0 | m_bGreetingInserted = false; |
1522 | 0 | m_bAddressInserted = false; |
1523 | 0 | } |
1524 | | |
1525 | | bool SwMailMergeConfigItem::IsMailAvailable() const |
1526 | 0 | { |
1527 | 0 | return m_pImpl->m_bIsEMailSupported; |
1528 | 0 | } |
1529 | | |
1530 | | void SwMailMergeConfigItem::AddMergedDocument(SwDocMergeInfo const & rInfo) |
1531 | 0 | { |
1532 | 0 | m_pImpl->m_aMergeInfos.push_back(rInfo); |
1533 | 0 | } |
1534 | | |
1535 | | SwDocMergeInfo& SwMailMergeConfigItem::GetDocumentMergeInfo(sal_uInt32 nDocument) |
1536 | 0 | { |
1537 | 0 | assert(nDocument < m_pImpl->m_aMergeInfos.size()); |
1538 | 0 | return m_pImpl->m_aMergeInfos[nDocument]; |
1539 | 0 | } |
1540 | | |
1541 | | |
1542 | | sal_uInt32 SwMailMergeConfigItem::GetMergedDocumentCount() |
1543 | 0 | { |
1544 | 0 | if(m_pTargetView) |
1545 | 0 | return m_pImpl->m_aMergeInfos.size(); |
1546 | 0 | else |
1547 | 0 | { |
1548 | 0 | sal_Int32 nRestore = GetResultSetPosition(); |
1549 | 0 | MoveResultSet(-1); |
1550 | 0 | sal_Int32 nRet = GetResultSetPosition(); |
1551 | 0 | MoveResultSet( nRestore ); |
1552 | 0 | nRet -= m_aExcludedRecords.size(); |
1553 | 0 | return nRet >= 0 ? nRet : 0; |
1554 | 0 | } |
1555 | 0 | } |
1556 | | |
1557 | | static SwView* lcl_ExistsView(SwView* pView) |
1558 | 0 | { |
1559 | 0 | SfxViewShell* pViewShell = SfxViewShell::GetFirst( false, checkSfxViewShell<SwView> ); |
1560 | 0 | while(pViewShell) |
1561 | 0 | { |
1562 | 0 | if(pViewShell == pView) |
1563 | 0 | return pView; |
1564 | | |
1565 | 0 | pViewShell = SfxViewShell::GetNext( *pViewShell, false, checkSfxViewShell<SwView> ); |
1566 | 0 | } |
1567 | 0 | return nullptr; |
1568 | 0 | } |
1569 | | |
1570 | | SwView* SwMailMergeConfigItem::GetTargetView() |
1571 | 0 | { |
1572 | | //make sure that the pointer is really valid - the document may have been closed manually |
1573 | 0 | if(m_pTargetView) |
1574 | 0 | { |
1575 | 0 | m_pTargetView = lcl_ExistsView(m_pTargetView); |
1576 | 0 | } |
1577 | 0 | return m_pTargetView; |
1578 | 0 | } |
1579 | | |
1580 | | void SwMailMergeConfigItem::SetTargetView(SwView* pView) |
1581 | 0 | { |
1582 | 0 | m_pTargetView = pView; |
1583 | | //reset the document merge counter |
1584 | 0 | if(!m_pTargetView) |
1585 | 0 | { |
1586 | 0 | m_pImpl->m_aMergeInfos.clear(); |
1587 | 0 | } |
1588 | 0 | } |
1589 | | |
1590 | | SwView* SwMailMergeConfigItem::GetSourceView() |
1591 | 0 | { |
1592 | 0 | m_pSourceView = lcl_ExistsView(m_pSourceView); |
1593 | 0 | return m_pSourceView; |
1594 | 0 | } |
1595 | | |
1596 | | namespace { |
1597 | | |
1598 | | //This implements XSelectionChangeListener and XDispatch because the |
1599 | | //broadcaster uses this combo to determine if to send the database-changed |
1600 | | //update. Its probably that listening to statusChanged at some other level is |
1601 | | //equivalent to this. See the other call to SwXDispatch::GetDBChangeURL for |
1602 | | //the broadcaster of the event. |
1603 | | class DBChangeListener : public cppu::WeakImplHelper<css::view::XSelectionChangeListener, css::frame::XDispatch> |
1604 | | { |
1605 | | SwMailMergeConfigItem& m_rParent; |
1606 | | public: |
1607 | | explicit DBChangeListener(SwMailMergeConfigItem& rParent) |
1608 | 0 | : m_rParent(rParent) |
1609 | 0 | { |
1610 | 0 | } |
1611 | | |
1612 | | virtual void SAL_CALL selectionChanged(const EventObject& /*rEvent*/) override |
1613 | 0 | { |
1614 | 0 | } |
1615 | | |
1616 | | virtual void SAL_CALL disposing(const EventObject&) override |
1617 | 0 | { |
1618 | 0 | m_rParent.stopDBChangeListening(); |
1619 | 0 | } |
1620 | | |
1621 | | virtual void SAL_CALL dispatch(const css::util::URL& rURL, const css::uno::Sequence< css::beans::PropertyValue >& /*rArgs*/) override |
1622 | 0 | { |
1623 | 0 | if (rURL.Complete.equalsAscii(SwXDispatch::GetDBChangeURL())) |
1624 | 0 | m_rParent.updateCurrentDBDataFromDocument(); |
1625 | 0 | } |
1626 | | |
1627 | | virtual void SAL_CALL addStatusListener(const css::uno::Reference< css::frame::XStatusListener >&, const css::util::URL&) override |
1628 | 0 | { |
1629 | 0 | } |
1630 | | |
1631 | | virtual void SAL_CALL removeStatusListener(const css::uno::Reference< css::frame::XStatusListener >&, const css::util::URL&) override |
1632 | 0 | { |
1633 | 0 | } |
1634 | | }; |
1635 | | |
1636 | | } |
1637 | | |
1638 | | void SwMailMergeConfigItem::SetSourceView(SwView* pView) |
1639 | 0 | { |
1640 | 0 | if (m_xDBChangedListener.is()) |
1641 | 0 | { |
1642 | 0 | uno::Reference<view::XSelectionSupplier> xSupplier = m_pSourceView->GetUNOObject(); |
1643 | 0 | xSupplier->removeSelectionChangeListener(m_xDBChangedListener); |
1644 | 0 | m_xDBChangedListener.clear(); |
1645 | 0 | } |
1646 | |
|
1647 | 0 | m_pSourceView = pView; |
1648 | |
|
1649 | 0 | if (!m_pSourceView) |
1650 | 0 | return; |
1651 | | |
1652 | 0 | std::vector<OUString> aDBNameList; |
1653 | 0 | std::vector<OUString> aAllDBNames; |
1654 | 0 | m_pSourceView->GetWrtShell().GetAllUsedDB( aDBNameList, &aAllDBNames ); |
1655 | 0 | if(!aDBNameList.empty()) |
1656 | 0 | { |
1657 | | // if fields are available there is usually no need of an addressblock and greeting |
1658 | 0 | if(!m_pImpl->m_bUserSettingWereOverwritten) |
1659 | 0 | { |
1660 | 0 | if( m_pImpl->m_bIsAddressBlock |
1661 | 0 | || m_pImpl->m_bIsGreetingLineInMail |
1662 | 0 | || m_pImpl->m_bIsGreetingLine ) |
1663 | 0 | { |
1664 | | //store user settings |
1665 | 0 | m_pImpl->m_bUserSettingWereOverwritten = true; |
1666 | 0 | m_pImpl->m_bIsAddressBlock_LastUserSetting = m_pImpl->m_bIsAddressBlock; |
1667 | 0 | m_pImpl->m_bIsGreetingLineInMail_LastUserSetting = m_pImpl->m_bIsGreetingLineInMail; |
1668 | 0 | m_pImpl->m_bIsGreetingLine_LastUserSetting = m_pImpl->m_bIsGreetingLine; |
1669 | | |
1670 | | //set all to false |
1671 | 0 | m_pImpl->m_bIsAddressBlock = false; |
1672 | 0 | m_pImpl->m_bIsGreetingLineInMail = false; |
1673 | 0 | m_pImpl->m_bIsGreetingLine = false; |
1674 | |
|
1675 | 0 | m_pImpl->SetModified(); |
1676 | 0 | } |
1677 | 0 | } |
1678 | 0 | } |
1679 | 0 | else if( m_pImpl->m_bUserSettingWereOverwritten ) |
1680 | 0 | { |
1681 | | //restore last user settings: |
1682 | 0 | m_pImpl->m_bIsAddressBlock = m_pImpl->m_bIsAddressBlock_LastUserSetting; |
1683 | 0 | m_pImpl->m_bIsGreetingLineInMail = m_pImpl->m_bIsGreetingLineInMail_LastUserSetting; |
1684 | 0 | m_pImpl->m_bIsGreetingLine = m_pImpl->m_bIsGreetingLine_LastUserSetting; |
1685 | |
|
1686 | 0 | m_pImpl->m_bUserSettingWereOverwritten = false; |
1687 | 0 | } |
1688 | |
|
1689 | 0 | if (!m_xDBChangedListener.is()) |
1690 | 0 | { |
1691 | 0 | m_xDBChangedListener.set(new DBChangeListener(*this)); |
1692 | 0 | } |
1693 | |
|
1694 | 0 | uno::Reference<view::XSelectionSupplier> xSupplier = m_pSourceView->GetUNOObject(); |
1695 | 0 | xSupplier->addSelectionChangeListener(m_xDBChangedListener); |
1696 | 0 | } |
1697 | | |
1698 | | void SwMailMergeConfigItem::SetCurrentAddressBlockIndex( sal_Int32 nSet ) |
1699 | 0 | { |
1700 | 0 | m_pImpl->SetCurrentAddressBlockIndex( nSet ); |
1701 | 0 | } |
1702 | | |
1703 | | sal_Int32 SwMailMergeConfigItem::GetCurrentAddressBlockIndex() const |
1704 | 0 | { |
1705 | 0 | return m_pImpl->GetCurrentAddressBlockIndex(); |
1706 | 0 | } |
1707 | | |
1708 | | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |