clarified static full_graph vs. dynamic visible_graph;
authorwenzelm
Sun, 04 Jan 2015 14:05:24 +0100 (2015-01-04)
changeset 59259 399506ee38a5
parent 59258 d5c9900636ef
child 59260 c8bd83f8dad9
clarified static full_graph vs. dynamic visible_graph; tuned;
src/Pure/General/graph.scala
src/Tools/Graphview/graph_panel.scala
src/Tools/Graphview/model.scala
src/Tools/Graphview/mutator.scala
src/Tools/Graphview/popups.scala
src/Tools/Graphview/visualizer.scala
--- a/src/Pure/General/graph.scala	Sun Jan 04 13:34:42 2015 +0100
+++ b/src/Pure/General/graph.scala	Sun Jan 04 14:05:24 2015 +0100
@@ -181,6 +181,9 @@
 
   /* edge operations */
 
+  def edges_iterator: Iterator[(Key, Key)] =
+    for { x <- keys_iterator; y <- imm_succs(x).iterator } yield (x, y)
+
   def is_edge(x: Key, y: Key): Boolean =
     defined(x) && defined(y) && imm_succs(x)(y)
 
--- a/src/Tools/Graphview/graph_panel.scala	Sun Jan 04 13:34:42 2015 +0100
+++ b/src/Tools/Graphview/graph_panel.scala	Sun Jan 04 14:05:24 2015 +0100
@@ -27,9 +27,9 @@
 
   override lazy val peer: JScrollPane = new JScrollPane with SuperMixin {
     override def getToolTipText(event: java.awt.event.MouseEvent): String =
-      find_node(Transform.pane_to_graph_coordinates(event.getPoint)) match {
+      find_visible_node(Transform.pane_to_graph_coordinates(event.getPoint)) match {
         case Some(node) =>
-          visualizer.model.complete_graph.get_node(node) match {
+          visualizer.model.full_graph.get_node(node) match {
             case Nil => null
             case content => visualizer.make_tooltip(panel.peer, event.getX, event.getY, content)
           }
@@ -45,10 +45,10 @@
 
   peer.getVerticalScrollBar.setUnitIncrement(10)
 
-  def find_node(at: Point2D): Option[Graph_Display.Node] =
+  def find_visible_node(at: Point2D): Option[Graph_Display.Node] =
   {
     val m = visualizer.metrics()
-    visualizer.model.visible_nodes_iterator
+    visualizer.model.make_visible_graph().keys_iterator
       .find(node => visualizer.Drawer.shape(m, node).contains(at))
   }
 
@@ -144,7 +144,7 @@
 
     def fit_to_window()
     {
-      if (visualizer.model.visible_nodes_iterator.isEmpty)
+      if (visualizer.model.make_visible_graph().is_empty)
         rescale(1.0)
       else {
         val box = visualizer.Coordinates.bounding_box()
@@ -181,7 +181,7 @@
     def dummy(at: Point2D): Option[Dummy] =
     {
       val m = visualizer.metrics()
-      visualizer.model.visible_edges_iterator.map(
+      visualizer.model.make_visible_graph().edges_iterator.map(
         edge => visualizer.Coordinates(edge).zipWithIndex.map((edge, _))).flatten.find(
           {
             case (_, ((x, y), _)) =>
@@ -197,7 +197,7 @@
     {
       val c = Transform.pane_to_graph_coordinates(at)
       val l =
-        find_node(c) match {
+        find_visible_node(c) match {
           case Some(node) =>
             if (visualizer.Selection.contains(node)) visualizer.Selection.get()
             else List(node)
@@ -221,7 +221,7 @@
 
       def left_click()
       {
-        (find_node(c), m) match {
+        (find_visible_node(c), m) match {
           case (Some(node), Key.Modifier.Control) => visualizer.Selection.add(node)
           case (None, Key.Modifier.Control) =>
 
@@ -238,7 +238,7 @@
 
       def right_click()
       {
-        val menu = Popups(panel, find_node(c), visualizer.Selection.get())
+        val menu = Popups(panel, find_visible_node(c), visualizer.Selection.get())
         menu.show(panel.peer, at.x, at.y)
       }
 
--- a/src/Tools/Graphview/model.scala	Sun Jan 04 13:34:42 2015 +0100
+++ b/src/Tools/Graphview/model.scala	Sun Jan 04 14:05:24 2015 +0100
@@ -33,7 +33,7 @@
 }
 
 
-class Model(val complete_graph: Graph_Display.Graph)
+class Model(val full_graph: Graph_Display.Graph)
 {
   val Mutators =
     new Mutator_Container(
@@ -51,16 +51,11 @@
         Mutator.Node_List(Nil, false, false, false)))
 
   def find_node(ident: String): Option[Graph_Display.Node] =
-    complete_graph.keys_iterator.find(node => node.ident == ident)
-
-  def visible_nodes_iterator: Iterator[Graph_Display.Node] = current_graph.keys_iterator
+    full_graph.keys_iterator.find(node => node.ident == ident)
 
-  def visible_edges_iterator: Iterator[Graph_Display.Edge] =
-    current_graph.keys_iterator.flatMap(k => current_graph.imm_succs(k).iterator.map((k, _)))
-
-  def current_graph: Graph_Display.Graph =
-    (complete_graph /: Mutators()) {
-      case (g, m) => if (!m.enabled) g else m.mutator.mutate(complete_graph, g)
+  def make_visible_graph(): Graph_Display.Graph =
+    (full_graph /: Mutators()) {
+      case (g, m) => if (!m.enabled) g else m.mutator.mutate(full_graph, g)
     }
 
   private var _colors = Map.empty[Graph_Display.Node, Color]
@@ -71,7 +66,7 @@
     _colors =
       (Map.empty[Graph_Display.Node, Color] /: Colors()) {
         case (colors, m) =>
-          (colors /: m.mutator.mutate(complete_graph, complete_graph).keys_iterator) {
+          (colors /: m.mutator.mutate(full_graph, full_graph).keys_iterator) {
             case (colors, node) => colors + (node -> m.color)
           }
       }
--- a/src/Tools/Graphview/mutator.scala	Sun Jan 04 13:34:42 2015 +0100
+++ b/src/Tools/Graphview/mutator.scala	Sun Jan 04 14:05:24 2015 +0100
@@ -34,8 +34,8 @@
     val description: String,
     pred: (Graph_Display.Graph, Graph_Display.Graph) => Graph_Display.Graph) extends Mutator
   {
-    def mutate(complete_graph: Graph_Display.Graph, graph: Graph_Display.Graph): Graph_Display.Graph =
-      pred(complete_graph, graph)
+    def mutate(full_graph: Graph_Display.Graph, graph: Graph_Display.Graph): Graph_Display.Graph =
+      pred(full_graph, graph)
   }
 
   class Node_Filter(
@@ -144,20 +144,20 @@
       "Add by name",
       "Adds every node whose name matches the regex. " +
       "Adds all relevant edges.",
-      (complete_graph, graph) =>
-        add_node_group(complete_graph, graph,
-          complete_graph.keys.filter(node => (regex.r findFirstIn node.toString).isDefined).toList))
+      (full_graph, graph) =>
+        add_node_group(full_graph, graph,
+          full_graph.keys.filter(node => (regex.r findFirstIn node.toString).isDefined).toList))
 
   case class Add_Transitive_Closure(parents: Boolean, children: Boolean)
     extends Graph_Mutator(
       "Add transitive closure",
       "Adds all family members of all current nodes.",
-      (complete_graph, graph) => {
+      (full_graph, graph) => {
         val withparents =
-          if (parents) add_node_group(complete_graph, graph, complete_graph.all_preds(graph.keys))
+          if (parents) add_node_group(full_graph, graph, full_graph.all_preds(graph.keys))
           else graph
         if (children)
-          add_node_group(complete_graph, withparents, complete_graph.all_succs(graph.keys))
+          add_node_group(full_graph, withparents, full_graph.all_succs(graph.keys))
         else withparents
       })
 }
@@ -166,13 +166,13 @@
 {
   val name: String
   val description: String
-  def mutate(complete_graph: Graph_Display.Graph, graph: Graph_Display.Graph): Graph_Display.Graph
+  def mutate(full_graph: Graph_Display.Graph, graph: Graph_Display.Graph): Graph_Display.Graph
 
   override def toString: String = name
 }
 
 trait Filter extends Mutator
 {
-  def mutate(complete_graph: Graph_Display.Graph, graph: Graph_Display.Graph) = filter(graph)
+  def mutate(full_graph: Graph_Display.Graph, graph: Graph_Display.Graph) = filter(graph)
   def filter(graph: Graph_Display.Graph): Graph_Display.Graph
 }
--- a/src/Tools/Graphview/popups.scala	Sun Jan 04 13:34:42 2015 +0100
+++ b/src/Tools/Graphview/popups.scala	Sun Jan 04 14:05:24 2015 +0100
@@ -24,7 +24,7 @@
     val visualizer = panel.visualizer
 
     val add_mutator = visualizer.model.Mutators.add _
-    val current_graph = visualizer.model.current_graph
+    val visible_graph = visualizer.model.make_visible_graph()
 
     def filter_context(
         nodes: List[Graph_Display.Node], reverse: Boolean, caption: String, edges: Boolean) =
@@ -57,7 +57,7 @@
           def degree_nodes(succs: Boolean) =
             (for {
               from <- nodes.iterator
-              tos = if (succs) current_graph.imm_succs(from) else current_graph.imm_preds(from)
+              tos = if (succs) visible_graph.imm_succs(from) else visible_graph.imm_preds(from)
               if tos.nonEmpty
             } yield (from, tos)).toList.sortBy(_._1)(Graph_Display.Node.Ordering)
 
--- a/src/Tools/Graphview/visualizer.scala	Sun Jan 04 13:34:42 2015 +0100
+++ b/src/Tools/Graphview/visualizer.scala	Sun Jan 04 14:05:24 2015 +0100
@@ -146,15 +146,15 @@
     def update_layout()
     {
       val m = metrics()
+      val visible_graph = model.make_visible_graph()
 
       val max_width =
-        model.current_graph.keys_iterator.map(
-          node => m.string_bounds(node.toString).getWidth).max
+        visible_graph.keys_iterator.map(node => m.string_bounds(node.toString).getWidth).max
       val box_distance = (max_width + m.pad + m.gap).ceil
       def box_height(n: Int): Double = (m.char_width * 1.5 * (5 max n)).ceil
 
       // FIXME avoid expensive operation on GUI thread
-      layout = Layout.make(model.current_graph, box_distance, box_height _)
+      layout = Layout.make(visible_graph, box_distance, box_height _)
     }
 
     def bounding_box(): Rectangle2D.Double =
@@ -164,7 +164,7 @@
       var y0 = 0.0
       var x1 = 0.0
       var y1 = 0.0
-      for (node <- model.visible_nodes_iterator) {
+      for (node <- model.make_visible_graph().keys_iterator) {
         val shape = Shapes.Node.shape(m, visualizer, node)
         x0 = x0 min shape.getMinX
         y0 = y0 min shape.getMinY
@@ -189,10 +189,11 @@
 
     def paint_all_visible(gfx: Graphics2D, dummies: Boolean)
     {
-      gfx.setFont(font)
+      gfx.setFont(font())
       gfx.setRenderingHints(rendering_hints)
-      model.visible_edges_iterator.foreach(apply(gfx, _, arrow_heads, dummies))
-      model.visible_nodes_iterator.foreach(apply(gfx, _))
+      val visible_graph = model.make_visible_graph()
+      visible_graph.edges_iterator.foreach(apply(gfx, _, arrow_heads, dummies))
+      visible_graph.keys_iterator.foreach(apply(gfx, _))
     }
 
     def shape(m: Visualizer.Metrics, node: Graph_Display.Node): Shape =