Coverage Report

Created: 2026-08-14 10:22

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libreoffice/sw/source/uibase/envelp/envimg.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
#include <sal/config.h>
21
22
#include <o3tl/any.hxx>
23
#include <o3tl/string_view.hxx>
24
#include <osl/diagnose.h>
25
#include <editeng/paperinf.hxx>
26
#include <com/sun/star/uno/Sequence.hxx>
27
#include <rtl/ustrbuf.hxx>
28
#include <tools/UnitConversion.hxx>
29
#include <unotools/useroptions.hxx>
30
#include <swmodule.hxx>
31
#include <swtypes.hxx>
32
#include <envimg.hxx>
33
#include <strings.hrc>
34
35
#include <cmdid.h>
36
37
#include <unomid.h>
38
39
using namespace utl;
40
using namespace ::com::sun::star::uno;
41
42
43
0
SfxPoolItem* SwEnvItem::CreateDefault() { return new SwEnvItem; }
44
45
OUString MakeSender()
46
0
{
47
0
    SvtUserOptions& rUserOpt = SwModule::get()->GetUserOptions();
48
49
0
    const OUString sSenderToken(SwResId(STR_SENDER_TOKENS));
50
0
    if (sSenderToken.isEmpty())
51
0
        return OUString();
52
53
0
    OUStringBuffer sRet;
54
0
    sal_Int32 nSttPos = 0;
55
0
    bool bLastLength = true;
56
0
    do {
57
0
        std::u16string_view sToken = o3tl::getToken(sSenderToken, 0, ';', nSttPos );
58
0
        if (sToken == u"COMPANY")
59
0
        {
60
0
            sal_Int32 nOldLen = sRet.getLength();
61
0
            sRet.append(rUserOpt.GetCompany());
62
0
            bLastLength = sRet.getLength() != nOldLen;
63
0
        }
64
0
        else if (sToken == u"CR")
65
0
        {
66
0
            if(bLastLength)
67
0
                sRet.append(SAL_NEWLINE_STRING);
68
0
            bLastLength = true;
69
0
        }
70
0
        else if (sToken == u"FIRSTNAME")
71
0
            sRet.append(rUserOpt.GetFirstName());
72
0
        else if (sToken == u"LASTNAME")
73
0
            sRet.append(rUserOpt.GetLastName());
74
0
        else if (sToken == u"ADDRESS")
75
0
            sRet.append(rUserOpt.GetStreet());
76
0
        else if (sToken == u"COUNTRY")
77
0
            sRet.append(rUserOpt.GetCountry());
78
0
        else if (sToken == u"POSTALCODE")
79
0
            sRet.append(rUserOpt.GetZip());
80
0
        else if (sToken == u"CITY")
81
0
            sRet.append(rUserOpt.GetCity());
82
0
        else if (sToken == u"STATEPROV")
83
0
            sRet.append(rUserOpt.GetState());
84
0
        else if (!sToken.empty()) //spaces
85
0
            sRet.append(sToken);
86
0
    } while (nSttPos>=0);
87
0
    return sRet.makeStringAndClear();
88
0
}
89
90
SwEnvItem::SwEnvItem() :
91
0
    SfxPoolItem(FN_ENVELOP)
