src/Tools/Graphview/graph_panel.scala
author wenzelm
Sun, 18 Jan 2015 22:07:45 +0100
changeset 59399 47fb85ccfce8
parent 59398 ea163bf8ad22
child 59403 db65d45b6740
permissions -rw-r--r--
tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59202
711c2446dc9d clarified source location;
wenzelm
parents: 57044
diff changeset
     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
e411afcfaa29 tuned headers;
wenzelm
parents: 59239
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
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
995162143ef4 tuned imports;
wenzelm
parents: 51616
diff changeset
    10
49558
af7b652180d5 minimal component and build setup for graphview;
wenzelm
parents: 49557
diff changeset
    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
59397
fc909f7e7ce5 proper scrolling wrt. transform;
wenzelm
parents: 59392
diff changeset
    13
import java.awt.{Dimension, Graphics2D, Point, Rectangle}
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}
59225
d0edf67253d3 tuned imports;
wenzelm
parents: 59219
diff changeset
    15
import javax.swing.{JScrollPane, JComponent, SwingUtilities}
49729
f53a8f73b40f more basic tooltips;
wenzelm
parents: 49569
diff changeset
    16
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    17
import scala.swing.{Panel, ScrollPane}
59253
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
    18
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
    19
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    20
59233
876a81f5788b tuned signature;
wenzelm
parents: 59231
diff changeset
    21
class Graph_Panel(val visualizer: Visualizer) extends ScrollPane
49729
f53a8f73b40f more basic tooltips;
wenzelm
parents: 49569
diff changeset
    22
{
49731
wenzelm
parents: 49730
diff changeset
    23
  panel =>
49729
f53a8f73b40f more basic tooltips;
wenzelm
parents: 49569
diff changeset
    24
59398
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    25
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    26
  /* tooltips */
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    27
59243
21ef04bd4e17 recovered tooltip from 6e77ddb1e3fb: non-null default is required as prerequisite;
wenzelm
parents: 59241
diff changeset
    28
  tooltip = ""
21ef04bd4e17 recovered tooltip from 6e77ddb1e3fb: non-null default is required as prerequisite;
wenzelm
parents: 59241
diff changeset
    29
49729
f53a8f73b40f more basic tooltips;
wenzelm
parents: 49569
diff changeset
    30
  override lazy val peer: JScrollPane = new JScrollPane with SuperMixin {
49730
e0d98ff3c0db use Pretty_Tooltip for Graphview_Panel;
wenzelm
parents: 49729
diff changeset
    31
    override def getToolTipText(event: java.awt.event.MouseEvent): String =
59305
b5e33012180e tuned signature;
wenzelm
parents: 59303
diff changeset
    32
      visualizer.find_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
    33
        case Some(node) =>
59259
399506ee38a5 clarified static full_graph vs. dynamic visible_graph;
wenzelm
parents: 59255
diff changeset
    34
          visualizer.model.full_graph.get_node(node) match {
49732
ad362eec19c3 more direct tooltip content;
wenzelm
parents: 49731
diff changeset
    35
            case Nil => null
59233
876a81f5788b tuned signature;
wenzelm
parents: 59231
diff changeset
    36
            case content => visualizer.make_tooltip(panel.peer, event.getX, event.getY, content)
49732
ad362eec19c3 more direct tooltip content;
wenzelm
parents: 49731
diff changeset
    37
          }
ad362eec19c3 more direct tooltip content;
wenzelm
parents: 49731
diff changeset
    38
        case None => null
ad362eec19c3 more direct tooltip content;
wenzelm
parents: 49731
diff changeset
    39
      }
49729
f53a8f73b40f more basic tooltips;
wenzelm
parents: 49569
diff changeset
    40
  }
f53a8f73b40f more basic tooltips;
wenzelm
parents: 49569
diff changeset
    41
59398
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    42
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    43
  /* scrolling */
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    44
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    45
  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
    46
  verticalScrollBarPolicy = ScrollPane.BarPolicy.Always
49729
f53a8f73b40f more basic tooltips;
wenzelm
parents: 49569
diff changeset
    47
59237
ac135eff1ffb clarified mouse wheel: conventional scrolling, not scaling;
wenzelm
parents: 59234
diff changeset
    48
  peer.getVerticalScrollBar.setUnitIncrement(10)
ac135eff1ffb clarified mouse wheel: conventional scrolling, not scaling;
wenzelm
parents: 59234
diff changeset
    49
59398
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    50
  def scroll_to_node(node: Graph_Display.Node)
