* Copyright 2007, Haiku. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Michael Pfeiffer
*/
#include "TestResultItem.h"
const float kDistance = 5;
TestResultItem::TestResultItem(const char* name, BRect bitmapSize)
: fName(name)
, fBitmapSize(bitmapSize)
, fOk(true)
, fDirectBitmap(NULL)
, fOriginalBitmap(NULL)
, fArchivedBitmap(NULL)
{
}
TestResultItem::~TestResultItem()
{
delete fDirectBitmap;
fDirectBitmap = NULL;
delete fOriginalBitmap;
fOriginalBitmap = NULL;
delete fArchivedBitmap;
fArchivedBitmap = NULL;
}
void
TestResultItem::DrawItem(BView *owner, BRect itemRect, bool drawEverthing)
{
owner->SetDrawingMode(B_OP_COPY);
owner->PushState();
if (IsSelected()) {
rgb_color lowColor = owner->LowColor();
owner->SetHighColor(tint_color(lowColor, B_DARKEN_2_TINT));
} else if (fOk) {
owner->SetHighColor(200, 255, 200);
} else {
owner->SetHighColor(255, 200, 200);
}
owner->FillRect(itemRect);
owner->PopState();
itemRect.InsetBy(1, 1);
owner->MovePenTo(itemRect.left+1, itemRect.top+1);
if (fDirectBitmap != NULL) {
owner->DrawBitmap(fDirectBitmap);
}
owner->MovePenBy(fBitmapSize.Width() + kDistance, 0);
if (fOriginalBitmap != NULL) {
owner->DrawBitmap(fOriginalBitmap);
}
owner->MovePenBy(fBitmapSize.Width() + kDistance, 0);
if (fArchivedBitmap != NULL) {
owner->DrawBitmap(fArchivedBitmap);
}
owner->MovePenBy(fBitmapSize.Width() + kDistance, 0);
owner->DrawBitmap(fDirectBitmap);
owner->SetDrawingMode(B_OP_SUBTRACT);
owner->DrawBitmap(fOriginalBitmap);
owner->MovePenBy(fBitmapSize.Width() + kDistance, 0);
owner->SetDrawingMode(B_OP_OVER);
BFont font;
owner->GetFont(&font);
float baseLine = itemRect.top + (itemRect.IntegerHeight() / 2 + font.Size() / 2);
owner->MovePenTo(owner->PenLocation().x, baseLine);
owner->DrawString(fName.String());
if (fErrorMessage.Length() == 0)
return;
owner->PushState();
font.SetFace(B_ITALIC_FACE);
owner->SetFont(&font);
owner->SetHighColor(255, 0, 0);
owner->MovePenBy(kDistance, 0);
owner->DrawString(fErrorMessage.String());
owner->PopState();
}
void
TestResultItem::Update(BView *owner, const BFont *font)
{
BListItem::Update(owner, font);
float width = 0.0;
float height = 0.0;
width += font->StringWidth(fName.String());
width += kDistance;
width += font->StringWidth(fErrorMessage.String());
width += 3 * kDistance;
width += 3 * fBitmapSize.Width();
height = fBitmapSize.Height();
width += 4;
height += 4;
if (width > Width())
SetWidth(width);
if (height > Height())
SetHeight(height);
}
HeaderListItem::HeaderListItem(const char* label1, const char* label2,
const char* label3, const char* label4, const char* label5,
const char* label6, BRect rect)
:
fRect(rect)
{
fLabels[0] = label1;
fLabels[1] = label2;
fLabels[2] = label3;
fLabels[3] = label4;
fLabels[4] = label5;
fLabels[5] = label6;
}
void
HeaderListItem::DrawItem(BView *owner, BRect itemRect, bool drawEverthing)
{
owner->SetDrawingMode(B_OP_COPY);
owner->PushState();
if (IsSelected()) {
rgb_color lowColor = owner->LowColor();
owner->SetHighColor(tint_color(lowColor, B_DARKEN_2_TINT));
owner->FillRect(itemRect);
}
owner->PopState();
itemRect.InsetBy(0, 1);
owner->StrokeRect(itemRect);
itemRect.InsetBy(1, 0);
owner->SetDrawingMode(B_OP_OVER);
BFont font;
owner->GetFont(&font);
float baseLine = itemRect.top + (itemRect.IntegerHeight() / 2 + font.Size() / 2);
for (int32 c = 0; c < sizeof(fLabels) / sizeof(fLabels[0]); c++) {
owner->MovePenTo(itemRect.left + 1 + (fRect.Width() + kDistance) * c, baseLine);
owner->DrawString(fLabels[c]);
}
}
void
HeaderListItem::Update(BView *owner, const BFont *font)
{
BListItem::Update(owner, font);
float width = 0.0;
float height = 0.0;
for (int32 c = 0; c < sizeof(fLabels) / sizeof(fLabels[0]); c++) {
width += font->StringWidth(fLabels[c].String());
}
width += kDistance * (sizeof(fLabels) / sizeof(fLabels[0]) - 1);
height = fRect.Height();
width += 4;
height += 4;
if (width > Width())
SetWidth(width);
if (height > Height())
SetHeight(height);
}