src/Tools/jEdit/src/jedit_sessions.scala
author wenzelm
Thu, 02 Nov 2017 11:25:37 +0100
changeset 66988 7f8c1dd7576a
parent 66987 352b23c97ac8
child 66989 25665e7775b7
permissions -rw-r--r--
support alternative ancestor session;
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
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
    21
  def session_options(options: Options): Options =
63986
c7a4b03727ae options for process policy, notably for multiprocessor machines;
wenzelm
parents: 62974
diff changeset
    22
    Isabelle_System.getenv("JEDIT_ML_PROCESS_POLICY") match {
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
    23
      case "" => options
66973
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    24
      case s => options.string.update("ML_process_policy", s)
63986
c7a4b03727ae options for process policy, notably for multiprocessor machines;
wenzelm
parents: 62974
diff changeset
    25
    }
c7a4b03727ae options for process policy, notably for multiprocessor machines;
wenzelm
parents: 62974
diff changeset
    26
66973
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    27
  def session_dirs(): List[Path] =
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    28
    Path.split(Isabelle_System.getenv("JEDIT_SESSION_DIRS"))
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    29
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    30
  def session_build_mode(): String = Isabelle_System.getenv("JEDIT_BUILD_MODE")
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    31
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    32
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    33
  /* raw logic info */
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    34
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    35
  private val jedit_logic_option = "jedit_logic"
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    36
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    37
  def logic_name(options: Options): String =
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    38
    Isabelle_System.default_logic(
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    39
      Isabelle_System.getenv("JEDIT_LOGIC"),
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    40
      options.string(jedit_logic_option))
64602
8edca3465758 added isabelle jedit -R;
wenzelm
parents: 63986
diff changeset
    41
66988
7f8c1dd7576a support alternative ancestor session;
wenzelm
parents: 66987
diff changeset
    42
  def logic_ancestor: Option[String] = proper_string(Isabelle_System.getenv("JEDIT_LOGIC_ANCESTOR"))
66987
352b23c97ac8 support focus_session, for much faster startup of Isabelle/jEdit;
wenzelm
parents: 66979
diff changeset
    43
  def logic_focus: Boolean = Isabelle_System.getenv("JEDIT_LOGIC_FOCUS") == "true"
66973
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    44
  def logic_base: Boolean = Isabelle_System.getenv("JEDIT_LOGIC_BASE") == "true"
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    45
  def logic_parent: Boolean = Isabelle_System.getenv("JEDIT_LOGIC_PARENT") == "true"
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    46
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    47
  def logic_info(options: Options): Option[Sessions.Info] =
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    48
    try { Sessions.load(session_options(options), dirs = session_dirs()).get(logic_name(options)) }
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    49
    catch { case ERROR(_) => None }
64602
8edca3465758 added isabelle jedit -R;
wenzelm
parents: 63986
diff changeset
    50
66973
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    51
  def logic_root(options: Options): Position.T =
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    52
    if (Isabelle_System.getenv("JEDIT_LOGIC_ROOT") == "true") {
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    53
      logic_info(options).map(_.pos) getOrElse Position.none
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    54
    }
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    55
    else Position.none
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    56
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
    57
66979
wenzelm
parents: 66978
diff changeset
    58
  /* logic selector */
wenzelm
parents: 66978
diff changeset
    59
wenzelm
parents: 66978
diff changeset
    60
  private class Logic_Entry(val name: String, val description: String)
wenzelm
parents: 66978
diff changeset
    61
  {
wenzelm
parents: 66978
diff changeset
    62
    override def toString: String = description
wenzelm
parents: 66978
diff changeset
    63
  }
wenzelm
parents: 66978
diff changeset
    64
wenzelm
parents: 66978
diff changeset
    65
  def logic_selector(options: Options_Variable, autosave: Boolean): Option_Component =
