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