1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #ifndef INCLUDED_EDITENG_BORDERLINE_HXX
21 #define INCLUDED_EDITENG_BORDERLINE_HXX
23 #include <com/sun/star/table/BorderLineStyle.hpp>
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>
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
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
47 // Abstracts over values from css::table::BorderLineStyle
48 enum class SvxBorderLineStyle
: sal_Int16
52 NONE
= css::table::BorderLineStyle::NONE
,
54 /** Solid border line.
56 SOLID
= css::table::BorderLineStyle::SOLID
,
58 /** Dotted border line.
60 DOTTED
= css::table::BorderLineStyle::DOTTED
,
62 /** Dashed border line.
64 DASHED
= css::table::BorderLineStyle::DASHED
,
66 /** Double border line. Widths of the lines and the gap are all equal,
67 and vary equally with the total width.
69 DOUBLE
= css::table::BorderLineStyle::DOUBLE
,
71 /** Double border line with a thin line outside and a thick line
72 inside separated by a small gap.
74 THINTHICK_SMALLGAP
= css::table::BorderLineStyle::THINTHICK_SMALLGAP
,
76 /** Double border line with a thin line outside and a thick line
77 inside separated by a medium gap.
79 THINTHICK_MEDIUMGAP
= css::table::BorderLineStyle::THINTHICK_MEDIUMGAP
,
81 /** Double border line with a thin line outside and a thick line
82 inside separated by a large gap.
84 THINTHICK_LARGEGAP
= css::table::BorderLineStyle::THINTHICK_LARGEGAP
,
86 /** Double border line with a thick line outside and a thin line
87 inside separated by a small gap.
89 THICKTHIN_SMALLGAP
= css::table::BorderLineStyle::THICKTHIN_SMALLGAP
,
91 /** Double border line with a thick line outside and a thin line
92 inside separated by a medium gap.
94 THICKTHIN_MEDIUMGAP
= css::table::BorderLineStyle::THICKTHIN_MEDIUMGAP
,
96 /** Double border line with a thick line outside and a thin line
97 inside separated by a large gap.
99 THICKTHIN_LARGEGAP
= css::table::BorderLineStyle::THICKTHIN_LARGEGAP
,
101 /** 3D embossed border line.
103 EMBOSSED
= css::table::BorderLineStyle::EMBOSSED
,
105 /** 3D engraved border line.
107 ENGRAVED
= css::table::BorderLineStyle::ENGRAVED
,
109 /** Outset border line.
111 OUTSET
= css::table::BorderLineStyle::OUTSET
,
113 /** Inset border line.
115 INSET
= css::table::BorderLineStyle::INSET
,
117 /** Finely dashed border line.
119 FINE_DASHED
= css::table::BorderLineStyle::FINE_DASHED
,
121 /** Double border line consisting of two fixed thin lines separated by a
124 DOUBLE_THIN
= css::table::BorderLineStyle::DOUBLE_THIN
,
126 /** Line consisting of a repetition of one dash and one dot. */
127 DASH_DOT
= css::table::BorderLineStyle::DASH_DOT
,
129 /** Line consisting of a repetition of one dash and 2 dots. */
130 DASH_DOT_DOT
= css::table::BorderLineStyle::DASH_DOT_DOT
,
132 /** Maximum valid border line style value.
134 BORDER_LINE_STYLE_MAX
= css::table::BorderLineStyle::BORDER_LINE_STYLE_MAX
,
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
,
147 class EDITENG_DLLPUBLIC SvxBorderLine final
149 tools::Long m_nWidth
;
152 Color (*m_pColorOutFn
)(Color
);
153 Color (*m_pColorInFn
)(Color
);
154 Color (*m_pColorGapFn
)(Color
);
155 BorderWidthImpl m_aWidthImpl
;
157 model::ComplexColor m_aComplexColor
;
158 SvxBorderLineStyle m_nStyle
;
159 bool m_bMirrorWidths
;
163 SvxBorderLine( const Color
*pCol
= nullptr,
164 tools::Long nWidth
= 0,
165 SvxBorderLineStyle nStyle
= SvxBorderLineStyle::SOLID
,
166 Color (*pColorOutFn
)( Color
) = &darkColor
,
167 Color (*pColorInFn
)( Color
) = &darkColor
);
169 const Color
& GetColor() const { return m_aColor
; }
170 void SetColor(const Color
& rColor
) { m_aColor
= rColor
; }
172 model::ComplexColor
const& getComplexColor() const
174 auto pUnConst
= const_cast<SvxBorderLine
*>(this);
175 pUnConst
->m_aComplexColor
.setFinalColor(GetColor());
176 return m_aComplexColor
;
179 void setComplexColor(model::ComplexColor
const& rComplexColor
)
181 m_aComplexColor
= rComplexColor
;
184 bool setComplexColorFromAny(css::uno::Any
const& rValue
);
187 Color
GetColorOut( bool bLeftOrTop
= true ) const;
188 Color
GetColorIn( bool bLeftOrTop
= true ) const;
189 bool HasGapColor() const { return m_pColorGapFn
!= nullptr; }
190 Color
GetColorGap() const;
192 void SetWidth( tools::Long nWidth
);
193 /** Guess the style and width from the three lines widths values.
195 When the value of nStyle is SvxBorderLine::DOUBLE, the style set will be guessed
196 using the three values to match the best possible style among the following:
197 - SvxBorderLine::DOUBLE
198 - SvxBorderLine::THINTHICK_SMALLGAP
199 - SvxBorderLine::THINTHICK_MEDIUMGAP
200 - SvxBorderLine::THINTHICK_LARGEGAP
201 - SvxBorderLine::THICKTHIN_SMALLGAP
202 - SvxBorderLine::THICKTHIN_MEDIUMGAP
203 - SvxBorderLine::THICKTHIN_LARGEGAP
205 If no styles matches the width, then the width is set to 0.
207 There is one known case that could fit several styles: \a nIn = \a nDist = 0.75 pt,
208 \a nOut = 1.5 pt. This case fits SvxBorderLine::THINTHICK_SMALLGAP and
209 SvxBorderLine::THINTHICK_MEDIUMGAP with a 1.5 pt width and
210 SvxBorderLine::THINTHICK_LARGEGAP with a 0.75 pt width. The same case happens
211 also for thick-thin styles.
213 \param nStyle the border style used to guess the width.
214 \param nIn the width of the inner line in 1th pt
215 \param nOut the width of the outer line in 1th pt
216 \param nDist the width of the gap between the lines in 1th pt
218 void GuessLinesWidths( SvxBorderLineStyle nStyle
, sal_uInt16 nOut
, sal_uInt16 nIn
= 0, sal_uInt16 nDist
= 0 );
220 // TODO Hacky method to mirror lines in only a few cases
221 void SetMirrorWidths() { m_bMirrorWidths
= true; }
222 tools::Long
GetWidth( ) const { return m_nWidth
; }
223 sal_uInt16
GetOutWidth() const;
224 sal_uInt16
GetInWidth() const;
225 sal_uInt16
GetDistance() const;
227 SvxBorderLineStyle
GetBorderLineStyle() const { return m_nStyle
; }
229 void SetBorderLineStyle( SvxBorderLineStyle nNew
);
230 void ScaleMetrics( tools::Long nMult
, tools::Long nDiv
);
232 bool operator==( const SvxBorderLine
&rCmp
) const;
234 OUString
GetValueString( MapUnit eSrcUnit
, MapUnit eDestUnit
,
235 const IntlWrapper
* pIntl
,
236 bool bMetricStr
= false ) const;
238 bool HasPriority( const SvxBorderLine
& rOtherLine
) const;
240 bool isEmpty() const {
241 return m_aWidthImpl
.IsEmpty()
242 || m_nStyle
== SvxBorderLineStyle::NONE
245 bool isDouble() const { return m_aWidthImpl
.IsDouble(); }
246 sal_uInt16
GetScaledWidth() const { return GetOutWidth() + GetInWidth() + GetDistance(); }
248 static Color
darkColor( Color aMain
);
249 static Color
lightColor( Color aMain
);
251 static Color
threeDLightColor( Color aMain
);
252 static Color
threeDMediumColor( Color aMain
);
253 static Color
threeDDarkColor( Color aMain
);
255 static BorderWidthImpl
getWidthImpl( SvxBorderLineStyle nStyle
);
258 EDITENG_DLLPUBLIC
bool operator!=( const SvxBorderLine
& rLeft
, const SvxBorderLine
& rRight
);
260 } // namespace editeng