author | wenzelm |
Sat, 21 Nov 2015 20:13:52 +0100 | |
changeset 61728 | 5f5ff1eab407 |
parent 52697 | 6fb98a20c349 |
child 63518 | ae8fd6fe63a1 |
permissions | -rw-r--r-- |
50450
358b6020f8b6
generalized notion of active area, where sendback is just one application;
wenzelm
parents:
50215
diff
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:
50215
diff
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:
50215
diff
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:
50215
diff
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:
50215
diff
changeset
|
10 |
val markup_implicit: string -> string -> string |
358b6020f8b6
generalized notion of active area, where sendback is just one application;
wenzelm
parents:
50215
diff
changeset
|
11 |
val markup: string -> string -> string |
52697
6fb98a20c349
explicit padding on command boundary for "auto" generated sendback -- do not replace the corresponding goal command, but append to it;
wenzelm
parents:
50505
diff
changeset
|
12 |
val sendback_markup: Properties.T -> string -> string |
50498 | 13 |
val dialog: unit -> (string -> Markup.T) * string future |
50505
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
wenzelm
parents:
50504
diff
changeset
|
14 |
val dialog_text: unit -> (string -> string) * string future |
50500
c94bba7906d2
identify dialogs via official serial and maintain as result message;
wenzelm
parents:
50498
diff
changeset
|
15 |
val dialog_result: serial -> string -> unit |
50163
c62ce309dc26
more abstract Sendback operations, with explicit id/exec_id properties;
wenzelm
parents:
diff
changeset
|
16 |
end; |
c62ce309dc26
more abstract Sendback operations, with explicit id/exec_id properties;
wenzelm
parents:
diff
changeset
|
17 |
|
50450
358b6020f8b6
generalized notion of active area, where sendback is just one application;
wenzelm
parents:
50215
diff
changeset
|
18 |
structure Active: ACTIVE = |
50163
c62ce309dc26
more abstract Sendback operations, with explicit id/exec_id properties;
wenzelm
parents:
diff
changeset
|
19 |
struct |
c62ce309dc26
more abstract Sendback operations, with explicit id/exec_id properties;
wenzelm
parents:
diff
changeset
|
20 |
|
50498 | 21 |
(* active markup *) |
22 |
||
23 |
fun explicit_id () = |
|
24 |
(case Position.get_id (Position.thread_data ()) of |
|
25 |
SOME id => [(Markup.idN, id)] |
|
26 |
| NONE => []); |
|
27 |
||
50450
358b6020f8b6
generalized notion of active area, where sendback is just one application;
wenzelm
parents:
50215
diff
changeset
|
28 |
fun make_markup name {implicit, properties} = |
358b6020f8b6
generalized notion of active area, where sendback is just one application;
wenzelm
parents:
50215
diff
changeset
|
29 |
(name, []) |
50498 | 30 |
|> not implicit ? (fn markup => Markup.properties (explicit_id ()) markup) |
50215 | 31 |
|> Markup.properties properties; |
50163
c62ce309dc26
more abstract Sendback operations, with explicit id/exec_id properties;
wenzelm
parents:
diff
changeset
|
32 |
|
50450
358b6020f8b6
generalized notion of active area, where sendback is just one application;
wenzelm
parents:
50215
diff
changeset
|
33 |
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:
50215
diff
changeset
|
34 |
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:
50215
diff
changeset
|
35 |
|
52697
6fb98a20c349
explicit padding on command boundary for "auto" generated sendback -- do not replace the corresponding goal command, but append to it;
wenzelm
parents:
50505
diff
changeset
|
36 |
fun sendback_markup props = |
6fb98a20c349
explicit padding on command boundary for "auto" generated sendback -- do not replace the corresponding goal command, but append to it;
wenzelm
parents:
50505
diff
changeset
|
37 |
Markup.markup (make_markup Markup.sendbackN {implicit = false, properties = props}); |
50164
77668b522ffe
some support for implicit senback, meaning that it uses the caret position instead of explicit command exec_id;
wenzelm
parents:
50163
diff
changeset
|
38 |
|
50498 | 39 |
|
40 |
(* dialog via document content *) |
|
41 |
||
50500
c94bba7906d2
identify dialogs via official serial and maintain as result message;
wenzelm
parents:
50498
diff
changeset
|
42 |
val dialogs = Synchronized.var "Active.dialogs" (Inttab.empty: string future Inttab.table); |
50498 | 43 |
|
44 |
fun dialog () = |
|
45 |
let |
|
50500
c94bba7906d2
identify dialogs via official serial and maintain as result message;
wenzelm
parents:
50498
diff
changeset
|
46 |
val i = serial (); |
c94bba7906d2
identify dialogs via official serial and maintain as result message;
wenzelm
parents:
50498
diff
changeset
|
47 |
fun abort () = Synchronized.change dialogs (Inttab.delete_safe i); |
50498 | 48 |
val promise = Future.promise abort : string future; |
50500
c94bba7906d2
identify dialogs via official serial and maintain as result message;
wenzelm
parents:
50498
diff
changeset
|
49 |
val _ = Synchronized.change dialogs (Inttab.update_new (i, promise)); |
50504 | 50 |
fun result_markup result = Markup.properties (explicit_id ()) (Markup.dialog i result); |
51 |
in (result_markup, promise) end; |
|
50498 | 52 |
|
50505
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
wenzelm
parents:
50504
diff
changeset
|
53 |
fun dialog_text () = |
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
wenzelm
parents:
50504
diff
changeset
|
54 |
let val (markup, promise) = dialog () |
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
wenzelm
parents:
50504
diff
changeset
|
55 |
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:
50504
diff
changeset
|
56 |
|
50500
c94bba7906d2
identify dialogs via official serial and maintain as result message;
wenzelm
parents:
50498
diff
changeset
|
57 |
fun dialog_result i result = |
50498 | 58 |
Synchronized.change_result dialogs |
50500
c94bba7906d2
identify dialogs via official serial and maintain as result message;
wenzelm
parents:
50498
diff
changeset
|
59 |
(fn tab => (Inttab.lookup tab i, Inttab.delete_safe i tab)) |
50498 | 60 |
|> (fn NONE => () | SOME promise => Future.fulfill promise result); |
61 |
||
50163
c62ce309dc26
more abstract Sendback operations, with explicit id/exec_id properties;
wenzelm
parents:
diff
changeset
|
62 |
end; |
c62ce309dc26
more abstract Sendback operations, with explicit id/exec_id properties;
wenzelm
parents:
diff
changeset
|
63 |