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