92
0
{
93
0
    m_bSend           = true;
94
0
    m_aSendText       = MakeSender();
95
0
    m_nSendFromLeft   = 566; // 1 cm
96
0
    m_nSendFromTop    = 566; // 1 cm
97
0
    Size aEnvSz     = SvxPaperInfo::GetPaperSize(PAPER_ENV_C65);
98
0
    m_nWidth          = aEnvSz.Width();
99
0
    m_nHeight         = aEnvSz.Height();
100
0
    m_eAlign          = ENV_HOR_LEFT;
101
0
    m_bPrintFromAbove = true;
102
0
    m_nShiftRight     = 0;
103
0
    m_nShiftDown      = 0;
104
105
0
    m_nAddrFromLeft   = std::max(m_nWidth, m_nHeight) / 2;
106
0
    m_nAddrFromTop    = std::min(m_nWidth, m_nHeight) / 2;
107
0
}
108
109
SwEnvItem& SwEnvItem::operator =(const SwEnvItem& rItem)
110
0
{
111
0
    m_aAddrText       = rItem.m_aAddrText;
112
0
    m_bSend           = rItem.m_bSend;
113
0
    m_aSendText       = rItem.m_aSendText;
114
0
    m_nSendFromLeft   = rItem.m_nSendFromLeft;
115
0
    m_nSendFromTop    = rItem.m_nSendFromTop;
116
0
    m_nAddrFromLeft   = rItem.m_nAddrFromLeft;
117
0
    m_nAddrFromTop    = rItem.m_nAddrFromTop;
118
0
    m_nWidth          = rItem.m_nWidth;
119
0
    m_nHeight         = rItem.m_nHeight;
120
0
    m_eAlign          = rItem.m_eAlign;
121
0
    m_bPrintFromAbove = rItem.m_bPrintFromAbove;
122
0
    m_nShiftRight     = rItem.m_nShiftRight;
123
0
    m_nShiftDown      = rItem.m_nShiftDown;
124
0
    return *this;
125
0
}
126
127
bool SwEnvItem::operator ==(const SfxPoolItem& rItem) const
128
0
{
129
0
    assert(SfxPoolItem::operator==(rItem));
130
0
    const SwEnvItem& rEnv = static_cast<const SwEnvItem&>( rItem);
131
132
0
    return m_aAddrText       == rEnv.m_aAddrText       &&
133
0
           m_bSend           == rEnv.m_bSend           &&
134
0
           m_aSendText       == rEnv.m_aSendText       &&
135
0
           m_nSendFromLeft   == rEnv.m_nSendFromLeft   &&
136
0
           m_nSendFromTop    == rEnv.m_nSendFromTop    &&
137
0
           m_nAddrFromLeft   == rEnv.m_nAddrFromLeft   &&
138
0
           m_nAddrFromTop    == rEnv.m_nAddrFromTop    &&
139
0
           m_nWidth          == rEnv.m_nWidth          &&
140
0
           m_nHeight         == rEnv.m_nHeight         &&
141
0
           m_eAlign          == rEnv.m_eAlign          &&
142
0
           m_bPrintFromAbove == rEnv.m_bPrintFromAbove &&
143
0
           m_nShiftRight     == rEnv.m_nShiftRight     &&
144
0
           m_nShiftDown      == rEnv.m_nShiftDown;
145
0
}
146
147
SwEnvItem* SwEnvItem::Clone(SfxItemPool*) const
148
0
{
149
0
    return new SwEnvItem(*this);
150
0
}
151
152
SwEnvCfgItem::SwEnvCfgItem() :
153
0
    ConfigItem(u"Office.Writer/Envelope"_ustr)
