Coverage Report

Created: 2025-07-07 10:01

/src/libreoffice/editeng/source/items/paraitem.cxx
Line
Count
Source (jump to first uncovered line)
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 <com/sun/star/style/TabStop.hpp>
21
#include <com/sun/star/style/LineSpacing.hpp>
22
#include <com/sun/star/style/LineSpacingMode.hpp>
23
#include <com/sun/star/text/ParagraphHyphenationKeepType.hpp>
24
#include <com/sun/star/uno/Sequence.hxx>
25
#include <libxml/xmlwriter.h>
26
#include <comphelper/extract.hxx>
27
#include <osl/diagnose.h>
28
#include <unotools/localedatawrapper.hxx>
29
#include <unotools/syslocale.hxx>
30
#include <tools/mapunit.hxx>
31
#include <tools/UnitConversion.hxx>
32
#include <svl/itempool.hxx>
33
#include <svl/memberid.h>
34
#include <editeng/editrids.hrc>
35
#include <editeng/lspcitem.hxx>
36
#include <editeng/adjustitem.hxx>
37
#include <editeng/orphitem.hxx>
38
#include <editeng/widwitem.hxx>
39
#include <editeng/tstpitem.hxx>
40
#include <editeng/pmdlitem.hxx>
41
#include <editeng/spltitem.hxx>
42
#include <editeng/hyphenzoneitem.hxx>
43
#include <editeng/scriptspaceitem.hxx>
44
#include <editeng/hngpnctitem.hxx>
45
#include <editeng/forbiddenruleitem.hxx>
46
#include <editeng/paravertalignitem.hxx>
47
#include <editeng/pgrditem.hxx>
48
#include <rtl/ustring.hxx>
49
#include <sal/log.hxx>
50
#include <editeng/memberids.h>
51
#include <editeng/itemtype.hxx>
52
#include <editeng/eerdll.hxx>
53
#include <o3tl/hash_combine.hxx>
54
55
using namespace ::com::sun::star;
56
57
58
0
SfxPoolItem* SvxLineSpacingItem::CreateDefault() { return new  SvxLineSpacingItem(LINE_SPACE_DEFAULT_HEIGHT, 0);}
59
0
SfxPoolItem* SvxAdjustItem::CreateDefault() { return new  SvxAdjustItem(SvxAdjust::Left, 0);}
60
0
SfxPoolItem* SvxWidowsItem::CreateDefault() { return new  SvxWidowsItem(0, 0);}
61
0
SfxPoolItem* SvxOrphansItem::CreateDefault() { return new  SvxOrphansItem(0, 0);}
62
0
SfxPoolItem* SvxHyphenZoneItem::CreateDefault() { return new  SvxHyphenZoneItem(false, 0);}
63
0
SfxPoolItem* SvxTabStopItem::CreateDefault() { return new  SvxTabStopItem(0);}
64
0
SfxPoolItem* SvxFormatSplitItem::CreateDefault() { return new  SvxFormatSplitItem(false, 0);}
65
0
SfxPoolItem* SvxPageModelItem::CreateDefault() { return new  SvxPageModelItem(TypedWhichId<SvxPageModelItem>(0));}
66
0
SfxPoolItem* SvxParaVertAlignItem::CreateDefault() { return new  SvxParaVertAlignItem(Align::Automatic, TypedWhichId<SvxParaVertAlignItem>(0));}
67
68
namespace {
69
70
enum class SvxSpecialLineSpace
71
{
72
    User,
73
    OneLine,
74
    OnePointFiveLines,
75
    TwoLines,
76
    End
77
};
78
79
}
80
81
SvxLineSpacingItem::SvxLineSpacingItem( sal_uInt16 nHeight, const sal_uInt16 nId )
82
344k
    : SfxPoolItem(nId)
83
344k
{
84
344k
    nPropLineSpace = 100;
85
344k
    nInterLineSpace = 0;
86
344k
    nLineHeight = nHeight;
87
344k
    eLineSpaceRule = SvxLineSpaceRule::Auto;
88
344k
    eInterLineSpaceRule = SvxInterLineSpaceRule::Off;
89
344k
}
90
91
92
bool SvxLineSpacingItem::operator==( const SfxPoolItem& rAttr ) const
93
1.85M
{
94
1.85M
    assert(SfxPoolItem::operator==(rAttr));
95
96
1.85M
    const SvxLineSpacingItem& rLineSpace = static_cast<const SvxLineSpacingItem&>(rAttr);
97
1.85M
    return
98
        // Same Linespacing Rule?
99
1.85M
        (eLineSpaceRule == rLineSpace.eLineSpaceRule)
100
        // For maximum and minimum Linespacing be the size must coincide.
101
1.85M
        && (eLineSpaceRule == SvxLineSpaceRule::Auto ||
102
1.84M
            nLineHeight == rLineSpace.nLineHeight)
103
        // Same Linespacing Rule?
104
1.85M
        && ( eInterLineSpaceRule == rLineSpace.eInterLineSpaceRule )
105
        // Either set proportional or additive.
106
1.85M
        && (( eInterLineSpaceRule == SvxInterLineSpaceRule::Off)
107
1.59M
            || (eInterLineSpaceRule == SvxInterLineSpaceRule::Prop
108
324k
                && nPropLineSpace == rLineSpace.nPropLineSpace)
109
1.59M
            || (eInterLineSpaceRule == SvxInterLineSpaceRule::Fix
110
11.1k
                && (nInterLineSpace == rLineSpace.nInterLineSpace)));
111
1.85M
}
112
113
size_t SvxLineSpacingItem::hashCode() const
114
293k
{
115
293k
    std::size_t seed(0);
116
293k
    o3tl::hash_combine(seed, eLineSpaceRule);
117
293k
    o3tl::hash_combine(seed, nLineHeight);
118
293k
    o3tl::hash_combine(seed, eInterLineSpaceRule);
119
293k
    o3tl::hash_combine(seed, nPropLineSpace);
120
293k
    o3tl::hash_combine(seed, nInterLineSpace);
121
293k
    return seed;
122
293k
}
123
124
/* Who does still know why the LineSpacingItem is so complicated?
125
   We can not use it for UNO since there are only two values:
126
      - a sal_uInt16 for the mode
127
      - a sal_uInt32 for all values (distance, height, rel. detail)
128
*/
129
bool SvxLineSpacingItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
130
315k
{
131
315k
    bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
132
315k
    nMemberId &= ~CONVERT_TWIPS;
133
134
315k
    style::LineSpacing aLSp;
135
315k
    switch( eLineSpaceRule )
136
315k
    {
137
314k
        case SvxLineSpaceRule::Auto:
138
314k
            if(eInterLineSpaceRule == SvxInterLineSpaceRule::Fix)
139
0
            {
140
0
                aLSp.Mode = style::LineSpacingMode::LEADING;
141
0
                aLSp.Height = ( bConvert ? static_cast<short>(convertTwipToMm100(nInterLineSpace)) : nInterLineSpace);
142
0
            }
143
314k
            else if(eInterLineSpaceRule == SvxInterLineSpaceRule::Off)
144
277k
            {
145
277k
                aLSp.Mode = style::LineSpacingMode::PROP;
146
277k
                aLSp.Height = 100;
147
277k
            }
148
37.3k
            else
149
37.3k
            {
150
37.3k
                aLSp.Mode = style::LineSpacingMode::PROP;
151
37.3k
                aLSp.Height = nPropLineSpace;
152
37.3k
            }
153
314k
        break;
154
1.10k
        case SvxLineSpaceRule::Fix :
155
1.43k
        case SvxLineSpaceRule::Min :
156
1.43k
            aLSp.Mode = eLineSpaceRule == SvxLineSpaceRule::Fix ? style::LineSpacingMode::FIX : style::LineSpacingMode::MINIMUM;
157
1.43k
            aLSp.Height = ( bConvert ? static_cast<short>(convertTwipToMm100(nLineHeight)) : nLineHeight );
158
1.43k
        break;
159
0
        default:
160
0
            ;//prevent warning about SvxLineSpaceRule::End
161
315k
    }
162
163
315k
    switch ( nMemberId )
164
315k
    {
165
315k
        case 0 :                rVal <<= aLSp; break;
166
0
        case MID_LINESPACE :    rVal <<= aLSp.Mode; break;
167
0
        case MID_HEIGHT :       rVal <<= aLSp.Height; break;
168
0
        default: OSL_FAIL("Wrong MemberId!"); break;
169
315k
    }
170
171
315k
    return true;
172
315k
}
173
174
bool SvxLineSpacingItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
175
315k
{
176
315k
    ASSERT_CHANGE_REFCOUNTED_ITEM;
177
315k
    bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
178
315k
    nMemberId &= ~CONVERT_TWIPS;
179
180
    // fill with current data
181
315k
    style::LineSpacing aLSp;
182
315k
    uno::Any aAny;
183
315k
    bool bRet = QueryValue( aAny, bConvert ? CONVERT_TWIPS : 0 ) && ( aAny >>= aLSp );
184
185
    // get new data
186
315k
    switch ( nMemberId )
187
315k
    {
188
315k
        case 0 :                bRet = (rVal >>= aLSp); break;
189
0
        case MID_LINESPACE :    bRet = (rVal >>= aLSp.Mode); break;
190
0
        case MID_HEIGHT :       bRet = (rVal >>= aLSp.Height); break;
191
0
        default: OSL_FAIL("Wrong MemberId!"); break;
192
315k
    }
193
194
315k
    if( bRet )
195
315k
    {
196
315k
        nLineHeight = aLSp.Height;
197
315k
        switch( aLSp.Mode )
198
315k
        {
199
0
            case style::LineSpacingMode::LEADING:
200
0
            {
201
0
                eInterLineSpaceRule = SvxInterLineSpaceRule::Fix;
202
0
                eLineSpaceRule = SvxLineSpaceRule::Auto;
203
0
                nInterLineSpace = aLSp.Height;
204
0
                if(bConvert)
205
0
                    nInterLineSpace = o3tl::toTwips(nInterLineSpace, o3tl::Length::mm100);
206
207
0
            }
208
0
            break;
209
306k
            case style::LineSpacingMode::PROP:
210
306k
            {
211
306k
                eLineSpaceRule = SvxLineSpaceRule::Auto;
212
306k
                nPropLineSpace = aLSp.Height;
213
306k
                if(100 == aLSp.Height)
214
256k
                    eInterLineSpaceRule = SvxInterLineSpaceRule::Off;
215
49.9k
                else
216
49.9k
                    eInterLineSpaceRule = SvxInterLineSpaceRule::Prop;
217
306k
            }
218
306k
            break;
219
5.85k
            case style::LineSpacingMode::FIX:
220
9.10k
            case style::LineSpacingMode::MINIMUM:
221
9.10k
            {
222
9.10k
                eInterLineSpaceRule =  SvxInterLineSpaceRule::Off;
223
9.10k
                eLineSpaceRule = aLSp.Mode == style::LineSpacingMode::FIX ? SvxLineSpaceRule::Fix : SvxLineSpaceRule::Min;
224
9.10k
                nLineHeight = aLSp.Height;
225
9.10k
                if(bConvert)
226
9.09k
                    nLineHeight = o3tl::toTwips(nLineHeight, o3tl::Length::mm100);
227
9.10k
            }
228
9.10k
            break;
229
315k
        }
230
315k
    }
231
232
315k
    return bRet;
233
315k
}
234
235
SvxLineSpacingItem* SvxLineSpacingItem::Clone( SfxItemPool * ) const
236
638k
{
237
638k
    return new SvxLineSpacingItem( *this );
238
638k
}
239
240
bool SvxLineSpacingItem::GetPresentation
241
(
242
    SfxItemPresentation ePres,
243
    MapUnit             eCoreUnit,
244
    MapUnit             ePresUnit,
245
    OUString&           rText, const IntlWrapper& rIntl
246
)   const
247
0
{
248
0
    switch ( ePres )
249
0
    {
250
0
        case SfxItemPresentation::Nameless:
251
0
        case SfxItemPresentation::Complete:
252
0
        {
253
0
            switch( GetLineSpaceRule() )
254
0
            {
255
0
                case SvxLineSpaceRule::Auto:
256
0
                {
257
0
                    SvxInterLineSpaceRule eInter = GetInterLineSpaceRule();
258
259
0
                    switch( eInter )
260
0
                    {
261
                        // Default single line spacing
262
0
                        case SvxInterLineSpaceRule::Off:
263
0
                            rText = EditResId(RID_SVXITEMS_LINESPACING_SINGLE);
264
0
                            break;
265
266
                        // Default single line spacing
267
0
                        case SvxInterLineSpaceRule::Prop:
268
0
                            if ( 100 == GetPropLineSpace() )
269
0
                            {
270
0
                                rText = EditResId(RID_SVXITEMS_LINESPACING_SINGLE);
271
0
                                break;
272
0
                            }
273
                            // 1.15 line spacing
274
0
                            if ( 115 == GetPropLineSpace() )
275
0
                            {
276
0
                                rText = EditResId(RID_SVXITEMS_LINESPACING_115);
277
0
                                break;
278
0
                            }
279
                            // 1.5 line spacing
280
0
                            if ( 150 == GetPropLineSpace() )
281
0
                            {
282
0
                                rText = EditResId(RID_SVXITEMS_LINESPACING_15);
283
0
                                break;
284
0
                            }
285
                            // double line spacing
286
0
                            if ( 200 == GetPropLineSpace() )
287
0
                            {
288
0
                                rText = EditResId(RID_SVXITEMS_LINESPACING_DOUBLE);
289
0
                                break;
290
0
                            }
291
                            // the set per cent value
292
0
                            rText = EditResId(RID_SVXITEMS_LINESPACING_PROPORTIONAL) + " " + OUString::number(GetPropLineSpace()) + "%";
293
0
                            break;
294
295
0
                        case SvxInterLineSpaceRule::Fix:
296
0
                            rText = EditResId(RID_SVXITEMS_LINESPACING_LEADING)  +
297
0
                                    " " + GetMetricText(GetInterLineSpace(), eCoreUnit, ePresUnit, &rIntl) +
298
0
                                    " " + EditResId(GetMetricId(ePresUnit));
299
0
                            break;
300
0
                        default: ;//prevent warning
301
0
                    }
302
0
                }
303
0
                break;
304
0
                case SvxLineSpaceRule::Fix:
305
0
                    rText = EditResId(RID_SVXITEMS_LINESPACING_FIXED)  +
306
0
                            " " + GetMetricText(GetLineHeight(), eCoreUnit, ePresUnit, &rIntl) +
307
0
                            " " + EditResId(GetMetricId(ePresUnit));
308
0
                    break;
309
310
0
                case SvxLineSpaceRule::Min:
311
0
                    rText = EditResId(RID_SVXITEMS_LINESPACING_MIN) +
312
0
                            " " + GetMetricText(GetLineHeight(), eCoreUnit, ePresUnit, &rIntl) +
313
0
                            " " + EditResId(GetMetricId(ePresUnit));
314
0
                    break;
315
0
                default: ;//prevent warning
316
0
            }
317
0
        }
318
0
    }
319
0
    return true;
320
0
}
321
322
// class SvxAdjustItem ---------------------------------------------------
323
324
ItemInstanceManager* SvxAdjustItem::getItemInstanceManager() const
325
1.49M
{
326
1.49M
    static DefaultItemInstanceManager aInstanceManager(ItemType());
327
1.49M
    return &aInstanceManager;
328
1.49M
}
329
330
SvxAdjustItem::SvxAdjustItem(const SvxAdjust eAdjst, const sal_uInt16 nId )
331
1.27M
    : SfxPoolItem( nId ),
332
1.27M
    bOneBlock( false ), bLastCenter( false ), bLastBlock( false ),
333
1.27M
    nPropWordSpacing(100),
334
1.27M
    nPropWordSpacingMinimum(100),
335
1.27M
    nPropWordSpacingMaximum(100)
336
1.27M
{
337
1.27M
    SetAdjust( eAdjst );
338
1.27M
}
339
340
bool SvxAdjustItem::operator==( const SfxPoolItem& rAttr ) const
341
4.49M
{
342
4.49M
    assert(SfxPoolItem::operator==(rAttr));
343
344
4.49M
    const SvxAdjustItem& rItem = static_cast<const SvxAdjustItem&>(rAttr);
345
4.49M
    return GetAdjust() == rItem.GetAdjust() &&
346
4.49M
           bOneBlock == rItem.bOneBlock &&
347
4.49M
           bLastCenter == rItem.bLastCenter &&
348
4.49M
           bLastBlock == rItem.bLastBlock &&
349
4.49M
           nPropWordSpacingMinimum == rItem.nPropWordSpacingMinimum &&
350
4.49M
           nPropWordSpacingMaximum == rItem.nPropWordSpacingMaximum &&
351
4.49M
           nPropWordSpacing == rItem.nPropWordSpacing;
352
4.49M
}
353
354
size_t SvxAdjustItem::hashCode() const
355
0
{
356
0
    std::size_t seed(0);
357
0
    o3tl::hash_combine(seed, GetAdjust());
358
0
    o3tl::hash_combine(seed, bOneBlock);
359
0
    o3tl::hash_combine(seed, bLastCenter);
360
0
    o3tl::hash_combine(seed, bLastBlock);
361
0
    o3tl::hash_combine(seed, nPropWordSpacing);
362
0
    o3tl::hash_combine(seed, nPropWordSpacingMinimum);
363
0
    o3tl::hash_combine(seed, nPropWordSpacingMaximum);
364
0
    return seed;
365
0
}
366
367
bool SvxAdjustItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
368
90.4k
{
369
90.4k
    nMemberId &= ~CONVERT_TWIPS;
370
90.4k
    switch( nMemberId )
371
90.4k
    {
372
24.3k
        case MID_PARA_ADJUST      : rVal <<= static_cast<sal_Int16>(GetAdjust()); break;
373
13.2k
        case MID_LAST_LINE_ADJUST : rVal <<= static_cast<sal_Int16>(GetLastBlock()); break;
374
13.2k
        case MID_WORD_SPACING     : rVal <<= static_cast<sal_Int16>(GetPropWordSpacing()); break;
375
13.2k
        case MID_WORD_SPACING_MIN : rVal <<= static_cast<sal_Int16>(GetPropWordSpacingMinimum()); break;
376
13.2k
        case MID_WORD_SPACING_MAX : rVal <<= static_cast<sal_Int16>(GetPropWordSpacingMaximum()); break;
377
13.2k
        case MID_EXPAND_SINGLE    :
378
13.2k
        {
379
13.2k
            rVal <<= bOneBlock;
380
13.2k
            break;
381
0
        }
382
0
        default: ;//prevent warning
383
90.4k
    }
384
90.4k
    return true;
385
90.4k
}
386
387
bool SvxAdjustItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
388
555k
{
389
555k
    ASSERT_CHANGE_REFCOUNTED_ITEM;
390
555k
    nMemberId &= ~CONVERT_TWIPS;
391
555k
    switch( nMemberId )
392
555k
    {
393
430k
        case MID_PARA_ADJUST              :
394
487k
        case MID_LAST_LINE_ADJUST :
395
487k
        {
396
487k
            sal_Int32 eVal = - 1;
397
487k
            ::cppu::enum2int(eVal,rVal);
398
487k
            if(eVal >= 0 && eVal <= 4)
399
487k
            {
400
487k
                SvxAdjust eAdjust = static_cast<SvxAdjust>(eVal);
401
487k
                if(MID_LAST_LINE_ADJUST == nMemberId &&
402
487k
                    eAdjust != SvxAdjust::Left &&
403
487k
                    eAdjust != SvxAdjust::Block &&
404
487k
                    eAdjust != SvxAdjust::Center)
405
0
                        return false;
406
487k
                nMemberId == MID_PARA_ADJUST ? SetAdjust(eAdjust) : SetLastBlock(eAdjust);
407
487k
            }
408
487k
        }
409
487k
        break;
410
487k
        case MID_WORD_SPACING :
411
13.2k
        {
412
13.2k
            sal_Int16 nVal = -1;
413
13.2k
            rVal >>= nVal;
414
13.2k
            SetPropWordSpacing(nVal);
415
13.2k
        }
416
13.2k
        break;
417
13.2k
        case MID_WORD_SPACING_MIN :
418
13.2k
        {
419
13.2k
            sal_Int16 nVal = -1;
420
13.2k
            rVal >>= nVal;
421
13.2k
            SetPropWordSpacingMinimum(nVal);
422
13.2k
        }
423
13.2k
        break;
424
13.2k
        case MID_WORD_SPACING_MAX :
425
13.2k
        {
426
13.2k
            sal_Int16 nVal = -1;
427
13.2k
            rVal >>= nVal;
428
13.2k
            SetPropWordSpacingMaximum(nVal);
429
13.2k
        }
430
13.2k
        break;
431
28.1k
        case MID_EXPAND_SINGLE :
432
28.1k
            ASSERT_CHANGE_REFCOUNTED_ITEM;
433
28.1k
            bOneBlock = Any2Bool(rVal);
434
28.1k
            break;
435
555k
    }
436
555k
    return true;
437
555k
}
438
439
SvxAdjustItem* SvxAdjustItem::Clone( SfxItemPool * ) const
440
1.50M
{
441
1.50M
    return new SvxAdjustItem( *this );
442
1.50M
}
443
444
bool SvxAdjustItem::GetPresentation
445
(
446
    SfxItemPresentation ePres,
447
    MapUnit             /*eCoreUnit*/,
448
    MapUnit             /*ePresUnit*/,
449
    OUString&           rText, const IntlWrapper&
450
)   const
451
0
{
452
0
    switch ( ePres )
453
0
    {
454
0
        case SfxItemPresentation::Nameless:
455
0
        case SfxItemPresentation::Complete:
456
            // TODO Word spacing
457
0
            rText = GetValueTextByPos( static_cast<sal_uInt16>(GetAdjust()) );
458
0
            return true;
459
0
        default: ;//prevent warning
460
0
    }
461
0
    return false;
462
0
}
463
464
465
OUString SvxAdjustItem::GetValueTextByPos( sal_uInt16 nPos )
466
0
{
467
0
    static TranslateId RID_SVXITEMS_ADJUST[] =
468
0
    {
469
0
        RID_SVXITEMS_ADJUST_LEFT,
470
0
        RID_SVXITEMS_ADJUST_RIGHT,
471
0
        RID_SVXITEMS_ADJUST_BLOCK,
472
0
        RID_SVXITEMS_ADJUST_CENTER,
473
0
        RID_SVXITEMS_ADJUST_BLOCKLINE
474
0
    };
475
0
    static_assert(std::size(RID_SVXITEMS_ADJUST) - 1 == static_cast<size_t>(SvxAdjust::BlockLine), "unexpected size");
476
0
    assert(nPos <= sal_uInt16(SvxAdjust::BlockLine) && "enum overflow!");
477
0
    return EditResId(RID_SVXITEMS_ADJUST[nPos]);
478
0
}
479
480
481
// class SvxWidowsItem ---------------------------------------------------
482
483
SvxWidowsItem::SvxWidowsItem(const sal_uInt8 nL, const sal_uInt16 nId ) :
484
38.0k
    SfxByteItem( nId, nL )
485
38.0k
{
486
38.0k
}
487
488
SvxWidowsItem* SvxWidowsItem::Clone( SfxItemPool * ) const
489
76.5k
{
490
76.5k
    return new SvxWidowsItem( *this );
491
76.5k
}
492
493
bool SvxWidowsItem::GetPresentation
494
(
495
    SfxItemPresentation ePres,
496
    MapUnit             /*eCoreUnit*/,
497
    MapUnit             /*ePresUnit*/,
498
    OUString&           rText, const IntlWrapper&
499
)   const
500
0
{
501
0
    switch ( ePres )
502
0
    {
503
0
        case SfxItemPresentation::Nameless:
504
0
        {
505
0
            rText = EditResId(RID_SVXITEMS_LINES);
506
0
            break;
507
0
        }
508
509
0
        case SfxItemPresentation::Complete:
510
0
        {
511
0
            rText = EditResId(RID_SVXITEMS_WIDOWS_COMPLETE) + " " + EditResId(RID_SVXITEMS_LINES);
512
0
            break;
513
0
        }
514
515
0
        default:
516
0
        {
517
0
            SAL_WARN( "editeng.items", "SvxWidowsItem::GetPresentation(): unknown SfxItemPresentation" );
518
0
        }
519
0
    }
520
521
0
    rText = rText.replaceFirst( "%1", OUString::number( GetValue() ) );
522
0
    return true;
523
0
}
524
525
// class SvxOrphansItem --------------------------------------------------
526
527
SvxOrphansItem::SvxOrphansItem(const sal_uInt8 nL, const sal_uInt16 nId ) :
528
38.4k
    SfxByteItem( nId, nL )
529
38.4k
{
530
38.4k
}
531
532
SvxOrphansItem* SvxOrphansItem::Clone( SfxItemPool * ) const
533
80.6k
{
534
80.6k
    return new SvxOrphansItem( *this );
535
80.6k
}
536
537
bool SvxOrphansItem::GetPresentation
538
(
539
    SfxItemPresentation ePres,
540
    MapUnit             /*eCoreUnit*/,
541
    MapUnit             /*ePresUnit*/,
542
    OUString&           rText, const IntlWrapper&
543
)   const
544
0
{
545
0
    switch ( ePres )
546
0
    {
547
0
        case SfxItemPresentation::Nameless:
548
0
        {
549
0
            rText = EditResId(RID_SVXITEMS_LINES);
550
0
            break;
551
0
        }
552
553
0
        case SfxItemPresentation::Complete:
554
0
        {
555
0
            rText = EditResId(RID_SVXITEMS_ORPHANS_COMPLETE) + " " + EditResId(RID_SVXITEMS_LINES);
556
0
            break;
557
0
        }
558
559
0
        default:
560
0
        {
561
0
            SAL_WARN( "editeng.items", "SvxOrphansItem::GetPresentation(): unknown SfxItemPresentation" );
562
0
        }
563
0
    }
564
565
0
    rText = rText.replaceFirst( "%1", OUString::number( GetValue() ) );
566
0
    return true;
567
0
}
568
569
// class SvxHyphenZoneItem -----------------------------------------------
570
571
SvxHyphenZoneItem::SvxHyphenZoneItem( const bool bHyph, const sal_uInt16 nId ) :
572
1.73k
    SfxPoolItem( nId ),
573
1.73k
    bHyphen(bHyph),
