1/*
2 * Copyright 2013, Stephan Aßmus <superstippi@gmx.de>.
3 * All rights reserved. Distributed under the terms of the MIT License.
4 */
5
6#include "CharacterStyleData.h"
7
8#include <new>
9
10
11CharacterStyleData::CharacterStyleData()
12	:
13	fFont(),
14
15	fAscent(-1.0f),
16	fDescent(-1.0f),
17	fWidth(-1.0f),
18
19	fGlyphSpacing(0.0f),
20
21	fWhichFgColor(B_PANEL_TEXT_COLOR),
22	fWhichBgColor(B_PANEL_BACKGROUND_COLOR),
23	fWhichStrikeOutColor(fWhichFgColor),
24	fWhichUnderlineColor(fWhichFgColor),
25
26	fFgColor(ui_color(fWhichFgColor)),
27	fBgColor(ui_color(fWhichBgColor)),
28	fStrikeOutColor(fFgColor),
29	fUnderlineColor(fFgColor),
30
31	fStrikeOutStyle(STRIKE_OUT_NONE),
32	fUnderlineStyle(UNDERLINE_NONE)
33{
34}
35
36
37CharacterStyleData::CharacterStyleData(const CharacterStyleData& other)
38	:
39	fFont(other.fFont),
40
41	fAscent(other.fAscent),
42	fDescent(other.fDescent),
43	fWidth(other.fWidth),
44
45	fGlyphSpacing(other.fGlyphSpacing),
46
47	fWhichFgColor(other.fWhichFgColor),
48	fWhichBgColor(other.fWhichBgColor),
49	fWhichStrikeOutColor(other.fWhichStrikeOutColor),
50	fWhichUnderlineColor(other.fWhichUnderlineColor),
51
52	fFgColor(other.fFgColor),
53	fBgColor(other.fBgColor),
54	fStrikeOutColor(other.fStrikeOutColor),
55	fUnderlineColor(other.fUnderlineColor),
56
57	fStrikeOutStyle(other.fStrikeOutStyle),
58	fUnderlineStyle(other.fUnderlineStyle)
59{
60}
61
62
63bool
64CharacterStyleData::operator==(const CharacterStyleData& other) const
65{
66	if (this == &other)
67		return true;
68
69	return fFont == other.fFont
70		&& fAscent == other.fAscent
71		&& fDescent == other.fDescent
72		&& fWidth == other.fWidth
73
74		&& fGlyphSpacing == other.fGlyphSpacing
75
76		&& fWhichFgColor == other.fWhichFgColor
77		&& fWhichBgColor == other.fWhichBgColor
78		&& fWhichStrikeOutColor == other.fWhichStrikeOutColor
79		&& fWhichUnderlineColor == other.fWhichUnderlineColor
80
81		&& fFgColor == other.fFgColor
82		&& fBgColor == other.fBgColor
83		&& fStrikeOutColor == other.fStrikeOutColor
84		&& fUnderlineColor == other.fUnderlineColor
85
86		&& fStrikeOutStyle == other.fStrikeOutStyle
87		&& fUnderlineStyle == other.fUnderlineStyle;
88}
89
90
91bool
92CharacterStyleData::operator!=(const CharacterStyleData& other) const
93{
94	return !(*this == other);
95}
96
97
98CharacterStyleDataRef
99CharacterStyleData::SetFont(const BFont& font)
100{
101	if (fFont == font)
102		return CharacterStyleDataRef(this);
103
104	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
105	if (ret == NULL)
106		return CharacterStyleDataRef(this);
107
108	ret->fFont = font;
109	return CharacterStyleDataRef(ret, true);
110}
111
112
113CharacterStyleDataRef
114CharacterStyleData::SetAscent(float ascent)
115{
116	if (fAscent == ascent)
117		return CharacterStyleDataRef(this);
118
119	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
120	if (ret == NULL)
121		return CharacterStyleDataRef(this);
122
123	ret->fAscent = ascent;
124	return CharacterStyleDataRef(ret, true);
125}
126
127
128float
129CharacterStyleData::Ascent() const
130{
131	if (fAscent >= 0.0f)
132		return fAscent;
133
134	font_height fontHeight;
135	fFont.GetHeight(&fontHeight);
136	return fontHeight.ascent;
137}
138
139
140CharacterStyleDataRef
141CharacterStyleData::SetDescent(float descent)
142{
143	if (fDescent == descent)
144		return CharacterStyleDataRef(this);
145
146	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
147	if (ret == NULL)
148		return CharacterStyleDataRef(this);
149
150	ret->fDescent = descent;
151	return CharacterStyleDataRef(ret, true);
152}
153
154
155float
156CharacterStyleData::Descent() const
157{
158	if (fDescent >= 0.0f)
159		return fDescent;
160
161	font_height fontHeight;
162	fFont.GetHeight(&fontHeight);
163	return fontHeight.descent;
164}
165
166
167CharacterStyleDataRef
168CharacterStyleData::SetWidth(float width)
169{
170	if (fWidth == width)
171		return CharacterStyleDataRef(this);
172
173	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
174	if (ret == NULL)
175		return CharacterStyleDataRef(this);
176
177	ret->fWidth = width;
178	return CharacterStyleDataRef(ret, true);
179}
180
181
182CharacterStyleDataRef
183CharacterStyleData::SetGlyphSpacing(float glyphSpacing)
184{
185	if (fGlyphSpacing == glyphSpacing)
186		return CharacterStyleDataRef(this);
187
188	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
189	if (ret == NULL)
190		return CharacterStyleDataRef(this);
191
192	ret->fGlyphSpacing = glyphSpacing;
193	return CharacterStyleDataRef(ret, true);
194}
195
196
197CharacterStyleDataRef
198CharacterStyleData::SetForegroundColor(color_which which)
199{
200	if (fWhichFgColor == which)
201		return CharacterStyleDataRef(this);
202
203	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
204	if (ret == NULL)
205		return CharacterStyleDataRef(this);
206
207	ret->fWhichFgColor = which;
208	return CharacterStyleDataRef(ret, true);
209}
210
211
212CharacterStyleDataRef
213CharacterStyleData::SetForegroundColor(rgb_color color)
214{
215	if (fFgColor == color)
216		return CharacterStyleDataRef(this);
217
218	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
219	if (ret == NULL)
220		return CharacterStyleDataRef(this);
221
222	ret->fFgColor = color;
223	ret->fWhichFgColor = B_NO_COLOR;
224	return CharacterStyleDataRef(ret, true);
225}
226
227
228CharacterStyleDataRef
229CharacterStyleData::SetBackgroundColor(color_which which)
230{
231	if (fWhichBgColor == which)
232		return CharacterStyleDataRef(this);
233
234	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
235	if (ret == NULL)
236		return CharacterStyleDataRef(this);
237
238	ret->fWhichBgColor = which;
239	return CharacterStyleDataRef(ret, true);
240}
241
242
243CharacterStyleDataRef
244CharacterStyleData::SetBackgroundColor(rgb_color color)
245{
246	if (fBgColor == color)
247		return CharacterStyleDataRef(this);
248
249	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
250	if (ret == NULL)
251		return CharacterStyleDataRef(this);
252
253	ret->fBgColor = color;
254	ret->fWhichBgColor = B_NO_COLOR;
255	return CharacterStyleDataRef(ret, true);
256}
257
258
259CharacterStyleDataRef
260CharacterStyleData::SetStrikeOutColor(color_which which)
261{
262	if (fWhichStrikeOutColor == which)
263		return CharacterStyleDataRef(this);
264
265	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
266	if (ret == NULL)
267		return CharacterStyleDataRef(this);
268
269	ret->fWhichStrikeOutColor = which;
270	return CharacterStyleDataRef(ret, true);
271}
272
273
274CharacterStyleDataRef
275CharacterStyleData::SetStrikeOutColor(rgb_color color)
276{
277	if (fStrikeOutColor == color)
278		return CharacterStyleDataRef(this);
279
280	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
281	if (ret == NULL)
282		return CharacterStyleDataRef(this);
283
284	ret->fStrikeOutColor = color;
285	ret->fWhichStrikeOutColor = B_NO_COLOR;
286	return CharacterStyleDataRef(ret, true);
287}
288
289
290CharacterStyleDataRef
291CharacterStyleData::SetUnderlineColor(color_which which)
292{
293	if (fWhichUnderlineColor == which)
294		return CharacterStyleDataRef(this);
295
296	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
297	if (ret == NULL)
298		return CharacterStyleDataRef(this);
299
300	ret->fWhichUnderlineColor = which;
301	return CharacterStyleDataRef(ret, true);
302}
303
304
305CharacterStyleDataRef
306CharacterStyleData::SetUnderlineColor(rgb_color color)
307{
308	if (fUnderlineColor == color)
309		return CharacterStyleDataRef(this);
310
311	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
312	if (ret == NULL)
313		return CharacterStyleDataRef(this);
314
315	ret->fUnderlineColor = color;
316	ret->fWhichUnderlineColor = B_NO_COLOR;
317	return CharacterStyleDataRef(ret, true);
318}
319
320
321CharacterStyleDataRef
322CharacterStyleData::SetStrikeOut(uint8 strikeOut)
323{
324	if (fStrikeOutStyle == strikeOut)
325		return CharacterStyleDataRef(this);
326
327	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
328	if (ret == NULL)
329		return CharacterStyleDataRef(this);
330
331	ret->fStrikeOutStyle = strikeOut;
332	return CharacterStyleDataRef(ret, true);
333}
334
335
336CharacterStyleDataRef
337CharacterStyleData::SetUnderline(uint8 underline)
338{
339	if (fUnderlineStyle == underline)
340		return CharacterStyleDataRef(this);
341
342	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
343	if (ret == NULL)
344		return CharacterStyleDataRef(this);
345
346	ret->fUnderlineStyle = underline;
347	return CharacterStyleDataRef(ret, true);
348}
349
350
351// #pragma mark - private
352
353
354CharacterStyleData&
355CharacterStyleData::operator=(const CharacterStyleData& other)
356{
357	return *this;
358}
359
360