src/Tools/jEdit/src/jedit_spell_checker.scala
author wenzelm
Wed, 09 Nov 2022 19:42:21 +0100
changeset 76492 e228be7cd375
parent 76391 6129e8cb140d
child 76502 08b950ca0313
permissions -rw-r--r--
clarified GUI.Selector, with support for separator as pseudo-entry; clarified signature;
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
64882
c3b42ac0cf81 tuned signature;
wenzelm
parents: 64621
diff changeset
    41
        doc_view <- Document_View.get(text_area)
58549
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    42
        rendering = doc_view.get_rendering()
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    43
        range = JEdit_Lib.point_range(text_area.getBuffer, offset)
66116
dad409cd3423 clarified modules;
wenzelm
parents: 65239
diff changeset
    44
        Text.Info(_, word) <- Spell_Checker.current_word(rendering, range)
58549
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    45
      } yield (spell_checker, word)
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    46
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    47
    result match {
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    48
      case Some((spell_checker, word)) =>
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    49
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    50
        val context = jEdit.getActionContext()
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    51
        def item(name: String): JMenuItem =
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    52
          new EnhancedMenuItem(context.getAction(name).getLabel, name, context)
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    53
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    54
        val complete_items =
66137
d2923067b376 tuned signature;
wenzelm
parents: 66119
diff changeset
    55
          if (spell_checker.complete(word).nonEmpty) List(item("isabelle.complete-word"))
58549
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    56
          else Nil
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    57
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    58
        val update_items =
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    59
          if (spell_checker.check(word))
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    60
            List(item("isabelle.exclude-word"), item("isabelle.exclude-word-permanently"))
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    61
          else
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    62
            List(item("isabelle.include-word"), item("isabelle.include-word-permanently"))
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    63
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    64
        val reset_items =
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    65
          spell_checker.reset_enabled() match {
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    66
            case 0 => Nil
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    67
            case n =>
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    68
              val name = "isabelle.reset-words"
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    69
              val label = context.getAction(name).getLabel
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    70
              List(new EnhancedMenuItem(label + " (" + n + ")", name, context))
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    71
          }
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    72
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    73
        complete_items ::: update_items ::: reset_items
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    74
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    75
      case None => Nil
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
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    79
65139
0a2c0712e432 clarified modules: spell-checker in Pure;
wenzelm
parents: 64882
diff changeset
    80
  /* dictionaries */
56557
18d921496aa5 updated to jortho-1.0-1: dictionaries from SCOWL 7.1, with parameters like aspell;
wenzelm
parents: 56552
diff changeset
    81
76391
6129e8cb140d tuned signature;
wenzelm
parents: 75839
diff changeset
    82
  def dictionaries_selector(): JEdit_Options.Entry = {
57612
990ffb84489b clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents: 56662
diff changeset
    83
    GUI_Thread.require {}
56559
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    84
56569
wenzelm
parents: 56568
diff changeset
    85
    val option_name = "spell_checker_dictionary"
56559
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    86
    val opt = PIDE.options.value.check_name(option_name)
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    87
76492
e228be7cd375 clarified GUI.Selector, with support for separator as pseudo-entry;
wenzelm
parents: 76391
diff changeset
    88
    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
    89
      name = option_name
75837
93a704c52061 tuned, following 298707451ec2;
wenzelm
parents: 75393
diff changeset
    90
      tooltip = GUI.tooltip_lines(opt.print_default)
56559
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    91
      val title = opt.title()
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73367
diff changeset
    92
      def load(): Unit = {
56559
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    93
        val lang = PIDE.options.string(option_name)
76492
e228be7cd375 clarified GUI.Selector, with support for separator as pseudo-entry;
wenzelm
parents: 76391
diff changeset
    94
        Spell_Checker.get_dictionary(lang) match {
e228be7cd375 clarified GUI.Selector, with support for separator as pseudo-entry;
wenzelm
parents: 76391
diff changeset
    95
          case Some(dict) => selection.item = GUI.Selector.Item(dict)
56559
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    96
          case None =>
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    97
        }
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    98
      }
76492
e228be7cd375 clarified GUI.Selector, with support for separator as pseudo-entry;
wenzelm
parents: 76391
diff changeset
    99
      def save(): Unit =
e228be7cd375 clarified GUI.Selector, with support for separator as pseudo-entry;
wenzelm
parents: 76391
diff changeset
   100
        for (item <- selection.item.get_item) PIDE.options.string(option_name) = item.lang
75837
93a704c52061 tuned, following 298707451ec2;
wenzelm
parents: 75393
diff changeset
   101
93a704c52061 tuned, following 298707451ec2;
wenzelm
parents: 75393
diff changeset
   102
      load()
56559
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
   103
    }
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
   104
  }
56547
e9bb73d7b6cf added spell-checker based on jortho-1.0;
wenzelm
parents:
diff changeset
   105
}