src/Tools/jEdit/src/jedit_options.scala
author wenzelm
Sat, 19 Apr 2014 19:03:32 +0200
changeset 56622 891d1b8b64fb
parent 56611 eb088da48f86
child 56662 f373fb77e0a4
permissions -rw-r--r--
clarified tooltip_lines: HTML.encode already takes care of newline (but not space);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
49245
cb70157293c0 manage Isabelle/jEdit options as Isabelle/Scala options (with persistent preferences);
wenzelm
parents:
diff changeset
     1
/*  Title:      Tools/jEdit/src/jedit_options.scala
cb70157293c0 manage Isabelle/jEdit options as Isabelle/Scala options (with persistent preferences);
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
cb70157293c0 manage Isabelle/jEdit options as Isabelle/Scala options (with persistent preferences);
wenzelm
parents:
diff changeset
     3
cb70157293c0 manage Isabelle/jEdit options as Isabelle/Scala options (with persistent preferences);
wenzelm
parents:
diff changeset
     4
Options for Isabelle/jEdit.
cb70157293c0 manage Isabelle/jEdit options as Isabelle/Scala options (with persistent preferences);
wenzelm
parents:
diff changeset
     5
*/
cb70157293c0 manage Isabelle/jEdit options as Isabelle/Scala options (with persistent preferences);
wenzelm
parents:
diff changeset
     6
cb70157293c0 manage Isabelle/jEdit options as Isabelle/Scala options (with persistent preferences);
wenzelm
parents:
diff changeset
     7
package isabelle.jedit
cb70157293c0 manage Isabelle/jEdit options as Isabelle/Scala options (with persistent preferences);
wenzelm
parents:
diff changeset
     8
cb70157293c0 manage Isabelle/jEdit options as Isabelle/Scala options (with persistent preferences);
wenzelm
parents:
diff changeset
     9
cb70157293c0 manage Isabelle/jEdit options as Isabelle/Scala options (with persistent preferences);
wenzelm
parents:
diff changeset
    10
import isabelle._
cb70157293c0 manage Isabelle/jEdit options as Isabelle/Scala options (with persistent preferences);
wenzelm
parents:
diff changeset
    11
49356
6e0c0ffb6ec7 more static handling of rendering options;
wenzelm
parents: 49317
diff changeset
    12
import java.awt.Color
49252
9e10481dd3c4 prefer global default font over IsabelleText of jEdit TextArea;
wenzelm
parents: 49248
diff changeset
    13
import javax.swing.{InputVerifier, JComponent, UIManager}
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    14
import javax.swing.text.JTextComponent
49252
9e10481dd3c4 prefer global default font over IsabelleText of jEdit TextArea;
wenzelm
parents: 49248
diff changeset
    15
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    16
import scala.swing.{Component, CheckBox, TextArea}
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    17
49296
313369027391 some GUI support for color options;
wenzelm
parents: 49289
diff changeset
    18
import org.gjt.sp.jedit.gui.ColorWellButton
313369027391 some GUI support for color options;
wenzelm
parents: 49289
diff changeset
    19
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    20
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    21
trait Option_Component extends Component
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    22
{
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    23
  val title: String
49247
ffd9ad9dc35b more detailed option tooltip;
wenzelm
parents: 49246
diff changeset
    24
  def load(): Unit
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    25
  def save(): Unit
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    26
}
49245
cb70157293c0 manage Isabelle/jEdit options as Isabelle/Scala options (with persistent preferences);
wenzelm
parents:
diff changeset
    27
52065
78f2475aa126 explicit notion of public options, which are shown in the editor options dialog;
wenzelm
parents: 51616
diff changeset
    28
object JEdit_Options
78f2475aa126 explicit notion of public options, which are shown in the editor options dialog;
wenzelm
parents: 51616
diff changeset
    29
{
78f2475aa126 explicit notion of public options, which are shown in the editor options dialog;
wenzelm
parents: 51616
diff changeset
    30
  val RENDERING_SECTION = "Rendering of Document Content"
78f2475aa126 explicit notion of public options, which are shown in the editor options dialog;
wenzelm
parents: 51616
diff changeset
    31
}
78f2475aa126 explicit notion of public options, which are shown in the editor options dialog;
wenzelm
parents: 51616
diff changeset
    32
49245
cb70157293c0 manage Isabelle/jEdit options as Isabelle/Scala options (with persistent preferences);
wenzelm
parents:
diff changeset
    33
