author | wenzelm |
Sun, 04 Jan 2015 21:01:27 +0100 | |
changeset 59262 | 5cd92c743958 |
parent 59259 | 399506ee38a5 |
child 59286 | ac74eedb910a |
permissions | -rw-r--r-- |
59202 | 1 |
/* Title: Tools/Graphview/graph_panel.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 | 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 |
Graphview Java2D drawing panel. |
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 |
|
55618 | 10 |
|
49558 | 11 |
import isabelle._ |
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
12 |
|
59241
541b95e94dc7
clarified bounding box, similar to old graph browser;
wenzelm
parents:
59240
diff
changeset
|
13 |
import java.awt.{Dimension, Graphics2D, Point} |
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
14 |
import java.awt.geom.{AffineTransform, Point2D} |
49732 | 15 |
import java.awt.image.BufferedImage |
59225 | 16 |
import javax.swing.{JScrollPane, JComponent, SwingUtilities} |
49729 | 17 |
|
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
18 |
import scala.swing.{Panel, ScrollPane} |
59253 | 19 |
import scala.swing.event.{Event, Key, MousePressed, MouseDragged, MouseClicked, MouseEvent} |
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
20 |
|
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
21 |
|
59233 | 22 |
class Graph_Panel(val visualizer: Visualizer) extends ScrollPane |
49729 | 23 |
{ |
49731 | 24 |
panel => |
49729 | 25 |
|
59243
21ef04bd4e17
recovered tooltip from 6e77ddb1e3fb: non-null default is required as prerequisite;
wenzelm
parents:
59241
diff
changeset
|
26 |
tooltip = "" |
21ef04bd4e17
recovered tooltip from 6e77ddb1e3fb: non-null default is required as prerequisite;
wenzelm
parents:
59241
diff
changeset
|
27 |
|
49729 | 28 |
override lazy val peer: JScrollPane = new JScrollPane with SuperMixin { |
49730 | 29 |
override def getToolTipText(event: java.awt.event.MouseEvent): String = |
59259
399506ee38a5
clarified static full_graph vs. dynamic visible_graph;
wenzelm
parents:
59255
diff
changeset
|
30 |
find_visible_node(Transform.pane_to_graph_coordinates(event.getPoint)) match { |
59245
be4180f3c236
more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents:
59243
diff
changeset
|
31 |
case Some(node) => |
59259
399506ee38a5
clarified static full_graph vs. dynamic visible_graph;
wenzelm
parents:
59255
diff
changeset
|
32 |
visualizer.model.full_graph.get_node(node) match { |
49732 | 33 |
case Nil => null |
59233 | 34 |
case content => visualizer.make_tooltip(panel.peer, event.getX, event.getY, content) |
49732 | 35 |
} |
36 |
case None => null |
|
37 |
} |
|
49729 | 38 |
} |
39 |
||
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
40 |
focusable = true |
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
41 |
requestFocus() |
50470 | 42 |
|
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
43 |
horizontalScrollBarPolicy = ScrollPane.BarPolicy.Always |
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
44 |
verticalScrollBarPolicy = ScrollPane.BarPolicy.Always |
49729 | 45 |
|
59237
ac135eff1ffb
clarified mouse wheel: conventional scrolling, not scaling;
wenzelm
parents:
59234
diff
changeset
|
46 |
peer.getVerticalScrollBar.setUnitIncrement(10) |
ac135eff1ffb
clarified mouse wheel: conventional scrolling, not scaling;
wenzelm
parents:
59234
diff
changeset
|
47 |
|
59259
399506ee38a5
clarified static full_graph vs. dynamic visible_graph;
wenzelm
parents:
59255
diff
changeset
|
48 |
def find_visible_node(at: Point2D): Option[Graph_Display.Node] = |
59231
6dea47cf6c6b
more dynamic visualizer -- re-use jEdit font info;
wenzelm
parents:
59228
diff
changeset
|
49 |
{ |
59241
541b95e94dc7
clarified bounding box, similar to old graph browser;
wenzelm
parents:
59240
diff
changeset
|
50 |
val m = visualizer.metrics() |
59259
399506ee38a5
clarified static full_graph vs. dynamic visible_graph;
wenzelm
parents:
59255
diff
changeset
|
51 |
visualizer.model.make_visible_graph().keys_iterator |
59245
be4180f3c236
more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents:
59243
diff
changeset
|
52 |
.find(node => visualizer.Drawer.shape(m, node).contains(at)) |
59231
6dea47cf6c6b
more dynamic visualizer -- re-use jEdit font info;
wenzelm
parents:
59228
diff
changeset
|
53 |
} |
49732 | 54 |
|
49735
30e2f3f1c623
more precise repaint and revalidate -- the latter is important to keep in sync with content update;
wenzelm
parents:
49733
diff
changeset
|
55 |
def refresh() |
30e2f3f1c623
more precise repaint and revalidate -- the latter is important to keep in sync with content update;
wenzelm
parents:
49733
diff
changeset
|
56 |
{ |
50491 | 57 |
if (paint_panel != null) { |
58 |
paint_panel.set_preferred_size() |
|
59 |
paint_panel.repaint() |
|
60 |
} |
|
49735
30e2f3f1c623
more precise repaint and revalidate -- the latter is important to keep in sync with content update;
wenzelm
parents:
49733
diff
changeset
|
61 |
} |
30e2f3f1c623
more precise repaint and revalidate -- the latter is important to keep in sync with content update;
wenzelm
parents:
49733
diff
changeset
|
62 |
|
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
63 |
def fit_to_window() = { |
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
64 |
Transform.fit_to_window() |
49735
30e2f3f1c623
more precise repaint and revalidate -- the latter is important to keep in sync with content update;
wenzelm
parents:
49733
diff
changeset
|
65 |
refresh() |
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
66 |
} |
50470 | 67 |
|
57044 | 68 |
val zoom = new GUI.Zoom_Box { def changed = rescale(0.01 * factor) } |
50491 | 69 |
|
50478 | 70 |
def rescale(s: Double) |
71 |
{ |
|
72 |
Transform.scale = s |
|
59255
db265648139c
clarified fit_to_window: floor scale within window bounds;
wenzelm
parents:
59253
diff
changeset
|
73 |
if (zoom != null) zoom.set_item((Transform.scale_discrete * 100).floor.toInt) |
50478 | 74 |
refresh() |
75 |
} |
|
76 |
||
59253 | 77 |
def apply_layout() |
78 |
{ |
|
79 |
visualizer.Coordinates.update_layout() |
|
80 |
repaint() |
|
81 |
} |
|
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
82 |
|
59218 | 83 |
private class Paint_Panel extends Panel |
84 |
{ |
|
85 |
def set_preferred_size() |
|
86 |
{ |
|
59241
541b95e94dc7
clarified bounding box, similar to old graph browser;
wenzelm
parents:
59240
diff
changeset
|
87 |
val box = visualizer.Coordinates.bounding_box() |
59218 | 88 |
val s = Transform.scale_discrete |
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
89 |
|
59218 | 90 |
preferredSize = |
59241
541b95e94dc7
clarified bounding box, similar to old graph browser;
wenzelm
parents:
59240
diff
changeset
|
91 |
new Dimension((box.width * s).ceil.toInt, (box.height * s).ceil.toInt) |
50470 | 92 |
|
59218 | 93 |
revalidate() |
94 |
} |
|
50470 | 95 |
|
59250 | 96 |
override def paint(gfx: Graphics2D) |
59218 | 97 |
{ |
59250 | 98 |
super.paintComponent(gfx) |
99 |
gfx.setColor(visualizer.background_color) |
|
100 |
gfx.fillRect(0, 0, peer.getWidth, peer.getHeight) |
|
101 |
gfx.transform(Transform()) |
|
50470 | 102 |
|
59250 | 103 |
visualizer.Drawer.paint_all_visible(gfx, true) |
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
104 |
} |
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
105 |
} |
49954
44658062d822
more explicit auxiliary classes to avoid warning "reflective access of structural type member method" of scala-2.10.0-RC1;
wenzelm
parents:
49745
diff
changeset
|
106 |
private val paint_panel = new Paint_Panel |
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
107 |
contents = paint_panel |
50470 | 108 |
|
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
109 |
listenTo(mouse.moves) |
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
110 |
listenTo(mouse.clicks) |
59253 | 111 |
reactions += Mouse_Interaction.react |
59218 | 112 |
reactions += |
113 |
{ |
|
59253 | 114 |
case MousePressed(_, _, _, _, _) => repaint() |
115 |
case MouseDragged(_, _, _) => repaint() |
|
116 |
case MouseClicked(_, _, _, _, _) => repaint() |
|
59218 | 117 |
} |
49733
38a68e6593be
prefer synchronous Mutator_Event.Bus on Swing_Thread;
wenzelm
parents:
49732
diff
changeset
|
118 |
|
38a68e6593be
prefer synchronous Mutator_Event.Bus on Swing_Thread;
wenzelm
parents:
49732
diff
changeset
|
119 |
visualizer.model.Colors.events += { case _ => repaint() } |
38a68e6593be
prefer synchronous Mutator_Event.Bus on Swing_Thread;
wenzelm
parents:
49732
diff
changeset
|
120 |
visualizer.model.Mutators.events += { case _ => repaint() } |
50470 | 121 |
|
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
122 |
apply_layout() |
50491 | 123 |
rescale(1.0) |
50470 | 124 |
|
50469 | 125 |
private object Transform |
126 |
{ |
|
50474
6ee044e2d1a7
initial layout coordinates more like old browser;
wenzelm
parents:
50470
diff
changeset
|
127 |
private var _scale: Double = 1.0 |
50477 | 128 |
def scale: Double = _scale |
129 |
def scale_=(s: Double) |
|
50468 | 130 |
{ |
59241
541b95e94dc7
clarified bounding box, similar to old graph browser;
wenzelm
parents:
59240
diff
changeset
|
131 |
_scale = (s min 10.0) max 0.1 |
50468 | 132 |
} |
59255
db265648139c
clarified fit_to_window: floor scale within window bounds;
wenzelm
parents:
59253
diff
changeset
|
133 |
|
50477 | 134 |
def scale_discrete: Double = |
59255
db265648139c
clarified fit_to_window: floor scale within window bounds;
wenzelm
parents:
59253
diff
changeset
|
135 |
(scale * visualizer.font_size).floor / visualizer.font_size |
50470 | 136 |
|
59218 | 137 |
def apply() = |
138 |
{ |
|
59241
541b95e94dc7
clarified bounding box, similar to old graph browser;
wenzelm
parents:
59240
diff
changeset
|
139 |
val box = visualizer.Coordinates.bounding_box() |
50477 | 140 |
val at = AffineTransform.getScaleInstance(scale_discrete, scale_discrete) |
59241
541b95e94dc7
clarified bounding box, similar to old graph browser;
wenzelm
parents:
59240
diff
changeset
|
141 |
at.translate(- box.x, - box.y) |
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
142 |
at |
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
143 |
} |
50470 | 144 |
|
59218 | 145 |
def fit_to_window() |
146 |
{ |
|
59259
399506ee38a5
clarified static full_graph vs. dynamic visible_graph;
wenzelm
parents:
59255
diff
changeset
|
147 |
if (visualizer.model.make_visible_graph().is_empty) |
50491 | 148 |
rescale(1.0) |
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
149 |
else { |
59241
541b95e94dc7
clarified bounding box, similar to old graph browser;
wenzelm
parents:
59240
diff
changeset
|
150 |
val box = visualizer.Coordinates.bounding_box() |
541b95e94dc7
clarified bounding box, similar to old graph browser;
wenzelm
parents:
59240
diff
changeset
|
151 |
rescale((size.width / box.width) min (size.height / box.height)) |
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
152 |
} |
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
153 |
} |
50470 | 154 |
|
59218 | 155 |
def pane_to_graph_coordinates(at: Point2D): Point2D = |
156 |
{ |
|
50477 | 157 |
val s = Transform.scale_discrete |
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
158 |
val p = Transform().inverseTransform(peer.getViewport.getViewPosition, null) |
50470 | 159 |
|
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
160 |
p.setLocation(p.getX + at.getX / s, p.getY + at.getY / s) |
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
161 |
p |
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
162 |
} |
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
163 |
} |
50470 | 164 |
|
59253 | 165 |
object Mouse_Interaction |
59218 | 166 |
{ |
59262 | 167 |
private var draginfo: (Point, List[Graph_Display.Node], List[(Graph_Display.Edge, Int)]) = null |
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
168 |
|
59253 | 169 |
val react: PartialFunction[Event, Unit] = |
170 |
{ |
|
171 |
case MousePressed(_, p, _, _, _) => pressed(p) |
|
172 |
case MouseDragged(_, to, _) => |
|
173 |
drag(draginfo, to) |
|
174 |
val (_, p, d) = draginfo |
|
175 |
draginfo = (to, p, d) |
|
176 |
case e @ MouseClicked(_, p, m, n, _) => click(p, m, n, e) |
|
177 |
} |
|
178 |
||
59262 | 179 |
def dummy(at: Point2D): Option[(Graph_Display.Edge, Int)] = |
59253 | 180 |
{ |
181 |
val m = visualizer.metrics() |
|
59259
399506ee38a5
clarified static full_graph vs. dynamic visible_graph;
wenzelm
parents:
59255
diff
changeset
|
182 |
visualizer.model.make_visible_graph().edges_iterator.map( |
59262 | 183 |
edge => |
184 |
visualizer.Coordinates.get_dummies(edge).zipWithIndex.map((edge, _))).flatten.find( |
|
185 |
{ |
|
186 |
case (_, (p, _)) => |
|
187 |
visualizer.Drawer.shape(m, Graph_Display.Node.dummy). |
|
188 |
contains(at.getX() - p.x, at.getY() - p.y) |
|
189 |
}) match { |
|
190 |
case None => None |
|
191 |
case Some((edge, (_, index))) => Some((edge, index)) |
|
192 |
} |
|
50470 | 193 |
} |
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
194 |
|
59253 | 195 |
def pressed(at: Point) |
59218 | 196 |
{ |
59253 | 197 |
val c = Transform.pane_to_graph_coordinates(at) |
198 |
val l = |
|
59259
399506ee38a5
clarified static full_graph vs. dynamic visible_graph;
wenzelm
parents:
59255
diff
changeset
|
199 |
find_visible_node(c) match { |
59253 | 200 |
case Some(node) => |
201 |
if (visualizer.Selection.contains(node)) visualizer.Selection.get() |
|
202 |
else List(node) |
|
203 |
case None => Nil |
|
204 |
} |
|
205 |
val d = |
|
206 |
l match { |
|
207 |
case Nil => |
|
208 |
dummy(c) match { |
|
209 |
case Some(d) => List(d) |
|
210 |
case None => Nil |
|
211 |
} |
|
212 |
case _ => Nil |
|
213 |
} |
|
214 |
draginfo = (at, l, d) |
|
215 |
} |
|
50470 | 216 |
|
59253 | 217 |
def click(at: Point, m: Key.Modifiers, clicks: Int, e: MouseEvent) |
218 |
{ |
|
219 |
val c = Transform.pane_to_graph_coordinates(at) |
|
50470 | 220 |
|
59253 | 221 |
def left_click() |
59218 | 222 |
{ |
59259
399506ee38a5
clarified static full_graph vs. dynamic visible_graph;
wenzelm
parents:
59255
diff
changeset
|
223 |
(find_visible_node(c), m) match { |
59253 | 224 |
case (Some(node), Key.Modifier.Control) => visualizer.Selection.add(node) |
225 |
case (None, Key.Modifier.Control) => |
|
50470 | 226 |
|
59253 | 227 |
case (Some(node), Key.Modifier.Shift) => visualizer.Selection.add(node) |
228 |
case (None, Key.Modifier.Shift) => |
|
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
229 |
|
59253 | 230 |
case (Some(node), _) => |
231 |
visualizer.Selection.clear() |
|
232 |
visualizer.Selection.add(node) |
|
233 |
case (None, _) => |
|
234 |
visualizer.Selection.clear() |
|
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
235 |
} |
50470 | 236 |
} |
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
237 |
|
59253 | 238 |
def right_click() |
59218 | 239 |
{ |
59259
399506ee38a5
clarified static full_graph vs. dynamic visible_graph;
wenzelm
parents:
59255
diff
changeset
|
240 |
val menu = Popups(panel, find_visible_node(c), visualizer.Selection.get()) |
59253 | 241 |
menu.show(panel.peer, at.x, at.y) |
242 |
} |
|
243 |
||
244 |
if (clicks < 2) { |
|
245 |
if (SwingUtilities.isRightMouseButton(e.peer)) right_click() |
|
246 |
else left_click() |
|
247 |
} |
|
248 |
} |
|
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
249 |
|
59262 | 250 |
def drag(info: (Point, List[Graph_Display.Node], List[(Graph_Display.Edge, Int)]), to: Point) |
59253 | 251 |
{ |
59262 | 252 |
val (from, p, d) = info |
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
253 |
|
59253 | 254 |
val s = Transform.scale_discrete |
255 |
val (dx, dy) = (to.x - from.x, to.y - from.y) |
|
256 |
(p, d) match { |
|
257 |
case (Nil, Nil) => |
|
258 |
val r = panel.peer.getViewport.getViewRect |
|
259 |
r.translate(-dx, -dy) |
|
50470 | 260 |
|
59253 | 261 |
paint_panel.peer.scrollRectToVisible(r) |
50470 | 262 |
|
59253 | 263 |
case (Nil, ds) => |
59262 | 264 |
ds.foreach(d => visualizer.Coordinates.translate_dummy(d, dx / s, dy / s)) |
59253 | 265 |
|
266 |
case (ls, _) => |
|
59262 | 267 |
ls.foreach(l => visualizer.Coordinates.translate_node(l, dx / s, dy / s)) |
49557
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
268 |
} |
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
269 |
} |
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
270 |
} |
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff
changeset
|
271 |
} |