src/Tools/jEdit/src/jedit/output_dockable.scala
author bulwahn
Fri, 18 Mar 2011 18:19:42 +0100
changeset 42025 cb5b1e85b32e
parent 39592 5638fe4f0843
child 42978 6b41a075251f
permissions -rw-r--r--
adding eval option to quickcheck
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36760
b82a698ef6c9 tuned headers;
wenzelm
parents: 36015
diff changeset
     1
/*  Title:      Tools/jEdit/src/jedit/output_dockable.scala
b82a698ef6c9 tuned headers;
wenzelm
parents: 36015
diff changeset
     2
    Author:     Makarius
b82a698ef6c9 tuned headers;
wenzelm
parents: 36015
diff changeset
     3
b82a698ef6c9 tuned headers;
wenzelm
parents: 36015
diff changeset
     4
Dockable window with result message output.
b82a698ef6c9 tuned headers;
wenzelm
parents: 36015
diff changeset
     5
*/
34408
ad7b6c4813c8 added some headers and comments;
wenzelm
parents: 34406
diff changeset
     6
34318
c13e168a8ae6 original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
wenzelm
parents:
diff changeset
     7
package isabelle.jedit
c13e168a8ae6 original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
wenzelm
parents:
diff changeset
     8
34760
dc7f5e0d9d27 misc modernization of names;
wenzelm
parents: 34759
diff changeset
     9
36015
6111de7c916a adapted to Scala 2.8.0 Beta 1;
wenzelm
parents: 34871
diff changeset
    10
import isabelle._
6111de7c916a adapted to Scala 2.8.0 Beta 1;
wenzelm
parents: 34871
diff changeset
    11
34768
d8d321af1478 back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents: 34765
diff changeset
    12
import scala.actors.Actor._
34760
dc7f5e0d9d27 misc modernization of names;
wenzelm
parents: 34759
diff changeset
    13
37017
cf6625012282 try CheckBox instead of ToggleButton, which is visually confusing without window focus, e.g. in a floating instance (problem of MacOS look-and-feel);
wenzelm
parents: 37014
diff changeset
    14
import scala.swing.{FlowPanel, Button, CheckBox}
36988
fd641bc85222 basic controls to freeze/update prover results;
wenzelm
parents: 36817
diff changeset
    15
import scala.swing.event.ButtonClicked
fd641bc85222 basic controls to freeze/update prover results;
wenzelm
parents: 36817
diff changeset
    16
37067
31093f3687b5 simplified dockables using class Dockable;
wenzelm
parents: 37048
diff changeset
    17
import java.awt.BorderLayout
37014
1af0f718ffdc handle component resize for output / HTML panel;
wenzelm
parents: 36993
diff changeset
    18
import java.awt.event.{ComponentEvent, ComponentAdapter}
34748
a2ed621f5f52 reduced logging;
wenzelm
parents: 34747
diff changeset
    19
34318
c13e168a8ae6 original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
wenzelm
parents:
diff changeset
    20
import org.gjt.sp.jedit.View
c13e168a8ae6 original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
wenzelm
parents:
diff changeset
    21
34765
63ba7f0931e2 generic HTML_Panel -- specific Results_Dockable;
wenzelm
parents: 34760
diff changeset
    22
37067
31093f3687b5 simplified dockables using class Dockable;
wenzelm
parents: 37048
diff changeset
    23
