10 |
10 |
11 import scala.actors.Actor, Actor._ |
11 import scala.actors.Actor, Actor._ |
12 import scala.collection.mutable |
12 import scala.collection.mutable |
13 |
13 |
14 import isabelle.proofdocument.{ProofDocument, Change, Edit, Insert, Remove} |
14 import isabelle.proofdocument.{ProofDocument, Change, Edit, Insert, Remove} |
15 import isabelle.prover.{Prover, ProverEvents, Command} |
15 import isabelle.prover.{Prover, Command} |
16 |
16 |
17 import java.awt.{Color, Graphics2D} |
17 import java.awt.{Color, Graphics2D} |
18 import javax.swing.event.{CaretListener, CaretEvent} |
18 import javax.swing.event.{CaretListener, CaretEvent} |
19 |
19 |
20 import org.gjt.sp.jedit.buffer.{BufferListener, JEditBuffer} |
20 import org.gjt.sp.jedit.buffer.{BufferListener, JEditBuffer} |
37 |
37 |
38 |
38 |
39 class TheoryView(text_area: JEditTextArea) |
39 class TheoryView(text_area: JEditTextArea) |
40 extends TextAreaExtension with BufferListener |
40 extends TextAreaExtension with BufferListener |
41 { |
41 { |
|
42 val buffer = text_area.getBuffer |
|
43 |
|
44 |
|
45 /* prover setup */ |
|
46 |
|
47 val change_receiver: Actor = new Actor { |
|
48 def act() { |
|
49 loop { |
|
50 react { |
|
51 case c: Command => |
|
52 actor { Isabelle.plugin.command_change.event(c) } |
|
53 if (current_document().commands.contains(c)) |
|
54 Swing_Thread.later { |
|
55 // repaint if buffer is active |
|
56 if (text_area.getBuffer == buffer) { |
|
57 update_syntax(c) |
|
58 invalidate_line(c) |
|
59 phase_overview.repaint() |
|
60 } |
|
61 } |
|
62 case d: ProofDocument => |
|
63 actor { Isabelle.plugin.document_change.event(d) } |
|
64 case bad => System.err.println("change_receiver: ignoring bad message " + bad) |
|
65 } |
|
66 } |
|
67 } |
|
68 } |
|
69 |
|
70 val prover: Prover = new Prover(Isabelle.system, Isabelle.default_logic(), change_receiver) |
42 |
71 |
43 val buffer = text_area.getBuffer |
|
44 |
|
45 // start prover |
|
46 val prover: Prover = new Prover(Isabelle.system, Isabelle.default_logic(), change_receiver) |
|
47 prover.start() // start actor |
|
48 |
|
49 |
72 |
50 /* activation */ |
73 /* activation */ |
51 |
74 |
52 private val phase_overview = new PhaseOverviewPanel(prover, text_area, to_current) |
75 private val phase_overview = new PhaseOverviewPanel(prover, text_area, to_current) |
53 |
76 |
54 private val selected_state_controller = new CaretListener { |
77 private val selected_state_controller = new CaretListener { |
55 override def caretUpdate(e: CaretEvent) = { |
78 override def caretUpdate(e: CaretEvent) { |
56 val doc = current_document() |
79 val doc = current_document() |
57 doc.command_at(e.getDot) match { |
80 doc.command_at(e.getDot) match { |
58 case Some(cmd) |
81 case Some(cmd) |
59 if (doc.token_start(cmd.tokens.first) <= e.getDot && |
82 if (doc.token_start(cmd.tokens.first) <= e.getDot && |
60 Isabelle.plugin.selected_state != cmd) => |
83 Isabelle.plugin.selected_state != cmd) => |
298 case None => null |
321 case None => null |
299 } |
322 } |
300 } |
323 } |
301 |
324 |
302 |
325 |
303 /* receiving from prover */ |
326 /* init */ |
304 |
327 |
305 lazy val change_receiver: Actor = actor { |
328 change_receiver.start() |
306 loop { |
329 prover.start() |
307 react { |
330 |
308 case ProverEvents.Activate => // FIXME !? |
331 edits += Insert(0, buffer.getText(0, buffer.getLength)) |
309 Swing_Thread.now { |
332 edits_delay() |
310 edits.clear |
|
311 edits += Insert(0, buffer.getText(0, buffer.getLength)) |
|
312 edits_delay() |
|
313 } |
|
314 case c: Command => |
|
315 actor{Isabelle.plugin.command_change.event(c)} |
|
316 if(current_document().commands.contains(c)) |
|
317 Swing_Thread.later { |
|
318 // repaint if buffer is active |
|
319 if(text_area.getBuffer == buffer) { |
|
320 update_syntax(c) |
|
321 invalidate_line(c) |
|
322 phase_overview.repaint() |
|
323 } |
|
324 } |
|
325 case d: ProofDocument => |
|
326 actor{Isabelle.plugin.document_change.event(d)} |
|
327 case x => System.err.println("warning: change_receiver ignored " + x) |
|
328 } |
|
329 } |
|
330 } |
|
331 } |
333 } |