annotate toolboxes/graph_visualisation/share/graphviz/lefty/dotty_ui.lefty @ 0:cc4b1211e677 tip

initial commit to HG from Changeset: 646 (e263d8a21543) added further path and more save "camirversion.m"
author Daniel Wolff
date Fri, 19 Aug 2016 13:07:06 +0200
parents
children
rev   line source
Daniel@0 1 #
Daniel@0 2 # dotty_ui: user interface functions and data structures
Daniel@0 3 #
Daniel@0 4 dotty.protogt.doaction = function (data, s) {
Daniel@0 5 local vt, gt;
Daniel@0 6
Daniel@0 7 vt = dotty.views[data.widget];
Daniel@0 8 gt = dotty.graphs[vt.gtid];
Daniel@0 9 data.menuitem = s;
Daniel@0 10 if (data.obj.nid >= 0) {
Daniel@0 11 if (gt.actions.node[s]) {
Daniel@0 12 gt.actions.node[s] (gt, vt, data.obj, data);
Daniel@0 13 return;
Daniel@0 14 }
Daniel@0 15 } else if (data.obj.eid >= 0) {
Daniel@0 16 if (gt.actions.edge[s]) {
Daniel@0 17 gt.actions.edge[s] (gt, vt, data.obj, data);
Daniel@0 18 return;
Daniel@0 19 }
Daniel@0 20 }
Daniel@0 21 if (gt.actions.general[s])
Daniel@0 22 gt.actions.general[s] (gt, vt, data);
Daniel@0 23 };
Daniel@0 24 dotty.protogt.actions.general = [
Daniel@0 25 "undo" = function (gt, vt, data) {
Daniel@0 26 gt.undo (gt, 1);
Daniel@0 27 };
Daniel@0 28 "paste" = function (gt, vt, data) {
Daniel@0 29 gt.paste (gt, data.pos, 1);
Daniel@0 30 };
Daniel@0 31 "do layout" = function (gt, vt, data) {
Daniel@0 32 gt.layoutgraph (gt);
Daniel@0 33 };
Daniel@0 34 "cancel layout" = function (gt, vt, data) {
Daniel@0 35 gt.cancellayout (gt);
Daniel@0 36 };
Daniel@0 37 "redraw" = function (gt, vt, data) {
Daniel@0 38 gt.redrawgraph (gt, [vt.vtid = vt;]);
Daniel@0 39 };
Daniel@0 40 "new graph" = function (gt, vt, data) {
Daniel@0 41 gt.erasegraph (gt, null, null);
Daniel@0 42 };
Daniel@0 43 "load graph" = function (gt, vt, data) {
Daniel@0 44 gt.loadgraph (gt, null, 'file', dotty.protogt.graph, 1);
Daniel@0 45 };
Daniel@0 46 "reload graph" = function (gt, vt, data) {
Daniel@0 47 gt.loadgraph (gt, gt.name, gt.type, gt.graph, 1);
Daniel@0 48 };
Daniel@0 49 "save graph" = function (gt, vt, data) {
Daniel@0 50 gt.savegraph (gt, gt.name, gt.type);
Daniel@0 51 };
Daniel@0 52 "save graph as" = function (gt, vt, data) {
Daniel@0 53 gt.savegraph (gt, null, 'file');
Daniel@0 54 };
Daniel@0 55 "open view" = function (gt, vt, data) {
Daniel@0 56 gt = dotty.protogt.creategraph (null);
Daniel@0 57 gt.createview (gt, null);
Daniel@0 58 };
Daniel@0 59 "copy view" = function (gt, vt, data) {
Daniel@0 60 gt = gt.copygraph (gt);
Daniel@0 61 gt.createview (gt, vt);
Daniel@0 62 };
Daniel@0 63 "birdseye view" = function (gt, vt, data) {
Daniel@0 64 gt.createview (gt, dotty.protovt.birdseye);
Daniel@0 65 };
Daniel@0 66 "clone view" = function (gt, vt, data) {
Daniel@0 67 gt.createview (gt, vt);
Daniel@0 68 };
Daniel@0 69 "close view" = function (gt, vt, data) {
Daniel@0 70 gt.destroyview (gt, vt);
Daniel@0 71 if (tablesize (gt.views) == 0)
Daniel@0 72 gt.destroygraph (gt);
Daniel@0 73 };
Daniel@0 74 "set graph attr" = function (gt, vt, data) {
Daniel@0 75 gt.setattr (gt, ['attr' = gt.graph.graphattr;]);
Daniel@0 76 };
Daniel@0 77 "set node attr" = function (gt, vt, data) {
Daniel@0 78 gt.setattr (gt, ['attr' = gt.graph.nodeattr;]);
Daniel@0 79 };
Daniel@0 80 "set edge attr" = function (gt, vt, data) {
Daniel@0 81 gt.setattr (gt, ['attr' = gt.graph.edgeattr;]);
Daniel@0 82 };
Daniel@0 83 "zoom in" = function (gt, vt, data) {
Daniel@0 84 gt.zoom (gt, vt, 0.5, data.pos);
Daniel@0 85 };
Daniel@0 86 "zoom out" = function (gt, vt, data) {
Daniel@0 87 gt.zoom (gt, vt, 2, data.pos);
Daniel@0 88 };
Daniel@0 89 "zoom in slowly" = function (gt, vt, data) {
Daniel@0 90 gt.zoom (gt, vt, 0.9, data.pos);
Daniel@0 91 };
Daniel@0 92 "zoom out slowly" = function (gt, vt, data) {
Daniel@0 93 gt.zoom (gt, vt, 1.1, data.pos);
Daniel@0 94 };
Daniel@0 95 "scroll horizontally" = function (gt, vt, data) {
Daniel@0 96 vt.scrollmode = 'h';
Daniel@0 97 };
Daniel@0 98 "scroll vertically" = function (gt, vt, data) {
Daniel@0 99 vt.scrollmode = 'v';
Daniel@0 100 };
Daniel@0 101 "find node" = function (gt, vt, data) {
Daniel@0 102 gt.findnode (gt, vt);
Daniel@0 103 };
Daniel@0 104 "print graph" = function (gt, vt, data) {
Daniel@0 105 gt.printorsave (gt, vt, null, null, null, null);
Daniel@0 106 };
Daniel@0 107 "text view" = function (gt, vt, data) {
Daniel@0 108 if (dotty.txtview == 'on')
Daniel@0 109 dotty.txtview = 'off';
Daniel@0 110 else
Daniel@0 111 dotty.txtview = 'on';
Daniel@0 112 txtview (dotty.txtview);
Daniel@0 113 };
Daniel@0 114 "quit" = function (gt, vt, data) {
Daniel@0 115 exit ();
Daniel@0 116 };
Daniel@0 117 ];
Daniel@0 118 dotty.protogt.actions.node = [
Daniel@0 119 "cut" = function (gt, vt, obj, data) {
Daniel@0 120 gt.cut (gt, obj, 'one', 'support', 'cut');
Daniel@0 121 dotty.clipgt.layoutgraph (dotty.clipgt);
Daniel@0 122 };
Daniel@0 123 "Cut" = function (gt, vt, obj, data) {
Daniel@0 124 gt.cut (gt, obj, 'reachable', 'support', 'cut');
Daniel@0 125 dotty.clipgt.layoutgraph (dotty.clipgt);
Daniel@0 126 };
Daniel@0 127 "copy" = function (gt, vt, obj, data) {
Daniel@0 128 gt.cut (gt, obj, 'one', 'support', 'copy');
Daniel@0 129 dotty.clipgt.layoutgraph (dotty.clipgt);
Daniel@0 130 };
Daniel@0 131 "Copy" = function (gt, vt, obj, data) {
Daniel@0 132 gt.cut (gt, obj, 'reachable', 'support', 'copy');
Daniel@0 133 dotty.clipgt.layoutgraph (dotty.clipgt);
Daniel@0 134 };
Daniel@0 135 "group" = function (gt, vt, obj, data) {
Daniel@0 136 local kv;
Daniel@0 137
Daniel@0 138 if ((kv = gt.getattr (gt, obj)))
Daniel@0 139 gt.groupnodesbyattr (gt, kv.key, kv.val, [
Daniel@0 140 'label' = kv.val; kv.key = kv.val;
Daniel@0 141 ], 1, 1);
Daniel@0 142 };
Daniel@0 143 "Group" = function (gt, vt, obj, data) {
Daniel@0 144 local kv;
Daniel@0 145
Daniel@0 146 if ((kv = gt.getattr (gt, obj)))
Daniel@0 147 gt.groupnodesbyattr (gt, kv.key, kv.val, [
Daniel@0 148 'label' = kv.val; kv.key = kv.val;
Daniel@0 149 ], 0, 1);
Daniel@0 150 };
Daniel@0 151 "delete" = function (gt, vt, obj, data) {
Daniel@0 152 if (obj.eid >= 0)
Daniel@0 153 gt.removeedge (gt, obj);
Daniel@0 154 else
Daniel@0 155 gt.removenode (gt, obj);
Daniel@0 156 };
Daniel@0 157 "Delete" = function (gt, vt, obj, data) {
Daniel@0 158 gt.removesubtree (gt, obj);
Daniel@0 159 };
Daniel@0 160 "remove" = function (gt, vt, obj, data) {
Daniel@0 161 if (obj.nid >= 0)
Daniel@0 162 if ((kv = gt.getattr (gt, obj)))
Daniel@0 163 gt.removenodesbyattr (gt, kv.key, kv.val);
Daniel@0 164 };
Daniel@0 165 "Remove" = function (gt, vt, obj, data) {
Daniel@0 166 if (obj.nid >= 0)
Daniel@0 167 if ((kv = gt.getattr (gt, obj)))
Daniel@0 168 gt.removesubtreesbyattr (gt, kv.key, kv.val);
Daniel@0 169 };
Daniel@0 170 "set attr" = function (gt, vt, obj, data) {
Daniel@0 171 gt.setattr (gt, obj);
Daniel@0 172 };
Daniel@0 173 "print attr" = function (gt, vt, obj, data) {
Daniel@0 174 if (obj.nid >= 0)
Daniel@0 175 echo ('node: ', obj.name);
Daniel@0 176 dump (obj.attr);
Daniel@0 177 };
Daniel@0 178 ];
Daniel@0 179 dotty.protogt.actions.edge = dotty.protogt.actions.node;
Daniel@0 180 dotty.protovt.normal.menus = [
Daniel@0 181 'general' = [
Daniel@0 182 0 = "undo";
Daniel@0 183 1 = "paste";
Daniel@0 184 2 = "do layout";
Daniel@0 185 3 = "cancel layout";
Daniel@0 186 4 = "redraw";
Daniel@0 187 5 = "new graph";
Daniel@0 188 6 = "load graph";
Daniel@0 189 7 = "reload graph";
Daniel@0 190 8 = "save graph";
Daniel@0 191 9 = "save graph as";
Daniel@0 192 10 = "open view";
Daniel@0 193 11 = "copy view";
Daniel@0 194 12 = "clone view";
Daniel@0 195 13 = "birdseye view";
Daniel@0 196 14 = "close view";
Daniel@0 197 15 = "set graph attr";
Daniel@0 198 16 = "set node attr";
Daniel@0 199 17 = "set edge attr";
Daniel@0 200 18 = "zoom in";
Daniel@0 201 19 = "zoom out";
Daniel@0 202 20 = "find node";
Daniel@0 203 21 = "print graph";
Daniel@0 204 22 = "text view";
Daniel@0 205 23 = "quit";
Daniel@0 206 ];
Daniel@0 207 'node' = [
Daniel@0 208 0 = "cut";
Daniel@0 209 1 = "Cut";
Daniel@0 210 2 = "copy";
Daniel@0 211 3 = "Copy";
Daniel@0 212 4 = "group";
Daniel@0 213 5 = "Group";
Daniel@0 214 6 = "delete";
Daniel@0 215 7 = "Delete";
Daniel@0 216 8 = "remove";
Daniel@0 217 9 = "Remove";
Daniel@0 218 10 = "set attr";
Daniel@0 219 11 = "print attr";
Daniel@0 220 ];
Daniel@0 221 'edge' = [
Daniel@0 222 0 = "cut";
Daniel@0 223 1 = "Cut";
Daniel@0 224 2 = "copy";
Daniel@0 225 3 = "Copy";
Daniel@0 226 4 = "delete";
Daniel@0 227 5 = "Delete";
Daniel@0 228 6 = "set attr";
Daniel@0 229 7 = "print attr";
Daniel@0 230 ];
Daniel@0 231 ];
Daniel@0 232 dotty.protovt.normal.keys = [
Daniel@0 233 'general' = [
Daniel@0 234 'u' = "undo";
Daniel@0 235 'p' = "paste";
Daniel@0 236 'l' = "do layout";
Daniel@0 237 'k' = "cancel layout";
Daniel@0 238 ' ' = "redraw";
Daniel@0 239 'L' = "reload graph";
Daniel@0 240 's' = "save graph";
Daniel@0 241 'Z' = "zoom in slowly";
Daniel@0 242 'z' = "zoom out slowly";
Daniel@0 243 'h' = "scroll horizontally";
Daniel@0 244 'v' = "scroll vertically";
Daniel@0 245 ];
Daniel@0 246 'node' = [
Daniel@0 247 'c' = "copy";
Daniel@0 248 'C' = "Copy";
Daniel@0 249 'g' = "group";
Daniel@0 250 'G' = "Group";
Daniel@0 251 'd' = "delete";
Daniel@0 252 'D' = "Delete";
Daniel@0 253 'r' = "remove";
Daniel@0 254 'R' = "Remove";
Daniel@0 255 'a' = "set attr";
Daniel@0 256 ];
Daniel@0 257 'edge' = [
Daniel@0 258 'c' = "copy";
Daniel@0 259 'C' = "Copy";
Daniel@0 260 'd' = "delete";
Daniel@0 261 'D' = "Delete";
Daniel@0 262 'a' = "set attr";
Daniel@0 263 ];
Daniel@0 264 ];
Daniel@0 265 dotty.protovt.birdseye.menus = dotty.protovt.normal.menus;
Daniel@0 266 dotty.protovt.birdseye.keys = dotty.protovt.normal.keys;
Daniel@0 267 dotty.protovt.normal.uifuncs = [
Daniel@0 268 'leftdown' = function (data) {
Daniel@0 269 local gt;
Daniel@0 270
Daniel@0 271 gt = dotty.graphs[dotty.views[data.widget].gtid];
Daniel@0 272 if (data.obj.nid >= 0) {
Daniel@0 273 dotty.node2move = data.obj;
Daniel@0 274 dotty.movewidget = data.widget;
Daniel@0 275 dotty.rp2 = data.pos;
Daniel@0 276 }
Daniel@0 277 };
Daniel@0 278 'leftmove' = function (data) {
Daniel@0 279 local gt;
Daniel@0 280
Daniel@0 281 gt = dotty.graphs[dotty.views[data.widget].gtid];
Daniel@0 282 if (dotty.node2move & (
Daniel@0 283 dotty.rp2.x ~= data.pos.x | dotty.rp2.y ~= data.pos.y
Daniel@0 284 )) {
Daniel@0 285 gt.movenode (gt, dotty.node2move, data.pos);
Daniel@0 286 dotty.rp2 = data.pos;
Daniel@0 287 }
Daniel@0 288 };
Daniel@0 289 'leftup' = function (data) {
Daniel@0 290 local gt;
Daniel@0 291
Daniel@0 292 gt = dotty.graphs[dotty.views[data.widget].gtid];
Daniel@0 293 if (dotty.node2move) {
Daniel@0 294 if (dotty.movewidget == data.widget)
Daniel@0 295 gt.movenode (gt, dotty.node2move, data.pos);
Daniel@0 296 dotty.node2move = 0;
Daniel@0 297 } else if (~data.obj)
Daniel@0 298 gt.insertnode (gt, data.pos, null, null, null, 1);
Daniel@0 299 };
Daniel@0 300 'middledown' = function (data) {
Daniel@0 301 if (~(data.obj.nid >= 0))
Daniel@0 302 return;
Daniel@0 303 dotty.rubberband = 1;
Daniel@0 304 dotty.movewidget = data.widget;
Daniel@0 305 setgfxattr (data.widget, ['mode' = 'xor';]);
Daniel@0 306 dotty.rp1 = data.pos;
Daniel@0 307 dotty.rp2 = data.pos;
Daniel@0 308 line (data.widget, null, dotty.rp1, dotty.rp2, ['color' = 1;]);
Daniel@0 309 };
Daniel@0 310 'middlemove' = function (data) {
Daniel@0 311 if (dotty.rubberband ~= 1 | (
Daniel@0 312 dotty.rp2.x == data.pos.x & dotty.rp2.y == data.pos.y
Daniel@0 313 ))
Daniel@0 314 return;
Daniel@0 315 line (data.widget, null, dotty.rp1, dotty.rp2, ['color' = 1;]);
Daniel@0 316 dotty.rp2 = data.pos;
Daniel@0 317 line (data.widget, null, dotty.rp1, dotty.rp2, ['color' = 1;]);
Daniel@0 318 };
Daniel@0 319 'middleup' = function (data) {
Daniel@0 320 local gt;
Daniel@0 321
Daniel@0 322 gt = dotty.graphs[dotty.views[data.widget].gtid];
Daniel@0 323 if (dotty.rubberband ~= 1)
Daniel@0 324 return;
Daniel@0 325 dotty.rubberband = 0;
Daniel@0 326 line (dotty.movewidget, null, dotty.rp1, dotty.rp2, ['color' = 1;]);
Daniel@0 327 setgfxattr (dotty.movewidget, ['mode' = 'src';]);
Daniel@0 328 if (dotty.movewidget ~= data.widget | ~(
Daniel@0 329 data.pobj.nid >= 0) | ~(data.obj.nid >= 0
Daniel@0 330 ))
Daniel@0 331 return;
Daniel@0 332 if (data.pobj.attr.support)
Daniel@0 333 gt.groupnodes (gt, [
Daniel@0 334 data.obj.nid = data.obj;
Daniel@0 335 data.pobj.nid = data.pobj;
Daniel@0 336 ], data.obj, null, null, null, 1, 1);
Daniel@0 337 else if (data.obj.attr.support)
Daniel@0 338 gt.groupnodes (gt, [
Daniel@0 339 data.obj.nid = data.obj;
Daniel@0 340 data.pobj.nid = data.pobj;
Daniel@0 341 ], data.pobj, null, null, null, 1, 1);
Daniel@0 342 else
Daniel@0 343 gt.insertedge (gt, data.pobj, null, data.obj, null, null, 1);
Daniel@0 344 };
Daniel@0 345 'rightdown' = function (data) {
Daniel@0 346 local vt, gt, menu, i;
Daniel@0 347
Daniel@0 348 vt = dotty.views[data.widget];
Daniel@0 349 gt = dotty.graphs[vt.gtid];
Daniel@0 350 if (~data.obj)
Daniel@0 351 menu = vt.menus.general;
Daniel@0 352 else if (data.obj.nid >= 0)
Daniel@0 353 menu = vt.menus.node;
Daniel@0 354 else if (data.obj.eid >= 0)
Daniel@0 355 menu = vt.menus.edge;
Daniel@0 356 if ((i = displaymenu (data.widget, menu)) >= 0)
Daniel@0 357 gt.doaction (data, menu[i]);
Daniel@0 358 };
Daniel@0 359 'button3up' = function (data) {
Daniel@0 360 local vt, attr;
Daniel@0 361
Daniel@0 362 vt = dotty.views[data.widget];
Daniel@0 363 attr = getwidgetattr (vt.scroll, [0 = 'childcenter';]);
Daniel@0 364 if (vt.scrollmode == 'h')
Daniel@0 365 attr.childcenter.x = attr.childcenter.x - 40;
Daniel@0 366 else
Daniel@0 367 attr.childcenter.y = attr.childcenter.y - 40;
Daniel@0 368 setwidgetattr (vt.scroll, ['childcenter' = attr.childcenter;]);
Daniel@0 369 };
Daniel@0 370 'button4up' = function (data) {
Daniel@0 371 local vt, attr;
Daniel@0 372
Daniel@0 373 vt = dotty.views[data.widget];
Daniel@0 374 attr = getwidgetattr (vt.scroll, [0 = 'childcenter';]);
Daniel@0 375 if (vt.scrollmode == 'h')
Daniel@0 376 attr.childcenter.x = attr.childcenter.x + 40;
Daniel@0 377 else
Daniel@0 378 attr.childcenter.y = attr.childcenter.y + 40;
Daniel@0 379 setwidgetattr (vt.scroll, ['childcenter' = attr.childcenter;]);
Daniel@0 380 };
Daniel@0 381 'keyup' = function (data) {
Daniel@0 382 local vt, gt, action;
Daniel@0 383
Daniel@0 384 vt = dotty.views[data.widget];
Daniel@0 385 gt = dotty.graphs[vt.gtid];
Daniel@0 386 if (data.obj.nid >= 0) {
Daniel@0 387 if (vt.keys.node[data.key])
Daniel@0 388 action = vt.keys.node[data.key];
Daniel@0 389 } else if (data.obj.eid >= 0) {
Daniel@0 390 if (vt.keys.edge[data.key])
Daniel@0 391 action = vt.keys.edge[data.key];
Daniel@0 392 }
Daniel@0 393 if (~action)
Daniel@0 394 if (vt.keys.general[data.key])
Daniel@0 395 action = vt.keys.general[data.key];
Daniel@0 396 if (action)
Daniel@0 397 gt.doaction (data, action);
Daniel@0 398 };
Daniel@0 399 'redraw' = function (data) {
Daniel@0 400 local vt, gt;
Daniel@0 401
Daniel@0 402 vt = dotty.views[data.widget];
Daniel@0 403 gt = dotty.graphs[vt.gtid];
Daniel@0 404 gt.drawgraph (gt, [vt.vtid = vt;]);
Daniel@0 405 };
Daniel@0 406 'closeview' = function (data) {
Daniel@0 407 local vt, gt;
Daniel@0 408
Daniel@0 409 vt = dotty.views[data.widget];
Daniel@0 410 gt = dotty.graphs[vt.gtid];
Daniel@0 411 gt.destroyview (gt, vt);
Daniel@0 412 if (tablesize (gt.views) == 0)
Daniel@0 413 gt.destroygraph (gt);
Daniel@0 414 };
Daniel@0 415 ];
Daniel@0 416 dotty.protovt.birdseye.uifuncs = [
Daniel@0 417 'leftdown' = function (data) {
Daniel@0 418 local gt, vid;
Daniel@0 419
Daniel@0 420 gt = dotty.graphs[dotty.views[data.widget].gtid];
Daniel@0 421 for (vid in gt.views) {
Daniel@0 422 vt = gt.views[vid];
Daniel@0 423 if (vt.type ~= 'birdseye')
Daniel@0 424 gt.setviewcenter ([vid = vt;], data.pos);
Daniel@0 425 }
Daniel@0 426 };
Daniel@0 427 'leftmove' = function (data) {
Daniel@0 428 local gt, vid;
Daniel@0 429
Daniel@0 430 gt = dotty.graphs[dotty.views[data.widget].gtid];
Daniel@0 431 for (vid in gt.views) {
Daniel@0 432 vt = gt.views[vid];
Daniel@0 433 if (vt.type ~= 'birdseye')
Daniel@0 434 gt.setviewcenter ([vid = vt;], data.pos);
Daniel@0 435 }
Daniel@0 436 };
Daniel@0 437 'leftup' = function (data) {
Daniel@0 438 local gt, vid;
Daniel@0 439
Daniel@0 440 gt = dotty.graphs[dotty.views[data.widget].gtid];
Daniel@0 441 for (vid in gt.views) {
Daniel@0 442 vt = gt.views[vid];
Daniel@0 443 if (vt.type ~= 'birdseye')
Daniel@0 444 gt.setviewcenter ([vid = vt;], data.pos);
Daniel@0 445 }
Daniel@0 446 };
Daniel@0 447 'middledown' = dotty.protovt.normal.uifuncs.middledown;
Daniel@0 448 'middlemove' = dotty.protovt.normal.uifuncs.middlemove;
Daniel@0 449 'middleup' = dotty.protovt.normal.uifuncs.middleup;
Daniel@0 450 'rightdown' = dotty.protovt.normal.uifuncs.rightdown;
Daniel@0 451 'keyup' = dotty.protovt.normal.uifuncs.keyup;
Daniel@0 452 'redraw' = dotty.protovt.normal.uifuncs.redraw;
Daniel@0 453 'closeview' = dotty.protovt.normal.uifuncs.closeview;
Daniel@0 454 ];
Daniel@0 455 dotty.monitorfile = function (data) {
Daniel@0 456 local gtid, gt, lpt;
Daniel@0 457
Daniel@0 458 for (gtid in dotty.layoutpending) {
Daniel@0 459 lpt = dotty.layoutpending[gtid];
Daniel@0 460 if (lpt.fd == data.fd) {
Daniel@0 461 gt = dotty.graphs[lpt.gtid];
Daniel@0 462 gt.haveinput = 1;
Daniel@0 463 gt.layoutgraph (gt);
Daniel@0 464 return 1;
Daniel@0 465 }
Daniel@0 466 }
Daniel@0 467 return 0;
Daniel@0 468 };