00001
00002
00003
00004
00005 #ifndef _FL_TABLE_ROW_H
00006 #define _FL_TABLE_ROW_H
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include "Fl_Table.H"
00036
00054 class FL_EXPORT Fl_Table_Row : public Fl_Table {
00055 public:
00056 enum TableRowSelectMode {
00057 SELECT_NONE,
00058 SELECT_SINGLE,
00059 SELECT_MULTI
00060 };
00061 private:
00062
00063 class CharVector {
00064 char *arr;
00065 int _size;
00066 void init() {
00067 arr = NULL;
00068 _size = 0;
00069 }
00070 void copy(char *newarr, int newsize) {
00071 size(newsize);
00072 memcpy(arr, newarr, newsize * sizeof(char));
00073 }
00074 public:
00075 CharVector() {
00076 init();
00077 }
00078 ~CharVector() {
00079 if ( arr ) free(arr);
00080 arr = NULL;
00081 }
00082 CharVector(CharVector&o) {
00083 init();
00084 copy(o.arr, o._size);
00085 }
00086 CharVector& operator=(CharVector&o) {
00087 init();
00088 copy(o.arr, o._size);
00089 return(*this);
00090 }
00091 char operator[](int x) const {
00092 return(arr[x]);
00093 }
00094 char& operator[](int x) {
00095 return(arr[x]);
00096 }
00097 int size() {
00098 return(_size);
00099 }
00100 void size(int count) {
00101 if ( count != _size ) {
00102 arr = (char*)realloc(arr, count * sizeof(char));
00103 _size = count;
00104 }
00105 }
00106 char pop_back() {
00107 char tmp = arr[_size-1];
00108 _size--;
00109 return(tmp);
00110 }
00111 void push_back(char val) {
00112 int x = _size;
00113 size(_size+1);
00114 arr[x] = val;
00115 }
00116 char back() {
00117 return(arr[_size-1]);
00118 }
00119 };
00120 CharVector _rowselect;
00121
00122
00123
00124
00125
00126 int _dragging_select;
00127 int _last_row;
00128 int _last_y;
00129 int _last_push_x;
00130 int _last_push_y;
00131
00132 TableRowSelectMode _selectmode;
00133
00134 protected:
00135 int handle(int event);
00136 int find_cell(TableContext context,
00137 int R, int C, int &X, int &Y, int &W, int &H) {
00138 return(Fl_Table::find_cell(context, R, C, X, Y, W, H));
00139 }
00140
00141 public:
00147 Fl_Table_Row(int X, int Y, int W, int H, const char *l=0) : Fl_Table(X,Y,W,H,l) {
00148 _dragging_select = 0;
00149 _last_row = -1;
00150 _last_y = -1;
00151 _last_push_x = -1;
00152 _last_push_y = -1;
00153 _selectmode = SELECT_MULTI;
00154 }
00155
00160 ~Fl_Table_Row() { }
00161
00162 void rows(int val);
00163 int rows() {
00164 return(Fl_Table::rows());
00165 }
00166
00174 void type(TableRowSelectMode val);
00175
00176 TableRowSelectMode type() const {
00177 return(_selectmode);
00178 }
00179
00185 int row_selected(int row);
00186
00191 int select_row(int row, int flag=1);
00192
00193
00198 void select_all_rows(int flag=1);
00199
00200 void clear() {
00201 rows(0);
00202 cols(0);
00203 Fl_Table::clear();
00204 }
00205 };
00206
00207 #endif
00208
00209
00210
00211