Coverage Report

Created: 2026-09-28 10:59

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libreoffice/include/editeng/borderline.hxx
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
#ifndef INCLUDED_EDITENG_BORDERLINE_HXX
21
#define INCLUDED_EDITENG_BORDERLINE_HXX
22
23
#include <com/sun/star/table/BorderLineStyle.hpp>
24
25
#include <tools/color.hxx>
26
#include <tools/long.hxx>
27
#include <tools/mapunit.hxx>
28
#include <editeng/editengdllapi.h>
29
#include <svtools/borderline.hxx>
30
#include <docmodel/color/ComplexColor.hxx>
31
32
class IntlWrapper;
33
34
// Line width defaults in twips
35
// Thin matches Excel's default values
36
// See tdf#48622 for the discussion leading to these defaults.
37
namespace SvxBorderLineWidth
38
{
39
constexpr inline sal_Int16 Hairline = 1; // 0.05pt
40
constexpr inline sal_Int16 VeryThin = 10; // 0.5pt
41
constexpr inline sal_Int16 Thin = 15; // 0.75pt
42
constexpr inline sal_Int16 Medium = 30; // 1.5pt
43
constexpr inline sal_Int16 Thick = 45; // 2.25pt
44
constexpr inline sal_Int16 ExtraThick = 90; // 4.5pt
45
};
46
47
// Abstracts over values from css::table::BorderLineStyle
48
enum class SvxBorderLineStyle : sal_Int16
49
{
50
    /** No border line
51
     */
52
    NONE = css::table::BorderLineStyle::NONE,
53
54
    /** Solid border line.
55
     */
56
    SOLID = css::table::BorderLineStyle::SOLID,
57
58
    /** Dotted border line.
59
     */
60
    DOTTED = css::table::BorderLineStyle::DOTTED,
61
62
    /** Dashed border line.
63
     */
64
    DASHED = css::table::BorderLineStyle::DASHED,
65
66
    /** Double border line. Widths of the lines and the gap are all equal,
67
        and vary equally with the total width.
68
     */
69
    DOUBLE = css::table::BorderLineStyle::DOUBLE,
70
71
    /** Double border line with a thin line outside and a thick line
72
        inside separated by a small gap.
73
     */
74
    THINTHICK_SMALLGAP = css::table::BorderLineStyle::THINTHICK_SMALLGAP,
75
76
    /** Double border line with a thin line outside and a thick line
77
        inside separated by a medium gap.
78
     */
79
    THINTHICK_MEDIUMGAP = css::table::BorderLineStyle::THINTHICK_MEDIUMGAP,
80
81
    /** Double border line with a thin line outside and a thick line
82
        inside separated by a large gap.
83
     */
84
    THINTHICK_LARGEGAP = css::table::BorderLineStyle::THINTHICK_LARGEGAP,
85
86
    /** Double border line with a thick line outside and a thin line
87
        inside separated by a small gap.
88
     */
89
    THICKTHIN_SMALLGAP = css::table::BorderLineStyle::THICKTHIN_SMALLGAP,
90
91
    /** Double border line with a thick line outside and a thin line
92
        inside separated by a medium gap.
93
     */
94
    THICKTHIN_MEDIUMGAP = css::table::BorderLineStyle::THICKTHIN_MEDIUMGAP,
95
96
    /** Double border line with a thick line outside and a thin line
97
        inside separated by a large gap.
98
     */
99
    THICKTHIN_LARGEGAP = css::table::BorderLineStyle::THICKTHIN_LARGEGAP,
100
101
    /** 3D embossed border line.
102
     */
103
    EMBOSSED = css::table::BorderLineStyle::EMBOSSED,
104
105
    /** 3D engraved border line.
106
     */
107
    ENGRAVED = css::table::BorderLineStyle::ENGRAVED,
108
109
    /** Outset border line.
110
     */
111
    OUTSET = css::table::BorderLineStyle::OUTSET,
112
113
    /** Inset border line.
114
     */
115
    INSET = css::table::BorderLineStyle::INSET,
116
117
    /** Finely dashed border line.
118
     */
119
    FINE_DASHED = css::table::BorderLineStyle::FINE_DASHED,
120
121
    /** Double border line consisting of two fixed thin lines separated by a
122
        variable gap.
123
     */
124
    DOUBLE_THIN = css::table::BorderLineStyle::DOUBLE_THIN,
125
126
    /** Line consisting of a repetition of one dash and one dot. */
127
    DASH_DOT = css::table::BorderLineStyle::DASH_DOT,
128
129
    /** Line consisting of a repetition of one dash and 2 dots. */
130
    DASH_DOT_DOT = css::table::BorderLineStyle::DASH_DOT_DOT,
131
132
    /** Maximum valid border line style value.
133
     */
134
    BORDER_LINE_STYLE_MAX = css::table::BorderLineStyle::BORDER_LINE_STYLE_MAX,
135
};
136
137
namespace editeng
138
{
139
140
// convert border style between Word formats and LO
141
SvxBorderLineStyle EDITENG_DLLPUBLIC ConvertBorderStyleFromWord(int);
142
/// convert border width in twips between Word formats and LO
143
double EDITENG_DLLPUBLIC ConvertBorderWidthToWord(SvxBorderLineStyle, double);
144
double EDITENG_DLLPUBLIC ConvertBorderWidthFromWord(SvxBorderLineStyle,
145
        double, int);
146
147
class EDITENG_DLLPUBLIC SvxBorderLine final
148
{
149
    tools::Long m_nWidth;
150
    double m_fScale;
151
    Color (*m_pColorOutFn)(Color);
152
    Color (*m_pColorInFn)(Color);
153
    Color (*m_pColorGapFn)(Color);
154
    BorderWidthImpl m_aWidthImpl;
155
    Color m_aColor;
156
    model::ComplexColor m_aComplexColor;
157
    SvxBorderLineStyle   m_nStyle;
158
    bool m_bMirrorWidths;
159
    bool m_bUseLeftTop;
160
161
public:
162
    SvxBorderLine( const Color *pCol = nullptr,
163
            tools::Long nWidth = 0,
164
            SvxBorderLineStyle nStyle = SvxBorderLineStyle::SOLID,
165
            Color (*pColorOutFn)( Color ) = &darkColor,
166
            Color (*pColorInFn)( Color ) = &darkColor );
167
168
13.9k
    const Color & GetColor() const { return m_aColor; }
169
4.64M
    void SetColor(const Color & rColor ) { m_aColor = rColor; }
170
171
    model::ComplexColor const& getComplexColor() const
172
0
    {
173
0
        auto pUnConst = const_cast<SvxBorderLine*>(this);
174
0
        pUnConst->m_aComplexColor.setFinalColor(GetColor());
175
0
        return m_aComplexColor;
176
0
    }
177
178
    void setComplexColor(model::ComplexColor const& rComplexColor)
179
3.99M
    {
180
3.99M
        m_aComplexColor = rComplexColor;
181
3.99M
    }
182
183
    bool setComplexColorFromAny(css::uno::Any const& rValue);
184
185
186
    Color           GetColorOut( bool bLeftOrTop = true ) const;
187
    Color           GetColorIn( bool bLeftOrTop = true ) const;
188
14.0k
    bool            HasGapColor() const { return m_pColorGapFn != nullptr; }
189
    Color           GetColorGap() const;
190
191
    void SetWidth( tools::Long nWidth );
192
    /** Guess the style and width from the three lines widths values.
193
194
        When the value of nStyle is SvxBorderLine::DOUBLE, the style set will be guessed
195
        using the three values to match the best possible style among the following:
196
            - SvxBorderLine::DOUBLE
197
            - SvxBorderLine::THINTHICK_SMALLGAP
198
            - SvxBorderLine::THINTHICK_MEDIUMGAP
199
            - SvxBorderLine::THINTHICK_LARGEGAP
200
            - SvxBorderLine::THICKTHIN_SMALLGAP
201
            - SvxBorderLine::THICKTHIN_MEDIUMGAP
202
            - SvxBorderLine::THICKTHIN_LARGEGAP
203
204
        If no styles matches the width, then the width is set to 0.
205
206
        There is one known case that could fit several styles: \a nIn = \a nDist = 0.75 pt,
207
        \a nOut = 1.5 pt. This case fits SvxBorderLine::THINTHICK_SMALLGAP and
208
        SvxBorderLine::THINTHICK_MEDIUMGAP with a 1.5 pt width and
209
        SvxBorderLine::THINTHICK_LARGEGAP with a 0.75 pt width. The same case happens
210
        also for thick-thin styles.
211
212
        \param nStyle the border style used to guess the width.
213
        \param nIn the width of the inner line in 1th pt
214
        \param nOut the width of the outer line in 1th pt
215
        \param nDist the width of the gap between the lines in 1th pt
216
     */
217
    void            GuessLinesWidths( SvxBorderLineStyle nStyle, sal_uInt16 nOut, sal_uInt16 nIn = 0, sal_uInt16 nDist = 0 );
218
219
    // TODO Hacky method to mirror lines in only a few cases
220
0
    void            SetMirrorWidths() { m_bMirrorWidths = true; }
221
121k
    tools::Long            GetWidth( ) const { return m_nWidth; }
222
    sal_uInt16      GetOutWidth() const;
223
    sal_uInt16      GetInWidth() const;
224
    sal_uInt16      GetDistance() const;
225
226
9.38M
    SvxBorderLineStyle  GetBorderLineStyle() const { return m_nStyle; }
227
228
    void            SetBorderLineStyle( SvxBorderLineStyle nNew );
229
    void            ScaleMetrics( double fScale );
230
231
    bool            operator==( const SvxBorderLine &rCmp ) const;
232
233
    OUString        GetValueString( MapUnit eSrcUnit, MapUnit eDestUnit,
234
                                    const IntlWrapper* pIntl,
235
                                    bool bMetricStr = false ) const;
236
237
    bool            HasPriority( const SvxBorderLine& rOtherLine ) const;
238
239
4.23M
    bool isEmpty() const {
240
4.23M
        return m_aWidthImpl.IsEmpty()
241
4.23M
            || m_nStyle == SvxBorderLineStyle::NONE
242
4.23M
            || m_nWidth == 0;
243
4.23M
    }
244
0
    bool isDouble() const { return m_aWidthImpl.IsDouble(); }
245
24.9k
    sal_uInt16 GetScaledWidth() const { return GetOutWidth() + GetInWidth() + GetDistance(); }
246
247
    static Color darkColor( Color aMain );
248
    static Color lightColor( Color aMain );
249
250
    static Color threeDLightColor( Color aMain );
251
    static Color threeDMediumColor( Color aMain );
252
    static Color threeDDarkColor( Color aMain );
253
254
    static BorderWidthImpl getWidthImpl( SvxBorderLineStyle nStyle );
255
};
256
257
EDITENG_DLLPUBLIC bool operator!=( const SvxBorderLine& rLeft, const SvxBorderLine& rRight );
258
259
} // namespace editeng
260
261
#endif