1/*
2Open Tracker License
3
4Terms and Conditions
5
6Copyright (c) 1991-2000, Be Incorporated. All rights reserved.
7
8Permission is hereby granted, free of charge, to any person obtaining a copy of
9this software and associated documentation files (the "Software"), to deal in
10the Software without restriction, including without limitation the rights to
11use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
12of the Software, and to permit persons to whom the Software is furnished to do
13so, subject to the following conditions:
14
15The above copyright notice and this permission notice applies to all licensees
16and shall be included in all copies or substantial portions of the Software.
17
18THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF TITLE, MERCHANTABILITY,
20FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21BE INCORPORATED BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION
23WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
25Except as contained in this notice, the name of Be Incorporated shall not be
26used in advertising or otherwise to promote the sale, use or other dealings in
27this Software without prior written authorization from Be Incorporated.
28
29Tracker(TM), Be(R), BeOS(R), and BeIA(TM) are trademarks or registered trademarks
30of Be Incorporated in the United States and other countries. Other brand product
31names are registered trademarks or trademarks of their respective holders.
32All rights reserved.
33*/
34
35/*******************************************************************************
36/
37/	File:			ColumnListView.h
38/
39/   Description:    Experimental multi-column list view.
40/
41/	Copyright 2000+, Be Incorporated, All Rights Reserved
42/
43*******************************************************************************/
44
45
46#ifndef _COLUMN_LIST_VIEW_H
47#define _COLUMN_LIST_VIEW_H
48
49#include <BeBuild.h>
50#include <View.h>
51#include <List.h>
52#include <Invoker.h>
53#include <ListView.h>
54
55class BScrollBar;
56
57namespace BPrivate {
58
59class OutlineView;
60class TitleView;
61class BRowContainer;
62class RecursiveOutlineIterator;
63
64}	// ns BPrivate
65
66class BField;
67class BRow;
68class BColumn;
69class BColumnListView;
70
71enum LatchType {
72	B_NO_LATCH					= 0,
73	B_OPEN_LATCH				= 1,
74	B_PRESSED_LATCH				= 2,
75	B_CLOSED_LATCH				= 3
76};
77
78typedef enum {
79	B_ALLOW_COLUMN_NONE			= 0,
80	B_ALLOW_COLUMN_MOVE			= 1,
81	B_ALLOW_COLUMN_RESIZE		= 2,
82	B_ALLOW_COLUMN_POPUP		= 4,
83	B_ALLOW_COLUMN_REMOVE		= 8
84} column_flags;
85
86enum ColumnListViewColor {
87	B_COLOR_BACKGROUND			= 0,
88	B_COLOR_TEXT				= 1,
89	B_COLOR_ROW_DIVIDER			= 2,
90	B_COLOR_SELECTION			= 3,
91	B_COLOR_SELECTION_TEXT		= 4,
92	B_COLOR_NON_FOCUS_SELECTION	= 5,
93	B_COLOR_EDIT_BACKGROUND		= 6,
94	B_COLOR_EDIT_TEXT			= 7,
95	B_COLOR_HEADER_BACKGROUND	= 8,
96	B_COLOR_HEADER_TEXT			= 9,
97	B_COLOR_SEPARATOR_LINE		= 10,
98	B_COLOR_SEPARATOR_BORDER	= 11,
99
100	B_COLOR_TOTAL				= 12
101};
102
103enum ColumnListViewFont {
104	B_FONT_ROW					= 0,
105	B_FONT_HEADER				= 1,
106
107	B_FONT_TOTAL				= 2
108};
109
110
111// A single row/column intersection in the list.
112class BField {
113public:
114								BField();
115	virtual						~BField();
116};
117
118// A single line in the list.  Each line contains a BField object
119// for each column in the list, associated by their "logical field"
120// index.  Hierarchies are formed by adding other BRow objects as
121// a parent of a row, using the AddRow() function in BColumnListView().
122class BRow {
123public:
124								BRow(float height = 16.0);
125	virtual 					~BRow();
126	virtual bool		 		HasLatch() const;
127
128			int32				CountFields() const;
129			BField*				GetField(int32 logicalFieldIndex);
130	const	BField*				GetField(int32 logicalFieldIndex) const;
131			void				SetField(BField* field,
132									int32 logicalFieldIndex);
133
134			float 				Height() const;
135			bool 				IsExpanded() const;
136
137private:
138	// Blows up into the debugger if the validation fails.
139			void				ValidateFields() const;
140			void				ValidateField(const BField* field,
141									int32 logicalFieldIndex) const;
142private:
143			BList				fFields;
144			BPrivate::
145			BRowContainer*		fChildList;
146			bool				fIsExpanded;
147			float				fHeight;
148			BRow*				fNextSelected;
149			BRow*				fPrevSelected;
150			BRow*				fParent;
151			BColumnListView*	fList;
152
153
154	friend class BColumnListView;
155	friend class BPrivate::RecursiveOutlineIterator;
156	friend class BPrivate::OutlineView;
157};
158
159// Information about a single column in the list.  A column knows
160// how to display the BField objects that occur at its location in
161// each of the list's rows.  See ColumnTypes.h for particular
162// subclasses of BField and BColumn that handle common data types.
163class BColumn {
164public:
165								BColumn(float width, float minWidth,
166									float maxWidth,
167									alignment align = B_ALIGN_LEFT);
168	virtual 					~BColumn();
169
170			float				Width() const;
171			void				SetWidth(float width);
172			float				MinWidth() const;
173			float				MaxWidth() const;
174
175	virtual	void				DrawTitle(BRect rect, BView* targetView);
176	virtual	void				DrawField(BField* field, BRect rect,
177									BView* targetView);
178	virtual	int					CompareFields(BField* field1, BField* field2);
179
180	virtual void				MouseMoved(BColumnListView* parent, BRow* row,
181									BField* field, BRect fieldRect,
182									BPoint point, uint32 buttons, int32 code);
183	virtual void				MouseDown(BColumnListView* parent, BRow* row,
184									BField* field, BRect fieldRect,
185									BPoint point, uint32 buttons);
186	virtual	void				MouseUp(BColumnListView* parent, BRow* row,
187									BField* field);
188
189	virtual	void				GetColumnName(BString* into) const;
190	virtual	float				GetPreferredWidth(BField* field,
191									BView* parent) const;
192
193			bool				IsVisible() const;
194			void				SetVisible(bool);
195
196			bool				WantsEvents() const;
197			void				SetWantsEvents(bool);
198
199			bool				ShowHeading() const;
200			void				SetShowHeading(bool);
201
202			alignment			Alignment() const;
203			void				SetAlignment(alignment);
204
205			int32				LogicalFieldNum() const;
206
207	/*!
208		\param field The BField derivative to validate.
209
210			Implement this function on your BColumn derivatives to validate
211			BField derivatives that your BColumn will be drawing/manipulating.
212
213			This function will be called when BFields are added to the Column,
214			use dynamic_cast<> to determine if it is of a kind that your
215			BColumn know how ot handle. return false if it is not.
216
217			\note The debugger will be called if you return false from here
218			with information about what type of BField and BColumn and the
219			logical field index where it occured.
220
221			\note Do not call the inherited version of this, it just returns
222			true;
223	  */
224	virtual	bool				AcceptsField(const BField* field) const;
225
226private:
227			float				fWidth;
228			float 				fMinWidth;
229			float				fMaxWidth;
230			bool				fVisible;
231			int32				fFieldID;
232			BColumnListView*	fList;
233			bool				fSortAscending;
234			bool				fWantsEvents;
235			bool				fShowHeading;
236			alignment			fAlignment;
237
238	friend class BPrivate::OutlineView;
239	friend class BColumnListView;
240	friend class BPrivate::TitleView;
241};
242
243// The column list view class.
244class BColumnListView : public BView, public BInvoker {
245public:
246								BColumnListView(BRect rect,
247									const char* name, uint32 resizingMode,
248									uint32 flags, border_style = B_NO_BORDER,
249									bool showHorizontalScrollbar = true);
250								BColumnListView(const char* name,
251									uint32 flags, border_style = B_NO_BORDER,
252									bool showHorizontalScrollbar = true);
253	virtual						~BColumnListView();
254
255	// Interaction
256	virtual	bool				InitiateDrag(BPoint, bool wasSelected);
257	virtual	void				MessageDropped(BMessage*, BPoint point);
258	virtual	void				ExpandOrCollapse(BRow* row, bool expand);
259	virtual	status_t			Invoke(BMessage* message = NULL);
260	virtual	void				ItemInvoked();
261	virtual	void				SetInvocationMessage(BMessage* message);
262			BMessage* 			InvocationMessage() const;
263			uint32 				InvocationCommand() const;
264			BRow* 				FocusRow() const;
265			void 				SetFocusRow(int32 index, bool select = false);
266			void 				SetFocusRow(BRow* row, bool select = false);
267			void 				SetMouseTrackingEnabled(bool);
268
269	// Selection
270			list_view_type		SelectionMode() const;
271			void 				Deselect(BRow* row);
272			void 				AddToSelection(BRow* row);
273			void 				DeselectAll();
274			BRow*				CurrentSelection(BRow* lastSelected = 0) const;
275	virtual	void				SelectionChanged();
276	virtual	void				SetSelectionMessage(BMessage* message);
277			BMessage*			SelectionMessage();
278			uint32				SelectionCommand() const;
279			void				SetSelectionMode(list_view_type type);
280				// list_view_type is defined in ListView.h.
281
282	// Sorting
283			void				SetSortingEnabled(bool);
284			bool				SortingEnabled() const;
285			void				SetSortColumn(BColumn* column, bool add,
286									bool ascending);
287			void				ClearSortColumns();
288
289	// The status view is a little area in the lower left hand corner.
290			void				AddStatusView(BView* view);
291			BView*				RemoveStatusView();
292
293	// Column Manipulation
294			void				AddColumn(BColumn* column,
295									int32 logicalFieldIndex);
296			void				MoveColumn(BColumn* column, int32 index);
297			void				RemoveColumn(BColumn* column);
298			int32				CountColumns() const;
299			BColumn*			ColumnAt(int32 index) const;
300			BColumn*			ColumnAt(BPoint point) const;
301			void				SetColumnVisible(BColumn* column,
302									bool isVisible);
303			void				SetColumnVisible(int32, bool);
304			bool				IsColumnVisible(int32) const;
305			void				SetColumnFlags(column_flags flags);
306			void				ResizeColumnToPreferred(int32 index);
307			void				ResizeAllColumnsToPreferred();
308
309	// Row manipulation
310			const BRow*			RowAt(int32 index, BRow *parent = 0) const;
311			BRow*				RowAt(int32 index, BRow *parent = 0);
312			const BRow*			RowAt(BPoint) const;
313			BRow*				RowAt(BPoint);
314			bool				GetRowRect(const BRow* row, BRect* _rect) const;
315			bool				FindParent(BRow* row, BRow** _parent,
316									bool *_isVisible) const;
317			int32				IndexOf(BRow* row);
318			int32				CountRows(BRow* parent = 0) const;
319			void				AddRow(BRow* row, BRow* parent = NULL);
320			void				AddRow(BRow* row, int32 index,
321									BRow* parent = NULL);
322
323			void				ScrollTo(const BRow* Row);
324			void				ScrollTo(BPoint point);
325
326	// Does not delete row or children at this time.
327	// todo: Make delete row and children
328			void				RemoveRow(BRow* row);
329
330			void				UpdateRow(BRow* row);
331			void				Clear();
332
333	// Appearance (DEPRECATED)
334			void				GetFont(BFont* font) const
335									{ BView::GetFont(font); }
336	virtual	void				SetFont(const BFont* font,
337									uint32 mask = B_FONT_ALL);
338	virtual	void				SetHighColor(rgb_color);
339			void				SetSelectionColor(rgb_color);
340			void				SetBackgroundColor(rgb_color);
341			void				SetEditColor(rgb_color);
342			const rgb_color		SelectionColor() const;
343			const rgb_color		BackgroundColor() const;
344			const rgb_color		EditColor() const;
345
346	// Appearance (NEW STYLE)
347			void				SetColor(ColumnListViewColor colorIndex,
348									rgb_color color);
349			void				SetFont(ColumnListViewFont fontIndex,
350									const BFont* font,
351									uint32 mask = B_FONT_ALL);
352			rgb_color			Color(ColumnListViewColor colorIndex) const;
353			void				GetFont(ColumnListViewFont fontIndex,
354									BFont* font) const;
355
356			BPoint				SuggestTextPosition(const BRow* row,
357									const BColumn* column = NULL) const;
358
359			void				SetLatchWidth(float width);
360			float				LatchWidth() const;
361	virtual	void				DrawLatch(BView* view, BRect frame,
362									LatchType type, BRow* row);
363	virtual	void				MakeFocus(bool isfocus = true);
364			void				SaveState(BMessage* archive);
365			void				LoadState(BMessage* archive);
366
367			BView*				ScrollView() const
368									{ return (BView*)fOutlineView; }
369			void				SetEditMode(bool state);
370			void				Refresh();
371
372	virtual BSize				MinSize();
373	virtual BSize				PreferredSize();
374	virtual BSize				MaxSize();
375
376
377protected:
378	virtual	void 				MessageReceived(BMessage* message);
379	virtual	void 				KeyDown(const char* bytes, int32 numBytes);
380	virtual	void 				AttachedToWindow();
381	virtual	void 				WindowActivated(bool active);
382	virtual	void 				Draw(BRect updateRect);
383
384	virtual	void				LayoutInvalidated(bool descendants = false);
385	virtual	void				DoLayout();
386
387private:
388			void				_Init();
389			void				_GetChildViewRects(const BRect& bounds,
390									BRect& titleRect, BRect& outlineRect,
391									BRect& vScrollBarRect,
392									BRect& hScrollBarRect);
393
394			rgb_color 			fColorList[B_COLOR_TOTAL];
395			BPrivate::TitleView* fTitleView;
396			BPrivate::OutlineView* fOutlineView;
397			BList 				fColumns;
398			BScrollBar*			fHorizontalScrollBar;
399			BScrollBar* 		fVerticalScrollBar;
400			BList				fSortColumns;
401			BView*				fStatusView;
402			BMessage*			fSelectionMessage;
403			bool				fSortingEnabled;
404			float				fLatchWidth;
405			border_style		fBorderStyle;
406			bool				fShowingHorizontalScrollBar;
407};
408
409#endif // _COLUMN_LIST_VIEW_H
410