src/Tools/jEdit/src/jedit_spell_checker.scala
author wenzelm
Sun, 07 May 2023 14:24:22 +0200
changeset 77983 a35b9a01b5a9
parent 76765 c654103e9c9d
child 82142 508a673c87ac
permissions -rw-r--r--
tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
65139
0a2c0712e432 clarified modules: spell-checker in Pure;
wenzelm
parents: 64882
diff changeset
     1
/*  Title:      Tools/jEdit/src/jedit_spell_checker.scala
56547
e9bb73d7b6cf added spell-checker based on jortho-1.0;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
e9bb73d7b6cf added spell-checker based on jortho-1.0;
wenzelm
parents:
diff changeset
     3
65139
0a2c0712e432 clarified modules: spell-checker in Pure;
wenzelm
parents: 64882
diff changeset
     4
Specific spell-checker support for Isabelle/jEdit.
56547
e9bb73d7b6cf added spell-checker based on jortho-1.0;
wenzelm
parents:
diff changeset
     5
*/
e9bb73d7b6cf added spell-checker based on jortho-1.0;
wenzelm
parents:
diff changeset
     6
e9bb73d7b6cf added spell-checker based on jortho-1.0;
wenzelm
parents:
diff changeset
     7
package isabelle.jedit
e9bb73d7b6cf added spell-checker based on jortho-1.0;
wenzelm
parents:
diff changeset
     8
e9bb73d7b6cf added spell-checker based on jortho-1.0;
wenzelm
parents:
diff changeset
     9
e9bb73d7b6cf added spell-checker based on jortho-1.0;
wenzelm
parents:
diff changeset
    10
import isabelle._
e9bb73d7b6cf added spell-checker based on jortho-1.0;
wenzelm
parents:
diff changeset
    11
58549
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    12
import javax.swing.JMenuItem
56547
e9bb73d7b6cf added spell-checker based on jortho-1.0;
wenzelm
parents:
diff changeset
    13
58549
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    14
import org.gjt.sp.jedit.menu.EnhancedMenuItem
65139
0a2c0712e432 clarified modules: spell-checker in Pure;
wenzelm
parents: 64882
diff changeset
    15
import org.gjt.sp.jedit.jEdit
58549
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    16
import org.gjt.sp.jedit.textarea.{JEditTextArea, TextArea}
56574
2b38472a4695 some actions to maintain spell-checker dictionary;
wenzelm
parents: 56573
diff changeset
    17
56547
e9bb73d7b6cf added spell-checker based on jortho-1.0;
wenzelm
parents:
diff changeset
    18
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73367
diff changeset
    19