574
1.73k
    bKeep(false),
575
1.73k
    bNoCapsHyphenation(false),
576
1.73k
    bNoLastWordHyphenation(false),
577
1.73k
    nMinLead(0),
578
1.73k
    nMinTrail(0),
579
1.73k
    nMaxHyphens(255),
580
1.73k
    nMinWordLength(0),
581
1.73k
    nTextHyphenZone(0),
582
1.73k
    nTextHyphenZoneAlways(0),
583
1.73k
    nTextHyphenZoneColumn(0),
584
1.73k
    nTextHyphenZonePage(0),
585
1.73k
    nTextHyphenZoneSpread(0),
586
1.73k
    nKeepType(css::text::ParagraphHyphenationKeepType::COLUMN),
587
1.73k
    bKeepLine(false),
588
1.73k
    nCompoundMinLead(0)
589
1.73k
{
590
1.73k
}
591
592
593
bool    SvxHyphenZoneItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
594
0
{
595
0
    nMemberId &= ~CONVERT_TWIPS;
596
0
    switch(nMemberId)
597
0
    {
598
0
        case  MID_IS_HYPHEN:
599
0
            rVal <<= bHyphen;
600
0
        break;
601
0
        case MID_HYPHEN_KEEP:
602
0
            rVal <<= bKeep;
603
0
        break;
604
0
        case MID_HYPHEN_MIN_LEAD:
605
0
            rVal <<= static_cast<sal_Int16>(nMinLead);
606
0
        break;
607
0
        case MID_HYPHEN_MIN_TRAIL:
608
0
            rVal <<= static_cast<sal_Int16>(nMinTrail);
609
0
        break;
610
0
        case MID_HYPHEN_MAX_HYPHENS:
611
0
            rVal <<= static_cast<sal_Int16>(nMaxHyphens);
612
0
        break;
613
0
        case MID_HYPHEN_NO_CAPS:
614
0
            rVal <<= bNoCapsHyphenation;
615
0
        break;
616
0
        case MID_HYPHEN_NO_LAST_WORD:
617
0
            rVal <<= bNoLastWordHyphenation;
618
0
        break;
619
0
        case MID_HYPHEN_MIN_WORD_LENGTH:
620
0
            rVal <<= static_cast<sal_Int16>(nMinWordLength);
621
0
        break;
622
0
        case MID_HYPHEN_ZONE:
623
0
            rVal <<= static_cast<sal_Int16>(nTextHyphenZone);
624
0
        break;
625
0
        case MID_HYPHEN_ZONE_ALWAYS:
626
0
            rVal <<= static_cast<sal_Int16>(nTextHyphenZoneAlways);
627
0
        break;
628
0
        case MID_HYPHEN_ZONE_COLUMN:
629
0
            rVal <<= static_cast<sal_Int16>(nTextHyphenZoneColumn);
630
0
        break;
631
0
        case MID_HYPHEN_ZONE_PAGE:
632
0
            rVal <<= static_cast<sal_Int16>(nTextHyphenZonePage);
633
0
        break;
634
0
        case MID_HYPHEN_ZONE_SPREAD:
635
0
            rVal <<= static_cast<sal_Int16>(nTextHyphenZoneSpread);
636
0
        break;
637
0
        case MID_HYPHEN_KEEP_TYPE:
638
0
            rVal <<= static_cast<sal_Int16>(nKeepType);
639
0
        break;
640
0
        case MID_HYPHEN_KEEP_LINE:
641
0
            rVal <<= bKeepLine;
642
0
        break;
643
0
        case MID_HYPHEN_COMPOUND_MIN_LEAD:
644
0
            rVal <<= static_cast<sal_Int16>(nCompoundMinLead);
645
0
        break;
646
0
    }
647
0
    return true;
648
0
}
649
650
bool SvxHyphenZoneItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
651
8.55k
{
652
8.55k
    nMemberId &= ~CONVERT_TWIPS;
653
8.55k
    sal_Int32 nNewVal = 0; // sal_Int32 needs for MID_HYPHEN_KEEP_TYPE
654
655
8.55k
    if( nMemberId != MID_IS_HYPHEN && nMemberId != MID_HYPHEN_NO_CAPS &&
656
8.55k
                nMemberId != MID_HYPHEN_NO_LAST_WORD && nMemberId != MID_HYPHEN_KEEP &&
657
8.55k
                nMemberId != MID_HYPHEN_KEEP_LINE )
658
4.56k
    {
659
4.56k
        if(!(rVal >>= nNewVal))
660
0
            return false;
661
4.56k
    }
662
663
8.55k
    switch(nMemberId)
664
8.55k
    {
665
3.59k
        case  MID_IS_HYPHEN:
666
3.59k
            bHyphen = Any2Bool(rVal);
667
3.59k
        break;
668
190
        case  MID_HYPHEN_KEEP:
669
190
            bKeep = Any2Bool(rVal);
670
190
        break;
671
1.44k
        case MID_HYPHEN_MIN_LEAD:
672
1.44k
            nMinLead = static_cast<sal_uInt8>(nNewVal);
673
1.44k
        break;
674
1.23k
        case MID_HYPHEN_MIN_TRAIL:
675
1.23k
            nMinTrail = static_cast<sal_uInt8>(nNewVal);
676
1.23k
        break;
677
1.56k
        case MID_HYPHEN_MAX_HYPHENS:
678
1.56k
            nMaxHyphens = static_cast<sal_uInt8>(nNewVal);
679
1.56k
        break;
680
54
        case MID_HYPHEN_NO_CAPS:
681
54
            bNoCapsHyphenation = Any2Bool(rVal);
682
54
        break;
683
0
        case MID_HYPHEN_NO_LAST_WORD:
684
0
            bNoLastWordHyphenation = Any2Bool(rVal);
685
0
        break;
686
0
        case MID_HYPHEN_MIN_WORD_LENGTH:
687
0
            nMinWordLength = static_cast<sal_uInt8>(nNewVal);
688
0
        break;
689
142
        case MID_HYPHEN_ZONE:
690
142
            nTextHyphenZone = nNewVal;
691
142
        break;
692
0
        case MID_HYPHEN_ZONE_ALWAYS:
693
0
            nTextHyphenZoneAlways = nNewVal;
694
0
        break;
695
0
        case MID_HYPHEN_ZONE_COLUMN:
696
0
            nTextHyphenZoneColumn = nNewVal;
697
0
        break;
698
0
        case MID_HYPHEN_ZONE_PAGE:
699
0
            nTextHyphenZonePage = nNewVal;
700
0
        break;
701
0
        case MID_HYPHEN_ZONE_SPREAD:
702
0
            nTextHyphenZoneSpread = nNewVal;
703
0
        break;
704
190
        case MID_HYPHEN_KEEP_TYPE:
705
190
            nKeepType = static_cast<sal_uInt8>(nNewVal);
706
190
        break;
707
142
        case  MID_HYPHEN_KEEP_LINE:
708
142
            bKeepLine = Any2Bool(rVal);
709
142
        break;
710
0
        case MID_HYPHEN_COMPOUND_MIN_LEAD:
711
0
            nCompoundMinLead = static_cast<sal_uInt8>(nNewVal);
712
0
        break;
713
8.55k
    }
714
8.55k
    return true;
715
8.55k
}
716
717
718
bool SvxHyphenZoneItem::operator==( const SfxPoolItem& rAttr ) const
719
152k
{
720
152k
    assert(SfxPoolItem::operator==(rAttr));
721
722
152k
    const SvxHyphenZoneItem& rItem = static_cast<const SvxHyphenZoneItem&>(rAttr);
723
152k
    return ( rItem.bHyphen == bHyphen
724
152k
            && rItem.bNoCapsHyphenation == bNoCapsHyphenation
725
152k
            && rItem.bNoLastWordHyphenation == bNoLastWordHyphenation
726
152k
            && rItem.bKeep == bKeep
727
152k
            && rItem.nMinLead == nMinLead
728
152k
            && rItem.nMinTrail == nMinTrail
729
152k
            && rItem.nCompoundMinLead == nCompoundMinLead
730
152k
            && rItem.nMaxHyphens == nMaxHyphens
731
152k
            && rItem.nMinWordLength == nMinWordLength
732
152k
            && rItem.nTextHyphenZone == nTextHyphenZone
733
152k
            && rItem.nTextHyphenZoneAlways == nTextHyphenZoneAlways
734
152k
            && rItem.nTextHyphenZoneColumn == nTextHyphenZoneColumn
735
152k
            && rItem.nTextHyphenZonePage == nTextHyphenZonePage
736
152k
            && rItem.nTextHyphenZoneSpread == nTextHyphenZoneSpread
737
152k
            && rItem.bKeepLine == bKeepLine
738
152k
            && rItem.nKeepType == nKeepType );
739
152k
}
740
741
SvxHyphenZoneItem* SvxHyphenZoneItem::Clone( SfxItemPool * ) const
742
136k
{
743
136k
    return new SvxHyphenZoneItem( *this );
744
136k
}
745
746
bool SvxHyphenZoneItem::GetPresentation
747
(
748
    SfxItemPresentation ePres,
749
    MapUnit             eCoreUnit,
750
    MapUnit             ePresUnit,
751
    OUString&           rText, const IntlWrapper& rIntl
752
)   const
753
0
{
754
0
    OUString cpDelimTmp(cpDelim);
755
0
    switch ( ePres )
756
0
    {
757
0
        case SfxItemPresentation::Nameless:
758
0
        {
759
0
            TranslateId pId = RID_SVXITEMS_HYPHEN_FALSE;
760
0
            if ( bHyphen )
761
0
                pId = RID_SVXITEMS_HYPHEN_TRUE;
762
0
            rText += EditResId(pId) + cpDelimTmp +
763
0
                    OUString::number( nMinLead ) + cpDelimTmp +
764
0
                    OUString::number( nMinTrail ) + cpDelimTmp +
765
0
                    OUString::number( nCompoundMinLead ) + cpDelimTmp +
766
0
                    OUString::number( nMaxHyphens ) + cpDelimTmp +
767
0
                    OUString::number( nMinWordLength ) + cpDelimTmp +
768
0
                    GetMetricText( nTextHyphenZone, eCoreUnit, ePresUnit, &rIntl ) +
769
0
                        " " + EditResId(GetMetricId(ePresUnit)) +
770
0
                    GetMetricText( nTextHyphenZoneAlways, eCoreUnit, ePresUnit, &rIntl ) +
771
0
                        " " + EditResId(GetMetricId(ePresUnit)) +
772
0
                    GetMetricText( nTextHyphenZoneColumn, eCoreUnit, ePresUnit, &rIntl ) +
773
0
                        " " + EditResId(GetMetricId(ePresUnit)) +
774
0
                    GetMetricText( nTextHyphenZonePage, eCoreUnit, ePresUnit, &rIntl ) +
775
0
                        " " + EditResId(GetMetricId(ePresUnit)) +
776
0
                    GetMetricText( nTextHyphenZoneSpread, eCoreUnit, ePresUnit, &rIntl ) +
777
0
                        " " + EditResId(GetMetricId(ePresUnit));
778
779
0
            if ( bNoCapsHyphenation )
780
0
                rText += cpDelimTmp + EditResId(RID_SVXITEMS_HYPHEN_NO_CAPS_TRUE);
781
782
0
            if ( bNoLastWordHyphenation )
783
0
                rText += cpDelimTmp + EditResId(RID_SVXITEMS_HYPHEN_LAST_WORD_TRUE);
784
785
0
            if ( bKeep )
786
0
            {
787
0
                rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_TRUE) +
788
0
                                 cpDelimTmp + OUString::number( nKeepType );
789
0
                if ( bKeepLine )
790
0
                    rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_LINE_TRUE);
791
0
                else
792
0
                    rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_LINE_FALSE);
793
0
            }
