| author | wenzelm | 
| Tue, 13 Oct 2020 20:28:43 +0200 | |
| changeset 72470 | e2e9ef9aa2df | 
| parent 68829 | 1a4fa494a4a8 | 
| child 77778 | 99a18dcff010 | 
| permissions | -rw-r--r-- | 
| 50450 
358b6020f8b6
generalized notion of active area, where sendback is just one application;
 wenzelm parents: 
50215diff
changeset | 1 | (* Title: Pure/PIDE/active.ML | 
| 50163 
c62ce309dc26
more abstract Sendback operations, with explicit id/exec_id properties;
 wenzelm parents: diff
changeset | 2 | Author: Makarius | 
| 
c62ce309dc26
more abstract Sendback operations, with explicit id/exec_id properties;
 wenzelm parents: diff
changeset | 3 | |
| 50450 
358b6020f8b6
generalized notion of active area, where sendback is just one application;
 wenzelm parents: 
50215diff
changeset | 4 | Active areas within the document (see also Tools/jEdit/src/active.scala). | 
| 50163 
c62ce309dc26
more abstract Sendback operations, with explicit id/exec_id properties;
 wenzelm parents: diff
changeset | 5 | *) | 
| 
c62ce309dc26
more abstract Sendback operations, with explicit id/exec_id properties;
 wenzelm parents: diff
changeset | 6 | |
| 50450 
358b6020f8b6
generalized notion of active area, where sendback is just one application;
 wenzelm parents: 
50215diff
changeset | 7 | signature ACTIVE = | 
| 50163 
c62ce309dc26
more abstract Sendback operations, with explicit id/exec_id properties;
 wenzelm parents: diff
changeset | 8 | sig | 
| 50450 
358b6020f8b6
generalized notion of active area, where sendback is just one application;
 wenzelm parents: 
50215diff
changeset | 9 |   val make_markup: string -> {implicit: bool, properties: Properties.T} -> Markup.T
 | 
| 
358b6020f8b6
generalized notion of active area, where sendback is just one application;
 wenzelm parents: 
50215diff
changeset | 10 | val markup_implicit: string -> string -> string | 
| 
358b6020f8b6
generalized notion of active area, where sendback is just one application;
 wenzelm parents: 
50215diff
changeset | 11 | val markup: string -> string -> string | 
| 63518 | 12 | val sendback_markup_properties: Properties.T -> string -> string | 
| 13 | val sendback_markup_command: string -> string | |
| 50498 | 14 | val dialog: unit -> (string -> Markup.T) * string future | 
| 50505 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50504diff
changeset | 15 | val dialog_text: unit -> (string -> string) * string future | 
| 50500 
c94bba7906d2
identify dialogs via official serial and maintain as result message;
 wenzelm parents: 
50498diff
changeset | 16 | val dialog_result: serial -> string -> unit | 
| 50163 
c62ce309dc26
more abstract Sendback operations, with explicit id/exec_id properties;
 wenzelm parents: diff
changeset | 17 | end; | 
| 
c62ce309dc26
more abstract Sendback operations, with explicit id/exec_id properties;
 wenzelm parents: diff
changeset | 18 | |
| 50450 
358b6020f8b6
generalized notion of active area, where sendback is just one application;
 wenzelm parents: 
50215diff
changeset | 19 | structure Active: ACTIVE = | 
| 50163 
c62ce309dc26
more abstract Sendback operations, with explicit id/exec_id properties;
 wenzelm parents: diff
changeset | 20 | struct | 
| 
c62ce309dc26
more abstract Sendback operations, with explicit id/exec_id properties;
 wenzelm parents: diff
changeset | 21 | |
| 50498 | 22 | (* active markup *) | 
| 23 | ||
| 68829 | 24 | fun explicit_id () = Position.id_properties_of (Position.thread_data ()); | 
| 50498 | 25 | |
| 50450 
358b6020f8b6
generalized notion of active area, where sendback is just one application;
 wenzelm parents: 
50215diff
changeset | 26 | fun make_markup name {implicit, properties} =
 | 
| 
358b6020f8b6
generalized notion of active area, where sendback is just one application;
 wenzelm parents: 
