Fl_Table.H
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:13k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * This is a third-party file, and is maintained and copyrighted as below.
  3.  * Please see LICENSE at the root of the NCBI C++ toolkit for details on its
  4.  * redistribution
  5.  *
  6.  * ===========================================================================
  7.  * $Log: Fl_Table.H,v $
  8.  * Revision 1000.1  2004/06/01 19:51:32  gouriano
  9.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  10.  *
  11.  * Revision 1.4  2004/05/03 12:47:08  dicuccio
  12.  * Added #include for gui/gui.hpp.  gui/utils ->gui/objutils where needed.
  13.  *
  14.  * Revision 1.3  2003/09/16 14:37:12  dicuccio
  15.  * Cleaned up and clarified export specifiers - added a new specifier for each
  16.  * library
  17.  *
  18.  * Revision 1.2  2003/07/28 11:52:55  dicuccio
  19.  * Changed rows() / cols() accessors to be const
  20.  *
  21.  * Revision 1.1  2003/07/25 13:36:26  dicuccio
  22.  * Initial revision
  23.  *
  24.  * ===========================================================================
  25.  */
  26. //
  27. // Fl_Table -- A table widget
  28. //
  29. // Copyright 2002 by Greg Ercolano.
  30. //
  31. // This library is free software; you can redistribute it and/or
  32. // modify it under the terms of the GNU Library General Public
  33. // License as published by the Free Software Foundation; either
  34. // version 2 of the License, or (at your option) any later version.
  35. //
  36. // This library is distributed in the hope that it will be useful,
  37. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  38. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  39. // Library General Public License for more details.
  40. //
  41. // You should have received a copy of the GNU Library General Public
  42. // License along with this library; if not, write to the Free Software
  43. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  44. // USA.
  45. //
  46. // Please report all bugs and problems to "erco at seriss dot com".
  47. //
  48. // TODO:
  49. //    o Auto scroll during dragged selection
  50. //    o Keyboard navigation (up/down/left/right arrow)
  51. //
  52. #ifndef _FL_TABLE_H
  53. #define _FL_TABLE_H
  54. #include <corelib/ncbistd.hpp>
  55. #include <gui/gui.hpp>
  56. #include <sys/types.h>
  57. #include <string.h> // memcpy
  58. #ifdef _WIN32
  59. #include <malloc.h> // WINDOWS: malloc/realloc
  60. #else /*_WIN32*/
  61. #include <stdlib.h> // UNIX: malloc/realloc
  62. #endif /*_WIN32*/
  63. #include <FL/Fl.H>
  64. #include <FL/Fl_Group.H>
  65. #include <FL/Fl_Scroll.H>
  66. #include <FL/Fl_Box.H>
  67. #include <FL/Fl_Scrollbar.H>
  68. class NCBI_GUIWIDGETS_FLTABLE_EXPORT Fl_Table : public Fl_Group
  69. {
  70. public:
  71.     enum TableContext
  72.     {
  73. CONTEXT_NONE = 0,
  74. CONTEXT_STARTPAGE, // before a page is redrawn
  75. CONTEXT_ENDPAGE, // after a page is redrawn
  76. CONTEXT_ROW_HEADER, // in the row header
  77. CONTEXT_COL_HEADER, // in the col header
  78. CONTEXT_CELL, // in one of the cells
  79. CONTEXT_TABLE, // in the table
  80. CONTEXT_RC_RESIZE // column or row being resized
  81.     };
  82. private:
  83.     int _rows, _cols,   // total rows/cols
  84. _row_header_w, // width of row header
  85. _col_header_h, // height of column header
  86. _row_position, // last row_position set (not necessarily == toprow!)
  87. _col_position; // last col_position set (not necessarily == leftcol!)
  88.     char _row_header, // row header enabled?
  89.          _col_header, // col header enabled?
  90.  _row_resize, // row resizing enabled?
  91.  _col_resize; // col resizing enabled?
  92.     int
  93.  _row_resize_min, // row minimum resizing height (default=1)
  94.  _col_resize_min; // col minimum resizing width (default=1)
  95.     // OPTIMIZATION: partial row/column redraw variables
  96.     int _redraw_toprow, _redraw_botrow,
  97.         _redraw_leftcol, _redraw_rightcol;
  98.     Fl_Color _row_header_color,
  99.              _col_header_color;
  100.     // An STL-ish vector without templates
  101.     class IntVector 
  102.     {
  103.         int *arr;
  104. unsigned int _size;
  105. void init() 
  106.     { arr = NULL; _size = 0; }
  107. void copy(int *newarr, unsigned int newsize) 
  108.     { size(newsize); memcpy(arr, newarr, newsize * sizeof(int)); }
  109.     public:
  110.         IntVector() { init(); } // CTOR
  111. ~IntVector() { if ( arr ) free(arr); arr = NULL; } // DTOR
  112. IntVector(IntVector&o) { init(); copy(o.arr, o._size); } // COPY CTOR
  113. IntVector& operator=(IntVector&o)  // ASSIGN
  114.     { init(); copy(o.arr, o._size); return(*this); }
  115. int operator[](int x) const { return(arr[x]); }
  116. int& operator[](int x) { return(arr[x]); }
  117. unsigned int size() { return(_size); }
  118. void size(unsigned int count)
  119. {
  120.     if ( count != _size )
  121. { arr = (int*)realloc(arr, count * sizeof(int)); _size = count; }
  122. }
  123. int pop_back() { int tmp = arr[_size-1]; _size--; return(tmp); }
  124. void push_back(int val) { unsigned int x = _size; size(_size+1); arr[x] = val; }
  125. int back() { return(arr[_size-1]); }
  126.     };
  127.     IntVector
  128.         _colwidths, // column widths in pixels
  129.         _rowheights; // row heights in pixels
  130.     Fl_Cursor _last_cursor; // last mouse cursor before changed to 'resize' cursor
  131.     // EVENT CALLBACK DATA
  132.     TableContext _callback_context; // event context
  133.     int _callback_row, _callback_col; // event row/col
  134.     // handle() state variables.
  135.     //    Put here instead of local statics in handle(), so more
  136.     //    than one Fl_Table can exist without crosstalk between them.
  137.     //
  138.     int _resizing_col, // column being dragged
  139. _resizing_row, // row being dragged
  140. _dragging_x, // starting x position for horiz drag
  141. _dragging_y, // starting y position for vert drag
  142. _last_row; // last row we FL_PUSH'ed
  143.     // Redraw single cell
  144.     void _redraw_cell(TableContext context, int R, int C);
  145. protected:
  146.     enum ResizeFlag
  147.     {
  148.         RESIZE_NONE      = 0,
  149.         RESIZE_COL_LEFT  = 1,
  150.         RESIZE_COL_RIGHT = 2,
  151.         RESIZE_ROW_ABOVE = 3,
  152.         RESIZE_ROW_BELOW = 4
  153.     };
  154.     int table_w, table_h; // table's virtual size (in pixels)
  155.     int toprow, botrow,  // four corners of viewable table
  156. leftcol, rightcol;
  157.     // OPTIMIZATION: Precomputed scroll positions for the toprow/leftcol
  158.     int toprow_scrollpos,
  159.         leftcol_scrollpos;
  160.     // Dimensions
  161.     int tix, tiy, tiw, tih, // data table inner dimension xywh
  162.         tox, toy, tow, toh, // data table outer dimension xywh
  163. wix, wiy, wiw, wih; // widget inner dimension xywh
  164.     Fl_Scroll *table; // container for child fltk widgets (if any)
  165.     Fl_Scrollbar *vscrollbar,  // vertical scrollbar
  166.                  *hscrollbar; // horizontal scrollbar
  167.     // Fltk
  168.     int handle(int e); // fltk handle() override
  169.     // Class maintenance
  170.     void recalc_dimensions();
  171.     void table_resized(); // table resized; recalc
  172.     void table_scrolled(); // table scrolled; recalc
  173.     void get_bounds(TableContext context, // return x/y/w/h bounds for context
  174.                     int &X, int &Y, int &W, int &H);
  175.     void change_cursor(Fl_Cursor newcursor); // change mouse cursor to some other shape
  176.     TableContext cursor2rowcol(int &R, int &C, ResizeFlag &resizeflag);
  177. // find r/c given current x/y event
  178.     int find_cell(TableContext context, // find cell's x/y/w/h given r/c
  179.       int R, int C, int &X, int &Y, int &W, int &H);
  180.     int row_col_clamp(TableContext context, int &R, int &C);
  181.      // clamp r/c to known universe
  182.     // Called to draw cells
  183.     virtual void draw_cell(TableContext context, int R=0, int C=0, 
  184.         int X=0, int Y=0, int W=0, int H=0)
  185. { } // overridden by deriving class
  186.     long row_scroll_position(int row); // find scroll position of row (in pixels)
  187.     long col_scroll_position(int col); // find scroll position of col (in pixels)
  188.     int is_fltk_container()  // does table contain fltk widgets?
  189.         { return( Fl_Group::children() > 3 ); } // (ie. more than box and 2 scrollbars?)
  190.     static void scroll_cb(Fl_Widget*,void*); // h/v scrollbar callback
  191.     void redraw_range(int toprow, int botrow, int leftcol, int rightcol)
  192.     {
  193.         if ( _redraw_toprow == -1 ) 
  194. {
  195.     // Initialize redraw range
  196.     _redraw_toprow = toprow;
  197.     _redraw_botrow = botrow;
  198.     _redraw_leftcol = leftcol;
  199.     _redraw_rightcol = rightcol;
  200. }
  201. else
  202. {
  203.     // Extend redraw range
  204.     if ( toprow < _redraw_toprow ) _redraw_toprow = toprow;
  205.     if ( botrow > _redraw_botrow ) _redraw_botrow = botrow;
  206.     if ( leftcol < _redraw_leftcol ) _redraw_leftcol = leftcol;
  207.     if ( rightcol > _redraw_rightcol ) _redraw_rightcol = rightcol;
  208. }
  209. // Indicate partial redraw needed of some cells
  210. damage(FL_DAMAGE_CHILD);
  211.     }
  212.     // Interactive resizing happening?
  213.     int is_resizing() { return(_resizing_col | _resizing_row); }
  214. public:
  215.     Fl_Table(int X, int Y, int W, int H, const char *l=0);
  216.     ~Fl_Table();
  217.     virtual void clear() { rows(0); cols(0); }
  218.     // topline()
  219.     // middleline()
  220.     // bottomline()
  221.     inline void table_box(Fl_Boxtype val) { table->box(val); table_resized(); }
  222.     inline Fl_Boxtype table_box( void ) { return(table->box()); }
  223.     virtual void rows(int val); // set/get number of rows
  224.     inline int rows() const
  225.         { return(_rows); }
  226.     virtual void cols(int val); // set/get number of columns
  227.     inline int cols() const
  228.         { return(_cols); }
  229.     inline void visible_cells(int& r1, int& r2, int& c1, int& c2)
  230.         { r1 = toprow; r2 = botrow; c1 = leftcol; c2 = rightcol; }
  231.     inline int row_resize()
  232.         { return(_row_resize); }
  233.     void row_resize(int flag) // enable row resizing
  234.         { _row_resize = flag; }
  235.     inline int col_resize()
  236.         { return(_col_resize); }
  237.     void col_resize(int flag) // enable col resizing
  238.         { _col_resize = flag; }
  239.     inline int col_resize_min() // column minimum resizing width
  240.         { return(_col_resize_min); }
  241.     void col_resize_min(int val)
  242.         { _col_resize_min = ( val < 1 ) ? 1 : val; }
  243.     inline int row_resize_min() // column minimum resizing width
  244.         { return(_row_resize_min); }
  245.     void row_resize_min(int val)
  246.         { _row_resize_min = ( val < 1 ) ? 1 : val; }
  247.     inline int row_header() // set/get row header enable flag
  248.         { return(_row_header); }
  249.     void row_header(int flag)
  250.         { _row_header = flag; table_resized(); redraw(); }
  251.     inline int col_header() // set/get col header enable flag
  252.         { return(_col_header); }
  253.     void col_header(int flag)
  254.         { _col_header = flag; table_resized(); redraw(); }
  255.     inline void col_header_height(int height) // set/get col header height
  256.         { _col_header_h = height; table_resized(); redraw(); }
  257.     inline int col_header_height()
  258.         { return(_col_header_h); }
  259.     inline void row_header_width(int width) // set/get row header width
  260.         { _row_header_w = width; table_resized(); redraw(); }
  261.     inline int row_header_width()
  262.         { return(_row_header_w); }
  263.     inline void row_header_color(Fl_Color val) // set/get row header color
  264.         { _row_header_color = val; redraw(); }
  265.     inline Fl_Color row_header_color()
  266.         { return(_row_header_color); }
  267.     inline void col_header_color(Fl_Color val) // set/get col header color
  268.         { _col_header_color = val; redraw(); }
  269.     inline Fl_Color col_header_color()
  270.         { return(_col_header_color); }
  271.     void row_height(int row, int height); // set/get row height
  272.     inline int row_height(int row)
  273. { return((row<0 || row>=(int)_rowheights.size()) ? 0 : _rowheights[row]); }
  274.     void col_width(int col, int width); // set/get a column's width
  275.     inline int col_width(int col)
  276. { return((col<0 || col>=(int)_colwidths.size()) ? 0 : _colwidths[col]); }
  277.     void row_height_all(int height) // set all row/col heights
  278.         { for ( int r=0; r<rows(); r++ ) row_height(r, height); }
  279.     void col_width_all(int width)
  280.         { for ( int c=0; c<cols(); c++ ) col_width(c, width); }
  281.     void row_position(int row); // set/get table's current scroll position
  282.     void col_position(int col);
  283.     int row_position() // current row position
  284. { return(_row_position); }
  285.     int col_position() // current col position
  286. { return(_col_position); }
  287.     inline void top_row(int row) // set/get top row (deprecated)
  288.         { row_position(row); }
  289.     inline int top_row()
  290.         { return(row_position()); }
  291.     void resize(int X, int Y, int W, int H); // fltk resize() override
  292.     void draw(void); // fltk draw() override
  293.     // Child group
  294.     void init_sizes() { table->init_sizes(); table->redraw(); }
  295.     void add(Fl_Widget& w) { table->add(w); }
  296.     void add(Fl_Widget* w) { table->add(w); }
  297.     void insert(Fl_Widget& w, int n) { table->insert(w,n); }
  298.     void insert(Fl_Widget& w, Fl_Widget* w2) { table->insert(w,w2); }
  299.     void remove(Fl_Widget& w) { table->remove(w); }
  300.     void begin() { table->begin(); }
  301.     void end() 
  302.     {
  303.         table->end();
  304. // HACK: Avoid showing Fl_Scroll; seems to erase screen
  305. //       causing unnecessary flicker, even if its box() is FL_NO_BOX.
  306. //
  307. if ( table->children() > 2 ) { table->show(); }
  308. else { table->hide(); }
  309. Fl_Group::current((Fl_Group*)(Fl_Group::parent()));
  310.     }
  311.     Fl_Widget * const *array() { return(table->array()); }
  312.     Fl_Widget *child(int n) const { return(table->child(n)); }
  313.     int children() const { return(table->children()); }
  314.     int find(const Fl_Widget *w) const { return(table->find(w)); }
  315.     int find(const Fl_Widget &w) const { return(table->find(w)); }
  316.     // CALLBACKS
  317.     int callback_row() { return(_callback_row); }
  318.     int callback_col() { return(_callback_col); }
  319.     TableContext callback_context() { return(_callback_context); }
  320.     void do_callback(TableContext context, int row, int col)
  321.     {
  322. _callback_context = context;
  323. _callback_row = row;
  324. _callback_col = col;
  325. Fl_Widget::do_callback();
  326.     }
  327. };
  328. #define CONTEXT_NEWPAGE CONTEXT_STARTPAGE // NEWPAGE deprecated
  329. #endif /*_FL_TABLE_H*/