src/Tools/jEdit/src/theories_status.scala
author wenzelm
Sun, 05 Feb 2023 15:59:18 +0100
changeset 77197 a541da01ba67
parent 77161 913c781ff6ba
child 78600 afb83ba8d24c
permissions -rw-r--r--
clarified signature selection: SortedSet[String], which fits better to stored json and works properly on Windows (NB: document theories have an authentic session-theory name);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
     1
/*  Title:      Tools/jEdit/src/theories_status.scala
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
     3
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
     4
GUI panel for status of theories.
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
     5
*/
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
     6
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
     7
package isabelle.jedit
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
     8
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
     9
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    10
import isabelle._
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    11
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    12
import scala.swing.{ListView, Alignment, Label, CheckBox, BorderPanel, BoxPanel, Orientation,
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    13
  Component}
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    14
import scala.swing.event.{MouseClicked, MouseMoved}
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    15
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    16
import java.awt.{BorderLayout, Graphics2D, Color, Point, Dimension}
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    17
import javax.swing.border.{BevelBorder, SoftBevelBorder}
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    18
import javax.swing.{JList, BorderFactory, UIManager}
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    19
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    20
import org.gjt.sp.jedit.View
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    21
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    22
76602
b5dfe1551637 more specific GUI for document nodes;
wenzelm
parents: 76598
diff changeset
    23
