more robust painter_body wrt. EBP races and spurious exceptions (which causes jEdit to remove the extension);
authorwenzelm
Wed, 15 Jun 2011 16:26:09 +0200
changeset 43398 c3e2a361b418
parent 43397 dba359c0ae3b
child 43403 c2b0cfeaa5ab
more robust painter_body wrt. EBP races and spurious exceptions (which causes jEdit to remove the extension);
src/Tools/jEdit/src/text_area_painter.scala
--- a/src/Tools/jEdit/src/text_area_painter.scala	Wed Jun 15 16:22:58 2011 +0200
+++ b/src/Tools/jEdit/src/text_area_painter.scala	Wed Jun 15 16:26:09 2011 +0200
@@ -14,6 +14,8 @@
 import java.text.AttributedString
 import java.util.ArrayList
 
+import org.gjt.sp.util.Log
+
 import org.gjt.sp.jedit.Debug
 import org.gjt.sp.jedit.syntax.{DisplayTokenHandler, Chunk}
 import org.gjt.sp.jedit.textarea.{TextAreaExtension, TextAreaPainter, JEditTextArea}
@@ -25,6 +27,15 @@
   private val buffer = model.buffer
   private val text_area = doc_view.text_area
 
+  private def painter_body(body: => Unit)
+  {
+    if (buffer == text_area.getBuffer)
+      Swing_Thread.now {
+        try { Isabelle.buffer_lock(buffer) { body } }
+        catch { case t: Throwable => Log.log(Log.ERROR, this, t) }
+      }
+  }
+
 
   /* original painters */
 
@@ -77,7 +88,7 @@
       first_line: Int, last_line: Int, physical_lines: Array[Int],
       start: Array[Int], end: Array[Int], y: Int, line_height: Int)
     {
-      Isabelle.swing_buffer_lock(buffer) {
+      painter_body {
         val snapshot = painter_snapshot
         val ascent = text_area.getPainter.getFontMetrics.getAscent
 
@@ -257,7 +268,7 @@
       first_line: Int, last_line: Int, physical_lines: Array[Int],
       start: Array[Int], end: Array[Int], y: Int, line_height: Int)
     {
-      Isabelle.swing_buffer_lock(buffer) {
+      painter_body {
         val clip = gfx.getClip
         val x0 = text_area.getHorizontalOffset
         val fm = text_area.getPainter.getFontMetrics
@@ -312,16 +323,18 @@
     override def paintValidLine(gfx: Graphics2D,
       screen_line: Int, physical_line: Int, start: Int, end: Int, y: Int)
     {
-      if (text_area.hasFocus) {
-        val caret = text_area.getCaretPosition
-        if (start <= caret && caret == end - 1) {
-          val painter = text_area.getPainter
-          val fm = painter.getFontMetrics
+      painter_body {
+        if (text_area.hasFocus) {
+          val caret = text_area.getCaretPosition
+          if (start <= caret && caret == end - 1) {
+            val painter = text_area.getPainter
+            val fm = painter.getFontMetrics
 
-          val offset = caret - text_area.getLineStartOffset(physical_line)
-          val x = text_area.offsetToXY(physical_line, offset).x
-          gfx.setColor(painter.getCaretColor)
-          gfx.drawRect(x, y, char_width() - 1, fm.getHeight - 1)
+            val offset = caret - text_area.getLineStartOffset(physical_line)
+            val x = text_area.offsetToXY(physical_line, offset).x
+            gfx.setColor(painter.getCaretColor)
+            gfx.drawRect(x, y, char_width() - 1, fm.getHeight - 1)
+          }
         }
       }
     }