154
0
{
155
0
    Sequence<OUString> aNames = GetPropertyNames();
156
0
    Sequence<Any> aValues = GetProperties(aNames);
157
0
    EnableNotification(aNames);
158
0
    const Any* pValues = aValues.getConstArray();
159
0
    OSL_ENSURE(aValues.getLength() == aNames.getLength(), "GetProperties failed");
160
0
    if(aValues.getLength() != aNames.getLength())
161
0
        return;
162
163
0
    for(int nProp = 0; nProp < aNames.getLength(); nProp++)
164
0
    {
165
0
        if(pValues[nProp].hasValue())
166
0
        {
167
0
            switch(nProp)
168
0
            {
169
0
                case  0: pValues[nProp] >>= m_aEnvItem.m_aAddrText; break;// "Inscription/Addressee",
170
0
                case  1: pValues[nProp] >>= m_aEnvItem.m_aSendText; break;// "Inscription/Sender",
171
0
                case  2: m_aEnvItem.m_bSend = *o3tl::doAccess<bool>(pValues[nProp]); break;// "Inscription/UseSender",
172
0
                case  3:
173
0
                    pValues[nProp] >>= m_aEnvItem.m_nAddrFromLeft;// "Format/AddresseeFromLeft",
174
0
                    m_aEnvItem.m_nAddrFromLeft = o3tl::toTwips(m_aEnvItem.m_nAddrFromLeft, o3tl::Length::mm100);
175
0
                break;
176
0
                case  4:
177
0
                    pValues[nProp] >>= m_aEnvItem.m_nAddrFromTop;  // "Format/AddresseeFromTop",
178
0
                    m_aEnvItem.m_nAddrFromTop = o3tl::toTwips(m_aEnvItem.m_nAddrFromTop, o3tl::Length::mm100);
179
0
                break;
180
0
                case  5:
181
0
                    pValues[nProp] >>= m_aEnvItem.m_nSendFromLeft; // "Format/SenderFromLeft",
182
0
                    m_aEnvItem.m_nSendFromLeft = o3tl::toTwips(m_aEnvItem.m_nSendFromLeft, o3tl::Length::mm100);
183
0
                break;
184
0
                case  6:
185
0
                    pValues[nProp] >>= m_aEnvItem.m_nSendFromTop;// "Format/SenderFromTop",
186
0
                    m_aEnvItem.m_nSendFromTop = o3tl::toTwips(m_aEnvItem.m_nSendFromTop, o3tl::Length::mm100);
187
0
                break;
188
0
                case  7:
189
0
                    pValues[nProp] >>= m_aEnvItem.m_nWidth; // "Format/Width",
190
0
                    m_aEnvItem.m_nWidth = o3tl::toTwips(m_aEnvItem.m_nWidth, o3tl::Length::mm100);
191
0
                break;
192
0
                case  8:
193
0
                    pValues[nProp] >>= m_aEnvItem.m_nHeight; // "Format/Height",
194
0
                    m_aEnvItem.m_nHeight = o3tl::toTwips(m_aEnvItem.m_nHeight, o3tl::Length::mm100);
195
0
                break;
196
0
                case  9:
197
0
                {
198
0
                    sal_Int32 nTemp = 0;
199
0
                    pValues[nProp] >>= nTemp; m_aEnvItem.m_eAlign = static_cast<SwEnvAlign>(nTemp); break;// "Print/Alignment",
200
0
                }
201
0
                case 10: m_aEnvItem.m_bPrintFromAbove = *o3tl::doAccess<bool>(pValues[nProp]); break;// "Print/FromAbove",
202
0
                case 11:
203
0
                    pValues[nProp] >>= m_aEnvItem.m_nShiftRight;
204
0
                    m_aEnvItem.m_nShiftRight = o3tl::toTwips(m_aEnvItem.m_nShiftRight, o3tl::Length::mm100);// "Print/Right",
205
0
                break;
206
0
                case 12:
207
0
                    pValues[nProp] >>= m_aEnvItem.m_nShiftDown;
208
0
                    m_aEnvItem.m_nShiftDown = o3tl::toTwips(m_aEnvItem.m_nShiftDown, o3tl::Length::mm100);
209
0
                break;// "Print/Down"
210
0
            }
211
0
        }
212
0
    }
213
0
}
214
215
SwEnvCfgItem::~SwEnvCfgItem()
216
0
{
217
0
}
218
219
void SwEnvCfgItem::ImplCommit()
220
0
{
221
0
    Sequence<OUString> aNames = GetPropertyNames();
222
0
    Sequence<Any> aValues(aNames.getLength());
223
0
    Any* pValues = aValues.getArray();
224
225
0
    for(int nProp = 0; nProp < aNames.getLength(); nProp++)
226
0
    {
227
0
        switch(nProp)
228
0
        {
229
0
            case  0: pValues[nProp] <<= m_aEnvItem.m_aAddrText; break;// "Inscription/Addressee",
230
0
            case  1: pValues[nProp] <<= m_aEnvItem.m_aSendText; break;// "Inscription/Sender",
231
0
            case  2: pValues[nProp] <<= m_aEnvItem.m_bSend; break;// "Inscription/UseSender",
232
0
            case  3: pValues[nProp] <<= static_cast <sal_Int32>(convertTwipToMm100(m_aEnvItem.m_nAddrFromLeft)) ; break;// "Format/AddresseeFromLeft",
233
0
            case  4: pValues[nProp] <<= static_cast <sal_Int32>(convertTwipToMm100(m_aEnvItem.m_nAddrFromTop))  ; break;// "Format/AddresseeFromTop",
234
0
            case  5: pValues[nProp] <<= static_cast <sal_Int32>(convertTwipToMm100(m_aEnvItem.m_nSendFromLeft)) ; break;// "Format/SenderFromLeft",
235
0
            case  6: pValues[nProp] <<= static_cast <sal_Int32>(convertTwipToMm100(m_aEnvItem.m_nSendFromTop))  ; break;// "Format/SenderFromTop",
236
0
            case  7: pValues[nProp] <<= static_cast <sal_Int32>(convertTwipToMm100(m_aEnvItem.m_nWidth))  ; break;// "Format/Width",
237
0
            case  8: pValues[nProp] <<= static_cast <sal_Int32>(convertTwipToMm100(m_aEnvItem.m_nHeight)) ; break;// "Format/Height",
238
0
            case  9: pValues[nProp] <<= sal_Int32(m_aEnvItem.m_eAlign); break;// "Print/Alignment",
239
0
            case 10: pValues[nProp] <<= m_aEnvItem.m_bPrintFromAbove; break;// "Print/FromAbove",
240
0
            case 11: pValues[nProp] <<= static_cast <sal_Int32>(convertTwipToMm100(m_aEnvItem.m_nShiftRight));break; // "Print/Right",
241
0
            case 12: pValues[nProp] <<= static_cast <sal_Int32>(convertTwipToMm100(m_aEnvItem.m_nShiftDown)); break;// "Print/Down"
242
0
        }
243
0
    }
244
0
    PutProperties(aNames, aValues);
245
0
}
246
247
0
void SwEnvCfgItem::Notify( const css::uno::Sequence< OUString >& ) {}
248
249
Sequence<OUString> SwEnvCfgItem::GetPropertyNames()
250
0
{
251
0
    static const char* const aPropNames[] =
252
0
    {
253
0
        "Inscription/Addressee",    //  0
254
0
        "Inscription/Sender",       //  1
255
0
        "Inscription/UseSender",    //  2
256
0
        "Format/AddresseeFromLeft", //  3
257
0
        "Format/AddresseeFromTop",  //  4
258
0
        "Format/SenderFromLeft",    //  5
259
0
        "Format/SenderFromTop",     //  6
260
0
        "Format/Width",             //  7
261
0
        "Format/Height",            //  8
262
0
        "Print/Alignment",          //  9
263
0
        "Print/FromAbove",          // 10
264
0
        "Print/Right",              // 11
265
0
        "Print/Down"                // 12
266
0
    };
267
0
    const int nCount = 13;
268
0
    Sequence<OUString> aNames(nCount);
269
0
    OUString* pNames = aNames.getArray();
270
271
0
    for(int i = 0; i < nCount; i++)
272
0
        pNames[i] = OUString::createFromAscii(aPropNames[i]);
273
274
0
    return aNames;
275
0
}
276
277
bool SwEnvItem::QueryValue( Any& rVal, sal_uInt8 nMemberId ) const
278
0
{
279
0
    bool bRet = true;
280
0
    switch(nMemberId & ~CONVERT_TWIPS)
281
0
    {
282
0
        case MID_ENV_ADDR_TEXT : rVal <<= m_aAddrText; break;
283
0
        case MID_ENV_SEND : rVal <<= m_bSend; break;
284
0
        case MID_SEND_TEXT : rVal <<= m_aSendText; break;
285
0
        case MID_ENV_ADDR_FROM_LEFT : rVal <<= m_nAddrFromLeft; break;
286
0
        case MID_ENV_ADDR_FROM_TOP : rVal <<= m_nAddrFromTop; break;
287
0
        case MID_ENV_SEND_FROM_LEFT : rVal <<= m_nSendFromLeft; break;
288
0
        case MID_ENV_SEND_FROM_TOP : rVal <<= m_nSendFromTop; break;
289
0
        case MID_ENV_WIDTH : rVal <<= m_nWidth; break;
290
0
        case MID_ENV_HEIGHT : rVal <<= m_nHeight; break;
291
0
        case MID_ENV_ALIGN            : rVal <<= static_cast<sal_Int16>(m_eAlign); break;
292
0
        case MID_ENV_PRINT_FROM_ABOVE  : rVal <<= m_bPrintFromAbove; break;
293
0
        case MID_ENV_SHIFT_RIGHT      : rVal <<= m_nShiftRight; break;
294
0
        case MID_ENV_SHIFT_DOWN       : rVal <<= m_nShiftDown; break;
295
0
        default:
296
0
            OSL_FAIL("Wrong memberId");
297
0
            bRet = false;
298
0
    }
299
0
    return bRet;
300
0
}
301
302
bool SwEnvItem::PutValue(const Any& rVal, sal_uInt8 nMemberId)
303
0
{
304
0
    bool bRet = false;
305
0
    switch(nMemberId  & ~CONVERT_TWIPS)
306
0
    {
307
0
        case MID_ENV_ADDR_TEXT : bRet = (rVal >>= m_aAddrText); break;
308
0
        case MID_ENV_SEND : bRet = (rVal >>= m_bSend); break;
309
0
        case MID_SEND_TEXT : bRet = (rVal >>= m_aSendText); break;
310
0
        case MID_ENV_ADDR_FROM_LEFT : bRet = (rVal >>= m_nAddrFromLeft); break;
311
0
        case MID_ENV_ADDR_FROM_TOP : bRet = (rVal >>= m_nAddrFromTop); break;
312
0
        case MID_ENV_SEND_FROM_LEFT : bRet = (rVal >>= m_nSendFromLeft); break;
313
0
        case MID_ENV_SEND_FROM_TOP : bRet = (rVal >>= m_nSendFromTop); break;
314
0
        case MID_ENV_WIDTH : bRet = (rVal >>= m_nWidth); break;
315
0
        case MID_ENV_HEIGHT : bRet = (rVal >>= m_nHeight); break;
316
0
        case MID_ENV_ALIGN :
317
0
        {
318
0
            sal_Int16 nTemp = 0;
319
0
            bRet = (rVal >>= nTemp);
320
0
            if (bRet)
321
0
                m_eAlign = SwEnvAlign(nTemp);
322
0
            break;
323
0
        }
324
0
        case MID_ENV_PRINT_FROM_ABOVE  : bRet = (rVal >>= m_bPrintFromAbove); break;
325
0
        case MID_ENV_SHIFT_RIGHT      : bRet = (rVal >>= m_nShiftRight); break;
326
0
        case MID_ENV_SHIFT_DOWN       : bRet = (rVal >>= m_nShiftDown); break;
327
0
        default:
328
0
            OSL_FAIL("Wrong memberId");
329
0
    }
330
0
    return bRet;
331
0
}
332
333
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */