summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorMatthias Melcher <fltk@matthiasm.com>2009-11-14 13:05:37 +0000
committerMatthias Melcher <fltk@matthiasm.com>2009-11-14 13:05:37 +0000
commitfefa82e0b1e98d784455148940d84b454a128aad (patch)
tree9d888cb9bc402708e0ad035a1c55d4b7703376a4 /test
parent1238d1576b8e2bc15c097b23ebe0fdc4d3cdb527 (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/Makefile2
-rw-r--r--test/demo.menu4
-rw-r--r--test/table.cxx493
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());
+}