class Theories_Status(view: View, document: Boolean = false) {
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    24
  /* component state -- owned by GUI thread */
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    25
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    26
  private var nodes_status = Document_Status.Nodes_Status.empty
76716
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
    27
  private var nodes_required = Set.empty[Document.Node.Name]
76713
d8b3b8a179c2 clarified module initialization;
wenzelm
parents: 76711
diff changeset
    28
  private var document_required = Set.empty[Document.Node.Name]
d8b3b8a179c2 clarified module initialization;
wenzelm
parents: 76711
diff changeset
    29
77161
913c781ff6ba support document preparation from already loaded theories;
wenzelm
parents: 76719
diff changeset
    30
  private def is_loaded_theory(name: Document.Node.Name): Boolean =
913c781ff6ba support document preparation from already loaded theories;
wenzelm
parents: 76719
diff changeset
    31
    PIDE.resources.session_base.loaded_theory(name)
913c781ff6ba support document preparation from already loaded theories;
wenzelm
parents: 76719
diff changeset
    32
913c781ff6ba support document preparation from already loaded theories;
wenzelm
parents: 76719
diff changeset
    33
  private def overall_node_status(
913c781ff6ba support document preparation from already loaded theories;
wenzelm
parents: 76719
diff changeset
    34
    name: Document.Node.Name
913c781ff6ba support document preparation from already loaded theories;
wenzelm
parents: 76719
diff changeset
    35
  ): Document_Status.Overall_Node_Status.Value = {
913c781ff6ba support document preparation from already loaded theories;
wenzelm
parents: 76719
diff changeset
    36
    if (is_loaded_theory(name)) Document_Status.Overall_Node_Status.ok
913c781ff6ba support document preparation from already loaded theories;
wenzelm
parents: 76719
diff changeset
    37
    else nodes_status.overall_node_status(name)
913c781ff6ba support document preparation from already loaded theories;
wenzelm
parents: 76719
diff changeset
    38
  }
913c781ff6ba support document preparation from already loaded theories;
wenzelm
parents: 76719
diff changeset
    39
76713
d8b3b8a179c2 clarified module initialization;
wenzelm
parents: 76711
diff changeset
    40
  private def init_state(): Unit = GUI_Thread.require {
76716
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
    41
    if (document) {
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
    42
      nodes_required = PIDE.editor.document_required().toSet
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
    43
    }
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
    44
    else {
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
    45
      nodes_required = Document_Model.nodes_required()
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
    46
      document_required = PIDE.editor.document_required().toSet
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
    47
    }
76713
d8b3b8a179c2 clarified module initialization;
wenzelm
parents: 76711
diff changeset
    48
  }
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    49
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    50
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    51
  /* node renderer */
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    52
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    53
  private class Geometry {
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    54
    private var location: Point = null
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    55
    private var size: Dimension = null
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    56
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    57
    def in(location0: Point, p: Point): Boolean =
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    58
      location != null && size != null && location0 != null && p != null && {
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    59
        val x = location0.x + location.x
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    60
        val y = location0.y + location.y
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    61
        x <= p.x && p.x < x + size.width &&
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    62
        y <= p.y && p.y < y + size.height
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    63
      }
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    64
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    65
    def update(new_location: Point, new_size: Dimension): Unit = {
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    66
      if (new_location != null && new_size != null) {
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    67
        location = new_location
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    68
        size = new_size
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    69
      }
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    70
    }
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    71
  }
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    72
76603
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    73
  private class Node_Renderer extends ListView.Renderer[Document.Node.Name] {
76710
9dbf00b9c2d5 clarified GUI;
wenzelm
parents: 76608
diff changeset
    74
    private val document_marker = Symbol.decode(" \\<^file>")
9dbf00b9c2d5 clarified GUI;
wenzelm
parents: 76608
diff changeset
    75
    private val no_document_marker = "   "
9dbf00b9c2d5 clarified GUI;
wenzelm
parents: 76608
diff changeset
    76
76603
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    77
    private object component extends BorderPanel {
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    78
      opaque = true
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    79
      border = BorderFactory.createEmptyBorder(2, 2, 2, 2)
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    80
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    81
      var node_name: Document.Node.Name = Document.Node.Name.empty
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
    82
76603
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    83
      val required_geometry = new Geometry
76608
16f049023619 tuned signature;
wenzelm
parents: 76603
diff changeset
    84
      val required: CheckBox = new CheckBox {
76603
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    85
        opaque = false
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    86
        override def paintComponent(gfx: Graphics2D): Unit = {
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    87
          super.paintComponent(gfx)
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    88
          required_geometry.update(location, size)
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    89
        }
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    90
      }
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    91
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    92
      val label_geometry = new Geometry
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    93
      val label: Label = new Label {
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    94
        background = view.getTextArea.getPainter.getBackground
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    95
        foreground = view.getTextArea.getPainter.getForeground
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    96
        opaque = false
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    97
        xAlignment = Alignment.Leading
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    98
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
    99
        override def paintComponent(gfx: Graphics2D): Unit = {
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   100
          def paint_segment(x: Int, w: Int, color: Color): Unit = {
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   101
            gfx.setColor(color)
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   102
            gfx.fillRect(x, 0, w, size.height)
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   103
          }
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   104
76603
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   105
          paint_segment(0, size.width, background)
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   106
          nodes_status.get(node_name) match {
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   107
            case Some(node_status) =>
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   108
              val segments =
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   109
                List(
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   110
                  (node_status.unprocessed, PIDE.options.color_value("unprocessed1_color")),
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   111
                  (node_status.running, PIDE.options.color_value("running_color")),
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   112
                  (node_status.warned, PIDE.options.color_value("warning_color")),
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   113
                  (node_status.failed, PIDE.options.color_value("error_color"))
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   114
                ).filter(_._1 > 0)
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   115
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   116
              segments.foldLeft(size.width - 2) {
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   117
                case (last, (n, color)) =>
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   118
                  val w = (n * ((size.width - 4) - segments.length) / node_status.total) max 4
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   119
                  paint_segment(last - w, w, color)
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   120
                  last - w - 1
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   121
                }
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   122
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   123
            case None =>
77161
913c781ff6ba support document preparation from already loaded theories;
wenzelm
parents: 76719
diff changeset
   124
              if (!is_loaded_theory(node_name)) {
913c781ff6ba support document preparation from already loaded theories;
wenzelm
parents: 76719
diff changeset
   125
                paint_segment(0, size.width, PIDE.options.color_value("unprocessed1_color"))
913c781ff6ba support document preparation from already loaded theories;
wenzelm
parents: 76719
diff changeset
   126
              }
76603
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   127
          }
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   128
          super.paintComponent(gfx)
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   129
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   130
          label_geometry.update(location, size)
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   131
        }
76602
b5dfe1551637 more specific GUI for document nodes;
wenzelm
parents: 76598
diff changeset
   132
      }
76603
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   133
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   134
      def label_border(name: Document.Node.Name): Unit = {
77161
913c781ff6ba support document preparation from already loaded theories;
wenzelm
parents: 76719
diff changeset
   135
        val st = overall_node_status(name)
76603
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   136
        val color =
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   137
          st match {
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   138
            case Document_Status.Overall_Node_Status.ok =>
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   139
              PIDE.options.color_value("ok_color")
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   140
            case Document_Status.Overall_Node_Status.failed =>
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   141
              PIDE.options.color_value("failed_color")
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   142
            case _ => label.foreground
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   143
          }
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   144
        val thickness1 = if (st == Document_Status.Overall_Node_Status.pending) 1 else 3
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   145
        val thickness2 = 4 - thickness1
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   146
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   147
        label.border =
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   148
          BorderFactory.createCompoundBorder(
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   149
            BorderFactory.createLineBorder(color, thickness1),
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   150
            BorderFactory.createEmptyBorder(thickness2, thickness2, thickness2, thickness2))
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   151
      }
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   152
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   153
      layout(required) = BorderPanel.Position.West
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   154
      layout(label) = BorderPanel.Position.Center
76602
b5dfe1551637 more specific GUI for document nodes;
wenzelm
parents: 76598
diff changeset
   155
    }
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   156
76603
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   157
    def in_required(location0: Point, p: Point): Boolean =
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   158
      component.required_geometry.in(location0, p)
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   159
76603
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   160
    def in_label(location0: Point, p: Point): Boolean =
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   161
      component.label_geometry.in(location0, p)
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   162
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   163
    def componentFor(
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   164
      list: ListView[_ <: isabelle.Document.Node.Name],
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   165
      isSelected: Boolean,
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   166
      focused: Boolean,
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   167
      name: Document.Node.Name,
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   168
      index: Int
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   169
    ): Component = {
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   170
      component.node_name = name
76716
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
   171
      component.required.selected = nodes_required.contains(name)
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   172
      component.label_border(name)
76710
9dbf00b9c2d5 clarified GUI;
wenzelm
parents: 76608
diff changeset
   173
      component.label.text =
9dbf00b9c2d5 clarified GUI;
wenzelm
parents: 76608
diff changeset
   174
        name.theory_base_name +
76716
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
   175
        (if (document_required.contains(name)) document_marker else no_document_marker)
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   176
      component
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   177
    }
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   178
  }
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   179
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   180
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   181
  /* GUI component */
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   182
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   183
  val gui: ListView[Document.Node.Name] = new ListView[Document.Node.Name](Nil) {
76603
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   184
    private val node_renderer = new Node_Renderer
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   185
    renderer = node_renderer
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   186
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   187
    background = {
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   188
      // enforce default value
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   189
      val c = UIManager.getDefaults.getColor("Panel.background")
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   190
      new Color(c.getRed, c.getGreen, c.getBlue, c.getAlpha)
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   191
    }
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   192
    listenTo(mouse.clicks)
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   193
    listenTo(mouse.moves)
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   194
    reactions += {
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   195
      case MouseClicked(_, point, _, clicks, _) =>
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   196
        val index = peer.locationToIndex(point)
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   197
        if (index >= 0) {
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   198
          val index_location = peer.indexToLocation(index)
76603
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   199
          if (node_renderer.in_required(index_location, point)) {
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   200
            if (clicks == 1) {
76715
bf5ff407f32f clarified state of document model vs. document editor selection (again, see also a9d52d02bd83);
wenzelm
parents: 76713
diff changeset
   201
              val name = listData(index)
77197
a541da01ba67 clarified signature selection: SortedSet[String], which fits better to stored json and works properly on Windows (NB: document theories have an authentic session-theory name);
wenzelm
parents: 77161
diff changeset
   202
              if (document) PIDE.editor.document_select(Set(name.theory), toggle = true)
76715
bf5ff407f32f clarified state of document model vs. document editor selection (again, see also a9d52d02bd83);
wenzelm
parents: 76713
diff changeset
   203
              else Document_Model.node_required(name, toggle = true)
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   204
            }
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   205
          }
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   206
          else if (clicks == 2) PIDE.editor.goto_file(true, view, listData(index).node)
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   207
        }
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   208
      case MouseMoved(_, point, _) =>
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   209
        val index = peer.locationToIndex(point)
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   210
        val index_location = peer.indexToLocation(index)
76603
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   211
        if (index >= 0 && node_renderer.in_required(index_location, point)) {
76602
b5dfe1551637 more specific GUI for document nodes;
wenzelm
parents: 76598
diff changeset
   212
          tooltip =
b5dfe1551637 more specific GUI for document nodes;
wenzelm
parents: 76598
diff changeset
   213
            if (document) "Mark for inclusion in document"
b5dfe1551637 more specific GUI for document nodes;
wenzelm
parents: 76598
diff changeset
   214
            else "Mark as required for continuous checking"
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   215
        }
76603
f10e6af0264f clarified modules;
wenzelm
parents: 76602
diff changeset
   216
        else if (index >= 0 && node_renderer.in_label(index_location, point)) {
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   217
          val name = listData(index)
77161
913c781ff6ba support document preparation from already loaded theories;
wenzelm
parents: 76719
diff changeset
   218
          val st = overall_node_status(name)
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   219
          tooltip =
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   220
            "theory " + quote(name.theory) +
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   221
              (if (st == Document_Status.Overall_Node_Status.ok) "" else " (" + st + ")")
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   222
        }
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   223
        else tooltip = null
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   224
    }
76598
wenzelm
parents: 76566
diff changeset
   225
wenzelm
parents: 76566
diff changeset
   226
    peer.setLayoutOrientation(JList.HORIZONTAL_WRAP)
wenzelm
parents: 76566
diff changeset
   227
    peer.setVisibleRowCount(0)
wenzelm
parents: 76566
diff changeset
   228
    selection.intervalMode = ListView.IntervalMode.Single
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   229
  }
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   230
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   231
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   232
  /* update */
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   233
76716
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
   234
  def update(
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
   235
    domain: Option[Set[Document.Node.Name]] = None,
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
   236
    trim: Boolean = false,
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
   237
    force: Boolean = false
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
   238
  ): Unit = {
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   239
    GUI_Thread.require {}
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   240
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   241
    val snapshot = PIDE.session.snapshot()
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   242
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   243
    val (nodes_status_changed, nodes_status1) =
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   244
      nodes_status.update(
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   245
        PIDE.resources, snapshot.state, snapshot.version, domain = domain, trim = trim)
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   246
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   247
    nodes_status = nodes_status1
76716
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
   248
    if (nodes_status_changed || force) {
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   249
      gui.listData =
76719
2c8632c746fe proper handling of state updates;
wenzelm
parents: 76716
diff changeset
   250
        if (document) {
2c8632c746fe proper handling of state updates;
wenzelm
parents: 76716
diff changeset
   251
          nodes_status1.present(domain = Some(PIDE.editor.document_theories())).map(_._1)
2c8632c746fe proper handling of state updates;
wenzelm
parents: 76716
diff changeset
   252
        }
76716
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
   253
        else {
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
   254
          (for {
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
   255
            (name, node_status) <- nodes_status1.present().iterator
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
   256
            if !node_status.is_empty && !node_status.is_suppressed && node_status.total > 0
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
   257
          } yield name).toList
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76715
diff changeset
   258
        }
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   259
    }
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   260
  }
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   261
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   262
76711
1e1806912bc1 tuned signature;
wenzelm
parents: 76710
diff changeset
   263
  /* refresh */
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   264
76713
d8b3b8a179c2 clarified module initialization;
wenzelm
parents: 76711
diff changeset
   265
  def refresh(): Unit = GUI_Thread.require {
d8b3b8a179c2 clarified module initialization;
wenzelm
parents: 76711
diff changeset
   266
    init_state()
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   267
    gui.repaint()
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   268
  }
76713
d8b3b8a179c2 clarified module initialization;
wenzelm
parents: 76711
diff changeset
   269
d8b3b8a179c2 clarified module initialization;
wenzelm
parents: 76711
diff changeset
   270
  init_state()
76566
318c6b466ec0 clarified modules;
wenzelm
parents:
diff changeset
   271
}