File: tree-of-tables.cxx

package info (click to toggle)
fltk1.3 1.3.11-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 25,224 kB
  • sloc: cpp: 105,017; ansic: 91,383; sh: 6,825; makefile: 1,948; perl: 24; xml: 7
file content (155 lines) | stat: -rw-r--r-- 5,408 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
//
// "$Id$"
//
//	Fl_Tree as a container of Fl_Table's. - erco 04/25/2012
//
//      Demonstrates how one can make a tree where each item
//      contains a complex widget.
//
// Copyright 2010,2012 Greg Ercolano.
// Copyright 1998-2010 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file.  If this
// file is missing or damaged, see the license at:
//
//     http://www.fltk.org/COPYING.php
//
// Please report all bugs and problems on the following page:
//
//     http://www.fltk.org/str.php
//
#include <stdio.h>
#include <math.h>		// powf()
#include <FL/Fl.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Tree.H>
#include <FL/Fl_Table.H>
#ifndef PI
#define PI 3.14159
#endif

#if FLTK_ABI_VERSION >= 10301
class MyTable : public Fl_Table {
  const char *mode;
public:
  MyTable(int X,int Y,int W,int H,const char *mode) : Fl_Table(X,Y,W,H) {
    rows(11); row_height_all(20); row_header(1);
    cols(11); col_width_all(60);  col_header(1);
    col_resize(1);				// enable column resizing
    this->mode = mode;
    end();
  }
  void resize(int X,int Y,int W,int H) {
      if ( W > 718 ) W = 718;			// don't exceed 700 in width
      Fl_Table::resize(X,Y,W,h());		// disallow changes in height
  }
  // Handle drawing table's cells
  //     Fl_Table calls this function to draw each visible cell in the table.
  //     It's up to us to use FLTK's drawing functions to draw the cells the way we want.
  //
  void draw_cell(TableContext context, int ROW, int COL, int X, int Y, int W, int H) {
    static char s[40];
    switch ( context ) {
      case CONTEXT_STARTPAGE:         // before page is drawn..
        fl_font(FL_HELVETICA, 10);    // set the font for our drawing operations
        return; 
      case CONTEXT_COL_HEADER:	      // Drawing column/row headers
      case CONTEXT_ROW_HEADER: {
        int val = context==CONTEXT_COL_HEADER ? COL : ROW;
        int col = context==CONTEXT_COL_HEADER ? col_header_color() : row_header_color();
        fl_push_clip(X,Y,W,H);
	if ( strcmp(mode, "SinCos" ) == 0 ) { sprintf(s, "%.2f", ((val/10.0)*PI)); }
	else sprintf(s,"%d",val);
	fl_draw_box(FL_THIN_UP_BOX, X,Y,W,H, col);
	fl_color(FL_BLACK);
	fl_draw(s, X,Y,W,H, FL_ALIGN_CENTER);
        fl_pop_clip();
        return; 
      }
      case CONTEXT_CELL: {            // Draw data in cells
        int col = is_selected(ROW,COL) ? FL_YELLOW : FL_WHITE;
        fl_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, "???"); }
	fl_color(col); fl_rectf(X,Y,W,H);				// bg
	fl_color(FL_GRAY0); fl_draw(s, X,Y,W,H, FL_ALIGN_CENTER);	// text
	fl_color(color());  fl_rect(X,Y,W,H);				// box
        fl_pop_clip();
        return;
      }
      default:
        return;
    }
  }
};

int main(int argc, char *argv[]) {
  Fl_Double_Window *win = new Fl_Double_Window(700, 400, "Tree of tables");
  win->begin();
  {
    // Create tree
    Fl_Tree *tree = new Fl_Tree(10, 10, win->w()-20, win->h()-20);
    tree->root()->label("Math Tables");
    tree->item_labelfont(FL_COURIER);		// font to use for items
    tree->linespacing(4);			// extra space between items
    tree->item_draw_mode(tree->item_draw_mode() |
                         FL_TREE_ITEM_DRAW_LABEL_AND_WIDGET |    // draw item with widget() next to it
	                 FL_TREE_ITEM_HEIGHT_FROM_WIDGET);       // make item height follow table's height
    tree->selectmode(FL_TREE_SELECT_NONE);	// font to use for items
    tree->widgetmarginleft(12);			// space between item and table
    tree->connectorstyle(FL_TREE_CONNECTOR_DOTTED);

    // Create tables, assign each a tree item
    tree->begin();
    {
      MyTable *table;
      Fl_Tree_Item *item;

      table = new MyTable(0,0,500,156,"Addition");
      item = tree->add("Arithmetic/Addition");
      item->widget(table);

      table = new MyTable(0,0,500,156,"Subtract");
      item = tree->add("Arithmetic/Subtract");
      item->widget(table);

      table = new MyTable(0,0,500,156,"Multiply");
      item = tree->add("Arithmetic/Multiply");
      item->widget(table);

      table = new MyTable(0,0,500,156,"Divide");
      item = tree->add("Arithmetic/Divide  ");
      item->widget(table);

      table = new MyTable(0,0,500,156,"Exponent");
      item = tree->add("Misc/Exponent");
      item->widget(table);

      table = new MyTable(0,0,500,156,"SinCos");
      item = tree->add("Misc/Sin*Cos ");
      item->widget(table);
    }
    tree->end();
  }
  win->end();
  win->resizable(win);
  win->show(argc, argv);
  return(Fl::run());
}
#else /*FLTK_ABI_VERSION*/
#include <FL/fl_ask.H>
int main(int argc, char *argv[]) {
  fl_alert("This example must have FLTK_ABI_VERSION enabled to work properly.");
  return 1;
}
#endif

//
// End of "$Id$".
//