src/Tools/VSCode/src/state_panel.scala
author wenzelm
Fri, 16 Jun 2017 22:38:19 +0200
changeset 66099 d1639e7877cc
parent 66098 5aa9cb83e70e
child 66201 d8f2c745f572
permissions -rw-r--r--
tuned;
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()))
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    41
}
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    42
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    43
66098
5aa9cb83e70e clarified modules;
wenzelm
parents: 66096
diff changeset
    44
class State_Panel private(val server: Server)
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
  /* output */
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    47
66098
5aa9cb83e70e clarified modules;
wenzelm
parents: 66096
diff changeset
    48
  val id: Counter.ID = State_Panel.make_id()
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
  private def output(content: String): Unit =
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    51
    server.channel.write(Protocol.State_Output(id, content))
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    52
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    53
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    54
  /* query operation */
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    55
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    56
  private val print_state =
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    57
    new Query_Operation(server.editor, (), "print_state", _ => (),
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    58
      (snapshot, results, body) =>
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    59
        {
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    60
          val text = server.resources.output_pretty_message(Pretty.separate(body))
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    61
          val content =
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    62
            HTML.output_document(
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    63
              List(HTML.style(HTML.fonts_css()),
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    64
                HTML.style_file(Url.print_file(HTML.isabelle_css.file))),
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    65
              List(
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    66
                HTML.chapter("Proof state"),
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    67
                HTML.source(text)),
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    68
              css = "")
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    69
          output(content)
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    70
        })
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    71
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    72
  def locate() { print_state.locate_query() }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    73
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    74
  def update()
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    75
  {
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    76
    server.editor.current_node_snapshot(()) match {
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    77
      case Some(snapshot) =>
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    78
        (server.editor.current_command((), snapshot), print_state.get_location) match {
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    79
          case (Some(command1), Some(command2)) if command1.id == command2.id =>
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    80
          case _ => print_state.apply_query(Nil)
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    81
        }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    82
      case None =>
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    83
    }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    84
  }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    85
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    86
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    87
  /* auto update */
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    88
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    89
  private val auto_update_enabled = Synchronized(true)
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    90
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    91
  def set_auto_update(b: Boolean) { auto_update_enabled.change(_ => b); if (b) update() }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    92
66099
wenzelm
parents: 66098
diff changeset
    93
  def auto_update() { if (auto_update_enabled.value) update() }
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    94
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    95
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    96
  /* main */
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    97
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    98
  private val main =
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
    99
    Session.Consumer[Any](getClass.getName) {
66099
wenzelm
parents: 66098
diff changeset
   100
      case changed: Session.Commands_Changed =>
wenzelm
parents: 66098
diff changeset
   101
        if (changed.assignment) auto_update()
wenzelm
parents: 66098
diff changeset
   102
wenzelm
parents: 66098
diff changeset
   103
      case Session.Caret_Focus =>
wenzelm
parents: 66098
diff changeset
   104
        auto_update()
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   105
    }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   106
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   107
  def init()
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   108
  {
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   109
    server.session.commands_changed += main
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   110
    server.session.caret_focus += main
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   111
    server.editor.send_wait_dispatcher { print_state.activate() }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   112
    server.editor.send_dispatcher { auto_update() }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   113
  }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   114
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   115
  def exit()
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   116
  {
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   117
    server.editor.send_wait_dispatcher { print_state.deactivate() }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   118
    server.session.commands_changed -= main
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   119
    server.session.caret_focus -= main
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   120
  }
6187612e83c1 support for separate proof state output;
wenzelm
parents:
diff changeset
   121
}