⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fl_table.h

📁 ncbi源码
💻 H
字号:
/* * This is a third-party file, and is maintained and copyrighted as below. * Please see LICENSE at the root of the NCBI C++ toolkit for details on its * redistribution * * =========================================================================== * $Log: Fl_Table.H,v $ * Revision 1000.1  2004/06/01 19:51:32  gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4 * * Revision 1.4  2004/05/03 12:47:08  dicuccio * Added #include for gui/gui.hpp.  gui/utils ->gui/objutils where needed. * * Revision 1.3  2003/09/16 14:37:12  dicuccio * Cleaned up and clarified export specifiers - added a new specifier for each * library * * Revision 1.2  2003/07/28 11:52:55  dicuccio * Changed rows() / cols() accessors to be const * * Revision 1.1  2003/07/25 13:36:26  dicuccio * Initial revision * * =========================================================================== *///// Fl_Table -- A table widget//// Copyright 2002 by Greg Ercolano.//// This library is free software; you can redistribute it and/or// modify it under the terms of the GNU Library General Public// License as published by the Free Software Foundation; either// version 2 of the License, or (at your option) any later version.//// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU// Library General Public License for more details.//// You should have received a copy of the GNU Library General Public// License along with this library; if not, write to the Free Software// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307// USA.//// Please report all bugs and problems to "erco at seriss dot com".//// TODO://    o Auto scroll during dragged selection//    o Keyboard navigation (up/down/left/right arrow)//#ifndef _FL_TABLE_H#define _FL_TABLE_H#include <corelib/ncbistd.hpp>#include <gui/gui.hpp>#include <sys/types.h>#include <string.h>		// memcpy#ifdef _WIN32#include <malloc.h>		// WINDOWS: malloc/realloc#else /*_WIN32*/#include <stdlib.h>		// UNIX: malloc/realloc#endif /*_WIN32*/#include <FL/Fl.H>#include <FL/Fl_Group.H>#include <FL/Fl_Scroll.H>#include <FL/Fl_Box.H>#include <FL/Fl_Scrollbar.H>class NCBI_GUIWIDGETS_FLTABLE_EXPORT Fl_Table : public Fl_Group{public:    enum TableContext    {	CONTEXT_NONE = 0,	CONTEXT_STARTPAGE,	// before a page is redrawn	CONTEXT_ENDPAGE,	// after a page is redrawn	CONTEXT_ROW_HEADER,	// in the row header	CONTEXT_COL_HEADER,	// in the col header	CONTEXT_CELL,		// in one of the cells	CONTEXT_TABLE,		// in the table	CONTEXT_RC_RESIZE	// column or row being resized    };private:    int _rows, _cols,	 	// total rows/cols	_row_header_w,		// width of row header	_col_header_h,		// height of column header	_row_position,		// last row_position set (not necessarily == toprow!)	_col_position;		// last col_position set (not necessarily == leftcol!)    char _row_header,		// row header enabled?         _col_header,		// col header enabled?	 _row_resize,		// row resizing enabled?	 _col_resize;		// col resizing enabled?    int	 _row_resize_min,	// row minimum resizing height (default=1)	 _col_resize_min;	// col minimum resizing width (default=1)    // OPTIMIZATION: partial row/column redraw variables    int _redraw_toprow, _redraw_botrow,        _redraw_leftcol, _redraw_rightcol;    Fl_Color _row_header_color,             _col_header_color;    // An STL-ish vector without templates    class IntVector     {        int *arr;	unsigned int _size;	void init() 	    { arr = NULL; _size = 0; }	void copy(int *newarr, unsigned int newsize) 	    { size(newsize); memcpy(arr, newarr, newsize * sizeof(int)); }    public:        IntVector() { init(); }						// CTOR	~IntVector() { if ( arr ) free(arr); arr = NULL; }		// DTOR	IntVector(IntVector&o) { init(); copy(o.arr, o._size); }	// COPY CTOR	IntVector& operator=(IntVector&o) 				// ASSIGN	    { init(); copy(o.arr, o._size); return(*this); }	int operator[](int x) const { return(arr[x]); }	int& operator[](int x) { return(arr[x]); }	unsigned int size() { return(_size); }	void size(unsigned int count)	{	    if ( count != _size )		{ arr = (int*)realloc(arr, count * sizeof(int)); _size = count; }	}	int pop_back() { int tmp = arr[_size-1]; _size--; return(tmp); }	void push_back(int val) { unsigned int x = _size; size(_size+1); arr[x] = val; }	int back() { return(arr[_size-1]); }    };    IntVector        _colwidths,		// column widths in pixels        _rowheights;		// row heights in pixels    Fl_Cursor _last_cursor;	// last mouse cursor before changed to 'resize' cursor    // EVENT CALLBACK DATA    TableContext _callback_context;	// event context    int _callback_row, _callback_col;	// event row/col    // handle() state variables.    //    Put here instead of local statics in handle(), so more    //    than one Fl_Table can exist without crosstalk between them.    //    int _resizing_col,			// column being dragged	_resizing_row,			// row being dragged	_dragging_x,			// starting x position for horiz drag	_dragging_y,			// starting y position for vert drag	_last_row;			// last row we FL_PUSH'ed    // Redraw single cell    void _redraw_cell(TableContext context, int R, int C);protected:    enum ResizeFlag    {        RESIZE_NONE      = 0,        RESIZE_COL_LEFT  = 1,        RESIZE_COL_RIGHT = 2,        RESIZE_ROW_ABOVE = 3,        RESIZE_ROW_BELOW = 4    };    int table_w, table_h;			// table's virtual size (in pixels)    int toprow, botrow, 			// four corners of viewable table	leftcol, rightcol;    // OPTIMIZATION: Precomputed scroll positions for the toprow/leftcol    int toprow_scrollpos,        leftcol_scrollpos;    // Dimensions    int tix, tiy, tiw, tih,			// data table inner dimension xywh        tox, toy, tow, toh,			// data table outer dimension xywh	wix, wiy, wiw, wih;			// widget inner dimension xywh    Fl_Scroll *table;				// container for child fltk widgets (if any)    Fl_Scrollbar *vscrollbar, 			// vertical scrollbar                 *hscrollbar;			// horizontal scrollbar    // Fltk    int handle(int e);				// fltk handle() override    // Class maintenance    void recalc_dimensions();    void table_resized();			// table resized; recalc    void table_scrolled();			// table scrolled; recalc    void get_bounds(TableContext context,	// return x/y/w/h bounds for context                    int &X, int &Y, int &W, int &H);    void change_cursor(Fl_Cursor newcursor);	// change mouse cursor to some other shape    TableContext cursor2rowcol(int &R, int &C, ResizeFlag &resizeflag);						// find r/c given current x/y event    int find_cell(TableContext context,		// find cell's x/y/w/h given r/c    		 int R, int C, int &X, int &Y, int &W, int &H);    int row_col_clamp(TableContext context, int &R, int &C);    						// clamp r/c to known universe    // Called to draw cells    virtual void draw_cell(TableContext context, int R=0, int C=0,     			   int X=0, int Y=0, int W=0, int H=0)	{ }					// overridden by deriving class    long row_scroll_position(int row);		// find scroll position of row (in pixels)    long col_scroll_position(int col);		// find scroll position of col (in pixels)    int is_fltk_container() 			// does table contain fltk widgets?        { return( Fl_Group::children() > 3 ); }	// (ie. more than box and 2 scrollbars?)    static void scroll_cb(Fl_Widget*,void*);	// h/v scrollbar callback    void redraw_range(int toprow, int botrow, int leftcol, int rightcol)    {        if ( _redraw_toprow == -1 ) 	{	    // Initialize redraw range	    _redraw_toprow = toprow;	    _redraw_botrow = botrow;	    _redraw_leftcol = leftcol;	    _redraw_rightcol = rightcol;	}	else	{	    // Extend redraw range	    if ( toprow < _redraw_toprow ) _redraw_toprow = toprow;	    if ( botrow > _redraw_botrow ) _redraw_botrow = botrow;	    if ( leftcol < _redraw_leftcol ) _redraw_leftcol = leftcol;	    if ( rightcol > _redraw_rightcol ) _redraw_rightcol = rightcol;	}	// Indicate partial redraw needed of some cells	damage(FL_DAMAGE_CHILD);    }    // Interactive resizing happening?    int is_resizing() { return(_resizing_col | _resizing_row); }public:    Fl_Table(int X, int Y, int W, int H, const char *l=0);    ~Fl_Table();    virtual void clear() { rows(0); cols(0); }    // topline()    // middleline()    // bottomline()    inline void table_box(Fl_Boxtype val) { table->box(val); table_resized(); }    inline Fl_Boxtype table_box( void ) { return(table->box()); }    virtual void rows(int val);				// set/get number of rows    inline int rows() const        { return(_rows); }    virtual void cols(int val);				// set/get number of columns    inline int cols() const        { return(_cols); }    inline void visible_cells(int& r1, int& r2, int& c1, int& c2)        { r1 = toprow; r2 = botrow; c1 = leftcol; c2 = rightcol; }    inline int row_resize()        { return(_row_resize); }    void row_resize(int flag)			// enable row resizing        { _row_resize = flag; }    inline int col_resize()        { return(_col_resize); }    void col_resize(int flag)			// enable col resizing        { _col_resize = flag; }    inline int col_resize_min()			// column minimum resizing width        { return(_col_resize_min); }    void col_resize_min(int val)        { _col_resize_min = ( val < 1 ) ? 1 : val; }    inline int row_resize_min()			// column minimum resizing width        { return(_row_resize_min); }    void row_resize_min(int val)        { _row_resize_min = ( val < 1 ) ? 1 : val; }    inline int row_header()			// set/get row header enable flag        { return(_row_header); }    void row_header(int flag)        { _row_header = flag; table_resized(); redraw(); }    inline int col_header()			// set/get col header enable flag        { return(_col_header); }    void col_header(int flag)        { _col_header = flag; table_resized(); redraw(); }    inline void col_header_height(int height)	// set/get col header height        { _col_header_h = height; table_resized(); redraw(); }    inline int col_header_height()        { return(_col_header_h); }    inline void row_header_width(int width)	// set/get row header width        { _row_header_w = width; table_resized(); redraw(); }    inline int row_header_width()        { return(_row_header_w); }    inline void row_header_color(Fl_Color val)	// set/get row header color        { _row_header_color = val; redraw(); }    inline Fl_Color row_header_color()        { return(_row_header_color); }    inline void col_header_color(Fl_Color val)	// set/get col header color        { _col_header_color = val; redraw(); }    inline Fl_Color col_header_color()        { return(_col_header_color); }    void row_height(int row, int height);	// set/get row height    inline int row_height(int row)	{ return((row<0 || row>=(int)_rowheights.size()) ? 0 : _rowheights[row]); }    void col_width(int col, int width);		// set/get a column's width    inline int col_width(int col)	{ return((col<0 || col>=(int)_colwidths.size()) ? 0 : _colwidths[col]); }    void row_height_all(int height)		// set all row/col heights        { for ( int r=0; r<rows(); r++ ) row_height(r, height); }    void col_width_all(int width)        { for ( int c=0; c<cols(); c++ ) col_width(c, width); }    void row_position(int row);			// set/get table's current scroll position    void col_position(int col);    int row_position()				// current row position	{ return(_row_position); }    int col_position()				// current col position	{ return(_col_position); }    inline void top_row(int row)		// set/get top row (deprecated)        { row_position(row); }    inline int top_row()        { return(row_position()); }    void resize(int X, int Y, int W, int H);	// fltk resize() override    void draw(void);				// fltk draw() override    // Child group    void init_sizes() { table->init_sizes(); table->redraw(); }    void add(Fl_Widget& w) { table->add(w); }    void add(Fl_Widget* w) { table->add(w); }    void insert(Fl_Widget& w, int n) { table->insert(w,n); }    void insert(Fl_Widget& w, Fl_Widget* w2) { table->insert(w,w2); }    void remove(Fl_Widget& w) { table->remove(w); }    void begin() { table->begin(); }    void end()     {        table->end();	// HACK: Avoid showing Fl_Scroll; seems to erase screen	//       causing unnecessary flicker, even if its box() is FL_NO_BOX.	//	if ( table->children() > 2 ) { table->show(); }	else { table->hide(); }	Fl_Group::current((Fl_Group*)(Fl_Group::parent()));    }    Fl_Widget * const *array() { return(table->array()); }    Fl_Widget *child(int n) const { return(table->child(n)); }    int children() const { return(table->children()); }    int find(const Fl_Widget *w) const { return(table->find(w)); }    int find(const Fl_Widget &w) const { return(table->find(w)); }    // CALLBACKS    int callback_row() { return(_callback_row); }    int callback_col() { return(_callback_col); }    TableContext callback_context() { return(_callback_context); }    void do_callback(TableContext context, int row, int col)    {	_callback_context = context;	_callback_row = row;	_callback_col = col;	Fl_Widget::do_callback();    }};#define CONTEXT_NEWPAGE CONTEXT_STARTPAGE		// NEWPAGE deprecated#endif /*_FL_TABLE_H*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -