src/Tools/jEdit/src/jedit_sessions.scala
author wenzelm
Thu, 31 Aug 2017 16:35:09 +0200
changeset 66572 1e5ae735e026
parent 66460 f7b0d6fb417a
child 66574 e16b27bd3f76
permissions -rw-r--r--
tolerate errors in session structure, although this may lead to confusion about theory imports later on;
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
{
62972
wenzelm
parents: 62754
diff changeset
    19
  /* session info */
wenzelm
parents: 62754
diff changeset
    20
50403
87868964733c more uniform default logic, using settings, options, args etc.;
wenzelm
parents: 50380
diff changeset
    21
  private val option_name = "jedit_logic"
87868964733c more uniform default logic, using settings, options, args etc.;
wenzelm
parents: 50380
diff changeset
    22
64602
8edca3465758 added isabelle jedit -R;
wenzelm
parents: 63986
diff changeset
    23
  sealed case class Info(name: String, open_root: Position.T)
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
    24
62972
wenzelm
parents: 62754
diff changeset
    25
  def session_dirs(): List[Path] = Path.split(Isabelle_System.getenv("JEDIT_SESSION_DIRS"))
wenzelm
parents: 62754
diff changeset
    26
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
    27
  def session_options(options: Options): Options =
63986
c7a4b03727ae options for process policy, notably for multiprocessor machines;
wenzelm
parents: 62974
diff changeset
    28
    Isabelle_System.getenv("JEDIT_ML_PROCESS_POLICY") match {
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
    29
      case "" => options
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
    30
      case s => options.string("ML_process_policy") = s
63986
c7a4b03727ae options for process policy, notably for multiprocessor machines;
wenzelm
parents: 62974
diff changeset
    31
    }
c7a4b03727ae options for process policy, notably for multiprocessor machines;
wenzelm
parents: 62974
diff changeset
    32
65572
6acb28e5ba41 clarified meaning of "isabelle jedit -R": avoid potential problems with all_known = true;
wenzelm
parents: 65571
diff changeset
    33
  def session_restricted(): Boolean =
6acb28e5ba41 clarified meaning of "isabelle jedit -R": avoid potential problems with all_known = true;
wenzelm
parents: 65571
diff changeset
    34
    Isabelle_System.getenv("JEDIT_LOGIC_RESTRICT") == "true"
6acb28e5ba41 clarified meaning of "isabelle jedit -R": avoid potential problems with all_known = true;
wenzelm
parents: 65571
diff changeset
    35
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
    36
  def session_info(options: Options): Info =
64602
8edca3465758 added isabelle jedit -R;
wenzelm
parents: 63986
diff changeset
    37
  {
8edca3465758 added isabelle jedit -R;
wenzelm
parents: 63986
diff changeset
    38
    val logic =
8edca3465758 added isabelle jedit -R;
wenzelm
parents: 63986
diff changeset
    39
      Isabelle_System.default_logic(
8edca3465758 added isabelle jedit -R;
wenzelm
parents: 63986
diff changeset
    40
        Isabelle_System.getenv("JEDIT_LOGIC"),
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
    41
        options.string(option_name))
64602
8edca3465758 added isabelle jedit -R;
wenzelm
parents: 63986
diff changeset
    42
8edca3465758 added isabelle jedit -R;
wenzelm
parents: 63986
diff changeset
    43
    (for {
65421
wenzelm
parents: 65420
diff changeset
    44
      sessions <-
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
    45
        try { Some(Sessions.load(session_options(options), dirs = session_dirs())) }
64602
8edca3465758 added isabelle jedit -R;
wenzelm
parents: 63986
diff changeset
    46
        catch { case ERROR(_) => None }
65421
wenzelm
parents: 65420
diff changeset
    47
      info <- sessions.get(logic)
64602
8edca3465758 added isabelle jedit -R;
wenzelm
parents: 63986
diff changeset
    48
      parent <- info.parent
65572
6acb28e5ba41 clarified meaning of "isabelle jedit -R": avoid potential problems with all_known = true;
wenzelm
parents: 65571
diff changeset
    49
      if session_restricted()
64602
8edca3465758 added isabelle jedit -R;
wenzelm
parents: 63986
diff changeset
    50
    } yield Info(parent, info.pos)) getOrElse Info(logic, Position.none)
8edca3465758 added isabelle jedit -R;
wenzelm
parents: 63986
diff changeset
    51
  }
8edca3465758 added isabelle jedit -R;
wenzelm
parents: 63986
diff changeset
    52
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
    53
  def session_name(options: Options): String = session_info(options).name
64602
8edca3465758 added isabelle jedit -R;
wenzelm
parents: 63986
diff changeset
    54
66572
1e5ae735e026 tolerate errors in session structure, although this may lead to confusion about theory imports later on;
wenzelm
parents: 66460
diff changeset
    55
  def session_base(options: Options): (List[String], Sessions.Base) =
65572
6acb28e5ba41 clarified meaning of "isabelle jedit -R": avoid potential problems with all_known = true;
wenzelm
parents: 65571
diff changeset
    56
  {
6acb28e5ba41 clarified meaning of "isabelle jedit -R": avoid potential problems with all_known = true;
wenzelm
parents: 65571
diff changeset
    57
    val all_known = !session_restricted()
66572
1e5ae735e026 tolerate errors in session structure, although this may lead to confusion about theory imports later on;
wenzelm
parents: 66460
diff changeset
    58
    val (errs, base) =
1e5ae735e026 tolerate errors in session structure, although this may lead to confusion about theory imports later on;
wenzelm
parents: 66460
diff changeset
    59
      Sessions.session_base_errors(
1e5ae735e026 tolerate errors in session structure, although this may lead to confusion about theory imports later on;
wenzelm
parents: 66460
diff changeset
    60
        options, session_name(options), dirs = JEdit_Sessions.session_dirs(), all_known = all_known)
1e5ae735e026 tolerate errors in session structure, although this may lead to confusion about theory imports later on;
wenzelm
parents: 66460
diff changeset
    61
    (errs, base.platform_path)
65572
6acb28e5ba41 clarified meaning of "isabelle jedit -R": avoid potential problems with all_known = true;
wenzelm
parents: 65571
diff changeset
    62
  }
65571
923e32ad0976 clarified modules;
wenzelm
parents: 65519
diff changeset
    63
62972
wenzelm
parents: 62754
diff changeset
    64
  def session_build_mode(): String = Isabelle_System.getenv("JEDIT_BUILD_MODE")
wenzelm
parents: 62754
diff changeset
    65
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
    66
  def session_build(
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
    67
    options: Options, progress: Progress = No_Progress, no_build: Boolean = false): Int =
62972
wenzelm
parents: 62754
diff changeset
    68
  {
wenzelm
parents: 62754
diff changeset
    69
    val mode = session_build_mode()
wenzelm
parents: 62754
diff changeset
    70
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
    71
    Build.build(options = session_options(options), progress = progress,
62972
wenzelm
parents: 62754
diff changeset
    72
      build_heap = true, no_build = no_build, system_mode = mode == "" || mode == "system",
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
    73
      dirs = session_dirs(), sessions = List(session_name(options))).rc
62972
wenzelm
parents: 62754
diff changeset
    74
  }
wenzelm
parents: 62754
diff changeset
    75
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
    76
  def session_start(options: Options)
62972
wenzelm
parents: 62754
diff changeset
    77
  {
wenzelm
parents: 62754
diff changeset
    78
    val modes =
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
    79
      (space_explode(',', options.string("jedit_print_mode")) :::
62972
wenzelm
parents: 62754
diff changeset
    80
       space_explode(',', Isabelle_System.getenv("JEDIT_PRINT_MODE"))).reverse
63986
c7a4b03727ae options for process policy, notably for multiprocessor machines;
wenzelm
parents: 62974
diff changeset
    81
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
    82
    Isabelle_Process.start(PIDE.session, session_options(options),
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
    83
      logic = session_name(options), dirs = session_dirs(), modes = modes,
65226
wenzelm
parents: 65216
diff changeset
    84
      store = Sessions.store(session_build_mode() == "system"),
wenzelm
parents: 65216
diff changeset
    85
      phase_changed = PIDE.plugin.session_phase_changed)
62972
wenzelm
parents: 62754
diff changeset
    86
  }
wenzelm
parents: 62754
diff changeset
    87
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
    88
  def session_list(options: Options): List[String] =
62972
wenzelm
parents: 62754
diff changeset
    89
  {
65421
wenzelm
parents: 65420
diff changeset
    90
    val sessions = Sessions.load(options, dirs = session_dirs())
62972
wenzelm
parents: 62754
diff changeset
    91
    val (main_sessions, other_sessions) =
65519
d244d8f8e13f store Sessions.Info.name;
wenzelm
parents: 65421
diff changeset
    92
      sessions.imports_topological_order.partition(info => info.groups.contains("main"))
d244d8f8e13f store Sessions.Info.name;
wenzelm
parents: 65421
diff changeset
    93
    main_sessions.map(_.name).sorted ::: other_sessions.map(_.name).sorted
62972
wenzelm
parents: 62754
diff changeset
    94
  }
wenzelm
parents: 62754
diff changeset
    95
wenzelm
parents: 62754
diff changeset
    96
wenzelm
parents: 62754
diff changeset
    97
  /* logic selector */
wenzelm
parents: 62754
diff changeset
    98
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
    99
  private class Logic_Entry(val name: String, val description: String)
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
   100
  {
57912
wenzelm
parents: 57612
diff changeset
   101
    override def toString: String = description
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
   102
  }
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
   103
66460
f7b0d6fb417a proper update of options (amending c3d6dd17d626);
wenzelm
parents: 65572
diff changeset
   104
  def logic_selector(options: Options_Variable, autosave: Boolean): Option_Component =
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
   105
  {
57612
990ffb84489b clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents: 56890
diff changeset
   106
    GUI_Thread.require {}
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
   107
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
   108
    val entries =
66460
f7b0d6fb417a proper update of options (amending c3d6dd17d626);
wenzelm
parents: 65572
diff changeset
   109
      new Logic_Entry("", "default (" + session_name(options.value) + ")") ::
f7b0d6fb417a proper update of options (amending c3d6dd17d626);
wenzelm
parents: 65572
diff changeset
   110
        session_list(options.value).map(name => new Logic_Entry(name, name))
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
   111
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
   112
    val component = new ComboBox(entries) with Option_Component {
50375
c101127a7f37 clarified logic argument: session name, not path name;
wenzelm
parents: 50205
diff changeset
   113
      name = option_name
49270
e5d162d15867 some support to organize options in sections;
wenzelm
parents: 49248
diff changeset
   114
      val title = "Logic"
49247
ffd9ad9dc35b more detailed option tooltip;
wenzelm
parents: 49246
diff changeset
   115
      def load: Unit =
ffd9ad9dc35b more detailed option tooltip;
wenzelm
parents: 49246
diff changeset
   116
      {
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
   117
        val logic = options.string(option_name)
49247
ffd9ad9dc35b more detailed option tooltip;
wenzelm
parents: 49246
diff changeset
   118
        entries.find(_.name == logic) match {
ffd9ad9dc35b more detailed option tooltip;
wenzelm
parents: 49246
diff changeset
   119
          case Some(entry) => selection.item = entry
ffd9ad9dc35b more detailed option tooltip;
wenzelm
parents: 49246
diff changeset
   120
          case None =>
ffd9ad9dc35b more detailed option tooltip;
wenzelm
parents: 49246
diff changeset
   121
        }
ffd9ad9dc35b more detailed option tooltip;
wenzelm
parents: 49246
diff changeset
   122
      }
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 65254
diff changeset
   123
      def save: Unit = options.string(option_name) = selection.item.name
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
   124
    }
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
   125
49247
ffd9ad9dc35b more detailed option tooltip;
wenzelm
parents: 49246
diff changeset
   126
    component.load()
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
   127
    if (autosave) {
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
   128
      component.listenTo(component.selection)
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
   129
      component.reactions += { case SelectionChanged(_) => component.save() }
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
   130
    }
50380
b1cb76418760 select logic session names, not paths;
wenzelm
parents: 50375
diff changeset
   131
    component.tooltip = "Logic session name (change requires restart)"
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
   132
    component
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
   133
  }
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents:
diff changeset
   134
}