xref: /haiku/src/kits/tracker/WidgetAttributeText.h (revision 2b76973fa2401f7a5edf68e6470f3d3210cbcff3)
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__
35 #define __TEXT_WIDGET_ATTRIBUTE__
36 
37 
38 #include <String.h>
39 
40 #include "TrackerSettings.h"
41 
42 
43 namespace BPrivate {
44 
45 class Model;
46 class BPoseView;
47 class BColumn;
48 
49 // Tracker-only type for truncating the size string
50 // (Used in InfoWindow.cpp)
51 const uint32 kSizeType = 'kszt';
52 
53 class WidgetAttributeText {
54 	// each of subclasses knows how to retrieve a specific attribute
55 	// from a model that is passed in and knows how to display the
56 	// corresponding text, fitted into a specified width using a given
57 	// view
58 	// It is being asked for the string value by the TextWidget object
59 	public:
60 		WidgetAttributeText(const Model*, const BColumn*);
61 		virtual ~WidgetAttributeText();
62 
63 		virtual bool CheckAttributeChanged() = 0;
64 			// returns true if attribute value changed
65 
66 		bool CheckViewChanged(const BPoseView*);
67 			// returns true if fitted text changed, either because value
68 			// changed or because width/view changed
69 
70 		virtual bool CheckSettingsChanged();
71 			// override if the text rendering depends on a setting
72 
73 		const char* FittingText(const BPoseView*);
74 			// returns text, recalculating if not yet calculated
75 
76 		virtual int Compare(WidgetAttributeText&, BPoseView* view) = 0;
77 			// override to define a compare of two different attributes for
78 			// sorting
79 
80 		static WidgetAttributeText* NewWidgetText(const Model*,
81 			const BColumn*, const BPoseView*);
82 			// WidgetAttributeText factory
83 			// call this to make the right WidgetAttributeText type for a
84 			// given column
85 
86 		float Width(const BPoseView*);
87 			// respects the width of the corresponding column
88 		float CurrentWidth() const;
89 			// return the item width we got during our last fitting attempt
90 
91 		virtual void SetUpEditing(BTextView*);
92 			// set up the passed textView for the specifics of a given
93 			// attribute editing
94 		virtual bool CommitEditedText(BTextView*) = 0;
95 			// return true if attribute actually changed
96 
97 		virtual float PreferredWidth(const BPoseView*) const = 0;
98 
99 		static status_t AttrAsString(const Model* model, BString* result,
100 			const char* attrName, int32 attrType, float width,
101 			BView* view, int64* value = 0);
102 
103 		Model* TargetModel() const;
104 
105 		virtual bool IsEditable() const;
106 
107 		void SetDirty(bool);
108 
109 	protected:
110 		// generic fitting routines used by the different attributes
111 		static float TruncString(BString* result, const char* src,
112 			int32 length, const BPoseView*, float width,
113 			uint32 truncMode = B_TRUNCATE_MIDDLE);
114 
115 		static float TruncTime(BString* result, int64 src,
116 			const BPoseView* view, float width);
117 
118 		static float TruncFileSize(BString* result, int64 src,
119 			const BPoseView* view, float width);
120 
121 		virtual void FitValue(BString* result, const BPoseView*) = 0;
122 			// override FitValue to do a specific text fitting for a given
123 			// attribute
124 
125 		mutable Model* fModel;
126 		const BColumn* fColumn;
127 		// TODO: make these int32 only
128 		float fOldWidth;
129 		float fTruncatedWidth;
130 		bool fDirty;
131 			// if true, need to recalculate text next time we try to use it
132 	 	bool fValueIsDefined;
133 	 	BString fText;
134 			// holds the truncated text, fit to the parameters passed in
135 			// in the last FittingText call
136 };
137 
138 inline Model*
139 WidgetAttributeText::TargetModel() const
140 {
141 	return fModel;
142 }
143 
144 
145 class StringAttributeText : public WidgetAttributeText {
146 	public:
147 		StringAttributeText(const Model*, const BColumn*);
148 
149 		virtual const char* ValueAsText(const BPoseView* view);
150 			// returns the untrucated text that corresponds to
151 			// the attribute value
152 
153 		virtual bool CheckAttributeChanged();
154 
155 		virtual float PreferredWidth(const BPoseView*) const;
156 
157 		virtual bool CommitEditedText(BTextView*);
158 
159 	protected:
160 		virtual bool CommitEditedTextFlavor(BTextView*) { return false; }
161 
162 		virtual void FitValue(BString* result, const BPoseView*);
163 		virtual void ReadValue(BString* result) = 0;
164 
165 		virtual int Compare(WidgetAttributeText &, BPoseView* view);
166 
167 		BString fFullValueText;
168 		bool fValueDirty;
169 			// used for lazy read, managed by ReadValue
170 };
171 
172 
173 class ScalarAttributeText : public WidgetAttributeText {
174 	public:
175 		ScalarAttributeText(const Model*, const BColumn*);
176 		int64 Value();
177 		virtual bool CheckAttributeChanged();
178 
179 		virtual float PreferredWidth(const BPoseView*) const;
180 
181 		virtual bool CommitEditedText(BTextView*) { return false; }
182 			// return true if attribute actually changed
183 	protected:
184 		virtual int64 ReadValue() = 0;
185 		virtual int Compare(WidgetAttributeText&, BPoseView* view);
186 		int64 fValue;
187 		bool fValueDirty;
188 			// used for lazy read, managed by ReadValue
189 };
190 
191 
192 union GenericValueStruct {
193 	time_t	time_tt;
194 	off_t	off_tt;
195 
196 	bool	boolt;
197 	int8	int8t;
198 	uint8	uint8t;
199 	int16	int16t;
200 	int16	uint16t;
201 	int32	int32t;
202 	int32	uint32t;
203 	int64	int64t;
204 	int64	uint64t;
205 
206 	float	floatt;
207 	double	doublet;
208 };
209 
210 
211 //! Used for displaying mime extra attributes. Supports different formats.
212 class GenericAttributeText : public StringAttributeText {
213 public:
214 								GenericAttributeText(const Model* model,
215 									const BColumn* column);
216 
217 	virtual	bool				CheckAttributeChanged();
218 	virtual	float				PreferredWidth(const BPoseView* view) const;
219 
220 	virtual	int					Compare(WidgetAttributeText& other,
221 									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,
232 									const BPoseView* view);
233 	virtual void				ReadValue(BString* result);
234 
235 protected:
236 	// TODO: split this up into a scalar flavor and string flavor
237 	// to save memory
238 			GenericValueStruct	fValue;
239 };
240 
241 
242 //! Used for the display-as type "duration"
243 class DurationAttributeText : public GenericAttributeText {
244 public:
245 								DurationAttributeText(const Model* model,
246 									const BColumn* column);
247 
248 private:
249 	virtual	void				FitValue(BString* result,
250 									const BPoseView* view);
251 };
252 
253 
254 //! Used for the display-as type "checkbox"
255 class CheckboxAttributeText : public GenericAttributeText {
256 public:
257 								CheckboxAttributeText(const Model* model,
258 									const BColumn* column);
259 
260 	virtual	void				SetUpEditing(BTextView* view);
261 
262 private:
263 	virtual	void				FitValue(BString* result,
264 									const BPoseView* view);
265 
266 private:
267 			BString				fOnChar;
268 			BString				fOffChar;
269 };
270 
271 
272 //! Used for the display-as type "rating"
273 class RatingAttributeText : public GenericAttributeText {
274 public:
275 								RatingAttributeText(const Model* model,
276 									const BColumn* column);
277 
278 	virtual	void				SetUpEditing(BTextView* view);
279 
280 private:
281 	virtual	void				FitValue(BString* result,
282 									const BPoseView* view);
283 
284 private:
285 			int32				fCount;
286 			int32				fMax;
287 };
288 
289 
290 class TimeAttributeText : public ScalarAttributeText {
291 	public:
292 		TimeAttributeText(const Model*, const BColumn*);
293 	protected:
294 		virtual float PreferredWidth(const BPoseView*) const;
295 		virtual void FitValue(BString* result, const BPoseView*);
296 		virtual bool CheckSettingsChanged();
297 
298 		TrackerSettings fSettings;
299 		bool fLastClockIs24;
300 		DateOrder fLastDateOrder;
301 		FormatSeparator fLastTimeFormatSeparator;
302 };
303 
304 
305 class PathAttributeText : public StringAttributeText {
306 	public:
307 		PathAttributeText(const Model*, const BColumn*);
308 	protected:
309 		virtual void ReadValue(BString* result);
310 };
311 
312 
313 class OriginalPathAttributeText : public StringAttributeText {
314 	public:
315 		OriginalPathAttributeText(const Model*, const BColumn*);
316 	protected:
317 		virtual void ReadValue(BString* result);
318 };
319 
320 
321 class KindAttributeText : public StringAttributeText {
322 	public:
323 		KindAttributeText(const Model*, const BColumn*);
324 	protected:
325 		virtual void ReadValue(BString* result);
326 };
327 
328 
329 class NameAttributeText : public StringAttributeText {
330 	public:
331 		NameAttributeText(const Model*, const BColumn*);
332 		virtual void SetUpEditing(BTextView*);
333 		virtual void FitValue(BString* result, const BPoseView*);
334 		virtual bool IsEditable() const;
335 
336 		static void SetSortFolderNamesFirst(bool);
337 	protected:
338 		virtual bool CommitEditedTextFlavor(BTextView*);
339 		virtual int Compare(WidgetAttributeText&, BPoseView* view);
340 		virtual void ReadValue(BString* result);
341 
342 		static bool sSortFolderNamesFirst;
343 };
344 
345 
346 class RealNameAttributeText : public StringAttributeText {
347 public:
348 							RealNameAttributeText(const Model*,
349 								const BColumn*);
350 	virtual	void			SetUpEditing(BTextView*);
351 	virtual	void			FitValue(BString* result, const BPoseView*);
352 
353 	static	void			SetSortFolderNamesFirst(bool);
354 
355 protected:
356 	virtual	bool			CommitEditedTextFlavor(BTextView*);
357 	virtual	int				Compare(WidgetAttributeText&, BPoseView* view);
358 	virtual	void			ReadValue(BString* result);
359 
360 	static	bool			sSortFolderNamesFirst;
361 };
362 
363 
364 #ifdef OWNER_GROUP_ATTRIBUTES
365 
366 class OwnerAttributeText : public StringAttributeText {
367 	public:
368 		OwnerAttributeText(const Model*, const BColumn*);
369 
370 	protected:
371 		virtual void ReadValue(BString* result);
372 };
373 
374 
375 class GroupAttributeText : public StringAttributeText {
376 	public:
377 		GroupAttributeText(const Model*, const BColumn*);
378 
379 	protected:
380 		virtual void ReadValue(BString* result);
381 };
382 
383 #endif  // OWNER_GROUP_ATTRIBUTES
384 
385 
386 class ModeAttributeText : public StringAttributeText {
387 	public:
388 		ModeAttributeText(const Model*, const BColumn*);
389 
390 	protected:
391 		virtual void ReadValue(BString* result);
392 };
393 
394 
395 const int64 kUnknownSize = -1;
396 
397 
398 class SizeAttributeText : public ScalarAttributeText {
399 	public:
400 		SizeAttributeText(const Model*, const BColumn*);
401 
402 	protected:
403 		virtual void FitValue(BString* result, const BPoseView*);
404 		virtual int64 ReadValue();
405 		virtual float PreferredWidth(const BPoseView*) const;
406 };
407 
408 
409 class CreationTimeAttributeText : public TimeAttributeText {
410 	public:
411 		CreationTimeAttributeText(const Model*, const BColumn*);
412 	protected:
413 		virtual int64 ReadValue();
414 };
415 
416 
417 class ModificationTimeAttributeText : public TimeAttributeText {
418 	public:
419 		ModificationTimeAttributeText(const Model*, const BColumn*);
420 
421 	protected:
422 		virtual int64 ReadValue();
423 };
424 
425 
426 class OpenWithRelationAttributeText : public ScalarAttributeText {
427 	public:
428 		OpenWithRelationAttributeText(const Model*, const BColumn*,
429 			const BPoseView*);
430 
431 	protected:
432 		virtual void FitValue(BString* result, const BPoseView*);
433 		virtual int64 ReadValue();
434 		virtual float PreferredWidth(const BPoseView*) const;
435 
436 		const BPoseView* fPoseView;
437 		BString fRelationText;
438 };
439 
440 
441 class VersionAttributeText : public StringAttributeText {
442 	public:
443 		VersionAttributeText(const Model*, const BColumn*, bool appVersion);
444 
445 	protected:
446 		virtual void ReadValue(BString* result);
447 
448 	private:
449 		bool fAppVersion;
450 };
451 
452 
453 class AppShortVersionAttributeText : public VersionAttributeText {
454 	public:
455 		AppShortVersionAttributeText(const Model* model,
456 			const BColumn* column)
457 			:	VersionAttributeText(model, column, true)
458 		{
459 		}
460 };
461 
462 
463 class SystemShortVersionAttributeText : public VersionAttributeText {
464 	public:
465 		SystemShortVersionAttributeText(const Model* model,
466 			const BColumn* column)
467 			:	VersionAttributeText(model, column, false)
468 		{
469 		}
470 };
471 
472 } // namespace BPrivate
473 
474 
475 extern status_t TimeFormat(BString &string, int32 index,
476 	FormatSeparator format, DateOrder order, bool clockIs24Hour);
477 
478 using namespace BPrivate;
479 
480 #endif	// __TEXT_WIDGET_ATTRIBUTE__
481