MODULE; IMPORT Filter, MFGraph, GraphVBT, MFViews, MaxflowViewClass, R2, TextVBT, View, ZeusPanel; TYPE T = MaxflowViewClass.T BRANDED OBJECT gvbt: GraphVBT.T; OVERRIDES startrun := Startrun; oeSetup := Setup; END; PROCEDURE MFLegendView Startrun (view: T) = (* sleazy hack: remove the old GraphVBT and just ignore it; heck, what else are VM and GC good for? *) BEGIN EVAL Filter.Replace(view, NEW(GraphVBT.T).init()); (* call the superclass startrun in ZeusClass.T *) MaxflowViewClass.T.startrun(view); END Startrun; PROCEDURESetup ( view : T; <* UNUSED *> g : MFGraph.T; <* UNUSED *> source : MFGraph.Vertex; <* UNUSED *> sink : MFGraph.Vertex) = VAR wc := GraphVBT.WorldRectangle{w := 0.0, s := 0.0, e := 1.0, n := 1.0}; stdsize, bigsize: R2.T; v : GraphVBT.Vertex; f : GraphVBT.WorldFont; BEGIN view.gvbt := NEW(GraphVBT.T, world := wc).init(); EVAL Filter.Replace(view, view.gvbt); stdsize := R2.T{0.08, 0.08}; bigsize := R2.T{0.6, 0.2}; (* cornflowerblue *) EVAL NEW(GraphVBT.Vertex, graph := view.gvbt, pos := R2.T{0.25, 0.9}, size := stdsize, color := MFViews.Color("cornflowerblue")).init(); f := view.gvbt.font (family := "helvetica", weight := "bold", slant := GraphVBT.Slant.Roman, size := 0.05); EVAL NEW(GraphVBT.Vertex, graph := view.gvbt, pos := R2.T{0.75, 0.9}, size := bigsize, label := "Forward flow along path (color saturation = flow/capacity)", font := f, fontColor := MFViews.Color("black"), color := MFViews.Color("white")).init(); (* limegreen *) EVAL NEW(GraphVBT.Vertex, graph := view.gvbt, pos := R2.T{0.25, 0.7}, size := stdsize, color := MFViews.Color("limegreen")).init(); EVAL NEW(GraphVBT.Vertex, graph := view.gvbt, pos := R2.T{0.75, 0.7}, size := bigsize, label := "Backward flow along path", font := f, fontColor := MFViews.Color("black"), color := MFViews.Color("white")).init(); (* magenta *) EVAL NEW(GraphVBT.Vertex, graph := view.gvbt, pos := R2.T{0.25, 0.5}, size := stdsize, color := MFViews.Color("magenta")).init(); EVAL NEW(GraphVBT.Vertex, graph := view.gvbt, pos := R2.T{0.75, 0.5}, size := bigsize, label := "Flow = capacity", font := f, fontColor := MFViews.Color("black"), color := MFViews.Color("white")).init(); (* black *) v := NEW(GraphVBT.Vertex, graph := view.gvbt, pos := R2.T{0.25, 0.3}, size := stdsize, shape := GraphVBT.VertexShape.Ellipse, color := MFViews.Color("gray")).init(); EVAL NEW( GraphVBT.VertexHighlight, vertex := v, color := MFViews.Color("black"), border := R2.T{0.01, 0.01}).init(); EVAL NEW(GraphVBT.Vertex, graph := view.gvbt, pos := R2.T{0.75, 0.3}, size := bigsize, label := "Augmenting path vertex", font := f, fontColor := MFViews.Color("black"), color := MFViews.Color("white")).init(); (* yellow *) v := NEW(GraphVBT.Vertex, graph := view.gvbt, pos := R2.T{0.25, 0.1}, size := stdsize, shape := GraphVBT.VertexShape.Ellipse, color := MFViews.Color("gray")).init(); EVAL NEW( GraphVBT.VertexHighlight, vertex := v, color := MFViews.Color("yellow"), border := R2.T{0.01, 0.01}).init(); EVAL NEW(GraphVBT.Vertex, graph := view.gvbt, pos := R2.T{0.75, 0.1}, size := bigsize, label := "currentVertex", font := f, fontColor := MFViews.Color("black"), color := MFViews.Color("white")).init(); view.gvbt.redisplay(); END Setup; PROCEDURENew (): View.T = VAR a : T := NEW(T).init(TextVBT.New("Legend")); BEGIN RETURN a; END New; BEGIN ZeusPanel.RegisterView (New, "Legend", "Maxflow"); END MFLegendView.