src/Tools/jEdit/src/query_operation.scala
author wenzelm
Mon, 12 Aug 2013 14:27:58 +0200
changeset 52977 15254e32d299
parent 52974 908e8a36e975
child 52978 37fbb3fde380
permissions -rw-r--r--
central management of Document.Overlays, independent of Document_Model;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
     1
/*  Title:      Tools/jEdit/src/query_operation.scala
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
     3
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
     4
One-shot query operations via asynchronous print functions and temporary
52932
eb7d7c0034b5 removed command location is considered finished, and its overlay removed eventually;
wenzelm
parents: 52931
diff changeset
     5
document overlays.
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
     6
*/
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
     7
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
     8
package isabelle.jedit
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
     9
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    10
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    11
import isabelle._
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    12
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    13
import scala.actors.Actor._
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    14
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    15
import org.gjt.sp.jedit.View
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    16
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    17
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    18
object Query_Operation
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    19
{
52935
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
    20
  object Status extends Enumeration
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
    21
  {
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
    22
    val WAITING = Value("waiting")
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
    23
    val RUNNING = Value("running")
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
    24
    val FINISHED = Value("finished")
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
    25
  }
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    26
}
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    27
52971
31926d2c04ee tuned signature -- more abstract PIDE editor operations;
wenzelm
parents: 52935
diff changeset
    28
