163
|
1 /* ----------------------------------------------------------------------------
|
|
2 * File : tree.h
|
|
3 * Purpose : Header file for dynamic tree program
|
|
4 * ----------------------------------------------------------------------------
|
|
5 */
|
|
6
|
|
7 #define INTF 1 /* enable interface-specific code */
|
|
8
|
|
9 #define FOREACH_CHILD(child, tree) \
|
|
10 for ((child) = (tree)->child ; (child) ; (child) = (child)->sibling)
|
|
11
|
|
12 #define PT_IN_RECT(p1, p2, x1, y1, x2, y2) \
|
|
13 ((p1) > (x1) && \
|
|
14 (p2) > (y1) && \
|
|
15 (p1) < (x2) && \
|
|
16 (p2) < (y2))
|
|
17
|
|
18 #define PT_IN_EXTENT(p1, p2, extent) \
|
|
19 ((p1) > (extent).pos.x && \
|
|
20 (p2) > (extent).pos.y && \
|
|
21 (p1) < ((extent).pos.x + (extent).width) && \
|
|
22 (p2) < ((extent).pos.y + (extent).height))
|
|
23
|
|
24 #define IS_LEAF(node) \
|
|
25 ((node)->child == NULL)
|
|
26
|
|
27 typedef struct line Polyline;
|
|
28 typedef struct tnode Tree;
|
|
29
|
|
30 typedef struct point {
|
|
31 int x;
|
|
32 int y;
|
|
33 } Point;
|
|
34
|
|
35 typedef struct extent {
|
|
36 Point pos; /* top left corner of rectangle */
|
|
37 int width;
|
|
38 int height;
|
|
39 } Extent;
|
|
40
|
|
41 struct line {
|
|
42 int dx, dy;
|
|
43 Polyline *link;
|
|
44 };
|
|
45
|
|
46 typedef struct polygon {
|
|
47 struct {
|
|
48 Polyline *head;
|
|
49 Polyline *tail;
|
|
50 } lower, upper;
|
|
51 } Polygon;
|
|
52
|
|
53 typedef struct label {
|
|
54 char *text; /* the actual label text */
|
|
55 int len; /* length of label text */
|
|
56 int xoffset; /* the X offset of label inside rectangle */
|
|
57 int yoffset; /* the Y offset of label inside rectangle */
|
|
58 } Label;
|
|
59
|
|
60 struct tnode {
|
|
61 Tree *parent;
|
|
62 Tree *child;
|
|
63 Tree *sibling;
|
|
64 int width;
|
|
65 int height;
|
|
66 int border;
|
|
67 Polygon contour;
|
|
68 Point offset; /* offset is relative to 'predecessor' */
|
|
69 Point pos; /* position is screen coordinates of node */
|
|
70 Point old_pos; /* position is screen coordinates of node */
|
|
71 int node_height; /* height of node in tree */
|
|
72 /* all fields below are interface-specific */
|
|
73 Label label;
|
|
74 char* value;
|
|
75 Extent subextent; /* extent of subtree (excluding this node) */
|
|
76 Polygon old_contour; /* for caching old contour in elision */
|
|
77 char elision; /* TRUE if this node is collapsed */
|
|
78 char on_path; /* true if on path to root from node */
|
|
79 char split; /* flag for drawing subtree contours */
|
|
80 char show_contour; /* flag to show or hide subtree contour */
|
|
81 };
|
|
82
|
|
83 typedef enum {
|
|
84 Erase,
|
|
85 Draw
|
|
86 } DrawMode;
|
|
87
|
|
88 typedef enum {
|
|
89 Old,
|
|
90 New
|
|
91 } PosMode; /* Position mode */
|
|
92
|
|
93 extern Polyline* MakeLine();
|
|
94 extern Tree* MakeNode();
|
|
95 extern Tree* ReadTreeFromFile();
|
|
96 extern void ComputeTreeSize();
|
|
97 extern void Unzip();
|
|
98 extern void Zip();
|
|
99
|
|
100 extern Tree *TheTree;
|
|
101 extern int NumLines;
|
|
102 extern int NumNodes;
|