794
0
            else
795
0
                rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_FALSE);
796
797
798
0
            return true;
799
0
        }
800
0
        case SfxItemPresentation::Complete:
801
0
        {
802
0
            TranslateId pId = RID_SVXITEMS_HYPHEN_FALSE;
803
804
0
            if ( bHyphen )
805
0
                pId = RID_SVXITEMS_HYPHEN_TRUE;
806
0
            rText += EditResId(pId) +
807
0
                    cpDelimTmp +
808
0
                    EditResId(RID_SVXITEMS_HYPHEN_MINLEAD).replaceAll("%1", OUString::number(nMinLead)) +
809
0
                    cpDelimTmp +
810
0
                    EditResId(RID_SVXITEMS_HYPHEN_MINTRAIL).replaceAll("%1", OUString::number(nMinTrail)) +
811
0
                    cpDelimTmp +
812
0
                    EditResId(RID_SVXITEMS_HYPHEN_COMPOUND_MINLEAD).replaceAll("%1", OUString::number(nCompoundMinLead)) +
813
0
                    cpDelimTmp +
814
0
                    EditResId(RID_SVXITEMS_HYPHEN_MAX).replaceAll("%1", OUString::number(nMaxHyphens)) +
815
0
                    cpDelimTmp +
816
0
                    EditResId(RID_SVXITEMS_HYPHEN_MINWORDLEN).replaceAll("%1", OUString::number(nMinWordLength));
817
818
0
            if ( nTextHyphenZone > 0 || nTextHyphenZoneAlways > 0 ||
819
0
                 nTextHyphenZoneColumn > 0 || nTextHyphenZonePage > 0 ||
820
0
                 nTextHyphenZoneSpread > 0 )
821
0
            {
822
0
                rText += cpDelimTmp + EditResId(RID_SVXITEMS_HYPHEN_ZONE) +
823
0
                        GetMetricText( nTextHyphenZone, eCoreUnit, ePresUnit, &rIntl ) +
824
0
                        " " + EditResId(GetMetricId(ePresUnit));
825
0
                rText += cpDelimTmp + EditResId(RID_SVXITEMS_HYPHEN_ZONE_ALWAYS) +
826
0
                        GetMetricText( nTextHyphenZoneAlways, eCoreUnit, ePresUnit, &rIntl ) +
827
0
                        " " + EditResId(GetMetricId(ePresUnit));
828
0
                rText += cpDelimTmp + EditResId(RID_SVXITEMS_HYPHEN_ZONE_COLUMN) +
829
0
                        GetMetricText( nTextHyphenZoneColumn, eCoreUnit, ePresUnit, &rIntl ) +
830
0
                        " " + EditResId(GetMetricId(ePresUnit));
831
0
                rText += cpDelimTmp + EditResId(RID_SVXITEMS_HYPHEN_ZONE_PAGE) +
832
0
                        GetMetricText( nTextHyphenZonePage, eCoreUnit, ePresUnit, &rIntl ) +
833
0
                        " " + EditResId(GetMetricId(ePresUnit));
834
0
                rText += cpDelimTmp + EditResId(RID_SVXITEMS_HYPHEN_ZONE_SPREAD) +
835
0
                        GetMetricText( nTextHyphenZoneSpread, eCoreUnit, ePresUnit, &rIntl ) +
836
0
                        " " + EditResId(GetMetricId(ePresUnit));
837
0
            }
838
839
0
            if ( bNoCapsHyphenation )
840
0
                rText += cpDelimTmp + EditResId(RID_SVXITEMS_HYPHEN_NO_CAPS_TRUE);
841
842
0
            if ( bNoLastWordHyphenation )
843
0
                rText += cpDelimTmp + EditResId(RID_SVXITEMS_HYPHEN_LAST_WORD_TRUE);
844
845
0
            if ( bKeep )
846
0
            {
847
0
                rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_TRUE) + cpDelimTmp;
848
849
0
                switch ( nKeepType )
850
0
                {
851
0
                    case 0:
852
0
                        rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_AUTO);
853
0
                        break;
854
0
                    case 1:
855
0
                        rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_SPREAD);
856
0
                        break;
857
0
                    case 2:
858
0
                        rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_PAGE);
859
0
                        break;
860
0
                    case 3:
861
0
                        rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_COLUMN);
862
0
                        break;
863
0
                    case 4:
864
0
                        rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_ALWAYS);
865
0
                        break;
866
0
                }
867
868
0
                if ( bKeepLine )
869
0
                    rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_LINE_TRUE);
870
0
                else
871
0
                    rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_LINE_FALSE);
872
0
            }
873
0
            else
874
0
                rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_FALSE);
875
876
0
            return true;
877
0
        }
878
0
        default: ;//prevent warning
879
0
    }
880
0
    return false;
881
0
}
882
883
884
// class SvxTabStop ------------------------------------------------------
885
886
SvxTabStop::SvxTabStop()
887
759k
{
888
759k
    nTabPos = 0;
889
759k
    eAdjustment = SvxTabAdjust::Left;
890
759k
    m_cDecimal = cDfltDecimalChar;
891
759k
    cFill = cDfltFillChar;
892
759k
    fillDecimal();
893
759k
}
894
895
896
SvxTabStop::SvxTabStop( const sal_Int32 nPos, const SvxTabAdjust eAdjst,
897
                        const sal_Unicode cDec, const sal_Unicode cFil )
898
3.34M
{
899
3.34M
    nTabPos = nPos;
900
3.34M
    eAdjustment = eAdjst;
901
3.34M
    m_cDecimal = cDec;
902
3.34M
    cFill = cFil;
903
3.34M
    fillDecimal();
904
3.34M
}
905
906
void SvxTabStop::fillDecimal()
907
4.10M
{
908
4.10M
    if ( cDfltDecimalChar == m_cDecimal )
909
4.09M
        m_cDecimal = SvtSysLocale().GetLocaleData().getNumDecimalSep()[0];
910
4.10M
}
911
912
void SvxTabStop::dumpAsXml(xmlTextWriterPtr pWriter) const
913
0
{
914
0
    (void)xmlTextWriterStartElement(pWriter, BAD_CAST("SvxTabStop"));
915
0
    (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("nTabPos"),
916
0
                                BAD_CAST(OString::number(nTabPos).getStr()));
917
0
    (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("eAdjustment"),
918
0
                                BAD_CAST(OString::number(static_cast<int>(eAdjustment)).getStr()));
919
0
    (void)xmlTextWriterEndElement(pWriter);
920
0
}
921
922
// class SvxTabStopItem --------------------------------------------------
923
924
SvxTabStopItem::SvxTabStopItem( sal_uInt16 _nWhich ) :
925
6
    SfxPoolItem( _nWhich )