class Query_Operation(
31926d2c04ee tuned signature -- more abstract PIDE editor operations;
wenzelm
parents: 52935
diff changeset
    29
  editor: Editor[View],
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    30
  view: View,
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    31
  operation_name: String,
52935
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
    32
  consume_status: Query_Operation.Status.Value => Unit,
52932
eb7d7c0034b5 removed command location is considered finished, and its overlay removed eventually;
wenzelm
parents: 52931
diff changeset
    33
  consume_output: (Document.Snapshot, Command.Results, XML.Body) => Unit)
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    34
{
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    35
  private val instance = Document_ID.make().toString
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    36
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    37
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    38
  /* implicit state -- owned by Swing thread */
52874
91032244e4ca query process animation;
wenzelm
parents: 52865
diff changeset
    39
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    40
  private var current_location: Option[Command] = None
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    41
  private var current_query: List[String] = Nil
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    42
  private var current_update_pending = false
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    43
  private var current_output: List[XML.Tree] = Nil
52935
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
    44
  private var current_status = Query_Operation.Status.FINISHED
52931
ac6648c0c0fb cancel_query via direct access to the exec_id of the running query process;
wenzelm
parents: 52890
diff changeset
    45
  private var current_exec_id = Document_ID.none
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    46
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    47
  private def reset_state()
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    48
  {
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    49
    current_location = None
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    50
    current_query = Nil
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    51
    current_update_pending = false
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    52
    current_output = Nil
52935
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
    53
    current_status = Query_Operation.Status.FINISHED
52931
ac6648c0c0fb cancel_query via direct access to the exec_id of the running query process;
wenzelm
parents: 52890
diff changeset
    54
    current_exec_id = Document_ID.none
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    55
  }
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    56
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    57
  private def remove_overlay()
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    58
  {
52977
15254e32d299 central management of Document.Overlays, independent of Document_Model;
wenzelm
parents: 52974
diff changeset
    59
    current_location.foreach(command =>
15254e32d299 central management of Document.Overlays, independent of Document_Model;
wenzelm
parents: 52974
diff changeset
    60
      editor.remove_overlay(command, operation_name, instance :: current_query))
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    61
  }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    62
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    63
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    64
  /* content update */
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    65
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    66
  private def content_update()
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    67
  {
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    68
    Swing_Thread.require()
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    69
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    70
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    71
    /* snapshot */
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    72
52932
eb7d7c0034b5 removed command location is considered finished, and its overlay removed eventually;
wenzelm
parents: 52931
diff changeset
    73
    val (snapshot, state, removed) =
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    74
      current_location match {
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    75
        case Some(cmd) =>
52974
908e8a36e975 tuned signature;
wenzelm
parents: 52972
diff changeset
    76
          val snapshot = editor.node_snapshot(cmd.node_name)
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    77
          val state = snapshot.state.command_state(snapshot.version, cmd)
52932
eb7d7c0034b5 removed command location is considered finished, and its overlay removed eventually;
wenzelm
parents: 52931
diff changeset
    78
          val removed = !snapshot.version.nodes(cmd.node_name).commands.contains(cmd)
eb7d7c0034b5 removed command location is considered finished, and its overlay removed eventually;
wenzelm
parents: 52931
diff changeset
    79
          (snapshot, state, removed)
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    80
        case None =>
52972
8fd8e1c14988 tuned signature;
wenzelm
parents: 52971
diff changeset
    81
          (Document.Snapshot.init, Command.empty.init_state, true)
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    82
      }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    83
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    84
    val results =
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    85
      (for {
52931
ac6648c0c0fb cancel_query via direct access to the exec_id of the running query process;
wenzelm
parents: 52890
diff changeset
    86
        (_, elem @ XML.Elem(Markup(Markup.RESULT, props), _)) <- state.results.entries
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    87
        if props.contains((Markup.INSTANCE, instance))
52931
ac6648c0c0fb cancel_query via direct access to the exec_id of the running query process;
wenzelm
parents: 52890
diff changeset
    88
      } yield elem).toList
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    89
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    90
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    91
    /* output */
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    92
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    93
    val new_output =
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    94
      for {
52931
ac6648c0c0fb cancel_query via direct access to the exec_id of the running query process;
wenzelm
parents: 52890
diff changeset
    95
        XML.Elem(_, List(XML.Elem(markup, body))) <- results
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    96
        if Markup.messages.contains(markup.name)
52931
ac6648c0c0fb cancel_query via direct access to the exec_id of the running query process;
wenzelm
parents: 52890
diff changeset
    97
      } yield XML.Elem(Markup(Markup.message(markup.name), markup.properties), body)
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    98
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    99
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   100
    /* status */
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   101
52935
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
   102
    def get_status(name: String, status: Query_Operation.Status.Value)
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
   103
        : Option[Query_Operation.Status.Value] =
52931
ac6648c0c0fb cancel_query via direct access to the exec_id of the running query process;
wenzelm
parents: 52890
diff changeset
   104
      results.collectFirst({ case XML.Elem(_, List(elem: XML.Elem)) if elem.name == name => status })
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   105
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   106
    val new_status =
52935
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
   107
      if (removed) Query_Operation.Status.FINISHED
52932
eb7d7c0034b5 removed command location is considered finished, and its overlay removed eventually;
wenzelm
parents: 52931
diff changeset
   108
      else
52935
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
   109
        get_status(Markup.FINISHED, Query_Operation.Status.FINISHED) orElse
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
   110
        get_status(Markup.RUNNING, Query_Operation.Status.RUNNING) getOrElse
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
   111
        Query_Operation.Status.WAITING
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   112
52935
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
   113
    if (new_status == Query_Operation.Status.RUNNING)
52931
ac6648c0c0fb cancel_query via direct access to the exec_id of the running query process;
wenzelm
parents: 52890
diff changeset
   114
      results.collectFirst(
ac6648c0c0fb cancel_query via direct access to the exec_id of the running query process;
wenzelm
parents: 52890
diff changeset
   115
      {
ac6648c0c0fb cancel_query via direct access to the exec_id of the running query process;
wenzelm
parents: 52890
diff changeset
   116
        case XML.Elem(Markup(_, Position.Id(id)), List(elem: XML.Elem))
ac6648c0c0fb cancel_query via direct access to the exec_id of the running query process;
wenzelm
parents: 52890
diff changeset
   117
        if elem.name == Markup.RUNNING => id
ac6648c0c0fb cancel_query via direct access to the exec_id of the running query process;
wenzelm
parents: 52890
diff changeset
   118
      }).foreach(id => current_exec_id = id)
ac6648c0c0fb cancel_query via direct access to the exec_id of the running query process;
wenzelm
parents: 52890
diff changeset
   119
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   120
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   121
    /* state update */
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   122
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   123
    if (current_output != new_output || current_status != new_status) {
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   124
      if (snapshot.is_outdated)
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   125
        current_update_pending = true
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   126
      else {
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   127
        current_update_pending = false
52932
eb7d7c0034b5 removed command location is considered finished, and its overlay removed eventually;
wenzelm
parents: 52931
diff changeset
   128
        if (current_output != new_output && !removed) {
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   129
          current_output = new_output
52932
eb7d7c0034b5 removed command location is considered finished, and its overlay removed eventually;
wenzelm
parents: 52931
diff changeset
   130
          consume_output(snapshot, state.results, new_output)
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   131
        }
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   132
        if (current_status != new_status) {
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   133
          current_status = new_status
52935
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
   134
          consume_status(new_status)
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
   135
          if (new_status == Query_Operation.Status.FINISHED) {
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   136
            remove_overlay()
52974
908e8a36e975 tuned signature;
wenzelm
parents: 52972
diff changeset
   137
            editor.flush()
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   138
          }
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   139
        }
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   140
      }
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   141
    }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   142
  }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   143
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   144
52931
ac6648c0c0fb cancel_query via direct access to the exec_id of the running query process;
wenzelm
parents: 52890
diff changeset
   145
  /* query operations */
ac6648c0c0fb cancel_query via direct access to the exec_id of the running query process;
wenzelm
parents: 52890
diff changeset
   146
ac6648c0c0fb cancel_query via direct access to the exec_id of the running query process;
wenzelm
parents: 52890
diff changeset
   147
  def cancel_query(): Unit =
52971
31926d2c04ee tuned signature -- more abstract PIDE editor operations;
wenzelm
parents: 52935
diff changeset
   148
    Swing_Thread.require { editor.session.cancel_exec(current_exec_id) }
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   149
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   150
  def apply_query(query: List[String])
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   151
  {
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   152
    Swing_Thread.require()
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   153
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   154
    Document_View(view.getTextArea) match {
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   155
      case Some(doc_view) =>
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   156
        val snapshot = doc_view.model.snapshot()
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   157
        remove_overlay()
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   158
        reset_state()
52972
8fd8e1c14988 tuned signature;
wenzelm
parents: 52971
diff changeset
   159
        consume_output(Document.Snapshot.init, Command.Results.empty, Nil)
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   160
        snapshot.node.command_at(doc_view.text_area.getCaretPosition).map(_._1) match {
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   161
          case Some(command) =>
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   162
            current_location = Some(command)
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   163
            current_query = query
52935
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
   164
            current_status = Query_Operation.Status.WAITING
52977
15254e32d299 central management of Document.Overlays, independent of Document_Model;
wenzelm
parents: 52974
diff changeset
   165
            editor.insert_overlay(command, operation_name, instance :: query)
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   166
          case None =>
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   167
        }
52935
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
   168
        consume_status(current_status)
52974
908e8a36e975 tuned signature;
wenzelm
parents: 52972
diff changeset
   169
        editor.flush()
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   170
      case None =>
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   171
    }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   172
  }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   173
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   174
  def locate_query()
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   175
  {
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   176
    Swing_Thread.require()
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   177
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   178
    current_location match {
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   179
      case Some(command) =>
52974
908e8a36e975 tuned signature;
wenzelm
parents: 52972
diff changeset
   180
        val snapshot = editor.node_snapshot(command.node_name)
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   181
        val commands = snapshot.node.commands
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   182
        if (commands.contains(command)) {
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   183
          // FIXME revert offset (!?)
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   184
          val sources = commands.iterator.takeWhile(_ != command).map(_.source)
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   185
          val (line, column) = ((1, 1) /: sources)(Symbol.advance_line_column)
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   186
          Hyperlink(command.node_name.node, line, column).follow(view)
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   187
        }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   188
      case None =>
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   189
    }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   190
  }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   191
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   192
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   193
  /* main actor */
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   194
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   195
  private val main_actor = actor {
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   196
    loop {
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   197
      react {
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   198
        case changed: Session.Commands_Changed =>
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   199
          current_location match {
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   200
            case Some(command)
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   201
            if current_update_pending ||
52935
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
   202
              (current_status != Query_Operation.Status.FINISHED &&
6fc13c31c775 more abstract consume_status operation;
wenzelm
parents: 52934
diff changeset
   203
                changed.commands.contains(command)) =>
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   204
              Swing_Thread.later { content_update() }
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   205
            case _ =>
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   206
          }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   207
        case bad =>
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   208
          java.lang.System.err.println("Query_Operation: ignoring bad message " + bad)
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   209
      }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   210
    }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   211
  }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   212
52971
31926d2c04ee tuned signature -- more abstract PIDE editor operations;
wenzelm
parents: 52935
diff changeset
   213
  def activate() { editor.session.commands_changed += main_actor }
31926d2c04ee tuned signature -- more abstract PIDE editor operations;
wenzelm
parents: 52935
diff changeset
   214
  def deactivate() { editor.session.commands_changed -= main_actor }
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   215
}