src/Tools/jEdit/src/jedit_spell_checker.scala
author wenzelm
Tue, 31 Oct 2017 18:56:24 +0100
changeset 66965 9cec50354099
parent 66137 d2923067b376
child 73337 0af9e7e4476f
permissions -rw-r--r--
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
56559
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    13
import scala.swing.ComboBox
56547
e9bb73d7b6cf added spell-checker based on jortho-1.0;
wenzelm
parents:
diff changeset
    14
58549
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    15
import org.gjt.sp.jedit.menu.EnhancedMenuItem
65139
0a2c0712e432 clarified modules: spell-checker in Pure;
wenzelm
parents: 64882
diff changeset
    16
import org.gjt.sp.jedit.jEdit
58549
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    17
import org.gjt.sp.jedit.textarea.{JEditTextArea, TextArea}
56574
2b38472a4695 some actions to maintain spell-checker dictionary;
wenzelm
parents: 56573
diff changeset
    18
56547
e9bb73d7b6cf added spell-checker based on jortho-1.0;
wenzelm
parents:
diff changeset
    19
65139
0a2c0712e432 clarified modules: spell-checker in Pure;
wenzelm
parents: 64882
diff changeset
    20
object JEdit_Spell_Checker
56547
e9bb73d7b6cf added spell-checker based on jortho-1.0;
wenzelm
parents:
diff changeset
    21
{
65139
0a2c0712e432 clarified modules: spell-checker in Pure;
wenzelm
parents: 64882
diff changeset
    22
  /* completion */
58549
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    23
66119
wenzelm
parents: 66117
diff changeset
    24
  def completion(
wenzelm
parents: 66117
diff changeset
    25
    rendering: JEdit_Rendering, explicit: Boolean, caret: Text.Offset): Option[Completion.Result] =
58549
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    26
  {
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
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    37
  def context_menu(text_area: JEditTextArea, offset: Text.Offset): List[JMenuItem] =
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    38
  {
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    39
    val result =
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    40
      for {
65239
509a9b0ad02e avoid global variables with implicit initialization;
wenzelm
parents: 65139
diff changeset
    41
        spell_checker <- PIDE.plugin.spell_checker.get
64882
c3b42ac0cf81 tuned signature;
wenzelm
parents: 64621
diff changeset
    42
        doc_view <- Document_View.get(text_area)
58549
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    43
        rendering = doc_view.get_rendering()
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    44
        range = JEdit_Lib.point_range(text_area.getBuffer, offset)
66116
dad409cd3423 clarified modules;
wenzelm
parents: 65239
diff changeset
    45
        Text.Info(_, word) <- Spell_Checker.current_word(rendering, range)
58549
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    46
      } yield (spell_checker, word)
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    47
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    48
    result match {
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    49
      case Some((spell_checker, word)) =>
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    50
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    51
        val context = jEdit.getActionContext()
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    52
        def item(name: String): JMenuItem =
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    53
          new EnhancedMenuItem(context.getAction(name).getLabel, name, context)
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    54
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    55
        val complete_items =
66137
d2923067b376 tuned signature;
wenzelm
parents: 66119
diff changeset
    56
          if (spell_checker.complete(word).nonEmpty) List(item("isabelle.complete-word"))
58549
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    57
          else Nil
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    58
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    59
        val update_items =
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    60
          if (spell_checker.check(word))
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    61
            List(item("isabelle.exclude-word"), item("isabelle.exclude-word-permanently"))
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    62
          else
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    63
            List(item("isabelle.include-word"), item("isabelle.include-word-permanently"))
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    64
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    65
        val reset_items =
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    66
          spell_checker.reset_enabled() match {
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    67
            case 0 => Nil
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    68
            case n =>
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    69
              val name = "isabelle.reset-words"
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    70
              val label = context.getAction(name).getLabel
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    71
              List(new EnhancedMenuItem(label + " (" + n + ")", name, context))
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    72
          }
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    73
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    74
        complete_items ::: update_items ::: reset_items
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    75
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    76
      case None => Nil
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
d4d97b79f1fb clarified modules;
wenzelm
parents: 57612
diff changeset
    80
65139
0a2c0712e432 clarified modules: spell-checker in Pure;
wenzelm
parents: 64882
diff changeset
    81
  /* dictionaries */
56557
18d921496aa5 updated to jortho-1.0-1: dictionaries from SCOWL 7.1, with parameters like aspell;
wenzelm
parents: 56552
diff changeset
    82
56559
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    83
  def dictionaries_selector(): Option_Component =
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    84
  {
57612
990ffb84489b clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents: 56662
diff changeset
    85
    GUI_Thread.require {}
56559
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    86
56569
wenzelm
parents: 56568
diff changeset
    87
    val option_name = "spell_checker_dictionary"
56559
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    88
    val opt = PIDE.options.value.check_name(option_name)
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    89
65139
0a2c0712e432 clarified modules: spell-checker in Pure;
wenzelm
parents: 64882
diff changeset
    90
    val entries = Spell_Checker.dictionaries()
56559
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    91
    val component = new ComboBox(entries) with Option_Component {
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    92
      name = option_name
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    93
      val title = opt.title()
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    94
      def load: Unit =
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    95
      {
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    96
        val lang = PIDE.options.string(option_name)
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    97
        entries.find(_.lang == lang) match {
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    98
          case Some(entry) => selection.item = entry
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
    99
          case None =>
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
   100
        }
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
   101
      }
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
   102
      def save: Unit = PIDE.options.string(option_name) = selection.item.lang
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
   103
    }
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
   104
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
   105
    component.load()
56622
891d1b8b64fb clarified tooltip_lines: HTML.encode already takes care of newline (but not space);
wenzelm
parents: 56611
diff changeset
   106
    component.tooltip = GUI.tooltip_lines(opt.print_default)
56559
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
   107
    component
eece73c31e38 added dictionaries_selector GUI;
wenzelm
parents: 56558
diff changeset
   108
  }
56547
e9bb73d7b6cf added spell-checker based on jortho-1.0;
wenzelm
parents:
diff changeset
   109
}