| author | wenzelm | 
| Tue, 11 Aug 2015 20:21:13 +0200 | |
| changeset 60898 | a3fcde62df10 | 
| parent 60835 | 6512bb0b1ff4 | 
| child 60910 | 79abcf48c377 | 
| permissions | -rw-r--r-- | 
| 43282 
5d294220ca43
moved sources -- eliminated Netbeans artifact of jedit package directory;
 wenzelm parents: 
41537diff
changeset | 1 | /* Title: Tools/jEdit/src/plugin.scala | 
| 36760 | 2 | Author: Makarius | 
| 3 | ||
| 50362 | 4 | Main plumbing for PIDE infrastructure as jEdit plugin. | 
| 36760 | 5 | */ | 
| 34407 | 6 | |
| 34318 
c13e168a8ae6
original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
 wenzelm parents: diff
changeset | 7 | package isabelle.jedit | 
| 
c13e168a8ae6
original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
 wenzelm parents: diff
changeset | 8 | |
| 34429 | 9 | |
| 36015 | 10 | import isabelle._ | 
| 11 | ||
| 44573 
51f8895b9ad9
some dialog for auto loading of required files (still inactive);
 wenzelm parents: 
44434diff
changeset | 12 | import javax.swing.JOptionPane | 
| 34318 
c13e168a8ae6
original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
 wenzelm parents: diff
changeset | 13 | |
| 49246 | 14 | import scala.swing.{ListView, ScrollPane}
 | 
| 34406 
f81cd75ae331
restructured: independent provers in different buffers
 immler@in.tum.de parents: 
34337diff
changeset | 15 | |
| 60205 
9ee125c3bff7
avoid auto-load dialog while exit/closeAllBuffers is active: the perspective manager happens to indicate this precisely in jEdit 5.2.0;
 wenzelm parents: 
60075diff
changeset | 16 | import org.gjt.sp.jedit.{jEdit, EBMessage, EBPlugin, Buffer, View, Debug, PerspectiveManager}
 | 
| 53487 | 17 | import org.jedit.options.CombinedOptions | 
| 18 | import org.gjt.sp.jedit.gui.AboutDialog | |
| 39043 | 19 | import org.gjt.sp.jedit.textarea.{JEditTextArea, TextArea}
 | 
| 59077 
7e0d3da6e6d8
node-specific syntax, with base_syntax as default;
 wenzelm parents: 
58928diff
changeset | 20 | import org.gjt.sp.jedit.buffer.JEditBuffer | 
| 50362 | 21 | import org.gjt.sp.jedit.syntax.ModeProvider | 
| 49100 
e7aecf2a5fc4
prefer old startup dialog scheme (cf. 514bb82514df);
 wenzelm parents: 
49099diff
changeset | 22 | import org.gjt.sp.jedit.msg.{EditorStarted, BufferUpdate, EditPaneUpdate, PropertiesChanged}
 | 
| 34429 | 23 | |
| 43443 
5d9693c2337e
basic support for extended syntax styles: sub/superscript;
 wenzelm parents: 
43390diff
changeset | 24 | import org.gjt.sp.util.SyntaxUtilities | 
| 39241 | 25 | |
| 34318 
c13e168a8ae6
original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
 wenzelm parents: diff
