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