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 11 const float kDistance = 5; 12 13 TestResultItem::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 23 TestResultItem::~TestResultItem() 24 { 25 delete fDirectBitmap; 26 fDirectBitmap = NULL; 27 delete fOriginalBitmap; 28 fOriginalBitmap = NULL; 29 delete fArchivedBitmap; 30 fArchivedBitmap = NULL; 31 } 32 33 void 34 TestResultItem::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 97 void 98 TestResultItem::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 126 HeaderListItem::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 */ 142 void 143 HeaderListItem::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 */ 175 void 176 HeaderListItem::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