changeset | 26 | |
| 50205 | 27 | object PIDE | 
| 34618 | 28 | {
 | 
| 34784 
02959dcea756
split Theory_View into Document_Model (connected to Buffer) and Document_View (connected to JEditTextArea);
 wenzelm parents: 
34782diff
changeset | 29 | /* plugin instance */ | 
| 
02959dcea756
split Theory_View into Document_Model (connected to Buffer) and Document_View (connected to JEditTextArea);
 wenzelm parents: 
34782diff
changeset | 30 | |
| 49245 
cb70157293c0
manage Isabelle/jEdit options as Isabelle/Scala options (with persistent preferences);
 wenzelm parents: 
49195diff
changeset | 31 | val options = new JEdit_Options | 
| 53337 
b3817a0e3211
sort items according to persistent history of frequency of use;
 wenzelm parents: 
53277diff
changeset | 32 | val completion_history = new Completion.History_Variable | 
| 56558 
05c833d402bc
tuned signature -- explicit Spell_Checker_Variable;
 wenzelm parents: 
56557diff
changeset | 33 | val spell_checker = new Spell_Checker_Variable | 
| 49245 
cb70157293c0
manage Isabelle/jEdit options as Isabelle/Scala options (with persistent preferences);
 wenzelm parents: 
49195diff
changeset | 34 | |
| 49099 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 35 | @volatile var startup_failure: Option[Throwable] = None | 
| 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 36 | @volatile var startup_notified = false | 
| 34784 
02959dcea756
split Theory_View into Document_Model (connected to Buffer) and Document_View (connected to JEditTextArea);
 wenzelm parents: 
34782diff
changeset | 37 | |
| 49101 
21c8d2070be9
continue with more robust dummy session after failed startup;
 wenzelm parents: 
49100diff
changeset | 38 | @volatile var plugin: Plugin = null | 
| 60835 | 39 | @volatile var session: Session = new Session(JEdit_Resources.empty) | 
| 49101 
21c8d2070be9
continue with more robust dummy session after failed startup;
 wenzelm parents: 
49100diff
changeset | 40 | |
| 55791 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 41 |   def options_changed() { plugin.options_changed() }
 | 
| 56316 
b1cf8ddc2e04
propagate deps_changed, to resolve missing files without requiring jEdit events (e.g. buffer load/save);
 wenzelm parents: 
56208diff
changeset | 42 |   def deps_changed() { plugin.deps_changed() }
 | 
| 52815 
eaad5fe7bb1b
actions and shortcuts to change node_required status, with painter that looks like CheckBox (non-clickable);
 wenzelm parents: 
52807diff
changeset | 43 | |
| 56208 | 44 | def resources(): JEdit_Resources = | 
| 45 | session.resources.asInstanceOf[JEdit_Resources] | |
| 44955 | 46 | |
| 52971 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 wenzelm parents: 
52876diff
changeset | 47 | lazy val editor = new JEdit_Editor | 
| 
31926d2c04ee
tuned signature -- more abstract PIDE editor operations;
 wenzelm parents: 
52876diff
changeset | 48 | |
| 34784 
02959dcea756
split Theory_View into Document_Model (connected to Buffer) and Document_View (connected to JEditTextArea);
 wenzelm parents: 
34782diff
changeset | 49 | |
| 53244 | 50 | /* popups */ | 
| 51 | ||
| 52 | def dismissed_popups(view: View): Boolean = | |
| 53 |   {
 | |
| 53272 | 54 | var dismissed = false | 
| 55 | ||
| 53274 
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
 wenzelm parents: 
53272diff
changeset | 56 | JEdit_Lib.jedit_text_areas(view).foreach(text_area => | 
| 
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
 wenzelm parents: 
53272diff
changeset | 57 | if (Completion_Popup.Text_Area.dismissed(text_area)) dismissed = true) | 
| 53272 | 58 | |
| 59 | if (Pretty_Tooltip.dismissed_all()) dismissed = true | |
| 60 | ||
| 61 | dismissed | |
| 53244 | 62 | } | 
| 63 | ||
| 64 | ||
| 43449 | 65 | /* document model and view */ | 
| 66 | ||
| 59077 
7e0d3da6e6d8
node-specific syntax, with base_syntax as default;
 wenzelm parents: 
58928diff
changeset | 67 | def document_model(buffer: JEditBuffer): Option[Document_Model] = | 
| 
7e0d3da6e6d8
node-specific syntax, with base_syntax as default;
 wenzelm parents: 
58928diff
changeset | 68 |     buffer match {
 | 
| 
7e0d3da6e6d8
node-specific syntax, with base_syntax as default;
 wenzelm parents: 
58928diff
changeset | 69 | case b: Buffer => Document_Model(b) | 
| 
7e0d3da6e6d8
node-specific syntax, with base_syntax as default;
 wenzelm parents: 
58928diff
changeset | 70 | case _ => None | 
| 
7e0d3da6e6d8
node-specific syntax, with base_syntax as default;
 wenzelm parents: 
58928diff
changeset | 71 | } | 
| 53274 
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
 wenzelm parents: 
53272diff
changeset | 72 | |
| 55712 | 73 | def document_view(text_area: TextArea): Option[Document_View] = Document_View(text_area) | 
| 43449 | 74 | |
| 44379 | 75 | def document_views(buffer: Buffer): List[Document_View] = | 
| 76 |     for {
 | |
| 49406 | 77 | text_area <- JEdit_Lib.jedit_text_areas(buffer).toList | 
| 54529 | 78 | doc_view <- document_view(text_area) | 
| 79 | } yield doc_view | |
| 44379 | 80 | |
| 54522 | 81 | def document_models(): List[Document_Model] = | 
| 82 |     for {
 | |
| 83 | buffer <- JEdit_Lib.jedit_buffers().toList | |
| 84 | model <- document_model(buffer) | |
| 85 | } yield model | |
| 86 | ||
| 87 | def document_blobs(): Document.Blobs = | |
| 55783 | 88 | Document.Blobs( | 
| 89 |       (for {
 | |
| 90 | buffer <- JEdit_Lib.jedit_buffers() | |
| 91 | model <- document_model(buffer) | |
| 92 | blob <- model.get_blob() | |
| 93 | } yield (model.node_name -> blob)).toMap) | |
| 54522 | 94 | |
| 50344 
608265769ce0
emit bulk edits on initialization of multiple buffers, which greatly improves performance when starting big sessions (e.g. JinjaThreads);
 wenzelm parents: 
50209diff
changeset | 95 | def exit_models(buffers: List[Buffer]) | 
| 47058 
34761733526c
refined init_model: allow change of buffer name as caused by "Save as", for example;
 wenzelm parents: 
46997diff
changeset | 96 |   {
 | 
| 57612 
990ffb84489b
clarified module name: facilitate alternative GUI frameworks;
 wenzelm parents: 
57611diff
changeset | 97 |     GUI_Thread.now {
 | 
| 54461 | 98 | PIDE.editor.flush() | 
| 50344 
608265769ce0
emit bulk edits on initialization of multiple buffers, which greatly improves performance when starting big sessions (e.g. JinjaThreads);
 wenzelm parents: 
50209diff
changeset | 99 | buffers.foreach(buffer => | 
| 
608265769ce0
emit bulk edits on initialization of multiple buffers, which greatly improves performance when starting big sessions (e.g. JinjaThreads);
 wenzelm parents: 
50209diff
changeset | 100 |         JEdit_Lib.buffer_lock(buffer) {
 | 
| 
608265769ce0
emit bulk edits on initialization of multiple buffers, which greatly improves performance when starting big sessions (e.g. JinjaThreads);
 wenzelm parents: 
50209diff
changeset | 101 | JEdit_Lib.jedit_text_areas(buffer).foreach(Document_View.exit) | 
| 
608265769ce0
emit bulk edits on initialization of multiple buffers, which greatly improves performance when starting big sessions (e.g. JinjaThreads);
 wenzelm parents: 
50209diff
changeset | 102 | Document_Model.exit(buffer) | 
| 
608265769ce0
emit bulk edits on initialization of multiple buffers, which greatly improves performance when starting big sessions (e.g. JinjaThreads);
 wenzelm parents: 
50209diff
changeset | 103 | }) | 
| 
608265769ce0
emit bulk edits on initialization of multiple buffers, which greatly improves performance when starting big sessions (e.g. JinjaThreads);
 wenzelm parents: 
50209diff
changeset | 104 | } | 
| 47058 
34761733526c
refined init_model: allow change of buffer name as caused by "Save as", for example;
 wenzelm parents: 
46997diff
changeset | 105 | } | 
| 
34761733526c
refined init_model: allow change of buffer name as caused by "Save as", for example;
 wenzelm parents: 
46997diff
changeset | 106 | |
| 55791 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 107 | def init_models() | 
| 43510 
17d431c92575
init/exit model/view synchronously within the swing thread -- EditBus.send in jedit-4.4.1 always runs there;
 wenzelm parents: 
43487diff
changeset | 108 |   {
 | 
| 57612 
990ffb84489b
clarified module name: facilitate alternative GUI frameworks;
 wenzelm parents: 
57611diff
changeset | 109 |     GUI_Thread.now {
 | 
| 54461 | 110 | PIDE.editor.flush() | 
| 55791 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 111 | |
| 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 112 |       for {
 | 
| 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 113 | buffer <- JEdit_Lib.jedit_buffers() | 
| 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 114 | if buffer != null && !buffer.isLoading && !buffer.getBooleanProperty(Buffer.GZIPPED) | 
| 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 115 |       } {
 | 
| 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 116 |         JEdit_Lib.buffer_lock(buffer) {
 | 
| 56208 | 117 | val node_name = resources.node_name(buffer) | 
| 59077 
7e0d3da6e6d8
node-specific syntax, with base_syntax as default;
 wenzelm parents: 
58928diff
changeset | 118 | val model = Document_Model.init(session, buffer, node_name, document_model(buffer)) | 
| 55791 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 119 |           for {
 | 
| 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 120 | text_area <- JEdit_Lib.jedit_text_areas(buffer) | 
| 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 121 | if document_view(text_area).map(_.model) != Some(model) | 
| 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 122 | } Document_View.init(model, text_area) | 
| 43510 
17d431c92575
init/exit model/view synchronously within the swing thread -- EditBus.send in jedit-4.4.1 always runs there;
 wenzelm parents: 
43487diff
changeset | 123 | } | 
| 55791 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 124 | } | 
| 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 125 | |
| 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 126 | PIDE.editor.invoke() | 
| 43510 
17d431c92575
init/exit model/view synchronously within the swing thread -- EditBus.send in jedit-4.4.1 always runs there;
 wenzelm parents: 
43487diff
changeset | 127 | } | 
| 
17d431c92575
init/exit model/view synchronously within the swing thread -- EditBus.send in jedit-4.4.1 always runs there;
 wenzelm parents: 
43487diff
changeset | 128 | } | 
| 
17d431c92575
init/exit model/view synchronously within the swing thread -- EditBus.send in jedit-4.4.1 always runs there;
 wenzelm parents: 
43487diff
changeset | 129 | |
| 56774 | 130 | def init_view(buffer: Buffer, text_area: JEditTextArea): Unit = | 
| 57612 
990ffb84489b
clarified module name: facilitate alternative GUI frameworks;
 wenzelm parents: 
57611diff
changeset | 131 |     GUI_Thread.now {
 | 
| 56774 | 132 |       JEdit_Lib.buffer_lock(buffer) {
 | 
| 133 |         document_model(buffer) match {
 | |
| 134 | case Some(model) => Document_View.init(model, text_area) | |
| 135 | case None => | |
| 136 | } | |
| 43510 
17d431c92575
init/exit model/view synchronously within the swing thread -- EditBus.send in jedit-4.4.1 always runs there;
 wenzelm parents: 
43487diff
changeset | 137 | } | 
| 
17d431c92575
init/exit model/view synchronously within the swing thread -- EditBus.send in jedit-4.4.1 always runs there;
 wenzelm parents: 
43487diff
changeset | 138 | } | 
| 
17d431c92575
init/exit model/view synchronously within the swing thread -- EditBus.send in jedit-4.4.1 always runs there;
 wenzelm parents: 
43487diff
changeset | 139 | |
| 56774 | 140 | def exit_view(buffer: Buffer, text_area: JEditTextArea): Unit = | 
| 57612 
990ffb84489b
clarified module name: facilitate alternative GUI frameworks;
 wenzelm parents: 
57611diff
changeset | 141 |     GUI_Thread.now {
 | 
| 56774 | 142 |       JEdit_Lib.buffer_lock(buffer) {
 | 
| 143 | Document_View.exit(text_area) | |
| 144 | } | |
| 43510 
17d431c92575
init/exit model/view synchronously within the swing thread -- EditBus.send in jedit-4.4.1 always runs there;
 wenzelm parents: 
43487diff
changeset | 145 | } | 
| 55621 
8d69c15b6fb9
added PIDE.snapshot, PIDE.rendering for convenience;
 wenzelm parents: 
55618diff
changeset | 146 | |
| 
8d69c15b6fb9
added PIDE.snapshot, PIDE.rendering for convenience;
 wenzelm parents: 
55618diff
changeset | 147 | |
| 
8d69c15b6fb9
added PIDE.snapshot, PIDE.rendering for convenience;
 wenzelm parents: 
55618diff
changeset | 148 | /* current document content */ | 
| 
8d69c15b6fb9
added PIDE.snapshot, PIDE.rendering for convenience;
 wenzelm parents: 
55618diff
changeset | 149 | |
| 60272 
4f72b00d9952
no GUI_Thread for SideKick parsers (in contrast to 4c8205fe3644), to avoid danger of deadlock due to nested context switch;
 wenzelm parents: 
60215diff
changeset | 150 | def snapshot(view: View): Document.Snapshot = | 
| 55621 
8d69c15b6fb9
added PIDE.snapshot, PIDE.rendering for convenience;
 wenzelm parents: 
55618diff
changeset | 151 |   {
 | 
| 
8d69c15b6fb9
added PIDE.snapshot, PIDE.rendering for convenience;
 wenzelm parents: 
55618diff
changeset | 152 | val buffer = view.getBuffer | 
| 
8d69c15b6fb9
added PIDE.snapshot, PIDE.rendering for convenience;
 wenzelm parents: 
55618diff
changeset | 153 |     document_model(buffer) match {
 | 
| 
8d69c15b6fb9
added PIDE.snapshot, PIDE.rendering for convenience;
 wenzelm parents: 
55618diff
changeset | 154 | case Some(model) => model.snapshot | 
| 
8d69c15b6fb9
added PIDE.snapshot, PIDE.rendering for convenience;
 wenzelm parents: 
55618diff
changeset | 155 |       case None => error("No document model for current buffer")
 | 
| 
8d69c15b6fb9
added PIDE.snapshot, PIDE.rendering for convenience;
 wenzelm parents: 
55618diff
changeset | 156 | } | 
| 
8d69c15b6fb9
added PIDE.snapshot, PIDE.rendering for convenience;
 wenzelm parents: 
55618diff
changeset | 157 | } | 
| 
8d69c15b6fb9
added PIDE.snapshot, PIDE.rendering for convenience;
 wenzelm parents: 
55618diff
changeset | 158 | |
| 57612 
990ffb84489b
clarified module name: facilitate alternative GUI frameworks;
 wenzelm parents: 
57611diff
changeset | 159 | def rendering(view: View): Rendering = GUI_Thread.now | 
| 55621 
8d69c15b6fb9
added PIDE.snapshot, PIDE.rendering for convenience;
 wenzelm parents: 
55618diff
changeset | 160 |   {
 | 
| 
8d69c15b6fb9
added PIDE.snapshot, PIDE.rendering for convenience;
 wenzelm parents: 
55618diff
changeset | 161 | val text_area = view.getTextArea | 
| 
8d69c15b6fb9
added PIDE.snapshot, PIDE.rendering for convenience;
 wenzelm parents: 
55618diff
changeset | 162 |     document_view(text_area) match {
 | 
| 
8d69c15b6fb9
added PIDE.snapshot, PIDE.rendering for convenience;
 wenzelm parents: 
55618diff
changeset | 163 | case Some(doc_view) => doc_view.get_rendering() | 
| 
8d69c15b6fb9
added PIDE.snapshot, PIDE.rendering for convenience;
 wenzelm parents: 
55618diff
changeset | 164 |       case None => error("No document view for current text area")
 | 
| 
8d69c15b6fb9
added PIDE.snapshot, PIDE.rendering for convenience;
 wenzelm parents: 
55618diff
changeset | 165 | } | 
| 
8d69c15b6fb9
added PIDE.snapshot, PIDE.rendering for convenience;
 wenzelm parents: 
55618diff
changeset | 166 | } | 
| 34318 
c13e168a8ae6
original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
 wenzelm parents: diff
changeset | 167 | } | 
| 
c13e168a8ae6
original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
 wenzelm parents: diff
