⛏️ index : haiku.git

/*
 * 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) {
		// green background color on success
		owner->SetHighColor(200, 255, 200);
	} else {
		// red background color on failure
		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);
	// vertically center text 
	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();	

	// border of two pixels
	width += 4;
	height += 4;

	if (width > Width())
		SetWidth(width);

	if (height > Height())
		SetHeight(height);
}


// HeaderListItem
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;
}


/* virtual */
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]);
	}
}


/* virtual */
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();

	// border of two pixels
	width += 4;
	height += 4;

	if (width > Width())
		SetWidth(width);
	if (height > Height())
		SetHeight(height);
}