src/Tools/jEdit/src/graphview_dockable.scala
author wenzelm
Tue, 21 Oct 2014 17:49:51 +0200
changeset 58749 83b0f633190e
parent 57612 990ffb84489b
child 59228 56b34fc7a015
permissions -rw-r--r--
some structure matching, based on line token iterators;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
49570
2265456f6131 more uniform graphview terminology;
wenzelm
parents: 49566
diff changeset
     1
/*  Title:      Tools/jEdit/src/graphview_dockable.scala
49566
66cbf8bb4693 basic integration of graphview into document model;
wenzelm
parents: 49557
diff changeset
     2
    Author:     Makarius
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     3
50452
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
     4
Stateless dockable window for graphview.
49557
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
49566
66cbf8bb4693 basic integration of graphview into document model;
wenzelm
parents: 49557
diff changeset
     7
package isabelle.jedit
49557
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._
49566
66cbf8bb4693 basic integration of graphview into document model;
wenzelm
parents: 49557
diff changeset
    11
53247
bd595338ca18 uniform use of isabelle.jEdit.Popup, based on generic screen location operations;
wenzelm
parents: 53177
diff changeset
    12
import javax.swing.JComponent
52483
478ef4fa3d5a more direct use of screen location: avoid misplacement if parent component has already disappeared asynchronously;
wenzelm
parents: 52480
diff changeset
    13
import java.awt.Point
50452
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    14
import java.awt.event.{WindowFocusListener, WindowEvent}
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    15
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    16
import org.gjt.sp.jedit.View
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    17
50452
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    18
import scala.swing.TextArea
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    19
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    20
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    21
object Graphview_Dockable
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    22
{
57612
990ffb84489b clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents: 56662
diff changeset
    23
  /* implicit arguments -- owned by GUI thread */
50452
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    24
52972
8fd8e1c14988 tuned signature;
wenzelm
parents: 52496
diff changeset
    25
  private var implicit_snapshot = Document.Snapshot.init
50452
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    26
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    27
  private val no_graph: Exn.Result[graphview.Model.Graph] = Exn.Exn(ERROR("No graph"))
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    28
  private var implicit_graph = no_graph
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    29
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    30
  private def set_implicit(snapshot: Document.Snapshot, graph: Exn.Result[graphview.Model.Graph])
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    31
  {
57612
990ffb84489b clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents: 56662
diff changeset
    32
    GUI_Thread.require {}
50452
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    33
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    34
    implicit_snapshot = snapshot
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    35
    implicit_graph = graph
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    36
  }
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    37
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    38
  private def reset_implicit(): Unit =
52972
8fd8e1c14988 tuned signature;
wenzelm
parents: 52496
diff changeset
    39
    set_implicit(Document.Snapshot.init, no_graph)
50452
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    40
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    41
  def apply(view: View, snapshot: Document.Snapshot, graph: Exn.Result[graphview.Model.Graph])
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    42
  {
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    43
    set_implicit(snapshot, graph)
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    44
    view.getDockableWindowManager.floatDockableWindow("isabelle-graphview")
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    45
  }
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    46
}
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
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
49570
2265456f6131 more uniform graphview terminology;
wenzelm
parents: 49566
diff changeset
    49
class Graphview_Dockable(view: View, position: String) extends Dockable(view, position)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    50
{
50452
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    51
  private val snapshot = Graphview_Dockable.implicit_snapshot
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    52
  private val graph = Graphview_Dockable.implicit_graph
50446
8dc05db0bf69 always apply transitive_reduction_acyclic in imitation of old graph browser (essential to avoid slow layout and overcrowded display, e.g. class_deps);
wenzelm
parents: 50205
diff changeset
    53
50452
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    54
  private val window_focus_listener =
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    55
    new WindowFocusListener {
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    56
      def windowGainedFocus(e: WindowEvent) { Graphview_Dockable.set_implicit(snapshot, graph) }
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    57
      def windowLostFocus(e: WindowEvent) { Graphview_Dockable.reset_implicit() }
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    58
    }
49566
66cbf8bb4693 basic integration of graphview into document model;
wenzelm
parents: 49557
diff changeset
    59
50452
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    60
  val graphview =
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    61
    graph match {
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    62
      case Exn.Res(proper_graph) =>
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    63
        new isabelle.graphview.Main_Panel(proper_graph) {
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    64
          override def make_tooltip(parent: JComponent, x: Int, y: Int, body: XML.Body): String =
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    65
          {
52494
a1e09340c0f4 clarified tooltip timing of pending event and active state;
wenzelm
parents: 52483
diff changeset
    66
            Pretty_Tooltip.invoke(() =>
a1e09340c0f4 clarified tooltip timing of pending event and active state;
wenzelm
parents: 52483
diff changeset
    67
              {
a1e09340c0f4 clarified tooltip timing of pending event and active state;
wenzelm
parents: 52483
diff changeset
    68
                val rendering = Rendering(snapshot, PIDE.options.value)
52496
8188e5286662 avoid repeated window popup when the mouse is moved over the same content (again, see also cb677987b7e3 and 0a1db0d02628);
wenzelm
parents: 52494
diff changeset
    69
                val info = Text.Info(Text.Range(~1), body)
53247
bd595338ca18 uniform use of isabelle.jEdit.Popup, based on generic screen location operations;
wenzelm
parents: 53177
diff changeset
    70
                Pretty_Tooltip(view, parent, new Point(x, y), rendering, Command.Results.empty, info)
52494
a1e09340c0f4 clarified tooltip timing of pending event and active state;
wenzelm
parents: 52483
diff changeset
    71
              })
50452
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    72
            null
49566
66cbf8bb4693 basic integration of graphview into document model;
wenzelm
parents: 49557
diff changeset
    73
          }
66cbf8bb4693 basic integration of graphview into document model;
wenzelm
parents: 49557
diff changeset
    74
        }
50452
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    75
      case Exn.Exn(exn) => new TextArea(Exn.message(exn))
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    76
    }
50452
bfb5964e3041 stateless dockable window for graphview, which is triggered by the active area of the corresponding diagnostic command;
wenzelm
parents: 50446
diff changeset
    77
  set_content(graphview)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    78
49566
66cbf8bb4693 basic integration of graphview into document model;
wenzelm
parents: 49557
diff changeset
    79
  override def init()
66cbf8bb4693 basic integration of graphview into document model;
wenzelm
parents: 49557
diff changeset
    80
  {
53712
ea51046be71b tuned signature;
wenzelm
parents: 53247
diff changeset
    81
    GUI.parent_window(this).map(_.addWindowFocusListener(window_focus_listener))
49566
66cbf8bb4693 basic integration of graphview into document model;
wenzelm
parents: 49557
diff changeset
    82
  }
66cbf8bb4693 basic integration of graphview into document model;
wenzelm
parents: 49557
diff changeset
    83
66cbf8bb4693 basic integration of graphview into document model;
wenzelm
parents: 49557
diff changeset
    84
  override def exit()
66cbf8bb4693 basic integration of graphview into document model;
wenzelm
parents: 49557
diff changeset
    85
  {
53712
ea51046be71b tuned signature;
wenzelm
parents: 53247
diff changeset
    86
    GUI.parent_window(this).map(_.removeWindowFocusListener(window_focus_listener))
49566
66cbf8bb4693 basic integration of graphview into document model;
wenzelm
parents: 49557
diff changeset
    87
  }
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    88
}