src/Tools/Graphview/main_panel.scala
author wenzelm
Fri, 02 Jan 2015 21:19:34 +0100
changeset 59240 e411afcfaa29
parent 59233 876a81f5788b
child 59241 541b95e94dc7
permissions -rw-r--r--
tuned headers;
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
59227
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    13
import scala.swing.{BorderPanel, Button, CheckBox, Action, FileChooser}
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}
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    16
import java.awt.{Color, Dimension, Graphics2D}
49734
wenzelm
parents: 49730
diff changeset
    17
import java.awt.geom.Rectangle2D
wenzelm
parents: 49730
diff changeset
    18
import java.awt.image.BufferedImage
wenzelm
parents: 49730
diff changeset
    19
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
    20
import javax.swing.border.EmptyBorder
49730
e0d98ff3c0db use Pretty_Tooltip for Graphview_Panel;
wenzelm
parents: 49729
diff changeset
    21
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
    22
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    23
59228
56b34fc7a015 more dynamic visualizer -- re-use Isabelle/jEdit options;
wenzelm
parents: 59227
diff changeset
    24
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
    25
{
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
    26
  focusable = true
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
    27
  requestFocus()
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
    28
59233
876a81f5788b tuned signature;
wenzelm
parents: 59228
diff changeset
    29
  val graph_panel = new Graph_Panel(visualizer)
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
    30
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    31
  listenTo(keys)
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    32
  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
    33
50475
8cc351df4a23 just one class with parameters;
wenzelm
parents: 50472
diff changeset
    34
  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
    35
50475
8cc351df4a23 just one class with parameters;
wenzelm
parents: 50472
diff changeset
    36
  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
    37
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    38
  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
    39
  chooser.fileSelectionMode = FileChooser.SelectionMode.FilesOnly
58452
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    40
  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
    41
59227
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    42
  val options_panel =
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    43
    new Wrap_Panel(Wrap_Panel.Alignment.Right)(
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    44
      new CheckBox() {
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    45
        selected = visualizer.arrow_heads
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    46
        action = Action("Arrow Heads") {
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    47
          visualizer.arrow_heads = selected
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    48
          graph_panel.repaint()
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    49
        }
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    50
      },
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    51
      new Button {
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    52
        action = Action("Save Image") {
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    53
          chooser.showSaveDialog(this) match {
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    54
            case FileChooser.Result.Approve => export(chooser.selectedFile)
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    55
            case _ =>
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    56
          }
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    57
        }
59227
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    58
      },
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    59
      graph_panel.zoom,
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    60
      new Button {
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    61
        action = Action("Apply Layout") {
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    62
          graph_panel.apply_layout()
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    63
        }
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    64
      },
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    65
      new Button {
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    66
        action = Action("Fit to Window") {
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    67
          graph_panel.fit_to_window()
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    68
        }
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    69
      },
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    70
      new Button {
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    71
        action = Action("Colorations") {
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    72
          color_dialog.open
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    73
        }
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    74
      },
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    75
      new Button {
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    76
        action = Action("Filters") {
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    77
          mutator_dialog.open
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    78
        }
0df87ade7052 more standard GUI layout;
wenzelm
parents: 59225
diff changeset
    79
      })
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
  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
    82
  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
    83
58452
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    84
  private def export(file: JFile)
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    85
  {
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    86
    val (x0, y0, x1, y1) = visualizer.Coordinates.bounds
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    87
    val w = (math.abs(x1 - x0) + 400).toInt
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    88
    val h = (math.abs(y1 - y0) + 200).toInt
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    89
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    90
    def paint(gfx: Graphics2D)
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    91
    {
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    92
      gfx.setColor(Color.WHITE)
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    93
      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
    94
58452
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    95
      gfx.translate(- x0 + 200, - y0 + 100)
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    96
      visualizer.Drawer.paint_all_visible(gfx, false)
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    97
    }
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50471
diff changeset
    98
58452
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
    99
    try {
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   100
      val name = file.getName
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   101
      if (name.endsWith(".png")) Graphics_File.write_png(file, paint _, w, h)
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   102
      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
   103
      else error("Bad type of file: " + quote(name) + " (.png or .pdf expected)")
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   104
    }
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   105
    catch {
22424e43038d save image as PNG or PDF;
wenzelm
parents: 57044
diff changeset
   106
      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
   107
    }
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   108
  }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   109
}