1947ba26bSStephan Aßmus/*
2947ba26bSStephan Aßmus * Copyright 2013, Stephan A��mus <superstippi@gmx.de>.
3947ba26bSStephan Aßmus * All rights reserved. Distributed under the terms of the MIT License.
4947ba26bSStephan Aßmus */
5947ba26bSStephan Aßmus
6947ba26bSStephan Aßmus#include "CharacterStyleData.h"
7947ba26bSStephan Aßmus
8947ba26bSStephan Aßmus#include <new>
9947ba26bSStephan Aßmus
10947ba26bSStephan Aßmus
11947ba26bSStephan AßmusCharacterStyleData::CharacterStyleData()
12947ba26bSStephan Aßmus	:
13947ba26bSStephan Aßmus	fFont(),
14947ba26bSStephan Aßmus
15947ba26bSStephan Aßmus	fAscent(-1.0f),
16947ba26bSStephan Aßmus	fDescent(-1.0f),
17947ba26bSStephan Aßmus	fWidth(-1.0f),
18947ba26bSStephan Aßmus
19947ba26bSStephan Aßmus	fGlyphSpacing(0.0f),
20947ba26bSStephan Aßmus
21fa19dd44Slooncraz	fWhichFgColor(B_PANEL_TEXT_COLOR),
22fa19dd44Slooncraz	fWhichBgColor(B_PANEL_BACKGROUND_COLOR),
23fa19dd44Slooncraz	fWhichStrikeOutColor(fWhichFgColor),
24fa19dd44Slooncraz	fWhichUnderlineColor(fWhichFgColor),
25fa19dd44Slooncraz
26fa19dd44Slooncraz	fFgColor(ui_color(fWhichFgColor)),
27fa19dd44Slooncraz	fBgColor(ui_color(fWhichBgColor)),
28fa19dd44Slooncraz	fStrikeOutColor(fFgColor),
29fa19dd44Slooncraz	fUnderlineColor(fFgColor),
30947ba26bSStephan Aßmus
31947ba26bSStephan Aßmus	fStrikeOutStyle(STRIKE_OUT_NONE),
32947ba26bSStephan Aßmus	fUnderlineStyle(UNDERLINE_NONE)
33947ba26bSStephan Aßmus{
34947ba26bSStephan Aßmus}
35947ba26bSStephan Aßmus
36947ba26bSStephan Aßmus
37947ba26bSStephan AßmusCharacterStyleData::CharacterStyleData(const CharacterStyleData& other)
38947ba26bSStephan Aßmus	:
39947ba26bSStephan Aßmus	fFont(other.fFont),
40947ba26bSStephan Aßmus
41947ba26bSStephan Aßmus	fAscent(other.fAscent),
42947ba26bSStephan Aßmus	fDescent(other.fDescent),
43947ba26bSStephan Aßmus	fWidth(other.fWidth),
44947ba26bSStephan Aßmus
45947ba26bSStephan Aßmus	fGlyphSpacing(other.fGlyphSpacing),
46947ba26bSStephan Aßmus
47fa19dd44Slooncraz	fWhichFgColor(other.fWhichFgColor),
48fa19dd44Slooncraz	fWhichBgColor(other.fWhichBgColor),
49fa19dd44Slooncraz	fWhichStrikeOutColor(other.fWhichStrikeOutColor),
50fa19dd44Slooncraz	fWhichUnderlineColor(other.fWhichUnderlineColor),
51fa19dd44Slooncraz
52947ba26bSStephan Aßmus	fFgColor(other.fFgColor),
53947ba26bSStephan Aßmus	fBgColor(other.fBgColor),
54947ba26bSStephan Aßmus	fStrikeOutColor(other.fStrikeOutColor),
55947ba26bSStephan Aßmus	fUnderlineColor(other.fUnderlineColor),
56947ba26bSStephan Aßmus
57947ba26bSStephan Aßmus	fStrikeOutStyle(other.fStrikeOutStyle),
58947ba26bSStephan Aßmus	fUnderlineStyle(other.fUnderlineStyle)
59947ba26bSStephan Aßmus{
60947ba26bSStephan Aßmus}
61947ba26bSStephan Aßmus
62947ba26bSStephan Aßmus
63947ba26bSStephan Aßmusbool
64947ba26bSStephan AßmusCharacterStyleData::operator==(const CharacterStyleData& other) const
65947ba26bSStephan Aßmus{
66947ba26bSStephan Aßmus	if (this == &other)
67947ba26bSStephan Aßmus		return true;
68947ba26bSStephan Aßmus
69947ba26bSStephan Aßmus	return fFont == other.fFont
70947ba26bSStephan Aßmus		&& fAscent == other.fAscent
71947ba26bSStephan Aßmus		&& fDescent == other.fDescent
72947ba26bSStephan Aßmus		&& fWidth == other.fWidth
73947ba26bSStephan Aßmus
74947ba26bSStephan Aßmus		&& fGlyphSpacing == other.fGlyphSpacing
75947ba26bSStephan Aßmus
76fa19dd44Slooncraz		&& fWhichFgColor == other.fWhichFgColor
77fa19dd44Slooncraz		&& fWhichBgColor == other.fWhichBgColor
78fa19dd44Slooncraz		&& fWhichStrikeOutColor == other.fWhichStrikeOutColor
79fa19dd44Slooncraz		&& fWhichUnderlineColor == other.fWhichUnderlineColor
80fa19dd44Slooncraz
81947ba26bSStephan Aßmus		&& fFgColor == other.fFgColor
82947ba26bSStephan Aßmus		&& fBgColor == other.fBgColor
83947ba26bSStephan Aßmus		&& fStrikeOutColor == other.fStrikeOutColor
84947ba26bSStephan Aßmus		&& fUnderlineColor == other.fUnderlineColor
85947ba26bSStephan Aßmus
86947ba26bSStephan Aßmus		&& fStrikeOutStyle == other.fStrikeOutStyle
87947ba26bSStephan Aßmus		&& fUnderlineStyle == other.fUnderlineStyle;
88947ba26bSStephan Aßmus}
89947ba26bSStephan Aßmus
90947ba26bSStephan Aßmus
91947ba26bSStephan Aßmusbool
92947ba26bSStephan AßmusCharacterStyleData::operator!=(const CharacterStyleData& other) const
93947ba26bSStephan Aßmus{
94947ba26bSStephan Aßmus	return !(*this == other);
95947ba26bSStephan Aßmus}
96947ba26bSStephan Aßmus
97947ba26bSStephan Aßmus
98947ba26bSStephan AßmusCharacterStyleDataRef
99947ba26bSStephan AßmusCharacterStyleData::SetFont(const BFont& font)
100947ba26bSStephan Aßmus{
101947ba26bSStephan Aßmus	if (fFont == font)
102947ba26bSStephan Aßmus		return CharacterStyleDataRef(this);
103947ba26bSStephan Aßmus
104947ba26bSStephan Aßmus	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
105947ba26bSStephan Aßmus	if (ret == NULL)
106947ba26bSStephan Aßmus		return CharacterStyleDataRef(this);
107947ba26bSStephan Aßmus
108947ba26bSStephan Aßmus	ret->fFont = font;
109947ba26bSStephan Aßmus	return CharacterStyleDataRef(ret, true);
110947ba26bSStephan Aßmus}
111947ba26bSStephan Aßmus
112947ba26bSStephan Aßmus
113947ba26bSStephan AßmusCharacterStyleDataRef
114947ba26bSStephan AßmusCharacterStyleData::SetAscent(float ascent)
115947ba26bSStephan Aßmus{
116947ba26bSStephan Aßmus	if (fAscent == ascent)
117947ba26bSStephan Aßmus		return CharacterStyleDataRef(this);
118947ba26bSStephan Aßmus
119947ba26bSStephan Aßmus	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
120947ba26bSStephan Aßmus	if (ret == NULL)
121947ba26bSStephan Aßmus		return CharacterStyleDataRef(this);
122947ba26bSStephan Aßmus
123947ba26bSStephan Aßmus	ret->fAscent = ascent;
124947ba26bSStephan Aßmus	return CharacterStyleDataRef(ret, true);
125947ba26bSStephan Aßmus}
126947ba26bSStephan Aßmus
127947ba26bSStephan Aßmus
128d922357fSStephan Aßmusfloat
129d922357fSStephan AßmusCharacterStyleData::Ascent() const
130d922357fSStephan Aßmus{
131d922357fSStephan Aßmus	if (fAscent >= 0.0f)
132d922357fSStephan Aßmus		return fAscent;
133d922357fSStephan Aßmus
134d922357fSStephan Aßmus	font_height fontHeight;
135d922357fSStephan Aßmus	fFont.GetHeight(&fontHeight);
136d922357fSStephan Aßmus	return fontHeight.ascent;
137d922357fSStephan Aßmus}
138d922357fSStephan Aßmus
139d922357fSStephan Aßmus
140947ba26bSStephan AßmusCharacterStyleDataRef
141947ba26bSStephan AßmusCharacterStyleData::SetDescent(float descent)
142947ba26bSStephan Aßmus{
143947ba26bSStephan Aßmus	if (fDescent == descent)
144947ba26bSStephan Aßmus		return CharacterStyleDataRef(this);
145947ba26bSStephan Aßmus
146947ba26bSStephan Aßmus	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
147947ba26bSStephan Aßmus	if (ret == NULL)
148947ba26bSStephan Aßmus		return CharacterStyleDataRef(this);
149947ba26bSStephan Aßmus
150947ba26bSStephan Aßmus	ret->fDescent = descent;
151947ba26bSStephan Aßmus	return CharacterStyleDataRef(ret, true);
152947ba26bSStephan Aßmus}
153947ba26bSStephan Aßmus
154947ba26bSStephan Aßmus
155d922357fSStephan Aßmusfloat
156d922357fSStephan AßmusCharacterStyleData::Descent() const
157d922357fSStephan Aßmus{
158d922357fSStephan Aßmus	if (fDescent >= 0.0f)
159d922357fSStephan Aßmus		return fDescent;
160d922357fSStephan Aßmus
161d922357fSStephan Aßmus	font_height fontHeight;
162d922357fSStephan Aßmus	fFont.GetHeight(&fontHeight);
163d922357fSStephan Aßmus	return fontHeight.descent;
164d922357fSStephan Aßmus}
165d922357fSStephan Aßmus
166d922357fSStephan Aßmus
167947ba26bSStephan AßmusCharacterStyleDataRef
168947ba26bSStephan AßmusCharacterStyleData::SetWidth(float width)
169947ba26bSStephan Aßmus{
170947ba26bSStephan Aßmus	if (fWidth == width)
171947ba26bSStephan Aßmus		return CharacterStyleDataRef(this);
172947ba26bSStephan Aßmus
173947ba26bSStephan Aßmus	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
174947ba26bSStephan Aßmus	if (ret == NULL)
175947ba26bSStephan Aßmus		return CharacterStyleDataRef(this);
176947ba26bSStephan Aßmus
177947ba26bSStephan Aßmus	ret->fWidth = width;
178947ba26bSStephan Aßmus	return CharacterStyleDataRef(ret, true);
179947ba26bSStephan Aßmus}
180947ba26bSStephan Aßmus
181947ba26bSStephan Aßmus
1822b7ea89dSStephan AßmusCharacterStyleDataRef
1832b7ea89dSStephan AßmusCharacterStyleData::SetGlyphSpacing(float glyphSpacing)
1842b7ea89dSStephan Aßmus{
1852b7ea89dSStephan Aßmus	if (fGlyphSpacing == glyphSpacing)
1862b7ea89dSStephan Aßmus		return CharacterStyleDataRef(this);
1872b7ea89dSStephan Aßmus
1882b7ea89dSStephan Aßmus	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
1892b7ea89dSStephan Aßmus	if (ret == NULL)
1902b7ea89dSStephan Aßmus		return CharacterStyleDataRef(this);
1912b7ea89dSStephan Aßmus
1922b7ea89dSStephan Aßmus	ret->fGlyphSpacing = glyphSpacing;
1932b7ea89dSStephan Aßmus	return CharacterStyleDataRef(ret, true);
1942b7ea89dSStephan Aßmus}
1952b7ea89dSStephan Aßmus
1962b7ea89dSStephan Aßmus
197fa19dd44SlooncrazCharacterStyleDataRef
198fa19dd44SlooncrazCharacterStyleData::SetForegroundColor(color_which which)
199fa19dd44Slooncraz{
200fa19dd44Slooncraz	if (fWhichFgColor == which)
201fa19dd44Slooncraz		return CharacterStyleDataRef(this);
202fa19dd44Slooncraz
203fa19dd44Slooncraz	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
204fa19dd44Slooncraz	if (ret == NULL)
205fa19dd44Slooncraz		return CharacterStyleDataRef(this);
206fa19dd44Slooncraz
207fa19dd44Slooncraz	ret->fWhichFgColor = which;
208fa19dd44Slooncraz	return CharacterStyleDataRef(ret, true);
209fa19dd44Slooncraz}
210fa19dd44Slooncraz
211fa19dd44Slooncraz
212947ba26bSStephan AßmusCharacterStyleDataRef
213947ba26bSStephan AßmusCharacterStyleData::SetForegroundColor(rgb_color color)
214947ba26bSStephan Aßmus{
215947ba26bSStephan Aßmus	if (fFgColor == color)
216947ba26bSStephan Aßmus		return CharacterStyleDataRef(this);
217947ba26bSStephan Aßmus
218947ba26bSStephan Aßmus	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
219947ba26bSStephan Aßmus	if (ret == NULL)
220947ba26bSStephan Aßmus		return CharacterStyleDataRef(this);
221947ba26bSStephan Aßmus
222947ba26bSStephan Aßmus	ret->fFgColor = color;
223fa19dd44Slooncraz	ret->fWhichFgColor = B_NO_COLOR;
224fa19dd44Slooncraz	return CharacterStyleDataRef(ret, true);
225fa19dd44Slooncraz}
226fa19dd44Slooncraz
227fa19dd44Slooncraz
228fa19dd44SlooncrazCharacterStyleDataRef
229fa19dd44SlooncrazCharacterStyleData::SetBackgroundColor(color_which which)
230fa19dd44Slooncraz{
231fa19dd44Slooncraz	if (fWhichBgColor == which)
232fa19dd44Slooncraz		return CharacterStyleDataRef(this);
233fa19dd44Slooncraz
234fa19dd44Slooncraz	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
235fa19dd44Slooncraz	if (ret == NULL)
236fa19dd44Slooncraz		return CharacterStyleDataRef(this);
237fa19dd44Slooncraz
238fa19dd44Slooncraz	ret->fWhichBgColor = which;
239947ba26bSStephan Aßmus	return CharacterStyleDataRef(ret, true);
240947ba26bSStephan Aßmus}
241947ba26bSStephan Aßmus
242947ba26bSStephan Aßmus
243947ba26bSStephan AßmusCharacterStyleDataRef
244947ba26bSStephan AßmusCharacterStyleData::SetBackgroundColor(rgb_color color)
245947ba26bSStephan Aßmus{
246947ba26bSStephan Aßmus	if (fBgColor == color)
247947ba26bSStephan Aßmus		return CharacterStyleDataRef(this);
248947ba26bSStephan Aßmus
249947ba26bSStephan Aßmus	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
250947ba26bSStephan Aßmus	if (ret == NULL)
251947ba26bSStephan Aßmus		return CharacterStyleDataRef(this);
252947ba26bSStephan Aßmus
253947ba26bSStephan Aßmus	ret->fBgColor = color;
254fa19dd44Slooncraz	ret->fWhichBgColor = B_NO_COLOR;
255fa19dd44Slooncraz	return CharacterStyleDataRef(ret, true);
256fa19dd44Slooncraz}
257fa19dd44Slooncraz
258fa19dd44Slooncraz
259fa19dd44SlooncrazCharacterStyleDataRef
260fa19dd44SlooncrazCharacterStyleData::SetStrikeOutColor(color_which which)
261fa19dd44Slooncraz{
262fa19dd44Slooncraz	if (fWhichStrikeOutColor == which)
263fa19dd44Slooncraz		return CharacterStyleDataRef(this);
264fa19dd44Slooncraz
265fa19dd44Slooncraz	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
266fa19dd44Slooncraz	if (ret == NULL)
267fa19dd44Slooncraz		return CharacterStyleDataRef(this);
268fa19dd44Slooncraz
269fa19dd44Slooncraz	ret->fWhichStrikeOutColor = which;
270947ba26bSStephan Aßmus	return CharacterStyleDataRef(ret, true);
271947ba26bSStephan Aßmus}
272947ba26bSStephan Aßmus
273947ba26bSStephan Aßmus
274947ba26bSStephan AßmusCharacterStyleDataRef
275947ba26bSStephan AßmusCharacterStyleData::SetStrikeOutColor(rgb_color color)
276947ba26bSStephan Aßmus{
277947ba26bSStephan Aßmus	if (fStrikeOutColor == color)
278947ba26bSStephan Aßmus		return CharacterStyleDataRef(this);
279947ba26bSStephan Aßmus
280947ba26bSStephan Aßmus	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
281947ba26bSStephan Aßmus	if (ret == NULL)
282947ba26bSStephan Aßmus		return CharacterStyleDataRef(this);
283947ba26bSStephan Aßmus
284947ba26bSStephan Aßmus	ret->fStrikeOutColor = color;
285fa19dd44Slooncraz	ret->fWhichStrikeOutColor = B_NO_COLOR;
286fa19dd44Slooncraz	return CharacterStyleDataRef(ret, true);
287fa19dd44Slooncraz}
288fa19dd44Slooncraz
289fa19dd44Slooncraz
290fa19dd44SlooncrazCharacterStyleDataRef
291fa19dd44SlooncrazCharacterStyleData::SetUnderlineColor(color_which which)
292fa19dd44Slooncraz{
293fa19dd44Slooncraz	if (fWhichUnderlineColor == which)
294fa19dd44Slooncraz		return CharacterStyleDataRef(this);
295fa19dd44Slooncraz
296fa19dd44Slooncraz	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
297fa19dd44Slooncraz	if (ret == NULL)
298fa19dd44Slooncraz		return CharacterStyleDataRef(this);
299fa19dd44Slooncraz
300fa19dd44Slooncraz	ret->fWhichUnderlineColor = which;
301947ba26bSStephan Aßmus	return CharacterStyleDataRef(ret, true);
302947ba26bSStephan Aßmus}
303947ba26bSStephan Aßmus
304947ba26bSStephan Aßmus
305947ba26bSStephan AßmusCharacterStyleDataRef
306947ba26bSStephan AßmusCharacterStyleData::SetUnderlineColor(rgb_color color)
307947ba26bSStephan Aßmus{
308947ba26bSStephan Aßmus	if (fUnderlineColor == color)
309947ba26bSStephan Aßmus		return CharacterStyleDataRef(this);
310947ba26bSStephan Aßmus
311947ba26bSStephan Aßmus	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
312947ba26bSStephan Aßmus	if (ret == NULL)
313947ba26bSStephan Aßmus		return CharacterStyleDataRef(this);
314947ba26bSStephan Aßmus
315947ba26bSStephan Aßmus	ret->fUnderlineColor = color;
316fa19dd44Slooncraz	ret->fWhichUnderlineColor = B_NO_COLOR;
317947ba26bSStephan Aßmus	return CharacterStyleDataRef(ret, true);
318947ba26bSStephan Aßmus}
319947ba26bSStephan Aßmus
320947ba26bSStephan Aßmus
321947ba26bSStephan AßmusCharacterStyleDataRef
322947ba26bSStephan AßmusCharacterStyleData::SetStrikeOut(uint8 strikeOut)
323947ba26bSStephan Aßmus{
324947ba26bSStephan Aßmus	if (fStrikeOutStyle == strikeOut)
325947ba26bSStephan Aßmus		return CharacterStyleDataRef(this);
326947ba26bSStephan Aßmus
327947ba26bSStephan Aßmus	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
328947ba26bSStephan Aßmus	if (ret == NULL)
329947ba26bSStephan Aßmus		return CharacterStyleDataRef(this);
330947ba26bSStephan Aßmus
331947ba26bSStephan Aßmus	ret->fStrikeOutStyle = strikeOut;
332947ba26bSStephan Aßmus	return CharacterStyleDataRef(ret, true);
333947ba26bSStephan Aßmus}
334947ba26bSStephan Aßmus
335947ba26bSStephan Aßmus
336947ba26bSStephan AßmusCharacterStyleDataRef
337947ba26bSStephan AßmusCharacterStyleData::SetUnderline(uint8 underline)
338947ba26bSStephan Aßmus{
339947ba26bSStephan Aßmus	if (fUnderlineStyle == underline)
340947ba26bSStephan Aßmus		return CharacterStyleDataRef(this);
341947ba26bSStephan Aßmus
342947ba26bSStephan Aßmus	CharacterStyleData* ret = new(std::nothrow) CharacterStyleData(*this);
343947ba26bSStephan Aßmus	if (ret == NULL)
344947ba26bSStephan Aßmus		return CharacterStyleDataRef(this);
345947ba26bSStephan Aßmus
346947ba26bSStephan Aßmus	ret->fUnderlineStyle = underline;
347947ba26bSStephan Aßmus	return CharacterStyleDataRef(ret, true);
348947ba26bSStephan Aßmus}
349947ba26bSStephan Aßmus
350947ba26bSStephan Aßmus
351947ba26bSStephan Aßmus// #pragma mark - private
352947ba26bSStephan Aßmus
353947ba26bSStephan Aßmus
354947ba26bSStephan AßmusCharacterStyleData&
355947ba26bSStephan AßmusCharacterStyleData::operator=(const CharacterStyleData& other)
356947ba26bSStephan Aßmus{
357947ba26bSStephan Aßmus	return *this;
358947ba26bSStephan Aßmus}
359d94326b1SStephan Aßmus
360