1/*
2 * Copyright 2007, Haiku. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Michael Pfeiffer
7 */
8
9#include "TestResultItem.h"
10
11const float kDistance = 5;
12
13TestResultItem::TestResultItem(const char* name, BRect bitmapSize)
14	: fName(name)
15	, fBitmapSize(bitmapSize)
16	, fOk(true)
17	, fDirectBitmap(NULL)
18	, fOriginalBitmap(NULL)
19	, fArchivedBitmap(NULL)
20{
21}
22
23TestResultItem::~TestResultItem()
24{
25	delete fDirectBitmap;
26	fDirectBitmap = NULL;
27	delete fOriginalBitmap;
28	fOriginalBitmap = NULL;
29	delete fArchivedBitmap;
30	fArchivedBitmap = NULL;
31}
32
33void
34TestResultItem::DrawItem(BView *owner, BRect itemRect, bool drawEverthing)
35{
36	owner->SetDrawingMode(B_OP_COPY);
37
38	owner->PushState();
39	if (IsSelected()) {
40		rgb_color lowColor = owner->LowColor();
41		owner->SetHighColor(tint_color(lowColor, B_DARKEN_2_TINT));
42	} else if (fOk) {
43		// green background color on success
44		owner->SetHighColor(200, 255, 200);
45	} else {
46		// red background color on failure
47		owner->SetHighColor(255, 200, 200);
48	}
49	owner->FillRect(itemRect);
50	owner->PopState();
51
52	itemRect.InsetBy(1, 1);
53
54	owner->MovePenTo(itemRect.left+1, itemRect.top+1);
55	if (fDirectBitmap != NULL) {
56		owner->DrawBitmap(fDirectBitmap);
57	}
58	owner->MovePenBy(fBitmapSize.Width() + kDistance, 0);
59
60	if (fOriginalBitmap != NULL) {
61		owner->DrawBitmap(fOriginalBitmap);
62	}
63	owner->MovePenBy(fBitmapSize.Width() + kDistance, 0);
64
65	if (fArchivedBitmap != NULL) {
66		owner->DrawBitmap(fArchivedBitmap);
67	}
68	owner->MovePenBy(fBitmapSize.Width() + kDistance, 0);
69
70	owner->DrawBitmap(fDirectBitmap);
71	owner->SetDrawingMode(B_OP_SUBTRACT);
72	owner->DrawBitmap(fOriginalBitmap);
73
74	owner->MovePenBy(fBitmapSize.Width() + kDistance, 0);
75
76	owner->SetDrawingMode(B_OP_OVER);
77	BFont font;
78	owner->GetFont(&font);
79	// vertically center text
80	float baseLine = itemRect.top + (itemRect.IntegerHeight() / 2 + font.Size() / 2);
81	owner->MovePenTo(owner->PenLocation().x, baseLine);
82	owner->DrawString(fName.String());
83
84	if (fErrorMessage.Length() == 0)
85		return;
86
87	owner->PushState();
88	font.SetFace(B_ITALIC_FACE);
89	owner->SetFont(&font);
90	owner->SetHighColor(255, 0, 0);
91	owner->MovePenBy(kDistance, 0);
92	owner->DrawString(fErrorMessage.String());
93	owner->PopState();
94}
95
96
97void
98TestResultItem::Update(BView *owner, const BFont *font)
99{
100	BListItem::Update(owner, font);
101	float width = 0.0;
102	float height = 0.0;
103
104	width += font->StringWidth(fName.String());
105	width += kDistance;
106	width += font->StringWidth(fErrorMessage.String());
107
108	width += 3 * kDistance;
109	width += 3 * fBitmapSize.Width();
110
111	height = fBitmapSize.Height();
112
113	// border of two pixels
114	width += 4;
115	height += 4;
116
117	if (width > Width())
118		SetWidth(width);
119
120	if (height > Height())
121		SetHeight(height);
122}
123
124
125// HeaderListItem
126HeaderListItem::HeaderListItem(const char* label1, const char* label2,
127					const char* label3, const char* label4, const char* label5,
128					const char* label6, BRect rect)
129	:
130	fRect(rect)
131{
132	fLabels[0] = label1;
133	fLabels[1] = label2;
134	fLabels[2] = label3;
135	fLabels[3] = label4;
136	fLabels[4] = label5;
137	fLabels[5] = label6;
138}
139
140
141/* virtual */
142void
143HeaderListItem::DrawItem(BView *owner, BRect itemRect, bool drawEverthing)
144{
145	owner->SetDrawingMode(B_OP_COPY);
146
147	owner->PushState();
148	if (IsSelected()) {
149		rgb_color lowColor = owner->LowColor();
150		owner->SetHighColor(tint_color(lowColor, B_DARKEN_2_TINT));
151		owner->FillRect(itemRect);
152	}
153
154	owner->PopState();
155
156	itemRect.InsetBy(0, 1);
157	owner->StrokeRect(itemRect);
158
159	itemRect.InsetBy(1, 0);
160
161	owner->SetDrawingMode(B_OP_OVER);
162
163	BFont font;
164	owner->GetFont(&font);
165	float baseLine = itemRect.top + (itemRect.IntegerHeight() / 2 + font.Size() / 2);
166
167	for (int32 c = 0; c < sizeof(fLabels) / sizeof(fLabels[0]); c++) {
168		owner->MovePenTo(itemRect.left + 1 + (fRect.Width() + kDistance) * c, baseLine);
169		owner->DrawString(fLabels[c]);
170	}
171}
172
173
174/* virtual */
175void
176HeaderListItem::Update(BView *owner, const BFont *font)
177{
178	BListItem::Update(owner, font);
179	float width = 0.0;
180	float height = 0.0;
181
182	for (int32 c = 0; c < sizeof(fLabels) / sizeof(fLabels[0]); c++) {
183		width += font->StringWidth(fLabels[c].String());
184	}
185
186	width += kDistance * (sizeof(fLabels) / sizeof(fLabels[0]) - 1);
187
188	height = fRect.Height();
189
190	// border of two pixels
191	width += 4;
192	height += 4;
193
194	if (width > Width())
195		SetWidth(width);
196	if (height > Height())
197		SetHeight(height);
198}
199