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

生物技术

开发平台:

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_Row.H,v $
  8.  * Revision 1000.0  2003/10/31 20:40:11  gouriano
  9.  * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.3
  10.  *
  11.  * Revision 1.3  2003/09/16 14:37:12  dicuccio
  12.  * Cleaned up and clarified export specifiers - added a new specifier for each
  13.  * library
  14.  *
  15.  * Revision 1.2  2003/07/28 11:52:55  dicuccio
  16.  * Changed rows() / cols() accessors to be const
  17.  *
  18.  * Revision 1.1  2003/07/25 13:36:26  dicuccio
  19.  * Initial revision
  20.  *
  21.  * ===========================================================================
  22.  */
  23. #ifndef _FL_TABLE_ROW_H
  24. #define _FL_TABLE_ROW_H
  25. //
  26. // Fl_Table_Row -- A row oriented table widget
  27. //
  28. //    A class specializing in a table of rows.
  29. //    Handles row-specific selection behavior.
  30. //
  31. // Copyright 2002 by Greg Ercolano.
  32. //
  33. // This library is free software; you can redistribute it and/or
  34. // modify it under the terms of the GNU Library General Public
  35. // License as published by the Free Software Foundation; either
  36. // version 2 of the License, or (at your option) any later version.
  37. //
  38. // This library is distributed in the hope that it will be useful,
  39. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  40. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  41. // Library General Public License for more details.
  42. //
  43. // You should have received a copy of the GNU Library General Public
  44. // License along with this library; if not, write to the Free Software
  45. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  46. // USA.
  47. //
  48. // Please report all bugs and problems to "erco at seriss dot com".
  49. //
  50. //
  51. #include <corelib/ncbistd.hpp>
  52. #include <gui/widgets/Fl_Table/Fl_Table.H>
  53. class NCBI_GUIWIDGETS_FLTABLE_EXPORT Fl_Table_Row : public Fl_Table
  54. {
  55. private:
  56.     // An STL-ish vector without templates
  57.     class CharVector 
  58.     {
  59.         char *arr;
  60. int _size;
  61. void init() 
  62.     { arr = NULL; _size = 0; }
  63. void copy(char *newarr, int newsize) 
  64.     { size(newsize); memcpy(arr, newarr, newsize * sizeof(char)); }
  65.     public:
  66.         CharVector() { init(); } // CTOR
  67. ~CharVector() { if ( arr ) free(arr); arr = NULL; } // DTOR
  68. CharVector(CharVector&o) { init(); copy(o.arr, o._size); } // COPY CTOR
  69. CharVector& operator=(CharVector&o)  // ASSIGN
  70.     { init(); copy(o.arr, o._size); return(*this); }
  71. char operator[](int x) const { return(arr[x]); }
  72. char& operator[](int x) { return(arr[x]); }
  73. int size() { return(_size); }
  74. void size(int count)
  75. {
  76.     if ( count != _size )
  77. { arr = (char*)realloc(arr, count * sizeof(char)); _size = count; }
  78. }
  79. char pop_back() { char tmp = arr[_size-1]; _size--; return(tmp); }
  80. void push_back(char val) { int x = _size; size(_size+1); arr[x] = val; }
  81. char back() { return(arr[_size-1]); }
  82.     };
  83.     CharVector _rowselect; // selection flag for each row
  84.     // handle() state variables.
  85.     //    Put here instead of local statics in handle(), so more
  86.     //    than one instance can exist without crosstalk between.
  87.     //
  88.     int _dragging_select, // dragging out a selection?
  89. _last_row,
  90. _last_y, // last event's Y position
  91. _last_push_x, // last PUSH event's X position
  92. _last_push_y; // last PUSH event's Y position
  93. protected:
  94.     int handle(int event);
  95.     int find_cell(TableContext context, // find cell's x/y/w/h given r/c
  96.       int R, int C, int &X, int &Y, int &W, int &H)
  97.     {
  98. return(Fl_Table::find_cell(context, R, C, X, Y, W, H));
  99.     }
  100. public:
  101.     Fl_Table_Row(int X, int Y, int W, int H, const char *l=0) : Fl_Table(X,Y,W,H,l)
  102.     {
  103.         _dragging_select = 0;
  104. _last_row        = -1;
  105. _last_y          = -1;
  106. _last_push_x     = -1;
  107. _last_push_y     = -1;
  108.     }
  109.     ~Fl_Table_Row() { }
  110.     
  111.     void rows(int val); // set number of rows
  112.     int rows() const { return(Fl_Table::rows()); } // get number of rows
  113.     int row_selected(int row); // is row selected? (0=no, 1=yes, -1=range err)
  114.     int select_row(int row, int flag=1); // select state for row: flag:0=off, 1=on, 2=toggle
  115. // returns: 0=no change, 1=changed, -1=range err
  116.     void select_all_rows(int flag=1); // all rows to a known state
  117.     void clear()
  118.     {
  119.         rows(0); // implies clearing selection
  120. cols(0);
  121. Fl_Table::clear(); // clear the table
  122.     }
  123. };
  124. #endif /*_FL_TABLE_ROW_H*/