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