00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <guichan/widget.hpp>
00023
00024 #include "table_model.h"
00025
00026 #include "../utils/dtor.h"
00027
00028 void TableModel::installListener(TableModelListener *listener)
00029 {
00030 listeners.insert(listener);
00031 }
00032
00033 void TableModel::removeListener(TableModelListener *listener)
00034 {
00035 listeners.erase(listener);
00036 }
00037
00038 void TableModel::signalBeforeUpdate()
00039 {
00040 for (std::set<TableModelListener *>::const_iterator it = listeners.begin(); it != listeners.end(); it++)
00041 (*it)->modelUpdated(false);
00042 }
00043
00044 void TableModel::signalAfterUpdate()
00045 {
00046 for (std::set<TableModelListener *>::const_iterator it = listeners.begin(); it != listeners.end(); it++)
00047 (*it)->modelUpdated(true);
00048 }
00049
00050
00051 #define WIDGET_AT(row, column) (((row) * mColumns) + (column))
00052 #define DYN_SIZE(h) ((h) >= 0) // determines whether this size is tagged for auto-detection
00053
00054 StaticTableModel::StaticTableModel(int row, int column) :
00055 mRows(row),
00056 mColumns(column),
00057 mHeight(1)
00058 {
00059 mTableModel.resize(row * column, NULL);
00060 mWidths.resize(column, 1);
00061 }
00062
00063 StaticTableModel::~StaticTableModel()
00064 {
00065 delete_all(mTableModel);
00066 }
00067
00068 void StaticTableModel::resize()
00069 {
00070 mRows = getRows();
00071 mColumns = getColumns();
00072 mTableModel.resize(mRows * mColumns, NULL);
00073 }
00074
00075 void StaticTableModel::set(int row, int column, gcn::Widget *widget)
00076 {
00077 if (row >= mRows || row < 0
00078 || column >= mColumns || column < 0)
00079
00080 return;
00081
00082 if (DYN_SIZE(mHeight)
00083 && widget->getHeight() > mHeight)
00084 mHeight = widget->getHeight();
00085
00086 if (DYN_SIZE(mWidths[column])
00087 && widget->getWidth() > mWidths[column])
00088 mWidths[column] = widget->getWidth();
00089
00090 signalBeforeUpdate();
00091
00092 if (mTableModel[WIDGET_AT(row, column)])
00093 delete mTableModel[WIDGET_AT(row, column)];
00094
00095 mTableModel[WIDGET_AT(row, column)] = widget;
00096
00097 signalAfterUpdate();
00098 }
00099
00100 gcn::Widget *StaticTableModel::getElementAt(int row, int column)
00101 {
00102 return mTableModel[WIDGET_AT(row, column)];
00103 }
00104
00105 void StaticTableModel::fixColumnWidth(int column, int width)
00106 {
00107 if (width < 0
00108 || column < 0 || column >= mColumns)
00109 return;
00110
00111 mWidths[column] = -width;
00112 }
00113
00114 void StaticTableModel::fixRowHeight(int height)
00115 {
00116 if (height < 0)
00117 return;
00118
00119 mHeight = -height;
00120 }
00121
00122 int StaticTableModel::getRowHeight()
00123 {
00124 return abs(mHeight);
00125 }
00126
00127 int StaticTableModel::getColumnWidth(int column)
00128 {
00129 if (column < 0 || column >= mColumns)
00130 return 0;
00131
00132 return abs(mWidths[column]);
00133 }
00134
00135 int StaticTableModel::getRows()
00136 {
00137 return mRows;
00138 }
00139
00140 int StaticTableModel::getColumns()
00141 {
00142 return mColumns;
00143 }
00144
00145 int StaticTableModel::getWidth(void)
00146 {
00147 int width = 0;
00148
00149 for (unsigned int i = 0; i < mWidths.size(); i++)
00150 {
00151 width += mWidths[i];
00152 }
00153
00154 return width;
00155 }
00156
00157 int StaticTableModel::getHeight(void)
00158 {
00159 return (mColumns * mHeight);
00160 }
00161