src/Tools/Graphview/popups.scala
author wenzelm
Mon, 24 Oct 2016 15:00:13 +0200
changeset 64375 74a2af7c5145
parent 59459 985fc55e9f27
child 75393 87ebf5a50283
permissions -rw-r--r--
remove old target: it is on the classpath and may break scalac;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59202
711c2446dc9d clarified source location;
wenzelm
parents: 55618
diff changeset
     1
/*  Title:      Tools/Graphview/popups.scala
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     2
    Author:     Markus Kaiser, TU Muenchen
59240
e411afcfaa29 tuned headers;
wenzelm
parents: 59228
diff changeset
     3
    Author:     Makarius
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     4
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     5
PopupMenu generation for graph components.
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     6
*/
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     7
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     8
package isabelle.graphview
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     9
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    10
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    11
import isabelle._
55618
995162143ef4 tuned imports;
wenzelm
parents: 50475
diff changeset
    12
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    13
import javax.swing.JPopupMenu
49558
af7b652180d5 minimal component and build setup for graphview;
wenzelm
parents: 49557
diff changeset
    14
import scala.swing.{Action, Menu, MenuItem, Separator}
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    15
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    16
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50463
diff changeset
    17
object Popups
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50463
diff changeset
    18
{
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
    19
  def apply(
59408
63cb603b5114 more symmetric layout of main panel;
wenzelm
parents: 59319
diff changeset
    20
    graph_panel: Graph_Panel,
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
    21
    mouse_node: Option[Graph_Display.Node],
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
    22
    selected_nodes: List[Graph_Display.Node]): JPopupMenu =
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    23
  {
59459
985fc55e9f27 clarified module name;
wenzelm
parents: 59408
diff changeset
    24
    val graphview = graph_panel.graphview
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50463
diff changeset
    25
59459
985fc55e9f27 clarified module name;
wenzelm
parents: 59408
diff changeset
    26
    val add_mutator = graphview.model.Mutators.add _
985fc55e9f27 clarified module name;
wenzelm
parents: 59408
diff changeset
    27
    val visible_graph = graphview.visible_graph
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50463
diff changeset
    28
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
    29
    def filter_context(
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
    30
        nodes: List[Graph_Display.Node], reverse: Boolean, caption: String, edges: Boolean) =
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    31
      new Menu(caption) {
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    32
        contents +=
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    33
          new MenuItem(new Action("This") {
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    34
            def apply =
59459
985fc55e9f27 clarified module name;
wenzelm
parents: 59408
diff changeset
    35
              add_mutator(Mutator.make(graphview, Mutator.Node_List(nodes, reverse, false, false)))
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    36
          })
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    37
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    38
        contents +=
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    39
          new MenuItem(new Action("Family") {
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    40
            def apply =
59459
985fc55e9f27 clarified module name;
wenzelm
parents: 59408
diff changeset
    41
              add_mutator(Mutator.make(graphview, Mutator.Node_List(nodes, reverse, true, true)))
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    42
          })
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    43
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    44
        contents +=
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    45
          new MenuItem(new Action("Parents") {
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    46
            def apply =
59459
985fc55e9f27 clarified module name;
wenzelm
parents: 59408
diff changeset
    47
              add_mutator(Mutator.make(graphview, Mutator.Node_List(nodes, reverse, false, true)))
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    48
          })
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    49
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    50
        contents +=
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    51
          new MenuItem(new Action("Children") {
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    52
            def apply =
59459
985fc55e9f27 clarified module name;
wenzelm
parents: 59408
diff changeset
    53
              add_mutator(Mutator.make(graphview, Mutator.Node_List(nodes, reverse, true, false)))
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    54
          })
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    55
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    56
        if (edges) {
59256
wenzelm
parents: 59255
diff changeset
    57
          def degree_nodes(succs: Boolean) =
wenzelm
parents: 59255
diff changeset
    58
            (for {
wenzelm
parents: 59255
diff changeset
    59
              from <- nodes.iterator
59259
399506ee38a5 clarified static full_graph vs. dynamic visible_graph;
wenzelm
parents: 59256
diff changeset
    60
              tos = if (succs) visible_graph.imm_succs(from) else visible_graph.imm_preds(from)
59256
wenzelm
parents: 59255
diff changeset
    61
              if tos.nonEmpty
wenzelm
parents: 59255
diff changeset
    62
            } yield (from, tos)).toList.sortBy(_._1)(Graph_Display.Node.Ordering)
wenzelm
parents: 59255
diff changeset
    63
wenzelm
parents: 59255
diff changeset
    64
          val outs = degree_nodes(true)
wenzelm
parents: 59255
diff changeset
    65
          val ins = degree_nodes(false)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    66
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    67
          if (outs.nonEmpty || ins.nonEmpty) {
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    68
            contents += new Separator()
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    69
            contents +=
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    70
              new Menu("Edge") {
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    71
                if (outs.nonEmpty) {
59247
67bb4b3e1504 tuned menu items;
wenzelm
parents: 59246
diff changeset
    72
                  contents += new MenuItem("From ...") { enabled = false }
59256
wenzelm
parents: 59255
diff changeset
    73
                  for ((from, tos) <- outs) {
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    74
                    contents +=
59247
67bb4b3e1504 tuned menu items;
wenzelm
parents: 59246
diff changeset
    75
                      new Menu(quote(from.toString)) {
67bb4b3e1504 tuned menu items;
wenzelm
parents: 59246
diff changeset
    76
                        contents += new MenuItem("To ...") { enabled = false }
59256
wenzelm
parents: 59255
diff changeset
    77
                        for (to <- tos) {
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    78
                          contents +=
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    79
                            new MenuItem(
59247
67bb4b3e1504 tuned menu items;
wenzelm
parents: 59246
diff changeset
    80
                              new Action(quote(to.toString)) {
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    81
                                def apply =
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    82
                                  add_mutator(
59459
985fc55e9f27 clarified module name;
wenzelm
parents: 59408
diff changeset
    83
                                    Mutator.make(graphview, Mutator.Edge_Endpoints((from, to))))
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    84
                              })
59256
wenzelm
parents: 59255
diff changeset
    85
                        }
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    86
                      }
59256
wenzelm
parents: 59255
diff changeset
    87
                  }
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    88
                }
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    89
                if (outs.nonEmpty && ins.nonEmpty) { contents += new Separator() }
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    90
                if (ins.nonEmpty) {
59247
67bb4b3e1504 tuned menu items;
wenzelm
parents: 59246
diff changeset
    91
                  contents += new MenuItem("To ...") { enabled = false }
59256
wenzelm
parents: 59255
diff changeset
    92
                  for ((to, froms) <- ins) {
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    93
                    contents +=
59247
67bb4b3e1504 tuned menu items;
wenzelm
parents: 59246
diff changeset
    94
                      new Menu(quote(to.toString)) {
67bb4b3e1504 tuned menu items;
wenzelm
parents: 59246
diff changeset
    95
                        contents += new MenuItem("From ...") { enabled = false }
59256
wenzelm
parents: 59255
diff changeset
    96
                        for (from <- froms) {
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    97
                          contents +=
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    98
                            new MenuItem(
59247
67bb4b3e1504 tuned menu items;
wenzelm
parents: 59246
diff changeset
    99
                              new Action(quote(from.toString)) {
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   100
                                def apply =
59221
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
   101
                                  add_mutator(
59459
985fc55e9f27 clarified module name;
wenzelm
parents: 59408
diff changeset
   102
                                    Mutator.make(graphview, Mutator.Edge_Endpoints((from, to))))
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   103
                              })
59256
wenzelm
parents: 59255
diff changeset
   104
                        }
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   105
                      }
59256
wenzelm
parents: 59255
diff changeset
   106
                  }
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   107
                }
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   108
              }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   109
          }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   110
        }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   111
    }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   112
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   113
    val popup = new JPopupMenu()
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   114
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   115
    popup.add(
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   116
      new MenuItem(
59459
985fc55e9f27 clarified module name;
wenzelm
parents: 59408
diff changeset
   117
        new Action("Remove all filters") { def apply = graphview.model.Mutators(Nil) }).peer)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   118
    popup.add(new JPopupMenu.Separator)
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   119
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
   120
    if (mouse_node.isDefined) {
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
   121
      val node = mouse_node.get
59247
67bb4b3e1504 tuned menu items;
wenzelm
parents: 59246
diff changeset
   122
      popup.add(new MenuItem("Mouse over: " + quote(node.toString)) { enabled = false }.peer)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   123
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
   124
      popup.add(filter_context(List(node), true, "Hide", true).peer)
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
   125
      popup.add(filter_context(List(node), false, "Show only", false).peer)
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50463
diff changeset
   126
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50463
diff changeset
   127
      popup.add(new JPopupMenu.Separator)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   128
    }
59319
wenzelm
parents: 59290
diff changeset
   129
    if (selected_nodes.nonEmpty) {
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   130
      val text =
59247
67bb4b3e1504 tuned menu items;
wenzelm
parents: 59246
diff changeset
   131
        if (selected_nodes.length > 1) "multiple"
67bb4b3e1504 tuned menu items;
wenzelm
parents: 59246
diff changeset
   132
        else quote(selected_nodes.head.toString)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   133
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
   134
      popup.add(new MenuItem("Selected: " + text) { enabled = false }.peer)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   135
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
   136
      popup.add(filter_context(selected_nodes, true, "Hide", true).peer)
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
   137
      popup.add(filter_context(selected_nodes, false, "Show only", false).peer)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   138
      popup.add(new JPopupMenu.Separator)
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   139
    }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   140
59408
63cb603b5114 more symmetric layout of main panel;
wenzelm
parents: 59319
diff changeset
   141
    popup.add(new MenuItem(new Action("Fit to window") {
63cb603b5114 more symmetric layout of main panel;
wenzelm
parents: 59319
diff changeset
   142
      def apply = graph_panel.fit_to_window() }).peer
63cb603b5114 more symmetric layout of main panel;
wenzelm
parents: 59319
diff changeset
   143
    )
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50463
diff changeset
   144
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   145
    popup
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   146
  }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   147
}