16 virtual unsigned col_width(unsigned col) const = 0;
17 virtual unsigned long cols() const = 0;
18 virtual unsigned long rows() const = 0;
19 virtual char col_sep(unsigned col) const;
20 virtual void draw_entry(unsigned long row, unsigned long col) = 0;
21 virtual unsigned key_pressed(int key, unsigned long &row, unsigned long &col);
22 virtual void print_statline(unsigned long row, unsigned long col) = 0;
23 virtual bool has_row_labels() const;
24 virtual bool has_col_labels() const;
25 virtual unsigned width() const;
26 virtual unsigned height() const;
28 virtual bool edit_entry(unsigned long row, unsigned long col, unsigned cx, unsigned cy);
36 #include "jdb_screen.h"
37 #include "kernel_console.h"
43 Jdb_table::edit_entry(unsigned long, unsigned long, unsigned, unsigned)
48 Jdb_table::has_row_labels() const
53 Jdb_table::has_col_labels() const
59 Jdb_table::key_pressed(int, unsigned long &, unsigned long &)
64 Jdb_table::col_sep(unsigned col) const
65 { return col?' ':':'; }
69 Jdb_table::width() const
70 { return Jdb_screen::width(); }
74 Jdb_table::height() const
75 { return Jdb_screen::height()-1; }
79 Jdb_table::vis_cols(unsigned long first_col, unsigned long *w)
83 unsigned const max_w = width();
87 if (c == 0 && has_row_labels())
90 cw = col_width(first_col + c);
106 Jdb_table::col_ofs(unsigned long first_col, unsigned long col)
112 if (c == 0 && has_row_labels())
113 w += col_width(0) + 1;
115 w += col_width(first_col + col) + 1;
123 Jdb_table::show(unsigned long crow, unsigned long ccol)
126 unsigned long absr = 0, absc = 0;
127 unsigned long old_absc = 1, old_absr = 1;
128 unsigned long dcols, drows; // drawn columns and rows
130 dcols = vis_cols(absc, &tmp);
131 if (drows>rows()) drows = rows();
133 unsigned long max_absr = 0, max_absc = 0;
134 if (rows() > drows) max_absr = rows() - drows;
135 if (cols() > dcols) max_absc = cols() - dcols;
137 unsigned long min_row, min_col;
138 min_row = has_col_labels()?1:0;
139 min_col = has_row_labels()?1:0;
144 if (absr>max_absr) absr = max_absr;
145 if (absc>max_absc) absc = max_absc;
152 if (crow >= rows()) crow = rows()-1;
153 if (ccol >= cols()) ccol = cols()-1;
154 if (crow < min_row) crow = min_row;
155 if (ccol < min_col) ccol = min_col;
157 if (redraw || old_absc != absc || old_absr != absr)
159 dcols = vis_cols(absc, &tmp);
162 Jdb::cursor(); // go home
163 draw_table(absr, absc, drows, dcols);
167 print_statline(crow, ccol);
169 Jdb::cursor(crow - absr + 1,
170 col_ofs(absc, ccol)+1);
172 int c = Kconsole::console()->getchar();
174 unsigned long nrow = crow;
175 unsigned long ncol = ccol;
176 unsigned kp = key_pressed(c, nrow, ncol);
180 if (ccol - absc >= dcols)
181 absc = ccol - dcols + 1;
183 else if (ncol < ccol)
193 if (crow - absr >= drows)
194 absr = crow - drows + 1;
196 else if (nrow < crow)
216 unsigned col_o = col_ofs(absc, ccol) + 1;
217 if (edit_entry(crow, ccol, col_o,
220 Jdb::cursor(crow - absr + 1, col_o);
221 draw_entry(crow,ccol);
222 Jdb::cursor(crow - absr + 1, col_o);
233 case KEY_CURSOR_HOME:
235 crow = absr = min_row;
236 ccol = absc = min_col;
245 case KEY_CURSOR_LEFT:
253 else if (crow > min_row)
256 if (ccol - absc > dcols)
263 case KEY_CURSOR_RIGHT:
265 if (ccol + 1 < cols())
268 if (ccol - absc > dcols)
271 else if (crow + 1 < rows())
273 absc = ccol = min_col;
275 if (crow - absr >= drows)
276 absr = crow - drows + 1;
288 case KEY_CURSOR_DOWN:
290 if (crow + 1 < rows())
293 if (crow - absr >= drows)
294 absr = crow - drows + 1;
299 if (crow >= drows + min_row)
315 if (crow + 1 + drows < rows())
318 if (absr + drows <= max_absr)
330 Jdb::abort_command();
333 if (Jdb::is_toplevel_cmd(c))
338 if (absc > max_absc) absc = max_absc;
339 if (absr > max_absr) absr = max_absr;
345 Jdb_table::draw_table(unsigned long row, unsigned long col,
346 unsigned lines, unsigned columns)
348 for (unsigned long y = 0; y < lines; ++y)
352 if (has_col_labels() && y == 0)
357 Kconsole::console()->getchar_chance();
358 for (unsigned long x = 0; x < columns; ++x)
361 if (has_row_labels() && x == 0)
377 if (width() == Jdb_screen::width())
380 printf("\033[%ldX", width()-w); // some consoles don't support this