src/Tools/jEdit/src/main.scala
author wenzelm
Sat, 24 Jul 2021 15:38:41 +0200
changeset 74056 fb8d5c0133c9
parent 74037 c13198575f75
child 74306 a117c076aa22
permissions -rw-r--r--
clarified signature;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
73987
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 73891
diff changeset
     1
/*  Title:      src/Tools/jEdit/src/main.scala
47663
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
     3
53419
1c87e79bb838 main application entry point involves implicit Cygwin init, depending on "uninitialized" file indicator;
wenzelm
parents: 52675
diff changeset
     4
Main Isabelle application entry point.
47663
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
     5
*/
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
     6
73987
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 73891
diff changeset
     7
package isabelle.jedit
47663
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
     8
53419
1c87e79bb838 main application entry point involves implicit Cygwin init, depending on "uninitialized" file indicator;
wenzelm
parents: 52675
diff changeset
     9
73987
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 73891
diff changeset
    10
import isabelle._
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 73891
diff changeset
    11
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 73891
diff changeset
    12
import org.gjt.sp.jedit.{MiscUtilities, jEdit}
47663
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
    13
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
    14
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
    15
object Main
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
    16
{
61282
3e578ddef85d clarified Isabelle_System.init;
wenzelm
parents: 61281
diff changeset
    17
  /* main entry point */
53461
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
    18
73340
0ffcad1f6130 tuned --- fewer warnings;
wenzelm
parents: 73309
diff changeset
    19
  def main(args: Array[String]): Unit =
53449
913df2adc99c build session before start of jedit;
wenzelm
parents: 53445
diff changeset
    20
  {
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    21
    if (args.nonEmpty && args(0) == "-init") {
73891
6c9044f04756 clarified modules (again): services require full Isabelle/Scala environment;
wenzelm
parents: 73890
diff changeset
    22
      Isabelle_System.init()
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    23
    }
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    24
    else {
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    25
      val start =
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    26
      {
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    27
        try {
73891
6c9044f04756 clarified modules (again): services require full Isabelle/Scala environment;
wenzelm
parents: 73890
diff changeset
    28
          Isabelle_System.init()
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    29
          Isabelle_Fonts.init()
61282
3e578ddef85d clarified Isabelle_System.init;
wenzelm
parents: 61281
diff changeset
    30
73117
6a6e987552c7 clarified list of presented look-and-feels;
wenzelm
parents: 73111
diff changeset
    31
          GUI.init_lafs()
73111
01f4965fd09b support for additional look-and-feels;
wenzelm
parents: 73095
diff changeset
    32
61282
3e578ddef85d clarified Isabelle_System.init;
wenzelm
parents: 61281
diff changeset
    33
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    34
          /* ROOTS template */
66577
6e35cf3ce869 template for $ISABELLE_HOME_USER/ROOTS;
wenzelm
parents: 66463
diff changeset
    35
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    36
          {
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    37
            val roots = Path.explode("$ISABELLE_HOME_USER/ROOTS")
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    38
            if (!roots.is_file) File.write(roots, """# Additional session root directories
66577
6e35cf3ce869 template for $ISABELLE_HOME_USER/ROOTS;
wenzelm
parents: 66463
diff changeset
    39
#
73309
606ae85b8c6b clarified comments;
wenzelm
parents: 73117
diff changeset
    40
#   * each line contains one directory entry in Isabelle path notation, e.g.
606ae85b8c6b clarified comments;
wenzelm
parents: 73117
diff changeset
    41
#
606ae85b8c6b clarified comments;
wenzelm
parents: 73117
diff changeset
    42
#       $ISABELLE_HOME/../AFP/thys
606ae85b8c6b clarified comments;
wenzelm
parents: 73117
diff changeset
    43
#
606ae85b8c6b clarified comments;
wenzelm
parents: 73117
diff changeset
    44
#     for a copy of AFP put side-by-side to the Isabelle distribution
606ae85b8c6b clarified comments;
wenzelm
parents: 73117
diff changeset
    45
#
606ae85b8c6b clarified comments;
wenzelm
parents: 73117
diff changeset
    46
#   * Isabelle/jEdit provides formal markup for C-hover-click and completion
606ae85b8c6b clarified comments;
wenzelm
parents: 73117
diff changeset
    47
#
66577
6e35cf3ce869 template for $ISABELLE_HOME_USER/ROOTS;
wenzelm
parents: 66463
diff changeset
    48
#   * lines starting with "#" are stripped
73309
606ae85b8c6b clarified comments;
wenzelm
parents: 73117
diff changeset
    49
#
606ae85b8c6b clarified comments;
wenzelm
parents: 73117
diff changeset
    50
#   * changes require restart of the Isabelle application
66577
6e35cf3ce869 template for $ISABELLE_HOME_USER/ROOTS;
wenzelm
parents: 66463
diff changeset
    51
#
6e35cf3ce869 template for $ISABELLE_HOME_USER/ROOTS;
wenzelm
parents: 66463
diff changeset
    52
#:mode=text:encoding=UTF-8:
73309
606ae85b8c6b clarified comments;
wenzelm
parents: 73117
diff changeset
    53
606ae85b8c6b clarified comments;
wenzelm
parents: 73117
diff changeset
    54
#$ISABELLE_HOME/../AFP/thys
66577
6e35cf3ce869 template for $ISABELLE_HOME_USER/ROOTS;
wenzelm
parents: 66463
diff changeset
    55
""")
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    56
          }
66577
6e35cf3ce869 template for $ISABELLE_HOME_USER/ROOTS;
wenzelm
parents: 66463
diff changeset
    57
6e35cf3ce869 template for $ISABELLE_HOME_USER/ROOTS;
wenzelm
parents: 66463
diff changeset
    58
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    59
          /* settings directory */
61277
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    60
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    61
          val settings_dir = Path.explode("$JEDIT_SETTINGS")
66463
934bd55d768a enforce Isabelle plugins to be enabled;
wenzelm
parents: 65875
diff changeset
    62
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    63
          val properties = settings_dir + Path.explode("properties")
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    64
          if (properties.is_file) {
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    65
            val props1 = split_lines(File.read(properties))
73987
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 73891
diff changeset
    66
            val props2 = props1.filterNot(_.startsWith("plugin-blacklist.isabelle_jedit"))
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    67
            if (props1 != props2) File.write(properties, cat_lines(props2))
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    68
          }
66463
934bd55d768a enforce Isabelle plugins to be enabled;
wenzelm
parents: 65875
diff changeset
    69
72375
e48d93811ed7 clarified signature;
wenzelm
parents: 70249
diff changeset
    70
          Isabelle_System.make_directory(settings_dir + Path.explode("DockableWindowManager"))
61277
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    71
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    72
          if (!(settings_dir + Path.explode("perspective.xml")).is_file) {
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    73
            File.write(settings_dir + Path.explode("DockableWindowManager/perspective-view0.xml"),
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    74
              """<DOCKING LEFT="isabelle-documentation" TOP="" RIGHT="isabelle-theories" BOTTOM="" LEFT_POS="250" TOP_POS="0" RIGHT_POS="250" BOTTOM_POS="250" />""")
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    75
            File.write(settings_dir + Path.explode("perspective.xml"),
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    76
              XML.header +
69804
9efccbad7d42 uniform XML header;
wenzelm
parents: 69771
diff changeset
    77
"""<!DOCTYPE PERSPECTIVE SYSTEM "perspective.dtd">
61277
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    78
<PERSPECTIVE>
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    79
<VIEW PLAIN="FALSE">
69771
a8ee66876a1a tuned default layout;
wenzelm
parents: 69770
diff changeset
    80
<GEOMETRY X="0" Y="35" WIDTH="1200" HEIGHT="850" EXT_STATE="0" />
61277
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    81
</VIEW>
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    82
</PERSPECTIVE>""")
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    83
          }
61277
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    84
74056
fb8d5c0133c9 clarified signature;
wenzelm
parents: 74037
diff changeset
    85
          Scala_Project.plugin_contexts().foreach(_.build())
73987
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 73891
diff changeset
    86
61277
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    87
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    88
          /* args */
61277
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    89
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    90
          val jedit_settings =
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    91
            "-settings=" + File.platform_path(Path.explode("$JEDIT_SETTINGS"))
62036
773cb226738c provide server name uniformly on all platforms;
wenzelm
parents: 61512
diff changeset
    92
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    93
          val jedit_server =
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    94
            System.getProperty("isabelle.jedit_server") match {
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    95
              case null | "" => "-noserver"
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    96
              case name => "-server=" + name
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    97
            }
62036
773cb226738c provide server name uniformly on all platforms;
wenzelm
parents: 61512
diff changeset
    98
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
    99
          val jedit_options =
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   100
            Isabelle_System.getenv_strict("JEDIT_OPTIONS").split(" +")
61277
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
   101
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   102
          val more_args =
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   103
          {
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   104
            args.toList.dropWhile(arg => arg.startsWith("-") && arg != "--") match {
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   105
              case Nil | List("--") =>
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   106
                args ++ Array(File.platform_path(Path.explode("$USER_HOME/Scratch.thy")))
74037
c13198575f75 tuned --- based on hints by IntelliJ IDEA;
wenzelm
parents: 74032
diff changeset
   107
              case List(":") => args.slice(0, args.length - 1)
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   108
              case _ => args
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   109
            }
61512
933463440449 more uniform command-line for "isabelle jedit" and the isabelle.Main app wrapper;
wenzelm
parents: 61307
diff changeset
   110
          }
61277
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
   111
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
   112
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   113
          /* environment */
61277
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
   114
73987
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 73891
diff changeset
   115
          for (name <- List("ISABELLE_HOME", "ISABELLE_HOME_USER", "JEDIT_HOME", "JEDIT_SETTINGS")) {
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 73891
diff changeset
   116
            MiscUtilities.putenv(name, File.platform_path(Isabelle_System.getenv(name)))
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   117
          }
73987
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 73891
diff changeset
   118
          MiscUtilities.putenv("ISABELLE_ROOT", null)
69188
2fd73a1a0937 updated to jedit_build-20181025 according to patches/macos (Java 11), patches/putenv;
wenzelm
parents: 66577
diff changeset
   119
2fd73a1a0937 updated to jedit_build-20181025 according to patches/macos (Java 11), patches/putenv;
wenzelm
parents: 66577
diff changeset
   120
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   121
          /* properties */
61277
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
   122
73987
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 73891
diff changeset
   123
          System.setProperty("jedit.home", File.platform_path(Path.explode("$JEDIT_HOME")))
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   124
          System.setProperty("scala.home", File.platform_path(Path.explode("$SCALA_HOME")))
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   125
          System.setProperty("scala.color", "false")
61277
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
   126
69188
2fd73a1a0937 updated to jedit_build-20181025 according to patches/macos (Java 11), patches/putenv;
wenzelm
parents: 66577
diff changeset
   127
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   128
          /* main startup */
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   129
73987
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 73891
diff changeset
   130
          () => jEdit.main(Array(jedit_settings, jedit_server) ++ jedit_options ++ more_args)
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   131
        }
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   132
        catch {
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   133
          case exn: Throwable =>
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   134
            GUI.init_laf()
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   135
            GUI.dialog(null, "Isabelle", GUI.scrollable_text(Exn.message(exn)))
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   136
            sys.exit(2)
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   137
        }
61277
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
   138
      }
70249
4ce07be8ba17 clarified InstallPath: relative to self-extracting exe;
wenzelm
parents: 69804
diff changeset
   139
      start()
61277
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
   140
    }
53445
811db2b751ed warm start of Isabelle/jEdit from Isabelle/Scala;
wenzelm
parents: 53423
diff changeset
   141
  }
47663
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
   142
}