Coverage Report

Created: 2026-11-06 11:29

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