| author | wenzelm | 
| Wed, 02 Apr 2014 17:47:56 +0200 | |
| changeset 56368 | 0646f63a02b7 | 
| parent 56314 | 9a513737a0b2 | 
| child 56373 | 0605d90be6fc | 
| permissions | -rw-r--r-- | 
| 
52971
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
1  | 
/* Title: Tools/jEdit/src/jedit_editor.scala  | 
| 
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
2  | 
Author: Makarius  | 
| 
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
3  | 
|
| 
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
4  | 
PIDE editor operations for jEdit.  | 
| 
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
5  | 
*/  | 
| 
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
6  | 
|
| 
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
7  | 
package isabelle.jedit  | 
| 
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
8  | 
|
| 
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
9  | 
|
| 
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
10  | 
import isabelle._  | 
| 
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
11  | 
|
| 
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
12  | 
|
| 54706 | 13  | 
import java.io.{File => JFile}
 | 
14  | 
||
| 
52971
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
15  | 
import org.gjt.sp.jedit.{jEdit, View}
 | 
| 54706 | 16  | 
import org.gjt.sp.jedit.browser.VFSBrowser  | 
| 
52971
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
17  | 
|
| 
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
18  | 
|
| 
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
19  | 
class JEdit_Editor extends Editor[View]  | 
| 
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
20  | 
{
 | 
| 
52977
 
15254e32d299
central management of Document.Overlays, independent of Document_Model;
 
wenzelm 
parents: 
52974 
diff
changeset
 | 
21  | 
/* session */  | 
| 
 
15254e32d299
central management of Document.Overlays, independent of Document_Model;
 
wenzelm 
parents: 
52974 
diff
changeset
 | 
22  | 
|
| 52980 | 23  | 
override def session: Session = PIDE.session  | 
| 
52971
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
24  | 
|
| 52980 | 25  | 
override def flush()  | 
| 52974 | 26  | 
  {
 | 
27  | 
Swing_Thread.require()  | 
|
28  | 
||
| 55783 | 29  | 
val doc_blobs = PIDE.document_blobs()  | 
30  | 
val edits = PIDE.document_models().flatMap(_.flushed_edits(doc_blobs))  | 
|
31  | 
if (!edits.isEmpty) session.update(doc_blobs, edits)  | 
|
| 52974 | 32  | 
}  | 
33  | 
||
| 54461 | 34  | 
private val delay_flush =  | 
35  | 
    Swing_Thread.delay_last(PIDE.options.seconds("editor_input_delay")) { flush() }
 | 
|
36  | 
||
37  | 
  def invoke(): Unit = Swing_Thread.require { delay_flush.invoke() }
 | 
|
38  | 
||
| 
52977
 
15254e32d299
central management of Document.Overlays, independent of Document_Model;
 
wenzelm 
parents: 
52974 
diff
changeset
 | 
39  | 
|
| 
 
15254e32d299
central management of Document.Overlays, independent of Document_Model;
 
wenzelm 
parents: 
52974 
diff
changeset
 | 
40  | 
/* current situation */  | 
| 
 
15254e32d299
central management of Document.Overlays, independent of Document_Model;
 
wenzelm 
parents: 
52974 
diff
changeset
 | 
41  | 
|
| 52980 | 42  | 
override def current_context: View =  | 
| 
52971
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
43  | 
    Swing_Thread.require { jEdit.getActiveView() }
 | 
| 
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
44  | 
|
| 52980 | 45  | 
override def current_node(view: View): Option[Document.Node.Name] =  | 
| 52973 | 46  | 
    Swing_Thread.require { PIDE.document_model(view.getBuffer).map(_.node_name) }
 | 
| 
52971
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
47  | 
|
| 52980 | 48  | 
override def current_node_snapshot(view: View): Option[Document.Snapshot] =  | 
| 
52971
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
49  | 
    Swing_Thread.require { PIDE.document_model(view.getBuffer).map(_.snapshot()) }
 | 
| 
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
50  | 
|
| 52980 | 51  | 
override def node_snapshot(name: Document.Node.Name): Document.Snapshot =  | 
| 52974 | 52  | 
  {
 | 
53  | 
Swing_Thread.require()  | 
|
54  | 
||
55  | 
    JEdit_Lib.jedit_buffer(name.node) match {
 | 
|
56  | 
case Some(buffer) =>  | 
|
57  | 
        PIDE.document_model(buffer) match {
 | 
|
58  | 
case Some(model) => model.snapshot  | 
|
59  | 
case None => session.snapshot(name)  | 
|
60  | 
}  | 
|
61  | 
case None => session.snapshot(name)  | 
|
62  | 
}  | 
|
63  | 
}  | 
|
64  | 
||
| 
53844
 
71f103629327
skip ignored commands, similar to former proper_command_at (see d68ea01d5084) -- relevant to Output, Query_Operation etc.;
 
wenzelm 
parents: 
52980 
diff
changeset
 | 
65  | 
override def current_command(view: View, snapshot: Document.Snapshot): Option[Command] =  | 
| 
52971
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
66  | 
  {
 | 
| 
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
67  | 
Swing_Thread.require()  | 
| 
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
68  | 
|
| 
54325
 
2c4155003352
clarified Editor.current_command: allow outdated snapshot;
 
wenzelm 
parents: 
53845 
diff
changeset
 | 
69  | 
val text_area = view.getTextArea  | 
| 54528 | 70  | 
val buffer = view.getBuffer  | 
71  | 
||
| 
54325
 
2c4155003352
clarified Editor.current_command: allow outdated snapshot;
 
wenzelm 
parents: 
53845 
diff
changeset
 | 
72  | 
    PIDE.document_view(text_area) match {
 | 
| 
55432
 
9c53198dbb1c
maintain multiple command chunks and markup trees: for main chunk and loaded files;
 
wenzelm 
parents: 
54706 
diff
changeset
 | 
73  | 
case Some(doc_view) if doc_view.model.is_theory =>  | 
| 
54325
 
2c4155003352
clarified Editor.current_command: allow outdated snapshot;
 
wenzelm 
parents: 
53845 
diff
changeset
 | 
74  | 
val node = snapshot.version.nodes(doc_view.model.node_name)  | 
| 
 
2c4155003352
clarified Editor.current_command: allow outdated snapshot;
 
wenzelm 
parents: 
53845 
diff
changeset
 | 
75  | 
val caret = snapshot.revert(text_area.getCaretPosition)  | 
| 54528 | 76  | 
        if (caret < buffer.getLength) {
 | 
| 
54325
 
2c4155003352
clarified Editor.current_command: allow outdated snapshot;
 
wenzelm 
parents: 
53845 
diff
changeset
 | 
77  | 
val caret_commands = node.command_range(caret)  | 
| 
 
2c4155003352
clarified Editor.current_command: allow outdated snapshot;
 
wenzelm 
parents: 
53845 
diff
changeset
 | 
78  | 
          if (caret_commands.hasNext) {
 | 
| 
 
2c4155003352
clarified Editor.current_command: allow outdated snapshot;
 
wenzelm 
parents: 
53845 
diff
changeset
 | 
79  | 
val (cmd0, _) = caret_commands.next  | 
| 
 
2c4155003352
clarified Editor.current_command: allow outdated snapshot;
 
wenzelm 
parents: 
53845 
diff
changeset
 | 
80  | 
node.commands.reverse.iterator(cmd0).find(cmd => !cmd.is_ignored)  | 
| 
53844
 
71f103629327
skip ignored commands, similar to former proper_command_at (see d68ea01d5084) -- relevant to Output, Query_Operation etc.;
 
wenzelm 
parents: 
52980 
diff
changeset
 | 
81  | 
}  | 
| 
54325
 
2c4155003352
clarified Editor.current_command: allow outdated snapshot;
 
wenzelm 
parents: 
53845 
diff
changeset
 | 
82  | 
else None  | 
| 
 
2c4155003352
clarified Editor.current_command: allow outdated snapshot;
 
wenzelm 
parents: 
53845 
diff
changeset
 | 
83  | 
}  | 
| 
 
2c4155003352
clarified Editor.current_command: allow outdated snapshot;
 
wenzelm 
parents: 
53845 
diff
changeset
 | 
84  | 
else node.commands.reverse.iterator.find(cmd => !cmd.is_ignored)  | 
| 
55432
 
9c53198dbb1c
maintain multiple command chunks and markup trees: for main chunk and loaded files;
 
wenzelm 
parents: 
54706 
diff
changeset
 | 
85  | 
case _ =>  | 
| 54528 | 86  | 
        PIDE.document_model(buffer) match {
 | 
| 
54531
 
8330faaeebd5
restrict node_required status and Theories panel to actual theories;
 
wenzelm 
parents: 
54528 
diff
changeset
 | 
87  | 
case Some(model) if !model.is_theory =>  | 
| 56314 | 88  | 
            snapshot.version.nodes.load_commands(model.node_name) match {
 | 
| 54528 | 89  | 
case cmd :: _ => Some(cmd)  | 
90  | 
case Nil => None  | 
|
91  | 
}  | 
|
92  | 
case _ => None  | 
|
93  | 
}  | 
|
| 
52971
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
94  | 
}  | 
| 
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
95  | 
}  | 
| 
52977
 
15254e32d299
central management of Document.Overlays, independent of Document_Model;
 
wenzelm 
parents: 
52974 
diff
changeset
 | 
96  | 
|
| 
 
15254e32d299
central management of Document.Overlays, independent of Document_Model;
 
wenzelm 
parents: 
52974 
diff
changeset
 | 
97  | 
|
| 
 
15254e32d299
central management of Document.Overlays, independent of Document_Model;
 
wenzelm 
parents: 
52974 
diff
changeset
 | 
98  | 
/* overlays */  | 
| 
 
15254e32d299
central management of Document.Overlays, independent of Document_Model;
 
wenzelm 
parents: 
52974 
diff
changeset
 | 
99  | 
|
| 
 
15254e32d299
central management of Document.Overlays, independent of Document_Model;
 
wenzelm 
parents: 
52974 
diff
changeset
 | 
100  | 
private var overlays = Document.Overlays.empty  | 
| 
 
15254e32d299
central management of Document.Overlays, independent of Document_Model;
 
wenzelm 
parents: 
52974 
diff
changeset
 | 
101  | 
|
| 52980 | 102  | 
override def node_overlays(name: Document.Node.Name): Document.Node.Overlays =  | 
| 
52977
 
15254e32d299
central management of Document.Overlays, independent of Document_Model;
 
wenzelm 
parents: 
52974 
diff
changeset
 | 
103  | 
    synchronized { overlays(name) }
 | 
| 
 
15254e32d299
central management of Document.Overlays, independent of Document_Model;
 
wenzelm 
parents: 
52974 
diff
changeset
 | 
104  | 
|
| 52980 | 105  | 
override def insert_overlay(command: Command, fn: String, args: List[String]): Unit =  | 
| 
52977
 
15254e32d299
central management of Document.Overlays, independent of Document_Model;
 
wenzelm 
parents: 
52974 
diff
changeset
 | 
106  | 
    synchronized { overlays = overlays.insert(command, fn, args) }
 | 
| 
 
15254e32d299
central management of Document.Overlays, independent of Document_Model;
 
wenzelm 
parents: 
52974 
diff
changeset
 | 
107  | 
|
| 52980 | 108  | 
override def remove_overlay(command: Command, fn: String, args: List[String]): Unit =  | 
| 
52977
 
15254e32d299
central management of Document.Overlays, independent of Document_Model;
 
wenzelm 
parents: 
52974 
diff
changeset
 | 
109  | 
    synchronized { overlays = overlays.remove(command, fn, args) }
 | 
| 52980 | 110  | 
|
111  | 
||
| 55877 | 112  | 
/* navigation */  | 
| 52980 | 113  | 
|
| 55877 | 114  | 
def goto_file(view: View, name: String, line: Int = 0, column: Int = 0)  | 
| 52980 | 115  | 
  {
 | 
116  | 
Swing_Thread.require()  | 
|
117  | 
||
| 54706 | 118  | 
    JEdit_Lib.jedit_buffer(name) match {
 | 
| 52980 | 119  | 
case Some(buffer) =>  | 
120  | 
view.goToBuffer(buffer)  | 
|
121  | 
val text_area = view.getTextArea  | 
|
122  | 
||
123  | 
        try {
 | 
|
124  | 
val line_start = text_area.getBuffer.getLineStartOffset(line - 1)  | 
|
125  | 
text_area.moveCaretPosition(line_start)  | 
|
126  | 
if (column > 0) text_area.moveCaretPosition(line_start + column - 1)  | 
|
127  | 
}  | 
|
128  | 
        catch {
 | 
|
129  | 
case _: ArrayIndexOutOfBoundsException =>  | 
|
130  | 
case _: IllegalArgumentException =>  | 
|
131  | 
}  | 
|
132  | 
||
| 54706 | 133  | 
case None if (new JFile(name)).isDirectory =>  | 
134  | 
VFSBrowser.browseDirectory(view, name)  | 
|
135  | 
||
| 52980 | 136  | 
case None =>  | 
137  | 
val args =  | 
|
| 54706 | 138  | 
if (line <= 0) Array(name)  | 
139  | 
else if (column <= 0) Array(name, "+line:" + line.toInt)  | 
|
140  | 
else Array(name, "+line:" + line.toInt + "," + column.toInt)  | 
|
| 52980 | 141  | 
jEdit.openFiles(view, null, args)  | 
142  | 
}  | 
|
143  | 
}  | 
|
144  | 
||
| 55877 | 145  | 
|
146  | 
/* hyperlinks */  | 
|
147  | 
||
| 
55884
 
f2c0eaedd579
tuned signature -- emphasize symbol positions (prover) vs. decoded text offsets (editor);
 
wenzelm 
parents: 
55879 
diff
changeset
 | 
148  | 
override def hyperlink_command(  | 
| 
 
f2c0eaedd579
tuned signature -- emphasize symbol positions (prover) vs. decoded text offsets (editor);
 
wenzelm 
parents: 
55879 
diff
changeset
 | 
149  | 
snapshot: Document.Snapshot, command: Command, offset: Symbol.Offset = 0): Option[Hyperlink] =  | 
| 52980 | 150  | 
  {
 | 
151  | 
if (snapshot.is_outdated) None  | 
|
152  | 
    else {
 | 
|
153  | 
      snapshot.state.find_command(snapshot.version, command.id) match {
 | 
|
154  | 
case None => None  | 
|
155  | 
case Some((node, _)) =>  | 
|
156  | 
val file_name = command.node_name.node  | 
|
157  | 
val sources =  | 
|
158  | 
node.commands.iterator.takeWhile(_ != command).map(_.source) ++  | 
|
| 
55884
 
f2c0eaedd579
tuned signature -- emphasize symbol positions (prover) vs. decoded text offsets (editor);
 
wenzelm 
parents: 
55879 
diff
changeset
 | 
159  | 
(if (offset == 0) Iterator.empty  | 
| 
 
f2c0eaedd579
tuned signature -- emphasize symbol positions (prover) vs. decoded text offsets (editor);
 
wenzelm 
parents: 
55879 
diff
changeset
 | 
160  | 
else Iterator.single(command.source(Text.Range(0, command.decode(offset)))))  | 
| 52980 | 161  | 
val (line, column) = ((1, 1) /: sources)(Symbol.advance_line_column)  | 
| 55877 | 162  | 
          Some(new Hyperlink { def follow(view: View) { goto_file(view, file_name, line, column) } })
 | 
| 52980 | 163  | 
}  | 
164  | 
}  | 
|
165  | 
}  | 
|
| 55876 | 166  | 
|
167  | 
def hyperlink_command_id(  | 
|
168  | 
snapshot: Document.Snapshot,  | 
|
169  | 
id: Document_ID.Generic,  | 
|
| 
55884
 
f2c0eaedd579
tuned signature -- emphasize symbol positions (prover) vs. decoded text offsets (editor);
 
wenzelm 
parents: 
55879 
diff
changeset
 | 
170  | 
offset: Symbol.Offset): Option[Hyperlink] =  | 
| 55876 | 171  | 
  {
 | 
172  | 
    snapshot.state.find_command(snapshot.version, id) match {
 | 
|
| 
55884
 
f2c0eaedd579
tuned signature -- emphasize symbol positions (prover) vs. decoded text offsets (editor);
 
wenzelm 
parents: 
55879 
diff
changeset
 | 
173  | 
case Some((node, command)) => hyperlink_command(snapshot, command, offset)  | 
| 55876 | 174  | 
case None => None  | 
175  | 
}  | 
|
176  | 
}  | 
|
177  | 
||
178  | 
def hyperlink_file(name: String, line: Int = 0, column: Int = 0): Hyperlink =  | 
|
| 55877 | 179  | 
    new Hyperlink { def follow(view: View) = goto_file(view, name, line, column) }
 | 
| 55876 | 180  | 
|
| 
55884
 
f2c0eaedd579
tuned signature -- emphasize symbol positions (prover) vs. decoded text offsets (editor);
 
wenzelm 
parents: 
55879 
diff
changeset
 | 
181  | 
def hyperlink_source_file(source_name: String, line: Int, offset: Symbol.Offset)  | 
| 55878 | 182  | 
: Option[Hyperlink] =  | 
183  | 
  {
 | 
|
| 
55879
 
ac979f750c1a
clarified path checks: avoid crash of rendering due to spurious errors;
 
wenzelm 
parents: 
55878 
diff
changeset
 | 
184  | 
    if (Path.is_valid(source_name)) {
 | 
| 55878 | 185  | 
      Isabelle_System.source_file(Path.explode(source_name)) match {
 | 
186  | 
case Some(path) =>  | 
|
187  | 
val name = Isabelle_System.platform_path(path)  | 
|
188  | 
          JEdit_Lib.jedit_buffer(name) match {
 | 
|
| 
55884
 
f2c0eaedd579
tuned signature -- emphasize symbol positions (prover) vs. decoded text offsets (editor);
 
wenzelm 
parents: 
55879 
diff
changeset
 | 
189  | 
case Some(buffer) if offset > 0 =>  | 
| 55878 | 190  | 
val (line, column) =  | 
191  | 
                JEdit_Lib.buffer_lock(buffer) {
 | 
|
192  | 
((1, 1) /:  | 
|
193  | 
(Symbol.iterator(JEdit_Lib.buffer_text(buffer)).  | 
|
| 
55884
 
f2c0eaedd579
tuned signature -- emphasize symbol positions (prover) vs. decoded text offsets (editor);
 
wenzelm 
parents: 
55879 
diff
changeset
 | 
194  | 
zipWithIndex.takeWhile(p => p._2 < offset - 1).map(_._1)))(  | 
| 55878 | 195  | 
Symbol.advance_line_column)  | 
196  | 
}  | 
|
197  | 
Some(hyperlink_file(name, line, column))  | 
|
198  | 
case _ => Some(hyperlink_file(name, line))  | 
|
199  | 
}  | 
|
200  | 
case None => None  | 
|
201  | 
}  | 
|
202  | 
}  | 
|
| 55876 | 203  | 
else None  | 
| 55878 | 204  | 
}  | 
| 55876 | 205  | 
|
206  | 
def hyperlink_url(name: String): Hyperlink =  | 
|
207  | 
    new Hyperlink {
 | 
|
208  | 
def follow(view: View) =  | 
|
209  | 
default_thread_pool.submit(() =>  | 
|
210  | 
          try { Isabelle_System.open(name) }
 | 
|
211  | 
          catch {
 | 
|
212  | 
case exn: Throwable =>  | 
|
213  | 
GUI.error_dialog(view, "System error", GUI.scrollable_text(Exn.message(exn)))  | 
|
214  | 
})  | 
|
215  | 
}  | 
|
| 
52971
 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 
wenzelm 
parents:  
diff
changeset
 | 
216  | 
}  |