xref: /haiku/src/kits/tracker/WidgetAttributeText.h (revision 529cd177b573aaba391c8adc9c9f5ad76a14bf81)
1 /*
2 Open Tracker License
3 
4 Terms and Conditions
5 
6 Copyright (c) 1991-2000, Be Incorporated. All rights reserved.
7 
8 Permission is hereby granted, free of charge, to any person obtaining a copy of
9 this software and associated documentation files (the "Software"), to deal in
10 the Software without restriction, including without limitation the rights to
11 use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
12 of the Software, and to permit persons to whom the Software is furnished to do
13 so, subject to the following conditions:
14 
15 The above copyright notice and this permission notice applies to all licensees
16 and shall be included in all copies or substantial portions of the Software.
17 
18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF TITLE, MERCHANTABILITY,
20 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 BE INCORPORATED BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION
23 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 
25 Except as contained in this notice, the name of Be Incorporated shall not be
26 used in advertising or otherwise to promote the sale, use or other dealings in
27 this Software without prior written authorization from Be Incorporated.
28 
29 Tracker(TM), Be(R), BeOS(R), and BeIA(TM) are trademarks or registered trademarks
30 of Be Incorporated in the United States and other countries. Other brand product
31 names are registered trademarks or trademarks of their respective holders.
32 All rights reserved.
33 */
34 #ifndef _TEXT_WIDGET_ATTRIBUTE_H
35 #define _TEXT_WIDGET_ATTRIBUTE_H
36 
37 
38 #include <DateFormat.h>
39 #include <String.h>
40 
41 #include "TrackerSettings.h"
42 
43 
44 namespace BPrivate {
45 
46 class Model;
47 class BPoseView;
48 class BColumn;
49 
50 // Tracker-only type for truncating the size string
51 // (Used in InfoWindow.cpp)
52 const uint32 kSizeType = 'kszt';
53 
54 class WidgetAttributeText {
55 	// each of subclasses knows how to retrieve a specific attribute
56 	// from a model that is passed in and knows how to display the
57 	// corresponding text, fitted into a specified width using a given
58 	// view
59 	// It is being asked for the string value by the TextWidget object
60 public:
61 	WidgetAttributeText(const Model*, const BColumn*);
62 	virtual ~WidgetAttributeText();
63 
64 	virtual bool CheckAttributeChanged() = 0;
65 		// returns true if attribute value changed
66 
67 	bool CheckViewChanged(const BPoseView*);
68 		// returns true if fitted text changed, either because value
69 		// changed or because width/view changed
70 
71 	virtual bool CheckSettingsChanged();
72 		// override if the text rendering depends on a setting
73 
74 	const char* FittingText(const BPoseView*);
75 		// returns text, recalculating if not yet calculated
76 
77 	virtual int Compare(WidgetAttributeText&, BPoseView* view) = 0;
78 		// override to define a compare of two different attributes for
79 		// sorting
80 
81 	static WidgetAttributeText* NewWidgetText(const Model*,
82 		const BColumn*, const BPoseView*);
83 		// WidgetAttributeText factory
84 		// call this to make the right WidgetAttributeText type for a
85 		// given column
86 
87 	float Width(const BPoseView*);
88 		// respects the width of the corresponding column
89 	float CurrentWidth() const;
90 		// return the item width we got during our last fitting attempt
91 
92 	virtual void SetUpEditing(BTextView*);
93 		// set up the passed textView for the specifics of a given
94 		// attribute editing
95 	virtual bool CommitEditedText(BTextView*) = 0;
96 		// return true if attribute actually changed
97 
98 	virtual float PreferredWidth(const BPoseView*) const = 0;
99 
100 	static status_t AttrAsString(const Model* model, BString* result,
101 		const char* attrName, int32 attrType, float width,
102 		BView* view, int64* value = 0);
103 
104 	Model* TargetModel() const;
105 
106 	virtual bool IsEditable() const;
107 
108 	void SetDirty(bool);
109 
110 protected:
111 	// generic fitting routines used by the different attributes
112 	static float TruncString(BString* result, const char* src,
113 		int32 length, const BPoseView*, float width,
114 		uint32 truncMode = B_TRUNCATE_MIDDLE);
115 
116 	static float TruncTime(BString* result, int64 src,
117 		const BPoseView* view, float width);
118 
119 	static float TruncFileSize(BString* result, int64 src,
120 		const BPoseView* view, float width);
121 
122 	virtual void FitValue(BString* result, const BPoseView*) = 0;
123 		// override FitValue to do a specific text fitting for a given
124 		// attribute
125 
126 	mutable Model* fModel;
127 	const BColumn* fColumn;
128 	// TODO: make these int32 only
129 	float fOldWidth;
130 	float fTruncatedWidth;
131 	bool fDirty;
132 		// if true, need to recalculate text next time we try to use it
133 	bool fValueIsDefined;
134 	BString fText;
135 		// holds the truncated text, fit to the parameters passed in
136 		// in the last FittingText call
137 };
138 
139 inline Model*
140 WidgetAttributeText::TargetModel() const
141 {
142 	return fModel;
143 }
144 
145 
146 class StringAttributeText : public WidgetAttributeText {
147 public:
148 	StringAttributeText(const Model*, const BColumn*);
149 
150 	virtual const char* ValueAsText(const BPoseView* view);
151 		// returns the untrucated text that corresponds to
152 		// the attribute value
153 
154 	virtual bool CheckAttributeChanged();
155 
156 	virtual float PreferredWidth(const BPoseView*) const;
157 
158 	virtual bool CommitEditedText(BTextView*);
159 
160 protected:
161 	virtual bool CommitEditedTextFlavor(BTextView*) { return false; }
162 
163 	virtual void FitValue(BString* result, const BPoseView*);
164 	virtual void ReadValue(BString* result) = 0;
165 
166 	virtual int Compare(WidgetAttributeText &, BPoseView* view);
167 
168 	BString fFullValueText;
169 	bool fValueDirty;
170 		// used for lazy read, managed by ReadValue
171 };
172 
173 
174 class ScalarAttributeText : public WidgetAttributeText {
175 public:
176 	ScalarAttributeText(const Model*, const BColumn*);
177 
178 	int64 Value();
179 	virtual bool CheckAttributeChanged();
180 
181 	virtual float PreferredWidth(const BPoseView*) const;
182 
183 	virtual bool CommitEditedText(BTextView*) { return false; }
184 		// return true if attribute actually changed
185 protected:
186 	virtual int64 ReadValue() = 0;
187 	virtual int Compare(WidgetAttributeText&, BPoseView* view);
188 	int64 fValue;
189 	bool fValueDirty;
190 		// used for lazy read, managed by ReadValue
191 };
192 
193 
194 union GenericValueStruct {
195 	time_t	time_tt;
196 	off_t	off_tt;
197 
198 	bool	boolt;
199 	int8	int8t;
200 	uint8	uint8t;
201 	int16	int16t;
202 	int16	uint16t;
203 	int32	int32t;
204 	int32	uint32t;
205 	int64	int64t;
206 	int64	uint64t;
207 
208 	float	floatt;
209 	double	doublet;
210 };
211 
212 
213 //! Used for displaying mime extra attributes. Supports different formats.
214 class GenericAttributeText : public StringAttributeText {
215 public:
216 	GenericAttributeText(const Model* model, const BColumn* column);
217 
218 	virtual bool CheckAttributeChanged();
219 	virtual float PreferredWidth(const BPoseView* view) const;
220 
221 	virtual int Compare(WidgetAttributeText& other, BPoseView* view);
222 
223 	virtual void SetUpEditing(BTextView* view);
224 	virtual bool CommitEditedText(BTextView* view);
225 
226 	virtual const char* ValueAsText(const BPoseView* view);
227 
228 protected:
229 	virtual bool CommitEditedTextFlavor(BTextView* view);
230 
231 	virtual void FitValue(BString* result, const BPoseView* view);
232 	virtual void ReadValue(BString* result);
233 
234 protected:
235 	// TODO: split this up into a scalar flavor and string flavor
236 	// to save memory
237 	GenericValueStruct fValue;
238 };
239 
240 
241 //! Used for the display-as type "duration"
242 class DurationAttributeText : public GenericAttributeText {
243 public:
244 	DurationAttributeText(const Model* model, const BColumn* column);
245 
246 private:
247 	virtual void FitValue(BString* result, const BPoseView* view);
248 };
249 
250 
251 //! Used for the display-as type "checkbox"
252 class CheckboxAttributeText : public GenericAttributeText {
253 public:
254 	CheckboxAttributeText(const Model* model, const BColumn* column);
255 
256 	virtual void SetUpEditing(BTextView* view);
257 
258 private:
259 	virtual void FitValue(BString* result, const BPoseView* view);
260 
261 private:
262 	BString fOnChar;
263 	BString fOffChar;
264 };
265 
266 
267 //! Used for the display-as type "rating"
268 class RatingAttributeText : public GenericAttributeText {
269 public:
270 	RatingAttributeText(const Model* model, const BColumn* column);
271 
272 	virtual void SetUpEditing(BTextView* view);
273 
274 private:
275 	virtual void FitValue(BString* result, const BPoseView* view);
276 
277 private:
278 	int32 fCount;
279 	int32 fMax;
280 };
281 
282 
283 class TimeAttributeText : public ScalarAttributeText {
284 public:
285 	TimeAttributeText(const Model*, const BColumn*);
286 
287 protected:
288 	virtual float PreferredWidth(const BPoseView*) const;
289 	virtual void FitValue(BString* ratingString, const BPoseView* view);
290 	virtual bool CheckSettingsChanged();
291 
292 	TrackerSettings fSettings;
293 	bool fLastClockIs24;
294 	DateOrder fLastDateOrder;
295 	FormatSeparator fLastTimeFormatSeparator;
296 };
297 
298 
299 class PathAttributeText : public StringAttributeText {
300 public:
301 	PathAttributeText(const Model*, const BColumn*);
302 
303 protected:
304 	virtual void ReadValue(BString* result);
305 };
306 
307 
308 class OriginalPathAttributeText : public StringAttributeText {
309 public:
310 	OriginalPathAttributeText(const Model*, const BColumn*);
311 
312 protected:
313 	virtual void ReadValue(BString* result);
314 };
315 
316 
317 class KindAttributeText : public StringAttributeText {
318 public:
319 	KindAttributeText(const Model*, const BColumn*);
320 
321 protected:
322 	virtual void ReadValue(BString* result);
323 };
324 
325 
326 class NameAttributeText : public StringAttributeText {
327 public:
328 	NameAttributeText(const Model*, const BColumn*);
329 	virtual void SetUpEditing(BTextView*);
330 	virtual void FitValue(BString* result, const BPoseView*);
331 	virtual bool IsEditable() const;
332 
333 	static void SetSortFolderNamesFirst(bool);
334 
335 protected:
336 	virtual bool CommitEditedTextFlavor(BTextView*);
337 	virtual int Compare(WidgetAttributeText&, BPoseView* view);
338 	virtual void ReadValue(BString* result);
339 
340 	static bool sSortFolderNamesFirst;
341 };
342 
343 
344 class RealNameAttributeText : public StringAttributeText {
345 public:
346 	RealNameAttributeText(const Model*, const BColumn*);
347 
348 	virtual void SetUpEditing(BTextView*);
349 	virtual void FitValue(BString* result, const BPoseView*);
350 
351 	static void SetSortFolderNamesFirst(bool);
352 
353 protected:
354 	virtual bool CommitEditedTextFlavor(BTextView*);
355 	virtual int Compare(WidgetAttributeText&, BPoseView* view);
356 	virtual void ReadValue(BString* result);
357 
358 	static bool sSortFolderNamesFirst;
359 };
360 
361 
362 #ifdef OWNER_GROUP_ATTRIBUTES
363 class OwnerAttributeText : public StringAttributeText {
364 public:
365 	OwnerAttributeText(const Model*, const BColumn*);
366 
367 protected:
368 	virtual void ReadValue(BString* result);
369 };
370 
371 
372 class GroupAttributeText : public StringAttributeText {
373 public:
374 	GroupAttributeText(const Model*, const BColumn*);
375 
376 protected:
377 	virtual void ReadValue(BString* result);
378 };
379 #endif	// OWNER_GROUP_ATTRIBUTES
380 
381 
382 class ModeAttributeText : public StringAttributeText {
383 public:
384 	ModeAttributeText(const Model*, const BColumn*);
385 
386 protected:
387 	virtual void ReadValue(BString* result);
388 };
389 
390 
391 const int64 kUnknownSize = -1;
392 
393 
394 class SizeAttributeText : public ScalarAttributeText {
395 public:
396 	SizeAttributeText(const Model*, const BColumn*);
397 
398 protected:
399 	virtual void FitValue(BString* result, const BPoseView*);
400 	virtual int64 ReadValue();
401 	virtual float PreferredWidth(const BPoseView*) const;
402 };
403 
404 
405 class CreationTimeAttributeText : public TimeAttributeText {
406 public:
407 	CreationTimeAttributeText(const Model*, const BColumn*);
408 
409 protected:
410 	virtual int64 ReadValue();
411 };
412 
413 
414 class ModificationTimeAttributeText : public TimeAttributeText {
415 public:
416 	ModificationTimeAttributeText(const Model*, const BColumn*);
417 
418 protected:
419 	virtual int64 ReadValue();
420 };
421 
422 
423 class OpenWithRelationAttributeText : public ScalarAttributeText {
424 public:
425 	OpenWithRelationAttributeText(const Model*, const BColumn*,
426 		const BPoseView*);
427 
428 protected:
429 	virtual void FitValue(BString* result, const BPoseView*);
430 	virtual int64 ReadValue();
431 	virtual float PreferredWidth(const BPoseView*) const;
432 
433 	const BPoseView* fPoseView;
434 	BString fRelationText;
435 };
436 
437 
438 class VersionAttributeText : public StringAttributeText {
439 public:
440 	VersionAttributeText(const Model*, const BColumn*, bool appVersion);
441 
442 protected:
443 	virtual void ReadValue(BString* result);
444 
445 private:
446 	bool fAppVersion;
447 };
448 
449 
450 class AppShortVersionAttributeText : public VersionAttributeText {
451 public:
452 	AppShortVersionAttributeText(const Model* model,
453 		const BColumn* column)
454 		:
455 		VersionAttributeText(model, column, true)
456 	{
457 	}
458 };
459 
460 
461 class SystemShortVersionAttributeText : public VersionAttributeText {
462 public:
463 	SystemShortVersionAttributeText(const Model* model,
464 		const BColumn* column)
465 		:
466 		VersionAttributeText(model, column, false)
467 	{
468 	}
469 };
470 
471 } // namespace BPrivate
472 
473 
474 extern status_t TimeFormat(BString &string, int32 index,
475 	FormatSeparator format, DateOrder order, bool clockIs24Hour);
476 
477 using namespace BPrivate;
478 
479 
480 #endif	// _TEXT_WIDGET_ATTRIBUTE_H
481