class Output_Dockable(view: View, position: String) extends Dockable(view, position)
34760
dc7f5e0d9d27 misc modernization of names;
wenzelm
parents: 34759
diff changeset
    24
{
38223
2a368e8e0a80 more explicit treatment of Swing thread context;
wenzelm
parents: 38152
diff changeset
    25
  Swing_Thread.require()
37130
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
    26
39592
5638fe4f0843 tuned signature;
wenzelm
parents: 39518
diff changeset
    27
  private val html_panel =
37164
8b4617ad1593 reuse main view.font from jEdit;
wenzelm
parents: 37132
diff changeset
    28
    new HTML_Panel(Isabelle.system, Isabelle.font_family(), scala.math.round(Isabelle.font_size()))
39518
wenzelm
parents: 39513
diff changeset
    29
  set_content(html_panel)
34768
d8d321af1478 back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents: 34765
diff changeset
    30
d8d321af1478 back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents: 34765
diff changeset
    31
37130
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
    32
  /* component state -- owned by Swing thread */
36988
fd641bc85222 basic controls to freeze/update prover results;
wenzelm
parents: 36817
diff changeset
    33
37019
8f747cee4e27 zoom font size;
wenzelm
parents: 37017
diff changeset
    34
  private var zoom_factor = 100
37131
d4697a30bd02 clarified auto_update vs. update;
wenzelm
parents: 37130
diff changeset
    35
  private var show_tracing = false
d4697a30bd02 clarified auto_update vs. update;
wenzelm
parents: 37130
diff changeset
    36
  private var follow_caret = true
d4697a30bd02 clarified auto_update vs. update;
wenzelm
parents: 37130
diff changeset
    37
  private var current_command: Option[Command] = None
37019
8f747cee4e27 zoom font size;
wenzelm
parents: 37017
diff changeset
    38
37131
d4697a30bd02 clarified auto_update vs. update;
wenzelm
parents: 37130
diff changeset
    39
d4697a30bd02 clarified auto_update vs. update;
wenzelm
parents: 37130
diff changeset
    40
  private def handle_resize()
d4697a30bd02 clarified auto_update vs. update;
wenzelm
parents: 37130
diff changeset
    41
  {
37019
8f747cee4e27 zoom font size;
wenzelm
parents: 37017
diff changeset
    42
    Swing_Thread.now {
37164
8b4617ad1593 reuse main view.font from jEdit;
wenzelm
parents: 37132
diff changeset
    43
      html_panel.resize(Isabelle.font_family(),
8b4617ad1593 reuse main view.font from jEdit;
wenzelm
parents: 37132
diff changeset
    44
        scala.math.round(Isabelle.font_size() * zoom_factor / 100))
37019
8f747cee4e27 zoom font size;
wenzelm
parents: 37017
diff changeset
    45
    }
37131
d4697a30bd02 clarified auto_update vs. update;
wenzelm
parents: 37130
diff changeset
    46
  }
36988
fd641bc85222 basic controls to freeze/update prover results;
wenzelm
parents: 36817
diff changeset
    47
37849
4f9de312cc23 Session: predefined real time parameters;
wenzelm
parents: 37372
diff changeset
    48
  private def handle_perspective(): Boolean =
37131
d4697a30bd02 clarified auto_update vs. update;
wenzelm
parents: 37130
diff changeset
    49
    Swing_Thread.now {
d4697a30bd02 clarified auto_update vs. update;
wenzelm
parents: 37130
diff changeset
    50
      Document_View(view.getTextArea) match {
37849
4f9de312cc23 Session: predefined real time parameters;
wenzelm
parents: 37372
diff changeset
    51
        case Some(doc_view) =>
4f9de312cc23 Session: predefined real time parameters;
wenzelm
parents: 37372
diff changeset
    52
          val cmd = doc_view.selected_command()
4f9de312cc23 Session: predefined real time parameters;
wenzelm
parents: 37372
diff changeset
    53
          if (current_command == cmd) false
4f9de312cc23 Session: predefined real time parameters;
wenzelm
parents: 37372
diff changeset
    54
          else { current_command = cmd; true }
4f9de312cc23 Session: predefined real time parameters;
wenzelm
parents: 37372
diff changeset
    55
        case None => false
37131
d4697a30bd02 clarified auto_update vs. update;
wenzelm
parents: 37130
diff changeset
    56
      }
d4697a30bd02 clarified auto_update vs. update;
wenzelm
parents: 37130
diff changeset
    57
    }
37130
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
    58
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
    59
  private def handle_update(restriction: Option[Set[Command]] = None)
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
    60
  {
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
    61
    Swing_Thread.now {
37849
4f9de312cc23 Session: predefined real time parameters;
wenzelm
parents: 37372
diff changeset
    62
      if (follow_caret) handle_perspective()
37130
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
    63
      Document_View(view.getTextArea) match {
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
    64
        case Some(doc_view) =>
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
    65
          current_command match {
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
    66
            case Some(cmd) if !restriction.isDefined || restriction.get.contains(cmd) =>
38152
eab0d1c2e46e Change.Snapshot: include from_current/to_current here, with precomputed changes;
wenzelm
parents: 38151
diff changeset
    67
              val snapshot = doc_view.model.snapshot()
37130
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
    68
              val filtered_results =
38872
26c505765024 Command.results: ordered by serial number;
wenzelm
parents: 38360
diff changeset
    69
                snapshot.state(cmd).results.iterator.map(_._2) filter {
39513
fce2202892c4 discontinued Output.debug, which belongs to early PGIP experiments (b6788dbd2ef9) and causes just too many problems (like spamming the message channel if it is used by more than one module);
wenzelm
parents: 38872
diff changeset
    70
                  case XML.Elem(Markup(Markup.TRACING, _), _) => show_tracing  // FIXME not scalable
37130
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
    71
                  case _ => true
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
    72
                }
38872
26c505765024 Command.results: ordered by serial number;
wenzelm
parents: 38360
diff changeset
    73
              html_panel.render(filtered_results.toList)
37130
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
    74
            case _ =>
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
    75
          }
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
    76
        case None =>
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
    77
      }
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
    78
    }
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
    79
  }
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
    80
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
    81
37067
31093f3687b5 simplified dockables using class Dockable;
wenzelm
parents: 37048
diff changeset
    82
  /* main actor */
34768
d8d321af1478 back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents: 34765
diff changeset
    83
37067
31093f3687b5 simplified dockables using class Dockable;
wenzelm
parents: 37048
diff changeset
    84
  private val main_actor = actor {
34768
d8d321af1478 back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents: 34765
diff changeset
    85
    loop {
d8d321af1478 back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents: 34765
diff changeset
    86
      react {
37019
8f747cee4e27 zoom font size;
wenzelm
parents: 37017
diff changeset
    87
        case Session.Global_Settings => handle_resize()
38360
53224a4d2f0e specific Session.Commands_Changed;
wenzelm
parents: 38356
diff changeset
    88
        case Session.Commands_Changed(changed) => handle_update(Some(changed))
37850
afb5653a3a47 observe follow_caret (again);
wenzelm
parents: 37849
diff changeset
    89
        case Session.Perspective => if (follow_caret && handle_perspective()) handle_update()
37067
31093f3687b5 simplified dockables using class Dockable;
wenzelm
parents: 37048
diff changeset
    90
        case bad => System.err.println("Output_Dockable: ignoring bad message " + bad)
34768
d8d321af1478 back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents: 34765
diff changeset
    91
      }
d8d321af1478 back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents: 34765
diff changeset
    92
    }
d8d321af1478 back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents: 34765
diff changeset
    93
  }
34428
d69fd18f37f9 basic setup of anti-aliasing, according to jEdit property;
wenzelm
parents: 34424
diff changeset
    94
37067
31093f3687b5 simplified dockables using class Dockable;
wenzelm
parents: 37048
diff changeset
    95
  override def init()
34777
91d6089cef88 class Session models full session, with or without prover process (cf. heaps, browser_info);
wenzelm
parents: 34775
diff changeset
    96
  {
37849
4f9de312cc23 Session: predefined real time parameters;
wenzelm
parents: 37372
diff changeset
    97
    Isabelle.session.global_settings += main_actor
37129
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37067
diff changeset
    98
    Isabelle.session.commands_changed += main_actor
37849
4f9de312cc23 Session: predefined real time parameters;
wenzelm
parents: 37372
diff changeset
    99
    Isabelle.session.perspective += main_actor
34768
d8d321af1478 back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents: 34765
diff changeset
   100
  }
d8d321af1478 back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents: 34765
diff changeset
   101
37067
31093f3687b5 simplified dockables using class Dockable;
wenzelm
parents: 37048
diff changeset
   102
  override def exit()
34777
91d6089cef88 class Session models full session, with or without prover process (cf. heaps, browser_info);
wenzelm
parents: 34775
diff changeset
   103
  {
37849
4f9de312cc23 Session: predefined real time parameters;
wenzelm
parents: 37372
diff changeset
   104
    Isabelle.session.global_settings -= main_actor
37129
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37067
diff changeset
   105
    Isabelle.session.commands_changed -= main_actor
37849
4f9de312cc23 Session: predefined real time parameters;
wenzelm
parents: 37372
diff changeset
   106
    Isabelle.session.perspective -= main_actor
34768
d8d321af1478 back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents: 34765
diff changeset
   107
  }
36988
fd641bc85222 basic controls to freeze/update prover results;
wenzelm
parents: 36817
diff changeset
   108
fd641bc85222 basic controls to freeze/update prover results;
wenzelm
parents: 36817
diff changeset
   109
37014
1af0f718ffdc handle component resize for output / HTML panel;
wenzelm
parents: 36993
diff changeset
   110
  /* resize */
1af0f718ffdc handle component resize for output / HTML panel;
wenzelm
parents: 36993
diff changeset
   111
1af0f718ffdc handle component resize for output / HTML panel;
wenzelm
parents: 36993
diff changeset
   112
  addComponentListener(new ComponentAdapter {
37849
4f9de312cc23 Session: predefined real time parameters;
wenzelm
parents: 37372
diff changeset
   113
    val delay = Swing_Thread.delay_last(Isabelle.session.update_delay) { handle_resize() }
37014
1af0f718ffdc handle component resize for output / HTML panel;
wenzelm
parents: 36993
diff changeset
   114
    override def componentResized(e: ComponentEvent) { delay() }
1af0f718ffdc handle component resize for output / HTML panel;
wenzelm
parents: 36993
diff changeset
   115
  })
1af0f718ffdc handle component resize for output / HTML panel;
wenzelm
parents: 36993
diff changeset
   116
1af0f718ffdc handle component resize for output / HTML panel;
wenzelm
parents: 36993
diff changeset
   117
37130
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
   118
  /* controls */
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
   119
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
   120
  private val zoom = new Library.Zoom_Box(factor => { zoom_factor = factor; handle_resize() })
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
   121
  zoom.tooltip = "Zoom factor for basic font size"
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
   122
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
   123
  private val tracing = new CheckBox("Tracing") {
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
   124
    reactions += { case ButtonClicked(_) => show_tracing = this.selected; handle_update() }
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
   125
  }
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
   126
  tracing.selected = show_tracing
37372
babe498016e8 tuned tooltips;
wenzelm
parents: 37164
diff changeset
   127
  tracing.tooltip = "Indicate output of tracing messages"
37130
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
   128
37131
d4697a30bd02 clarified auto_update vs. update;
wenzelm
parents: 37130
diff changeset
   129
  private val auto_update = new CheckBox("Auto update") {
37130
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
   130
    reactions += { case ButtonClicked(_) => follow_caret = this.selected; handle_update() }
7f18edbbf618 more reactive message handling, notably for follow_caret mode;
wenzelm
parents: 37129
diff changeset
   131
  }
37131
d4697a30bd02 clarified auto_update vs. update;
wenzelm
parents: 37130
diff changeset
   132
  auto_update.selected = follow_caret
37372
babe498016e8 tuned tooltips;
wenzelm
parents: 37164
diff changeset
   133
  auto_update.tooltip = "Indicate automatic update following cursor movement"
36988
fd641bc85222 basic controls to freeze/update prover results;
wenzelm
parents: 36817
diff changeset
   134
37131
d4697a30bd02 clarified auto_update vs. update;
wenzelm
parents: 37130
diff changeset
   135
  private val update = new Button("Update") {
37849
4f9de312cc23 Session: predefined real time parameters;
wenzelm
parents: 37372
diff changeset
   136
    reactions += { case ButtonClicked(_) => handle_perspective(); handle_update() }
37131
d4697a30bd02 clarified auto_update vs. update;
wenzelm
parents: 37130
diff changeset
   137
  }
37372
babe498016e8 tuned tooltips;
wenzelm
parents: 37164
diff changeset
   138
  update.tooltip = "Update display according to the command at cursor position"
37131
d4697a30bd02 clarified auto_update vs. update;
wenzelm
parents: 37130
diff changeset
   139
39592
5638fe4f0843 tuned signature;
wenzelm
parents: 39518
diff changeset
   140
  private val controls = new FlowPanel(FlowPanel.Alignment.Right)(zoom, tracing, auto_update, update)
37039
d01da9438170 added checkboxes for debug/tracing filter;
wenzelm
parents: 37037
diff changeset
   141
  add(controls.peer, BorderLayout.NORTH)
d01da9438170 added checkboxes for debug/tracing filter;
wenzelm
parents: 37037
diff changeset
   142
36988
fd641bc85222 basic controls to freeze/update prover results;
wenzelm
parents: 36817
diff changeset
   143
  handle_update()
34318
c13e168a8ae6 original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
wenzelm
parents:
diff changeset
   144
}