1/*
2 * Copyright 2009-2012, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include "table/TableColumns.h"
8
9#include <stdio.h>
10#include <strings.h>
11
12#include "util/TimeUtils.h"
13
14
15// #pragma mark - DelegateBasedTableColumn
16
17
18DelegateBasedTableColumn::DelegateBasedTableColumn(BColumn* columnDelegate,
19	int32 modelIndex, float width, float minWidth, float maxWidth,
20	alignment align)
21	:
22	TableColumn(modelIndex, width, minWidth, maxWidth, align),
23	fColumnDelegate(columnDelegate)
24{
25}
26
27
28DelegateBasedTableColumn::~DelegateBasedTableColumn()
29{
30}
31
32
33void
34DelegateBasedTableColumn::DrawTitle(BRect rect, BView* targetView)
35{
36	fColumnDelegate->DrawTitle(rect, targetView);
37}
38
39
40void
41DelegateBasedTableColumn::GetColumnName(BString* into) const
42{
43	fColumnDelegate->GetColumnName(into);
44}
45
46
47void
48DelegateBasedTableColumn::DrawValue(const BVariant& value, BRect rect,
49	BView* targetView)
50{
51	fColumnDelegate->DrawField(PrepareField(value), rect, targetView);
52}
53
54
55float
56DelegateBasedTableColumn::GetPreferredWidth(const BVariant& value,
57	BView* parent) const
58{
59	return fColumnDelegate->GetPreferredWidth(PrepareField(value), parent);
60}
61
62
63// #pragma mark - StringTableColumn
64
65
66StringTableColumn::StringTableColumn(int32 modelIndex, const char* title,
67	float width, float minWidth, float maxWidth, uint32 truncate,
68	alignment align)
69	:
70	DelegateBasedTableColumn(&fColumn, modelIndex, width, minWidth, maxWidth,
71		align),
72	fColumn(title, width, minWidth, maxWidth, truncate, align),
73	fField("")
74{
75}
76
77
78StringTableColumn::~StringTableColumn()
79{
80}
81
82
83BField*
84StringTableColumn::PrepareField(const BVariant& value) const
85{
86	fField.SetString(value.ToString());
87	fField.SetWidth(Width());
88	return &fField;
89}
90
91
92int
93StringTableColumn::CompareValues(const BVariant& a, const BVariant& b)
94{
95	return strcasecmp(a.ToString(), b.ToString());
96}
97
98
99// #pragma mark - BoolStringTableColumn
100
101
102BoolStringTableColumn::BoolStringTableColumn(int32 modelIndex, const char* title,
103	float width, float minWidth, float maxWidth, const BString& trueString,
104	const BString& falseString, uint32 truncate, alignment align)
105	:
106	StringTableColumn(modelIndex, title, width, minWidth, maxWidth, truncate,
107		align),
108	fTrueString(trueString),
109	fFalseString(falseString)
110{
111}
112
113
114BField*
115BoolStringTableColumn::PrepareField(const BVariant& value) const
116{
117	return StringTableColumn::PrepareField(
118		BVariant(value.ToBool() ? fTrueString : fFalseString,
119			B_VARIANT_DONT_COPY_DATA));
120}
121
122
123int
124BoolStringTableColumn::CompareValues(const BVariant& a, const BVariant& b)
125{
126	bool aValue = a.ToBool();
127	return aValue == b.ToBool() ? 0 : (aValue ? 1 : -1);
128}
129
130
131// #pragma mark - Int32TableColumn
132
133
134Int32TableColumn::Int32TableColumn(int32 modelIndex, const char* title,
135	float width, float minWidth, float maxWidth, uint32 truncate,
136	alignment align)
137	:
138	StringTableColumn(modelIndex, title, width, minWidth, maxWidth, truncate,
139		align)
140{
141}
142
143
144BField*
145Int32TableColumn::PrepareField(const BVariant& value) const
146{
147	char buffer[16];
148	snprintf(buffer, sizeof(buffer), "%" B_PRId32, value.ToInt32());
149	return StringTableColumn::PrepareField(
150		BVariant(buffer, B_VARIANT_DONT_COPY_DATA));
151}
152
153
154int
155Int32TableColumn::CompareValues(const BVariant& a, const BVariant& b)
156{
157	return a.ToInt32() - b.ToInt32();
158}
159
160
161// #pragma mark - Int64TableColumn
162
163
164Int64TableColumn::Int64TableColumn(int32 modelIndex, const char* title,
165	float width, float minWidth, float maxWidth, uint32 truncate,
166	alignment align)
167	:
168	StringTableColumn(modelIndex, title, width, minWidth, maxWidth, truncate,
169		align)
170{
171}
172
173
174BField*
175Int64TableColumn::PrepareField(const BVariant& value) const
176{
177	char buffer[32];
178	snprintf(buffer, sizeof(buffer), "%" B_PRId64, value.ToInt64());
179	return StringTableColumn::PrepareField(
180		BVariant(buffer, B_VARIANT_DONT_COPY_DATA));
181}
182
183
184int
185Int64TableColumn::CompareValues(const BVariant& a, const BVariant& b)
186{
187	int64 diff = a.ToInt64() - b.ToInt64();
188	if (diff == 0)
189		return 0;
190	return diff < 0 ? -1 : 1;
191}
192
193
194// #pragma mark - BigtimeTableColumn
195
196
197BigtimeTableColumn::BigtimeTableColumn(int32 modelIndex, const char* title,
198	float width, float minWidth, float maxWidth, bool invalidFirst,
199	uint32 truncate, alignment align)
200	:
201	StringTableColumn(modelIndex, title, width, minWidth, maxWidth, truncate,
202		align),
203	fInvalidFirst(invalidFirst)
204{
205}
206
207
208BField*
209BigtimeTableColumn::PrepareField(const BVariant& value) const
210{
211	bigtime_t time = value.ToInt64();
212	if (time < 0) {
213		return StringTableColumn::PrepareField(
214			BVariant("-", B_VARIANT_DONT_COPY_DATA));
215	}
216
217	char buffer[64];
218	format_bigtime(time, buffer, sizeof(buffer));
219	return StringTableColumn::PrepareField(
220		BVariant(buffer, B_VARIANT_DONT_COPY_DATA));
221}
222
223
224int
225BigtimeTableColumn::CompareValues(const BVariant& _a, const BVariant& _b)
226{
227	bigtime_t a = _a.ToInt64();
228	bigtime_t b = _b.ToInt64();
229
230	if (a == b)
231		return 0;
232
233	if (a < 0)
234		return fInvalidFirst ? -1 : 1;
235	if (b < 0)
236		return fInvalidFirst ? 1 : -1;
237
238	return a - b < 0 ? -1 : 1;
239}
240
241
242// #pragma mark - NanotimeTableColumn
243
244
245NanotimeTableColumn::NanotimeTableColumn(int32 modelIndex, const char* title,
246	float width, float minWidth, float maxWidth, bool invalidFirst,
247	uint32 truncate, alignment align)
248	:
249	StringTableColumn(modelIndex, title, width, minWidth, maxWidth, truncate,
250		align),
251	fInvalidFirst(invalidFirst)
252{
253}
254
255
256BField*
257NanotimeTableColumn::PrepareField(const BVariant& value) const
258{
259	nanotime_t time = value.ToInt64();
260	if (time < 0) {
261		return StringTableColumn::PrepareField(
262			BVariant("-", B_VARIANT_DONT_COPY_DATA));
263	}
264
265	char buffer[64];
266	format_nanotime(time, buffer, sizeof(buffer));
267	return StringTableColumn::PrepareField(
268		BVariant(buffer, B_VARIANT_DONT_COPY_DATA));
269}
270
271
272int
273NanotimeTableColumn::CompareValues(const BVariant& _a, const BVariant& _b)
274{
275	nanotime_t a = _a.ToInt64();
276	nanotime_t b = _b.ToInt64();
277
278	if (a == b)
279		return 0;
280
281	if (a < 0)
282		return fInvalidFirst ? -1 : 1;
283	if (b < 0)
284		return fInvalidFirst ? 1 : -1;
285
286	return a - b < 0 ? -1 : 1;
287}
288