xref: /haiku/src/apps/debuganalyzer/gui/table/Table.h (revision df459da6ed9a147f1c3fb2ca70429ee20c2d1058)
1 /*
2  * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef TABLE_H
6 #define TABLE_H
7 
8 #include <ColumnTypes.h>
9 
10 #include <ObjectList.h>
11 #include <util/DoublyLinkedList.h>
12 #include <Variant.h>
13 
14 #include "table/AbstractTable.h"
15 #include "table/TableColumn.h"
16 
17 
18 class Table;
19 class TableModel;
20 
21 
22 class TableModelListener {
23 public:
24 	virtual						~TableModelListener();
25 
26 	virtual	void				TableRowsAdded(TableModel* model,
27 									int32 rowIndex, int32 count);
28 	virtual	void				TableRowsRemoved(TableModel* model,
29 									int32 rowIndex, int32 count);
30 	virtual	void				TableRowsChanged(TableModel* model,
31 									int32 rowIndex, int32 count);
32 	virtual	void				TableModelReset(TableModel* model);
33 };
34 
35 
36 class TableModel : public AbstractTableModelBase {
37 public:
38 	virtual						~TableModel();
39 
40 	virtual	int32				CountRows() const = 0;
41 
42 	virtual	bool				GetValueAt(int32 rowIndex, int32 columnIndex,
43 									BVariant& value) = 0;
44 
45 	virtual	bool				AddListener(TableModelListener* listener);
46 	virtual	void				RemoveListener(TableModelListener* listener);
47 
48 protected:
49 			typedef BObjectList<TableModelListener> ListenerList;
50 
51 protected:
52 			void				NotifyRowsAdded(int32 rowIndex, int32 count);
53 			void				NotifyRowsRemoved(int32 rowIndex, int32 count);
54 			void				NotifyRowsChanged(int32 rowIndex, int32 count);
55 			void				NotifyTableModelReset();
56 
57 protected:
58 			ListenerList		fListeners;
59 };
60 
61 
62 class TableSelectionModel {
63 public:
64 								TableSelectionModel(Table* table);
65 								~TableSelectionModel();
66 
67 			int32				CountRows();
68 			int32				RowAt(int32 index);
69 
70 private:
71 			friend class Table;
72 
73 private:
74 			void				_SelectionChanged();
75 			void				_Update();
76 
77 private:
78 			Table*				fTable;
79 			int32*				fRows;
80 			int32				fRowCount;
81 };
82 
83 
84 class TableToolTipProvider {
85 public:
86 	virtual						~TableToolTipProvider();
87 
88 	virtual	bool				GetToolTipForTableCell(int32 rowIndex,
89 									int32 columnIndex, BToolTip** _tip) = 0;
90 									// columnIndex can be -1, if not in a column
91 };
92 
93 
94 class TableListener {
95 public:
96 	virtual						~TableListener();
97 
98 	virtual	void				TableSelectionChanged(Table* table);
99 	virtual	void				TableRowInvoked(Table* table, int32 rowIndex);
100 
101 	virtual	void				TableCellMouseDown(Table* table, int32 rowIndex,
102 									int32 columnIndex, BPoint screenWhere,
103 									uint32 buttons);
104 	virtual	void				TableCellMouseUp(Table* table, int32 rowIndex,
105 									int32 columnIndex, BPoint screenWhere,
106 									uint32 buttons);
107 };
108 
109 
110 class Table : public AbstractTable, private TableModelListener {
111 public:
112 								Table(const char* name, uint32 flags,
113 									border_style borderStyle = B_NO_BORDER,
114 									bool showHorizontalScrollbar = true);
115 								Table(TableModel* model, const char* name,
116 									uint32 flags,
117 									border_style borderStyle = B_NO_BORDER,
118 									bool showHorizontalScrollbar = true);
119 	virtual						~Table();
120 
121 			void				SetTableModel(TableModel* model);
GetTableModel()122 			TableModel*			GetTableModel() const	{ return fModel; }
123 
124 			void				SetToolTipProvider(
125 									TableToolTipProvider* toolTipProvider);
ToolTipProvider()126 			TableToolTipProvider* ToolTipProvider() const
127 									{ return fToolTipProvider; }
128 
129 			TableSelectionModel* SelectionModel();
130 
131 			void				SelectRow(int32 rowIndex, bool extendSelection);
132 			void				DeselectRow(int32 rowIndex);
133 			void				DeselectAllRows();
134 
135 			bool				AddTableListener(TableListener* listener);
136 			void				RemoveTableListener(TableListener* listener);
137 
138 	virtual	status_t			GetCellRectAt(int32 rowIndex, int32 colIndex,
139 									BRect& _output) const;
140 
141 protected:
142 	virtual bool				GetToolTipAt(BPoint point, BToolTip** _tip);
143 
144 	virtual	void				SelectionChanged();
145 
146 	virtual	AbstractColumn*		CreateColumn(TableColumn* column);
147 
148 	virtual	void				ColumnMouseDown(AbstractColumn* column,
149 									BRow* row, BField* field,
150 									BPoint screenWhere, uint32 buttons);
151 	virtual	void				ColumnMouseUp(AbstractColumn* column,
152 									BRow* row, BField* field,
153 									BPoint screenWhere, uint32 buttons);
154 
155 private:
156 	virtual	void				TableRowsAdded(TableModel* model,
157 									int32 rowIndex, int32 count);
158 	virtual	void				TableRowsRemoved(TableModel* model,
159 									int32 rowIndex, int32 count);
160 	virtual	void				TableRowsChanged(TableModel* model,
161 									int32 rowIndex, int32 count);
162 	virtual	void				TableModelReset(TableModel* model);
163 
164 private:
165 			class Column;
166 
167 			friend class TableSelectionModel;
168 
169 			typedef BObjectList<TableListener>	ListenerList;
170 			typedef BObjectList<BRow> RowList;
171 
172 private:
173 	virtual	void				ItemInvoked();
174 
175 			void				_UpdateRowIndices(int32 fromIndex);
176 			int32				_ModelIndexOfRow(BRow* row);
177 
178 private:
179 			TableModel*			fModel;
180 			TableToolTipProvider* fToolTipProvider;
181 			RowList				fRows;
182 			TableSelectionModel	fSelectionModel;
183 			ListenerList		fListeners;
184 			int32				fIgnoreSelectionChange;
185 };
186 
187 
188 #endif	// TABLE_H
189