src/Tools/jEdit/src/pretty_text_area.scala
changeset 49419 e2726211f834
parent 49416 1053a564dd25
child 49420 32cb1f1a6a5d
equal deleted inserted replaced
49418:c451856129cd 49419:e2726211f834
    18 import scala.swing.{BorderPanel, Component}
    18 import scala.swing.{BorderPanel, Component}
    19 
    19 
    20 
    20 
    21 object Pretty_Text_Area
    21 object Pretty_Text_Area
    22 {
    22 {
    23   def document_state(formatted_body: XML.Body): (String, Document.State) =
    23   def document_state(base_snapshot: Document.Snapshot, formatted_body: XML.Body)
       
    24     : (String, Document.State) =
    24   {
    25   {
    25     val command = Command.rich_text(Document.new_id(), formatted_body)
    26     val command = Command.rich_text(Document.new_id(), formatted_body)
    26     val node_name = command.node_name
    27     val node_name = command.node_name
    27 
       
    28     val edits: List[Document.Edit_Text] =
    28     val edits: List[Document.Edit_Text] =
    29       List(node_name -> Document.Node.Edits(List(Text.Edit.insert(0, command.source))))
    29       List(node_name -> Document.Node.Edits(List(Text.Edit.insert(0, command.source))))
    30 
    30 
    31     val state0 = Document.State.init.define_command(command)
    31     val state0 = base_snapshot.state.define_command(command)
    32     val version0 = state0.history.tip.version.get_finished
    32     val version0 = base_snapshot.version
    33     val nodes0 = version0.nodes
    33     val nodes0 = version0.nodes
       
    34 
       
    35     assert(nodes0(node_name).commands.isEmpty)
    34 
    36 
    35     val nodes1 = nodes0 + (node_name -> nodes0(node_name).update_commands(Linear_Set(command)))
    37     val nodes1 = nodes0 + (node_name -> nodes0(node_name).update_commands(Linear_Set(command)))
    36     val version1 = Document.Version.make(version0.syntax, nodes1)
    38     val version1 = Document.Version.make(version0.syntax, nodes1)
    37     val state1 =
    39     val state1 =
    38       state0.continue_history(Future.value(version0), edits, Future.value(version1))._2
    40       state0.continue_history(Future.value(version0), edits, Future.value(version1))._2
    50   private var current_font_metrics: FontMetrics = null
    52   private var current_font_metrics: FontMetrics = null
    51   private var current_font_family = "Dialog"
    53   private var current_font_family = "Dialog"
    52   private var current_font_size: Int = 12
    54   private var current_font_size: Int = 12
    53   private var current_margin: Int = 0
    55   private var current_margin: Int = 0
    54   private var current_body: XML.Body = Nil
    56   private var current_body: XML.Body = Nil
       
    57   private var current_base_snapshot = Document.State.init.snapshot()
    55   private var current_rendering: Isabelle_Rendering = text_rendering()._2
    58   private var current_rendering: Isabelle_Rendering = text_rendering()._2
    56 
    59 
    57   val text_area = new JEditEmbeddedTextArea
    60   val text_area = new JEditEmbeddedTextArea
    58   val rich_text_area = new Rich_Text_Area(view, text_area, () => current_rendering)
    61   val rich_text_area = new Rich_Text_Area(view, text_area, () => current_rendering)
    59 
    62 
    61   {
    64   {
    62     Swing_Thread.require()
    65     Swing_Thread.require()
    63 
    66 
    64     val body =
    67     val body =
    65       Pretty.formatted(current_body, current_margin, Pretty.font_metric(current_font_metrics))
    68       Pretty.formatted(current_body, current_margin, Pretty.font_metric(current_font_metrics))
    66     val (text, state) = Pretty_Text_Area.document_state(body)
    69     val (text, state) = Pretty_Text_Area.document_state(current_base_snapshot, body)
    67     val rendering = Isabelle_Rendering(state.snapshot(), Isabelle.options.value)
    70     val rendering = Isabelle_Rendering(state.snapshot(), Isabelle.options.value)
    68 
    71 
    69     (text, rendering)
    72     (text, rendering)
    70   }
    73   }
    71 
    74 
   104     current_font_family = font_family
   107     current_font_family = font_family
   105     current_font_size = font_size
   108     current_font_size = font_size
   106     refresh()
   109     refresh()
   107   }
   110   }
   108 
   111 
   109   def update(body: XML.Body)
   112   def update(base_snapshot: Document.Snapshot, body: XML.Body)
   110   {
   113   {
   111     Swing_Thread.require()
   114     Swing_Thread.require()
       
   115     require(!base_snapshot.is_outdated)
   112 
   116 
       
   117     current_base_snapshot = base_snapshot
   113     current_body = body
   118     current_body = body
   114     refresh()
   119     refresh()
   115   }
   120   }
   116 
   121 
   117   rich_text_area.activate()
   122   rich_text_area.activate()