author | wenzelm |
Tue, 21 Apr 2020 19:07:11 +0200 | |
changeset 71774 | 491f185fd705 |
parent 71383 | 8313dca6dee9 |
child 72761 | 4519eeefe3b5 |
permissions | -rw-r--r-- |
65191
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
1 |
/* Title: Tools/VSCode/src/dynamic_output.scala |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
2 |
Author: Makarius |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
3 |
|
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
4 |
Dynamic output, depending on caret focus: messages, state etc. |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
5 |
*/ |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
6 |
|
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
7 |
package isabelle.vscode |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
8 |
|
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
9 |
|
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
10 |
import isabelle._ |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
11 |
|
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
12 |
|
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
13 |
object Dynamic_Output |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
14 |
{ |
65912 | 15 |
sealed case class State(do_update: Boolean = true, output: List[XML.Tree] = Nil) |
65193 | 16 |
{ |
17 |
def handle_update( |
|
18 |
resources: VSCode_Resources, channel: Channel, restriction: Option[Set[Command]]): State = |
|
19 |
{ |
|
20 |
val st1 = |
|
65976 | 21 |
resources.get_caret() match { |
65193 | 22 |
case None => copy(output = Nil) |
66086 | 23 |
case Some(caret) => |
24 |
val snapshot = caret.model.snapshot() |
|
65193 | 25 |
if (do_update && !snapshot.is_outdated) { |
66086 | 26 |
snapshot.current_command(caret.node_name, caret.offset) match { |
65193 | 27 |
case None => copy(output = Nil) |
28 |
case Some(command) => |
|
29 |
copy(output = |
|
71383 | 30 |
if (restriction.isEmpty || restriction.get.contains(command)) |
65195 | 31 |
Rendering.output_messages(snapshot.command_results(command)) |
65193 | 32 |
else output) |
33 |
} |
|
34 |
} |
|
35 |
else this |
|
36 |
} |
|
37 |
if (st1.output != output) { |
|
38 |
channel.write(Protocol.Dynamic_Output( |
|
39 |
resources.output_pretty_message(Pretty.separate(st1.output)))) |
|
40 |
} |
|
41 |
st1 |
|
42 |
} |
|
43 |
} |
|
65191
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
44 |
|
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
45 |
def apply(server: Server): Dynamic_Output = new Dynamic_Output(server) |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
46 |
} |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
47 |
|
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
48 |
|
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
49 |
class Dynamic_Output private(server: Server) |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
50 |
{ |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
51 |
private val state = Synchronized(Dynamic_Output.State()) |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
52 |
|
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
53 |
private def handle_update(restriction: Option[Set[Command]]) |
65193 | 54 |
{ state.change(_.handle_update(server.resources, server.channel, restriction)) } |
65191
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
55 |
|
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
56 |
|
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
57 |
/* main */ |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
58 |
|
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
59 |
private val main = |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
60 |
Session.Consumer[Any](getClass.getName) { |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
61 |
case changed: Session.Commands_Changed => |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
62 |
handle_update(if (changed.assignment) None else Some(changed.commands)) |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
63 |
|
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
64 |
case Session.Caret_Focus => |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
65 |
handle_update(None) |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
66 |
} |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
67 |
|
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
68 |
def init() |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
69 |
{ |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
70 |
server.session.commands_changed += main |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
71 |
server.session.caret_focus += main |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
72 |
handle_update(None) |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
73 |
} |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
74 |
|
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
75 |
def exit() |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
76 |
{ |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
77 |
server.session.commands_changed -= main |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
78 |
server.session.caret_focus -= main |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
79 |
} |
4c9c83311cad
dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents:
diff
changeset
|
80 |
} |