49735
30e2f3f1c623 more precise repaint and revalidate -- the latter is important to keep in sync with content update;
wenzelm
parents: 49733
diff changeset
    51
  {
59398
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    52
    val gap = visualizer.metrics.gap
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    53
    val info = visualizer.layout.get_node(node)
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    54
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    55
    val t = Transform()
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    56
    val p =
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    57
      t.transform(new Point2D.Double(info.x - info.width2 - gap, info.y - info.height2 - gap), null)
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    58
    val q =
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    59
      t.transform(new Point2D.Double(info.x + info.width2 + gap, info.y + info.height2 + gap), null)
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    60
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    61
    paint_panel.peer.scrollRectToVisible(
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    62
      new Rectangle(p.getX.toInt, p.getY.toInt,
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    63
        (q.getX - p.getX).ceil.toInt, (q.getY - p.getY).ceil.toInt))
49735
30e2f3f1c623 more precise repaint and revalidate -- the latter is important to keep in sync with content update;
wenzelm
parents: 49733
diff changeset
    64
  }
30e2f3f1c623 more precise repaint and revalidate -- the latter is important to keep in sync with content update;
wenzelm
parents: 49733
diff changeset
    65
50470
wenzelm
parents: 50469
diff changeset
    66
59398
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    67
  /* painting */
50478
ccfdd1f6cf10 added explicit zoom box;
wenzelm
parents: 50477
diff changeset
    68
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    69
  private class Paint_Panel extends Panel
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    70
  {
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    71
    def set_preferred_size()
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    72
    {
59302
4d985afc0565 explict layout graph structure, with dummies and coordinates;
wenzelm
parents: 59294
diff changeset
    73
      val box = visualizer.bounding_box()
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    74
      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
    75
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    76
      preferredSize =
59241
541b95e94dc7 clarified bounding box, similar to old graph browser;
wenzelm
parents: 59240
diff changeset
    77
        new Dimension((box.width * s).ceil.toInt, (box.height * s).ceil.toInt)
50470
wenzelm
parents: 50469
diff changeset
    78
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    79
      revalidate()
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    80
    }
50470
wenzelm
parents: 50469
diff changeset
    81
59250
wenzelm
parents: 59245
diff changeset
    82
    override def paint(gfx: Graphics2D)
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    83
    {
59250
wenzelm
parents: 59245
diff changeset
    84
      super.paintComponent(gfx)
wenzelm
parents: 59245
diff changeset
    85
      gfx.setColor(visualizer.background_color)
wenzelm
parents: 59245
diff changeset
    86
      gfx.fillRect(0, 0, peer.getWidth, peer.getHeight)
wenzelm
parents: 59245
diff changeset
    87
      gfx.transform(Transform())
50470
wenzelm
parents: 50469
diff changeset
    88
59294
126293918a37 clarified visualizer parameters;
wenzelm
parents: 59291
diff changeset
    89
      visualizer.paint_all_visible(gfx)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    90
    }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    91
  }
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
    92
  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
    93
  contents = paint_panel
50470
wenzelm
parents: 50469
diff changeset
    94
59398
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    95
  def refresh()
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    96
  {
59398
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    97
    if (paint_panel != null) {
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    98
      paint_panel.set_preferred_size()
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
    99
      paint_panel.repaint()
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   100
    }
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   101
  }
49733
38a68e6593be prefer synchronous Mutator_Event.Bus on Swing_Thread;
wenzelm
parents: 49732
diff changeset
   102
59398
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   103
  val zoom = new GUI.Zoom_Box { def changed = rescale(0.01 * factor) }
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   104
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   105
  def rescale(s: Double)
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   106
  {
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   107
    Transform.scale = s
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   108
    if (zoom != null) zoom.set_item((Transform.scale_discrete * 100).floor.toInt)
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   109
    refresh()
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   110
  }
50470
wenzelm
parents: 50469
diff changeset
   111
50491
0faaa279faee improved coupling of zoom_box and scale;
wenzelm
parents: 50478
diff changeset
   112
  rescale(1.0)
50470
wenzelm
parents: 50469
diff changeset
   113
59397
fc909f7e7ce5 proper scrolling wrt. transform;
wenzelm
parents: 59392
diff changeset
   114
59398
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   115
  /* transform */
59397
fc909f7e7ce5 proper scrolling wrt. transform;
wenzelm
parents: 59392
diff changeset
   116
59399
wenzelm
parents: 59398
diff changeset
   117
  def fit_to_window()
wenzelm
parents: 59398
diff changeset
   118
  {
wenzelm
parents: 59398
diff changeset
   119
    Transform.fit_to_window()
wenzelm
parents: 59398
diff changeset
   120
    refresh()
wenzelm
parents: 59398
diff changeset
   121
  }
