* Renamed AbstractTableModel to AbstractTableModelBase.
* Added listener support to TableModel. * Table does now listen to the model and adds/removes rows accordingly. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31080 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
e5c5e337e4
commit
8c2d467ed7
@ -10,10 +10,10 @@
|
|||||||
#include "table/TableColumn.h"
|
#include "table/TableColumn.h"
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark - AbstractTableModel
|
// #pragma mark - AbstractTableModelBase
|
||||||
|
|
||||||
|
|
||||||
AbstractTableModel::~AbstractTableModel()
|
AbstractTableModelBase::~AbstractTableModelBase()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,9 +12,9 @@
|
|||||||
class TableColumn;
|
class TableColumn;
|
||||||
|
|
||||||
|
|
||||||
class AbstractTableModel {
|
class AbstractTableModelBase {
|
||||||
public:
|
public:
|
||||||
virtual ~AbstractTableModel();
|
virtual ~AbstractTableModelBase();
|
||||||
|
|
||||||
virtual int32 CountColumns() const = 0;
|
virtual int32 CountColumns() const = 0;
|
||||||
};
|
};
|
||||||
@ -53,7 +53,7 @@ public:
|
|||||||
AbstractColumn(TableColumn* tableColumn);
|
AbstractColumn(TableColumn* tableColumn);
|
||||||
virtual ~AbstractColumn();
|
virtual ~AbstractColumn();
|
||||||
|
|
||||||
virtual void SetModel(AbstractTableModel* model) = 0;
|
virtual void SetModel(AbstractTableModelBase* model) = 0;
|
||||||
|
|
||||||
TableColumn* GetTableColumn() const { return fTableColumn; }
|
TableColumn* GetTableColumn() const { return fTableColumn; }
|
||||||
|
|
||||||
|
@ -29,6 +29,28 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark - TableModelListener
|
||||||
|
|
||||||
|
|
||||||
|
TableModelListener::~TableModelListener()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
TableModelListener::TableRowsAdded(TableModel* model, int32 rowIndex,
|
||||||
|
int32 count)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
TableModelListener::TableRowsRemoved(TableModel* model, int32 rowIndex,
|
||||||
|
int32 count)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark - TableModel
|
// #pragma mark - TableModel
|
||||||
|
|
||||||
|
|
||||||
@ -37,6 +59,40 @@ TableModel::~TableModel()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
TableModel::AddListener(TableModelListener* listener)
|
||||||
|
{
|
||||||
|
fListeners.Add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
TableModel::RemoveListener(TableModelListener* listener)
|
||||||
|
{
|
||||||
|
fListeners.Remove(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
TableModel::NotifyRowsAdded(int32 rowIndex, int32 count)
|
||||||
|
{
|
||||||
|
for (ListenerList::Iterator it = fListeners.GetIterator();
|
||||||
|
TableModelListener* listener = it.Next();) {
|
||||||
|
listener->TableRowsAdded(this, rowIndex, count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
TableModel::NotifyRowsRemoved(int32 rowIndex, int32 count)
|
||||||
|
{
|
||||||
|
for (ListenerList::Iterator it = fListeners.GetIterator();
|
||||||
|
TableModelListener* listener = it.Next();) {
|
||||||
|
listener->TableRowsRemoved(this, rowIndex, count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark - TableListener
|
// #pragma mark - TableListener
|
||||||
|
|
||||||
|
|
||||||
@ -60,7 +116,7 @@ public:
|
|||||||
TableColumn* tableColumn);
|
TableColumn* tableColumn);
|
||||||
virtual ~Column();
|
virtual ~Column();
|
||||||
|
|
||||||
virtual void SetModel(AbstractTableModel* model);
|
virtual void SetModel(AbstractTableModelBase* model);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void DrawTitle(BRect rect, BView* targetView);
|
virtual void DrawTitle(BRect rect, BView* targetView);
|
||||||
@ -91,7 +147,7 @@ Table::Column::~Column()
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Table::Column::SetModel(AbstractTableModel* model)
|
Table::Column::SetModel(AbstractTableModelBase* model)
|
||||||
{
|
{
|
||||||
fModel = dynamic_cast<TableModel*>(model);
|
fModel = dynamic_cast<TableModel*>(model);
|
||||||
}
|
}
|
||||||
@ -196,6 +252,8 @@ Table::~Table()
|
|||||||
{
|
{
|
||||||
for (int32 i = CountColumns() - 1; i >= 0; i--)
|
for (int32 i = CountColumns() - 1; i >= 0; i--)
|
||||||
RemoveColumn(ColumnAt(i));
|
RemoveColumn(ColumnAt(i));
|
||||||
|
|
||||||
|
// rows are deleted by the BColumnListView destructor automatically
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -206,6 +264,9 @@ Table::SetTableModel(TableModel* model)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (fModel != NULL) {
|
if (fModel != NULL) {
|
||||||
|
fModel->RemoveListener(this);
|
||||||
|
|
||||||
|
fRows.MakeEmpty();
|
||||||
Clear();
|
Clear();
|
||||||
|
|
||||||
for (int32 i = 0; AbstractColumn* column = fColumns.ItemAt(i); i++)
|
for (int32 i = 0; AbstractColumn* column = fColumns.ItemAt(i); i++)
|
||||||
@ -217,38 +278,12 @@ Table::SetTableModel(TableModel* model)
|
|||||||
if (fModel == NULL)
|
if (fModel == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
fModel->AddListener(this);
|
||||||
|
|
||||||
for (int32 i = 0; AbstractColumn* column = fColumns.ItemAt(i); i++)
|
for (int32 i = 0; AbstractColumn* column = fColumns.ItemAt(i); i++)
|
||||||
column->SetModel(fModel);
|
column->SetModel(fModel);
|
||||||
|
|
||||||
// create the rows
|
TableRowsAdded(fModel, 0, fModel->CountRows());
|
||||||
int32 rowCount = fModel->CountRows();
|
|
||||||
int32 columnCount = fModel->CountColumns();
|
|
||||||
|
|
||||||
for (int32 i = 0; i < rowCount; i++) {
|
|
||||||
// create row
|
|
||||||
BRow* row = new(std::nothrow) BRow();
|
|
||||||
if (row == NULL) {
|
|
||||||
// TODO: Report error!
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// add dummy fields to row
|
|
||||||
for (int32 columnIndex = 0; columnIndex < columnCount; columnIndex++) {
|
|
||||||
// It would be nice to create only a single field and set it for all
|
|
||||||
// columns, but the row takes ultimate ownership, so it have to be
|
|
||||||
// individual objects.
|
|
||||||
TableField* field = new(std::nothrow) TableField(i);
|
|
||||||
if (field == NULL) {
|
|
||||||
// TODO: Report error!
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
row->SetField(field, columnIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
// add row
|
|
||||||
AddRow(row);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -273,6 +308,59 @@ Table::CreateColumn(TableColumn* column)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Table::TableRowsAdded(TableModel* model, int32 rowIndex, int32 count)
|
||||||
|
{
|
||||||
|
// create the rows
|
||||||
|
int32 endRow = rowIndex + count;
|
||||||
|
int32 columnCount = fModel->CountColumns();
|
||||||
|
|
||||||
|
for (int32 i = rowIndex; i < endRow; i++) {
|
||||||
|
// create row
|
||||||
|
BRow* row = new(std::nothrow) BRow();
|
||||||
|
if (row == NULL) {
|
||||||
|
// TODO: Report error!
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// add dummy fields to row
|
||||||
|
for (int32 columnIndex = 0; columnIndex < columnCount; columnIndex++) {
|
||||||
|
// It would be nice to create only a single field and set it for all
|
||||||
|
// columns, but the row takes ultimate ownership, so it have to be
|
||||||
|
// individual objects.
|
||||||
|
TableField* field = new(std::nothrow) TableField(i);
|
||||||
|
if (field == NULL) {
|
||||||
|
// TODO: Report error!
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
row->SetField(field, columnIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
// add row
|
||||||
|
if (!fRows.AddItem(row, i)) {
|
||||||
|
// TODO: Report error!
|
||||||
|
delete row;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddRow(row, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Table::TableRowsRemoved(TableModel* model, int32 rowIndex, int32 count)
|
||||||
|
{
|
||||||
|
for (int32 i = rowIndex + count - 1; i >= rowIndex; i--) {
|
||||||
|
if (BRow* row = fRows.RemoveItemAt(i)) {
|
||||||
|
RemoveRow(row);
|
||||||
|
delete row;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Table::ItemInvoked()
|
Table::ItemInvoked()
|
||||||
{
|
{
|
||||||
|
@ -7,6 +7,9 @@
|
|||||||
|
|
||||||
#include <ColumnTypes.h>
|
#include <ColumnTypes.h>
|
||||||
|
|
||||||
|
#include <ObjectList.h>
|
||||||
|
#include <util/DoublyLinkedList.h>
|
||||||
|
|
||||||
#include "table/AbstractTable.h"
|
#include "table/AbstractTable.h"
|
||||||
#include "table/TableColumn.h"
|
#include "table/TableColumn.h"
|
||||||
|
|
||||||
@ -14,9 +17,21 @@
|
|||||||
|
|
||||||
|
|
||||||
class Table;
|
class Table;
|
||||||
|
class TableModel;
|
||||||
|
|
||||||
|
|
||||||
class TableModel : public AbstractTableModel {
|
class TableModelListener : public DoublyLinkedListLinkImpl<TableModelListener> {
|
||||||
|
public:
|
||||||
|
virtual ~TableModelListener();
|
||||||
|
|
||||||
|
virtual void TableRowsAdded(TableModel* model,
|
||||||
|
int32 rowIndex, int32 count);
|
||||||
|
virtual void TableRowsRemoved(TableModel* model,
|
||||||
|
int32 rowIndex, int32 count);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class TableModel : public AbstractTableModelBase {
|
||||||
public:
|
public:
|
||||||
virtual ~TableModel();
|
virtual ~TableModel();
|
||||||
|
|
||||||
@ -24,6 +39,19 @@ public:
|
|||||||
|
|
||||||
virtual bool GetValueAt(int32 rowIndex, int32 columnIndex,
|
virtual bool GetValueAt(int32 rowIndex, int32 columnIndex,
|
||||||
Variant& value) = 0;
|
Variant& value) = 0;
|
||||||
|
|
||||||
|
virtual void AddListener(TableModelListener* listener);
|
||||||
|
virtual void RemoveListener(TableModelListener* listener);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
typedef DoublyLinkedList<TableModelListener> ListenerList;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void NotifyRowsAdded(int32 rowIndex, int32 count);
|
||||||
|
void NotifyRowsRemoved(int32 rowIndex, int32 count);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
ListenerList fListeners;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -35,7 +63,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Table : public AbstractTable {
|
class Table : public AbstractTable, private TableModelListener {
|
||||||
public:
|
public:
|
||||||
Table(const char* name, uint32 flags,
|
Table(const char* name, uint32 flags,
|
||||||
border_style borderStyle = B_NO_BORDER,
|
border_style borderStyle = B_NO_BORDER,
|
||||||
@ -55,16 +83,24 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
virtual AbstractColumn* CreateColumn(TableColumn* column);
|
virtual AbstractColumn* CreateColumn(TableColumn* column);
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual void TableRowsAdded(TableModel* model,
|
||||||
|
int32 rowIndex, int32 count);
|
||||||
|
virtual void TableRowsRemoved(TableModel* model,
|
||||||
|
int32 rowIndex, int32 count);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class Column;
|
class Column;
|
||||||
|
|
||||||
typedef BObjectList<TableListener> ListenerList;
|
typedef BObjectList<TableListener> ListenerList;
|
||||||
|
typedef BObjectList<BRow> RowList;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual void ItemInvoked();
|
virtual void ItemInvoked();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TableModel* fModel;
|
TableModel* fModel;
|
||||||
|
RowList fRows;
|
||||||
ListenerList fListeners;
|
ListenerList fListeners;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ public:
|
|||||||
TableColumn* tableColumn);
|
TableColumn* tableColumn);
|
||||||
virtual ~Column();
|
virtual ~Column();
|
||||||
|
|
||||||
virtual void SetModel(AbstractTableModel* model);
|
virtual void SetModel(AbstractTableModelBase* model);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void DrawTitle(BRect rect, BView* targetView);
|
virtual void DrawTitle(BRect rect, BView* targetView);
|
||||||
@ -91,7 +91,7 @@ TreeTable::Column::~Column()
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
TreeTable::Column::SetModel(AbstractTableModel* model)
|
TreeTable::Column::SetModel(AbstractTableModelBase* model)
|
||||||
{
|
{
|
||||||
fModel = dynamic_cast<TreeTableModel*>(model);
|
fModel = dynamic_cast<TreeTableModel*>(model);
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
class TreeTable;
|
class TreeTable;
|
||||||
|
|
||||||
|
|
||||||
class TreeTableModel : public AbstractTableModel {
|
class TreeTableModel : public AbstractTableModelBase {
|
||||||
public:
|
public:
|
||||||
virtual ~TreeTableModel();
|
virtual ~TreeTableModel();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user