src/Tools/VSCode/src/state_panel.scala
author wenzelm
Thu, 29 Jun 2017 11:36:25 +0200
changeset 66211 100c9c997e2b
parent 66206 2d2082db735a
child 66212 f41396c15bb1
permissions -rw-r--r--
HTML GUI actions via JavaScript;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
66098
5aa9cb83e70e clarified modules;
wenzelm
parents: 66096
diff changeset
     1
/*  Title:      Tools/VSCode/src/state_panel.scala
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
     3
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
     4
Show proof state.
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
     5
*/
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
     6
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
     7
package isabelle.vscode
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
     8
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
     9
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    10
import isabelle._
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    11
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    12
66098
5aa9cb83e70e clarified modules;
wenzelm
parents: 66096
diff changeset
    13
object State_Panel
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    14
{
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    15
  private val make_id = Counter.make()
66098
5aa9cb83e70e clarified modules;
wenzelm
parents: 66096
diff changeset
    16
  private val instances = Synchronized(Map.empty[Counter.ID, State_Panel])
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    17
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    18
  def init(server: Server)
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    19
  {
66098
5aa9cb83e70e clarified modules;
wenzelm
parents: 66096
diff changeset
    20
    val instance = new State_Panel(server)
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    21
    instances.change(_ + (instance.id -> instance))
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    22
    instance.init()
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    23
  }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    24
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    25
  def exit(id: Counter.ID)
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    26
  {
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    27
    instances.change(map =>
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    28
      map.get(id) match {
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    29
        case None => map
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    30
        case Some(instance) => instance.exit(); map - id
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    31
      })
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    32
  }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    33
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    34
  def locate(id: Counter.ID): Unit =
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    35
    instances.value.get(id).foreach(state =>
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    36
      state.server.editor.send_dispatcher(state.locate()))
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    37
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    38
  def update(id: Counter.ID): Unit =
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    39
    instances.value.get(id).foreach(state =>
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    40
      state.server.editor.send_dispatcher(state.update()))
66211
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
    41
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
    42
  def auto_update(id: Counter.ID, enabled: Boolean): Unit =
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
    43
    instances.value.get(id).foreach(state =>
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
    44
      state.server.editor.send_dispatcher(state.auto_update(Some(enabled))))
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    45
}
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    46
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    47
66098
5aa9cb83e70e clarified modules;
wenzelm
parents: 66096
diff changeset
    48
class State_Panel private(val server: Server)
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    49
{
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    50
  /* output */
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    51
66098
5aa9cb83e70e clarified modules;
wenzelm
parents: 66096
diff changeset
    52
  val id: Counter.ID = State_Panel.make_id()
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    53
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    54
  private def output(content: String): Unit =
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    55
    server.channel.write(Protocol.State_Output(id, content))
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    56
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    57
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    58
  /* query operation */
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    59
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    60
  private val print_state =
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    61
    new Query_Operation(server.editor, (), "print_state", _ => (),
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    62
      (snapshot, results, body) =>
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    63
        {
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    64
          val text = server.resources.output_pretty_message(Pretty.separate(body))
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    65
          val content =
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    66
            HTML.output_document(
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    67
              List(HTML.style(HTML.fonts_css()),
66211
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
    68
                HTML.style_file(Url.print_file(HTML.isabelle_css.file)),
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
    69
                HTML.script(controls_script)),
66201
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
    70
              List(controls, HTML.source(text)),
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    71
              css = "")
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    72
          output(content)
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    73
        })
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    74
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    75
  def locate() { print_state.locate_query() }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    76
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    77
  def update()
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    78
  {
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    79
    server.editor.current_node_snapshot(()) match {
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    80
      case Some(snapshot) =>
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    81
        (server.editor.current_command((), snapshot), print_state.get_location) match {
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    82
          case (Some(command1), Some(command2)) if command1.id == command2.id =>
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    83
          case _ => print_state.apply_query(Nil)
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    84
        }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    85
      case None =>
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    86
    }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    87
  }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    88
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    89
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    90
  /* auto update */
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    91
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    92
  private val auto_update_enabled = Synchronized(true)
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    93
66211
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
    94
  def auto_update(set: Option[Boolean] = None)
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
    95
  {
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
    96
    val enabled =
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
    97
      auto_update_enabled.guarded_access(a =>
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
    98
        set match {
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
    99
          case None => Some((a, a))
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
   100
          case Some(b) => Some((b, b))
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
   101
        })
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
   102
    if (enabled) update()
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
   103
  }
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   104
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   105
66201
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
   106
  /* controls */
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
   107
66211
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
   108
  private def controls_script =
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
   109
    VSCode_JavaScript.invoke_command +
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
   110
"""
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
   111
function invoke_auto_update(enabled)
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
   112
{ invoke_command("_isabelle.state-auto-update", [""" + id + """, enabled]) }
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
   113
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
   114
function invoke_update() { invoke_command("_isabelle.state-update", [""" + id + """]) }
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
   115
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
   116
function invoke_locate() { invoke_command("_isabelle.state-locate", [""" + id + """]) }
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
   117
"""
66201
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
   118
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
   119
  private def auto_update_button: XML.Elem =
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
   120
    HTML.GUI.checkbox(HTML.text("Auto update"),
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
   121
      name = "auto_update",
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
   122
      tooltip = "Indicate automatic update following cursor movement",
66211
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
   123
      selected = auto_update_enabled.value,
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
   124
      script = "invoke_auto_update(this.checked)")
66201
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
   125
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
   126
  private def update_button: XML.Elem =
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
   127
    HTML.GUI.button(List(HTML.bold(HTML.text("Update"))),
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
   128
      name = "update",
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
   129
      tooltip = "Update display according to the command at cursor position",
66211
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
   130
      script = "invoke_update()")
66201
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
   131
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
   132
  private def locate_button: XML.Elem =
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
   133
    HTML.GUI.button(HTML.text("Locate"),
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
   134
      name = "locate",
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
   135
      tooltip = "Locate printed command within source text",
66211
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
   136
      script = "invoke_locate()")
66201
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
   137
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
   138
  private val controls: XML.Elem =
66211
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66206
diff changeset
   139
    HTML.Wrap_Panel(List(auto_update_button, update_button, locate_button))
66201
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
   140
d8f2c745f572 GUI controls similar to Tools/jEdit/src/state_dockable.scala;
wenzelm
parents: 66099
diff changeset
   141
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   142
  /* main */
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   143
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   144
  private val main =
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   145
    Session.Consumer[Any](getClass.getName) {
66099
wenzelm
parents: 66098
diff changeset
   146
      case changed: Session.Commands_Changed =>
wenzelm
parents: 66098
diff changeset
   147
        if (changed.assignment) auto_update()
wenzelm
parents: 66098
diff changeset
   148
wenzelm
parents: 66098
diff changeset
   149
      case Session.Caret_Focus =>
wenzelm
parents: 66098
diff changeset
   150
        auto_update()
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   151
    }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   152
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   153
  def init()
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   154
  {
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   155
    server.session.commands_changed += main
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   156
    server.session.caret_focus += main
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   157
    server.editor.send_wait_dispatcher { print_state.activate() }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   158
    server.editor.send_dispatcher { auto_update() }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   159
  }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   160
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   161
  def exit()
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   162
  {
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   163
    server.editor.send_wait_dispatcher { print_state.deactivate() }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   164
    server.session.commands_changed -= main
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   165
    server.session.caret_focus -= main
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   166
  }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   167
}