src/Tools/jEdit/src/jedit/TheoryView.scala
changeset 34719 f5b408849dcc
parent 34718 39e3039645ae
child 34724 b1079c3ba1da
equal deleted inserted replaced
34718:39e3039645ae 34719:f5b408849dcc
    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 }