annotate pkg-src/tree-x/draw.c @ 167:85ec50267440 r20-3b10

Import from CVS: tag r20-3b10
author cvs
date Mon, 13 Aug 2007 09:45:46 +0200
parents 0132846995bd
children 15872534500d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1 /* ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
2 * File : draw.c
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
3 * Purpose : drawing-specific routines for dynamic tree program
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
4 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
5 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
6
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
7 #include <stdlib.h>
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
8 #include <X11/Intrinsic.h>
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
9 #include <X11/StringDefs.h>
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
10
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
11 #include "dissolve.h"
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
12 #include "defs.h"
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
13 #include "tree.h"
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
14 #include "dbl.h"
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
15 #include "intf.h"
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
16
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
17 /* ------------------------------------------------------------------------- */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
18 /* Global Variables */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
19 /* ------------------------------------------------------------------------- */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
20
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
21 Tree *TheTree;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
22
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
23
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
24 /* ------------------------------------------------------------------------- */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
25 /* Local Variables */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
26 /* ------------------------------------------------------------------------- */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
27
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
28 static char AnimationMode = FALSE;
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
29 static char strbuf[BUFSIZ];
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
30 static int AnimationStep = ANIMATION_STEP;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
31
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
32
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
33 /* ------------------------------------------------------------------------- */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
34 /* Functions */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
35 /* ------------------------------------------------------------------------- */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
36
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
37
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
38 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
39 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
40 * BeginFrame() provides an abstraction for double buffering. It should
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
41 * be called prior to creating a new frame of animation.
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
42 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
43 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
44 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
45
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
46 void
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
47 BeginFrame(void)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
48 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
49 DBLbegin_frame(TreeDrawingAreaDB);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
50 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
51
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
52
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
53 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
54 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
55 * EndFrame() provides an abstraction for double buffering. It should
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
56 * be called after creating a new frame of animation.
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
57 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
58 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
59 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
60
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
61 void
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
62 EndFrame(void)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
63 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
64 DBLend_frame(TreeDrawingAreaDB, 0);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
65 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
66
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
67
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
68 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
69 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
70 * GetDrawingSize() gets the size of the drawing area, and returns the
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
71 * dimensions in the arguments.
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
72 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
73 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
74 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
75
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
76 static void
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
77 GetDrawingSize(int *width, int *height)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
78 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
79 Dimension w, h;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
80 Arg al [2];
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
81
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
82 XtSetArg (al [0], XtNwidth, &w);
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
83 XtSetArg (al [1], XtNheight, &h);
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
84 XtGetValues(TreeDrawingArea, al, 2);
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
85
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
86 *width = (int) w;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
87 *height = (int) h;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
88 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
89
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
90
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
91 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
92 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
93 * SetDrawingSize() sets the size of the drawing area to the given
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
94 * dimensions.
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
95 *
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
96 * ----------------------------------------------------------------------------
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
97 */
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
98
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
99 static void
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
100 SetDrawingSize(int width, int height)
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
101 {
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
102 Arg al [2];
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
103 XtSetArg (al [0], XtNwidth, (Dimension) width);
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
104 XtSetArg (al [1], XtNheight, (Dimension) height);
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
105 XtSetValues (TreeDrawingArea, al, 2);
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
106 }
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
107
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
108
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
109 /* ----------------------------------------------------------------------------
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
110 *
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
111 * SetDrawingTree() is used to specify what tree is to be drawn in the
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
112 * drawing area.
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
113 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
114 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
115 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
116
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
117 void
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
118 SetDrawingTree(Tree *tree)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
119 {
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
120 TheTree = tree;
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
121 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
122
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
123
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
124 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
125 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
126 * SetNodeLabel() sets the label text of the specified node and computes
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
127 * the bounding rectangle so that the layout can be determined. This
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
128 * function is called when new nodes are created. If TreeAlignNodes is
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
129 * True, the string is truncated so that the node's width is no longer
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
130 * than TreeParentDistance.
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
131 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
132 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
133 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
134
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
135 void
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
136 SetNodeLabel(Tree *node, char *label)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
137 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
138 int len;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
139 int dummy;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
140 XCharStruct rtrn;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
141
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
142 len = strlen(label);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
143 while (len > 1) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
144 XTextExtents(TreeLabelFont, label, len, &dummy, &dummy, &dummy, &rtrn);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
145 node->width = rtrn.lbearing + rtrn.rbearing + (LABEL_MAT_WIDTH * 2) + 1;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
146 node->height = rtrn.ascent + rtrn.descent + (LABEL_MAT_HEIGHT * 2) + 1;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
147 if (TreeAlignNodes) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
148 if (node->width <= (2 * TreeParentDistance))
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
149 break;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
150 else
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
151 len--;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
152 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
153 else
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
154 break;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
155 }
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
156
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
157 node->label.text = label;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
158 node->label.len = len;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
159 node->label.xoffset = LABEL_MAT_WIDTH + 1,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
160 node->label.yoffset = rtrn.ascent + LABEL_MAT_HEIGHT + 1;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
161 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
162
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
164 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
165 *
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
166 * SetDrawColor() sets the drawing color of the TreeDrawingArea.
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
167 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
168 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
169 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
170
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
171 void
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
172 SetDrawColor(int color)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
173 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
174 XSetForeground(TreeDrawingAreaDB->display, TreeDrawingAreaDB->gc,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
175 TreeDrawingAreaDB->colors[color]);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
176 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
177
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
178 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
179 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
180 * SetLineWidth() sets the line width of lines drawn in the TreeDrawingArea.
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
181 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
182 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
183 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
184
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
185 static void
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
186 SetLineWidth(unsigned int width)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
187 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
188 XSetLineAttributes(TreeDrawingAreaDB->display, TreeDrawingAreaDB->gc,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
189 width, LineSolid, CapButt, JoinRound);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
190 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
191
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
192
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
193 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
194 *
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
195 * SetContours() sets the visibility of three possible contour modes:
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
196 * the outside contour, all subtree contours, or selected contours.
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
197 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
198 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
199 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
200
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
201 static void
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
202 SetContours(ContourOption option)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
203 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
204 if (option == NoContours) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
205 switch (TreeShowContourOption) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
206 case OutsideContour:
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
207 DrawTreeContour(TheTree, New, BACKGROUND_COLOR, FALSE, FALSE, FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
208 break;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
209 case AllContours:
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
210 DrawTreeContour(TheTree, New, BACKGROUND_COLOR, FALSE, FALSE, TRUE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
211 break;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
212 case SelectedContours:
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
213 DrawTreeContour(TheTree, New, BACKGROUND_COLOR, FALSE, TRUE, TRUE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
214 break;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
215 default:
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
216 ;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
217 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
218 DrawTreeContour(TheTree, New, BACKGROUND_COLOR, FALSE, FALSE, TRUE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
219 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
220 else if (option == OutsideContour) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
221 switch (TreeShowContourOption) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
222 case AllContours:
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
223 DrawTreeContour(TheTree, New, BACKGROUND_COLOR, FALSE, FALSE, TRUE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
224 break;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
225 case SelectedContours:
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
226 DrawTreeContour(TheTree, New, BACKGROUND_COLOR, FALSE, TRUE, TRUE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
227 break;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
228 default:
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
229 ;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
230 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
231 DrawTreeContour(TheTree, New, CONTOUR_COLOR, FALSE, FALSE, FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
232 } else if (option == AllContours) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
233 DrawTreeContour(TheTree, New, CONTOUR_COLOR, FALSE, FALSE, TRUE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
234 } else if (option == SelectedContours) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
235 switch (TreeShowContourOption) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
236 case AllContours:
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
237 DrawTreeContour(TheTree, New, BACKGROUND_COLOR, FALSE, FALSE, TRUE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
238 break;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
239 case OutsideContour:
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
240 DrawTreeContour(TheTree, New, BACKGROUND_COLOR, FALSE, FALSE, FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
241 break;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
242 default:
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
243 DrawTreeContour(TheTree, New, BACKGROUND_COLOR, FALSE, FALSE, TRUE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
244 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
245 DrawTreeContour(TheTree, New, CONTOUR_COLOR, FALSE, TRUE, TRUE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
246 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
247 TreeShowContourOption = option;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
248 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
249
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
250
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
251 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
252 *
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
253 * HiliteNode() is called by Unzip() to change the color of a node.
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
254 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
255 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
256 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
257
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
258 void
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
259 HiliteNode(Tree *tree, PosMode pos_mode)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
260 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
261 SetDrawColor(HIGHLIGHT_COLOR);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
262 DrawNode(tree, pos_mode);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
263 SetDrawColor(TREE_COLOR);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
264 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
265
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
266
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
267 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
268 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
269 * DrawNode() takes a node and draws the node in the specified widget
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
270 * at its (x,y) coordinate. (x, y) indicates the upper-left corner where
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
271 * the node is drawn. Also, a line is drawn from the center of the left
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
272 * edge to the center of the parent's right edge. 'draw_mode' specifies
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
273 * the drawing mode (whether or not the node is erased, rather than drawn).
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
274 * 'pos_mode' determines whether or not to use the old position of the node.
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
275 * This flag is used in animating the movement of a node from its old
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
276 * position to its new position.
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
277 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
278 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
279 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
280
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
281 void
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
282 DrawNode(Tree *node, PosMode pos_mode)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
283 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
284 Widget w;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
285 GC gc;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
286
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
287 w = TreeDrawingArea;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
288 gc = TreeDrawingAreaDB->gc;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
289
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
290 if (pos_mode == Old) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
291 XDrawString(XtDisplay(w), XtWindow(w), gc,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
292 node->old_pos.x + node->label.xoffset,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
293 node->old_pos.y + node->label.yoffset,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
294 node->label.text, node->label.len);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
295 XDrawRectangle(XtDisplay(w), XtWindow(w), gc,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
296 node->old_pos.x, node->old_pos.y,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
297 node->width, node->height);
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
298 if (node->parent)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
299 XDrawLine(XtDisplay(w), XtWindow(w), gc,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
300 node->old_pos.x - 1,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
301 node->old_pos.y + (node->height / 2),
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
302 node->parent->old_pos.x + node->parent->width + 1,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
303 node->parent->old_pos.y + (node->parent->height / 2));
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
304 if (node->elision) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
305 XSetFillStyle(TreeDrawingAreaDB->display, TreeDrawingAreaDB->gc,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
306 FillTiled);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
307 XFillRectangle(XtDisplay(w), XtWindow(w), gc,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
308 node->old_pos.x + node->width - ELISION_WIDTH,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
309 node->old_pos.y + 1, ELISION_WIDTH, node->height - 1);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
310 XSetFillStyle(TreeDrawingAreaDB->display, TreeDrawingAreaDB->gc,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
311 FillSolid);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
312 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
313 } else {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
314 XDrawString(XtDisplay(w), XtWindow(w), gc,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
315 node->pos.x + node->label.xoffset,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
316 node->pos.y + node->label.yoffset,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
317 node->label.text, node->label.len);
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
318
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
319 XDrawRectangle(XtDisplay(w), XtWindow(w), gc,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
320 node->pos.x, node->pos.y,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
321 node->width, node->height);
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
322 if (node->parent)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
323 XDrawLine(XtDisplay(w), XtWindow(w), gc,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
324 node->pos.x - 1,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
325 node->pos.y + (node->height / 2),
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
326 node->parent->pos.x + node->parent->width + 1,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
327 node->parent->pos.y + (node->parent->height / 2));
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
328 if (node->elision) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
329 XSetFillStyle(TreeDrawingAreaDB->display, TreeDrawingAreaDB->gc,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
330 FillTiled);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
331 XFillRectangle(XtDisplay(w), XtWindow(w), gc,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
332 node->pos.x + node->width - ELISION_WIDTH,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
333 node->pos.y + 1, ELISION_WIDTH, node->height - 1);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
334 XSetFillStyle(TreeDrawingAreaDB->display, TreeDrawingAreaDB->gc,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
335 FillSolid);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
336 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
337 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
338 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
339
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
340
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
341 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
342 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
343 * DrawTreeContour() draws the contour of the specified subtree. Bridges
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
344 * are not traversed, so the actual subtree contour is drawn, as opposed
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
345 * to the merged contour. 'color' specifies the drawing color. If 'detach'
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
346 * is True, the lines attaching the subtree contour to the node are not
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
347 * drawn. If 'select' is true, then only subtrees that are flagged as
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
348 * selected are shown. If 'recursive' is True, the entire tree is traversed.
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
349 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
350 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
351 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
352
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
353 void
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
354 DrawTreeContour(Tree *tree, PosMode pos_mode,
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
355 int color, int detach_p, int select_p, int recursive)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
356 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
357 Widget w = TreeDrawingArea;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
358 Polyline *contour, *tail;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
359 Tree *child;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
360 int x, y, i;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
361
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
362 if (tree == NULL)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
363 return;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
364
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
365 if ((select_p && tree->show_contour) || !select_p) {
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
366
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
367 SetDrawColor(color);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
368 SetLineWidth(TreeContourWidth);
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
369
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
370 /* draw upper contour */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
371 contour = tree->contour.upper.head;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
372 tail = tree->contour.upper.tail;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
373 if (pos_mode == Old) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
374 x = tree->old_pos.x - tree->border;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
375 y = tree->old_pos.y - tree->border;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
376 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
377 else {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
378 x = tree->pos.x - tree->border;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
379 y = tree->pos.y - tree->border;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
380 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
381
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
382 if (detach_p) { /* skip over attaching lines */
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
383 for (i = 0 ; i < 2 ; i++) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
384 x += contour->dx;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
385 y += contour->dy;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
386 contour = contour->link;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
387 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
388 }
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
389
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
390 while (contour) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
391 XDrawLine(XtDisplay(w), XtWindow(w), TreeDrawingAreaDB->gc,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
392 x, y, x + contour->dx, y + contour->dy);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
393 x += contour->dx;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
394 y += contour->dy;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
395 if (contour == tail) /* make sure you don't follow bridges */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
396 contour = NULL;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
397 else
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
398 contour = contour->link;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
399 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
400
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
401 /* draw lower contour */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
402 contour = tree->contour.lower.head;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
403 tail = tree->contour.lower.tail;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
404 if (pos_mode == Old) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
405 x = tree->old_pos.x - tree->border;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
406 y = tree->old_pos.y + tree->border + tree->height;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
407 } else {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
408 x = tree->pos.x - tree->border;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
409 y = tree->pos.y + tree->border + tree->height;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
410 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
411
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
412 if (detach_p) { /* skip over attaching lines */
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
413 for (i = 0 ; i < 2 ; i++) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
414 x += contour->dx;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
415 y += contour->dy;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
416 contour = contour->link;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
417 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
418 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
419
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
420 while (contour) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
421 XDrawLine(XtDisplay(w), XtWindow(w), TreeDrawingAreaDB->gc,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
422 x, y, x + contour->dx, y + contour->dy);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
423 x += contour->dx;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
424 y += contour->dy;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
425 if (contour == tail) /* make sure you don't follow bridges */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
426 contour = NULL;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
427 else
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
428 contour = contour->link;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
429 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
430 }
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
431
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
432 if (recursive) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
433 FOREACH_CHILD(child, tree)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
434 if (!child->elision)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
435 DrawTreeContour(child, pos_mode, color,
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
436 detach_p, select_p, recursive);
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
437 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
438
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
439 SetDrawColor(TREE_COLOR);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
440 SetLineWidth(0);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
441 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
442
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
443
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
444 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
445 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
446 * DrawTree() traverses the given tree, drawing the node and connecting
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
447 * segments. The tree contours are also drawn at each step, if enabled.
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
448 * 'draw_mode' specifies the drawing mode in which the tree is drawn.
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
449 * 'pos_mode' determines whether or not to use the old position of the node.
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
450 * This flag is used in animating the movement of a node from its old
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
451 * position to its new position. DrawNode() is called to draw an individual
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
452 * node.
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
453 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
454 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
455 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
456
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
457 void
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
458 DrawTree(Tree *tree, PosMode pos_mode)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
459 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
460 if (tree == NULL)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
461 return;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
462
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
463 DrawNode(tree, pos_mode);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
464
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
465 /* do stuff that animates Unzip() */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
466 if (tree->split) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
467 if (!AnimationMode ||
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
468 (tree->pos.x == tree->old_pos.x &&
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
469 tree->pos.y == tree->old_pos.y))
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
470 DrawTreeContour(tree, pos_mode, SPLIT_COLOR, FALSE, FALSE, FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
471 else
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
472 DrawTreeContour(tree, pos_mode, ACTION_COLOR, FALSE, FALSE, FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
473 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
474 if (tree->on_path)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
475 HiliteNode(tree, pos_mode);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
476
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
477 if (tree->child && !tree->elision)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
478 DrawTree(tree->child, pos_mode);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
479 if (tree->sibling)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
480 DrawTree(tree->sibling, pos_mode);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
481 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
482
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
483
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
484 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
485 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
486 * ShiftTree() adjusts the positions of each node so that it moves from
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
487 * the "old" position towards the "new position". This is used by
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
488 * AnimateTree(). 'done' is set to FALSE if the tree is not in its
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
489 * final position; it is used to determine when to stop animating the tree.
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
490 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
491 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
492 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
493
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
494 static void
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
495 ShiftTree(Tree *tree, int *done)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
496 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
497 Tree *child;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
498
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
499 if (tree->old_pos.x != tree->pos.x ||
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
500 tree->old_pos.y != tree->pos.y)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
501 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
502 tree->old_pos.x = tree->pos.x;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
503 tree->old_pos.y = tree->pos.y;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
504 }
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
505
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
506 FOREACH_CHILD(child, tree)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
507 ShiftTree(child, done);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
508 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
509
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
510
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
511 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
512 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
513 * AnimateTree() draws the given tree in a series of steps to give the
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
514 * effect of animation from the "old" layout to the "new" layout of the
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
515 * tree.
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
516 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
517 * The algorithm used here is not efficient; the entire tree is drawn
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
518 * on each iteration of the animation sequence; it would be more efficient
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
519 * to only redraw what is necessary. However, the method used here takes
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
520 * advantage of existing code without modification.
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
521 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
522 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
523 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
524
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
525 static void
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
526 AnimateTree(Tree *tree)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
527 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
528 int done = FALSE;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
529
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
530 AnimationMode = FALSE;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
531 /* highlight which nodes have to move */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
532 BeginFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
533 DrawTree(tree, Old);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
534 EndFrame();
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
535 Pause();
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
536 if (PauseAfterStep)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
537 AnimationStep = ANIMATION_STEP_STEP;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
538 while (!done) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
539 done = TRUE;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
540 ShiftTree(tree, &done);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
541 BeginFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
542 DrawTree(tree, Old);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
543 EndFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
544 if (PauseAfterStep)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
545 Pause();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
546 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
547 if (PauseAfterStep)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
548 AnimationStep = ANIMATION_STEP;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
549 AnimationMode = FALSE;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
550 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
551
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
552
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
553 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
554 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
555 * AnimateZip() generates a sequence of frames that animates the Zip() step.
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
556 * It is similar in logical structure to Zip().
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
557 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
558 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
559 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
560
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
561 static void
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
562 AnimateZip(Tree *tree)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
563 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
564 Tree *child;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
565
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
566 /* show results of Join() step */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
567 if (tree->child) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
568 BeginFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
569 FOREACH_CHILD(child, tree)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
570 child->split = FALSE;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
571 DrawTree(TheTree, New);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
572 DrawTreeContour(tree, New, CONTOUR_COLOR, TRUE, FALSE, FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
573 EndFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
574
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
575 StatusMsg("Zip: merge and join contours", FALSE);
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
576 Pause();
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
577
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
578 /* show results of AttachParent() step */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
579 BeginFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
580 DrawTree(TheTree, New);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
581 DrawTreeContour(tree, New, CONTOUR_COLOR, FALSE, FALSE, FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
582 EndFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
583
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
584 StatusMsg("Zip: attach parents", FALSE);
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
585 Pause();
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
586 }
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
587
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
588 tree->on_path = FALSE;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
589
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
590 if (tree->parent)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
591 AnimateZip(tree->parent);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
592 else {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
593 tree->on_path = FALSE;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
594 BeginFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
595 DrawTree(TheTree, New);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
596 DrawTreeContour(TheTree, New, CONTOUR_COLOR, FALSE, FALSE, FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
597 EndFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
598 StatusMsg("Zip: reassemble entire contour", FALSE);
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
599 Pause();
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
600 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
601 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
602
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
603
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
604 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
605 *
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
606 * CountNodes() returns the number of nodes in the specified tree.
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
607 * Nodes below a node that has been collapsed are ignored.
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
608 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
609 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
610 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
611
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
612 static int
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
613 CountNodes(Tree *tree)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
614 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
615 int num_nodes = 1; /* count root of subtree */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
616 Tree *child;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
617
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
618 if (!tree->elision) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
619 FOREACH_CHILD(child, tree)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
620 num_nodes += CountNodes(child);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
621 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
622 return (num_nodes);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
623 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
624
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
625
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
626 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
627 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
628 * CollectNodeRectangles() is a recursive function used by
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
629 * GetSubTreeRectangles() to collect the rectangles of descendant nodes
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
630 * into the pre-allocated storage passed to this function.
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
631 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
632 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
633 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
634
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
635 static void
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
636 CollectNodeRectangles(Tree *node, XRectangle **rectangles, int fill)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
637 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
638 Tree *child;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
639
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
640 (*rectangles)->x = node->pos.x;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
641 (*rectangles)->y = node->pos.y;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
642 if (fill) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
643 (*rectangles)->width = node->width + 1;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
644 (*rectangles)->height = node->height + 1;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
645 } else {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
646 (*rectangles)->width = node->width;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
647 (*rectangles)->height = node->height;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
648 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
649 (*rectangles)++;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
650
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
651 if (!node->elision)
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
652 FOREACH_CHILD(child, node)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
653 CollectNodeRectangles(child, rectangles, fill);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
654 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
655
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
656
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
657 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
658 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
659 * GetSubTreeRectangles() builds an array of XRectangles that contain
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
660 * all the node rectangles in the tree, except the root node itself.
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
661 * The array is returned in 'rectangles' and the number of rectangles
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
662 * is returned in 'nrectangles.' Storage for the rectangles is allocated
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
663 * in this function. This function is used by PickAction to determine
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
664 * what rectangles need to be dissolved away. 'fill', if True, specifies
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
665 * that the rectangles should be 1 pixel larger in each dimension to
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
666 * compensate for FillRectangle behavior.
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
667 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
668 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
669 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
670
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
671 static void
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
672 GetSubTreeRectangles(Tree *tree, XRectangle **rectangles,
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
673 int *nrectangles, int fill)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
674 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
675 Tree *child;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
676 XRectangle *crect; /* current rectangle */
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
677
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
678 *nrectangles = CountNodes(tree) - 1; /* don't count root node */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
679 *rectangles = (XRectangle *) malloc(sizeof(XRectangle) * *nrectangles);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
680 ASSERT(*rectangles, "could not allocate memory for rectangles");
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
681
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
682 crect = *rectangles;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
683 if (!tree->elision)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
684 FOREACH_CHILD(child, tree)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
685 CollectNodeRectangles(child, &crect, fill);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
686 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
687
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
688
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
689 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
690 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
691 * CollectNodeSegments() is a recursive function used by GetSubTreeSegments()
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
692 * to collect the line segments connecting nodes into the pre-allocated
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
693 * storage passed to this function.
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
694 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
695 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
696 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
697
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
698 static void
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
699 CollectNodeSegments(Tree *node, XSegment **segments)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
700 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
701 Tree *child;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
702
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
703 (*segments)->x1 = node->pos.x - 1;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
704 (*segments)->y1 = node->pos.y + (node->height / 2),
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
705 (*segments)->x2 = node->parent->pos.x + node->parent->width + 1;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
706 (*segments)->y2 = node->parent->pos.y + (node->parent->height / 2);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
707 (*segments)++;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
708
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
709 if (!node->elision)
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
710 FOREACH_CHILD(child, node)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
711 CollectNodeSegments(child, segments);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
712 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
713
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
714
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
715 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
716 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
717 * GetSubTreeSegments() builds an array of XSegments that contain
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
718 * all the line segments connecting the nodes in the tree. The array is
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
719 * returned in 'segments' and the number of segments is returned in
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
720 * 'nsegments.' Storage for the segments is allocated in this function.
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
721 * This function is used by PickAction to determine what line segments
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
722 * rectangles need to be dissolved away.
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
723 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
724 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
725 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
726
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
727 static void
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
728 GetSubTreeSegments(Tree *tree, XSegment **segments, int *nsegments)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
729 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
730 Tree *child;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
731 XSegment *cseg; /* current segment */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
732
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
733 *nsegments = CountNodes(tree) - 1;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
734 *segments = (XSegment *) malloc(sizeof(XSegment) * *nsegments);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
735 ASSERT(*segments, "could not allocate memory for segments");
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
736
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
737 cseg = *segments;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
738 if (!tree->elision)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
739 FOREACH_CHILD(child, tree)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
740 CollectNodeSegments(child, &cseg);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
741 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
742
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
743
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
744 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
745 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
746 * ComputeSubTreeExtent() computes the extent of a subtree. This is
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
747 * easily computed based on the tree's contour, as in ComputeTreeSize().
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
748 * This extent is stored in the node, and used by SearchTree for
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
749 * pick-correlation.
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
750 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
751 * This function assumes that the given tree has at least one child; do not
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
752 * pass a leaf node to this function.
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
753 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
754 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
755 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
756
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
757 void
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
758 ComputeSubTreeExtent(Tree *tree)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
759 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
760 int width, height;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
761 int x_offset, y_offset;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
762
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
763 ComputeTreeSize(tree, &width, &height, &x_offset, &y_offset);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
764 tree->subextent.pos.x = tree->child->pos.x - tree->child->border;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
765 tree->subextent.pos.y = tree->pos.y - y_offset;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
766 tree->subextent.width = width - (tree->child->pos.x - tree->pos.x) - 1;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
767 tree->subextent.height = height - 1;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
768 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
769
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
770
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
771 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
772 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
773 * SearchTree() determines if a node's rectangular region encloses the
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
774 * specified point in (x,y). Rather than using a brute-force search
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
775 * through all node rectangles of a given tree, the subtree extents
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
776 * are used in a recursive fashion to drive the search as long as the
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
777 * given point is enclosed in an extent. In the worst case, the search
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
778 * time would be on the order of a brute-force search, but with complex
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
779 * trees, this method reduces the number of visits.
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
780 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
781 * The extent of a subtree is computed by ComputeSubTreeExtent() and is
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
782 * stored in each node of the tree.
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
783 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
784 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
785 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
786
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
787 int
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
788 SearchTree(Tree *tree, int x, int y, Tree **node)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
789 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
790 Tree *child;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
791
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
792 if (tree == NULL)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
793 return (FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
794
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
795 if (PT_IN_RECT(x, y, tree->pos.x, tree->pos.y,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
796 tree->pos.x + tree->width,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
797 tree->pos.y + tree->height)) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
798 *node = tree;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
799 return (TRUE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
800 }
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
801 if (tree->child && (PT_IN_EXTENT(x, y, tree->subextent)))
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
802 FOREACH_CHILD(child, tree) {
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
803 if (SearchTree(child, x, y, node))
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
804 return (TRUE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
805 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
806 return (FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
807 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
808
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
809
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
810 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
811 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
812 * ExposeHandler() handles expose events in the TreeDrawingArea. This
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
813 * function is not intelligent; it just redraws the entire contents.
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
814 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
815 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
816 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
817
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
818 void
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
819 ExposeHandler(Widget w, XtPointer closure,
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
820 XEvent *event, Boolean *continue_to_dispatch)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
821 {
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
822 if (event->xexpose.count == 0) {
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
823 BeginFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
824 SetContours(TreeShowContourOption);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
825 DrawTree(TheTree, New);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
826 EndFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
827 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
828 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
829
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
830
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
831 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
832 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
833 * ExpandCollapseNode is called to expand or collapse a node in the tree.
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
834 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
835 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
836 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
837
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
838 void
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
839 ExpandCollapseNode(Tree *node)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
840 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
841 int width, height;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
842 int old_width, old_height;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
843 int x_offset, y_offset;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
844 XRectangle *rectangles;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
845 XSegment *segments;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
846 int nrectangles, nsegments;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
847 int expand = FALSE;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
848 Widget w = TreeDrawingArea;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
849
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
850 StatusMsg("", TRUE);
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
851
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
852 /* hilite node so that we know where we are */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
853 /* DrawTree will hilite it as a side effect */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
854 if (TreeShowSteps)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
855 node->on_path = TRUE;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
856
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
857 /* erase the contour before changing in the tree */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
858 if ((TreeShowContourOption != NoContours) || TreeShowSteps) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
859 BeginFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
860 DrawTree(TheTree, New);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
861 EndFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
862 }
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
863
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
864 sprintf(strbuf, "Node `%s' selected for %s", node->label.text,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
865 node->elision ? "expansion" : "collapse");
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
866 StatusMsg(strbuf, FALSE);
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
867 Pause();
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
868
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
869 if (node->parent)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
870 Unzip(node->parent);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
871 else {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
872 StatusMsg("Show entire contour", FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
873 if (TreeShowSteps) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
874 BeginFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
875 DrawTreeContour(TheTree, New, CONTOUR_COLOR, FALSE, FALSE, FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
876 DrawTree(TheTree, New);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
877 EndFrame();
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
878 Pause();
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
879 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
880 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
881
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
882 /* are we collapsing a subtree? */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
883 if (!node->elision) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
884 StatusMsg("Collapse subtree", FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
885 GetSubTreeRectangles(node, &rectangles, &nrectangles, TRUE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
886 GetSubTreeSegments(node, &segments, &nsegments);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
887 DissolveTree(XtDisplay(w), XtWindow(w),
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
888 rectangles, nrectangles,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
889 segments, nsegments, TRUE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
890 free(rectangles);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
891 free(segments);
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
892 Pause();
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
893
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
894 StatusMsg("Replace subtree contour with leaf contour", FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
895 node->elision = TRUE;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
896 if (TreeShowSteps)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
897 node->split = TRUE; /* turned off in AnimateZip */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
898 node->old_contour = node->contour;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
899 node->width += ELISION_WIDTH;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
900 LayoutLeaf(node);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
901 BeginFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
902 SetContours(TreeShowContourOption);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
903 DrawTree(TheTree, New);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
904 EndFrame();
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
905 Pause();
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
906 } else {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
907 StatusMsg("Replace leaf contour with old subtree contour", FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
908 if (TreeShowSteps)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
909 node->split = TRUE; /* turned off in AnimateZip */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
910 RuboutLeaf(node);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
911 node->contour = node->old_contour;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
912 expand = TRUE;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
913 }
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
914
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
915 if (node->parent)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
916 Zip(node->parent);
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
917
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
918 ComputeTreeSize(TheTree, &width, &height, &x_offset, &y_offset);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
919 PetrifyTree(TheTree, x_offset + MAT_SIZE, y_offset + MAT_SIZE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
920 GetDrawingSize(&old_width, &old_height);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
921
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
922 if (expand) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
923 SetDrawingSize(width + (2 * MAT_SIZE), height + (2 * MAT_SIZE));
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
924 BeginFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
925 DrawTree(TheTree, Old);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
926 EndFrame();
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
927 Pause();
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
928 StatusMsg("Move tree to new configuration", FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
929 AnimateTree(TheTree);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
930 } else {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
931 /* we are shrinking or staying the same */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
932 StatusMsg("Move tree to new configuration", FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
933 AnimateTree(TheTree);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
934 SetDrawingSize(width + (2 * MAT_SIZE), height + (2 * MAT_SIZE));
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
935 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
936
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
937 if (expand) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
938 StatusMsg("Expand subtree", FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
939 node->elision = FALSE;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
940
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
941 /* erase elision marker */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
942 XSetFunction(TreeDrawingAreaDB->display, TreeDrawingAreaDB->gc,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
943 GXclear);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
944 XFillRectangle(XtDisplay(w), XtWindow(w), TreeDrawingAreaDB->gc,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
945 node->pos.x + node->width - ELISION_WIDTH + 1,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
946 node->pos.y, ELISION_WIDTH, node->height + 1);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
947 XSetFunction(TreeDrawingAreaDB->display, TreeDrawingAreaDB->gc,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
948 GXcopy);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
949 node->width -= ELISION_WIDTH;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
950
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
951 GetSubTreeRectangles(node, &rectangles, &nrectangles, FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
952 GetSubTreeSegments(node, &segments, &nsegments);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
953 /* dissolve the tree back in */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
954 DissolveTree(XtDisplay(w), XtWindow(w),
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
955 rectangles, nrectangles,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
956 segments, nsegments, FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
957 free(rectangles);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
958 free(segments);
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
959
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
960 /* draw text of nodes */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
961 BeginFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
962 SetContours(TreeShowContourOption);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
963 DrawTree(TheTree, New);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
964 EndFrame();
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
965 Pause();
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
966 }
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
967
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
968 if (TreeShowSteps) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
969 node->on_path = FALSE;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
970 if (node->parent)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
971 AnimateZip(node->parent);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
972 else
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
973 node->split = FALSE;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
974 }
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
975
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
976 /* BUG: the display isn't properly updated here! */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
977 /* There should probably be some code here that
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
978 clears the tree below the node currently being
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
979 collapsed or expanded. Hack added 20.03.95 (torgeir@ii.uib.no).
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
980 I'll try to fix this later. */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
981
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
982 XClearArea(TreeDisplay, XtWindow(TreeDrawingArea), 0, 0, 0, 0, FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
983
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
984 BeginFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
985 SetContours(TreeShowContourOption);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
986 DrawTree(TheTree, New);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
987 EndFrame();
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
988
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
989 StatusMsg("Ready", TRUE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
990 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
991
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
992 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
993 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
994 * InsertNode() handles the task of inserting a new node in the tree,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
995 * at the given position with respect to 'base_node'. When 'node_pos' is
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
996 * either Before or After, it is assumed that 'base_node' has a parent.
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
997 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
998 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
999 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1000
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1001 void
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1002 InsertNode(Tree *base_node, NodePosition node_pos, char *new_node_text)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1003 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1004 Tree *new_node;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1005 Tree *parent;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1006 Tree *sibling = NULL;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1007 Tree *child;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1008
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1009 int width, height;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1010 int x_offset, y_offset;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1011
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1012 StatusMsg("", TRUE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1013
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1014 new_node = MakeNode(); /* should check for memory failure */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1015 SetNodeLabel(new_node, new_node_text);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1016 LayoutLeaf(new_node);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1017
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1018 /* figure out parent & sibling */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1019 if (node_pos == Child) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1020 parent = base_node;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1021 /* find last child, if one exists */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1022 FOREACH_CHILD(child, parent)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1023 sibling = child;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1024 } else if (node_pos == After) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1025 parent = base_node->parent;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1026 sibling = base_node;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1027 } else if (node_pos == Before) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1028 parent = base_node->parent;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1029 FOREACH_CHILD(child, parent)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1030 if (child->sibling == base_node) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1031 sibling = child;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1032 break;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1033 }
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1034 } else {
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1035 parent = NULL;
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1036 abort();
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1037 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1038
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1039 if (TreeShowSteps)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1040 parent->on_path = TRUE;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1041
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1042 if ((TreeShowContourOption != NoContours) ||
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1043 TreeShowSteps) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1044 BeginFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1045 DrawTree(TheTree, New);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1046 EndFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1047 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1048
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1049 sprintf(strbuf, "Inserting `%s' as child of node `%s'",
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1050 new_node_text, parent->label.text);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1051 StatusMsg(strbuf, FALSE);
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1052 Pause();
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1053
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1054 /* erase the contour before changing in the tree */
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1055
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1056 Insert(parent, new_node, sibling);
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1057
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1058 ComputeTreeSize(TheTree, &width, &height, &x_offset, &y_offset);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1059 PetrifyTree(TheTree, x_offset + MAT_SIZE, y_offset + MAT_SIZE);
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1060
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1061 if (sibling)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1062 new_node->old_pos = sibling->old_pos;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1063 else if (new_node->sibling)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1064 new_node->old_pos = new_node->sibling->old_pos;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1065 else {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1066 new_node->old_pos.x = new_node->pos.x;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1067 new_node->old_pos.y = parent->old_pos.y;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1068 }
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1069
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1070 if (TreeShowSteps)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1071 new_node->split = TRUE;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1072
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1073 SetDrawingSize(width + (2 * MAT_SIZE), height + (2 * MAT_SIZE));
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1074 BeginFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1075 DrawTree(TheTree, Old);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1076 EndFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1077 StatusMsg("Insert: add new node and contour", FALSE);
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1078 Pause();
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1079
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1080 StatusMsg("Move tree to new configuration", FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1081 AnimateTree(TheTree);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1082
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1083 if (TreeShowSteps) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1084 if (parent)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1085 AnimateZip(parent);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1086 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1087
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1088 BeginFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1089 SetContours(TreeShowContourOption);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1090 DrawTree(TheTree, New);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1091 EndFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1092
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1093 StatusMsg("Ready", TRUE);
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1094 }
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1095
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1096 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1097 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1098 * DeleteNode() handles the task of deleting a given node in the tree.
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1099 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1100 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1101 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1102
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1103 void
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1104 DeleteNode(Tree *node)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1105 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1106 Tree *parent;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1107
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1108 XRectangle *rectangles;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1109 XSegment *segments;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1110 int nrectangles, nsegments;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1111 Widget w = TreeDrawingArea;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1112 int width, height;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1113 int x_offset, y_offset;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1114
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1115 StatusMsg("", TRUE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1116
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1117 if (TreeShowSteps)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1118 node->on_path = TRUE;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1119
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1120 /* erase the contour before changing in the tree */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1121 if ((TreeShowContourOption != NoContours) ||
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1122 TreeShowSteps) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1123 BeginFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1124 DrawTree(TheTree, New);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1125 EndFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1126 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1127
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1128 sprintf(strbuf, "Node `%s' selected for deletion", node->label.text);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1129 StatusMsg(strbuf, FALSE);
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1130 Pause();
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1131
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1132 parent = node->parent;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1133
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1134 if (parent)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1135 Unzip(parent);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1136 else
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1137 TheTree = NULL; /* delete root of tree */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1138
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1139 /* fade out deleted subtree */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1140 StatusMsg("Delete subtree", FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1141 GetSubTreeRectangles(node, &rectangles, &nrectangles, TRUE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1142 GetSubTreeSegments(node, &segments, &nsegments);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1143 DissolveTree(XtDisplay(w), XtWindow(w),
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1144 rectangles, nrectangles,
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1145 segments, nsegments, TRUE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1146 free(rectangles);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1147 free(segments);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1148
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1149 Delete(node);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1150
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1151 BeginFrame();
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1152 if (TheTree)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1153 DrawTree(TheTree, New);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1154 EndFrame();
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1155 Pause();
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1156
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1157 if (parent)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1158 Zip(parent);
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1159
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1160 if (TheTree) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1161 ComputeTreeSize(TheTree, &width, &height, &x_offset, &y_offset);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1162 PetrifyTree(TheTree, x_offset + MAT_SIZE, y_offset + MAT_SIZE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1163 StatusMsg("Move tree to new configuration", FALSE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1164 AnimateTree(TheTree);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1165 SetDrawingSize(width + (2 * MAT_SIZE), height + (2 * MAT_SIZE));
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1166 Pause();
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1167
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1168 if (TreeShowSteps) {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1169 if (parent)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1170 AnimateZip(parent);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1171 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1172
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1173 BeginFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1174 SetContours(TreeShowContourOption);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1175 DrawTree(TheTree, New);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1176 EndFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1177
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1178 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1179
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1180 StatusMsg("Ready", TRUE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1181 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1182
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1183
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1184 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1185 *
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1186 * ResetLabels() is called when the TreeAlignNodes mode is changed.
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1187 * When TreeParentDistance changes, the node width changes, so this
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1188 * function forces each node's width to be recomputed.
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1189 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1190 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1191 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1192
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1193 void
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1194 ResetLabels(Tree *tree)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1195 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1196 Tree *child;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1197
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1198 SetNodeLabel(tree, tree->label.text);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1199 FOREACH_CHILD(child, tree)
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1200 ResetLabels(child);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1201 }
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1202
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1203
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1204 /* ----------------------------------------------------------------------------
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1205 *
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1206 * SetupTree() handles the task of setting up the specified tree in
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1207 * the drawing area.
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1208 *
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1209 * ----------------------------------------------------------------------------
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1210 */
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1211
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1212 void
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1213 SetupTree(Tree *tree)
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1214 {
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1215 int width, height;
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1216 int x_offset, y_offset;
167
85ec50267440 Import from CVS: tag r20-3b10
cvs
parents: 163
diff changeset
1217
163
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1218 LayoutTree(tree);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1219 ComputeTreeSize(tree, &width, &height, &x_offset, &y_offset);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1220 PetrifyTree(tree, x_offset + MAT_SIZE, y_offset + MAT_SIZE);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1221 SetDrawingTree(tree);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1222 SetDrawingSize(width + (2 * MAT_SIZE), height + (2 * MAT_SIZE));
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1223 BeginFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1224 SetContours(TreeShowContourOption);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1225 DrawTree(tree, New);
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1226 EndFrame();
0132846995bd Import from CVS: tag r20-3b8
cvs
parents:
diff changeset
1227 }