/* * Copyright (c) 2005-2010, Haiku, Inc. * Distributed under the terms of the MIT license. * * Author: * DarkWyrm */ #include "ResFields.h" #include "ResourceData.h" #include #include TypeCodeField::TypeCodeField(const type_code &code, ResourceData *data) : BStringField(MakeTypeString(code).String()), fTypeCode(code), fData(data) { } PreviewField::PreviewField(void) { } PreviewField::~PreviewField(void) { } BitmapPreviewField::BitmapPreviewField(BBitmap *bitmap) { fBitmap = bitmap; } BitmapPreviewField::~BitmapPreviewField(void) { delete fBitmap; } void BitmapPreviewField::DrawField(BRect rect, BView *parent) { if (fBitmap) { // Scale the fBitmap down to completely fit within the field's height BRect drawrect(fBitmap->Bounds().OffsetToCopy(rect.LeftTop())); if (drawrect.Height() > rect.Height()) { drawrect = rect; drawrect.right = drawrect.left + (fBitmap->Bounds().Width() * (rect.Height() / fBitmap->Bounds().Height())); } parent->SetDrawingMode(B_OP_ALPHA); parent->DrawBitmap(fBitmap, fBitmap->Bounds(), drawrect); parent->SetDrawingMode(B_OP_COPY); BString out; out.SetToFormat("%" B_PRId32" × %" B_PRId32" × %" B_PRId32, fBitmap->Bounds().IntegerWidth(), fBitmap->Bounds().IntegerHeight(), (int32(fBitmap->BytesPerRow() / fBitmap->Bounds().Width()) * 8)); BRect stringrect = rect; stringrect.right -= 10; stringrect.left = stringrect.right - parent->StringWidth(out.String()); if (stringrect.left < drawrect.right + 5) stringrect.left = drawrect.right + 5; parent->TruncateString(&out, B_TRUNCATE_END, stringrect.Width()); parent->DrawString(out.String(), stringrect.LeftTop()); } } void BitmapPreviewField::SetData(char *data, const size_t &length) { BMemoryIO memio(data, length); fBitmap = BTranslationUtils::GetBitmap(&memio); } IntegerPreviewField::IntegerPreviewField(const int64 &value) { fValue = value; } IntegerPreviewField::~IntegerPreviewField(void) { } void IntegerPreviewField::DrawField(BRect rect, BView *parent) { BPoint point(rect.LeftBottom()); point.y -= 2; BString string; string << fValue; parent->TruncateString(&string, B_TRUNCATE_MIDDLE, rect.Width() - 14); parent->DrawString(string.String(), point); } void IntegerPreviewField::SetData(char *data, const size_t &length) { switch(length) { case 8: { fValue = *((int8*)data); break; } case 16: { fValue = *((int16*)data); break; } case 32: { fValue = *((int32*)data); break; } case 64: { fValue = *((int32*)data); break; } default: { break; } } } StringPreviewField::StringPreviewField(const char *string) { fClipped = fString = string; } StringPreviewField::~StringPreviewField(void) { } void StringPreviewField::DrawField(BRect rect, BView *parent) { BPoint point(rect.LeftBottom()); point.y -= 2; fClipped = fString; parent->TruncateString(&fClipped, B_TRUNCATE_END, rect.Width() - 14); parent->DrawString(fClipped.String(), point); } void StringPreviewField::SetData(char *data, const size_t &length) { char *temp = fString.LockBuffer(length + 2); if (temp) memcpy(temp, data, length); temp[length] = '\0'; fString.UnlockBuffer(); fClipped = fString; } BString MakeTypeString(int32 type) { char typestring[7]; char *typeptr = (char *) &type; typestring[0] = '\''; typestring[1] = typeptr[3]; typestring[2] = typeptr[2]; typestring[3] = typeptr[1]; typestring[4] = typeptr[0]; typestring[5] = '\''; typestring[6] = '\0'; return BString(typestring); }