public class Node {
private final int idx = master_idx++;
public String label;
+ public String comment;
public boolean directed = false;
public String color="black";
public ArrayList<Node> edges = new ArrayList<Node>();
+ public ArrayList<Object> labels = new ArrayList<Object>();
public ArrayList<Node> inbound = new ArrayList<Node>();
- public void edge(ToGraphViz o) {
+ public void edge(ToGraphViz o, Object label) {
Node n = o.toGraphViz(GraphViz.this);
if (n==null) return;
edges.add(n);
+ labels.add(label);
n.inbound.add(this);
}
public String name() {
}
public void edges(PrintWriter pw) {
if (simple()) return;
- for(Node n : edges)
- pw.println(" "+name()+" -> " + n.name());
+ for(int i=0; i<edges.size(); i++) {
+ Node n = edges.get(i);
+ Object label = labels.get(i);
+ pw.println(" "+name()+" -> " + n.name() + " [color="+color+" " +(label==null?"":("label=\""+label+"\""))+ "];\n");
+ }
}
public int numEdges() { return edges.size(); }
public boolean simple() {
if (directed) pw.print("ordering=out");
if (simple()) {
pw.print(" shape=record ");
- pw.print(" label=\"{");
+ pw.print(" label=\"");
+ boolean complex = false;
+ for(Node n : edges)
+ if (n.edges.size()>0)
+ complex = true;
+ if (!complex) pw.print("{");
boolean first = true;
for(Node n : edges) {
if (!first) pw.print("|");
first = false;
- pw.print("<"+n.name()+">");
+ pw.print("<node_"+n.idx+">");
pw.print(StringUtil.escapify(n.label,"\\\""));
}
- pw.print("}\"");
+ if (!complex) pw.print("}");
+ pw.print("\"");
} else {
pw.print(" label=\"");
pw.print(StringUtil.escapify(label,"\\\""));
pw.print("\"");
}
pw.print("color="+color);
+ if (comment!=null) pw.print(" comment=\""+StringUtil.escapify(comment,"\\\"")+"\" ");
pw.print("];\n");
}
}
public void dump(PrintWriter pw) {
IdentityHashMap<Node,Node> done = new IdentityHashMap<Node,Node>();
- pw.println("digraph G {\n");
+ pw.println("digraph G { rankdir=LR; \n");
for(Group g : groups.values()) {
pw.println(" { rank=same;\n");
for(Node n : groups.keySet())