wenzelm
parents: 66978
diff changeset
    66
  {
wenzelm
parents: 66978
diff changeset
    67
    GUI_Thread.require {}
wenzelm
parents: 66978
diff changeset
    68
wenzelm
parents: 66978
diff changeset
    69
    val session_list =
wenzelm
parents: 66978
diff changeset
    70
    {
wenzelm
parents: 66978
diff changeset
    71
      val sessions = Sessions.load(options.value, dirs = session_dirs())
wenzelm
parents: 66978
diff changeset
    72
      val (main_sessions, other_sessions) =
wenzelm
parents: 66978
diff changeset
    73
        sessions.imports_topological_order.partition(info => info.groups.contains("main"))
wenzelm
parents: 66978
diff changeset
    74
      main_sessions.map(_.name).sorted ::: other_sessions.map(_.name).sorted
wenzelm
parents: 66978
diff changeset
    75
    }
wenzelm
parents: 66978
diff changeset
    76
wenzelm
parents: 66978
diff changeset
    77
    val entries =
wenzelm
parents: 66978
diff changeset
    78
      new Logic_Entry("", "default (" + logic_name(options.value) + ")") ::
wenzelm
parents: 66978
diff changeset
    79
        session_list.map(name => new Logic_Entry(name, name))
wenzelm
parents: 66978
diff changeset
    80
wenzelm
parents: 66978
diff changeset
    81
    val component = new ComboBox(entries) with Option_Component {
wenzelm
parents: 66978
diff changeset
    82
      name = jedit_logic_option
wenzelm
parents: 66978
diff changeset
    83
      val title = "Logic"
wenzelm
parents: 66978
diff changeset
    84
      def load: Unit =
wenzelm
parents: 66978
diff changeset
    85
      {
wenzelm
parents: 66978
diff changeset
    86
        val logic = options.string(jedit_logic_option)
wenzelm
parents: 66978
diff changeset
    87
        entries.find(_.name == logic) match {
wenzelm
parents: 66978
diff changeset
    88
          case Some(entry) => selection.item = entry
wenzelm
parents: 66978
diff changeset
    89
          case None =>
wenzelm
parents: 66978
diff changeset
    90
        }
wenzelm
parents: 66978
diff changeset
    91
      }
wenzelm
parents: 66978
diff changeset
    92
      def save: Unit = options.string(jedit_logic_option) = selection.item.name
wenzelm
parents: 66978
diff changeset
    93
    }
wenzelm
parents: 66978
diff changeset
    94
wenzelm
parents: 66978
diff changeset
    95
    component.load()
wenzelm
parents: 66978
diff changeset
    96
    if (autosave) {
wenzelm
parents: 66978
diff changeset
    97
      component.listenTo(component.selection)
wenzelm
parents: 66978
diff changeset
    98
      component.reactions += { case SelectionChanged(_) => component.save() }
wenzelm
parents: 66978
diff changeset
    99
    }
wenzelm
parents: 66978
diff changeset
   100
    component.tooltip = "Logic session name (change requires restart)"
wenzelm
parents: 66978
diff changeset
   101
    component
wenzelm
parents: 66978
diff changeset
   102
  }
wenzelm
parents: 66978
diff changeset
   103
wenzelm
parents: 66978
diff changeset
   104
wenzelm
parents: 66978
diff changeset
   105
  /* session build process */
64602
8edca3465758 added isabelle jedit -R;
wenzelm
parents: 63986
diff changeset
   106
66963
1c3d0c12bb51 clarified signature;
wenzelm
parents: 66574
diff changeset
   107
  def session_base_info(options: Options): Sessions.Base_Info =
66976
806bc39550a5 tuned signature;
wenzelm
parents: 66973
diff changeset
   108
    Sessions.base_info(options,
66987
352b23c97ac8 support focus_session, for much faster startup of Isabelle/jEdit;
wenzelm
parents: 66979
diff changeset
   109
      session =
352b23c97ac8 support focus_session, for much faster startup of Isabelle/jEdit;
wenzelm
parents: 66979
diff changeset
   110
        if (logic_parent) logic_info(options).flatMap(_.parent) getOrElse logic_name(options)
352b23c97ac8 support focus_session, for much faster startup of Isabelle/jEdit;
wenzelm
parents: 66979
diff changeset
   111
        else logic_name(options),
66973
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
   112
      dirs = JEdit_Sessions.session_dirs(),
66988
7f8c1dd7576a support alternative ancestor session;
wenzelm
parents: 66987
diff changeset
   113
      ancestor_session = logic_ancestor,
66987
352b23c97ac8 support focus_session, for much faster startup of Isabelle/jEdit;
wenzelm
parents: 66979
diff changeset
   114
      all_known = !logic_focus,
352b23c97ac8 support focus_session, for much faster startup of Isabelle/jEdit;
wenzelm
parents: 66979
diff changeset
   115
      focus_session = logic_focus,
66973
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
   116
      required_session = logic_base)
65571
923e32ad0976 clarified modules;
wenzelm
parents: 65519
diff changeset
   117
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
   118
  def session_build(
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
   119
    options: Options, progress: Progress = No_Progress, no_build: Boolean = false): Int =
62972
wenzelm
parents: 62754
diff changeset
   120
  {
wenzelm
parents: 62754
diff changeset
   121
    val mode = session_build_mode()
wenzelm
parents: 62754
diff changeset
   122
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
   123
    Build.build(options = session_options(options), progress = progress,
62972
wenzelm
parents: 62754
diff changeset
   124
      build_heap = true, no_build = no_build, system_mode = mode == "" || mode == "system",
66973
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
   125
      dirs = session_dirs(), infos = PIDE.resources.session_base_info.infos,
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
   126
      sessions = List(PIDE.resources.session_name)).rc
62972
wenzelm
parents: 62754
diff changeset
   127
  }
wenzelm
parents: 62754
diff changeset
   128
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
   129
  def session_start(options: Options)
62972
wenzelm
parents: 62754
diff changeset
   130
  {
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
   131
    Isabelle_Process.start(PIDE.session, session_options(options),
66973
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
   132
      sessions = Some(PIDE.resources.session_base_info.sessions),
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
   133
      logic = PIDE.resources.session_name,
65226
wenzelm
parents: 65216
diff changeset
   134
      store = Sessions.store(session_build_mode() == "system"),
66973
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
   135
      modes =
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
   136
        (space_explode(',', options.string("jedit_print_mode")) :::
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 66965
diff changeset
   137
         space_explode(',', Isabelle_System.getenv("JEDIT_PRINT_MODE"))).reverse,
65226
wenzelm
parents: 65216
diff changeset
   138
      phase_changed = PIDE.plugin.session_phase_changed)
62972
wenzelm
parents: 62754
diff changeset
   139
  }
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
   140
}