src/Tools/jEdit/src/jedit_sessions.scala
author wenzelm
Tue, 07 Apr 2020 21:49:36 +0200
changeset 71726 a5fda30edae2
parent 71604 c6fa217c9d5e
child 71896 ce06d6456cc8
permissions -rw-r--r--
clarified signature: more uniform treatment of stopped/interrupted state;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62973
744266e32612 clarified modules;
wenzelm
parents: 62972
diff changeset
     1
/*  Title:      Tools/jEdit/src/jedit_sessions.scala
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
     3
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
     4
Isabelle/jEdit session information, based on implicit process environment
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
     5
and explicit options.
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
     6
*/
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
     7
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
     8
package isabelle.jedit
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
     9
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
    10
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
    11
import isabelle._
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
    12
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
    13
import scala.swing.ComboBox
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
    14
import scala.swing.event.SelectionChanged
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
    15
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
    16
62973
744266e32612 clarified modules;
wenzelm
parents: 62972
diff changeset
    17
object JEdit_Sessions
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
    18
{
66973
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    19
  /* session options */
62972
wenzelm
parents: 62754
diff changeset
    20
66973
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    21
  def session_dirs(): List[Path] =
70382
23ba5a638e6d more robust: avoid folding of jEdit file-names wrt. JEDIT_SESSION_DIRS;
wenzelm
parents: 70105
diff changeset
    22
    Path.split(Isabelle_System.getenv("JEDIT_SESSION_DIRS")).filterNot(p => p.implode == "-")
66973
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    23
69854
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 69853
diff changeset
    24
  def session_no_build(): Boolean =
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 69853
diff changeset
    25
    Isabelle_System.getenv("JEDIT_NO_BUILD") == "true"
66973
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    26
69854
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 69853
diff changeset
    27
  def session_options(options: Options): Options =
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 69853
diff changeset
    28
  {
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 69853
diff changeset
    29
    val options1 =
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 69853
diff changeset
    30
      Isabelle_System.getenv("JEDIT_BUILD_MODE") match {
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 69853
diff changeset
    31
        case "default" => options
70105
eadd87383e30 clarified build of standard heaps;
wenzelm
parents: 69854
diff changeset
    32
        case mode => options.bool.update("system_heaps", mode == "system")
69854
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 69853
diff changeset
    33
      }
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 69853
diff changeset
    34
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 69853
diff changeset
    35
    val options2 =
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 69853
diff changeset
    36
      Isabelle_System.getenv("JEDIT_ML_PROCESS_POLICY") match {
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 69853
diff changeset
    37
        case "" => options1
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 69853
diff changeset
    38
        case s => options1.string.update("ML_process_policy", s)
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 69853
diff changeset
    39
      }
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 69853
diff changeset
    40
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 69853
diff changeset
    41
    options2
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 69853
diff changeset
    42
  }
69853
f7c9a1be333f more uniform session_system_mode (see also e57416b649d5);
wenzelm
parents: 69758
diff changeset
    43
69758
34a93af5b969 tuned signature;
wenzelm
parents: 68541
diff changeset
    44
  def sessions_structure(options: Options, dirs: List[Path] = session_dirs()): Sessions.Structure =
34a93af5b969 tuned signature;
wenzelm
parents: 68541
diff changeset
    45
    Sessions.load_structure(session_options(options), dirs = dirs)
34a93af5b969 tuned signature;
wenzelm
parents: 68541
diff changeset
    46
66973
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    47
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    48
  /* raw logic info */
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    49
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    50
  private val jedit_logic_option = "jedit_logic"
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    51
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    52
  def logic_name(options: Options): String =
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    53
    Isabelle_System.default_logic(
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    54
      Isabelle_System.getenv("JEDIT_LOGIC"),
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    55
      options.string(jedit_logic_option))
64602
8edca3465758 added isabelle jedit -R;
wenzelm
parents: 63986
diff changeset
    56
66988
7f8c1dd7576a support alternative ancestor session;
wenzelm
parents: 66987
diff changeset
    57
  def logic_ancestor: Option[String] = proper_string(Isabelle_System.getenv("JEDIT_LOGIC_ANCESTOR"))
68370
bcdc47c9d4af clarified signature;
wenzelm
parents: 68209
diff changeset
    58
  def logic_requirements: Boolean = Isabelle_System.getenv("JEDIT_LOGIC_REQUIREMENTS") == "true"
68541
12b4b3bc585d command-line option for include_sessions;
wenzelm
parents: 68370
diff changeset
    59
  def logic_include_sessions: List[String] =
12b4b3bc585d command-line option for include_sessions;
wenzelm
parents: 68370
diff changeset
    60
    space_explode(':', Isabelle_System.getenv("JEDIT_INCLUDE_SESSIONS"))
66973
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    61
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    62
  def logic_info(options: Options): Option[Sessions.Info] =
69758
34a93af5b969 tuned signature;
wenzelm
parents: 68541
diff changeset
    63
    try { sessions_structure(options).get(logic_name(options)) }
66973
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    64
    catch { case ERROR(_) => None }
64602
8edca3465758 added isabelle jedit -R;
wenzelm
parents: 63986
diff changeset
    65
66973
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    66
  def logic_root(options: Options): Position.T =
68370
bcdc47c9d4af clarified signature;
wenzelm
parents: 68209
diff changeset
    67
    if (logic_requirements) logic_info(options).map(_.pos) getOrElse Position.none
66973
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    68
    else Position.none
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    69
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    70
66979
wenzelm
parents: 66978
diff changeset
    71
  /* logic selector */
wenzelm
parents: 66978
diff changeset
    72
wenzelm
parents: 66978
diff changeset
    73
  private class Logic_Entry(val name: String, val description: String)
wenzelm
parents: 66978
diff changeset
    74
  {
wenzelm
parents: 66978
diff changeset
    75
    override def toString: String = description
wenzelm
parents: 66978
diff changeset
    76
  }
wenzelm
parents: 66978
diff changeset
    77
wenzelm
parents: 66978
diff changeset
    78
  def logic_selector(options: Options_Variable, autosave: Boolean): Option_Component =
wenzelm
parents: 66978
diff changeset
    79
  {
wenzelm
parents: 66978
diff changeset
    80
    GUI_Thread.require {}
wenzelm
parents: 66978
diff changeset
    81
wenzelm
parents: 66978
diff changeset
    82
    val session_list =
wenzelm
parents: 66978
diff changeset
    83
    {
69758
34a93af5b969 tuned signature;
wenzelm
parents: 68541
diff changeset
    84
      val sessions = sessions_structure(options.value)
66979
wenzelm
parents: 66978
diff changeset
    85
      val (main_sessions, other_sessions) =
69758
34a93af5b969 tuned signature;
wenzelm
parents: 68541
diff changeset
    86
        sessions.imports_topological_order.partition(name => sessions(name).groups.contains("main"))
67023
e27e05d6f2a7 tuned signature;
wenzelm
parents: 66989
diff changeset
    87
      main_sessions.sorted ::: other_sessions.sorted
66979
wenzelm
parents: 66978
diff changeset
    88
    }
wenzelm
parents: 66978
diff changeset
    89
wenzelm
parents: 66978
diff changeset
    90
    val entries =
wenzelm
parents: 66978
diff changeset
    91
      new Logic_Entry("", "default (" + logic_name(options.value) + ")") ::
wenzelm
parents: 66978
diff changeset
    92
        session_list.map(name => new Logic_Entry(name, name))
wenzelm
parents: 66978
diff changeset
    93
wenzelm
parents: 66978
diff changeset
    94
    val component = new ComboBox(entries) with Option_Component {
wenzelm
parents: 66978
diff changeset
    95
      name = jedit_logic_option
wenzelm
parents: 66978
diff changeset
    96
      val title = "Logic"
wenzelm
parents: 66978
diff changeset
    97
      def load: Unit =
wenzelm
parents: 66978
diff changeset
    98
      {
wenzelm
parents: 66978
diff changeset
    99
        val logic = options.string(jedit_logic_option)
wenzelm
parents: 66978
diff changeset
   100
        entries.find(_.name == logic) match {
wenzelm
parents: 66978
diff changeset
   101
          case Some(entry) => selection.item = entry
wenzelm
parents: 66978
diff changeset
   102
          case None =>
wenzelm
parents: 66978
diff changeset
   103
        }
wenzelm
parents: 66978
diff changeset
   104
      }
wenzelm
parents: 66978
diff changeset
   105
      def save: Unit = options.string(jedit_logic_option) = selection.item.name
wenzelm
parents: 66978
diff changeset
   106
    }
wenzelm
parents: 66978
diff changeset
   107
wenzelm
parents: 66978
diff changeset
   108
    component.load()
wenzelm
parents: 66978
diff changeset
   109
    if (autosave) {
wenzelm
parents: 66978
diff changeset
   110
      component.listenTo(component.selection)
wenzelm
parents: 66978
diff changeset
   111
      component.reactions += { case SelectionChanged(_) => component.save() }
wenzelm
parents: 66978
diff changeset
   112
    }
wenzelm
parents: 66978
diff changeset
   113
    component.tooltip = "Logic session name (change requires restart)"
wenzelm
parents: 66978
diff changeset
   114
    component
wenzelm
parents: 66978
diff changeset
   115
  }
wenzelm
parents: 66978
diff changeset
   116
wenzelm
parents: 66978
diff changeset
   117
wenzelm
parents: 66978
diff changeset
   118
  /* session build process */
64602
8edca3465758 added isabelle jedit -R;
wenzelm
parents: 63986
diff changeset
   119
66963
1c3d0c12bb51 clarified signature;
wenzelm
parents: 66574
diff changeset
   120
  def session_base_info(options: Options): Sessions.Base_Info =
66976
806bc39550a5 tuned signature;
wenzelm
parents: 66973
diff changeset
   121
    Sessions.base_info(options,
66989
wenzelm
parents: 66988
diff changeset
   122
      dirs = JEdit_Sessions.session_dirs(),
68541
12b4b3bc585d command-line option for include_sessions;
wenzelm
parents: 68370
diff changeset
   123
      include_sessions = logic_include_sessions,
68370
bcdc47c9d4af clarified signature;
wenzelm
parents: 68209
diff changeset
   124
      session = logic_name(options),
bcdc47c9d4af clarified signature;
wenzelm
parents: 68209
diff changeset
   125
      session_ancestor = logic_ancestor,
70683
8c7706b053c7 find theory files via session structure: much faster Prover IDE startup;
wenzelm
parents: 70382
diff changeset
   126
      session_requirements = logic_requirements)
65571
923e32ad0976 clarified modules;
wenzelm
parents: 65519
diff changeset
   127
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
   128
  def session_build(
71726
a5fda30edae2 clarified signature: more uniform treatment of stopped/interrupted state;
wenzelm
parents: 71604
diff changeset
   129
    options: Options, progress: Progress = new Progress, no_build: Boolean = false): Int =
62972
wenzelm
parents: 62754
diff changeset
   130
  {
67846
wenzelm
parents: 67026
diff changeset
   131
    Build.build(session_options(options), progress = progress, build_heap = true,
69854
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 69853
diff changeset
   132
      no_build = no_build, dirs = session_dirs(), infos = PIDE.resources.session_base_info.infos,
66973
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
   133
      sessions = List(PIDE.resources.session_name)).rc
62972
wenzelm
parents: 62754
diff changeset
   134
  }
wenzelm
parents: 62754
diff changeset
   135
69854
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 69853
diff changeset
   136
  def session_start(options0: Options)
62972
wenzelm
parents: 62754
diff changeset
   137
  {
71604
c6fa217c9d5e clarified signature: more robust startup_join;
wenzelm
parents: 71598
diff changeset
   138
    val session = PIDE.session
69854
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 69853
diff changeset
   139
    val options = session_options(options0)
71604
c6fa217c9d5e clarified signature: more robust startup_join;
wenzelm
parents: 71598
diff changeset
   140
    val sessions_structure = PIDE.resources.session_base_info.sessions_structure
71598
269dc4bf1f40 clarified signature;
wenzelm
parents: 71597
diff changeset
   141
    val store = Sessions.store(options)
69854
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 69853
diff changeset
   142
71604
c6fa217c9d5e clarified signature: more robust startup_join;
wenzelm
parents: 71598
diff changeset
   143
    session.phase_changed += PIDE.plugin.session_phase_changed
c6fa217c9d5e clarified signature: more robust startup_join;
wenzelm
parents: 71598
diff changeset
   144
c6fa217c9d5e clarified signature: more robust startup_join;
wenzelm
parents: 71598
diff changeset
   145
    Isabelle_Process(session, options, sessions_structure, store,
66973
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
   146
      logic = PIDE.resources.session_name,
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
   147
      modes =
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
   148
        (space_explode(',', options.string("jedit_print_mode")) :::
71604
c6fa217c9d5e clarified signature: more robust startup_join;
wenzelm
parents: 71598
diff changeset
   149
         space_explode(',', Isabelle_System.getenv("JEDIT_PRINT_MODE"))).reverse)
62972
wenzelm
parents: 62754
diff changeset
   150
  }
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
   151
}