author | wenzelm |
Mon, 01 Mar 2021 22:22:12 +0100 | |
changeset 73340 | 0ffcad1f6130 |
parent 71775 | 291c46bf3000 |
child 73367 | 77ef8bef0593 |
permissions | -rw-r--r-- |
50450
358b6020f8b6
generalized notion of active area, where sendback is just one application;
wenzelm
parents:
50341
diff
changeset
|
1 |
/* Title: Tools/jEdit/src/active.scala |
49492 | 2 |
Author: Makarius |
3 |
||
50450
358b6020f8b6
generalized notion of active area, where sendback is just one application;
wenzelm
parents:
50341
diff
changeset
|
4 |
Active areas within the document. |
49492 | 5 |
*/ |
6 |
||
7 |
package isabelle.jedit |
|
8 |
||
9 |
||
10 |
import isabelle._ |
|
71742
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
11 |
import org.gjt.sp.jedit.{ServiceManager, View} |
49492 | 12 |
|
13 |
||
50450
358b6020f8b6
generalized notion of active area, where sendback is just one application;
wenzelm
parents:
50341
diff
changeset
|
14 |
object Active |
49492 | 15 |
{ |
71742
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
16 |
abstract class Handler |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
17 |
{ |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
18 |
def handle( |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
19 |
view: View, text: String, elem: XML.Elem, |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
20 |
doc_view: Document_View, snapshot: Document.Snapshot): Boolean |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
21 |
} |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
22 |
|
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
23 |
def handlers: List[Handler] = |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
24 |
ServiceManager.getServiceNames(classOf[Handler]).toList |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
25 |
.map(ServiceManager.getService(classOf[Handler], _)) |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
26 |
|
73340 | 27 |
def action(view: View, text: String, elem: XML.Elem): Unit = |
49492 | 28 |
{ |
57612
990ffb84489b
clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents:
57594
diff
changeset
|
29 |
GUI_Thread.require {} |
49492 | 30 |
|
64882 | 31 |
Document_View.get(view.getTextArea) match { |
49492 | 32 |
case Some(doc_view) => |
71775 | 33 |
doc_view.rich_text_area.robust_body(()) { |
71742
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
34 |
val snapshot = doc_view.model.snapshot() |
50164
77668b522ffe
some support for implicit senback, meaning that it uses the caret position instead of explicit command exec_id;
wenzelm
parents:
49493
diff
changeset
|
35 |
if (!snapshot.is_outdated) { |
71742
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
36 |
handlers.find(_.handle(view, text, elem, doc_view, snapshot)) |
49492 | 37 |
} |
38 |
} |
|
39 |
case None => |
|
40 |
} |
|
41 |
} |
|
71742
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
42 |
|
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
43 |
class Misc_Handler extends Active.Handler |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
44 |
{ |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
45 |
override def handle( |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
46 |
view: View, text: String, elem: XML.Elem, |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
47 |
doc_view: Document_View, snapshot: Document.Snapshot): Boolean = |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
48 |
{ |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
49 |
val text_area = doc_view.text_area |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
50 |
val model = doc_view.model |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
51 |
val buffer = model.buffer |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
52 |
|
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
53 |
elem match { |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
54 |
case XML.Elem(Markup(Markup.BROWSER, _), body) => |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
55 |
Isabelle_Thread.fork(name = "browser") { |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
56 |
val graph_file = Isabelle_System.tmp_file("graph") |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
57 |
File.write(graph_file, XML.content(body)) |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
58 |
Isabelle_System.bash("isabelle browser -c " + File.bash_path(graph_file) + " &") |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
59 |
} |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
60 |
true |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
61 |
|
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
62 |
case XML.Elem(Markup(Markup.THEORY_EXPORTS, props), _) => |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
63 |
GUI_Thread.later { |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
64 |
val name = Markup.Name.unapply(props) getOrElse "" |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
65 |
PIDE.editor.hyperlink_file(true, Isabelle_Export.vfs_prefix + name).follow(view) |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
66 |
} |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
67 |
true |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
68 |
|
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
69 |
case XML.Elem(Markup(Markup.JEDIT_ACTION, _), body) => |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
70 |
GUI_Thread.later { |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
71 |
view.getInputHandler.invokeAction(XML.content(body)) |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
72 |
} |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
73 |
true |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
74 |
|
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
75 |
case XML.Elem(Markup(Markup.SIMP_TRACE_PANEL, props), _) => |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
76 |
val link = |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
77 |
props match { |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
78 |
case Position.Id(id) => PIDE.editor.hyperlink_command(true, snapshot, id) |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
79 |
case _ => None |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
80 |
} |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
81 |
GUI_Thread.later { |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
82 |
link.foreach(_.follow(view)) |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
83 |
view.getDockableWindowManager.showDockableWindow("isabelle-simplifier-trace") |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
84 |
} |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
85 |
true |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
86 |
|
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
87 |
case XML.Elem(Markup(Markup.SENDBACK, props), _) => |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
88 |
if (buffer.isEditable) { |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
89 |
props match { |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
90 |
case Position.Id(id) => |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
91 |
Isabelle.edit_command(snapshot, text_area, |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
92 |
props.contains(Markup.PADDING_COMMAND), id, text) |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
93 |
case _ => |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
94 |
if (props.contains(Markup.PADDING_LINE)) |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
95 |
Isabelle.insert_line_padding(text_area, text) |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
96 |
else text_area.setSelectedText(text) |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
97 |
} |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
98 |
text_area.requestFocus |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
99 |
} |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
100 |
true |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
101 |
|
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
102 |
case Protocol.Dialog(id, serial, result) => |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
103 |
model.session.dialog_result(id, serial, result) |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
104 |
true |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
105 |
|
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
106 |
case _ => false |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
107 |
} |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
108 |
} |
de37910974da
avoid hard-wired stuff: configure via plugin services;
wenzelm
parents:
71692
diff
changeset
|
109 |
} |
49492 | 110 |
} |