src/Tools/jEdit/src/isabelle_session.scala
author wenzelm
Fri, 03 Nov 2023 19:00:00 +0100
changeset 78892 aaf2cf463e9a
parent 76003 a84e9594ec7e
child 82142 508a673c87ac
permissions -rw-r--r--
merged
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69762
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
     1
/*  Title:      Tools/jEdit/src/isabelle_session.scala
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
     3
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
     4
Access Isabelle session information via virtual file-system.
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
     5
*/
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
     6
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
     7
package isabelle.jedit
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
     8
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
     9
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    10
import isabelle._
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    11
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    12
import java.awt.Component
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    13
import java.io.InputStream
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    14
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    15
import org.gjt.sp.jedit.View
69763
4b0a11d499e2 open session ROOT file;
wenzelm
parents: 69762
diff changeset
    16
import org.gjt.sp.jedit.io.{VFS => JEdit_VFS, VFSFile}
69762
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    17
import org.gjt.sp.jedit.browser.VFSBrowser
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    18
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    19
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    20
object Isabelle_Session {
69762
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    21
  /* virtual file-system */
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    22
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    23
  val vfs_prefix = "isabelle-session:"
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    24
69765
c5778547ed03 more accurate file position;
wenzelm
parents: 69763
diff changeset
    25
  class Session_Entry(name: String, path: String, marker: String)
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    26
  extends VFSFile(name, path, vfs_prefix + name, VFSFile.FILE, 0L, false) {
69765
c5778547ed03 more accurate file position;
wenzelm
parents: 69763
diff changeset
    27
    override def getPathMarker: String = marker
c5778547ed03 more accurate file position;
wenzelm
parents: 69763
diff changeset
    28
69763
4b0a11d499e2 open session ROOT file;
wenzelm
parents: 69762
diff changeset
    29
    override def getExtendedAttribute(att: String): String =
4b0a11d499e2 open session ROOT file;
wenzelm
parents: 69762
diff changeset
    30
      if (att == JEdit_VFS.EA_SIZE) null
4b0a11d499e2 open session ROOT file;
wenzelm
parents: 69762
diff changeset
    31
      else super.getExtendedAttribute(att)
4b0a11d499e2 open session ROOT file;
wenzelm
parents: 69762
diff changeset
    32
  }
4b0a11d499e2 open session ROOT file;
wenzelm
parents: 69762
diff changeset
    33
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    34
  class VFS
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    35
  extends Isabelle_VFS(
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    36
    vfs_prefix,
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    37
    read = true,
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    38
    browse = true,
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    39
    low_latency = true,
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    40
    non_awt_session = true
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    41
  ) {
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    42
    override def _listFiles(
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    43
      vfs_session: AnyRef,
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    44
      url: String,
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    45
      component: Component
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    46
    ): Array[VFSFile] = {
69762
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    47
      explode_url(url, component = component) match {
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    48
        case None => null
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    49
        case Some(elems) =>
75817
b702a015fb22 clarified signature;
wenzelm
parents: 75393
diff changeset
    50
          val sessions = JEdit_Sessions.sessions_structure()
69762
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    51
          elems match {
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    52
            case Nil =>
76002
64b05dc56656 tuned signature;
wenzelm
parents: 75999
diff changeset
    53
              sessions.relevant_chapters.sortBy(_.name).map(ch => make_entry(ch.name, is_dir = true)).toArray
69762
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    54
            case List(chapter) =>
76002
64b05dc56656 tuned signature;
wenzelm
parents: 75999
diff changeset
    55
              sessions.relevant_chapters.find(_.name == chapter) match {
69762
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    56
                case None => null
76003
wenzelm
parents: 76002
diff changeset
    57
                case Some(ch) =>
wenzelm
parents: 76002
diff changeset
    58
                  ch.sessions.map { session =>
75999
b831a0bdd751 clarified signature of Sessions.Session: chapter_defs: vs. known_chapters (in declaration order) vs. chapters (covered by visible sessions);
wenzelm
parents: 75884
diff changeset
    59
                    val pos = sessions(session).pos
76003
wenzelm
parents: 76002
diff changeset
    60
                    val name = ch.name + "/" + session
69763
4b0a11d499e2 open session ROOT file;
wenzelm
parents: 69762
diff changeset
    61
                    val path =
75999
b831a0bdd751 clarified signature of Sessions.Session: chapter_defs: vs. known_chapters (in declaration order) vs. chapters (covered by visible sessions);
wenzelm
parents: 75884
diff changeset
    62
                      Position.File.unapply(pos) match {
69763
4b0a11d499e2 open session ROOT file;
wenzelm
parents: 69762
diff changeset
    63
                        case Some(path) => File.platform_path(path)
4b0a11d499e2 open session ROOT file;
wenzelm
parents: 69762
diff changeset
    64
                        case None => null
4b0a11d499e2 open session ROOT file;
wenzelm
parents: 69762
diff changeset
    65
                      }
69765
c5778547ed03 more accurate file position;
wenzelm
parents: 69763
diff changeset
    66
                    val marker =
75999
b831a0bdd751 clarified signature of Sessions.Session: chapter_defs: vs. known_chapters (in declaration order) vs. chapters (covered by visible sessions);
wenzelm
parents: 75884
diff changeset
    67
                      Position.Line.unapply(pos) match {
69765
c5778547ed03 more accurate file position;
wenzelm
parents: 69763
diff changeset
    68
                        case Some(line) => "+line:" + line
c5778547ed03 more accurate file position;
wenzelm
parents: 69763
diff changeset
    69
                        case None => null
c5778547ed03 more accurate file position;
wenzelm
parents: 69763
diff changeset
    70
                      }
c5778547ed03 more accurate file position;
wenzelm
parents: 69763
diff changeset
    71
                    new Session_Entry(name, path, marker)
75999
b831a0bdd751 clarified signature of Sessions.Session: chapter_defs: vs. known_chapters (in declaration order) vs. chapters (covered by visible sessions);
wenzelm
parents: 75884
diff changeset
    72
                  }.toArray
69762
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    73
              }
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    74
            case _ => null
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    75
          }
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    76
      }
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    77
    }
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    78
  }
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    79
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    80
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    81
  /* open browser */
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    82
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    83
  def open_browser(view: View): Unit = {
69762
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    84
    val path =
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    85
      PIDE.maybe_snapshot(view) match {
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    86
        case None => ""
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    87
        case Some(snapshot) =>
75884
3d8b37b1d798 clarified signature: avoid object-oriented HTML_Context;
wenzelm
parents: 75817
diff changeset
    88
          val sessions_structure = JEdit_Sessions.sessions_structure()
3d8b37b1d798 clarified signature: avoid object-oriented HTML_Context;
wenzelm
parents: 75817
diff changeset
    89
          val session = sessions_structure.theory_qualifier(snapshot.node_name)
70253
cb334a92a4db proper session chapter;
wenzelm
parents: 69766
diff changeset
    90
          val chapter =
75884
3d8b37b1d798 clarified signature: avoid object-oriented HTML_Context;
wenzelm
parents: 75817
diff changeset
    91
            sessions_structure.get(session) match {
70253
cb334a92a4db proper session chapter;
wenzelm
parents: 69766
diff changeset
    92
              case Some(info) => info.chapter
cb334a92a4db proper session chapter;
wenzelm
parents: 69766
diff changeset
    93
              case None => Sessions.UNSORTED
cb334a92a4db proper session chapter;
wenzelm
parents: 69766
diff changeset
    94
            }
cb334a92a4db proper session chapter;
wenzelm
parents: 69766
diff changeset
    95
          chapter
69762
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    96
      }
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    97
    VFSBrowser.browseDirectory(view, vfs_prefix + path)
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    98
  }
58fb0d779583 support for session information via virtual file-system;
wenzelm
parents:
diff changeset
    99
}