926
6
{
927
6
    const sal_uInt16 nTabs = SVX_TAB_DEFCOUNT, nDist = SVX_TAB_DEFDIST;
928
6
    const SvxTabAdjust eAdjst= SvxTabAdjust::Default;
929
930
66
    for (sal_uInt16 i = 0; i < nTabs; ++i)
931
60
    {
932
60
        SvxTabStop aTab( (i + 1) * nDist, eAdjst );
933
60
        maTabStops.insert( aTab );
934
60
    }
935
6
}
936
937
938
SvxTabStopItem::SvxTabStopItem( const sal_uInt16 nTabs,
939
                                const sal_uInt16 nDist,
940
                                const SvxTabAdjust eAdjst,
941
                                sal_uInt16 _nWhich ) :
942
487k
    SfxPoolItem( _nWhich )
943
487k
{
944
611k
    for ( sal_uInt16 i = 0; i < nTabs; ++i )
945
124k
    {
946
124k
        SvxTabStop aTab( (i + 1) * nDist, eAdjst );
947
124k
        maTabStops.insert( aTab );
948
124k
    }
949
487k
}
950
951
952
sal_uInt16 SvxTabStopItem::GetPos( const SvxTabStop& rTab ) const
953
3.21M
{
954
3.21M
    SvxTabStopArr::const_iterator it = maTabStops.find( rTab );
955
3.21M
    return it != maTabStops.end() ? it - maTabStops.begin() : SVX_TAB_NOTFOUND;
956
3.21M
}
957
958
959
sal_uInt16 SvxTabStopItem::GetPos( const sal_Int32 nPos ) const
960
185k
{
961
185k
    SvxTabStopArr::const_iterator it = maTabStops.find( SvxTabStop( nPos ) );
962
185k
    return it != maTabStops.end() ? it - maTabStops.begin() : SVX_TAB_NOTFOUND;
963
185k
}
964
965
void SvxTabStopItem::SetDefaultDistance(sal_Int32 nDefaultDistance)
966
0
{
967
0
    ASSERT_CHANGE_REFCOUNTED_ITEM;
968
0
    mnDefaultDistance = nDefaultDistance;
969
0
}
970
971
sal_Int32 SvxTabStopItem::GetDefaultDistance() const
972
1.25M
{
973
1.25M
    return mnDefaultDistance;
974
1.25M
}
975
976
bool SvxTabStopItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
977
201
{
978
201
    bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
979
201
    nMemberId &= ~CONVERT_TWIPS;
980
201
    switch ( nMemberId )
981
201
    {
982
201
        case MID_TABSTOPS:
983
201
        {
984
201
            sal_uInt16 nCount = Count();
985
201
            uno::Sequence< style::TabStop> aSeq(nCount);
986
201
            style::TabStop* pArr = aSeq.getArray();
987
2.44k
            for(sal_uInt16 i = 0; i < nCount; i++)
988
2.24k
            {
989
2.24k
                const SvxTabStop& rTab = (*this)[i];
990
2.24k
                pArr[i].Position        = bConvert ? convertTwipToMm100(rTab.GetTabPos()) : rTab.GetTabPos();
991
2.24k
                switch(rTab.GetAdjustment())
992
2.24k
                {
993
2.20k
                case  SvxTabAdjust::Left   : pArr[i].Alignment = style::TabAlign_LEFT; break;
994
0
                case  SvxTabAdjust::Right  : pArr[i].Alignment = style::TabAlign_RIGHT; break;
995
0
                case  SvxTabAdjust::Decimal: pArr[i].Alignment = style::TabAlign_DECIMAL; break;
996
33
                case  SvxTabAdjust::Center : pArr[i].Alignment = style::TabAlign_CENTER; break;
997
0
                    default: //SvxTabAdjust::Default
998
0
                        pArr[i].Alignment = style::TabAlign_DEFAULT;
999
1000
2.24k
                }
1001
2.24k
                pArr[i].DecimalChar     = rTab.GetDecimal();
1002
2.24k
                pArr[i].FillChar        = rTab.GetFill();
1003
2.24k
            }
1004
201
            rVal <<= aSeq;
1005
201
            break;
1006
201
        }
1007
0
        case MID_STD_TAB:
1008
0
        {
1009
0
            const SvxTabStop &rTab = maTabStops.front();
1010
0
            rVal <<= static_cast<sal_Int32>(bConvert ? convertTwipToMm100(rTab.GetTabPos()) : rTab.GetTabPos());
1011
0
            break;
1012
201
        }
1013
0
        case MID_TABSTOP_DEFAULT_DISTANCE:
1014
0
        {
1015
0
            rVal <<= static_cast<sal_Int32>(bConvert ? convertTwipToMm100(mnDefaultDistance) : mnDefaultDistance);
1016
0
            break;
1017
201
        }
1018
201
    }
1019
201
    return true;
1020
201
}
1021
1022
bool SvxTabStopItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
1023
67.2k
{
1024
67.2k
    ASSERT_CHANGE_REFCOUNTED_ITEM;
1025
67.2k
    bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
1026
67.2k
    nMemberId &= ~CONVERT_TWIPS;
1027
67.2k
    switch ( nMemberId )
1028
67.2k
    {
1029
24.0k
        case MID_TABSTOPS:
1030
24.0k
        {
1031
24.0k
            uno::Sequence< style::TabStop> aSeq;
1032
24.0k
            if(!(rVal >>= aSeq))
1033
0
            {
1034
0
                uno::Sequence < uno::Sequence < uno::Any >  > aAnySeq;
1035
0
                if (!(rVal >>= aAnySeq))
1036
0
                    return false;
1037
0
                auto aAnySeqRange = asNonConstRange(aAnySeq);
1038
0
                sal_Int32 nLength = aAnySeq.getLength();
1039
0
                aSeq.realloc( nLength );
1040
0
                auto pSeq = aSeq.getArray();
1041
0
                for ( sal_Int32 n=0; n<nLength; n++ )
1042
0
                {
1043
0
                    uno::Sequence < uno::Any >& rAnySeq = aAnySeqRange[n];
1044
0
                    if ( rAnySeq.getLength() == 4 )
1045
0
                    {
1046
0
                        if (!(rAnySeq[0] >>= pSeq[n].Position)) return false;
1047
0
                        if (!(rAnySeq[1] >>= pSeq[n].Alignment))
1048
0
                        {
1049
0
                            sal_Int32 nVal = 0;
1050
0
                            if (rAnySeq[1] >>= nVal)
1051
0
                                pSeq[n].Alignment = static_cast<css::style::TabAlign>(nVal);
1052
0
                            else
1053
0
                                return false;
1054
0
                        }
1055
0
                        if (!(rAnySeq[2] >>= pSeq[n].DecimalChar))
1056
0
                        {
1057
0
                            OUString aVal;
1058
0
                            if ( (rAnySeq[2] >>= aVal) && aVal.getLength() == 1 )
1059
0
                                pSeq[n].DecimalChar = aVal.toChar();
1060
0
                            else
1061
0
                                return false;
1062
0
                        }
1063
0
                        if (!(rAnySeq[3] >>= pSeq[n].FillChar))
1064
0
                        {
1065
0
                            OUString aVal;
1066
0
                            if ( (rAnySeq[3] >>= aVal) && aVal.getLength() == 1 )
1067
0
                                pSeq[n].FillChar = aVal.toChar();
1068
0
                            else
1069
0
                                return false;
1070
0
                        }
1071
0
                    }
1072
0
                    else
1073
0
                        return false;
1074
0
                }
1075
0
            }
1076
1077
24.0k
            maTabStops.clear();
1078
24.0k
            const style::TabStop* pArr = aSeq.getConstArray();
1079
24.0k
            const sal_uInt16 nCount = static_cast<sal_uInt16>(aSeq.getLength());
1080
102k
            for(sal_uInt16 i = 0; i < nCount ; i++)
1081
78.4k
            {
1082
78.4k
                SvxTabAdjust eAdjust = SvxTabAdjust::Default;
1083
78.4k
                switch(pArr[i].Alignment)
1084
78.4k
                {
1085
70.2k
                case style::TabAlign_LEFT   : eAdjust = SvxTabAdjust::Left; break;
1086
2.70k
                case style::TabAlign_CENTER : eAdjust = SvxTabAdjust::Center; break;
1087
5.18k
                case style::TabAlign_RIGHT  : eAdjust = SvxTabAdjust::Right; break;
1088
339
                case style::TabAlign_DECIMAL: eAdjust = SvxTabAdjust::Decimal; break;
1089
0
                default: ;//prevent warning
1090
78.4k
                }
1091
78.4k
                sal_Unicode cFill = pArr[i].FillChar;
1092
78.4k
                sal_Unicode cDecimal = pArr[i].DecimalChar;
1093
78.4k
                SvxTabStop aTab( bConvert ? o3tl::toTwips(pArr[i].Position, o3tl::Length::mm100) : pArr[i].Position,
1094
78.4k
                                    eAdjust,
1095
78.4k
                                    cDecimal,
1096
78.4k
                                    cFill );
1097
78.4k
                Insert(aTab);
1098
78.4k
            }
1099
24.0k
            break;
1100
24.0k
        }
1101
24.0k
        case MID_STD_TAB:
1102
7.36k
        {
1103
7.36k
            sal_Int32 nNewPos = 0;
1104
7.36k
            if (!(rVal >>= nNewPos) )
1105
0
                return false;
1106
7.36k
            if (bConvert)
1107
7.36k
                nNewPos = o3tl::toTwips(nNewPos, o3tl::Length::mm100);
1108
7.36k
            if (nNewPos <= 0)
1109
13
                return false;
1110
7.35k
            const SvxTabStop& rTab = maTabStops.front();
1111
7.35k
            SvxTabStop aNewTab ( nNewPos, rTab.GetAdjustment(), rTab.GetDecimal(), rTab.GetFill() );
1112
7.35k
            Remove( 0 );
1113
7.35k
            Insert( aNewTab );
1114
7.35k
            break;
1115
7.36k
        }
1116
35.8k
        case MID_TABSTOP_DEFAULT_DISTANCE:
1117
35.8k
        {
1118
35.8k
            sal_Int32 nNewDefaultDistance = 0;
1119
35.8k
            if (!(rVal >>= nNewDefaultDistance))
1120
0
                return false;
1121
35.8k
            if (bConvert)
1122
0
                nNewDefaultDistance = o3tl::toTwips(nNewDefaultDistance, o3tl::Length::mm100);
1123
35.8k
            if (nNewDefaultDistance < 0)
1124
0
                return false;
1125
35.8k
            mnDefaultDistance = nNewDefaultDistance;
1126
35.8k
            break;
1127
35.8k
        }
1128
67.2k
    }
1129
67.2k
    return true;
1130
67.2k
}
1131
1132
1133
bool SvxTabStopItem::operator==( const SfxPoolItem& rAttr ) const
1134
1.25M
{
1135
1.25M
    assert(SfxPoolItem::operator==(rAttr));
1136
1137
1.25M
    const SvxTabStopItem& rTSI = static_cast<const SvxTabStopItem&>(rAttr);
1138
1139
1.25M
    if ( mnDefaultDistance != rTSI.GetDefaultDistance() )
1140
28.6k
        return false;
1141
1142
1.22M
    if ( Count() != rTSI.Count() )
1143
43.7k
        return false;
1144
1145
5.62M
    for ( sal_uInt16 i = 0; i < Count(); ++i )
1146
4.48M
        if( (*this)[i] != rTSI[i] )
1147
39.0k
            return false;
1148
1.14M
    return true;
1149
1.18M
}
1150
1151
size_t SvxTabStopItem::hashCode() const
1152
423k
{
1153
423k
    std::size_t seed(0);
1154
423k
    o3tl::hash_combine(seed, mnDefaultDistance);
1155
423k
    for (const SvxTabStop & rStop : maTabStops)
1156
3.73M
    {
1157
3.73M
        o3tl::hash_combine(seed, rStop.GetTabPos());
1158
3.73M
        o3tl::hash_combine(seed, rStop. GetAdjustment());
1159
3.73M
    }
1160
423k
    return seed;
1161
423k
}
1162
1163
SvxTabStopItem* SvxTabStopItem::Clone( SfxItemPool * ) const
1164
604k
{
1165
604k
    return new SvxTabStopItem( *this );
1166
604k
}
1167
1168
bool SvxTabStopItem::GetPresentation
1169
(
1170
    SfxItemPresentation ePres,
1171
    MapUnit             eCoreUnit,
1172
    MapUnit             ePresUnit,
1173
    OUString&           rText, const IntlWrapper& rIntl
1174
)   const
1175
0
{
1176
0
    rText.clear();
1177
    // TODO also consider mnDefaultTabDistance here
1178
1179
0
    bool bComma = false;
1180
1181
0
    for ( sal_uInt16 i = 0; i < Count(); ++i )
1182
0
    {
1183
0
        if ( SvxTabAdjust::Default != ((*this)[i]).GetAdjustment() )
1184
0
        {
1185
0
            if ( bComma )
1186
0
                rText += ",";
1187
0
            rText += GetMetricText(
1188
0
                ((*this)[i]).GetTabPos(), eCoreUnit, ePresUnit, &rIntl );
1189
0
            if ( SfxItemPresentation::Complete == ePres )
1190
0
            {
1191
0
                rText += " " + EditResId(GetMetricId(ePresUnit));
1192
0
            }
1193
0
            bComma = true;
1194
0
        }
1195
0
    }
1196
0
    return true;
1197
0
}
1198
1199
1200
bool SvxTabStopItem::Insert( const SvxTabStop& rTab )
1201
3.21M
{
1202
3.21M
    ASSERT_CHANGE_REFCOUNTED_ITEM;
1203
3.21M
    sal_uInt16 nTabPos = GetPos(rTab);
1204
3.21M
    if(SVX_TAB_NOTFOUND != nTabPos )
1205
25.6k
        Remove(nTabPos);
1206
3.21M
    return maTabStops.insert( rTab ).second;
1207
3.21M
}
1208
1209
void SvxTabStopItem::Insert( const SvxTabStopItem* pTabs )
1210
0
{
1211
0
    ASSERT_CHANGE_REFCOUNTED_ITEM;
1212
0
    for( sal_uInt16 i = 0; i < pTabs->Count(); i++ )
1213
0
    {
1214
0
        const SvxTabStop& rTab = (*pTabs)[i];
1215
0
        sal_uInt16 nTabPos = GetPos(rTab);
1216
0
        if(SVX_TAB_NOTFOUND != nTabPos)
1217
0
            Remove(nTabPos);
1218
0
    }
1219
0
    for( sal_uInt16 i = 0; i < pTabs->Count(); i++ )
1220
0
    {
1221
0
        maTabStops.insert( (*pTabs)[i] );
1222
0
    }
1223
0
}
1224
1225
void SvxTabStopItem::dumpAsXml(xmlTextWriterPtr pWriter) const
1226
0
{
1227
0
    (void)xmlTextWriterStartElement(pWriter, BAD_CAST("SvxTabStopItem"));
1228
0
    (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("mnDefaultDistance"),
1229
0
                                      BAD_CAST(OString::number(mnDefaultDistance).getStr()));
1230
0
    for (const auto& rTabStop : maTabStops)
1231
0
        rTabStop.dumpAsXml(pWriter);
1232
0
    (void)xmlTextWriterEndElement(pWriter);
1233
0
}
1234
1235
// class SvxFormatSplitItem -------------------------------------------------
1236
SvxFormatSplitItem::~SvxFormatSplitItem()
1237
258k
{
1238
258k
}
1239
1240
SvxFormatSplitItem* SvxFormatSplitItem::Clone( SfxItemPool * ) const
1241
193k
{
1242
193k
    return new SvxFormatSplitItem( *this );
1243
193k
}
1244
1245
bool SvxFormatSplitItem::GetPresentation
1246
(
1247
    SfxItemPresentation /*ePres*/,
1248
    MapUnit             /*eCoreUnit*/,
1249
    MapUnit             /*ePresUnit*/,
1250
    OUString&           rText, const IntlWrapper&
1251
)   const
1252
0
{
1253
0
    TranslateId pId = RID_SVXITEMS_FMTSPLIT_FALSE;
1254
1255
0
    if ( GetValue() )
1256
0
        pId = RID_SVXITEMS_FMTSPLIT_TRUE;
1257
0
    rText = EditResId(pId);
1258
0
    return true;
1259
0
}
1260
1261
SvxPageModelItem* SvxPageModelItem::Clone( SfxItemPool* ) const
1262
0
{
1263
0
    return new SvxPageModelItem( *this );
1264
0
}
1265
1266
bool SvxPageModelItem::QueryValue( css::uno::Any& rVal, sal_uInt8 nMemberId ) const
1267
0
{
1268
0
    nMemberId &= ~CONVERT_TWIPS;
1269
1270
0
    switch ( nMemberId )
1271
0
    {
1272
0
        case MID_AUTO: rVal <<= bAuto; break;
1273
0
        case MID_NAME: rVal <<= GetValue(); break;
1274
0
        default: OSL_FAIL("Wrong MemberId!"); return false;
1275
0
    }
1276
1277
0
    return true;
1278
0
}
1279
1280
bool SvxPageModelItem::PutValue( const css::uno::Any& rVal, sal_uInt8 nMemberId )
1281
0
{
1282
0
    nMemberId &= ~CONVERT_TWIPS;
1283
0
    bool bRet;
1284
0
    OUString aStr;
1285
0
    switch ( nMemberId )
1286
0
    {
1287
0
        case MID_AUTO: bRet = ( rVal >>= bAuto ); break;
1288
0
        case MID_NAME: bRet = ( rVal >>= aStr ); if ( bRet ) SetValue(aStr); break;
1289
0
        default: OSL_FAIL("Wrong MemberId!"); return false;
1290
0
    }
1291
1292
0
    return bRet;
1293
0
}
1294
1295
bool SvxPageModelItem::operator==( const SfxPoolItem& rAttr ) const
1296
0
{
1297
0
    return SfxStringItem::operator==(rAttr) &&
1298
0
           bAuto == static_cast<const SvxPageModelItem&>( rAttr ).bAuto;
1299
0
}
1300
1301
bool SvxPageModelItem::GetPresentation
1302
(
1303
    SfxItemPresentation ePres,
1304
    MapUnit             /*eCoreUnit*/,
1305
    MapUnit             /*ePresUnit*/,
1306
    OUString&           rText, const IntlWrapper&
1307
)   const
1308
0
{
1309
0
    rText.clear();
1310
0
    bool bSet = !GetValue().isEmpty();
1311
1312
0
    switch ( ePres )
1313
0
    {
1314
0
        case SfxItemPresentation::Nameless:
1315
0
            if ( bSet )
1316
0
                rText = GetValue();
1317
0
            return true;
1318
1319
0
        case SfxItemPresentation::Complete:
1320
0
            if ( bSet )
1321
0
            {
1322
0
                rText = EditResId(RID_SVXITEMS_PAGEMODEL_COMPLETE) + GetValue();
1323
0
            }
1324
0
            return true;
1325
0
        default: ;//prevent warning
1326
0
    }
1327
0
    return false;
1328
0
}
1329
1330
1331
SvxScriptSpaceItem::SvxScriptSpaceItem( bool bOn, const sal_uInt16 nId )
1332
157k
    : SfxBoolItem( nId, bOn )