50215diff
changeset | 27 | (name, []) | 
| 50498 | 28 | |> not implicit ? (fn markup => Markup.properties (explicit_id ()) markup) | 
| 50215 | 29 | |> Markup.properties properties; | 
| 50163 
c62ce309dc26
more abstract Sendback operations, with explicit id/exec_id properties;
 wenzelm parents: diff
changeset | 30 | |
| 50450 
358b6020f8b6
generalized notion of active area, where sendback is just one application;
 wenzelm parents: 
50215diff
changeset | 31 | fun markup_implicit name s = Markup.markup (make_markup name {implicit = true, properties = []}) s;
 | 
| 
358b6020f8b6
generalized notion of active area, where sendback is just one application;
 wenzelm parents: 
50215diff
changeset | 32 | fun markup name s = Markup.markup (make_markup name {implicit = false, properties = []}) s;
 | 
| 
358b6020f8b6
generalized notion of active area, where sendback is just one application;
 wenzelm parents: 
50215diff
changeset | 33 | |
| 63518 | 34 | fun sendback_markup_properties props s = | 
| 35 |   Markup.markup (make_markup Markup.sendbackN {implicit = false, properties = props}) s;
 | |
| 36 | ||
| 37 | fun sendback_markup_command s = | |
| 38 | sendback_markup_properties [Markup.padding_command] s; | |
| 50164 
77668b522ffe
some support for implicit senback, meaning that it uses the caret position instead of explicit command exec_id;
 wenzelm parents: 
50163diff
changeset | 39 | |
| 50498 | 40 | |
| 41 | (* dialog via document content *) | |
| 42 | ||
| 50500 
c94bba7906d2
identify dialogs via official serial and maintain as result message;
 wenzelm parents: 
50498diff
changeset | 43 | val dialogs = Synchronized.var "Active.dialogs" (Inttab.empty: string future Inttab.table); | 
| 50498 | 44 | |
| 45 | fun dialog () = | |
| 46 | let | |
| 50500 
c94bba7906d2
identify dialogs via official serial and maintain as result message;
 wenzelm parents: 
50498diff
changeset | 47 | val i = serial (); | 
| 
c94bba7906d2
identify dialogs via official serial and maintain as result message;
 wenzelm parents: 
50498diff
changeset | 48 | fun abort () = Synchronized.change dialogs (Inttab.delete_safe i); | 
| 66166 | 49 | val promise = Future.promise_name "dialog" abort : string future; | 
| 50500 
c94bba7906d2
identify dialogs via official serial and maintain as result message;
 wenzelm parents: 
50498diff
changeset | 50 | val _ = Synchronized.change dialogs (Inttab.update_new (i, promise)); | 
| 50504 | 51 | fun result_markup result = Markup.properties (explicit_id ()) (Markup.dialog i result); | 
| 52 | in (result_markup, promise) end; | |
| 50498 | 53 | |
| 50505 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50504diff
changeset | 54 | fun dialog_text () = | 
| 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50504diff
changeset | 55 | let val (markup, promise) = dialog () | 
| 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50504diff
changeset | 56 | in (fn s => Markup.markup (markup s) s, promise) end; | 
| 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50504diff
changeset | 57 | |
| 50500 
c94bba7906d2
identify dialogs via official serial and maintain as result message;
 wenzelm parents: 
50498diff
changeset | 58 | fun dialog_result i result = | 
| 50498 | 59 | Synchronized.change_result dialogs | 
| 50500 
c94bba7906d2
identify dialogs via official serial and maintain as result message;
 wenzelm parents: 
50498diff
changeset | 60 | (fn tab => (Inttab.lookup tab i, Inttab.delete_safe i tab)) | 
| 50498 | 61 | |> (fn NONE => () | SOME promise => Future.fulfill promise result); | 
| 62 | ||
| 50163 
c62ce309dc26
more abstract Sendback operations, with explicit id/exec_id properties;
 wenzelm parents: diff
changeset | 63 | end; | 
| 
c62ce309dc26
more abstract Sendback operations, with explicit id/exec_id properties;
 wenzelm parents: diff
changeset | 64 |