1/*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6#include "table/AbstractTable.h"
7
8#include <new>
9
10#include <Looper.h>
11#include <Message.h>
12
13#include "table/TableColumn.h"
14
15
16// #pragma mark - AbstractTableModelBase
17
18
19AbstractTableModelBase::~AbstractTableModelBase()
20{
21}
22
23
24// #pragma mark - AbstractColumn
25
26
27AbstractTable::AbstractColumn::AbstractColumn(TableColumn* tableColumn)
28	:
29	BColumn(tableColumn->Width(), tableColumn->MinWidth(),
30		tableColumn->MaxWidth(), tableColumn->Alignment()),
31	fTableColumn(tableColumn),
32	fTable(NULL)
33{
34	SetWantsEvents(true);
35}
36
37
38AbstractTable::AbstractColumn::~AbstractColumn()
39{
40	delete fTableColumn;
41}
42
43
44void
45AbstractTable::AbstractColumn::SetTable(AbstractTable* table)
46{
47	fTable = table;
48}
49
50
51void
52AbstractTable::AbstractColumn::MouseDown(BColumnListView* parent, BRow* row,
53	BField* field, BRect fieldRect, BPoint point, uint32 _buttons)
54{
55	if (fTable == NULL)
56		return;
57
58	if (fTable == NULL)
59		return;
60	BLooper* window = fTable->Looper();
61	if (window == NULL)
62		return;
63
64	BMessage* message = window->CurrentMessage();
65	if (message == NULL)
66		return;
67
68	int32 buttons;
69		// Note: The _buttons parameter cannot be trusted.
70	BPoint screenWhere;
71	if (message->FindInt32("buttons", &buttons) != B_OK
72		|| message->FindPoint("screen_where", &screenWhere) != B_OK) {
73		return;
74	}
75
76	fTable->ColumnMouseDown(this, row, field, screenWhere, buttons);
77}
78
79
80void
81AbstractTable::AbstractColumn::MouseUp(BColumnListView* parent, BRow* row,
82	BField* field)
83{
84	if (fTable == NULL)
85		return;
86	BLooper* window = fTable->Looper();
87	if (window == NULL)
88		return;
89
90	BMessage* message = window->CurrentMessage();
91	if (message == NULL)
92		return;
93
94	int32 buttons;
95	BPoint screenWhere;
96	if (message->FindInt32("buttons", &buttons) != B_OK
97		|| message->FindPoint("screen_where", &screenWhere) != B_OK) {
98		return;
99	}
100
101	fTable->ColumnMouseUp(this, row, field, screenWhere, buttons);
102}
103
104
105// #pragma mark - AbstractTable
106
107
108AbstractTable::AbstractTable(const char* name, uint32 flags,
109	border_style borderStyle, bool showHorizontalScrollbar)
110	:
111	BColumnListView(name, flags, borderStyle, showHorizontalScrollbar),
112	fColumns(20, false)
113{
114}
115
116
117AbstractTable::~AbstractTable()
118{
119}
120
121
122void
123AbstractTable::AddColumn(TableColumn* column)
124{
125	if (column == NULL)
126		return;
127
128	AbstractColumn* privateColumn = CreateColumn(column);
129	privateColumn->SetTable(this);
130
131	if (!fColumns.AddItem(privateColumn)) {
132		delete privateColumn;
133		throw std::bad_alloc();
134	}
135
136	BColumnListView::AddColumn(privateColumn, column->ModelIndex());
137
138	// TODO: The derived classes need to be notified, so that they can create
139	// fields for the existing rows.
140}
141
142
143void
144AbstractTable::ResizeColumnToPreferred(int32 index)
145{
146	BColumnListView::ResizeColumnToPreferred(index);
147}
148
149
150void
151AbstractTable::ResizeAllColumnsToPreferred()
152{
153	BColumnListView::ResizeAllColumnsToPreferred();
154}
155
156
157list_view_type
158AbstractTable::SelectionMode() const
159{
160	return BColumnListView::SelectionMode();
161}
162
163
164void
165AbstractTable::SetSelectionMode(list_view_type type)
166{
167	BColumnListView::SetSelectionMode(type);
168}
169
170
171void
172AbstractTable::DeselectAll()
173{
174	BColumnListView::DeselectAll();
175}
176
177
178void
179AbstractTable::SetSortingEnabled(bool enabled)
180{
181	BColumnListView::SetSortingEnabled(enabled);
182}
183
184
185bool
186AbstractTable::SortingEnabled() const
187{
188	return BColumnListView::SortingEnabled();
189}
190
191
192void
193AbstractTable::SetSortColumn(TableColumn* column, bool add, bool ascending)
194{
195	if (AbstractColumn* privateColumn = GetColumn(column))
196		BColumnListView::SetSortColumn(privateColumn, add, ascending);
197}
198
199
200void
201AbstractTable::ClearSortColumns()
202{
203	BColumnListView::ClearSortColumns();
204}
205
206
207AbstractTable::AbstractColumn*
208AbstractTable::GetColumn(TableColumn* column) const
209{
210	for (int32 i = 0; AbstractColumn* privateColumn = fColumns.ItemAt(i); i++) {
211		if (privateColumn->GetTableColumn() == column)
212			return privateColumn;
213	}
214
215	return NULL;
216}
217