src/Tools/Graphview/graph_panel.scala
changeset 59397 fc909f7e7ce5
parent 59392 02bacfc31446
child 59398 ea163bf8ad22
equal deleted inserted replaced
59396:a2f4252c5489 59397:fc909f7e7ce5
     8 package isabelle.graphview
     8 package isabelle.graphview
     9 
     9 
    10 
    10 
    11 import isabelle._
    11 import isabelle._
    12 
    12 
    13 import java.awt.{Dimension, Graphics2D, Point}
    13 import java.awt.{Dimension, Graphics2D, Point, Rectangle}
    14 import java.awt.geom.{AffineTransform, Point2D}
    14 import java.awt.geom.{AffineTransform, Point2D}
    15 import javax.swing.{JScrollPane, JComponent, SwingUtilities}
    15 import javax.swing.{JScrollPane, JComponent, SwingUtilities}
    16 
    16 
    17 import scala.swing.{Panel, ScrollPane}
    17 import scala.swing.{Panel, ScrollPane}
    18 import scala.swing.event.{Event, Key, MousePressed, MouseDragged, MouseClicked, MouseEvent}
    18 import scala.swing.event.{Event, Key, MousePressed, MouseDragged, MouseClicked, MouseEvent}
   103   visualizer.model.Colors.events += { case _ => repaint() }
   103   visualizer.model.Colors.events += { case _ => repaint() }
   104   visualizer.model.Mutators.events += { case _ => repaint() }
   104   visualizer.model.Mutators.events += { case _ => repaint() }
   105 
   105 
   106   rescale(1.0)
   106   rescale(1.0)
   107 
   107 
       
   108 
       
   109   def scroll_to_node(node: Graph_Display.Node)
       
   110   {
       
   111     val gap = visualizer.metrics.gap
       
   112     val info = visualizer.layout.get_node(node)
       
   113 
       
   114     val t = Transform()
       
   115     val p =
       
   116       t.transform(new Point2D.Double(info.x - info.width2 - gap, info.y - info.height2 - gap), null)
       
   117     val q =
       
   118       t.transform(new Point2D.Double(info.x + info.width2 + gap, info.y + info.height2 + gap), null)
       
   119 
       
   120     paint_panel.peer.scrollRectToVisible(
       
   121       new Rectangle(p.getX.toInt, p.getY.toInt,
       
   122         (q.getX - p.getX).ceil.toInt, (q.getY - p.getY).ceil.toInt))
       
   123   }
       
   124 
       
   125 
   108   private object Transform
   126   private object Transform
   109   {
   127   {
   110     private var _scale: Double = 1.0
   128     private var _scale: Double = 1.0
   111     def scale: Double = _scale
   129     def scale: Double = _scale
   112     def scale_=(s: Double)
   130     def scale_=(s: Double)
   121     }
   139     }
   122 
   140 
   123     def apply() =
   141     def apply() =
   124     {
   142     {
   125       val box = visualizer.bounding_box()
   143       val box = visualizer.bounding_box()
   126       val at = AffineTransform.getScaleInstance(scale_discrete, scale_discrete)
   144       val t = AffineTransform.getScaleInstance(scale_discrete, scale_discrete)
   127       at.translate(- box.x, - box.y)
   145       t.translate(- box.x, - box.y)
   128       at
   146       t
   129     }
   147     }
   130 
   148 
   131     def fit_to_window()
   149     def fit_to_window()
   132     {
   150     {
   133       if (visualizer.visible_graph.is_empty)
   151       if (visualizer.visible_graph.is_empty)