| author | wenzelm | 
| Fri, 09 Sep 2022 16:44:43 +0200 | |
| changeset 76098 | bcca0fbb8a34 | 
| parent 75439 | e1c9e4d59921 | 
| child 81340 | 30f7eb65d679 | 
| 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 | |
| 59245 
be4180f3c236
more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
 wenzelm parents: 
59242diff
changeset | 11 | import isabelle._ | 
| 
be4180f3c236
more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
 wenzelm parents: 
59242diff
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 java.awt.{BasicStroke, Graphics2D, Shape}
 | 
| 59410 | 14 | import java.awt.geom.{AffineTransform, GeneralPath, Path2D, Rectangle2D,
 | 
| 15 | RoundRectangle2D, PathIterator} | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 16 | |
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 17 | |
| 75393 | 18 | object Shapes {
 | 
| 59249 | 19 | private val default_stroke = | 
| 20 | new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND) | |
| 21 | ||
| 59384 | 22 | def shape(info: Layout.Info): Rectangle2D.Double = | 
| 23 | new Rectangle2D.Double(info.x - info.width2, info.y - info.height2, info.width, info.height) | |
| 24 | ||
| 75393 | 25 |   def highlight_node(gfx: Graphics2D, graphview: Graphview, node: Graph_Display.Node): Unit = {
 | 
| 59459 | 26 | val metrics = graphview.metrics | 
| 59410 | 27 | val extra = metrics.char_width | 
| 59459 | 28 | val info = graphview.layout.get_node(node) | 
| 59410 | 29 | |
| 59459 | 30 | gfx.setColor(graphview.highlight_color) | 
| 59410 | 31 | gfx.fill(new Rectangle2D.Double( | 
| 32 | info.x - info.width2 - extra, | |
| 33 | info.y - info.height2 - extra, | |
| 34 | info.width + 2 * extra, | |
| 35 | info.height + 2 * extra)) | |
| 36 | } | |
| 37 | ||
| 75393 | 38 |   def paint_node(gfx: Graphics2D, graphview: Graphview, node: Graph_Display.Node): Unit = {
 | 
| 59459 | 39 | val metrics = graphview.metrics | 
| 40 | val info = graphview.layout.get_node(node) | |
| 41 | val c = graphview.node_color(node) | |
| 59384 | 42 | val s = shape(info) | 
| 43 | ||
| 44 | gfx.setColor(c.background) | |
| 45 | gfx.fill(s) | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 46 | |
| 59384 | 47 | gfx.setColor(c.border) | 
| 48 | gfx.setStroke(default_stroke) | |
| 49 | gfx.draw(s) | |
| 59236 | 50 | |
| 59384 | 51 | gfx.setColor(c.foreground) | 
| 52 | gfx.setFont(metrics.font) | |
| 59242 | 53 | |
| 59384 | 54 | val text_width = | 
| 73359 | 55 |       info.lines.foldLeft(0.0) { case (w, line) => w max metrics.string_bounds(line).getWidth }
 | 
| 59384 | 56 | val text_height = | 
| 57 | (info.lines.length max 1) * metrics.height.ceil | |
| 58 | val x = (s.getCenterX - text_width / 2).round.toInt | |
| 59 | var y = (s.getCenterY - text_height / 2 + metrics.ascent).round.toInt | |
| 62812 
ce22e5c3d4ce
more robust display of bidirectional Unicode text: enforce left-to-right;
 wenzelm parents: 
60215diff
changeset | 60 |     for (line <- info.lines) {
 | 
| 
ce22e5c3d4ce
more robust display of bidirectional Unicode text: enforce left-to-right;
 wenzelm parents: 
60215diff
changeset | 61 | gfx.drawString(Word.bidi_override(line), x, y) | 
| 
ce22e5c3d4ce
more robust display of bidirectional Unicode text: enforce left-to-right;
 wenzelm parents: 
60215diff
changeset | 62 | y += metrics.height.ceil.toInt | 
| 
ce22e5c3d4ce
more robust display of bidirectional Unicode text: enforce left-to-right;
 wenzelm parents: 
60215diff
changeset | 63 | } | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 64 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 65 | |
| 75393 | 66 |   def paint_dummy(gfx: Graphics2D, graphview: Graphview, info: Layout.Info): Unit = {
 | 
| 59384 | 67 | gfx.setStroke(default_stroke) | 
| 59459 | 68 | gfx.setColor(graphview.dummy_color) | 
| 59384 | 69 | gfx.draw(shape(info)) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 70 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 71 | |
| 75393 | 72 |   object Straight_Edge {
 | 
| 73 |     def paint(gfx: Graphics2D, graphview: Graphview, edge: Graph_Display.Edge): Unit = {
 | |
| 59459 | 74 | val p = graphview.layout.get_node(edge._1) | 
| 75 | val q = graphview.layout.get_node(edge._2) | |
| 75393 | 76 |       val ds = {
 | 
| 59262 | 77 | val a = p.y min q.y | 
| 78 | val b = p.y max q.y | |
| 59459 | 79 | graphview.layout.dummies_iterator(edge).filter(d => a < d.y && d.y < b).toList | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 80 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 81 | 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 | 82 | |
| 59262 | 83 | path.moveTo(p.x, p.y) | 
| 84 | ds.foreach(d => path.lineTo(d.x, d.y)) | |
| 85 | path.lineTo(q.x, q.y) | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 86 | |
| 59459 | 87 | if (graphview.show_dummies) ds.foreach(paint_dummy(gfx, graphview, _)) | 
| 50467 | 88 | |
| 59250 | 89 | gfx.setStroke(default_stroke) | 
| 59459 | 90 | gfx.setColor(graphview.edge_color(edge, p.y < q.y)) | 
| 59250 | 91 | gfx.draw(path) | 
| 50467 | 92 | |
| 59459 | 93 | if (graphview.show_arrow_heads) Arrow_Head.paint(gfx, path, Shapes.shape(q)) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 94 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 95 | } | 
| 50467 | 96 | |
| 75393 | 97 |   object Cardinal_Spline_Edge {
 | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 98 | 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 | 99 | |
| 75393 | 100 |     def paint(gfx: Graphics2D, graphview: Graphview, edge: Graph_Display.Edge): Unit = {
 | 
| 59459 | 101 | val p = graphview.layout.get_node(edge._1) | 
| 102 | val q = graphview.layout.get_node(edge._2) | |
| 75393 | 103 |       val ds = {
 | 
| 59262 | 104 | val a = p.y min q.y | 
| 105 | val b = p.y max q.y | |
| 59459 | 106 | graphview.layout.dummies_iterator(edge).filter(d => a < d.y && d.y < b).toList | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 107 | } | 
| 50467 | 108 | |
| 59459 | 109 | if (ds.isEmpty) Straight_Edge.paint(gfx, graphview, edge) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 110 |       else {
 | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 111 | val path = new GeneralPath(Path2D.WIND_EVEN_ODD, ds.length + 2) | 
| 59262 | 112 | path.moveTo(p.x, p.y) | 
| 50467 | 113 | |
| 59262 | 114 | val coords = p :: ds ::: List(q) | 
| 115 | val dx = coords(2).x - coords(0).x | |
| 116 | val dy = coords(2).y - coords(0).y | |
| 50467 | 117 | |
| 118 | val (dx2, dy2) = | |
| 75434 | 119 |           coords.sliding(3).foldLeft((dx, dy)) {
 | 
| 120 | case ((dx, dy), Seq(l, m, r)) => | |
| 59262 | 121 | val dx2 = r.x - l.x | 
| 122 | val dy2 = r.y - l.y | |
| 123 | path.curveTo( | |
| 124 | l.x + slack * dx, l.y + slack * dy, | |
| 125 | m.x - slack * dx2, m.y - slack * dy2, | |
| 126 | m.x, m.y) | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 127 | (dx2, dy2) | 
| 75439 | 128 | case (p, _) => p | 
| 59262 | 129 | } | 
| 50467 | 130 | |
| 59262 | 131 | val l = ds.last | 
| 132 | path.curveTo( | |
| 133 | l.x + slack * dx2, l.y + slack * dy2, | |
| 134 | q.x - slack * dx2, q.y - slack * dy2, | |
| 135 | q.x, q.y) | |
| 50467 | 136 | |
| 59459 | 137 | if (graphview.show_dummies) ds.foreach(paint_dummy(gfx, graphview, _)) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 138 | |
| 59250 | 139 | gfx.setStroke(default_stroke) | 
| 59459 | 140 | gfx.setColor(graphview.edge_color(edge, p.y < q.y)) | 
| 59250 | 141 | gfx.draw(path) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 142 | |
| 59459 | 143 | if (graphview.show_arrow_heads) Arrow_Head.paint(gfx, path, Shapes.shape(q)) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 144 | } | 
| 50467 | 145 | } | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 146 | } | 
| 50467 | 147 | |
| 75393 | 148 |   object Arrow_Head {
 | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 149 | 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 | 150 | |
| 75393 | 151 |     private def position(path: GeneralPath, shape: Shape): Option[AffineTransform] = {
 | 
| 152 |       def intersecting_line(path: GeneralPath, shape: Shape): Option[(Point, Point)] = {
 | |
| 49745 | 153 | val i = path.getPathIterator(null, 1.0) | 
| 59245 
be4180f3c236
more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
 wenzelm parents: 
59242diff
changeset | 154 | val seg = Array[Double](0.0, 0.0, 0.0, 0.0, 0.0, 0.0) | 
| 49745 | 155 | var p1 = (0.0, 0.0) | 
| 156 | var p2 = (0.0, 0.0) | |
| 60215 | 157 |         while (!i.isDone) {
 | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 158 |           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 | 159 | case PathIterator.SEG_MOVETO => p2 = (seg(0), seg(1)) | 
| 50467 | 160 | case PathIterator.SEG_LINETO => | 
| 161 | p1 = p2 | |
| 162 | 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 | 163 | |
| 50467 | 164 | if(shape.contains(seg(0), seg(1))) | 
| 165 | 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 | 166 | case _ => | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 167 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 168 | i.next() | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 169 | } | 
| 50467 | 170 | None | 
| 171 | } | |
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 172 | |
| 75393 | 173 |       def binary_search(line: (Point, Point), shape: Shape): Option[AffineTransform] = {
 | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 174 | 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 | 175 | 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 | 176 | None | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 177 |         else {
 | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 178 | val (dx, dy) = (fx - tx, fy - ty) | 
| 49745 | 179 |           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 | 180 | 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 | 181 | 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 | 182 | Some(at) | 
| 50467 | 183 | } | 
| 184 |           else {
 | |
| 49745 | 185 | 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 | 186 | 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 | 187 | 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 | 188 | else | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 189 | 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 | 190 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 191 | } | 
| 
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 |       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 | 195 | case None => None | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 196 | 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 | 197 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 198 | } | 
| 50467 | 199 | |
| 75393 | 200 |     def paint(gfx: Graphics2D, path: GeneralPath, shape: Shape): Unit = {
 | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 201 |       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 | 202 | case None => | 
| 50479 | 203 | 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 | 204 | 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 | 205 | arrow.moveTo(0, 0) | 
| 50479 | 206 | arrow.lineTo(-10, 4) | 
| 207 | arrow.lineTo(-6, 0) | |
| 208 | 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 | 209 | 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 | 210 | arrow.transform(at) | 
| 59250 | 211 | gfx.fill(arrow) | 
| 49557 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 212 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 213 | } | 
| 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 Markus Kaiser <markus.kaiser@in.tum.de> parents: diff
changeset | 214 | } | 
| 60215 | 215 | } |