object JEdit_Spell_Checker {
65139
0a2c0712e432 clarified modules: spell-checker in Pure;
wenzelm
parents: 64882
diff changeset
    20
  /* completion */
58549
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    21
66119
wenzelm
parents: 66117
diff changeset
    22
  def completion(
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73367
diff changeset
    23
    rendering: JEdit_Rendering,
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73367
diff changeset
    24
    explicit: Boolean,
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73367
diff changeset
    25
    caret: Text.Offset
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73367
diff changeset
    26
  ): Option[Completion.Result] = {
66119
wenzelm
parents: 66117
diff changeset
    27
    PIDE.plugin.spell_checker.get match {
wenzelm
parents: 66117
diff changeset
    28
      case Some(spell_checker) if explicit =>
wenzelm
parents: 66117
diff changeset
    29
        spell_checker.completion(rendering, caret)
wenzelm
parents: 66117
diff changeset
    30
      case _ => None
wenzelm
parents: 66117
diff changeset
    31
    }
58549
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    32
  }
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    33
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    34
65139
0a2c0712e432 clarified modules: spell-checker in Pure;
wenzelm
parents: 64882
diff changeset
    35
  /* context menu */
58549
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    36
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73367
diff changeset
    37
  def context_menu(text_area: JEditTextArea, offset: Text.Offset): List[JMenuItem] = {
58549
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    38
    val result =
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    39
      for {
65239
509a9b0ad02e avoid global variables with implicit initialization;
wenzelm
parents: 65139
diff changeset
    40
        spell_checker <- PIDE.plugin.spell_checker.get
76765
c654103e9c9d more robust Document.Pending_Edits: cover all nodes simulataneously, and thus support proper Snapshot.switch;
wenzelm
parents: 76583
diff changeset
    41
        rendering <- Document_View.get_rendering(text_area)
58549
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    42
        range = JEdit_Lib.point_range(text_area.getBuffer, offset)
66116
dad409cd3423 clarified modules;
wenzelm
parents: 65239
diff changeset
    43
        Text.Info(_, word) <- Spell_Checker.current_word(rendering, range)
58549
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    44
      } yield (spell_checker, word)
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    45
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    46
    result match {
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    47
      case Some((spell_checker, word)) =>
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    48
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    49
        val context = jEdit.getActionContext()
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    50
        def item(name: String): JMenuItem =
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    51
          new EnhancedMenuItem(context.getAction(name).getLabel, name, context)
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    52
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    53
        val complete_items =
66137
d2923067b376 tuned signature;
wenzelm
parents: 66119
diff changeset
    54
          if (spell_checker.complete(word).nonEmpty) List(item("isabelle.complete-word"))
58549
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    55
          else Nil
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    56
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    57
        val update_items =
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    58
          if (spell_checker.check(word))
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    59
            List(item("isabelle.exclude-word"), item("isabelle.exclude-word-permanently"))
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    60
          else
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    61
            List(item("isabelle.include-word"), item("isabelle.include-word-permanently"))
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    62
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    63
        val reset_items =
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    64
          spell_checker.reset_enabled() match {
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    65
            case 0 => Nil
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    66
            case n =>
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    67
              val name = "isabelle.reset-words"
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    68
              val label = context.getAction(name).getLabel
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    69
              List(new EnhancedMenuItem(label + " (" + n + ")", name, context))
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    70
          }
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    71
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    72
        complete_items ::: update_items ::: reset_items
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    73
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    74
      case None => Nil
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    75
    }
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    76
  }
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    77
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    78
65139
0a2c0712e432 clarified modules: spell-checker in Pure;
wenzelm
parents: 64882
diff changeset
    79
  /* dictionaries */
56557
18d921496aa5 updated to jortho-1.0-1: dictionaries from SCOWL 7.1, with parameters like aspell;
wenzelm
parents: 56552
diff changeset
    80
76391
6129e8cb140d tuned signature;
wenzelm
parents: 75839
diff changeset
    81
  def dictionaries_selector(): JEdit_Options.Entry = {
57612
990ffb84489b clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents: 56662
diff changeset
    82
    GUI_Thread.require {}
56559
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    83
56569
wenzelm
parents: 56568
diff changeset
    84
    val option_name = "spell_checker_dictionary"
56559
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    85
    val opt = PIDE.options.value.check_name(option_name)
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    86
76504
15b058bb2416 clarified signature: ensure that entries are well-formed --- no consecutive separators, no separators at start/end;
wenzelm
parents: 76502
diff changeset
    87
    new GUI.Selector(Spell_Checker.dictionaries.map(GUI.Selector.item)) with JEdit_Options.Entry {
56559
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    88
      name = option_name
75837
93a704c52061 tuned, following 298707451ec2;
wenzelm
parents: 75393
diff changeset
    89
      tooltip = GUI.tooltip_lines(opt.print_default)
76582
71942a6af4ed tuned signature;
wenzelm
parents: 76504
diff changeset
    90
71942a6af4ed tuned signature;
wenzelm
parents: 76504
diff changeset
    91
      override val title: String = opt.title_jedit
71942a6af4ed tuned signature;
wenzelm
parents: 76504
diff changeset
    92
      override def load(): Unit = {
56559
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    93
        val lang = PIDE.options.string(option_name)
76583
wenzelm
parents: 76582
diff changeset
    94
        for (dict <- Spell_Checker.get_dictionary(lang)) selection.item = GUI.Selector.item(dict)
56559
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    95
      }
76582
71942a6af4ed tuned signature;
wenzelm
parents: 76504
diff changeset
    96
      override def save(): Unit =
76504
15b058bb2416 clarified signature: ensure that entries are well-formed --- no consecutive separators, no separators at start/end;
wenzelm
parents: 76502
diff changeset
    97
        for (dict <- selection_value) PIDE.options.string(option_name) = dict.lang
75837
93a704c52061 tuned, following 298707451ec2;
wenzelm
parents: 75393
diff changeset
    98
93a704c52061 tuned, following 298707451ec2;
wenzelm
parents: 75393
diff changeset
    99
      load()
56559
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
   100
    }
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
   101
  }
56547
e9bb73d7b6cf added spell-checker based on jortho-1.0;
wenzelm
parents:
diff changeset
   102
}