def sync_files(changed_files: Set[JFile]): Boolean = {
state.change_result { st => val changed_models =
(for {
(node_name, model) <- st.file_models_iterator
file <- model.file if changed_files(file)
text <- PIDE.resources.read_file_content(node_name) if model.content.text != text
} yield { val content = Document_Model.File_Content(node_name, text) val edits = Text.Edit.replace(0, model.content.text, text)
(node_name, model.copy(content = content, pending_edits = model.pending_edits ::: edits))
}).toList if (changed_models.isEmpty) (false, st) else (true, st.copy(models = changed_models.foldLeft(st.models)(_ + _)))
}
}
/* syntax */
def syntax_changed(names: List[Document.Node.Name]): Unit = {
GUI_Thread.require {}
val models = state.value.models for {
name <- names.iterator case buffer_model: Buffer_Model <- models.get(name)
} buffer_model.syntax_changed()
}
/* init and exit */
def init(session: Session, node_name: Document.Node.Name, buffer: Buffer): Buffer_Model = {
GUI_Thread.require {}
state.change_result(st =>
st.buffer_models.get(buffer) match { case Some(buffer_model) if buffer_model.node_name == node_name =>
buffer_model.init_token_marker()
(buffer_model, st) case _ => val res = st.close_buffer(buffer).open_buffer(session, node_name, buffer)
buffer.propertiesChanged()
res
})
}
def exit(buffer: Buffer): Unit = {
GUI_Thread.require {}
state.change(st => if (st.buffer_models.isDefinedAt(buffer)) { val res = st.close_buffer(buffer)
buffer.propertiesChanged()
res
} else st)
}
val changed =
state.change_result(st =>
st.models.get(name) match { case None => (false, st) case Some(model) => val a = model.node_required val b = if (toggle) !a else set
model match { case m: File_Model if a != b =>
(true, st.copy(models = st.models + (name -> m.set_node_required(b)))) case m: Buffer_Model if a != b =>
m.set_node_required(b); (true, st) case _ => (false, st)
}
}) if (changed) PIDE.editor.state_changed()
}
def open_preview(view: View, plain_text: Boolean): Unit = {
Document_Model.get_model(view.getBuffer) match { case Some(model) => val url = Preview_Service.server_url(plain_text, model.node_name)
PIDE.editor.hyperlink_url(url).follow(view) case _ =>
}
}
object Preview_Service extends HTTP.Service("preview") {
service =>
if (JEdit_Options.continuous_checking() && is_theory) { val snapshot = Document_Model.snapshot(model)
val required = node_required || PIDE.editor.document_node_required(node_name)
val reparse = snapshot.node.load_commands_changed(doc_blobs) val perspective = if (hidden) Text.Perspective.empty else { val view_ranges = document_view_ranges(snapshot) val load_ranges = snapshot.commands_loading_ranges(PIDE.editor.visible_node)
Text.Perspective(view_ranges ::: load_ranges)
} val overlays = PIDE.editor.node_overlays(node_name)
def reset_blob(): Unit = GUI_Thread.require { blob = None }
def get_blob: Option[Document.Blobs.Item] = GUI_Thread.require { if (is_theory) None else { val (bytes, text, chunk) =
blob getOrElse { val bytes = PIDE.resources.make_file_content(buffer) val text = buffer.getText(0, buffer.getLength) val chunk = Symbol.Text_Chunk(text) val x = (bytes, text, chunk)
blob = Some(x)
x
}
Some(Document.Blobs.Item(bytes, text, chunk, changed = !is_stable))
}
}
// parsed data
privatevar data: Option[AnyRef] = None
def reset_data(): Unit = GUI_Thread.require { data = None }
def untyped_data: AnyRef = GUI_Thread.require {
data getOrElse { val text = JEdit_Lib.buffer_text(buffer) val res = File_Format.registry.parse_data(node_name, text)
data = Some(res)
res
}
}
}
def syntax_changed(): Unit = {
JEdit_Lib.buffer_line_manager(buffer).setFirstInvalidLineContext(0) for (text_area <- JEdit_Lib.jedit_text_areas(buffer)) {
Untyped.method(Class.forName("org.gjt.sp.jedit.textarea.TextArea"), "foldStructureChanged").
invoke(text_area)
}
buffer.invalidateCachedFoldLevels()
}
def init_token_marker(): Unit = {
Isabelle.buffer_token_marker(buffer) match { case Some(marker) if marker != buffer.getTokenMarker =>
buffer.setTokenMarker(marker)
syntax_changed() case _ =>
}
}
/* init */
def init(old_model: Option[File_Model]): Buffer_Model = GUI_Thread.require {
old_model match { case None =>
buffer_state.edit(List(Text.Edit.insert(0, JEdit_Lib.buffer_text(buffer)))) case Some(file_model) =>
set_node_required(file_model.node_required)
buffer_state.set_last_perspective(file_model.last_perspective)
buffer_state.edit(
file_model.pending_edits :::
Text.Edit.replace(0, file_model.content.text, JEdit_Lib.buffer_text(buffer)))
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.