changeset | 168 | |
| 34429 | 169 | |
| 34618 | 170 | class Plugin extends EBPlugin | 
| 171 | {
 | |
| 56316 
b1cf8ddc2e04
propagate deps_changed, to resolve missing files without requiring jEdit events (e.g. buffer load/save);
 wenzelm parents: 
56208diff
changeset | 172 | /* global changes */ | 
| 55791 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 173 | |
| 56316 
b1cf8ddc2e04
propagate deps_changed, to resolve missing files without requiring jEdit events (e.g. buffer load/save);
 wenzelm parents: 
56208diff
changeset | 174 | def options_changed() | 
| 
b1cf8ddc2e04
propagate deps_changed, to resolve missing files without requiring jEdit events (e.g. buffer load/save);
 wenzelm parents: 
56208diff
changeset | 175 |   {
 | 
| 56715 
52125652e82a
clarified Session.Consumer, with Session.Outlet managed by dispatcher thread;
 wenzelm parents: 
56662diff
changeset | 176 | PIDE.session.global_options.post(Session.Global_Options(PIDE.options.value)) | 
| 56770 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 wenzelm parents: 
56715diff
changeset | 177 | delay_load.invoke() | 
| 55791 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 178 | } | 
| 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 179 | |
| 56316 
b1cf8ddc2e04
propagate deps_changed, to resolve missing files without requiring jEdit events (e.g. buffer load/save);
 wenzelm parents: 
56208diff
changeset | 180 | def deps_changed() | 
| 
b1cf8ddc2e04
propagate deps_changed, to resolve missing files without requiring jEdit events (e.g. buffer load/save);
 wenzelm parents: 
56208diff
changeset | 181 |   {
 | 
| 56770 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 wenzelm parents: 
56715diff
changeset | 182 | delay_load.invoke() | 
| 56316 
b1cf8ddc2e04
propagate deps_changed, to resolve missing files without requiring jEdit events (e.g. buffer load/save);
 wenzelm parents: 
56208diff
changeset | 183 | } | 
| 
b1cf8ddc2e04
propagate deps_changed, to resolve missing files without requiring jEdit events (e.g. buffer load/save);
 wenzelm parents: 
56208diff
changeset | 184 | |
| 55791 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 185 | |
| 44577 
96b6388d06c4
separate module for jEdit primitives for loading theory files;
 wenzelm parents: 
44574diff
changeset | 186 | /* theory files */ | 
| 44574 | 187 | |
| 50344 
608265769ce0
emit bulk edits on initialization of multiple buffers, which greatly improves performance when starting big sessions (e.g. JinjaThreads);
 wenzelm parents: 
50209diff
changeset | 188 | private lazy val delay_init = | 
| 57612 
990ffb84489b
clarified module name: facilitate alternative GUI frameworks;
 wenzelm parents: 
57611diff
changeset | 189 |     GUI_Thread.delay_last(PIDE.options.seconds("editor_load_delay"))
 | 
| 50344 
608265769ce0
emit bulk edits on initialization of multiple buffers, which greatly improves performance when starting big sessions (e.g. JinjaThreads);
 wenzelm parents: 
50209diff
changeset | 190 |     {
 | 
| 55791 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 191 | PIDE.init_models() | 
| 50344 
608265769ce0
emit bulk edits on initialization of multiple buffers, which greatly improves performance when starting big sessions (e.g. JinjaThreads);
 wenzelm parents: 
50209diff
changeset | 192 | } | 
| 
608265769ce0
emit bulk edits on initialization of multiple buffers, which greatly improves performance when starting big sessions (e.g. JinjaThreads);
 wenzelm parents: 
50209diff
changeset | 193 | |
| 57582 | 194 | private val delay_load_active = Synchronized(false) | 
| 195 | private def delay_load_activated(): Boolean = | |
| 196 | delay_load_active.guarded_access(a => Some((!a, true))) | |
| 197 | ||
| 44573 
51f8895b9ad9
some dialog for auto loading of required files (still inactive);
 wenzelm parents: 
44434diff
changeset | 198 | private lazy val delay_load = | 
| 57612 
990ffb84489b
clarified module name: facilitate alternative GUI frameworks;
 wenzelm parents: 
57611diff
changeset | 199 |     GUI_Thread.delay_last(PIDE.options.seconds("editor_load_delay"))
 | 
| 44574 | 200 |     {
 | 
| 60205 
9ee125c3bff7
avoid auto-load dialog while exit/closeAllBuffers is active: the perspective manager happens to indicate this precisely in jEdit 5.2.0;
 wenzelm parents: 
60075diff
changeset | 201 | if (Isabelle.continuous_checking && delay_load_activated() && | 
| 
9ee125c3bff7
avoid auto-load dialog while exit/closeAllBuffers is active: the perspective manager happens to indicate this precisely in jEdit 5.2.0;
 wenzelm parents: 
60075diff
changeset | 202 | PerspectiveManager.isPerspectiveEnabled) | 
| 
9ee125c3bff7
avoid auto-load dialog while exit/closeAllBuffers is active: the perspective manager happens to indicate this precisely in jEdit 5.2.0;
 wenzelm parents: 
60075diff
changeset | 203 |       {
 | 
| 57582 | 204 |         try {
 | 
| 205 | val view = jEdit.getActiveView() | |
| 44963 
4662dddc2fd8
explicit check_file wrt. jEdit VFS, to avoid slightly confusing empty buffer after IO error;
 wenzelm parents: 
44955diff
changeset | 206 | |
| 57582 | 207 | val buffers = JEdit_Lib.jedit_buffers().toList | 
| 208 |           if (buffers.forall(_.isLoaded)) {
 | |
| 209 | def loaded_buffer(name: String): Boolean = | |
| 210 | buffers.exists(buffer => JEdit_Lib.buffer_name(buffer) == name) | |
| 44574 | 211 | |
| 57582 | 212 | val thys = | 
| 213 |               for {
 | |
| 214 | buffer <- buffers | |
| 215 | model <- PIDE.document_model(buffer) | |
| 216 | if model.is_theory | |
| 217 | } yield (model.node_name, Position.none) | |
| 46761 | 218 | |
| 57582 | 219 | val thy_info = new Thy_Info(PIDE.resources) | 
| 220 |             val files = thy_info.dependencies("", thys).deps.map(_.name.node).
 | |
| 59691 | 221 | filter(file => !loaded_buffer(file) && PIDE.resources.check_file(file)) | 
| 44574 | 222 | |
| 59319 | 223 |             if (files.nonEmpty) {
 | 
| 57582 | 224 |               if (PIDE.options.bool("jedit_auto_load")) {
 | 
| 225 | files.foreach(file => jEdit.openFile(null: View, file)) | |
| 226 | } | |
| 227 |               else {
 | |
| 228 | val files_list = new ListView(files.sorted) | |
| 229 | for (i <- 0 until files.length) | |
| 230 | files_list.selection.indices += i | |
| 44606 | 231 | |
| 57582 | 232 | val answer = | 
| 233 | GUI.confirm_dialog(view, | |
| 234 | "Auto loading of required files", | |
| 235 | JOptionPane.YES_NO_OPTION, | |
| 236 | "The following files are required to resolve theory imports.", | |
| 237 | "Reload selected files now?", | |
| 238 | new ScrollPane(files_list), | |
| 239 | new Isabelle.Continuous_Checking) | |
| 240 |                 if (answer == 0) {
 | |
| 241 | files.foreach(file => | |
| 242 | if (files_list.selection.items.contains(file)) | |
| 243 | jEdit.openFile(null: View, file)) | |
| 244 | } | |
| 53715 | 245 | } | 
| 53074 | 246 | } | 
| 46761 | 247 | } | 
| 248 | } | |
| 57582 | 249 |         finally { delay_load_active.change(_ => false) }
 | 
| 44606 | 250 | } | 
| 44574 | 251 | } | 
| 44573 
51f8895b9ad9
some dialog for auto loading of required files (still inactive);
 wenzelm parents: 
44434diff
changeset | 252 | |
| 44574 | 253 | |
| 56715 
52125652e82a
clarified Session.Consumer, with Session.Outlet managed by dispatcher thread;
 wenzelm parents: 
56662diff
changeset | 254 | /* session phase */ | 
| 44573 
51f8895b9ad9
some dialog for auto loading of required files (still inactive);
 wenzelm parents: 
44434diff
changeset | 255 | |
| 56715 
52125652e82a
clarified Session.Consumer, with Session.Outlet managed by dispatcher thread;
 wenzelm parents: 
56662diff
changeset | 256 | private val session_phase = | 
| 
52125652e82a
clarified Session.Consumer, with Session.Outlet managed by dispatcher thread;
 wenzelm parents: 
56662diff
changeset | 257 |     Session.Consumer[Session.Phase](getClass.getName) {
 | 
| 
52125652e82a
clarified Session.Consumer, with Session.Outlet managed by dispatcher thread;
 wenzelm parents: 
56662diff
changeset | 258 | case Session.Inactive | Session.Failed => | 
| 57612 
990ffb84489b
clarified module name: facilitate alternative GUI frameworks;
 wenzelm parents: 
57611diff
changeset | 259 |         GUI_Thread.later {
 | 
| 56715 
52125652e82a
clarified Session.Consumer, with Session.Outlet managed by dispatcher thread;
 wenzelm parents: 
56662diff
changeset | 260 | GUI.error_dialog(jEdit.getActiveView, "Prover process terminated", | 
| 56775 
59f70b89e5fd
improved syslog performance -- avoid denial-of-service e.g. with threads_trace = 5 and active Syslog dockable;
 wenzelm parents: 
56774diff
changeset | 261 | "Isabelle Syslog", GUI.scrollable_text(PIDE.session.syslog_content())) | 
| 56715 
52125652e82a
clarified Session.Consumer, with Session.Outlet managed by dispatcher thread;
 wenzelm parents: 
56662diff
changeset | 262 | } | 
| 39735 
969ede84aac0
more uniform init/exit model/view in session_manager, trading race wrt. session.phase for race wrt. global editor state;
 wenzelm parents: 
39702diff
changeset | 263 | |
| 56715 
52125652e82a
clarified Session.Consumer, with Session.Outlet managed by dispatcher thread;
 wenzelm parents: 
56662diff
changeset | 264 | case Session.Ready => | 
| 60075 | 265 | PIDE.session.update_options(PIDE.options.value) | 
| 56715 
52125652e82a
clarified Session.Consumer, with Session.Outlet managed by dispatcher thread;
 wenzelm parents: 
56662diff
changeset | 266 | PIDE.init_models() | 
| 57640 
0a28cf866d5d
reconfirm continuous checking on startup, to address common trap of disabling it accidentally;
 wenzelm parents: 
57612diff
changeset | 267 | |
| 
0a28cf866d5d
reconfirm continuous checking on startup, to address common trap of disabling it accidentally;
 wenzelm parents: 
57612diff
changeset | 268 |         if (!Isabelle.continuous_checking) {
 | 
| 
0a28cf866d5d
reconfirm continuous checking on startup, to address common trap of disabling it accidentally;
 wenzelm parents: 
57612diff
changeset | 269 |           GUI_Thread.later {
 | 
| 
0a28cf866d5d
reconfirm continuous checking on startup, to address common trap of disabling it accidentally;
 wenzelm parents: 
57612diff
changeset | 270 | val answer = | 
| 
0a28cf866d5d
reconfirm continuous checking on startup, to address common trap of disabling it accidentally;
 wenzelm parents: 
57612diff
changeset | 271 | GUI.confirm_dialog(jEdit.getActiveView, | 
| 
0a28cf866d5d
reconfirm continuous checking on startup, to address common trap of disabling it accidentally;
 wenzelm parents: 
57612diff
changeset | 272 | "Continuous checking of PIDE document", | 
| 
0a28cf866d5d
reconfirm continuous checking on startup, to address common trap of disabling it accidentally;
 wenzelm parents: 
57612diff
changeset | 273 | JOptionPane.YES_NO_OPTION, | 
| 
0a28cf866d5d
reconfirm continuous checking on startup, to address common trap of disabling it accidentally;
 wenzelm parents: 
57612diff
changeset | 274 | "Continuous checking is presently disabled:", | 
| 
0a28cf866d5d
reconfirm continuous checking on startup, to address common trap of disabling it accidentally;
 wenzelm parents: 
57612diff
changeset | 275 | "editor buffers will remain inactive!", | 
| 
0a28cf866d5d
reconfirm continuous checking on startup, to address common trap of disabling it accidentally;
 wenzelm parents: 
57612diff
changeset | 276 | "Enable continuous checking now?") | 
| 
0a28cf866d5d
reconfirm continuous checking on startup, to address common trap of disabling it accidentally;
 wenzelm parents: 
57612diff
changeset | 277 | if (answer == 0) Isabelle.continuous_checking = true | 
| 
0a28cf866d5d
reconfirm continuous checking on startup, to address common trap of disabling it accidentally;
 wenzelm parents: 
57612diff
changeset | 278 | } | 
| 
0a28cf866d5d
reconfirm continuous checking on startup, to address common trap of disabling it accidentally;
 wenzelm parents: 
57612diff
changeset | 279 | } | 
| 
0a28cf866d5d
reconfirm continuous checking on startup, to address common trap of disabling it accidentally;
 wenzelm parents: 
57612diff
changeset | 280 | |
| 56770 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 wenzelm parents: 
56715diff
changeset | 281 | delay_load.invoke() | 
| 44573 
51f8895b9ad9
some dialog for auto loading of required files (still inactive);
 wenzelm parents: 
44434diff
changeset | 282 | |
| 56715 
52125652e82a
clarified Session.Consumer, with Session.Outlet managed by dispatcher thread;
 wenzelm parents: 
56662diff
changeset | 283 | case Session.Shutdown => | 
| 
52125652e82a
clarified Session.Consumer, with Session.Outlet managed by dispatcher thread;
 wenzelm parents: 
56662diff
changeset | 284 | PIDE.exit_models(JEdit_Lib.jedit_buffers().toList) | 
| 56770 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 wenzelm parents: 
56715diff
changeset | 285 | delay_load.revoke() | 
| 46740 
852baa599351
explicitly revoke delay, to avoid spurious timer events after deactivation of related components;
 wenzelm parents: 
46204diff
changeset | 286 | |
| 56715 
52125652e82a
clarified Session.Consumer, with Session.Outlet managed by dispatcher thread;
 wenzelm parents: 
56662diff
changeset | 287 | case _ => | 
| 39630 
44181423183a
explicit Session.Phase indication with associated event bus;
 wenzelm parents: 
39628diff
changeset | 288 | } | 
| 
44181423183a
explicit Session.Phase indication with associated event bus;
 wenzelm parents: 
39628diff
changeset | 289 | |
| 
44181423183a
explicit Session.Phase indication with associated event bus;
 wenzelm parents: 
39628diff
changeset | 290 | |
| 34618 | 291 | /* main plugin plumbing */ | 
| 34433 | 292 | |
| 34767 | 293 | override def handleMessage(message: EBMessage) | 
| 34618 | 294 |   {
 | 
| 57612 
990ffb84489b
clarified module name: facilitate alternative GUI frameworks;
 wenzelm parents: 
57611diff
changeset | 295 |     GUI_Thread.assert {}
 | 
| 39630 
44181423183a
explicit Session.Phase indication with associated event bus;
 wenzelm parents: 
39628diff
changeset | 296 | |
| 50205 | 297 |     if (PIDE.startup_failure.isDefined && !PIDE.startup_notified) {
 | 
| 49099 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 298 |       message match {
 | 
| 49100 
e7aecf2a5fc4
prefer old startup dialog scheme (cf. 514bb82514df);
 wenzelm parents: 
49099diff
changeset | 299 | case msg: EditorStarted => | 
| 51616 | 300 | GUI.error_dialog(null, "Isabelle plugin startup failure", | 
| 301 | GUI.scrollable_text(Exn.message(PIDE.startup_failure.get)), | |
| 49099 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 302 | "Prover IDE inactive!") | 
| 50205 | 303 | PIDE.startup_notified = true | 
| 49099 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 304 | case _ => | 
| 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 305 | } | 
| 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 306 | } | 
| 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 307 | |
| 50205 | 308 |     if (PIDE.startup_failure.isEmpty) {
 | 
| 49099 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 309 |       message match {
 | 
| 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 310 | case msg: EditorStarted => | 
| 56387 | 311 |           PIDE.session.start("Isabelle", Isabelle_Logic.session_args())
 | 
| 37557 
1ae272fd4082
refresh Isabelle token marker after buffer properties changed, e.g. when fold mode is switched;
 wenzelm parents: 
37241diff
changeset | 312 | |
| 57649 
a43898f76ae9
further distinction of Isabelle distribution: alert for identified release candidates;
 wenzelm parents: 
57640diff
changeset | 313 |           if (Distribution.is_identified && !Distribution.is_official) {
 | 
| 57680 | 314 | GUI.warning_dialog(jEdit.getActiveView, "Isabelle version for testing", | 
| 60206 | 315 | "This is " + Distribution.version + ".", | 
| 57649 
a43898f76ae9
further distinction of Isabelle distribution: alert for identified release candidates;
 wenzelm parents: 
57640diff
changeset | 316 | "It is for testing only, not for production use.") | 
| 
a43898f76ae9
further distinction of Isabelle distribution: alert for identified release candidates;
 wenzelm parents: 
57640diff
changeset | 317 | } | 
| 
a43898f76ae9
further distinction of Isabelle distribution: alert for identified release candidates;
 wenzelm parents: 
57640diff
changeset | 318 | |
| 49099 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 319 | case msg: BufferUpdate | 
| 57611 
b6256ea3b7c5
proper change of perspective for removed nodes (stemming from closed buffers);
 wenzelm parents: 
57582diff
changeset | 320 | if msg.getWhat == BufferUpdate.LOADED || | 
| 
b6256ea3b7c5
proper change of perspective for removed nodes (stemming from closed buffers);
 wenzelm parents: 
57582diff
changeset | 321 | msg.getWhat == BufferUpdate.PROPERTIES_CHANGED || | 
| 
b6256ea3b7c5
proper change of perspective for removed nodes (stemming from closed buffers);
 wenzelm parents: 
57582diff
changeset | 322 | msg.getWhat == BufferUpdate.CLOSING => | 
| 
b6256ea3b7c5
proper change of perspective for removed nodes (stemming from closed buffers);
 wenzelm parents: 
57582diff
changeset | 323 | |
| 
b6256ea3b7c5
proper change of perspective for removed nodes (stemming from closed buffers);
 wenzelm parents: 
57582diff
changeset | 324 |           if (msg.getWhat == BufferUpdate.CLOSING) {
 | 
| 
b6256ea3b7c5
proper change of perspective for removed nodes (stemming from closed buffers);
 wenzelm parents: 
57582diff
changeset | 325 | val buffer = msg.getBuffer | 
| 
b6256ea3b7c5
proper change of perspective for removed nodes (stemming from closed buffers);
 wenzelm parents: 
57582diff
changeset | 326 | if (buffer != null) PIDE.editor.remove_node(PIDE.resources.node_name(msg.getBuffer)) | 
| 
b6256ea3b7c5
proper change of perspective for removed nodes (stemming from closed buffers);
 wenzelm parents: 
57582diff
changeset | 327 | } | 
| 50205 | 328 |           if (PIDE.session.is_ready) {
 | 
| 55791 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 329 | delay_init.invoke() | 
| 
5821b1937fa5
clarified init_models: simultaneous initialization of all document models, before flushing edits by regular means (via PIDE.editor.invoke) -- important for consolidated doc_blobs when determining initial edits;
 wenzelm parents: 
55784diff
changeset | 330 | delay_load.invoke() | 
| 49099 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 331 | } | 
| 34784 
02959dcea756
split Theory_View into Document_Model (connected to Buffer) and Document_View (connected to JEditTextArea);
 wenzelm parents: 
34782diff
changeset | 332 | |
| 49099 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 333 | case msg: EditPaneUpdate | 
| 60215 | 334 | if msg.getWhat == EditPaneUpdate.BUFFER_CHANGING || | 
| 49099 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 335 | msg.getWhat == EditPaneUpdate.BUFFER_CHANGED || | 
| 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 336 | msg.getWhat == EditPaneUpdate.CREATED || | 
| 60215 | 337 | msg.getWhat == EditPaneUpdate.DESTROYED => | 
| 49099 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 338 | val edit_pane = msg.getEditPane | 
| 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 339 | val buffer = edit_pane.getBuffer | 
| 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 340 | val text_area = edit_pane.getTextArea | 
| 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 341 | |
| 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 342 |           if (buffer != null && text_area != null) {
 | 
| 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 343 | if (msg.getWhat == EditPaneUpdate.BUFFER_CHANGED || | 
| 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 344 |                 msg.getWhat == EditPaneUpdate.CREATED) {
 | 
| 50205 | 345 | if (PIDE.session.is_ready) | 
| 346 | PIDE.init_view(buffer, text_area) | |
| 49099 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 347 | } | 
| 52867 
8d8cb75ab20a
more central Pretty_Tooltip.dismissed_all -- avoid spurious crash of Rich_Text_Area.robust_body in asynchronous mouse_motion_listener;
 wenzelm parents: 
52816diff
changeset | 348 |             else {
 | 
| 53244 | 349 | PIDE.dismissed_popups(text_area.getView) | 
| 52867 
8d8cb75ab20a
more central Pretty_Tooltip.dismissed_all -- avoid spurious crash of Rich_Text_Area.robust_body in asynchronous mouse_motion_listener;
 wenzelm parents: 
52816diff
changeset | 350 | PIDE.exit_view(buffer, text_area) | 
| 
8d8cb75ab20a
more central Pretty_Tooltip.dismissed_all -- avoid spurious crash of Rich_Text_Area.robust_body in asynchronous mouse_motion_listener;
 wenzelm parents: 
52816diff
changeset | 351 | } | 
| 53274 
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
 wenzelm parents: 
53272diff
changeset | 352 | |
| 
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
 wenzelm parents: 
53272diff
changeset | 353 | if (msg.getWhat == EditPaneUpdate.CREATED) | 
| 
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
 wenzelm parents: 
53272diff
changeset | 354 | Completion_Popup.Text_Area.init(text_area) | 
| 
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
 wenzelm parents: 
53272diff
changeset | 355 | |
| 
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
 wenzelm parents: 
53272diff
changeset | 356 | if (msg.getWhat == EditPaneUpdate.DESTROYED) | 
| 
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
 wenzelm parents: 
53272diff
changeset | 357 | Completion_Popup.Text_Area.exit(text_area) | 
| 43510 
17d431c92575
init/exit model/view synchronously within the swing thread -- EditBus.send in jedit-4.4.1 always runs there;
 wenzelm parents: 
43487diff
changeset | 358 | } | 
| 34784 
02959dcea756
split Theory_View into Document_Model (connected to Buffer) and Document_View (connected to JEditTextArea);
 wenzelm parents: 
34782diff
changeset | 359 | |
| 49099 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 360 | case msg: PropertiesChanged => | 
| 56558 
05c833d402bc
tuned signature -- explicit Spell_Checker_Variable;
 wenzelm parents: 
56557diff
changeset | 361 | PIDE.spell_checker.update(PIDE.options.value) | 
| 52084 
573e80625c78
more explicit Session.update_options as source of Global_Options event;
 wenzelm parents: 
51616diff
changeset | 362 | PIDE.session.update_options(PIDE.options.value) | 
| 34784 
02959dcea756
split Theory_View into Document_Model (connected to Buffer) and Document_View (connected to JEditTextArea);
 wenzelm parents: 
34782diff
changeset | 363 | |
| 49099 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 364 | case _ => | 
| 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 365 | } | 
| 34318 
c13e168a8ae6
original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
 wenzelm parents: diff
changeset | 366 | } | 
| 
c13e168a8ae6
original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
 wenzelm parents: diff
changeset | 367 | } | 
| 
c13e168a8ae6
original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
 wenzelm parents: diff
changeset | 368 | |
| 34618 | 369 | override def start() | 
| 49099 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 370 |   {
 | 
| 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 371 |     try {
 | 
| 50709 
985c081a4f11
disable search dialog pool on all platforms -- to prevent GUI synchronization problems seen on KDE (e.g. Kubuntu 12.10);
 wenzelm parents: 
50566diff
changeset | 372 | Debug.DISABLE_SEARCH_DIALOG_POOL = true | 
| 
985c081a4f11
disable search dialog pool on all platforms -- to prevent GUI synchronization problems seen on KDE (e.g. Kubuntu 12.10);
 wenzelm parents: 
50566diff
changeset | 373 | |
| 50205 | 374 | PIDE.plugin = this | 
| 49099 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 375 | Isabelle_System.init() | 
| 57908 
1937603dbdf2
separate Java FX modules -- no need to include jfxrt.jar by default;
 wenzelm parents: 
57867diff
changeset | 376 | GUI.install_fonts() | 
| 49099 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 377 | |
| 53338 | 378 | PIDE.options.update(Options.init()) | 
| 53337 
b3817a0e3211
sort items according to persistent history of frequency of use;
 wenzelm parents: 
53277diff
changeset | 379 | PIDE.completion_history.load() | 
| 56558 
05c833d402bc
tuned signature -- explicit Spell_Checker_Variable;
 wenzelm parents: 
56557diff
changeset | 380 | PIDE.spell_checker.update(PIDE.options.value) | 
| 49245 
cb70157293c0
manage Isabelle/jEdit options as Isabelle/Scala options (with persistent preferences);
 wenzelm parents: 
49195diff
changeset | 381 | |
| 49099 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 382 | SyntaxUtilities.setStyleExtender(new Token_Markup.Style_Extender) | 
| 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 383 | if (ModeProvider.instance.isInstanceOf[ModeProvider]) | 
| 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 384 | ModeProvider.instance = new Token_Markup.Mode_Provider(ModeProvider.instance) | 
| 48870 
4accee106f0f
clarified initialization of Thy_Load, Thy_Info, Session;
 wenzelm parents: 
48791diff
changeset | 385 | |
| 53274 
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
 wenzelm parents: 
53272diff
changeset | 386 | JEdit_Lib.jedit_text_areas.foreach(Completion_Popup.Text_Area.init _) | 
| 
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
 wenzelm parents: 
53272diff
changeset | 387 | |
| 49246 | 388 | val content = Isabelle_Logic.session_content(false) | 
| 56801 
8dd9df88f647
some support for session-qualified theories: allow to refer to resources via qualified name instead of odd file-system path;
 wenzelm parents: 
56775diff
changeset | 389 | val resources = | 
| 
8dd9df88f647
some support for session-qualified theories: allow to refer to resources via qualified name instead of odd file-system path;
 wenzelm parents: 
56775diff
changeset | 390 | new JEdit_Resources(content.loaded_theories, content.known_theories, content.syntax) | 
| 49524 
68796a77c42b
Thy_Syntax.consolidate_spans is subject to editor_reparse_limit, for improved experience of unbalanced comments etc.;
 wenzelm parents: 
49523diff
changeset | 391 | |
| 56208 | 392 |       PIDE.session = new Session(resources) {
 | 
| 50207 | 393 |         override def output_delay = PIDE.options.seconds("editor_output_delay")
 | 
| 57867 
abae8aff6262
added system option editor_output_delay: lower value might help big sessions under low-memory situations;
 wenzelm parents: 
57680diff
changeset | 394 |         override def prune_delay = PIDE.options.seconds("editor_prune_delay")
 | 
| 57974 | 395 |         override def syslog_limit = PIDE.options.int("editor_syslog_limit")
 | 
| 50205 | 396 |         override def reparse_limit = PIDE.options.int("editor_reparse_limit")
 | 
| 49288 | 397 | } | 
| 48870 
4accee106f0f
clarified initialization of Thy_Load, Thy_Info, Session;
 wenzelm parents: 
48791diff
changeset | 398 | |
| 56715 
52125652e82a
clarified Session.Consumer, with Session.Outlet managed by dispatcher thread;
 wenzelm parents: 
56662diff
changeset | 399 | PIDE.session.phase_changed += session_phase | 
| 50205 | 400 | PIDE.startup_failure = None | 
| 49099 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 401 | } | 
| 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 402 |     catch {
 | 
| 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 403 | case exn: Throwable => | 
| 50205 | 404 | PIDE.startup_failure = Some(exn) | 
| 405 | PIDE.startup_notified = false | |
| 49099 
10e899bb6530
more permissive handling of plugin startup failure;
 wenzelm parents: 
49098diff
changeset | 406 | } | 
| 34318 
c13e168a8ae6
original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
 wenzelm parents: diff
changeset | 407 | } | 
| 34618 | 408 | |
| 39628 
f6e82967b5cd
Plugin.stop: refrain from invalidating Isabelle.session -- some actors/dockables out there might still refer to it;
 wenzelm parents: 
39518diff
changeset | 409 | override def stop() | 
| 34618 | 410 |   {
 | 
| 53274 
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
 wenzelm parents: 
53272diff
changeset | 411 | JEdit_Lib.jedit_text_areas.foreach(Completion_Popup.Text_Area.exit _) | 
| 
1760c01f1c78
maintain Completion_Popup.Text_Area as client property like Document_View;
 wenzelm parents: 
53272diff
changeset | 412 | |
| 53337 
b3817a0e3211
sort items according to persistent history of frequency of use;
 wenzelm parents: 
53277diff
changeset | 413 |     if (PIDE.startup_failure.isEmpty) {
 | 
| 50205 | 414 | PIDE.options.value.save_prefs() | 
| 53337 
b3817a0e3211
sort items according to persistent history of frequency of use;
 wenzelm parents: 
53277diff
changeset | 415 | PIDE.completion_history.value.save() | 
| 
b3817a0e3211
sort items according to persistent history of frequency of use;
 wenzelm parents: 
53277diff
changeset | 416 | } | 
| 49245 
cb70157293c0
manage Isabelle/jEdit options as Isabelle/Scala options (with persistent preferences);
 wenzelm parents: 
49195diff
changeset | 417 | |
| 56715 
52125652e82a
clarified Session.Consumer, with Session.Outlet managed by dispatcher thread;
 wenzelm parents: 
56662diff
changeset | 418 | PIDE.session.phase_changed -= session_phase | 
| 50344 
608265769ce0
emit bulk edits on initialization of multiple buffers, which greatly improves performance when starting big sessions (e.g. JinjaThreads);
 wenzelm parents: 
50209diff
changeset | 419 | PIDE.exit_models(JEdit_Lib.jedit_buffers().toList) | 
| 50205 | 420 | PIDE.session.stop() | 
| 34318 
c13e168a8ae6
original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
 wenzelm parents: diff
changeset | 421 | } | 
| 
c13e168a8ae6
original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
 wenzelm parents: diff
changeset | 422 | } |