packages feed

fltkhs-0.1.0.0: c-examples/tree-of-tables.c

#include <stdio.h>
#include <math.h>		// powf()
#include <string.h>
#include "Fl_C.h"
#include "Fl_EnumerationsC.h"
#include "Fl_Double_WindowC.h"
#include "Fl_TableC.h"
#include "Fl_DrawC.h"
#include "Fl_TreeC.h"
#include "Fl_Tree_ItemC.h"
#include "Fl_AskC.h"
#ifndef PI
#define PI 3.14159
#endif

#if FLTK_ABI_VERSION >= 10301
void initializeTable(fl_Table table, char* m){
  void* user_data = (void*)m;
  Fl_Table_set_other_data(table,user_data);
  Fl_Table_begin(table);
  Fl_Table_set_rows(table,11);
  Fl_Table_set_row_height_all(table,20);
  Fl_Table_set_row_header(table,1);
  Fl_Table_set_cols(table,11);
  Fl_Table_set_col_width_all(table,60);
  Fl_Table_set_col_header(table,1);
  Fl_Table_set_col_resize(table,1);
  Fl_Table_end(table);
}
void resize(fl_Table table,int X,int Y,int W,int H){
  if ( W > 718 ) W = 718;
  H = Fl_Table_h(table);
  Fl_Table_resize_super(table,X,Y,W,H);
}

void draw_cell(fl_Table table,TableContextC context, int ROW, int COL, int X, int Y, int W, int H){
  static char s[40];
  char* mode = (char*)Fl_Table_other_data(table);
  switch ( context ) {
      case CONTEXT_STARTPAGEC:         // before page is drawn..
        flc_set_font(FL_HELVETICA, 10);    // set the font for our drawing operations
        return;
      case CONTEXT_COL_HEADERC:	      // Drawing column/row headers
      case CONTEXT_ROW_HEADERC: {
        int val = context==CONTEXT_COL_HEADERC ? COL : ROW;
        int col = context==CONTEXT_COL_HEADERC ? Fl_Table_col_header_color(table) : Fl_Table_row_header_color(table);
        flc_push_clip(X,Y,W,H);
	if ( strcmp(mode, "SinCos" ) == 0 ) { sprintf(s, "%.2f", ((val/10.0)*PI)); }
	else sprintf(s,"%d",val);
	flc_draw_box(FL_THIN_UP_BOX, X,Y,W,H, col);
	flc_set_color(FL_BLACK);
	flc_draw_with_align(s, X,Y,W,H, FL_ALIGN_CENTER);
        flc_pop_clip();
        return;
      }
      case CONTEXT_CELLC: {            // Draw data in cells
        int col = Fl_Table_is_selected(table,ROW,COL) ? FL_YELLOW : FL_WHITE;
        flc_push_clip(X,Y,W,H);
        if ( strcmp(mode, "Addition") == 0 ) { sprintf(s, "%d", ROW+COL); } else
        if ( strcmp(mode, "Subtract") == 0 ) { sprintf(s, "%d", ROW-COL); } else
	if ( strcmp(mode, "Multiply") == 0 ) { sprintf(s, "%d", ROW*COL); } else
	if ( strcmp(mode, "Divide"  ) == 0 ) { if ( COL==0 ) sprintf(s, "N/A"); else sprintf(s, "%.2f", (float)ROW/(float)COL); } else
	if ( strcmp(mode, "Exponent") == 0 ) { sprintf(s, "%g", powf((float)ROW,(float)COL)); } else
	if ( strcmp(mode, "SinCos"  ) == 0 ) { sprintf(s, "%.2f", sin((ROW/10.0)*PI) * cos((COL/10.0)*PI)); } else
	                                     { sprintf(s, "???"); }
	flc_set_color(col); flc_rectf(X,Y,W,H);				// bg
	flc_set_color(FL_GRAY0); flc_draw_with_align(s, X,Y,W,H, FL_ALIGN_CENTER);	// text
	flc_set_color(Fl_Table_color(table));  flc_rect(X,Y,W,H);				// box
        flc_pop_clip();
        return;
      }
      default:
        return;
    }
}
int main(int argc, char *argv[]) {
  fl_Double_Window win = (fl_Double_Window)Fl_Double_Window_New_WithLabel(700,400,"Tree Of Tables");
  Fl_Double_Window_begin(win);
  {
    fl_Tree tree = (fl_Tree)Fl_Tree_New(10,10,Fl_Double_Window_w(win)-20,Fl_Double_Window_h(win)-20);
    fl_Tree_Item root = (fl_Tree_Item)Fl_Tree_root(tree);
    Fl_Tree_Item_set_label(root, "Math Tables");
    Fl_Tree_set_item_labelfont(tree,FL_COURIER);
    Fl_Tree_set_linespacing(tree,4);
    Fl_Tree_set_item_draw_mode(tree,
			       Fl_Tree_item_draw_mode(tree)|
			       FL_TREE_ITEM_DRAW_LABEL_AND_WIDGET |
			       FL_TREE_ITEM_HEIGHT_FROM_WIDGET);
    Fl_Tree_set_selectmode(tree, FL_TREE_SELECT_NONE);
    Fl_Tree_set_widgetmarginleft(tree, 12);
    Fl_Tree_set_connectorstyle(tree,FL_TREE_CONNECTOR_DOTTED);
    Fl_Tree_begin(tree);
    {
      fl_Table table;
      fl_Tree_Item item;
      fl_Table_Virtual_Funcs* funcs = (fl_Table_Virtual_Funcs*)Fl_Table_default_virtual_funcs();
      funcs->resize = &resize;
      funcs->draw_cell = &draw_cell;

      table = (fl_Table)Fl_Table_New(0,0,500,156,funcs);
      initializeTable(table,"Addition");
      item = (fl_Tree_Item)Fl_Tree_add(tree, "Arithmetic/Addition");
      Fl_Tree_Item_set_widget(item, table);

      table = (fl_Table)Fl_Table_New(0,0,500,156,funcs);
      initializeTable(table,"Subtract");
      item = (fl_Tree_Item)Fl_Tree_add(tree, "Arithmetic/Subtract");
      Fl_Tree_Item_set_widget(item, table);

      table = (fl_Table)Fl_Table_New(0,0,500,156,funcs);
      initializeTable(table,"Multiply");
      item = (fl_Tree_Item)Fl_Tree_add(tree, "Arithmetic/Multiply");
      Fl_Tree_Item_set_widget(item, table);

      table = (fl_Table)Fl_Table_New(0,0,500,156,funcs);
      initializeTable(table,"Divide");
      item = (fl_Tree_Item)Fl_Tree_add(tree, "Arithmetic/Divide");
      Fl_Tree_Item_set_widget(item, table);

      table = (fl_Table)Fl_Table_New(0,0,500,156,funcs);
      initializeTable(table,"Exponent");
      item = (fl_Tree_Item)Fl_Tree_add(tree, "Misc/Exponent");
      Fl_Tree_Item_set_widget(item, table);

      table = (fl_Table)Fl_Table_New(0,0,500,156,funcs);
      initializeTable(table,"SinCos");
      item = (fl_Tree_Item)Fl_Tree_add(tree, "Misc/Sin*Cos");
      Fl_Tree_Item_set_widget(item, table);
    }
    Fl_Tree_end(tree);
  }
  Fl_Double_Window_end(win);
  Fl_Double_Window_set_resizable(win,win);
  Fl_Double_Window_show(win);
  return Fl_run();
}
#else
int main(int argc, char *argv[]) {
  flc_alert("This example must have FLTK_ABI_VERSION enabled to work properly.");
  return 0;
}
#endif