1/* 2 * Copyright (c) 2005-2010, Haiku, Inc. 3 * Distributed under the terms of the MIT license. 4 * 5 * Author: 6 * DarkWyrm <darkwyrm@gmail.com> 7 */ 8#include "ResFields.h" 9#include "ResourceData.h" 10 11#include <DataIO.h> 12#include <TranslationUtils.h> 13 14TypeCodeField::TypeCodeField(const type_code &code, ResourceData *data) 15 : BStringField(MakeTypeString(code).String()), 16 fTypeCode(code), 17 fData(data) 18{ 19} 20 21 22PreviewField::PreviewField(void) 23{ 24} 25 26 27PreviewField::~PreviewField(void) 28{ 29} 30 31 32BitmapPreviewField::BitmapPreviewField(BBitmap *bitmap) 33{ 34 fBitmap = bitmap; 35} 36 37 38BitmapPreviewField::~BitmapPreviewField(void) 39{ 40 delete fBitmap; 41} 42 43 44void 45BitmapPreviewField::DrawField(BRect rect, BView *parent) 46{ 47 if (fBitmap) { 48 // Scale the fBitmap down to completely fit within the field's height 49 BRect drawrect(fBitmap->Bounds().OffsetToCopy(rect.LeftTop())); 50 if (drawrect.Height() > rect.Height()) { 51 drawrect = rect; 52 drawrect.right = drawrect.left + 53 (fBitmap->Bounds().Width() * 54 (rect.Height() / fBitmap->Bounds().Height())); 55 } 56 57 parent->SetDrawingMode(B_OP_ALPHA); 58 parent->DrawBitmap(fBitmap, fBitmap->Bounds(), drawrect); 59 parent->SetDrawingMode(B_OP_COPY); 60 61 BString out; 62 out.SetToFormat("%" B_PRId32" �� %" B_PRId32" �� %" B_PRId32, 63 fBitmap->Bounds().IntegerWidth(), fBitmap->Bounds().IntegerHeight(), 64 (int32(fBitmap->BytesPerRow() / fBitmap->Bounds().Width()) * 8)); 65 66 BRect stringrect = rect; 67 stringrect.right -= 10; 68 stringrect.left = stringrect.right - parent->StringWidth(out.String()); 69 if (stringrect.left < drawrect.right + 5) 70 stringrect.left = drawrect.right + 5; 71 72 parent->TruncateString(&out, B_TRUNCATE_END, stringrect.Width()); 73 parent->DrawString(out.String(), stringrect.LeftTop()); 74 } 75} 76 77 78void 79BitmapPreviewField::SetData(char *data, const size_t &length) 80{ 81 BMemoryIO memio(data, length); 82 fBitmap = BTranslationUtils::GetBitmap(&memio); 83} 84 85 86IntegerPreviewField::IntegerPreviewField(const int64 &value) 87{ 88 fValue = value; 89} 90 91 92IntegerPreviewField::~IntegerPreviewField(void) 93{ 94} 95 96 97void 98IntegerPreviewField::DrawField(BRect rect, BView *parent) 99{ 100 BPoint point(rect.LeftBottom()); 101 point.y -= 2; 102 103 BString string; 104 string << fValue; 105 parent->TruncateString(&string, B_TRUNCATE_MIDDLE, rect.Width() - 14); 106 parent->DrawString(string.String(), point); 107} 108 109 110void 111IntegerPreviewField::SetData(char *data, const size_t &length) 112{ 113 switch(length) { 114 case 8: { 115 fValue = *((int8*)data); 116 break; 117 } 118 case 16: { 119 fValue = *((int16*)data); 120 break; 121 } 122 case 32: { 123 fValue = *((int32*)data); 124 break; 125 } 126 case 64: { 127 fValue = *((int32*)data); 128 break; 129 } 130 default: { 131 break; 132 } 133 } 134} 135 136 137StringPreviewField::StringPreviewField(const char *string) 138{ 139 fClipped = fString = string; 140} 141 142 143StringPreviewField::~StringPreviewField(void) 144{ 145} 146 147 148void 149StringPreviewField::DrawField(BRect rect, BView *parent) 150{ 151 BPoint point(rect.LeftBottom()); 152 point.y -= 2; 153 154 fClipped = fString; 155 parent->TruncateString(&fClipped, B_TRUNCATE_END, rect.Width() - 14); 156 parent->DrawString(fClipped.String(), point); 157} 158 159 160void 161StringPreviewField::SetData(char *data, const size_t &length) 162{ 163 char *temp = fString.LockBuffer(length + 2); 164 if (temp) 165 memcpy(temp, data, length); 166 temp[length] = '\0'; 167 fString.UnlockBuffer(); 168 fClipped = fString; 169} 170 171 172BString 173MakeTypeString(int32 type) 174{ 175 char typestring[7]; 176 char *typeptr = (char *) &type; 177 typestring[0] = '\''; 178 typestring[1] = typeptr[3]; 179 typestring[2] = typeptr[2]; 180 typestring[3] = typeptr[1]; 181 typestring[4] = typeptr[0]; 182 typestring[5] = '\''; 183 typestring[6] = '\0'; 184 return BString(typestring); 185} 186