wenzelm
parents: 59398
diff changeset
   122
50469
wenzelm
parents: 50468
diff changeset
   123
  private object Transform
wenzelm
parents: 50468
diff changeset
   124
  {
50474
6ee044e2d1a7 initial layout coordinates more like old browser;
wenzelm
parents: 50470
diff changeset
   125
    private var _scale: Double = 1.0
50477
ffa18243a4e3 some attempts at more discrete scale factor;
wenzelm
parents: 50476
diff changeset
   126
    def scale: Double = _scale
ffa18243a4e3 some attempts at more discrete scale factor;
wenzelm
parents: 50476
diff changeset
   127
    def scale_=(s: Double)
50468
7a2a4b84c5ee tuned min/max;
wenzelm
parents: 50465
diff changeset
   128
    {
59241
541b95e94dc7 clarified bounding box, similar to old graph browser;
wenzelm
parents: 59240
diff changeset
   129
      _scale = (s min 10.0) max 0.1
50468
7a2a4b84c5ee tuned min/max;
wenzelm
parents: 50465
diff changeset
   130
    }
59255
db265648139c clarified fit_to_window: floor scale within window bounds;
wenzelm
parents: 59253
diff changeset
   131
50477
ffa18243a4e3 some attempts at more discrete scale factor;
wenzelm
parents: 50476
diff changeset
   132
    def scale_discrete: Double =
59286
ac74eedb910a GUI.imitate_font: more explicit result size, e.g. relevant for caching;
wenzelm
parents: 59262
diff changeset
   133
    {
59290
569a8109eeb2 separate module Metrics;
wenzelm
parents: 59287
diff changeset
   134
      val font_height = GUI.line_metrics(visualizer.metrics.font).getHeight.toInt
59286
ac74eedb910a GUI.imitate_font: more explicit result size, e.g. relevant for caching;
wenzelm
parents: 59262
diff changeset
   135
      (scale * font_height).floor / font_height
ac74eedb910a GUI.imitate_font: more explicit result size, e.g. relevant for caching;
wenzelm
parents: 59262
diff changeset
   136
    }
50470
wenzelm
parents: 50469
diff changeset
   137
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   138
    def apply() =
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   139
    {
59302
4d985afc0565 explict layout graph structure, with dummies and coordinates;
wenzelm
parents: 59294
diff changeset
   140
      val box = visualizer.bounding_box()
59397
fc909f7e7ce5 proper scrolling wrt. transform;
wenzelm
parents: 59392
diff changeset
   141
      val t = AffineTransform.getScaleInstance(scale_discrete, scale_discrete)
fc909f7e7ce5 proper scrolling wrt. transform;
wenzelm
parents: 59392
diff changeset
   142
      t.translate(- box.x, - box.y)
fc909f7e7ce5 proper scrolling wrt. transform;
wenzelm
parents: 59392
diff changeset
   143
      t
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   144
    }
50470
wenzelm
parents: 50469
diff changeset
   145
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   146
    def fit_to_window()
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   147
    {
59290
569a8109eeb2 separate module Metrics;
wenzelm
parents: 59287
diff changeset
   148
      if (visualizer.visible_graph.is_empty)
50491
0faaa279faee improved coupling of zoom_box and scale;
wenzelm
parents: 50478
diff changeset
   149
        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
   150
      else {
59302
4d985afc0565 explict layout graph structure, with dummies and coordinates;
wenzelm
parents: 59294
diff changeset
   151
        val box = visualizer.bounding_box()
59241
541b95e94dc7 clarified bounding box, similar to old graph browser;
wenzelm
parents: 59240
diff changeset
   152
        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
   153
      }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   154
    }
50470
wenzelm
parents: 50469
diff changeset
   155
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   156
    def pane_to_graph_coordinates(at: Point2D): Point2D =
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   157
    {
50477
ffa18243a4e3 some attempts at more discrete scale factor;
wenzelm
parents: 50476
diff changeset
   158
      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
   159
      val p = Transform().inverseTransform(peer.getViewport.getViewPosition, null)
50470
wenzelm
parents: 50469
diff changeset
   160
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   161
      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
   162
      p
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   163
    }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   164
  }
50470
wenzelm
parents: 50469
diff changeset
   165
59398
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   166
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   167
  /* interaction */
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   168
59399
wenzelm
parents: 59398
diff changeset
   169
  visualizer.model.Colors.events += { case _ => repaint() }
wenzelm
parents: 59398
diff changeset
   170
  visualizer.model.Mutators.events += { case _ => repaint() }
wenzelm
parents: 59398
diff changeset
   171
59398
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   172
  listenTo(mouse.moves)
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   173
  listenTo(mouse.clicks)
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   174
  reactions +=
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   175
  {
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   176
    case MousePressed(_, p, _, _, _) =>
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   177
      Mouse_Interaction.pressed(p)
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   178
      repaint()
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   179
    case MouseDragged(_, to, _) =>
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   180
      Mouse_Interaction.dragged(to)
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   181
      repaint()
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   182
    case e @ MouseClicked(_, p, m, n, _) =>
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   183
      Mouse_Interaction.clicked(p, m, n, SwingUtilities.isRightMouseButton(e.peer))
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   184
      repaint()
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   185
  }
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   186
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   187
  private object Mouse_Interaction
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   188
  {
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   189
    private var draginfo: (Point, List[Graph_Display.Node], List[Layout.Dummy]) =
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   190
      (new Point(0, 0), Nil, Nil)
59253
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   191
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   192
    def pressed(at: Point)
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   193
    {
59253
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   194
      val c = Transform.pane_to_graph_coordinates(at)
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   195
      val l =
59305
b5e33012180e tuned signature;
wenzelm
parents: 59303
diff changeset
   196
        visualizer.find_node(c) match {
59253
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   197
          case Some(node) =>
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   198
            if (visualizer.Selection.contains(node)) visualizer.Selection.get()
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   199
            else List(node)
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   200
          case None => Nil
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   201
        }
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   202
      val d =
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   203
        l match {
59305
b5e33012180e tuned signature;
wenzelm
parents: 59303
diff changeset
   204
          case Nil => visualizer.find_dummy(c).toList
59253
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   205
          case _ => Nil
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   206
        }
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   207
      draginfo = (at, l, d)
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   208
    }
50470
wenzelm
parents: 50469
diff changeset
   209
59398
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   210
    def dragged(to: Point)
59253
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   211
    {
59398
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   212
      val (from, p, d) = draginfo
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   213
59253
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   214
      val s = Transform.scale_discrete
59398
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   215
      val dx = to.x - from.x
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   216
      val dy = to.y - from.y
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   217
59253
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   218
      (p, d) match {
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   219
        case (Nil, Nil) =>
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   220
          val r = panel.peer.getViewport.getViewRect
59302
4d985afc0565 explict layout graph structure, with dummies and coordinates;
wenzelm
parents: 59294
diff changeset
   221
          r.translate(- dx, - dy)
59253
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   222
          paint_panel.peer.scrollRectToVisible(r)
50470
wenzelm
parents: 50469
diff changeset
   223
59253
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   224
        case (Nil, ds) =>
59302
4d985afc0565 explict layout graph structure, with dummies and coordinates;
wenzelm
parents: 59294
diff changeset
   225
          ds.foreach(d => visualizer.translate_vertex(d, dx / s, dy / s))
59253
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   226
9448f4fc95e0 apply_layout: proper repaint;
wenzelm
parents: 59250
diff changeset
   227
        case (ls, _) =>
59302
4d985afc0565 explict layout graph structure, with dummies and coordinates;
wenzelm
parents: 59294
diff changeset
   228
          ls.foreach(l => visualizer.translate_vertex(Layout.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
   229
      }
59398
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   230
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   231
      draginfo = (to, p, d)
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   232
    }
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   233
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   234
    def clicked(at: Point, m: Key.Modifiers, clicks: Int, right_click: Boolean)
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   235
    {
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   236
      val c = Transform.pane_to_graph_coordinates(at)
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   237
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   238
      if (clicks < 2) {
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   239
        if (right_click) {
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   240
          val menu = Popups(panel, visualizer.find_node(c), visualizer.Selection.get())
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   241
          menu.show(panel.peer, at.x, at.y)
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   242
        }
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   243
        else {
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   244
          (visualizer.find_node(c), m) match {
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   245
            case (Some(node), Key.Modifier.Control) => visualizer.Selection.add(node)
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   246
            case (None, Key.Modifier.Control) =>
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   247
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   248
            case (Some(node), Key.Modifier.Shift) => visualizer.Selection.add(node)
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   249
            case (None, Key.Modifier.Shift) =>
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   250
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   251
            case (Some(node), _) =>
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   252
              visualizer.Selection.clear()
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   253
              visualizer.Selection.add(node)
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   254
            case (None, _) =>
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   255
              visualizer.Selection.clear()
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   256
          }
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   257
        }
ea163bf8ad22 misc tuning;
wenzelm
parents: 59397
diff changeset
   258
      }
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   259
    }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   260
  }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   261
}