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