sclass WebNode implements _SetField { Web web; new L labels; O visInfo; // visualisation info public void _setField(S f, O x) { if (f.equals('web)) web = (Web) x; else if (f.equals('labels)) labels = (L) x; else if (f.equals('visInfo)) visInfo = x; } *() {} *(Web *web) { web.fireNewNode(this); } void addLabel(S label) { addLabel(web.parseLabel(label)); } void addLabel(Lisp label) { if (setAdd(labels, label) && web != null) web.index(label, this); } void addLabels(Collection l) { for (Lisp lbl : l) addLabel(lbl); } void addStrings(Collection l) { for (S lbl : l) addLabel(lbl); } bool hasLabel(Lisp label) { ret labels.contains(label); } bool hasLabel(S label) { ret labels.contains(web.parseLabel(label)); } toString { ret l(labels) == 1 ? str(first(labels)) : str(labels); } int count() { ret 1 + l(labels); } S text() { ret web.unparseLabel(first(labels)); } L texts() { ret web.unparseLabels(labels); } void relation(S arrow, S b) { web.getRelation(this, web.node(b)).addLabel(arrow); } Lisp parseLabel(S l) { ret web.parseLabel(l); } S unparseLabel(Lisp l) { ret web.unparseLabel(l); } L labels() { ret labels; } bool hasLabels() { ret nempty(labels); } void setLabel(int i, Lisp l) { labels.set(i, l); } O visInfo() { ret visInfo; } }