src/Tools/jEdit/src/query_operation.scala
author wenzelm
Wed, 07 Aug 2013 14:13:59 +0200
changeset 52890 36e2c0c308eb
parent 52878 8069c8b9335e
child 52931 ac6648c0c0fb
permissions -rw-r--r--
tuned signature; tuned;
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
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
     5
document overlay.
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._
52874
91032244e4ca query process animation;
wenzelm
parents: 52865
diff changeset
    14
import scala.swing.Label
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    15
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    16
import org.gjt.sp.jedit.View
52874
91032244e4ca query process animation;
wenzelm
parents: 52865
diff changeset
    17
import org.gjt.sp.jedit.gui.AnimatedIcon
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    18
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    19
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    20
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
    21
{
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    22
  def apply(
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    23
      view: View,
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    24
      name: String,
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    25
      consume: (Document.Snapshot, Command.Results, XML.Body) => Unit) =
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    26
    new Query_Operation(view, name, consume)
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    27
}
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    28
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    29
final class Query_Operation private(
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,
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    32
  consume_result: (Document.Snapshot, Command.Results, XML.Body) => Unit)
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    33
{
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    34
  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
    35
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    36
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    37
  /* implicit state -- owned by Swing thread */
52874
91032244e4ca query process animation;
wenzelm
parents: 52865
diff changeset
    38
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    39
  private object Status extends Enumeration
52875
e2d5c3ff5c3f tuned signature;
wenzelm
parents: 52874
diff changeset
    40
  {
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    41
    val WAITING = Value("waiting")
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    42
    val RUNNING = Value("running")
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    43
    val FINISHED = Value("finished")
52875
e2d5c3ff5c3f tuned signature;
wenzelm
parents: 52874
diff changeset
    44
  }
e2d5c3ff5c3f tuned signature;
wenzelm
parents: 52874
diff changeset
    45
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    46
  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
    47
  private var current_query: List[String] = Nil
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    48
  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
    49
  private var current_output: List[XML.Tree] = Nil
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    50
  private var current_status = Status.FINISHED
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    51
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    52
  private def reset_state()
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    53
  {
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    54
    current_location = None
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    55
    current_query = Nil
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    56
    current_update_pending = false
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    57
    current_output = Nil
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    58
    current_status = Status.FINISHED
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
    59
  }
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    60
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    61
  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
    62
  {
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    63
    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
    64
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    65
    for {
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    66
      command <- current_location
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    67
      buffer <- JEdit_Lib.jedit_buffer(command.node_name.node)
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    68
      model <- PIDE.document_model(buffer)
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    69
    } model.remove_overlay(command, operation_name, instance :: current_query)
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    70
  }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    71
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    72
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    73
  /* animation */
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    74
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    75
  val animation = new Label
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    76
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    77
  private val passive_icon =
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    78
    JEdit_Lib.load_image_icon(PIDE.options.string("process_passive_icon")).getImage
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    79
  private val active_icons =
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    80
    space_explode(':', PIDE.options.string("process_active_icons")).map(name =>
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    81
      JEdit_Lib.load_image_icon(name).getImage)
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    82
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    83
  private val animation_icon =
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    84
    new AnimatedIcon(passive_icon, active_icons.toArray, 5, animation.peer)
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    85
  animation.icon = animation_icon
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    86
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    87
  private def animation_update()
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    88
  {
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
    89
    animation_icon.stop
52878
8069c8b9335e more tooltips;
wenzelm
parents: 52877
diff changeset
    90
    current_status match {
8069c8b9335e more tooltips;
wenzelm
parents: 52877
diff changeset
    91
      case Status.WAITING =>
8069c8b9335e more tooltips;
wenzelm
parents: 52877
diff changeset
    92
        animation.tooltip = "Waiting for evaluation of query context ..."
8069c8b9335e more tooltips;
wenzelm
parents: 52877
diff changeset
    93
        animation_icon.setRate(5)
8069c8b9335e more tooltips;
wenzelm
parents: 52877
diff changeset
    94
        animation_icon.start
8069c8b9335e more tooltips;
wenzelm
parents: 52877
diff changeset
    95
      case Status.RUNNING =>
8069c8b9335e more tooltips;
wenzelm
parents: 52877
diff changeset
    96
        animation.tooltip = "Running query operation ..."
8069c8b9335e more tooltips;
wenzelm
parents: 52877
diff changeset
    97
        animation_icon.setRate(15)
8069c8b9335e more tooltips;
wenzelm
parents: 52877
diff changeset
    98
        animation_icon.start
8069c8b9335e more tooltips;
wenzelm
parents: 52877
diff changeset
    99
      case Status.FINISHED =>
8069c8b9335e more tooltips;
wenzelm
parents: 52877
diff changeset
   100
        animation.tooltip = null
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   101
    }
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   102
  }
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   103
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   104
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   105
  /* content update */
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   106
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   107
  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
   108
  {
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   109
    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
   110
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   111
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   112
    /* snapshot */
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   113
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   114
    val (snapshot, state) =
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   115
      current_location match {
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   116
        case Some(cmd) =>
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   117
          val snapshot = PIDE.document_snapshot(cmd.node_name)
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   118
          val state = snapshot.state.command_state(snapshot.version, cmd)
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   119
          (snapshot, state)
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   120
        case None =>
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   121
          (Document.State.init.snapshot(), Command.empty.init_state)
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   122
      }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   123
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   124
    val results =
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   125
      (for {
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   126
        (_, XML.Elem(Markup(Markup.RESULT, props), body)) <- state.results.entries
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   127
        if props.contains((Markup.INSTANCE, instance))
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   128
      } yield body).toList
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   129
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   130
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   131
    /* output */
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   132
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   133
    val new_output =
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   134
      for {
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   135
        List(XML.Elem(markup, body)) <- results
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   136
        if Markup.messages.contains(markup.name)
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   137
      }
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   138
      yield XML.Elem(Markup(Markup.message(markup.name), markup.properties), body)
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   139
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   140
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   141
    /* status */
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   142
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   143
    def get_status(name: String, status: Status.Value): Option[Status.Value] =
52890
36e2c0c308eb tuned signature;
wenzelm
parents: 52878
diff changeset
   144
      results.collectFirst({ case List(elem: XML.Elem) if elem.name == name => status })
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   145
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   146
    val new_status =
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   147
      get_status(Markup.FINISHED, Status.FINISHED) orElse
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   148
      get_status(Markup.RUNNING, Status.RUNNING) getOrElse
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   149
      Status.WAITING
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   150
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   151
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   152
    /* 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
   153
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   154
    if (current_output != new_output || current_status != new_status) {
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   155
      if (snapshot.is_outdated)
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   156
        current_update_pending = true
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   157
      else {
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   158
        current_update_pending = false
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   159
        if (current_output != new_output) {
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   160
          current_output = new_output
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   161
          consume_result(snapshot, state.results, new_output)
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   162
        }
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   163
        if (current_status != new_status) {
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   164
          current_status = new_status
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   165
          animation_update()
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   166
          if (new_status == Status.FINISHED) {
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   167
            remove_overlay()
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   168
            PIDE.flush_buffers()
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   169
          }
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   170
        }
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   171
      }
52865
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
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   175
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   176
  /* apply query */
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   177
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   178
  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
   179
  {
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   180
    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
   181
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   182
    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
   183
      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
   184
        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
   185
        remove_overlay()
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   186
        reset_state()
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   187
        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
   188
          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
   189
            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
   190
            current_query = query
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   191
            current_status = Status.WAITING
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   192
            doc_view.model.insert_overlay(command, operation_name, instance :: query)
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   193
          case None =>
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   194
        }
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   195
        animation_update()
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   196
        PIDE.flush_buffers()
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   197
      case None =>
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   198
    }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   199
  }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   200
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   201
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   202
  /* locate query */
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   203
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   204
  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
   205
  {
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   206
    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
   207
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   208
    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
   209
      case Some(command) =>
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   210
        val snapshot = PIDE.document_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
   211
        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
   212
        if (commands.contains(command)) {
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   213
          // 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
   214
          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
   215
          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
   216
          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
   217
        }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   218
      case None =>
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   219
    }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   220
  }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   221
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   222
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   223
  /* main actor */
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   224
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   225
  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
   226
    loop {
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   227
      react {
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   228
        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
   229
          current_location match {
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   230
            case Some(command)
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52875
diff changeset
   231
            if current_update_pending ||
52877
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   232
              (current_status != Status.FINISHED && changed.commands.contains(command)) =>
9a26ec5739dd tuned -- more explicit type Status.Value;
wenzelm
parents: 52876
diff changeset
   233
              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
   234
            case _ =>
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   235
          }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   236
        case bad =>
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   237
          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
   238
      }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   239
    }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   240
  }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   241
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   242
  def activate() { PIDE.session.commands_changed += main_actor }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   243
  def deactivate() { PIDE.session.commands_changed -= main_actor }
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
   244
}