author | wenzelm |
Fri, 21 May 2010 20:10:45 +0200 | |
changeset 37044 | d93b849cbecd |
parent 37039 | d01da9438170 |
child 37048 | d014976dd690 |
permissions | -rw-r--r-- |
36760 | 1 |
/* Title: Tools/jEdit/src/jedit/output_dockable.scala |
2 |
Author: Makarius |
|
3 |
||
4 |
Dockable window with result message output. |
|
5 |
*/ |
|
34408 | 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 | 9 |
|
36015 | 10 |
import isabelle._ |
11 |
||
34768
d8d321af1478
back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents:
34765
diff
changeset
|
12 |
import scala.actors.Actor._ |
34760 | 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 | 15 |
import scala.swing.event.ButtonClicked |
16 |
||
34768
d8d321af1478
back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents:
34765
diff
changeset
|
17 |
import javax.swing.JPanel |
d8d321af1478
back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents:
34765
diff
changeset
|
18 |
import java.awt.{BorderLayout, Dimension} |
37014 | 19 |
import java.awt.event.{ComponentEvent, ComponentAdapter} |
34748 | 20 |
|
34318
c13e168a8ae6
original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
wenzelm
parents:
diff
changeset
|
21 |
import org.gjt.sp.jedit.View |
34424 | 22 |
import org.gjt.sp.jedit.gui.DockableWindowManager |
34745 | 23 |
|
34318
c13e168a8ae6
original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
wenzelm
parents:
diff
changeset
|
24 |
|
34765 | 25 |
|
34791 | 26 |
class Output_Dockable(view: View, position: String) extends JPanel(new BorderLayout) |
34760 | 27 |
{ |
34424 | 28 |
if (position == DockableWindowManager.FLOATING) |
34768
d8d321af1478
back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents:
34765
diff
changeset
|
29 |
setPreferredSize(new Dimension(500, 250)) |
34771 | 30 |
|
37036 | 31 |
val html_panel = new HTML_Panel(Isabelle.system, scala.math.round(Isabelle.font_size())) |
34768
d8d321af1478
back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents:
34765
diff
changeset
|
32 |
add(html_panel, BorderLayout.CENTER) |
d8d321af1478
back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents:
34765
diff
changeset
|
33 |
|
d8d321af1478
back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents:
34765
diff
changeset
|
34 |
|
36988 | 35 |
/* controls */ |
36 |
||
37039 | 37 |
private val zoom = Library.zoom_box(factor => { zoom_factor = factor; handle_resize() }) |
38 |
zoom.tooltip = "Zoom factor for basic font size" |
|
39 |
||
40 |
private val update = new Button("Update") { |
|
41 |
reactions += { case ButtonClicked(_) => handle_update() } |
|
42 |
} |
|
43 |
update.tooltip = "Update display according to state of command at caret position" |
|
44 |
||
45 |
private val tracing = new CheckBox("Tracing") { |
|
46 |
reactions += { case ButtonClicked(_) => handle_update() } |
|
47 |
} |
|
48 |
tracing.tooltip = "Indicate output of tracing messages" |
|
49 |
||
50 |
private val debug = new CheckBox("Debug") { |
|
51 |
reactions += { case ButtonClicked(_) => handle_update() } |
|
52 |
} |
|
53 |
debug.tooltip = "Indicate output of debug messages (usually disabled on the prover side)" |
|
54 |
||
55 |
private val follow = new CheckBox("Follow") |
|
56 |
follow.selected = true |
|
57 |
follow.tooltip = "Indicate automatic update according to caret movement or state changes" |
|
58 |
||
59 |
private def filtered_results(document: Document, cmd: Command): List[XML.Tree] = |
|
60 |
{ |
|
61 |
val show_tracing = tracing.selected |
|
62 |
val show_debug = debug.selected |
|
63 |
document.current_state(cmd).results filter { |
|
37044
d93b849cbecd
simplified message markup, using plain XML.Elem directly;
wenzelm
parents:
37039
diff
changeset
|
64 |
case XML.Elem(Markup.TRACING, _, _) => show_tracing |
d93b849cbecd
simplified message markup, using plain XML.Elem directly;
wenzelm
parents:
37039
diff
changeset
|
65 |
case XML.Elem(Markup.DEBUG, _, _) => show_debug |
37039 | 66 |
case _ => true |
67 |
} |
|
68 |
} |
|
69 |
||
36989
aaa7cac3e54a
inverted "Freeze" to "Follow", which is the default;
wenzelm
parents:
36988
diff
changeset
|
70 |
private case class Render(body: List[XML.Tree]) |
aaa7cac3e54a
inverted "Freeze" to "Follow", which is the default;
wenzelm
parents:
36988
diff
changeset
|
71 |
|
36988 | 72 |
private def handle_update() |
73 |
{ |
|
74 |
Swing_Thread.now { |
|
75 |
Document_Model(view.getBuffer) match { |
|
76 |
case Some(model) => |
|
36989
aaa7cac3e54a
inverted "Freeze" to "Follow", which is the default;
wenzelm
parents:
36988
diff
changeset
|
77 |
val document = model.recent_document |
aaa7cac3e54a
inverted "Freeze" to "Follow", which is the default;
wenzelm
parents:
36988
diff
changeset
|
78 |
document.command_at(view.getTextArea.getCaretPosition) match { |
aaa7cac3e54a
inverted "Freeze" to "Follow", which is the default;
wenzelm
parents:
36988
diff
changeset
|
79 |
case Some((cmd, _)) => |
37039 | 80 |
output_actor ! Render(filtered_results(document, cmd)) |
36988 | 81 |
case None => |
82 |
} |
|
83 |
case None => |
|
84 |
} |
|
85 |
} |
|
86 |
} |
|
87 |
||
37019 | 88 |
private var zoom_factor = 100 |
89 |
||
90 |
private def handle_resize() = |
|
91 |
Swing_Thread.now { |
|
92 |
html_panel.resize(scala.math.round(Isabelle.font_size() * zoom_factor / 100)) |
|
93 |
} |
|
94 |
||
36988 | 95 |
|
34768
d8d321af1478
back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents:
34765
diff
changeset
|
96 |
/* actor wiring */ |
d8d321af1478
back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents:
34765
diff
changeset
|
97 |
|
34773 | 98 |
private val output_actor = actor { |
34768
d8d321af1478
back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents:
34765
diff
changeset
|
99 |
loop { |
d8d321af1478
back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents:
34765
diff
changeset
|
100 |
react { |
37019 | 101 |
case Session.Global_Settings => handle_resize() |
36989
aaa7cac3e54a
inverted "Freeze" to "Follow", which is the default;
wenzelm
parents:
36988
diff
changeset
|
102 |
case Render(body) => html_panel.render(body) |
aaa7cac3e54a
inverted "Freeze" to "Follow", which is the default;
wenzelm
parents:
36988
diff
changeset
|
103 |
|
34768
d8d321af1478
back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents:
34765
diff
changeset
|
104 |
case cmd: Command => |
36988 | 105 |
Swing_Thread.now { |
36989
aaa7cac3e54a
inverted "Freeze" to "Follow", which is the default;
wenzelm
parents:
36988
diff
changeset
|
106 |
if (follow.selected) Document_Model(view.getBuffer) else None |
36988 | 107 |
} match { |
34777
91d6089cef88
class Session models full session, with or without prover process (cf. heaps, browser_info);
wenzelm
parents:
34775
diff
changeset
|
108 |
case None => |
37039 | 109 |
case Some(model) => |
110 |
html_panel.render(filtered_results(model.recent_document, cmd)) |
|
34777
91d6089cef88
class Session models full session, with or without prover process (cf. heaps, browser_info);
wenzelm
parents:
34775
diff
changeset
|
111 |
} |
34791 | 112 |
|
34773 | 113 |
case bad => System.err.println("output_actor: ignoring bad message " + bad) |
34768
d8d321af1478
back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents:
34765
diff
changeset
|
114 |
} |
d8d321af1478
back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents:
34765
diff
changeset
|
115 |
} |
d8d321af1478
back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents:
34765
diff
changeset
|
116 |
} |
34428
d69fd18f37f9
basic setup of anti-aliasing, according to jEdit property;
wenzelm
parents:
34424
diff
changeset
|
117 |
|
34777
91d6089cef88
class Session models full session, with or without prover process (cf. heaps, browser_info);
wenzelm
parents:
34775
diff
changeset
|
118 |
override def addNotify() |
91d6089cef88
class Session models full session, with or without prover process (cf. heaps, browser_info);
wenzelm
parents:
34775
diff
changeset
|
119 |
{ |
34768
d8d321af1478
back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents:
34765
diff
changeset
|
120 |
super.addNotify() |
34777
91d6089cef88
class Session models full session, with or without prover process (cf. heaps, browser_info);
wenzelm
parents:
34775
diff
changeset
|
121 |
Isabelle.session.results += output_actor |
34791 | 122 |
Isabelle.session.global_settings += output_actor |
34768
d8d321af1478
back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents:
34765
diff
changeset
|
123 |
} |
d8d321af1478
back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents:
34765
diff
changeset
|
124 |
|
34777
91d6089cef88
class Session models full session, with or without prover process (cf. heaps, browser_info);
wenzelm
parents:
34775
diff
changeset
|
125 |
override def removeNotify() |
91d6089cef88
class Session models full session, with or without prover process (cf. heaps, browser_info);
wenzelm
parents:
34775
diff
changeset
|
126 |
{ |
91d6089cef88
class Session models full session, with or without prover process (cf. heaps, browser_info);
wenzelm
parents:
34775
diff
changeset
|
127 |
Isabelle.session.results -= output_actor |
34791 | 128 |
Isabelle.session.global_settings -= output_actor |
34768
d8d321af1478
back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents:
34765
diff
changeset
|
129 |
super.removeNotify() |
d8d321af1478
back to low-level JPanel, required for addNotify/removeNotify;
wenzelm
parents:
34765
diff
changeset
|
130 |
} |
36988 | 131 |
|
132 |
||
37014 | 133 |
/* resize */ |
134 |
||
135 |
addComponentListener(new ComponentAdapter { |
|
37033 | 136 |
val delay = Swing_Thread.delay_last(500) { handle_resize() } |
37014 | 137 |
override def componentResized(e: ComponentEvent) { delay() } |
138 |
}) |
|
139 |
||
140 |
||
36988 | 141 |
/* init controls */ |
142 |
||
37039 | 143 |
val controls = new FlowPanel(FlowPanel.Alignment.Right)(zoom, update, debug, tracing, follow) |
144 |
add(controls.peer, BorderLayout.NORTH) |
|
145 |
||
36988 | 146 |
handle_update() |
34318
c13e168a8ae6
original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
wenzelm
parents:
diff
changeset
|
147 |
} |