class JEdit_Options extends Options_Variable
cb70157293c0 manage Isabelle/jEdit options as Isabelle/Scala options (with persistent preferences);
wenzelm
parents:
diff changeset
    34
{
49356
6e0c0ffb6ec7 more static handling of rendering options;
wenzelm
parents: 49317
diff changeset
    35
  def color_value(s: String): Color = Color_Value(string(s))
6e0c0ffb6ec7 more static handling of rendering options;
wenzelm
parents: 49317
diff changeset
    36
49296
313369027391 some GUI support for color options;
wenzelm
parents: 49289
diff changeset
    37
  def make_color_component(opt: Options.Opt): Option_Component =
313369027391 some GUI support for color options;
wenzelm
parents: 49289
diff changeset
    38
  {
313369027391 some GUI support for color options;
wenzelm
parents: 49289
diff changeset
    39
    Swing_Thread.require()
313369027391 some GUI support for color options;
wenzelm
parents: 49289
diff changeset
    40
313369027391 some GUI support for color options;
wenzelm
parents: 49289
diff changeset
    41
    val opt_name = opt.name
313369027391 some GUI support for color options;
wenzelm
parents: 49289
diff changeset
    42
    val opt_title = opt.title("jedit")
313369027391 some GUI support for color options;
wenzelm
parents: 49289
diff changeset
    43
313369027391 some GUI support for color options;
wenzelm
parents: 49289
diff changeset
    44
    val button = new ColorWellButton(Color_Value(opt.value))
313369027391 some GUI support for color options;
wenzelm
parents: 49289
diff changeset
    45
    val component = new Component with Option_Component {
313369027391 some GUI support for color options;
wenzelm
parents: 49289
diff changeset
    46
      override lazy val peer = button
313369027391 some GUI support for color options;
wenzelm
parents: 49289
diff changeset
    47
      name = opt_name
313369027391 some GUI support for color options;
wenzelm
parents: 49289
diff changeset
    48
      val title = opt_title
313369027391 some GUI support for color options;
wenzelm
parents: 49289
diff changeset
    49
      def load = button.setSelectedColor(Color_Value(string(opt_name)))
313369027391 some GUI support for color options;
wenzelm
parents: 49289
diff changeset
    50
      def save = string(opt_name) = Color_Value.print(button.getSelectedColor)
313369027391 some GUI support for color options;
wenzelm
parents: 49289
diff changeset
    51
    }
56622
891d1b8b64fb clarified tooltip_lines: HTML.encode already takes care of newline (but not space);
wenzelm
parents: 56611
diff changeset
    52
    component.tooltip = GUI.tooltip_lines(opt.print_default)
49296
313369027391 some GUI support for color options;
wenzelm
parents: 49289
diff changeset
    53
    component
313369027391 some GUI support for color options;
wenzelm
parents: 49289
diff changeset
    54
  }
313369027391 some GUI support for color options;
wenzelm
parents: 49289
diff changeset
    55
49270
e5d162d15867 some support to organize options in sections;
wenzelm
parents: 49252
diff changeset
    56
  def make_component(opt: Options.Opt): Option_Component =
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    57
  {
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    58
    Swing_Thread.require()
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    59
49270
e5d162d15867 some support to organize options in sections;
wenzelm
parents: 49252
diff changeset
    60
    val opt_name = opt.name
e5d162d15867 some support to organize options in sections;
wenzelm
parents: 49252
diff changeset
    61
    val opt_title = opt.title("jedit")
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    62
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    63
    val component =
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    64
      if (opt.typ == Options.Bool)
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    65
        new CheckBox with Option_Component {
49270
e5d162d15867 some support to organize options in sections;
wenzelm
parents: 49252
diff changeset
    66
          name = opt_name
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    67
          val title = opt_title
49247
ffd9ad9dc35b more detailed option tooltip;
wenzelm
parents: 49246
diff changeset
    68
          def load = selected = bool(opt_name)
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    69
          def save = bool(opt_name) = selected
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    70
        }
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    71
      else {
49252
9e10481dd3c4 prefer global default font over IsabelleText of jEdit TextArea;
wenzelm
parents: 49248
diff changeset
    72
        val default_font = UIManager.getFont("TextField.font")
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    73
        val text_area =
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    74
          new TextArea with Option_Component {
49252
9e10481dd3c4 prefer global default font over IsabelleText of jEdit TextArea;
wenzelm
parents: 49248
diff changeset
    75
            if (default_font != null) font = default_font
49270
e5d162d15867 some support to organize options in sections;
wenzelm
parents: 49252
diff changeset
    76
            name = opt_name
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    77
            val title = opt_title
49247
ffd9ad9dc35b more detailed option tooltip;
wenzelm
parents: 49246
diff changeset
    78
            def load = text = value.check_name(opt_name).value
49317
5eff42e69edb tuned error;
wenzelm
parents: 49296
diff changeset
    79
            def save =
5eff42e69edb tuned error;
wenzelm
parents: 49296
diff changeset
    80
              try { update(value + (opt_name, text)) }
5eff42e69edb tuned error;
wenzelm
parents: 49296
diff changeset
    81
              catch {
5eff42e69edb tuned error;
wenzelm
parents: 49296
diff changeset
    82
                case ERROR(msg) =>
51616
949e2cf02a3d tuned signature -- concentrate GUI tools;
wenzelm
parents: 49701
diff changeset
    83
                  GUI.error_dialog(this.peer, "Failed to update options",
949e2cf02a3d tuned signature -- concentrate GUI tools;
wenzelm
parents: 49701
diff changeset
    84
                    GUI.scrollable_text(msg))
49317
5eff42e69edb tuned error;
wenzelm
parents: 49296
diff changeset
    85
              }
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    86
          }
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    87
        text_area.peer.setInputVerifier(new InputVerifier {
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    88
          def verify(jcomponent: JComponent): Boolean =
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    89
            jcomponent match {
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    90
              case text: JTextComponent =>
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    91
                try { value + (opt_name, text.getText); true }
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    92
                catch { case ERROR(_) => false }
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    93
              case _ => true
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    94
            }
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    95
          })
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    96
        text_area
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
    97
      }
49247
ffd9ad9dc35b more detailed option tooltip;
wenzelm
parents: 49246
diff changeset
    98
    component.load()
56622
891d1b8b64fb clarified tooltip_lines: HTML.encode already takes care of newline (but not space);
wenzelm
parents: 56611
diff changeset
    99
    component.tooltip = GUI.tooltip_lines(opt.print_default)
49246
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
   100
    component
248e66e8321f more systematic JEdit_Options.make_component;
wenzelm
parents: 49245
diff changeset
   101
  }
49270
e5d162d15867 some support to organize options in sections;
wenzelm
parents: 49252
diff changeset
   102
e5d162d15867 some support to organize options in sections;
wenzelm
parents: 49252
diff changeset
   103
  def make_components(predefined: List[Option_Component], filter: String => Boolean)
e5d162d15867 some support to organize options in sections;
wenzelm
parents: 49252
diff changeset
   104
    : List[(String, List[Option_Component])] =
e5d162d15867 some support to organize options in sections;
wenzelm
parents: 49252
diff changeset
   105
  {
e5d162d15867 some support to organize options in sections;
wenzelm
parents: 49252
diff changeset
   106
    def mk_component(opt: Options.Opt): List[Option_Component] =
e5d162d15867 some support to organize options in sections;
wenzelm
parents: 49252
diff changeset
   107
      predefined.find(opt.name == _.name) match {
e5d162d15867 some support to organize options in sections;
wenzelm
parents: 49252
diff changeset
   108
        case Some(c) => List(c)
e5d162d15867 some support to organize options in sections;
wenzelm
parents: 49252
diff changeset
   109
        case None => if (filter(opt.name)) List(make_component(opt)) else Nil
e5d162d15867 some support to organize options in sections;
wenzelm
parents: 49252
diff changeset
   110
      }
e5d162d15867 some support to organize options in sections;
wenzelm
parents: 49252
diff changeset
   111
    value.sections.sortBy(_._1).map(
e5d162d15867 some support to organize options in sections;
wenzelm
parents: 49252
diff changeset
   112
        { case (a, opts) => (a, opts.sortBy(_.title("jedit")).flatMap(mk_component _)) })
e5d162d15867 some support to organize options in sections;
wenzelm
parents: 49252
diff changeset
   113
      .filterNot(_._2.isEmpty)
e5d162d15867 some support to organize options in sections;
wenzelm
parents: 49252
diff changeset
   114
  }
49245
cb70157293c0 manage Isabelle/jEdit options as Isabelle/Scala options (with persistent preferences);
wenzelm
parents:
diff changeset
   115
}
cb70157293c0 manage Isabelle/jEdit options as Isabelle/Scala options (with persistent preferences);
wenzelm
parents:
diff changeset
   116