src/Tools/Graphview/main_panel.scala
author wenzelm
Mon, 19 Jan 2015 16:31:04 +0100
changeset 59406 283aa6225d98
parent 59400 d833cba5cce5
child 59408 63cb603b5114
permissions -rw-r--r--
proper tooltips -- override action toolTip which is empty here;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59202
711c2446dc9d clarified source location;
wenzelm
parents: 58452
diff changeset
     1
/*  Title:      Tools/Graphview/main_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: 59233
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
Graph Panel wrapper.
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 isabelle._
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    12
59392
02bacfc31446 support for tree view on graph nodes;
wenzelm
parents: 59384
diff changeset
    13
import scala.swing.{BorderPanel, Button, CheckBox, Action, FileChooser, SplitPane, Orientation}
49730
e0d98ff3c0db use Pretty_Tooltip for Graphview_Panel;
wenzelm
parents: 49729
diff changeset
    14
58452
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    15
import java.io.{File => JFile}
59289
42710fe5f05a tuned imports;
wenzelm
parents: 59255
diff changeset
    16
import java.awt.{Color, Graphics2D}
49734
wenzelm
parents: 49730
diff changeset
    17
import javax.imageio.ImageIO
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    18
import javax.swing.border.EmptyBorder
49730
e0d98ff3c0db use Pretty_Tooltip for Graphview_Panel;
wenzelm
parents: 49729
diff changeset
    19
import javax.swing.JComponent
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
59228
56b34fc7a015 more dynamic visualizer -- re-use Isabelle/jEdit options;
wenzelm
parents: 59227
diff changeset
    22
class Main_Panel(model: Model, visualizer: Visualizer) extends BorderPanel
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    23
{
59233
876a81f5788b tuned signature;
wenzelm
parents: 59228
diff changeset
    24
  val graph_panel = new Graph_Panel(visualizer)
59397
fc909f7e7ce5 proper scrolling wrt. transform;
wenzelm
parents: 59396
diff changeset
    25
  val tree_panel = new Tree_Panel(visualizer, graph_panel)
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
    26
59392
02bacfc31446 support for tree view on graph nodes;
wenzelm
parents: 59384
diff changeset
    27
  def update_layout()
02bacfc31446 support for tree view on graph nodes;
wenzelm
parents: 59384
diff changeset
    28
  {
02bacfc31446 support for tree view on graph nodes;
wenzelm
parents: 59384
diff changeset
    29
    visualizer.update_layout()
02bacfc31446 support for tree view on graph nodes;
wenzelm
parents: 59384
diff changeset
    30
    tree_panel.refresh()
02bacfc31446 support for tree view on graph nodes;
wenzelm
parents: 59384
diff changeset
    31
    graph_panel.refresh()
02bacfc31446 support for tree view on graph nodes;
wenzelm
parents: 59384
diff changeset
    32
  }
02bacfc31446 support for tree view on graph nodes;
wenzelm
parents: 59384
diff changeset
    33
59393
9f518fa77c1c option graphview_swap_panels;
wenzelm
parents: 59392
diff changeset
    34
  val split_pane =
59395
4c5396f52546 tuned signature;
wenzelm
parents: 59393
diff changeset
    35
    if (visualizer.options.bool("graphview_swap_panels"))
59393
9f518fa77c1c option graphview_swap_panels;
wenzelm
parents: 59392
diff changeset
    36
      new SplitPane(Orientation.Vertical, tree_panel, graph_panel)
9f518fa77c1c option graphview_swap_panels;
wenzelm
parents: 59392
diff changeset
    37
    else
9f518fa77c1c option graphview_swap_panels;
wenzelm
parents: 59392
diff changeset
    38
      new SplitPane(Orientation.Vertical, graph_panel, tree_panel)
59392
02bacfc31446 support for tree view on graph nodes;
wenzelm
parents: 59384
diff changeset
    39
  split_pane.oneTouchExpandable = true
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    40
50475
8cc351df4a23 just one class with parameters;
wenzelm
parents: 50472
diff changeset
    41
  val mutator_dialog = new Mutator_Dialog(visualizer, model.Mutators, "Filters", "Hide", false)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    42
50475
8cc351df4a23 just one class with parameters;
wenzelm
parents: 50472
diff changeset
    43
  val color_dialog = new Mutator_Dialog(visualizer, model.Colors, "Colorations")
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    44
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    45
  private val chooser = new FileChooser()
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    46
  chooser.fileSelectionMode = FileChooser.SelectionMode.FilesOnly
59254
wenzelm
parents: 59241
diff changeset
    47
  chooser.title = "Save image (.png or .pdf)"
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
    48
59392
02bacfc31446 support for tree view on graph nodes;
wenzelm
parents: 59384
diff changeset
    49
  val controls =
59227
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    50
    new Wrap_Panel(Wrap_Panel.Alignment.Right)(
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    51
      new CheckBox() {
59384
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    52
        selected = visualizer.show_content
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    53
        action = Action("Show content") {
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    54
          visualizer.show_content = selected
59392
02bacfc31446 support for tree view on graph nodes;
wenzelm
parents: 59384
diff changeset
    55
          update_layout()
59384
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    56
        }
59406
283aa6225d98 proper tooltips -- override action toolTip which is empty here;
wenzelm
parents: 59400
diff changeset
    57
        tooltip = "Show full node content within graph layout"
59384
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    58
      },
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    59
      new CheckBox() {
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    60
        selected = visualizer.show_arrow_heads
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    61
        action = Action("Show arrow heads") {
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    62
          visualizer.show_arrow_heads = selected
59396
a2f4252c5489 clarified main actions and keyboard focus;
wenzelm
parents: 59395
diff changeset
    63
          graph_panel.repaint()
59384
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    64
        }
59406
283aa6225d98 proper tooltips -- override action toolTip which is empty here;
wenzelm
parents: 59400
diff changeset
    65
        tooltip = "Draw edges with explicit arrow heads"
59227
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    66
      },
59294
126293918a37 clarified visualizer parameters;
wenzelm
parents: 59289
diff changeset
    67
      new CheckBox() {
126293918a37 clarified visualizer parameters;
wenzelm
parents: 59289
diff changeset
    68
        selected = visualizer.show_dummies
59384
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    69
        action = Action("Show dummies") {
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    70
          visualizer.show_dummies = selected
59396
a2f4252c5489 clarified main actions and keyboard focus;
wenzelm
parents: 59395
diff changeset
    71
          graph_panel.repaint()
59384
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    72
        }
59406
283aa6225d98 proper tooltips -- override action toolTip which is empty here;
wenzelm
parents: 59400
diff changeset
    73
        tooltip = "Draw dummy nodes within graph layout, for easier mouse dragging"
59294
126293918a37 clarified visualizer parameters;
wenzelm
parents: 59289
diff changeset
    74
      },
59227
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    75
      new Button {
59254
wenzelm
parents: 59241
diff changeset
    76
        action = Action("Save image") {
59227
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    77
          chooser.showSaveDialog(this) match {
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    78
            case FileChooser.Result.Approve => export(chooser.selectedFile)
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    79
            case _ =>
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    80
          }
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    81
        }
59406
283aa6225d98 proper tooltips -- override action toolTip which is empty here;
wenzelm
parents: 59400
diff changeset
    82
        tooltip = "Save current graph layout as PNG or PDF"
59227
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    83
      },
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    84
      graph_panel.zoom,
59406
283aa6225d98 proper tooltips -- override action toolTip which is empty here;
wenzelm
parents: 59400
diff changeset
    85
      new Button {
283aa6225d98 proper tooltips -- override action toolTip which is empty here;
wenzelm
parents: 59400
diff changeset
    86
        action = Action("Fit to window") { graph_panel.fit_to_window() }
283aa6225d98 proper tooltips -- override action toolTip which is empty here;
wenzelm
parents: 59400
diff changeset
    87
        tooltip = "Zoom to fit window width and height"
283aa6225d98 proper tooltips -- override action toolTip which is empty here;
wenzelm
parents: 59400
diff changeset
    88
      },
283aa6225d98 proper tooltips -- override action toolTip which is empty here;
wenzelm
parents: 59400
diff changeset
    89
      new Button {
283aa6225d98 proper tooltips -- override action toolTip which is empty here;
wenzelm
parents: 59400
diff changeset
    90
        action = Action("Update layout") { update_layout() }
283aa6225d98 proper tooltips -- override action toolTip which is empty here;
wenzelm
parents: 59400
diff changeset
    91
        tooltip = "Regenerate graph layout according to built-in algorithm"
283aa6225d98 proper tooltips -- override action toolTip which is empty here;
wenzelm
parents: 59400
diff changeset
    92
      })
59400
d833cba5cce5 suppress some controls that don't work yet;
wenzelm
parents: 59397
diff changeset
    93
    /* FIXME
59254
wenzelm
parents: 59241
diff changeset
    94
      new Button { action = Action("Colorations") { color_dialog.open } },
59400
d833cba5cce5 suppress some controls that don't work yet;
wenzelm
parents: 59397
diff changeset
    95
      new Button { action = Action("Filters") { mutator_dialog.open } }
d833cba5cce5 suppress some controls that don't work yet;
wenzelm
parents: 59397
diff changeset
    96
    */
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    97
59392
02bacfc31446 support for tree view on graph nodes;
wenzelm
parents: 59384
diff changeset
    98
  layout(split_pane) = BorderPanel.Position.Center
02bacfc31446 support for tree view on graph nodes;
wenzelm
parents: 59384
diff changeset
    99
  layout(controls) = BorderPanel.Position.North
02bacfc31446 support for tree view on graph nodes;
wenzelm
parents: 59384
diff changeset
   100
  update_layout()
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
   101
58452
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   102
  private def export(file: JFile)
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   103
  {
59302
4d985afc0565 explict layout graph structure, with dummies and coordinates;
wenzelm
parents: 59294
diff changeset
   104
    val box = visualizer.bounding_box()
59241
541b95e94dc7 clarified bounding box, similar to old graph browser;
wenzelm
parents: 59240
diff changeset
   105
    val w = box.width.ceil.toInt
541b95e94dc7 clarified bounding box, similar to old graph browser;
wenzelm
parents: 59240
diff changeset
   106
    val h = box.height.ceil.toInt
58452
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   107
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   108
    def paint(gfx: Graphics2D)
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   109
    {
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   110
      gfx.setColor(Color.WHITE)
59241
541b95e94dc7 clarified bounding box, similar to old graph browser;
wenzelm
parents: 59240
diff changeset
   111
      gfx.fillRect(0, 0, w, h)
541b95e94dc7 clarified bounding box, similar to old graph browser;
wenzelm
parents: 59240
diff changeset
   112
      gfx.translate(- box.x, - box.y)
59294
126293918a37 clarified visualizer parameters;
wenzelm
parents: 59289
diff changeset
   113
      visualizer.paint_all_visible(gfx)
58452
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   114
    }
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
   115
58452
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   116
    try {
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   117
      val name = file.getName
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   118
      if (name.endsWith(".png")) Graphics_File.write_png(file, paint _, w, h)
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   119
      else if (name.endsWith(".pdf")) Graphics_File.write_pdf(file, paint _, w, h)
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   120
      else error("Bad type of file: " + quote(name) + " (.png or .pdf expected)")
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   121
    }
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   122
    catch {
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   123
      case ERROR(msg) => GUI.error_dialog(this.peer, "Error", GUI.scrollable_text(msg))
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   124
    }
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   125
  }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   126
}