| author | wenzelm |
| Thu, 01 Jan 2015 14:37:25 +0100 | |
| changeset 59225 | d0edf67253d3 |
| parent 59221 | f779f83ef4ec |
| child 59228 | 56b34fc7a015 |
| permissions | -rw-r--r-- |
| 59202 | 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 |
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
3 |
|
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
4 |
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
|
5 |
*/ |
|
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 |
package isabelle.graphview |
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
8 |
|
|
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 |
import isabelle._ |
| 55618 | 11 |
|
|
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
12 |
import javax.swing.JPopupMenu |
| 49558 | 13 |
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
|
14 |
|
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
15 |
|
|
50472
bad1a1ca61e1
separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents:
50463
diff
changeset
|
16 |
object Popups |
|
bad1a1ca61e1
separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents:
50463
diff
changeset
|
17 |
{
|
| 59218 | 18 |
def apply(panel: Graph_Panel, under_mouse: Option[String], selected: List[String]): JPopupMenu = |
|
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
19 |
{
|
| 50475 | 20 |
val visualizer = panel.visualizer |
|
50472
bad1a1ca61e1
separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents:
50463
diff
changeset
|
21 |
|
| 50475 | 22 |
val add_mutator = visualizer.model.Mutators.add _ |
23 |
val curr = visualizer.model.current |
|
|
50472
bad1a1ca61e1
separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents:
50463
diff
changeset
|
24 |
|
| 59218 | 25 |
def filter_context(ls: List[String], 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
|
26 |
new Menu(caption) {
|
| 59218 | 27 |
contents += |
28 |
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
|
29 |
def apply = |
| 59221 | 30 |
add_mutator(Mutator.make(visualizer, Mutator.Node_List(ls, 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
|
31 |
}) |
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
32 |
|
| 59218 | 33 |
contents += |
34 |
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
|
35 |
def apply = |
| 59221 | 36 |
add_mutator(Mutator.make(visualizer, Mutator.Node_List(ls, 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
|
37 |
}) |
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
38 |
|
| 59218 | 39 |
contents += |
40 |
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
|
41 |
def apply = |
| 59221 | 42 |
add_mutator(Mutator.make(visualizer, Mutator.Node_List(ls, 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
|
43 |
}) |
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
44 |
|
| 59218 | 45 |
contents += |
46 |
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
|
47 |
def apply = |
| 59221 | 48 |
add_mutator(Mutator.make(visualizer, Mutator.Node_List(ls, 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
|
49 |
}) |
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
50 |
|
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
51 |
if (edges) {
|
| 59218 | 52 |
val outs = |
53 |
ls.map(l => (l, curr.imm_succs(l))) // FIXME iterator |
|
54 |
.filter(_._2.size > 0).sortBy(_._1) |
|
55 |
val ins = |
|
56 |
ls.map(l => (l, curr.imm_preds(l))) // FIXME iterator |
|
57 |
.filter(_._2.size > 0).sortBy(_._1) |
|
|
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
58 |
|
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
59 |
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
|
60 |
contents += new Separator() |
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
61 |
|
| 59218 | 62 |
contents += |
63 |
new Menu("Edge") {
|
|
64 |
if (outs.nonEmpty) {
|
|
65 |
contents += new MenuItem("From...") { enabled = false }
|
|
|
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
66 |
|
| 59218 | 67 |
outs.map(e => {
|
68 |
val (from, tos) = e |
|
69 |
contents += |
|
70 |
new Menu(from) {
|
|
71 |
contents += new MenuItem("To...") { enabled = false }
|
|
| 59221 | 72 |
|
| 59218 | 73 |
tos.toList.sorted.distinct.map(to => {
|
74 |
contents += |
|
75 |
new MenuItem( |
|
76 |
new Action(to) {
|
|
77 |
def apply = |
|
78 |
add_mutator( |
|
| 59221 | 79 |
Mutator.make(visualizer, Mutator.Edge_Endpoints(from, to))) |
| 59218 | 80 |
}) |
81 |
}) |
|
82 |
} |
|
83 |
}) |
|
84 |
} |
|
85 |
if (outs.nonEmpty && ins.nonEmpty) { contents += new Separator() }
|
|
86 |
if (ins.nonEmpty) {
|
|
87 |
contents += new MenuItem("To...") { enabled = false }
|
|
|
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
88 |
|
| 59218 | 89 |
ins.map(e => {
|
90 |
val (to, froms) = e |
|
91 |
contents += |
|
92 |
new Menu(to) {
|
|
93 |
contents += new MenuItem("From...") { enabled = false }
|
|
| 59221 | 94 |
|
| 59218 | 95 |
froms.toList.sorted.distinct.map(from => {
|
96 |
contents += |
|
97 |
new MenuItem( |
|
98 |
new Action(from) {
|
|
99 |
def apply = |
|
| 59221 | 100 |
add_mutator( |
101 |
Mutator.make(visualizer, Mutator.Edge_Endpoints(from, to))) |
|
| 59218 | 102 |
}) |
103 |
}) |
|
104 |
} |
|
105 |
}) |
|
106 |
} |
|
|
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
107 |
} |
|
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 |
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
|
113 |
|
| 59218 | 114 |
popup.add( |
115 |
new MenuItem( |
|
116 |
new Action("Remove all filters") {
|
|
| 50475 | 117 |
def apply = visualizer.model.Mutators(Nil) |
| 59218 | 118 |
}).peer) |
|
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
119 |
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
|
120 |
|
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
121 |
if (under_mouse.isDefined) {
|
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
122 |
val v = under_mouse.get |
| 59218 | 123 |
popup.add( |
124 |
new MenuItem("Mouseover: %s".format(visualizer.Caption(v))) { 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
|
125 |
|
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
126 |
popup.add(filter_context(List(v), true, "Hide", true).peer) |
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
127 |
popup.add(filter_context(List(v), 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
|
128 |
|
|
bad1a1ca61e1
separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents:
50463
diff
changeset
|
129 |
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
|
130 |
} |
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
131 |
if (!selected.isEmpty) {
|
| 59218 | 132 |
val text = |
133 |
if (selected.length > 1) "Multiple" |
|
134 |
else visualizer.Caption(selected.head) |
|
|
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
135 |
|
| 59218 | 136 |
popup.add(new MenuItem("Selected: %s".format(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
|
137 |
|
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
138 |
popup.add(filter_context(selected, true, "Hide", true).peer) |
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
139 |
popup.add(filter_context(selected, false, "Show only", false).peer) |
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
140 |
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
|
141 |
} |
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
142 |
|
| 59218 | 143 |
popup.add( |
144 |
new MenuItem(new Action("Fit to Window") { def apply = panel.fit_to_window() }).peer)
|
|
|
50472
bad1a1ca61e1
separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents:
50463
diff
changeset
|
145 |
|
|
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
146 |
popup |
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
147 |
} |
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
148 |
} |