PNG  IHDR* pHYs+ IDATx]n#; cdLb Ǚ[at¤_:uP}>!Usă cag޿ ֵNu`ݼTâabO7uL&y^wFٝA"l[|ŲHLN밪4*sG3|Dv}?+y߉{OuOAt4Jj.u]Gz*҉sP'VQKbA1u\`& Af;HWj hsO;ogTu uj7S3/QzUr&wS`M$X_L7r2;aE+ώ%vikDA:dR+%KzƉo>eOth$z%: :{WwaQ:wz%4foɹE[9<]#ERINƻv溂E%P1i01 |Jvҗ&{b?9g=^wζXn/lK::90KwrюO\!ջ3uzuGv^;騢wq<Iatv09:tt~hEG`v;3@MNZD.1]L:{ծI3`L(÷ba")Y.iljCɄae#I"1 `3*Bdz>j<fU40⨬%O$3cGt]j%Fߠ_twJ;ABU8vP3uEԑwQ V:h%))LfraqX-ۿX]v-\9I gl8tzX ]ecm)-cgʒ#Uw=Wlێn(0hPP/ӨtQ“&J35 $=]r1{tLuǮ*i0_;NƝ8;-vݏr8+U-kruȕYr0RnC]*ެ(M:]gE;{]tg(#ZJ9y>utRDRMdr9㪩̞zֹb<ģ&wzJM"iI( .ꮅX)Qw:9,i좜\Ԛi7&N0:asϓc];=ΗOӣ APqz93 y $)A*kVHZwBƺnWNaby>XMN*45~ղM6Nvm;A=jֲ.~1}(9`KJ/V F9[=`~[;sRuk]rєT!)iQO)Y$V ی ۤmzWz5IM Zb )ˆC`6 rRa}qNmUfDsWuˤV{ Pݝ'=Kֳbg,UҘVz2ﴻnjNgBb{? ߮tcsͻQuxVCIY۠:(V뺕 ٥2;t`@Fo{Z9`;]wMzU~%UA蛚dI vGq\r82iu +St`cR.6U/M9IENDB`load ('def.lefty'); definit (); # # initialize window data # canvas = defcanvas; wrect = [0 = ['x' = -5; 'y' = 0;]; 1 = ['x' = 410; 'y' = 500;];]; setwidgetattr (canvas, ['window' = wrect;]); # # data structures # nodearray = []; nodenum = 0; dist = ['x' = 40; 'y' = 40;]; defsize = ['x' = 10; 'y' = 10;]; fontname = 'fixed'; fontsize = 18; tree = null; # drawing functions # boxnode = function (node) { local center; box (canvas, node, node.rect, ['color' = 0; 'fill' = 'on';]); box (canvas, node, node.rect); center = [ 'x' = (node.rect[0].x + node.rect[1].x) / 2; 'y' = (node.rect[0].y + node.rect[1].y) / 2; ]; if (node.name) text (canvas, node, center, node.name, fontname, fontsize, 'cc'); }; circlenode = function (node) { local center, radius; center = [ 'x' = (node.rect[0].x + node.rect[1].x) / 2; 'y' = (node.rect[0].y + node.rect[1].y) / 2; ]; radius = [ 'x' = center.x - node.rect[0].x; 'y' = center.y - node.rect[0].y; ]; arc (canvas, node, center, radius, ['color' = 0; 'fill' = 'on';]); arc (canvas, node, center, radius); if (node.name) text (canvas, node, center, node.name, fontname, fontsize, 'cc'); }; drawnode = boxnode; drawedge = function (node1, node2) { line (canvas, null, [ 'x' = (node1.rect[1].x + node1.rect[0].x) / 2; 'y' = node1.rect[0].y; ], [ 'x' = (node2.rect[1].x + node2.rect[0].x) / 2; 'y' = node2.rect[1].y; ]); }; drawtree = function (node) { local i; for (i in nodearray) drawnode (nodearray[i]); drawtreerec (node); }; drawtreerec = function (node) { local i, n; if ((n = tablesize (node.ch)) > 0) { for (i = 0; i < n; i = i + 1) { drawedge (node, node.ch[i]); drawtreerec (node.ch[i]); } } }; redraw = function (c) { if (tree) drawtree (tree); }; # layout functions # complayout = function () { leafx = 0; leafrank = 0; dolayout (tree, wrect[1].y - 10); remove ('leafx'); remove ('leafrank'); }; dolayout = function (node, pary) { local r, n, i, size, lchp, rchp; size = nodesize (node); if (node.chn > 0) { for (i = 0; i < node.chn; i = i + 1) dolayout (node.ch[i], pary - size.y - dist.y); node.rank = (node.ch[0].rank + node.ch[node.chn - 1].rank) / 2; lchp = node.ch[0].rect; rchp = node.ch[node.chn - 1].rect; r[0].x = lchp[0].x + ((rchp[1].x - lchp[0].x) - size.x) / 2; r[0].y = pary - size.y; r[1].x = r[0].x + size.x; r[1].y = pary; node.rect = r; } else { node.rank = leafrank; r[0].x = leafx; r[0].y = pary - size.y; r[1].x = r[0].x + size.x; r[1].y = pary; leafrank = leafrank + 1; leafx = r[1].x + dist.x; node.rect = r; } }; # editing functions # inode = function (point, name) { local i, nnum, size; nnum = nodenum; if (~name) name = ask ('give name of node:'); nodearray[nnum].ch = []; nodearray[nnum].chn = 0; nodearray[nnum].name = name; size = nodesize (nodearray[nnum]); nodearray[nnum].rect[0] = point; nodearray[nnum].rect[1] = ['x' = point.x + size.x; 'y' = point.y + size.y;]; nodenum = nodenum + 1; if (~tree) { tree = nodearray[nnum]; tree.depth = 0; complayout (); drawtree (tree); } else drawtree (nodearray[nnum]); return nodearray[nnum]; }; iedge = function (node1, node2) { node1.ch[node1.chn] = node2; node1.chn = node1.chn + 1; node2.depth = node1.depth + 1; complayout (); clear (canvas); drawtree (tree); }; fix = function (node, op, np) { if (node.depth ~= 0) dist.y = dist.y + (op.y - np.y) / node.depth; if (node.rank ~= 0) dist.x = dist.x + (np.x - op.x) / node.rank; complayout (); clear (canvas); drawtree (tree); }; nodesize = function (node) { local siz; if (~(siz = textsize (canvas, node.name, fontname, fontsize))) siz = defsize; else { siz.x = siz.x + 8; siz.y = siz.y + 8; } return siz; }; changenode = function (nodestyle) { drawnode = nodestyle; clear (canvas); drawtree (tree); }; # user interface functions # leftdown = function (data) { if (~data.obj) inode (data.pos, null); }; leftup = function (data) { if (data.pobj) fix (data.pobj, data.ppos, data.pos); }; middleup = function (data) { if (data.pobj & data.obj) iedge (data.pobj, data.obj); }; dops = function () { local s; s = ['x' = 8 * 300; 'y' = 10.5 * 300;]; fontname = 'Times-Roman'; canvas = createwidget (-1, ['type' = 'ps'; 'size' = s;]); setwidgetattr (canvas, ['window' = wrect;]); drawtree (tree); destroywidget (canvas); canvas=defcanvas; fontname = 'fixed'; };