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
TypeCodeField(const type_code & code,ResourceData * data)14 TypeCodeField::TypeCodeField(const type_code &code, ResourceData *data)
15 : BStringField(MakeTypeString(code).String()),
16 fTypeCode(code),
17 fData(data)
18 {
19 }
20
21
PreviewField(void)22 PreviewField::PreviewField(void)
23 {
24 }
25
26
~PreviewField(void)27 PreviewField::~PreviewField(void)
28 {
29 }
30
31
BitmapPreviewField(BBitmap * bitmap)32 BitmapPreviewField::BitmapPreviewField(BBitmap *bitmap)
33 {
34 fBitmap = bitmap;
35 }
36
37
~BitmapPreviewField(void)38 BitmapPreviewField::~BitmapPreviewField(void)
39 {
40 delete fBitmap;
41 }
42
43
44 void
DrawField(BRect rect,BView * parent)45 BitmapPreviewField::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
78 void
SetData(char * data,const size_t & length)79 BitmapPreviewField::SetData(char *data, const size_t &length)
80 {
81 BMemoryIO memio(data, length);
82 fBitmap = BTranslationUtils::GetBitmap(&memio);
83 }
84
85
IntegerPreviewField(const int64 & value)86 IntegerPreviewField::IntegerPreviewField(const int64 &value)
87 {
88 fValue = value;
89 }
90
91
~IntegerPreviewField(void)92 IntegerPreviewField::~IntegerPreviewField(void)
93 {
94 }
95
96
97 void
DrawField(BRect rect,BView * parent)98 IntegerPreviewField::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
110 void
SetData(char * data,const size_t & length)111 IntegerPreviewField::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
StringPreviewField(const char * string)137 StringPreviewField::StringPreviewField(const char *string)
138 {
139 fClipped = fString = string;
140 }
141
142
~StringPreviewField(void)143 StringPreviewField::~StringPreviewField(void)
144 {
145 }
146
147
148 void
DrawField(BRect rect,BView * parent)149 StringPreviewField::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
160 void
SetData(char * data,const size_t & length)161 StringPreviewField::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
172 BString
MakeTypeString(int32 type)173 MakeTypeString(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