1333
157k
{
1334
157k
}
1335
1336
SvxScriptSpaceItem* SvxScriptSpaceItem::Clone( SfxItemPool * ) const
1337
191k
{
1338
191k
    return new SvxScriptSpaceItem( *this );
1339
191k
}
1340
1341
bool SvxScriptSpaceItem::GetPresentation(
1342
        SfxItemPresentation /*ePres*/,
1343
        MapUnit /*eCoreMetric*/, MapUnit /*ePresMetric*/,
1344
        OUString &rText, const IntlWrapper& /*rIntl*/ ) const
1345
0
{
1346
0
    rText = EditResId( !GetValue()
1347
0
                            ? RID_SVXITEMS_SCRPTSPC_OFF
1348
0
                            : RID_SVXITEMS_SCRPTSPC_ON );
1349
0
    return true;
1350
0
}
1351
1352
1353
SvxHangingPunctuationItem::SvxHangingPunctuationItem(
1354
                                    bool bOn, const sal_uInt16 nId )
1355
103k
    : SfxBoolItem( nId, bOn )
1356
103k
{
1357
103k
}
1358
1359
SvxHangingPunctuationItem* SvxHangingPunctuationItem::Clone( SfxItemPool * ) const
1360
170k
{
1361
170k
    return new SvxHangingPunctuationItem( *this );
1362
170k
}
1363
1364
bool SvxHangingPunctuationItem::GetPresentation(
1365
        SfxItemPresentation /*ePres*/,
1366
        MapUnit /*eCoreMetric*/, MapUnit /*ePresMetric*/,
1367
        OUString &rText, const IntlWrapper& /*rIntl*/ ) const
