src/Tools/jEdit/src/timing_dockable.scala
author wenzelm
Wed, 07 Aug 2013 11:50:14 +0200
changeset 52888 671421cef590
parent 51549 37211c7c2894
child 52973 d5f7fa1498b7
permissions -rw-r--r--
tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51533
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
     1
/*  Title:      Tools/jEdit/src/timing_dockable.scala
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
     3
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
     4
Dockable window for timing information.
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
     5
*/
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
     6
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
     7
package isabelle.jedit
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
     8
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
     9
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    10
import isabelle._
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    11
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    12
import scala.actors.Actor._
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    13
import scala.swing.{FlowPanel, Label, ListView, Alignment, ScrollPane, Component, TextField}
51538
637e64effda2 proper input event handling;
wenzelm
parents: 51536
diff changeset
    14
import scala.swing.event.{MouseClicked, ValueChanged}
51533
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    15
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    16
import java.lang.System
51536
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    17
import java.awt.{BorderLayout, Graphics2D, Insets, Color}
51533
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    18
import javax.swing.{JList, BorderFactory}
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    19
import javax.swing.border.{BevelBorder, SoftBevelBorder}
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    20
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    21
import org.gjt.sp.jedit.{View, jEdit}
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    22
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    23
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    24
class Timing_Dockable(view: View, position: String) extends Dockable(view, position)
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    25
{
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    26
  /* entry */
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    27
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    28
  private object Entry
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    29
  {
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    30
    object Ordering extends scala.math.Ordering[Entry]
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    31
    {
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    32
      def compare(entry1: Entry, entry2: Entry): Int =
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    33
        entry2.timing compare entry1.timing
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    34
    }
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    35
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    36
    object Renderer_Component extends Label
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    37
    {
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    38
      opaque = false
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    39
      xAlignment = Alignment.Leading
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    40
      border = BorderFactory.createEmptyBorder(2, 2, 2, 2)
51536
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    41
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    42
      var entry: Entry = null
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    43
      override def paintComponent(gfx: Graphics2D)
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    44
      {
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    45
        def paint_rectangle(color: Color)
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    46
        {
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    47
          val size = peer.getSize()
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    48
          val insets = border.getBorderInsets(peer)
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    49
          val x = insets.left
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    50
          val y = insets.top
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    51
          val w = size.width - x - insets.right
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    52
          val h = size.height - y - insets.bottom
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    53
          gfx.setColor(color)
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    54
          gfx.fillRect(x, y, w, h)
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    55
        }
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    56
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    57
        entry match {
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    58
          case theory_entry: Theory_Entry if theory_entry.current =>
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    59
            paint_rectangle(view.getTextArea.getPainter.getSelectionColor)
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    60
          case _: Command_Entry =>
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    61
            paint_rectangle(view.getTextArea.getPainter.getMultipleSelectionColor)
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    62
          case _ =>
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    63
        }
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    64
        super.paintComponent(gfx)
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    65
      }
51533
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    66
    }
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    67
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    68
    class Renderer extends ListView.Renderer[Entry]
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    69
    {
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    70
      def componentFor(list: ListView[_], isSelected: Boolean, focused: Boolean,
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    71
        entry: Entry, index: Int): Component =
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    72
      {
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    73
        val component = Renderer_Component
51536
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    74
        component.entry = entry
51534
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
    75
        component.text = entry.print
51533
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    76
        component
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    77
      }
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    78
    }
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    79
  }
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    80
51534
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
    81
  private abstract class Entry
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
    82
  {
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
    83
    def timing: Double
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
    84
    def print: String
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
    85
    def follow(snapshot: Document.Snapshot)
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
    86
  }
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
    87
51536
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    88
  private case class Theory_Entry(name: Document.Node.Name, timing: Double, current: Boolean)
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
    89
    extends Entry
51533
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    90
  {
51534
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
    91
    def print: String = Time.print_seconds(timing) + "s theory " + quote(name.theory)
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
    92
    def follow(snapshot: Document.Snapshot): Unit = Hyperlink(name.node).follow(view)
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
    93
  }
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
    94
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
    95
  private case class Command_Entry(command: Command, timing: Double) extends Entry
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
    96
  {
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
    97
    def print: String = "  " + Time.print_seconds(timing) + "s command " + quote(command.name)
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
    98
51533
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
    99
    def follow(snapshot: Document.Snapshot)
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   100
    {
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   101
      val node = snapshot.version.nodes(command.node_name)
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   102
      if (node.commands.contains(command)) {
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   103
        val sources = node.commands.iterator.takeWhile(_ != command).map(_.source)
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   104
        val (line, column) = ((1, 1) /: sources)(Symbol.advance_line_column)
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   105
        Hyperlink(command.node_name.node, line, column).follow(view)
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   106
      }
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   107
    }
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   108
  }
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   109
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   110
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   111
  /* timing view */
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   112
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   113
  private val timing_view = new ListView(Nil: List[Entry]) {
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   114
    listenTo(mouse.clicks)
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   115
    reactions += {
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   116
      case MouseClicked(_, point, _, clicks, _) if clicks == 2 =>
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   117
        val index = peer.locationToIndex(point)
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   118
        if (index >= 0) listData(index).follow(PIDE.session.snapshot())
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   119
    }
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   120
  }
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   121
  timing_view.peer.setLayoutOrientation(JList.VERTICAL_WRAP)
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   122
  timing_view.peer.setVisibleRowCount(0)
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   123
  timing_view.selection.intervalMode = ListView.IntervalMode.Single
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   124
  timing_view.renderer = new Entry.Renderer
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   125
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   126
  set_content(new ScrollPane(timing_view))
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   127
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   128
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   129
  /* timing threshold */
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   130
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   131
  private var timing_threshold = PIDE.options.real("jedit_timing_threshold")
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   132
51549
37211c7c2894 tuned GUI;
wenzelm
parents: 51538
diff changeset
   133
  private val threshold_tooltip = "Threshold for timing display (seconds)"
37211c7c2894 tuned GUI;
wenzelm
parents: 51538
diff changeset
   134
37211c7c2894 tuned GUI;
wenzelm
parents: 51538
diff changeset
   135
  private val threshold_label = new Label("Threshold: ") {
37211c7c2894 tuned GUI;
wenzelm
parents: 51538
diff changeset
   136
    tooltip = threshold_tooltip
37211c7c2894 tuned GUI;
wenzelm
parents: 51538
diff changeset
   137
  }
51533
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   138
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   139
  private val threshold_value = new TextField(Time.print_seconds(timing_threshold)) {
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   140
    reactions += {
51538
637e64effda2 proper input event handling;
wenzelm
parents: 51536
diff changeset
   141
      case _: ValueChanged =>
51533
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   142
        text match {
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   143
          case Properties.Value.Double(x) if x >= 0.0 => timing_threshold = x
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   144
          case _ =>
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   145
        }
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   146
        handle_update()
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   147
    }
51549
37211c7c2894 tuned GUI;
wenzelm
parents: 51538
diff changeset
   148
    tooltip = threshold_tooltip
51538
637e64effda2 proper input event handling;
wenzelm
parents: 51536
diff changeset
   149
    verifier = ((s: String) =>
637e64effda2 proper input event handling;
wenzelm
parents: 51536
diff changeset
   150
      s match { case Properties.Value.Double(x) => x >= 0.0 case _ => false })
51533
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   151
  }
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   152
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   153
  private val controls = new FlowPanel(FlowPanel.Alignment.Right)(threshold_label, threshold_value)
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   154
  add(controls.peer, BorderLayout.NORTH)
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   155
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   156
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   157
  /* component state -- owned by Swing thread */
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   158
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   159
  private var nodes_timing = Map.empty[Document.Node.Name, Protocol.Node_Timing]
51534
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
   160
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
   161
  private def make_entries(): List[Entry] =
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
   162
  {
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
   163
    Swing_Thread.require()
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
   164
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
   165
    val name =
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
   166
      Document_View(view.getTextArea) match {
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
   167
        case None => Document.Node.Name.empty
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
   168
        case Some(doc_view) => doc_view.model.name
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
   169
      }
52888
wenzelm
parents: 51549
diff changeset
   170
    val timing = nodes_timing.getOrElse(name, Protocol.empty_node_timing)
51534
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
   171
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
   172
    val theories =
51536
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
   173
      (for ((node_name, node_timing) <- nodes_timing.toList if !node_timing.commands.isEmpty)
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
   174
        yield Theory_Entry(node_name, node_timing.total, false)).sorted(Entry.Ordering)
51534
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
   175
    val commands =
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
   176
      (for ((command, command_timing) <- timing.commands.toList)
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
   177
        yield Command_Entry(command, command_timing)).sorted(Entry.Ordering)
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
   178
51536
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
   179
    theories.flatMap(entry =>
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
   180
      if (entry.name == name) entry.copy(current = true) :: commands
a1d324ef12d4 more specific Entry painting;
wenzelm
parents: 51534
diff changeset
   181
      else List(entry))
51534
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
   182
  }
51533
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   183
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   184
  private def handle_update(restriction: Option[Set[Document.Node.Name]] = None)
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   185
  {
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   186
    Swing_Thread.now {
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   187
      val snapshot = PIDE.session.snapshot()
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   188
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   189
      val iterator =
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   190
        restriction match {
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   191
          case Some(names) => names.iterator.map(name => (name, snapshot.version.nodes(name)))
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   192
          case None => snapshot.version.nodes.entries
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   193
        }
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   194
      val nodes_timing1 =
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   195
        (nodes_timing /: iterator)({ case (timing1, (name, node)) =>
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   196
            if (PIDE.thy_load.loaded_theories(name.theory)) timing1
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   197
            else {
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   198
              val node_timing =
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   199
                Protocol.node_timing(snapshot.state, snapshot.version, node, timing_threshold)
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   200
              timing1 + (name -> node_timing)
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   201
            }
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   202
        })
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   203
      nodes_timing = nodes_timing1
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   204
51534
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
   205
      val entries = make_entries()
123bd97fcea1 mixed theory/command entries;
wenzelm
parents: 51533
diff changeset
   206
      if (timing_view.listData.toList != entries) timing_view.listData = entries
51533
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   207
    }
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   208
  }
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   209
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   210
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   211
  /* main actor */
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   212
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   213
  private val main_actor = actor {
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   214
    loop {
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   215
      react {
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   216
        case changed: Session.Commands_Changed => handle_update(Some(changed.nodes))
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   217
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   218
        case bad => System.err.println("Timing_Dockable: ignoring bad message " + bad)
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   219
      }
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   220
    }
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   221
  }
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   222
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   223
  override def init()
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   224
  {
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   225
    PIDE.session.commands_changed += main_actor
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   226
    handle_update()
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   227
  }
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   228
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   229
  override def exit()
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   230
  {
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   231
    PIDE.session.commands_changed -= main_actor
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   232
  }
3f6280aedbcc dockable window for timing information;
wenzelm
parents:
diff changeset
   233
}