| author | wenzelm | 
| Sat, 03 Jan 2015 14:54:33 +0100 | |
| changeset 59243 | 21ef04bd4e17 | 
| parent 59242 | fda4091cc6b0 | 
| child 59245 | be4180f3c236 | 
| permissions | -rw-r--r-- | 
| 59202 | 1 | /* Title: Tools/Graphview/shapes.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 | Drawable shapes. | 
| 
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 java.awt.{BasicStroke, Graphics2D, Shape}
 | 
| 50467 | 12 | import java.awt.geom.{AffineTransform, GeneralPath, Path2D, Rectangle2D, PathIterator}
 | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 13 | |
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 14 | |
| 50467 | 15 | object Shapes | 
| 16 | {
 | |
| 17 | trait Node | |
| 18 |   {
 | |
| 59241 
541b95e94dc7
clarified bounding box, similar to old graph browser;
 wenzelm parents: 
59240diff
changeset | 19 | def shape(m: Visualizer.Metrics, visualizer: Visualizer, peer: Option[String]): Shape | 
| 49742 | 20 | def paint(g: Graphics2D, visualizer: Visualizer, peer: Option[String]): Unit | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 21 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 22 | |
| 50467 | 23 | object Growing_Node extends Node | 
| 24 |   {
 | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 25 | private val stroke = | 
| 59242 | 26 | new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 27 | |
| 59241 
541b95e94dc7
clarified bounding box, similar to old graph browser;
 wenzelm parents: 
59240diff
changeset | 28 | def shape(m: Visualizer.Metrics, visualizer: Visualizer, peer: Option[String]) | 
| 
541b95e94dc7
clarified bounding box, similar to old graph browser;
 wenzelm parents: 
59240diff
changeset | 29 | : Rectangle2D.Double = | 
| 50467 | 30 |     {
 | 
| 49742 | 31 | val (x, y) = visualizer.Coordinates(peer.get) | 
| 59236 | 32 | val bounds = m.string_bounds(visualizer.Caption(peer.get)) | 
| 33 | val w = bounds.getWidth + m.pad | |
| 34 | val h = bounds.getHeight + m.pad | |
| 59242 | 35 | new Rectangle2D.Double((x - (w / 2)).floor, (y - (h / 2)).floor, w.ceil, h.ceil) | 
| 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 | |
| 50467 | 38 | def paint(g: Graphics2D, visualizer: Visualizer, peer: Option[String]) | 
| 39 |     {
 | |
| 59242 | 40 | val m = Visualizer.Metrics(g) | 
| 41 | val s = shape(m, visualizer, peer) | |
| 42 | val c = visualizer.node_color(peer) | |
| 43 | ||
| 49742 | 44 | val caption = visualizer.Caption(peer.get) | 
| 59236 | 45 | val bounds = m.string_bounds(caption) | 
| 46 | ||
| 59220 | 47 | g.setColor(c.background) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 48 | g.fill(s) | 
| 59242 | 49 | |
| 50 | g.setColor(c.border) | |
| 51 | g.setStroke(stroke) | |
| 52 | g.draw(s) | |
| 53 | ||
| 59220 | 54 | g.setColor(c.foreground) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 55 | g.drawString(caption, | 
| 59242 | 56 | (s.getCenterX - bounds.getWidth / 2).round.toInt, | 
| 57 | (s.getCenterY - bounds.getHeight / 2 + m.ascent).round.toInt) | |
| 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 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 60 | |
| 50467 | 61 | object Dummy extends Node | 
| 62 |   {
 | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 63 | private val stroke = | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 64 | new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 65 | private val identity = new AffineTransform() | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 66 | |
| 59242 | 67 | def shape(m: Visualizer.Metrics, visualizer: Visualizer, peer: Option[String]): Shape = | 
| 68 |     {
 | |
| 69 | val w = (m.space_width / 2).ceil | |
| 70 | new Rectangle2D.Double(- w, - w, 2 * w, 2 * w) | |
| 71 | } | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 72 | |
| 50464 | 73 | def paint(g: Graphics2D, visualizer: Visualizer, peer: Option[String]): Unit = | 
| 49742 | 74 | paint_transformed(g, visualizer, peer, identity) | 
| 50467 | 75 | |
| 49742 | 76 | def paint_transformed(g: Graphics2D, visualizer: Visualizer, | 
| 50467 | 77 | peer: Option[String], at: AffineTransform) | 
| 50464 | 78 |     {
 | 
| 59242 | 79 | val m = Visualizer.Metrics(g) | 
| 80 | val s = shape(m, visualizer, peer) | |
| 81 | ||
| 59220 | 82 | val c = visualizer.node_color(peer) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 83 | g.setStroke(stroke) | 
| 59220 | 84 | g.setColor(c.border) | 
| 59242 | 85 | g.draw(at.createTransformedShape(s)) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 86 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 87 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 88 | |
| 50467 | 89 | trait Edge | 
| 90 |   {
 | |
| 91 | def paint(g: Graphics2D, visualizer: Visualizer, | |
| 92 | peer: (String, String), head: Boolean, dummies: Boolean) | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 93 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 94 | |
| 50467 | 95 | object Straight_Edge extends Edge | 
| 96 |   {
 | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 97 | private val stroke = | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 98 | new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 99 | |
| 49742 | 100 | def paint(g: Graphics2D, visualizer: Visualizer, | 
| 50467 | 101 | peer: (String, String), head: Boolean, dummies: Boolean) | 
| 50464 | 102 |     {
 | 
| 50467 | 103 | val ((fx, fy), (tx, ty)) = (visualizer.Coordinates(peer._1), visualizer.Coordinates(peer._2)) | 
| 50468 | 104 | val ds = | 
| 105 |       {
 | |
| 106 | val min = fy min ty | |
| 107 | val max = fy max ty | |
| 50467 | 108 |         visualizer.Coordinates(peer).filter({ case (_, y) => y > min && y < max })
 | 
| 49557 
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 | val path = new GeneralPath(Path2D.WIND_EVEN_ODD, ds.length + 2) | 
| 
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 | path.moveTo(fx, fy) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 113 |       ds.foreach({case (x, y) => path.lineTo(x, y)})
 | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 114 | path.lineTo(tx, ty) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 115 | |
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 116 |       if (dummies) {
 | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 117 |         ds.foreach({
 | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 118 |             case (x, y) => {
 | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 119 | val at = AffineTransform.getTranslateInstance(x, y) | 
| 49742 | 120 | Dummy.paint_transformed(g, visualizer, None, at) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 121 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 122 | }) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 123 | } | 
| 50467 | 124 | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 125 | g.setStroke(stroke) | 
| 59220 | 126 | g.setColor(visualizer.edge_color(peer)) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 127 | g.draw(path) | 
| 50467 | 128 | |
| 59241 
541b95e94dc7
clarified bounding box, similar to old graph browser;
 wenzelm parents: 
59240diff
changeset | 129 | if (head) | 
| 
541b95e94dc7
clarified bounding box, similar to old graph browser;
 wenzelm parents: 
59240diff
changeset | 130 | Arrow_Head.paint(g, path, visualizer.Drawer.shape(Visualizer.Metrics(g), Some(peer._2))) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 131 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 132 | } | 
| 50467 | 133 | |
| 134 | object Cardinal_Spline_Edge extends Edge | |
| 135 |   {
 | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 136 | private val stroke = | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 137 | new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 138 | private val slack = 0.1 | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 139 | |
| 49742 | 140 | def paint(g: Graphics2D, visualizer: Visualizer, | 
| 50467 | 141 | peer: (String, String), head: Boolean, dummies: Boolean) | 
| 50464 | 142 |     {
 | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 143 | val ((fx, fy), (tx, ty)) = | 
| 49742 | 144 | (visualizer.Coordinates(peer._1), visualizer.Coordinates(peer._2)) | 
| 50468 | 145 | val ds = | 
| 146 |       {
 | |
| 147 | val min = fy min ty | |
| 148 | val max = fy max ty | |
| 49742 | 149 |         visualizer.Coordinates(peer).filter({case (_, y) => y > min && y < max})
 | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 150 | } | 
| 50467 | 151 | |
| 49742 | 152 | if (ds.isEmpty) Straight_Edge.paint(g, visualizer, peer, head, dummies) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 153 |       else {
 | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 154 | val path = new GeneralPath(Path2D.WIND_EVEN_ODD, ds.length + 2) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 155 | path.moveTo(fx, fy) | 
| 50467 | 156 | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 157 | val coords = ((fx, fy) :: ds ::: List((tx, ty))) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 158 | val (dx, dy) = (coords(2)._1 - coords(0)._1, coords(2)._2 - coords(0)._2) | 
| 50467 | 159 | |
| 160 | val (dx2, dy2) = | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 161 |           ((dx, dy) /: coords.sliding(3))({
 | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 162 |             case ((dx, dy), List((lx, ly), (mx, my), (rx, ry))) => {
 | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 163 | val (dx2, dy2) = (rx - lx, ry - ly) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 164 | |
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 165 | path.curveTo(lx + slack * dx , ly + slack * dy, | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 166 | mx - slack * dx2, my - slack * dy2, | 
| 50467 | 167 | mx , my) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 168 | (dx2, dy2) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 169 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 170 | }) | 
| 50467 | 171 | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 172 | val (lx, ly) = ds.last | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 173 | path.curveTo(lx + slack * dx2, ly + slack * dy2, | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 174 | tx - slack * dx2, ty - slack * dy2, | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 175 | tx , ty) | 
| 50467 | 176 | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 177 |         if (dummies) {
 | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 178 |           ds.foreach({
 | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 179 |               case (x, y) => {
 | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 180 | val at = AffineTransform.getTranslateInstance(x, y) | 
| 49742 | 181 | Dummy.paint_transformed(g, visualizer, None, at) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 182 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 183 | }) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 184 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 185 | |
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 186 | g.setStroke(stroke) | 
| 59220 | 187 | g.setColor(visualizer.edge_color(peer)) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 188 | g.draw(path) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 189 | |
| 59241 
541b95e94dc7
clarified bounding box, similar to old graph browser;
 wenzelm parents: 
59240diff
changeset | 190 | if (head) | 
| 
541b95e94dc7
clarified bounding box, similar to old graph browser;
 wenzelm parents: 
59240diff
changeset | 191 | Arrow_Head.paint(g, path, visualizer.Drawer.shape(Visualizer.Metrics(g), Some(peer._2))) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 192 | } | 
| 50467 | 193 | } | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 194 | } | 
| 50467 | 195 | |
| 196 | object Arrow_Head | |
| 197 |   {
 | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 198 | type Point = (Double, Double) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 199 | |
| 50467 | 200 | private def position(path: GeneralPath, shape: Shape): Option[AffineTransform] = | 
| 201 |     {
 | |
| 202 | def intersecting_line(path: GeneralPath, shape: Shape): Option[(Point, Point)] = | |
| 203 |       {
 | |
| 49745 | 204 | val i = path.getPathIterator(null, 1.0) | 
| 50472 
bad1a1ca61e1
separate instance of class Parameters for each Main_Panel -- avoid global program state;
 wenzelm parents: 
50468diff
changeset | 205 | val seg = Array[Double](0,0,0,0,0,0) | 
| 49745 | 206 | var p1 = (0.0, 0.0) | 
| 207 | var p2 = (0.0, 0.0) | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 208 |         while (!i.isDone()) {
 | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 209 |           i.currentSegment(seg) match {
 | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 210 | case PathIterator.SEG_MOVETO => p2 = (seg(0), seg(1)) | 
| 50467 | 211 | case PathIterator.SEG_LINETO => | 
| 212 | p1 = p2 | |
| 213 | p2 = (seg(0), seg(1)) | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 214 | |
| 50467 | 215 | if(shape.contains(seg(0), seg(1))) | 
| 216 | return Some((p1, p2)) | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 217 | case _ => | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 218 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 219 | i.next() | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 220 | } | 
| 50467 | 221 | None | 
| 222 | } | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 223 | |
| 50467 | 224 | def binary_search(line: (Point, Point), shape: Shape): Option[AffineTransform] = | 
| 225 |       {
 | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 226 | val ((fx, fy), (tx, ty)) = line | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 227 | if (shape.contains(fx, fy) == shape.contains(tx, ty)) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 228 | None | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 229 |         else {
 | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 230 | val (dx, dy) = (fx - tx, fy - ty) | 
| 49745 | 231 |           if ((dx * dx + dy * dy) < 1.0) {
 | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 232 | val at = AffineTransform.getTranslateInstance(fx, fy) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 233 | at.rotate(- (math.atan2(dx, dy) + math.Pi / 2)) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 234 | Some(at) | 
| 50467 | 235 | } | 
| 236 |           else {
 | |
| 49745 | 237 | val (mx, my) = (fx + (tx - fx) / 2.0, fy + (ty - fy) / 2.0) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 238 | if (shape.contains(fx, fy) == shape.contains(mx, my)) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 239 | binary_search(((mx, my), (tx, ty)), shape) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 240 | else | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 241 | binary_search(((fx, fy), (mx, my)), shape) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 242 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 243 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 244 | } | 
| 50467 | 245 | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 246 |       intersecting_line(path, shape) match {
 | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 247 | case None => None | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 248 | case Some(line) => binary_search(line, shape) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 249 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 250 | } | 
| 50467 | 251 | |
| 50464 | 252 | def paint(g: Graphics2D, path: GeneralPath, shape: Shape) | 
| 253 |     {
 | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 254 |       position(path, shape) match {
 | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 255 | case None => | 
| 50479 | 256 | case Some(at) => | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 257 | val arrow = new GeneralPath(Path2D.WIND_EVEN_ODD, 3) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 258 | arrow.moveTo(0, 0) | 
| 50479 | 259 | arrow.lineTo(-10, 4) | 
| 260 | arrow.lineTo(-6, 0) | |
| 261 | arrow.lineTo(-10, -4) | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 262 | arrow.lineTo(0, 0) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 263 | arrow.transform(at) | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 264 | |
| 50467 | 265 | g.fill(arrow) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 266 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 267 | } | 
| 
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 | } |