You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

494 lines
15KB

  1. //
  2. // exercisetablerow -- Exercise all aspects of the Fl_Table_Row widget
  3. //
  4. #include <stdio.h>
  5. #include <string.h>
  6. #ifdef WIN32
  7. #include <stdlib.h> // atoi
  8. #endif /*WIN32*/
  9. #include <FL/Fl.H>
  10. #include <FL/Fl_Window.H>
  11. #include <FL/Fl_Input.H>
  12. #include <FL/Fl_Check_Button.H>
  13. #include <FL/Fl_Choice.H>
  14. #include <FL/fl_draw.H>
  15. #include <FL/fl_ask.H>
  16. #include <FL/Fl_Table_Row.H>
  17. // Simple demonstration class to derive from Fl_Table_Row
  18. class DemoTable : public Fl_Table_Row
  19. {
  20. private:
  21. Fl_Color cell_bgcolor; // color of cell's bg color
  22. Fl_Color cell_fgcolor; // color of cell's fg color
  23. protected:
  24. void draw_cell(TableContext context, // table cell drawing
  25. int R=0, int C=0, int X=0, int Y=0, int W=0, int H=0);
  26. static void event_callback(Fl_Widget*, void*);
  27. void event_callback2(); // callback for table events
  28. public:
  29. DemoTable(int x, int y, int w, int h, const char *l=0) : Fl_Table_Row(x,y,w,h,l)
  30. {
  31. cell_bgcolor = FL_WHITE;
  32. cell_fgcolor = FL_BLACK;
  33. callback(&event_callback, (void*)this);
  34. end();
  35. }
  36. ~DemoTable() { }
  37. Fl_Color GetCellFGColor() const { return(cell_fgcolor); }
  38. Fl_Color GetCellBGColor() const { return(cell_bgcolor); }
  39. void SetCellFGColor(Fl_Color val) { cell_fgcolor = val; }
  40. void SetCellBGColor(Fl_Color val) { cell_bgcolor = val; }
  41. };
  42. // Handle drawing all cells in table
  43. void DemoTable::draw_cell(TableContext context,
  44. int R, int C, int X, int Y, int W, int H)
  45. {
  46. static char s[40];
  47. sprintf(s, "%d/%d", R, C); // text for each cell
  48. switch ( context )
  49. {
  50. case CONTEXT_STARTPAGE:
  51. fl_font(FL_HELVETICA, 16);
  52. return;
  53. case CONTEXT_COL_HEADER:
  54. fl_push_clip(X, Y, W, H);
  55. {
  56. fl_draw_box(FL_THIN_UP_BOX, X, Y, W, H, col_header_color());
  57. fl_color(FL_BLACK);
  58. fl_draw(s, X, Y, W, H, FL_ALIGN_CENTER);
  59. }
  60. fl_pop_clip();
  61. return;
  62. case CONTEXT_ROW_HEADER:
  63. fl_push_clip(X, Y, W, H);
  64. {
  65. fl_draw_box(FL_THIN_UP_BOX, X, Y, W, H, row_header_color());
  66. fl_color(FL_BLACK);
  67. fl_draw(s, X, Y, W, H, FL_ALIGN_CENTER);
  68. }
  69. fl_pop_clip();
  70. return;
  71. case CONTEXT_CELL:
  72. {
  73. fl_push_clip(X, Y, W, H);
  74. {
  75. // BG COLOR
  76. fl_color( row_selected(R) ? selection_color() : cell_bgcolor);
  77. fl_rectf(X, Y, W, H);
  78. // TEXT
  79. fl_color(cell_fgcolor);
  80. fl_draw(s, X, Y, W, H, FL_ALIGN_CENTER);
  81. // BORDER
  82. fl_color(color());
  83. fl_rect(X, Y, W, H);
  84. }
  85. fl_pop_clip();
  86. return;
  87. }
  88. case CONTEXT_TABLE:
  89. fprintf(stderr, "TABLE CONTEXT CALLED\n");
  90. return;
  91. case CONTEXT_ENDPAGE:
  92. case CONTEXT_RC_RESIZE:
  93. case CONTEXT_NONE:
  94. return;
  95. }
  96. }
  97. // Callback whenever someone clicks on different parts of the table
  98. void DemoTable::event_callback(Fl_Widget*, void *data)
  99. {
  100. DemoTable *o = (DemoTable*)data;
  101. o->event_callback2();
  102. }
  103. void DemoTable::event_callback2()
  104. {
  105. int R = callback_row(),
  106. C = callback_col();
  107. TableContext context = callback_context();
  108. printf("'%s' callback: ", (label() ? label() : "?"));
  109. printf("Row=%d Col=%d Context=%d Event=%d InteractiveResize? %d\n",
  110. R, C, (int)context, (int)Fl::event(), (int)is_interactive_resize());
  111. }
  112. // GLOBAL TABLE WIDGET
  113. static DemoTable *G_table = 0;
  114. void setrows_cb(Fl_Widget*, void *data)
  115. {
  116. Fl_Input *in = (Fl_Input*)data;
  117. int rows = atoi(in->value());
  118. if ( rows < 0 ) rows = 0;
  119. G_table->rows(rows);
  120. }
  121. void setcols_cb(Fl_Widget*, void *data)
  122. {
  123. Fl_Input *in = (Fl_Input*)data;
  124. int cols = atoi(in->value());
  125. if ( cols < 0 ) cols = 0;
  126. G_table->cols(cols);
  127. }
  128. void setrowheader_cb(Fl_Widget*, void *data)
  129. {
  130. Fl_Check_Button *check = (Fl_Check_Button*)data;
  131. G_table->row_header(check->value());
  132. }
  133. void setcolheader_cb(Fl_Widget*, void *data)
  134. {
  135. Fl_Check_Button *check = (Fl_Check_Button*)data;
  136. G_table->col_header(check->value());
  137. }
  138. void setrowresize_cb(Fl_Widget*, void *data)
  139. {
  140. Fl_Check_Button *check = (Fl_Check_Button*)data;
  141. G_table->row_resize(check->value());
  142. }
  143. void setcolresize_cb(Fl_Widget*, void *data)
  144. {
  145. Fl_Check_Button *check = (Fl_Check_Button*)data;
  146. G_table->col_resize(check->value());
  147. }
  148. void setpositionrow_cb(Fl_Widget *w, void *data)
  149. {
  150. Fl_Input *in = (Fl_Input*)data;
  151. int toprow = atoi(in->value());
  152. if ( toprow < 0 || toprow >= G_table->rows() )
  153. { fl_alert("Must be in range 0 thru #rows"); }
  154. else
  155. { G_table->row_position(toprow); }
  156. }
  157. void setpositioncol_cb(Fl_Widget *w, void *data)
  158. {
  159. Fl_Input *in = (Fl_Input*)data;
  160. int leftcol = atoi(in->value());
  161. if ( leftcol < 0 || leftcol >= G_table->cols() )
  162. { fl_alert("Must be in range 0 thru #cols"); }
  163. else
  164. { G_table->col_position(leftcol); }
  165. }
  166. void setrowheaderwidth_cb(Fl_Widget *w, void *data)
  167. {
  168. Fl_Input *in = (Fl_Input*)data;
  169. int val = atoi(in->value());
  170. if ( val < 1 ) { val = 1; in->value("1"); }
  171. G_table->row_header_width(val);
  172. }
  173. void setcolheaderheight_cb(Fl_Widget *w, void *data)
  174. {
  175. Fl_Input *in = (Fl_Input*)data;
  176. int val = atoi(in->value());
  177. if ( val < 1 ) { val = 1; in->value("1"); }
  178. G_table->col_header_height(val);
  179. }
  180. void setrowheadercolor_cb(Fl_Widget *w, void *data)
  181. {
  182. Fl_Input *in = (Fl_Input*)data;
  183. int val = atoi(in->value());
  184. if ( val < 0 ) { fl_alert("Must be a color >0"); }
  185. else { G_table->row_header_color(Fl_Color(val)); }
  186. }
  187. void setcolheadercolor_cb(Fl_Widget *w, void *data)
  188. {
  189. Fl_Input *in = (Fl_Input*)data;
  190. int val = atoi(in->value());
  191. if ( val < 0 ) { fl_alert("Must be a color >0"); }
  192. else { G_table->col_header_color(Fl_Color(val)); }
  193. }
  194. void setrowheightall_cb(Fl_Widget *w, void *data)
  195. {
  196. Fl_Input *in = (Fl_Input*)data;
  197. int val = atoi(in->value());
  198. if ( val < 0 ) { val = 0; in->value("0"); }
  199. G_table->row_height_all(val);
  200. }
  201. void setcolwidthall_cb(Fl_Widget *w, void *data)
  202. {
  203. Fl_Input *in = (Fl_Input*)data;
  204. int val = atoi(in->value());
  205. if ( val < 0 ) { val = 0; in->value("0"); }
  206. G_table->col_width_all(val);
  207. }
  208. void settablecolor_cb(Fl_Widget *w, void *data)
  209. {
  210. Fl_Input *in = (Fl_Input*)data;
  211. int val = atoi(in->value());
  212. if ( val < 0 ) { fl_alert("Must be a color >0"); }
  213. else { G_table->color(Fl_Color(val)); }
  214. G_table->redraw();
  215. }
  216. void setcellfgcolor_cb(Fl_Widget *w, void *data)
  217. {
  218. Fl_Input *in = (Fl_Input*)data;
  219. int val = atoi(in->value());
  220. if ( val < 0 ) { fl_alert("Must be a color >0"); }
  221. else { G_table->SetCellFGColor(Fl_Color(val)); }
  222. G_table->redraw();
  223. }
  224. void setcellbgcolor_cb(Fl_Widget *w, void *data)
  225. {
  226. Fl_Input *in = (Fl_Input*)data;
  227. int val = atoi(in->value());
  228. if ( val < 0 ) { fl_alert("Must be a color >0"); }
  229. else { G_table->SetCellBGColor(Fl_Color(val)); }
  230. G_table->redraw();
  231. }
  232. char *itoa(int val)
  233. {
  234. static char s[80];
  235. sprintf(s, "%d", val);
  236. return(s);
  237. }
  238. void tablebox_choice_cb(Fl_Widget *w, void *data)
  239. {
  240. G_table->table_box((Fl_Boxtype)(fl_intptr_t)data);
  241. G_table->redraw();
  242. }
  243. void widgetbox_choice_cb(Fl_Widget *w, void *data)
  244. {
  245. G_table->box((Fl_Boxtype)(fl_intptr_t)data);
  246. G_table->resize(G_table->x(), G_table->y(), G_table->w(), G_table->h());
  247. }
  248. void type_choice_cb(Fl_Widget *w, void *data)
  249. {
  250. G_table->type((Fl_Table_Row::TableRowSelectMode)(fl_intptr_t)data);
  251. }
  252. Fl_Menu_Item tablebox_choices[] = {
  253. {"No Box", 0, tablebox_choice_cb, (void*)FL_NO_BOX },
  254. {"Flat Box", 0, tablebox_choice_cb, (void*)FL_FLAT_BOX },
  255. {"Up Box", 0, tablebox_choice_cb, (void*)FL_UP_BOX },
  256. {"Down Box", 0, tablebox_choice_cb, (void*)FL_DOWN_BOX },
  257. {"Up Frame", 0, tablebox_choice_cb, (void*)FL_UP_FRAME },
  258. {"Down Frame", 0, tablebox_choice_cb, (void*)FL_DOWN_FRAME },
  259. {"Thin Up Box", 0, tablebox_choice_cb, (void*)FL_THIN_UP_BOX },
  260. {"Thin Down Box", 0, tablebox_choice_cb, (void*)FL_THIN_DOWN_BOX },
  261. {"Thin Up Frame", 0, tablebox_choice_cb, (void*)FL_THIN_UP_FRAME },
  262. {"Thin Down Frame",0, tablebox_choice_cb, (void*)FL_THIN_DOWN_FRAME },
  263. {"Engraved Box", 0, tablebox_choice_cb, (void*)FL_ENGRAVED_BOX },
  264. {"Embossed Box", 0, tablebox_choice_cb, (void*)FL_EMBOSSED_BOX },
  265. {"Engraved Frame", 0, tablebox_choice_cb, (void*)FL_ENGRAVED_FRAME },
  266. {"Embossed Frame", 0, tablebox_choice_cb, (void*)FL_EMBOSSED_FRAME },
  267. {"Border Box", 0, tablebox_choice_cb, (void*)FL_BORDER_BOX },
  268. {"Shadow Box", 0, tablebox_choice_cb, (void*)FL_SHADOW_BOX },
  269. {"Border Frame", 0, tablebox_choice_cb, (void*)FL_BORDER_FRAME },
  270. {0}
  271. };
  272. Fl_Menu_Item widgetbox_choices[] = {
  273. {"No Box", 0, widgetbox_choice_cb, (void*)FL_NO_BOX },
  274. //{"Flat Box", 0, widgetbox_choice_cb, (void*)FL_FLAT_BOX },
  275. //{"Up Box", 0, widgetbox_choice_cb, (void*)FL_UP_BOX },
  276. //{"Down Box", 0, widgetbox_choice_cb, (void*)FL_DOWN_BOX },
  277. {"Up Frame", 0, widgetbox_choice_cb, (void*)FL_UP_FRAME },
  278. {"Down Frame", 0, widgetbox_choice_cb, (void*)FL_DOWN_FRAME },
  279. //{"Thin Up Box", 0, widgetbox_choice_cb, (void*)FL_THIN_UP_BOX },
  280. //{"Thin Down Box", 0, widgetbox_choice_cb, (void*)FL_THIN_DOWN_BOX },
  281. {"Thin Up Frame", 0, widgetbox_choice_cb, (void*)FL_THIN_UP_FRAME },
  282. {"Thin Down Frame",0, widgetbox_choice_cb, (void*)FL_THIN_DOWN_FRAME },
  283. //{"Engraved Box", 0, widgetbox_choice_cb, (void*)FL_ENGRAVED_BOX },
  284. //{"Embossed Box", 0, widgetbox_choice_cb, (void*)FL_EMBOSSED_BOX },
  285. {"Engraved Frame", 0, widgetbox_choice_cb, (void*)FL_ENGRAVED_FRAME },
  286. {"Embossed Frame", 0, widgetbox_choice_cb, (void*)FL_EMBOSSED_FRAME },
  287. //{"Border Box", 0, widgetbox_choice_cb, (void*)FL_BORDER_BOX },
  288. //{"Shadow Box", 0, widgetbox_choice_cb, (void*)FL_SHADOW_BOX },
  289. {"Border Frame", 0, widgetbox_choice_cb, (void*)FL_BORDER_FRAME },
  290. {0}
  291. };
  292. Fl_Menu_Item type_choices[] = {
  293. {"SelectNone", 0, type_choice_cb, (void*)Fl_Table_Row::SELECT_NONE },
  294. {"SelectSingle", 0, type_choice_cb, (void*)Fl_Table_Row::SELECT_SINGLE },
  295. {"SelectMulti", 0, type_choice_cb, (void*)Fl_Table_Row::SELECT_MULTI },
  296. {0}
  297. };
  298. int main(int argc, char **argv)
  299. {
  300. Fl_Window win(900, 730);
  301. G_table = new DemoTable(20, 20, 860, 460, "Demo");
  302. G_table->selection_color(FL_YELLOW);
  303. G_table->when(FL_WHEN_RELEASE|FL_WHEN_CHANGED);
  304. G_table->table_box(FL_NO_BOX);
  305. G_table->col_resize_min(4);
  306. G_table->row_resize_min(4);
  307. // ROWS
  308. G_table->row_header(1);
  309. G_table->row_header_width(60);
  310. G_table->row_resize(1);
  311. G_table->rows(500);
  312. G_table->row_height_all(20);
  313. // COLS
  314. G_table->cols(500);
  315. G_table->col_header(1);
  316. G_table->col_header_height(25);
  317. G_table->col_resize(1);
  318. G_table->col_width_all(80);
  319. // Add children to window
  320. win.begin();
  321. // ROW
  322. Fl_Input setrows(150, 500, 120, 25, "Rows");
  323. setrows.labelsize(12);
  324. setrows.value(itoa(G_table->rows()));
  325. setrows.callback(setrows_cb, (void*)&setrows);
  326. setrows.when(FL_WHEN_RELEASE);
  327. Fl_Input rowheightall(400, 500, 120, 25, "Row Height");
  328. rowheightall.labelsize(12);
  329. rowheightall.value(itoa(G_table->row_height(0)));
  330. rowheightall.callback(setrowheightall_cb, (void*)&rowheightall);
  331. rowheightall.when(FL_WHEN_RELEASE);
  332. Fl_Input positionrow(650, 500, 120, 25, "Row Position");
  333. positionrow.labelsize(12);
  334. positionrow.value("1");
  335. positionrow.callback(setpositionrow_cb, (void*)&positionrow);
  336. positionrow.when(FL_WHEN_RELEASE);
  337. // COL
  338. Fl_Input setcols(150, 530, 120, 25, "Cols");
  339. setcols.labelsize(12);
  340. setcols.value(itoa(G_table->cols()));
  341. setcols.callback(setcols_cb, (void*)&setcols);
  342. setcols.when(FL_WHEN_RELEASE);
  343. Fl_Input colwidthall(400, 530, 120, 25, "Col Width");
  344. colwidthall.labelsize(12);
  345. colwidthall.value(itoa(G_table->col_width(0)));
  346. colwidthall.callback(setcolwidthall_cb, (void*)&colwidthall);
  347. colwidthall.when(FL_WHEN_RELEASE);
  348. Fl_Input positioncol(650, 530, 120, 25, "Col Position");
  349. positioncol.labelsize(12);
  350. positioncol.value("1");
  351. positioncol.callback(setpositioncol_cb, (void*)&positioncol);
  352. positioncol.when(FL_WHEN_RELEASE);
  353. // ROW HEADER
  354. Fl_Input rowheaderwidth(150, 570, 120, 25, "Row Header Width");
  355. rowheaderwidth.labelsize(12);
  356. rowheaderwidth.value(itoa(G_table->row_header_width()));
  357. rowheaderwidth.callback(setrowheaderwidth_cb, (void*)&rowheaderwidth);
  358. rowheaderwidth.when(FL_WHEN_RELEASE);
  359. Fl_Input rowheadercolor(400, 570, 120, 25, "Row Header Color");
  360. rowheadercolor.labelsize(12);
  361. rowheadercolor.value(itoa((int)G_table->row_header_color()));
  362. rowheadercolor.callback(setrowheadercolor_cb, (void*)&rowheadercolor);
  363. rowheadercolor.when(FL_WHEN_RELEASE);
  364. Fl_Check_Button rowheader(550, 570, 120, 25, "Row Headers?");
  365. rowheader.labelsize(12);
  366. rowheader.callback(setrowheader_cb, (void*)&rowheader);
  367. rowheader.value(G_table->row_header() ? 1 : 0);
  368. Fl_Check_Button rowresize(700, 570, 120, 25, "Row Resize?");
  369. rowresize.labelsize(12);
  370. rowresize.callback(setrowresize_cb, (void*)&rowresize);
  371. rowresize.value(G_table->row_resize() ? 1 : 0);
  372. // COL HEADER
  373. Fl_Input colheaderheight(150, 600, 120, 25, "Col Header Height");
  374. colheaderheight.labelsize(12);
  375. colheaderheight.value(itoa(G_table->col_header_height()));
  376. colheaderheight.callback(setcolheaderheight_cb, (void*)&colheaderheight);
  377. colheaderheight.when(FL_WHEN_RELEASE);
  378. Fl_Input colheadercolor(400, 600, 120, 25, "Col Header Color");
  379. colheadercolor.labelsize(12);
  380. colheadercolor.value(itoa((int)G_table->col_header_color()));
  381. colheadercolor.callback(setcolheadercolor_cb, (void*)&colheadercolor);
  382. colheadercolor.when(FL_WHEN_RELEASE);
  383. Fl_Check_Button colheader(550, 600, 120, 25, "Col Headers?");
  384. colheader.labelsize(12);
  385. colheader.callback(setcolheader_cb, (void*)&colheader);
  386. colheader.value(G_table->col_header() ? 1 : 0);
  387. Fl_Check_Button colresize(700, 600, 120, 25, "Col Resize?");
  388. colresize.labelsize(12);
  389. colresize.callback(setcolresize_cb, (void*)&colresize);
  390. colresize.value(G_table->col_resize() ? 1 : 0);
  391. Fl_Choice tablebox(150, 640, 120, 25, "Table Box");
  392. tablebox.labelsize(12);
  393. tablebox.textsize(12);
  394. tablebox.menu(tablebox_choices);
  395. tablebox.value(0);
  396. Fl_Choice widgetbox(150, 670, 120, 25, "Widget Box");
  397. widgetbox.labelsize(12);
  398. widgetbox.textsize(12);
  399. widgetbox.menu(widgetbox_choices);
  400. widgetbox.value(2); // down frame
  401. Fl_Input tablecolor(400, 640, 120, 25, "Table Color");
  402. tablecolor.labelsize(12);
  403. tablecolor.value(itoa((int)G_table->color()));
  404. tablecolor.callback(settablecolor_cb, (void*)&tablecolor);
  405. tablecolor.when(FL_WHEN_RELEASE);
  406. Fl_Input cellbgcolor(400, 670, 120, 25, "Cell BG Color");
  407. cellbgcolor.labelsize(12);
  408. cellbgcolor.value(itoa((int)G_table->GetCellBGColor()));
  409. cellbgcolor.callback(setcellbgcolor_cb, (void*)&cellbgcolor);
  410. cellbgcolor.when(FL_WHEN_RELEASE);
  411. Fl_Input cellfgcolor(400, 700, 120, 25, "Cell FG Color");
  412. cellfgcolor.labelsize(12);
  413. cellfgcolor.value(itoa((int)G_table->GetCellFGColor()));
  414. cellfgcolor.callback(setcellfgcolor_cb, (void*)&cellfgcolor);
  415. cellfgcolor.when(FL_WHEN_RELEASE);
  416. Fl_Choice type(650, 640, 120, 25, "Type");
  417. type.labelsize(12);
  418. type.textsize(12);
  419. type.menu(type_choices);
  420. type.value(2);
  421. win.end();
  422. win.resizable(*G_table);
  423. win.show(argc, argv);
  424. return(Fl::run());
  425. }