1368
0
{
1369
0
    rText = EditResId( !GetValue()
1370
0
                            ? RID_SVXITEMS_HNGPNCT_OFF
1371
0
                            : RID_SVXITEMS_HNGPNCT_ON );
1372
0
    return true;
1373
0
}
1374
1375
1376
SvxForbiddenRuleItem::SvxForbiddenRuleItem(
1377
                                    bool bOn, const sal_uInt16 nId )
1378
264k
    : SfxBoolItem( nId, bOn )
1379
264k
{
1380
264k
}
1381
1382
SvxForbiddenRuleItem* SvxForbiddenRuleItem::Clone( SfxItemPool * ) const
1383
174k
{
1384
174k
    return new SvxForbiddenRuleItem( *this );
1385
174k
}
1386
1387
bool SvxForbiddenRuleItem::GetPresentation(
1388
        SfxItemPresentation /*ePres*/,
1389
        MapUnit /*eCoreMetric*/, MapUnit /*ePresMetric*/,
1390
        OUString &rText, const IntlWrapper& /*rIntl*/ ) const
1391
0
{
1392
0
    rText = EditResId( !GetValue()
1393
0
                            ? RID_SVXITEMS_FORBIDDEN_RULE_OFF
1394
0
                            : RID_SVXITEMS_FORBIDDEN_RULE_ON );
1395
0
    return true;
1396
0
}
1397
1398
/*************************************************************************
1399
|*    class SvxParaVertAlignItem
1400
*************************************************************************/
1401
1402
SvxParaVertAlignItem::SvxParaVertAlignItem( Align nValue,
1403
    TypedWhichId<SvxParaVertAlignItem> nW )
1404
10.6k
    : SfxUInt16Item( nW, static_cast<sal_uInt16>(nValue) )
1405
10.6k
{
1406
10.6k
}
1407
1408
SvxParaVertAlignItem* SvxParaVertAlignItem::Clone( SfxItemPool* ) const
1409
20.7k
{
1410
20.7k
    return new SvxParaVertAlignItem( *this );
1411
20.7k
}
1412
1413
bool SvxParaVertAlignItem::GetPresentation(
1414
        SfxItemPresentation /*ePres*/,
1415
        MapUnit /*eCoreMetric*/, MapUnit /*ePresMetric*/,
1416
        OUString &rText, const IntlWrapper& ) const
1417
0
{
1418
0
    TranslateId pTmp;
1419
0
    switch( GetValue() )
1420
0
    {
1421
0
        case Align::Automatic: pTmp = RID_SVXITEMS_PARAVERTALIGN_AUTO; break;
1422
0
        case Align::Top:       pTmp = RID_SVXITEMS_PARAVERTALIGN_TOP; break;
1423
0
        case Align::Center:    pTmp = RID_SVXITEMS_PARAVERTALIGN_CENTER; break;
1424
0
        case Align::Bottom:    pTmp = RID_SVXITEMS_PARAVERTALIGN_BOTTOM; break;
1425
0
        default:    pTmp = RID_SVXITEMS_PARAVERTALIGN_BASELINE; break;
1426
0
    }
1427
0
    rText = EditResId(pTmp);
1428
0
    return true;
1429
0
}
1430
1431
bool SvxParaVertAlignItem::QueryValue( css::uno::Any& rVal,
1432
                                           sal_uInt8 /*nMemberId*/ ) const
1433
0
{
1434
0
    rVal <<= static_cast<sal_Int16>(GetValue());
1435
0
    return true;
1436
0
}
1437
1438
bool SvxParaVertAlignItem::PutValue( const css::uno::Any& rVal,
1439
                                         sal_uInt8 /*nMemberId*/ )
1440
449
{
1441
449
    sal_Int16 nVal = sal_Int16();
1442
449
    if((rVal >>= nVal) && nVal >=0 && nVal <= sal_uInt16(Align::Bottom) )
1443
449
    {
1444
449
        SetValue( static_cast<Align>(nVal) );
1445
449
        return true;
1446
449
    }
1447
0
    else
1448
0
        return false;
1449
449
}
1450
1451
SvxParaGridItem::SvxParaGridItem( bool bOn, const sal_uInt16 nId )
1452
27.8k
    : SfxBoolItem( nId, bOn )
1453
27.8k
{
1454
27.8k
}
1455
1456
SvxParaGridItem* SvxParaGridItem::Clone( SfxItemPool * ) const
1457
204k
{
1458
204k
    return new SvxParaGridItem( *this );
1459
204k
}
1460
1461
bool SvxParaGridItem::GetPresentation(
1462
        SfxItemPresentation /*ePres*/,
1463
        MapUnit /*eCoreMetric*/, MapUnit /*ePresMetric*/,
1464
        OUString &rText, const IntlWrapper& /*rIntl*/ ) const
1465
0
{
1466
0
    rText = GetValue() ?
1467
0
            EditResId( RID_SVXITEMS_PARASNAPTOGRID_ON ) :
1468
0
            EditResId( RID_SVXITEMS_PARASNAPTOGRID_OFF );
1469
1470
0
    return true;
1471
0
}
1472
1473
1474
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */