src/Tools/Graphview/src/main_panel.scala
author wenzelm
Thu, 25 Sep 2014 15:01:42 +0200
changeset 58452 22424e43038d
parent 57044 042d6e58cb40
permissions -rw-r--r--
save image as PNG or PDF; more robust error dialog;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     1
/*  Title:      Tools/Graphview/src/main_panel.scala
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
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     3
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     4
Graph Panel wrapper.
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     5
*/
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
package isabelle.graphview
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     8
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
import isabelle._
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    11
import isabelle.graphview.Mutators._
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    12
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    13
import scala.collection.JavaConversions._
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    14
import scala.swing.{BorderPanel, Button, BoxPanel,
49730
e0d98ff3c0db use Pretty_Tooltip for Graphview_Panel;
wenzelm
parents: 49729
diff changeset
    15
  Orientation, Swing, CheckBox, Action, FileChooser}
e0d98ff3c0db use Pretty_Tooltip for Graphview_Panel;
wenzelm
parents: 49729
diff changeset
    16
58452
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    17
import java.io.{File => JFile}
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    18
import java.awt.{Color, Dimension, Graphics2D}
49734
wenzelm
parents: 49730
diff changeset
    19
import java.awt.geom.Rectangle2D
wenzelm
parents: 49730
diff changeset
    20
import java.awt.image.BufferedImage
wenzelm
parents: 49730
diff changeset
    21
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
    22
import javax.swing.border.EmptyBorder
49730
e0d98ff3c0db use Pretty_Tooltip for Graphview_Panel;
wenzelm
parents: 49729
diff changeset
    23
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
    24
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    25
58452
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    26
class Main_Panel(graph: Model.Graph) extends BorderPanel
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    27
{
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
    28
  focusable = true
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
    29
  requestFocus()
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
    30
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
    31
  val model = new Model(graph)
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
    32
  val visualizer = new Visualizer(model)
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
    33
57035
e865c4d99c49 unused;
wenzelm
parents: 50491
diff changeset
    34
  def make_tooltip(parent: JComponent, x: Int, y: Int, body: XML.Body): String = null
49729
f53a8f73b40f more basic tooltips;
wenzelm
parents: 49565
diff changeset
    35
  val graph_panel = new Graph_Panel(visualizer, make_tooltip)
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
    36
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    37
  listenTo(keys)
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    38
  reactions += graph_panel.reactions
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    39
50475
8cc351df4a23 just one class with parameters;
wenzelm
parents: 50472
diff changeset
    40
  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
    41
50475
8cc351df4a23 just one class with parameters;
wenzelm
parents: 50472
diff changeset
    42
  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
    43
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    44
  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
    45
  chooser.fileSelectionMode = FileChooser.SelectionMode.FilesOnly
58452
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    46
  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
    47
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    48
  val options_panel = new BoxPanel(Orientation.Horizontal) {
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    49
    border = new EmptyBorder(0, 0, 10, 0)
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    50
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    51
    contents += Swing.HGlue
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    52
    contents += new CheckBox(){
50475
8cc351df4a23 just one class with parameters;
wenzelm
parents: 50472
diff changeset
    53
      selected = visualizer.arrow_heads
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    54
      action = Action("Arrow Heads"){
50475
8cc351df4a23 just one class with parameters;
wenzelm
parents: 50472
diff changeset
    55
        visualizer.arrow_heads = selected
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    56
        graph_panel.repaint()
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    57
      }
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
    contents += Swing.RigidBox(new Dimension(10, 0))
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    60
    contents += new Button{
58452
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    61
      action = Action("Save Image"){
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    62
        chooser.showSaveDialog(this) match {
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
    63
          case FileChooser.Result.Approve => export(chooser.selectedFile)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    64
          case _ =>
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    65
        }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    66
      }
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
    67
    }
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    68
    contents += Swing.RigidBox(new Dimension(10, 0))
57044
042d6e58cb40 more uniform Font_Info.Zoom_Box;
wenzelm
parents: 57035
diff changeset
    69
    contents += graph_panel.zoom
50478
ccfdd1f6cf10 added explicit zoom box;
wenzelm
parents: 50475
diff changeset
    70
ccfdd1f6cf10 added explicit zoom box;
wenzelm
parents: 50475
diff changeset
    71
    contents += Swing.RigidBox(new Dimension(10, 0))
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    72
    contents += new Button{
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    73
      action = Action("Apply Layout"){
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    74
        graph_panel.apply_layout()
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    75
      }
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
    76
    }
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    77
    contents += Swing.RigidBox(new Dimension(10, 0))
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    78
    contents += new Button{
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    79
      action = Action("Fit to Window"){
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    80
        graph_panel.fit_to_window()
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    81
      }
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
    82
    }
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    83
    contents += Swing.RigidBox(new Dimension(10, 0))
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    84
    contents += new Button{
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    85
      action = Action("Colorations"){
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    86
        color_dialog.open
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
    }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    89
    contents += Swing.RigidBox(new Dimension(10, 0))
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    90
    contents += new Button{
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    91
      action = Action("Filters"){
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    92
        mutator_dialog.open
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
    }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    95
  }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    96
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    97
  add(graph_panel, BorderPanel.Position.Center)
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    98
  add(options_panel, BorderPanel.Position.North)
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
    99
58452
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   100
  private def export(file: JFile)
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   101
  {
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   102
    val (x0, y0, x1, y1) = visualizer.Coordinates.bounds
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   103
    val w = (math.abs(x1 - x0) + 400).toInt
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   104
    val h = (math.abs(y1 - y0) + 200).toInt
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   105
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   106
    def paint(gfx: Graphics2D)
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
      gfx.setColor(Color.WHITE)
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   109
      gfx.fill(new Rectangle2D.Double(0, 0, w, h))
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   110
58452
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   111
      gfx.translate(- x0 + 200, - y0 + 100)
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   112
      visualizer.Drawer.paint_all_visible(gfx, false)
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   113
    }
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
   114
58452
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   115
    try {
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   116
      val name = file.getName
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   117
      if (name.endsWith(".png")) Graphics_File.write_png(file, paint _, w, h)
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   118
      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
   119
      else error("Bad type of file: " + quote(name) + " (.png or .pdf expected)")
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   120
    }
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   121
    catch {
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   122
      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
   123
    }
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   124
  }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   125
}