src/Tools/jEdit/src/active.scala
author wenzelm
Mon, 01 Mar 2021 22:22:12 +0100
changeset 73340 0ffcad1f6130
parent 71775 291c46bf3000
child 73367 77ef8bef0593
permissions -rw-r--r--
tuned --- fewer warnings;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50450
358b6020f8b6 generalized notion of active area, where sendback is just one application;
wenzelm
parents: 50341
diff changeset
     1
/*  Title:      Tools/jEdit/src/active.scala
49492
2e3e7ea5ce8e some support for hovering and sendback area;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
2e3e7ea5ce8e some support for hovering and sendback area;
wenzelm
parents:
diff changeset
     3
50450
358b6020f8b6 generalized notion of active area, where sendback is just one application;
wenzelm
parents: 50341
diff changeset
     4
Active areas within the document.
49492
2e3e7ea5ce8e some support for hovering and sendback area;
wenzelm
parents:
diff changeset
     5
*/
2e3e7ea5ce8e some support for hovering and sendback area;
wenzelm
parents:
diff changeset
     6
2e3e7ea5ce8e some support for hovering and sendback area;
wenzelm
parents:
diff changeset
     7
package isabelle.jedit
2e3e7ea5ce8e some support for hovering and sendback area;
wenzelm
parents:
diff changeset
     8
2e3e7ea5ce8e some support for hovering and sendback area;
wenzelm
parents:
diff changeset
     9
2e3e7ea5ce8e some support for hovering and sendback area;
wenzelm
parents:
diff changeset
    10
import isabelle._
71742
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    11
import org.gjt.sp.jedit.{ServiceManager, View}
49492
2e3e7ea5ce8e some support for hovering and sendback area;
wenzelm
parents:
diff changeset
    12
2e3e7ea5ce8e some support for hovering and sendback area;
wenzelm
parents:
diff changeset
    13
50450
358b6020f8b6 generalized notion of active area, where sendback is just one application;
wenzelm
parents: 50341
diff changeset
    14
object Active
49492
2e3e7ea5ce8e some support for hovering and sendback area;
wenzelm
parents:
diff changeset
    15
{
71742
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    16
  abstract class Handler
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    17
  {
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    18
    def handle(
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    19
      view: View, text: String, elem: XML.Elem,
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    20
      doc_view: Document_View, snapshot: Document.Snapshot): Boolean
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    21
  }
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    22
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    23
  def handlers: List[Handler] =
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    24
    ServiceManager.getServiceNames(classOf[Handler]).toList
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    25
      .map(ServiceManager.getService(classOf[Handler], _))
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    26
73340
0ffcad1f6130 tuned --- fewer warnings;
wenzelm
parents: 71775
diff changeset
    27
  def action(view: View, text: String, elem: XML.Elem): Unit =
49492
2e3e7ea5ce8e some support for hovering and sendback area;
wenzelm
parents:
diff changeset
    28
  {
57612
990ffb84489b clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents: 57594
diff changeset
    29
    GUI_Thread.require {}
49492
2e3e7ea5ce8e some support for hovering and sendback area;
wenzelm
parents:
diff changeset
    30
64882
c3b42ac0cf81 tuned signature;
wenzelm
parents: 64664
diff changeset
    31
    Document_View.get(view.getTextArea) match {
49492
2e3e7ea5ce8e some support for hovering and sendback area;
wenzelm
parents:
diff changeset
    32
      case Some(doc_view) =>
71775
wenzelm
parents: 71742
diff changeset
    33
        doc_view.rich_text_area.robust_body(()) {
71742
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    34
          val snapshot = doc_view.model.snapshot()
50164
77668b522ffe some support for implicit senback, meaning that it uses the caret position instead of explicit command exec_id;
wenzelm
parents: 49493
diff changeset
    35
          if (!snapshot.is_outdated) {
71742
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    36
            handlers.find(_.handle(view, text, elem, doc_view, snapshot))
49492
2e3e7ea5ce8e some support for hovering and sendback area;
wenzelm
parents:
diff changeset
    37
          }
2e3e7ea5ce8e some support for hovering and sendback area;
wenzelm
parents:
diff changeset
    38
        }
2e3e7ea5ce8e some support for hovering and sendback area;
wenzelm
parents:
diff changeset
    39
      case None =>
2e3e7ea5ce8e some support for hovering and sendback area;
wenzelm
parents:
diff changeset
    40
    }
2e3e7ea5ce8e some support for hovering and sendback area;
wenzelm
parents:
diff changeset
    41
  }
71742
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    42
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    43
  class Misc_Handler extends Active.Handler
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    44
  {
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    45
    override def handle(
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    46
      view: View, text: String, elem: XML.Elem,
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    47
      doc_view: Document_View, snapshot: Document.Snapshot): Boolean =
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    48
    {
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    49
      val text_area = doc_view.text_area
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    50
      val model = doc_view.model
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    51
      val buffer = model.buffer
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    52
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    53
      elem match {
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    54
        case XML.Elem(Markup(Markup.BROWSER, _), body) =>
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    55
          Isabelle_Thread.fork(name = "browser") {
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    56
            val graph_file = Isabelle_System.tmp_file("graph")
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    57
            File.write(graph_file, XML.content(body))
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    58
            Isabelle_System.bash("isabelle browser -c " + File.bash_path(graph_file) + " &")
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    59
          }
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    60
          true
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    61
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    62
        case XML.Elem(Markup(Markup.THEORY_EXPORTS, props), _) =>
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    63
          GUI_Thread.later {
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    64
            val name = Markup.Name.unapply(props) getOrElse ""
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    65
            PIDE.editor.hyperlink_file(true, Isabelle_Export.vfs_prefix + name).follow(view)
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    66
          }
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    67
          true
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    68
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    69
        case XML.Elem(Markup(Markup.JEDIT_ACTION, _), body) =>
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    70
          GUI_Thread.later {
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    71
            view.getInputHandler.invokeAction(XML.content(body))
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    72
          }
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    73
          true
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    74
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    75
        case XML.Elem(Markup(Markup.SIMP_TRACE_PANEL, props), _) =>
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    76
          val link =
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    77
            props match {
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    78
              case Position.Id(id) => PIDE.editor.hyperlink_command(true, snapshot, id)
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    79
              case _ => None
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    80
            }
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    81
          GUI_Thread.later {
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    82
            link.foreach(_.follow(view))
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    83
            view.getDockableWindowManager.showDockableWindow("isabelle-simplifier-trace")
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    84
          }
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    85
          true
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    86
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    87
        case XML.Elem(Markup(Markup.SENDBACK, props), _) =>
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    88
          if (buffer.isEditable) {
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    89
            props match {
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    90
              case Position.Id(id) =>
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    91
                Isabelle.edit_command(snapshot, text_area,
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    92
                  props.contains(Markup.PADDING_COMMAND), id, text)
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    93
              case _ =>
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    94
                if (props.contains(Markup.PADDING_LINE))
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    95
                  Isabelle.insert_line_padding(text_area, text)
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    96
                else text_area.setSelectedText(text)
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    97
            }
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    98
            text_area.requestFocus
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
    99
          }
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
   100
          true
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
   101
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
   102
        case Protocol.Dialog(id, serial, result) =>
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
   103
          model.session.dialog_result(id, serial, result)
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
   104
          true
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
   105
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
   106
        case _ => false
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
   107
      }
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
   108
    }
de37910974da avoid hard-wired stuff: configure via plugin services;
wenzelm
parents: 71692
diff changeset
   109
  }
49492
2e3e7ea5ce8e some support for hovering and sendback area;
wenzelm
parents:
diff changeset
   110
}