| 
							- //
 - // exercisetablerow -- Exercise all aspects of the Fl_Table_Row widget
 - //
 - 
 - #include <stdio.h>
 - #include <string.h>
 - #ifdef WIN32
 - #include <stdlib.h>	// atoi
 - #endif /*WIN32*/
 - 
 - #include <FL/Fl.H>
 - #include <FL/Fl_Window.H>
 - #include <FL/Fl_Input.H>
 - #include <FL/Fl_Check_Button.H>
 - #include <FL/Fl_Choice.H>
 - #include <FL/fl_draw.H>
 - #include <FL/fl_ask.H>
 - #include <FL/Fl_Table_Row.H>
 - 
 - // Simple demonstration class to derive from Fl_Table_Row
 - class DemoTable : public Fl_Table_Row
 - {
 - private:
 -     Fl_Color cell_bgcolor;				// color of cell's bg color
 -     Fl_Color cell_fgcolor;				// color of cell's fg color
 - 
 - protected:
 -     void draw_cell(TableContext context,  		// table cell drawing
 -     		   int R=0, int C=0, int X=0, int Y=0, int W=0, int H=0);
 -     static void event_callback(Fl_Widget*, void*);
 -     void event_callback2();				// callback for table events
 - 
 - public:
 -     DemoTable(int x, int y, int w, int h, const char *l=0) : Fl_Table_Row(x,y,w,h,l)
 -     {
 -         cell_bgcolor = FL_WHITE;
 -         cell_fgcolor = FL_BLACK;
 -         callback(&event_callback, (void*)this);
 - 	end();
 -     }
 -     ~DemoTable() { }
 -     Fl_Color GetCellFGColor() const { return(cell_fgcolor); }
 -     Fl_Color GetCellBGColor() const { return(cell_bgcolor); }
 -     void SetCellFGColor(Fl_Color val) { cell_fgcolor = val; }
 -     void SetCellBGColor(Fl_Color val) { cell_bgcolor = val; }
 - };
 - 
 - // Handle drawing all cells in table
 - void DemoTable::draw_cell(TableContext context, 
 - 			  int R, int C, int X, int Y, int W, int H)
 - {
 -     static char s[40];
 -     sprintf(s, "%d/%d", R, C);		// text for each cell
 - 
 -     switch ( context )
 -     {
 - 	case CONTEXT_STARTPAGE:
 - 	    fl_font(FL_HELVETICA, 16);
 - 	    return;
 - 
 - 	case CONTEXT_COL_HEADER:
 - 	    fl_push_clip(X, Y, W, H);
 - 	    {
 - 		fl_draw_box(FL_THIN_UP_BOX, X, Y, W, H, col_header_color());
 - 		fl_color(FL_BLACK);
 - 		fl_draw(s, X, Y, W, H, FL_ALIGN_CENTER);
 - 	    }
 - 	    fl_pop_clip();
 - 	    return;
 - 
 - 	case CONTEXT_ROW_HEADER:
 - 	    fl_push_clip(X, Y, W, H);
 - 	    {
 - 		fl_draw_box(FL_THIN_UP_BOX, X, Y, W, H, row_header_color());
 - 		fl_color(FL_BLACK);
 - 		fl_draw(s, X, Y, W, H, FL_ALIGN_CENTER);
 - 	    }
 - 	    fl_pop_clip();
 - 	    return;
 - 
 - 	case CONTEXT_CELL:
 - 	{
 - 	    fl_push_clip(X, Y, W, H);
 - 	    {
 - 	        // BG COLOR
 - 		fl_color( row_selected(R) ? selection_color() : cell_bgcolor);
 - 		fl_rectf(X, Y, W, H);
 - 
 - 		// TEXT
 - 		fl_color(cell_fgcolor);
 - 		fl_draw(s, X, Y, W, H, FL_ALIGN_CENTER);
 - 
 - 		// BORDER
 - 		fl_color(color()); 
 - 		fl_rect(X, Y, W, H);
 - 	    }
 - 	    fl_pop_clip();
 - 	    return;
 - 	}
 - 
 - 	case CONTEXT_TABLE:
 - 	    fprintf(stderr, "TABLE CONTEXT CALLED\n");
 - 	    return;
 - 
 - 	case CONTEXT_ENDPAGE:
 - 	case CONTEXT_RC_RESIZE:
 - 	case CONTEXT_NONE:
 - 	    return;
 -     }
 - }
 - 
 - // Callback whenever someone clicks on different parts of the table
 - void DemoTable::event_callback(Fl_Widget*, void *data)
 - {
 -     DemoTable *o = (DemoTable*)data;
 -     o->event_callback2();
 - }
 - 
 - void DemoTable::event_callback2()
 - {
 -     int R = callback_row(),
 -         C = callback_col();
 -     TableContext context = callback_context();
 -     printf("'%s' callback: ", (label() ? label() : "?"));
 -     printf("Row=%d Col=%d Context=%d Event=%d InteractiveResize? %d\n",
 - 	    R, C, (int)context, (int)Fl::event(), (int)is_interactive_resize());
 - }
 - 
 - // GLOBAL TABLE WIDGET
 - static DemoTable *G_table = 0;
 - 
 - void setrows_cb(Fl_Widget*, void *data)
 - {
 -     Fl_Input *in = (Fl_Input*)data;
 -     int rows = atoi(in->value());
 -     if ( rows < 0 ) rows = 0;
 -     G_table->rows(rows);
 - }
 - 
 - void setcols_cb(Fl_Widget*, void *data)
 - {
 -     Fl_Input *in = (Fl_Input*)data;
 -     int cols = atoi(in->value());
 -     if ( cols < 0 ) cols = 0;
 -     G_table->cols(cols);
 - }
 - 
 - void setrowheader_cb(Fl_Widget*, void *data)
 - {
 -     Fl_Check_Button *check = (Fl_Check_Button*)data;
 -     G_table->row_header(check->value());
 - }
 - 
 - void setcolheader_cb(Fl_Widget*, void *data)
 - {
 -     Fl_Check_Button *check = (Fl_Check_Button*)data;
 -     G_table->col_header(check->value());
 - }
 - 
 - void setrowresize_cb(Fl_Widget*, void *data)
 - {
 -     Fl_Check_Button *check = (Fl_Check_Button*)data;
 -     G_table->row_resize(check->value());
 - }
 - 
 - void setcolresize_cb(Fl_Widget*, void *data)
 - {
 -     Fl_Check_Button *check = (Fl_Check_Button*)data;
 -     G_table->col_resize(check->value());
 - }
 - 
 - void setpositionrow_cb(Fl_Widget *w, void *data)
 - {
 -     Fl_Input *in = (Fl_Input*)data;
 -     int toprow = atoi(in->value());
 -     if ( toprow < 0 || toprow >= G_table->rows() ) 
 -         { fl_alert("Must be in range 0 thru #rows"); }
 -     else
 -         { G_table->row_position(toprow); }
 - }
 - 
 - void setpositioncol_cb(Fl_Widget *w, void *data)
 - {
 -     Fl_Input *in = (Fl_Input*)data;
 -     int leftcol = atoi(in->value());
 -     if ( leftcol < 0 || leftcol >= G_table->cols() ) 
 -         { fl_alert("Must be in range 0 thru #cols"); }
 -     else
 -         { G_table->col_position(leftcol); }
 - }
 - 
 - void setrowheaderwidth_cb(Fl_Widget *w, void *data)
 - {
 -     Fl_Input *in = (Fl_Input*)data;
 -     int val = atoi(in->value());
 -     if ( val < 1 ) { val = 1; in->value("1"); }
 -     G_table->row_header_width(val);
 - }
 - 
 - void setcolheaderheight_cb(Fl_Widget *w, void *data)
 - {
 -     Fl_Input *in = (Fl_Input*)data;
 -     int val = atoi(in->value());
 -     if ( val < 1 ) { val = 1; in->value("1"); }
 -     G_table->col_header_height(val);
 - }
 - 
 - void setrowheadercolor_cb(Fl_Widget *w, void *data)
 - {
 -     Fl_Input *in = (Fl_Input*)data;
 -     int val = atoi(in->value());
 -     if ( val < 0 ) { fl_alert("Must be a color >0"); }
 -     else { G_table->row_header_color(Fl_Color(val)); }
 - }
 - 
 - void setcolheadercolor_cb(Fl_Widget *w, void *data)
 - {
 -     Fl_Input *in = (Fl_Input*)data;
 -     int val = atoi(in->value());
 -     if ( val < 0 ) { fl_alert("Must be a color >0"); }
 -     else { G_table->col_header_color(Fl_Color(val)); }
 - }
 - 
 - void setrowheightall_cb(Fl_Widget *w, void *data)
 - {
 -     Fl_Input *in = (Fl_Input*)data;
 -     int val = atoi(in->value());
 -     if ( val < 0 ) { val = 0; in->value("0"); }
 -     G_table->row_height_all(val);
 - }
 - 
 - void setcolwidthall_cb(Fl_Widget *w, void *data)
 - {
 -     Fl_Input *in = (Fl_Input*)data;
 -     int val = atoi(in->value());
 -     if ( val < 0 ) { val = 0; in->value("0"); }
 -     G_table->col_width_all(val);
 - }
 - 
 - void settablecolor_cb(Fl_Widget *w, void *data)
 - {
 -     Fl_Input *in = (Fl_Input*)data;
 -     int val = atoi(in->value());
 -     if ( val < 0 ) { fl_alert("Must be a color >0"); }
 -     else { G_table->color(Fl_Color(val)); }
 -     G_table->redraw();
 - }
 - 
 - void setcellfgcolor_cb(Fl_Widget *w, void *data)
 - {
 -     Fl_Input *in = (Fl_Input*)data;
 -     int val = atoi(in->value());
 -     if ( val < 0 ) { fl_alert("Must be a color >0"); }
 -     else { G_table->SetCellFGColor(Fl_Color(val)); }
 -     G_table->redraw();
 - }
 - 
 - void setcellbgcolor_cb(Fl_Widget *w, void *data)
 - {
 -     Fl_Input *in = (Fl_Input*)data;
 -     int val = atoi(in->value());
 -     if ( val < 0 ) { fl_alert("Must be a color >0"); }
 -     else { G_table->SetCellBGColor(Fl_Color(val)); }
 -     G_table->redraw();
 - }
 - 
 - char *itoa(int val)
 - {
 -     static char s[80];
 -     sprintf(s, "%d", val);
 -     return(s);
 - }
 - 
 - void tablebox_choice_cb(Fl_Widget *w, void *data)
 - {
 -     G_table->table_box((Fl_Boxtype)(fl_intptr_t)data);
 -     G_table->redraw();
 - }
 - 
 - void widgetbox_choice_cb(Fl_Widget *w, void *data)
 - {
 -     G_table->box((Fl_Boxtype)(fl_intptr_t)data);
 -     G_table->resize(G_table->x(), G_table->y(), G_table->w(), G_table->h());
 - }
 - 
 - void type_choice_cb(Fl_Widget *w, void *data)
 - {
 -     G_table->type((Fl_Table_Row::TableRowSelectMode)(fl_intptr_t)data);
 - }
 - 
 - Fl_Menu_Item tablebox_choices[] = {
 -   {"No Box",         0, tablebox_choice_cb, (void*)FL_NO_BOX },
 -   {"Flat Box",       0, tablebox_choice_cb, (void*)FL_FLAT_BOX },
 -   {"Up Box",         0, tablebox_choice_cb, (void*)FL_UP_BOX },
 -   {"Down Box",       0, tablebox_choice_cb, (void*)FL_DOWN_BOX },
 -   {"Up Frame",       0, tablebox_choice_cb, (void*)FL_UP_FRAME },
 -   {"Down Frame",     0, tablebox_choice_cb, (void*)FL_DOWN_FRAME },
 -   {"Thin Up Box",    0, tablebox_choice_cb, (void*)FL_THIN_UP_BOX },
 -   {"Thin Down Box",  0, tablebox_choice_cb, (void*)FL_THIN_DOWN_BOX },
 -   {"Thin Up Frame",  0, tablebox_choice_cb, (void*)FL_THIN_UP_FRAME },
 -   {"Thin Down Frame",0, tablebox_choice_cb, (void*)FL_THIN_DOWN_FRAME },
 -   {"Engraved Box",   0, tablebox_choice_cb, (void*)FL_ENGRAVED_BOX },
 -   {"Embossed Box",   0, tablebox_choice_cb, (void*)FL_EMBOSSED_BOX },
 -   {"Engraved Frame", 0, tablebox_choice_cb, (void*)FL_ENGRAVED_FRAME },
 -   {"Embossed Frame", 0, tablebox_choice_cb, (void*)FL_EMBOSSED_FRAME },
 -   {"Border Box",     0, tablebox_choice_cb, (void*)FL_BORDER_BOX },
 -   {"Shadow Box",     0, tablebox_choice_cb, (void*)FL_SHADOW_BOX },
 -   {"Border Frame",   0, tablebox_choice_cb, (void*)FL_BORDER_FRAME },
 -   {0}
 - };
 - 
 - Fl_Menu_Item widgetbox_choices[] = {
 -   {"No Box",         0, widgetbox_choice_cb, (void*)FL_NO_BOX },
 - //{"Flat Box",       0, widgetbox_choice_cb, (void*)FL_FLAT_BOX },
 - //{"Up Box",         0, widgetbox_choice_cb, (void*)FL_UP_BOX },
 - //{"Down Box",       0, widgetbox_choice_cb, (void*)FL_DOWN_BOX },
 -   {"Up Frame",       0, widgetbox_choice_cb, (void*)FL_UP_FRAME },
 -   {"Down Frame",     0, widgetbox_choice_cb, (void*)FL_DOWN_FRAME },
 - //{"Thin Up Box",    0, widgetbox_choice_cb, (void*)FL_THIN_UP_BOX },
 - //{"Thin Down Box",  0, widgetbox_choice_cb, (void*)FL_THIN_DOWN_BOX },
 -   {"Thin Up Frame",  0, widgetbox_choice_cb, (void*)FL_THIN_UP_FRAME },
 -   {"Thin Down Frame",0, widgetbox_choice_cb, (void*)FL_THIN_DOWN_FRAME },
 - //{"Engraved Box",   0, widgetbox_choice_cb, (void*)FL_ENGRAVED_BOX },
 - //{"Embossed Box",   0, widgetbox_choice_cb, (void*)FL_EMBOSSED_BOX },
 -   {"Engraved Frame", 0, widgetbox_choice_cb, (void*)FL_ENGRAVED_FRAME },
 -   {"Embossed Frame", 0, widgetbox_choice_cb, (void*)FL_EMBOSSED_FRAME },
 - //{"Border Box",     0, widgetbox_choice_cb, (void*)FL_BORDER_BOX },
 - //{"Shadow Box",     0, widgetbox_choice_cb, (void*)FL_SHADOW_BOX },
 -   {"Border Frame",   0, widgetbox_choice_cb, (void*)FL_BORDER_FRAME },
 -   {0}
 - };
 - 
 - Fl_Menu_Item type_choices[] = {
 -   {"SelectNone",         0, type_choice_cb, (void*)Fl_Table_Row::SELECT_NONE },
 -   {"SelectSingle",       0, type_choice_cb, (void*)Fl_Table_Row::SELECT_SINGLE },
 -   {"SelectMulti",        0, type_choice_cb, (void*)Fl_Table_Row::SELECT_MULTI },
 -   {0}
 - };
 - 
 - int main(int argc, char **argv)
 - {
 -     Fl_Window win(900, 730);
 - 
 -     G_table = new DemoTable(20, 20, 860, 460, "Demo");
 -     G_table->selection_color(FL_YELLOW);
 -     G_table->when(FL_WHEN_RELEASE|FL_WHEN_CHANGED);
 -     G_table->table_box(FL_NO_BOX);
 -     G_table->col_resize_min(4);
 -     G_table->row_resize_min(4);
 - 
 -     // ROWS
 -     G_table->row_header(1);
 -     G_table->row_header_width(60);
 -     G_table->row_resize(1);
 -     G_table->rows(500);
 -     G_table->row_height_all(20);
 - 
 -     // COLS
 -     G_table->cols(500);
 -     G_table->col_header(1);
 -     G_table->col_header_height(25);
 -     G_table->col_resize(1);
 -     G_table->col_width_all(80);
 - 
 -     // Add children to window
 -     win.begin();
 - 
 -     // ROW
 -     Fl_Input setrows(150, 500, 120, 25, "Rows");
 -     setrows.labelsize(12);
 -     setrows.value(itoa(G_table->rows()));
 -     setrows.callback(setrows_cb, (void*)&setrows);
 -     setrows.when(FL_WHEN_RELEASE);
 - 
 -     Fl_Input rowheightall(400, 500, 120, 25, "Row Height");
 -     rowheightall.labelsize(12);
 -     rowheightall.value(itoa(G_table->row_height(0)));
 -     rowheightall.callback(setrowheightall_cb, (void*)&rowheightall);
 -     rowheightall.when(FL_WHEN_RELEASE);
 - 
 -     Fl_Input positionrow(650, 500, 120, 25, "Row Position");
 -     positionrow.labelsize(12);
 -     positionrow.value("1");
 -     positionrow.callback(setpositionrow_cb, (void*)&positionrow);
 -     positionrow.when(FL_WHEN_RELEASE);
 - 
 -     // COL
 -     Fl_Input setcols(150, 530, 120, 25, "Cols");
 -     setcols.labelsize(12);
 -     setcols.value(itoa(G_table->cols()));
 -     setcols.callback(setcols_cb, (void*)&setcols);
 -     setcols.when(FL_WHEN_RELEASE);
 - 
 -     Fl_Input colwidthall(400, 530, 120, 25, "Col Width");
 -     colwidthall.labelsize(12);
 -     colwidthall.value(itoa(G_table->col_width(0)));
 -     colwidthall.callback(setcolwidthall_cb, (void*)&colwidthall);
 -     colwidthall.when(FL_WHEN_RELEASE);
 - 
 -     Fl_Input positioncol(650, 530, 120, 25, "Col Position");
 -     positioncol.labelsize(12);
 -     positioncol.value("1");
 -     positioncol.callback(setpositioncol_cb, (void*)&positioncol);
 -     positioncol.when(FL_WHEN_RELEASE);
 - 
 -     // ROW HEADER
 -     Fl_Input rowheaderwidth(150, 570, 120, 25, "Row Header Width");
 -     rowheaderwidth.labelsize(12);
 -     rowheaderwidth.value(itoa(G_table->row_header_width()));
 -     rowheaderwidth.callback(setrowheaderwidth_cb, (void*)&rowheaderwidth);
 -     rowheaderwidth.when(FL_WHEN_RELEASE);
 - 
 -     Fl_Input rowheadercolor(400, 570, 120, 25, "Row Header Color");
 -     rowheadercolor.labelsize(12);
 -     rowheadercolor.value(itoa((int)G_table->row_header_color()));
 -     rowheadercolor.callback(setrowheadercolor_cb, (void*)&rowheadercolor);
 -     rowheadercolor.when(FL_WHEN_RELEASE);
 - 
 -     Fl_Check_Button rowheader(550, 570, 120, 25, "Row Headers?");
 -     rowheader.labelsize(12);
 -     rowheader.callback(setrowheader_cb, (void*)&rowheader);
 -     rowheader.value(G_table->row_header() ? 1 : 0);
 - 
 -     Fl_Check_Button rowresize(700, 570, 120, 25, "Row Resize?");
 -     rowresize.labelsize(12);
 -     rowresize.callback(setrowresize_cb, (void*)&rowresize);
 -     rowresize.value(G_table->row_resize() ? 1 : 0);
 - 
 -     // COL HEADER
 -     Fl_Input colheaderheight(150, 600, 120, 25, "Col Header Height");
 -     colheaderheight.labelsize(12);
 -     colheaderheight.value(itoa(G_table->col_header_height()));
 -     colheaderheight.callback(setcolheaderheight_cb, (void*)&colheaderheight);
 -     colheaderheight.when(FL_WHEN_RELEASE);
 - 
 -     Fl_Input colheadercolor(400, 600, 120, 25, "Col Header Color");
 -     colheadercolor.labelsize(12);
 -     colheadercolor.value(itoa((int)G_table->col_header_color()));
 -     colheadercolor.callback(setcolheadercolor_cb, (void*)&colheadercolor);
 -     colheadercolor.when(FL_WHEN_RELEASE);
 - 
 -     Fl_Check_Button colheader(550, 600, 120, 25, "Col Headers?");
 -     colheader.labelsize(12);
 -     colheader.callback(setcolheader_cb, (void*)&colheader);
 -     colheader.value(G_table->col_header() ? 1 : 0);
 - 
 -     Fl_Check_Button colresize(700, 600, 120, 25, "Col Resize?");
 -     colresize.labelsize(12);
 -     colresize.callback(setcolresize_cb, (void*)&colresize);
 -     colresize.value(G_table->col_resize() ? 1 : 0);
 - 
 -     Fl_Choice tablebox(150, 640, 120, 25, "Table Box");
 -     tablebox.labelsize(12);
 -     tablebox.textsize(12);
 -     tablebox.menu(tablebox_choices);
 -     tablebox.value(0);
 - 
 -     Fl_Choice widgetbox(150, 670, 120, 25, "Widget Box");
 -     widgetbox.labelsize(12);
 -     widgetbox.textsize(12);
 -     widgetbox.menu(widgetbox_choices);
 -     widgetbox.value(2);		// down frame
 - 
 -     Fl_Input tablecolor(400, 640, 120, 25, "Table Color");
 -     tablecolor.labelsize(12);
 -     tablecolor.value(itoa((int)G_table->color()));
 -     tablecolor.callback(settablecolor_cb, (void*)&tablecolor);
 -     tablecolor.when(FL_WHEN_RELEASE);
 - 
 -     Fl_Input cellbgcolor(400, 670, 120, 25, "Cell BG Color");
 -     cellbgcolor.labelsize(12);
 -     cellbgcolor.value(itoa((int)G_table->GetCellBGColor()));
 -     cellbgcolor.callback(setcellbgcolor_cb, (void*)&cellbgcolor);
 -     cellbgcolor.when(FL_WHEN_RELEASE);
 - 
 -     Fl_Input cellfgcolor(400, 700, 120, 25, "Cell FG Color");
 -     cellfgcolor.labelsize(12);
 -     cellfgcolor.value(itoa((int)G_table->GetCellFGColor()));
 -     cellfgcolor.callback(setcellfgcolor_cb, (void*)&cellfgcolor);
 -     cellfgcolor.when(FL_WHEN_RELEASE);
 - 
 -     Fl_Choice type(650, 640, 120, 25, "Type");
 -     type.labelsize(12);
 -     type.textsize(12);
 -     type.menu(type_choices);
 -     type.value(2);
 - 
 -     win.end();
 -     win.resizable(*G_table);
 -     win.show(argc, argv);
 - 
 -     return(Fl::run());
 - }
 
 
  |