diff options
| author | Matthias Melcher <fltk@matthiasm.com> | 2009-11-14 13:05:37 +0000 |
|---|---|---|
| committer | Matthias Melcher <fltk@matthiasm.com> | 2009-11-14 13:05:37 +0000 |
| commit | fefa82e0b1e98d784455148940d84b454a128aad (patch) | |
| tree | 9d888cb9bc402708e0ad035a1c55d4b7703376a4 /test | |
| parent | 1238d1576b8e2bc15c097b23ebe0fdc4d3cdb527 (diff) | |
Adding Gerg's Fl_Table widget to FLTK 1.3 with kind permission. Documentation not yet added Support for both Visual Studio IDE's not yet added.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@6929 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'test')
| -rw-r--r-- | test/Makefile | 2 | ||||
| -rw-r--r-- | test/demo.menu | 4 | ||||
| -rw-r--r-- | test/table.cxx | 493 |
3 files changed, 498 insertions, 1 deletions
diff --git a/test/Makefile b/test/Makefile index eb249b433..1901fc9ad 100644 --- a/test/Makefile +++ b/test/Makefile @@ -90,6 +90,7 @@ CPPFILES =\ subwindow.cxx \ sudoku.cxx \ symbols.cxx \ + table.cxx \ tabs.cxx \ threads.cxx \ tile.cxx \ @@ -152,6 +153,7 @@ ALL = \ subwindow$(EXEEXT) \ sudoku$(EXEEXT) \ symbols$(EXEEXT) \ + table$(EXEEXT) \ tabs$(EXEEXT) \ $(THREADS) \ tile$(EXEEXT) \ diff --git a/test/demo.menu b/test/demo.menu index 32f6d08c4..0606d6b02 100644 --- a/test/demo.menu +++ b/test/demo.menu @@ -18,7 +18,9 @@ @x:Fl_Tile:tile @x:Fl_Scroll:scroll @x:Fl_Pack:pack - @x:Fl_Menu:menubar + @x:more...:@xm + @xm:Fl_Menu:menubar + @xm:Fl_Table:table @main:Window\nTests:@w @w:overlay:overlay diff --git a/test/table.cxx b/test/table.cxx new file mode 100644 index 000000000..eab8b69bb --- /dev/null +++ b/test/table.cxx @@ -0,0 +1,493 @@ +// +// 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)(int)data); + G_table->redraw(); +} + +void widgetbox_choice_cb(Fl_Widget *w, void *data) +{ + G_table->box((Fl_Boxtype)(int)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)(int)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()); +} |
