GIF89a; EcchiShell v1.0
//usr/share/graphviz/lefty/

Mass Deface = 0) gt.removeedge (gt, obj); else gt.removenode (gt, obj); }; "Delete" = function (gt, vt, obj, data) { gt.removesubtree (gt, obj); }; "remove" = function (gt, vt, obj, data) { if (obj.nid >= 0) if ((kv = gt.getattr (gt, obj))) gt.removenodesbyattr (gt, kv.key, kv.val); }; "Remove" = function (gt, vt, obj, data) { if (obj.nid >= 0) if ((kv = gt.getattr (gt, obj))) gt.removesubtreesbyattr (gt, kv.key, kv.val); }; "set attr" = function (gt, vt, obj, data) { gt.setattr (gt, obj); }; "print attr" = function (gt, vt, obj, data) { if (obj.nid >= 0) echo ('node: ', obj.name); dump (obj.attr); }; ]; dotty.protogt.actions.edge = dotty.protogt.actions.node; dotty.protovt.normal.menus = [ 'general' = [ 0 = "undo"; 1 = "paste"; 2 = "do layout"; 3 = "cancel layout"; 4 = "redraw"; 5 = "new graph"; 6 = "load graph"; 7 = "reload graph"; 8 = "save graph"; 9 = "save graph as"; 10 = "open view"; 11 = "copy view"; 12 = "clone view"; 13 = "birdseye view"; 14 = "close view"; 15 = "set graph attr"; 16 = "set node attr"; 17 = "set edge attr"; 18 = "zoom in"; 19 = "zoom out"; 20 = "find node"; 21 = "print graph"; 22 = "text view"; 23 = "quit"; ]; 'node' = [ 0 = "cut"; 1 = "Cut"; 2 = "copy"; 3 = "Copy"; 4 = "group"; 5 = "Group"; 6 = "delete"; 7 = "Delete"; 8 = "remove"; 9 = "Remove"; 10 = "set attr"; 11 = "print attr"; ]; 'edge' = [ 0 = "cut"; 1 = "Cut"; 2 = "copy"; 3 = "Copy"; 4 = "delete"; 5 = "Delete"; 6 = "set attr"; 7 = "print attr"; ]; ]; dotty.protovt.normal.keys = [ 'general' = [ 'u' = "undo"; 'p' = "paste"; 'l' = "do layout"; 'k' = "cancel layout"; ' ' = "redraw"; 'L' = "reload graph"; 's' = "save graph"; 'Z' = "zoom in slowly"; 'z' = "zoom out slowly"; 'h' = "scroll horizontally"; 'v' = "scroll vertically"; ]; 'node' = [ 'c' = "copy"; 'C' = "Copy"; 'g' = "group"; 'G' = "Group"; 'd' = "delete"; 'D' = "Delete"; 'r' = "remove"; 'R' = "Remove"; 'a' = "set attr"; ]; 'edge' = [ 'c' = "copy"; 'C' = "Copy"; 'd' = "delete"; 'D' = "Delete"; 'a' = "set attr"; ]; ]; dotty.protovt.birdseye.menus = dotty.protovt.normal.menus; dotty.protovt.birdseye.keys = dotty.protovt.normal.keys; dotty.protovt.normal.uifuncs = [ 'leftdown' = function (data) { local gt; gt = dotty.graphs[dotty.views[data.widget].gtid]; if (data.obj.nid >= 0) { dotty.node2move = data.obj; dotty.movewidget = data.widget; dotty.rp2 = data.pos; } }; 'leftmove' = function (data) { local gt; gt = dotty.graphs[dotty.views[data.widget].gtid]; if (dotty.node2move & ( dotty.rp2.x ~= data.pos.x | dotty.rp2.y ~= data.pos.y )) { gt.movenode (gt, dotty.node2move, data.pos); dotty.rp2 = data.pos; } }; 'leftup' = function (data) { local gt; gt = dotty.graphs[dotty.views[data.widget].gtid]; if (dotty.node2move) { if (dotty.movewidget == data.widget) gt.movenode (gt, dotty.node2move, data.pos); dotty.node2move = 0; } else if (~data.obj) gt.insertnode (gt, data.pos, null, null, null, 1); }; 'middledown' = function (data) { if (~(data.obj.nid >= 0)) return; dotty.rubberband = 1; dotty.movewidget = data.widget; setgfxattr (data.widget, ['mode' = 'xor';]); dotty.rp1 = data.pos; dotty.rp2 = data.pos; line (data.widget, null, dotty.rp1, dotty.rp2, ['color' = 1;]); }; 'middlemove' = function (data) { if (dotty.rubberband ~= 1 | ( dotty.rp2.x == data.pos.x & dotty.rp2.y == data.pos.y )) return; line (data.widget, null, dotty.rp1, dotty.rp2, ['color' = 1;]); dotty.rp2 = data.pos; line (data.widget, null, dotty.rp1, dotty.rp2, ['color' = 1;]); }; 'middleup' = function (data) { local gt; gt = dotty.graphs[dotty.views[data.widget].gtid]; if (dotty.rubberband ~= 1) return; dotty.rubberband = 0; line (dotty.movewidget, null, dotty.rp1, dotty.rp2, ['color' = 1;]); setgfxattr (dotty.movewidget, ['mode' = 'src';]); if (dotty.movewidget ~= data.widget | ~( data.pobj.nid >= 0) | ~(data.obj.nid >= 0 )) return; if (data.pobj.attr.support) gt.groupnodes (gt, [ data.obj.nid = data.obj; data.pobj.nid = data.pobj; ], data.obj, null, null, null, 1, 1); else if (data.obj.attr.support) gt.groupnodes (gt, [ data.obj.nid = data.obj; data.pobj.nid = data.pobj; ], data.pobj, null, null, null, 1, 1); else gt.insertedge (gt, data.pobj, null, data.obj, null, null, 1); }; 'rightdown' = function (data) { local vt, gt, menu, i; vt = dotty.views[data.widget]; gt = dotty.graphs[vt.gtid]; if (~data.obj) menu = vt.menus.general; else if (data.obj.nid >= 0) menu = vt.menus.node; else if (data.obj.eid >= 0) menu = vt.menus.edge; if ((i = displaymenu (data.widget, menu)) >= 0) gt.doaction (data, menu[i]); }; 'button3up' = function (data) { local vt, attr; vt = dotty.views[data.widget]; attr = getwidgetattr (vt.scroll, [0 = 'childcenter';]); if (vt.scrollmode == 'h') attr.childcenter.x = attr.childcenter.x - 40; else attr.childcenter.y = attr.childcenter.y - 40; setwidgetattr (vt.scroll, ['childcenter' = attr.childcenter;]); }; 'button4up' = function (data) { local vt, attr; vt = dotty.views[data.widget]; attr = getwidgetattr (vt.scroll, [0 = 'childcenter';]); if (vt.scrollmode == 'h') attr.childcenter.x = attr.childcenter.x + 40; else attr.childcenter.y = attr.childcenter.y + 40; setwidgetattr (vt.scroll, ['childcenter' = attr.childcenter;]); }; 'keyup' = function (data) { local vt, gt, action; vt = dotty.views[data.widget]; gt = dotty.graphs[vt.gtid]; if (data.obj.nid >= 0) { if (vt.keys.node[data.key]) action = vt.keys.node[data.key]; } else if (data.obj.eid >= 0) { if (vt.keys.edge[data.key]) action = vt.keys.edge[data.key]; } if (~action) if (vt.keys.general[data.key]) action = vt.keys.general[data.key]; if (action) gt.doaction (data, action); }; 'redraw' = function (data) { local vt, gt; vt = dotty.views[data.widget]; gt = dotty.graphs[vt.gtid]; gt.drawgraph (gt, [vt.vtid = vt;]); }; 'closeview' = function (data) { local vt, gt; vt = dotty.views[data.widget]; gt = dotty.graphs[vt.gtid]; gt.destroyview (gt, vt); if (tablesize (gt.views) == 0) gt.destroygraph (gt); }; ]; dotty.protovt.birdseye.uifuncs = [ 'leftdown' = function (data) { local gt, vid; gt = dotty.graphs[dotty.views[data.widget].gtid]; for (vid in gt.views) { vt = gt.views[vid]; if (vt.type ~= 'birdseye') gt.setviewcenter ([vid = vt;], data.pos); } }; 'leftmove' = function (data) { local gt, vid; gt = dotty.graphs[dotty.views[data.widget].gtid]; for (vid in gt.views) { vt = gt.views[vid]; if (vt.type ~= 'birdseye') gt.setviewcenter ([vid = vt;], data.pos); } }; 'leftup' = function (data) { local gt, vid; gt = dotty.graphs[dotty.views[data.widget].gtid]; for (vid in gt.views) { vt = gt.views[vid]; if (vt.type ~= 'birdseye') gt.setviewcenter ([vid = vt;], data.pos); } }; 'middledown' = dotty.protovt.normal.uifuncs.middledown; 'middlemove' = dotty.protovt.normal.uifuncs.middlemove; 'middleup' = dotty.protovt.normal.uifuncs.middleup; 'rightdown' = dotty.protovt.normal.uifuncs.rightdown; 'keyup' = dotty.protovt.normal.uifuncs.keyup; 'redraw' = dotty.protovt.normal.uifuncs.redraw; 'closeview' = dotty.protovt.normal.uifuncs.closeview; ]; dotty.monitorfile = function (data) { local gtid, gt, lpt; for (gtid in dotty.layoutpending) { lpt = dotty.layoutpending[gtid]; if (lpt.fd == data.fd) { gt = dotty.graphs[lpt.gtid]; gt.haveinput = 1; gt.layoutgraph (gt); return 1; } } return 0; };