src/Tools/jEdit/src/text_overview.scala
author wenzelm
Mon, 06 Apr 2020 12:53:45 +0200
changeset 71704 b9a5eb0f3b43
parent 65911 f97d163479b9
child 73340 0ffcad1f6130
permissions -rw-r--r--
clarified modules;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46572
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
     1
/*  Title:      Tools/jEdit/src/text_overview.scala
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
     3
57613
4c6d44a3a079 tuned comments;
wenzelm
parents: 57612
diff changeset
     4
GUI component for text status overview.
46572
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
     5
*/
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
     6
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
     7
package isabelle.jedit
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
     8
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
     9
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    10
import isabelle._
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    11
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    12
import scala.annotation.tailrec
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    13
49346
977cf0788b30 more efficient painting based on cached result;
wenzelm
parents: 47027
diff changeset
    14
import java.awt.{Graphics, Graphics2D, BorderLayout, Dimension, Color}
46572
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    15
import java.awt.event.{MouseAdapter, MouseEvent}
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    16
import javax.swing.{JPanel, ToolTipManager}
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    17
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    18
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    19
class Text_Overview(doc_view: Document_View) extends JPanel(new BorderLayout)
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    20
{
61195
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
    21
  /* GUI components */
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
    22
46572
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    23
  private val text_area = doc_view.text_area
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    24
  private val buffer = doc_view.model.buffer
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    25
61195
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
    26
  private def lines(): Int = buffer.getLineCount max text_area.getVisibleLines
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
    27
61747
a870098fc27e more scalable GUI;
wenzelm
parents: 61723
diff changeset
    28
  private val WIDTH = text_area.getPainter.getFontMetrics.stringWidth("A") max 10
50895
3a1edaa0dc6d more prominent status ticks;
wenzelm
parents: 50886
diff changeset
    29
  private val HEIGHT = 4
46572
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    30
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    31
  setPreferredSize(new Dimension(WIDTH, 0))
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    32
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    33
  setRequestFocusEnabled(false)
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    34
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    35
  addMouseListener(new MouseAdapter {
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    36
    override def mousePressed(event: MouseEvent) {
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    37
      val line = (event.getY * lines()) / getHeight
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    38
      if (line >= 0 && line < text_area.getLineCount)
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    39
        text_area.setCaretPosition(text_area.getLineStartOffset(line))
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    40
    }
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    41
  })
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    42
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    43
  override def addNotify() {
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    44
    super.addNotify()
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    45
    ToolTipManager.sharedInstance.registerComponent(this)
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    46
  }
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    47
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    48
  override def removeNotify() {
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    49
    ToolTipManager.sharedInstance.unregisterComponent(this)
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    50
    super.removeNotify
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    51
  }
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    52
49346
977cf0788b30 more efficient painting based on cached result;
wenzelm
parents: 47027
diff changeset
    53
61195
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
    54
  /* overview */
49346
977cf0788b30 more efficient painting based on cached result;
wenzelm
parents: 47027
diff changeset
    55
61195
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
    56
  private case class Overview(
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
    57
    line_count: Int = 0,
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
    58
    char_count: Int = 0,
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
    59
    L: Int = 0,
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
    60
    H: Int = 0)
49346
977cf0788b30 more efficient painting based on cached result;
wenzelm
parents: 47027
diff changeset
    61
61196
67c20ce71d22 eliminated pointless jedit_text_overview_limit;
wenzelm
parents: 61195
diff changeset
    62
  private def get_overview(): Overview =
61195
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
    63
    Overview(
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
    64
      line_count = buffer.getLineCount,
61196
67c20ce71d22 eliminated pointless jedit_text_overview_limit;
wenzelm
parents: 61195
diff changeset
    65
      char_count = buffer.getLength,
61195
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
    66
      L = lines(),
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
    67
      H = getHeight())
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
    68
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
    69
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
    70
  /* synchronous painting */
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
    71
65911
f97d163479b9 clarified modules;
wenzelm
parents: 64884
diff changeset
    72
  type Color_Info = (Rendering.Color.Value, Int, Int)
f97d163479b9 clarified modules;
wenzelm
parents: 64884
diff changeset
    73
f97d163479b9 clarified modules;
wenzelm
parents: 64884
diff changeset
    74
  private var current_colors: List[Color_Info] = Nil
61195
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
    75
  private var current_overview = Overview()
49346
977cf0788b30 more efficient painting based on cached result;
wenzelm
parents: 47027
diff changeset
    76
62262
8bf765c9c2e5 separate delay_repaint to ensure reactivity, indepently of future_refresh status;
wenzelm
parents: 62092
diff changeset
    77
  private val delay_repaint =
71704
b9a5eb0f3b43 clarified modules;
wenzelm
parents: 65911
diff changeset
    78
    Delay.first(PIDE.options.seconds("editor_update_delay"), gui = true) { repaint() }
62262
8bf765c9c2e5 separate delay_repaint to ensure reactivity, indepently of future_refresh status;
wenzelm
parents: 62092
diff changeset
    79
46572
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    80
  override def paintComponent(gfx: Graphics)
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    81
  {
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    82
    super.paintComponent(gfx)
57612
990ffb84489b clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents: 56662
diff changeset
    83
    GUI_Thread.assert {}
46572
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    84
49411
1da54e9bda68 renamed Text_Area_Painter to Rich_Text_Area;
wenzelm
parents: 49410
diff changeset
    85
    doc_view.rich_text_area.robust_body(()) {
49406
38db4832b210 somewhat more general JEdit_Lib;
wenzelm
parents: 49356
diff changeset
    86
      JEdit_Lib.buffer_lock(buffer) {
49969
72216713733a further attempts to cope with large files via option jedit_text_overview_limit;
wenzelm
parents: 49697
diff changeset
    87
        val rendering = doc_view.get_rendering()
61196
67c20ce71d22 eliminated pointless jedit_text_overview_limit;
wenzelm
parents: 61195
diff changeset
    88
        val overview = get_overview()
46572
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
    89
62092
9ace5f5bae69 more thorough GUI update;
wenzelm
parents: 61904
diff changeset
    90
        if (rendering.snapshot.is_outdated || overview != current_overview) {
63774
749794930d61 make double-sure that refresh happens eventually, even without edits (e.g. height change) -- amending 8bf765c9c2e5;
wenzelm
parents: 62262
diff changeset
    91
          invoke()
62262
8bf765c9c2e5 separate delay_repaint to ensure reactivity, indepently of future_refresh status;
wenzelm
parents: 62092
diff changeset
    92
          delay_repaint.invoke()
62092
9ace5f5bae69 more thorough GUI update;
wenzelm
parents: 61904
diff changeset
    93
9ace5f5bae69 more thorough GUI update;
wenzelm
parents: 61904
diff changeset
    94
          gfx.setColor(rendering.outdated_color)
9ace5f5bae69 more thorough GUI update;
wenzelm
parents: 61904
diff changeset
    95
          gfx.asInstanceOf[Graphics2D].fill(gfx.getClipBounds)
9ace5f5bae69 more thorough GUI update;
wenzelm
parents: 61904
diff changeset
    96
        }
9ace5f5bae69 more thorough GUI update;
wenzelm
parents: 61904
diff changeset
    97
        else {
49346
977cf0788b30 more efficient painting based on cached result;
wenzelm
parents: 47027
diff changeset
    98
          gfx.setColor(getBackground)
977cf0788b30 more efficient painting based on cached result;
wenzelm
parents: 47027
diff changeset
    99
          gfx.asInstanceOf[Graphics2D].fill(gfx.getClipBounds)
61195
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   100
          for ((color, h, h1) <- current_colors) {
65911
f97d163479b9 clarified modules;
wenzelm
parents: 64884
diff changeset
   101
            gfx.setColor(rendering.color(color))
49346
977cf0788b30 more efficient painting based on cached result;
wenzelm
parents: 47027
diff changeset
   102
            gfx.fillRect(0, h, getWidth, h1 - h)
46572
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
   103
          }
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
   104
        }
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
   105
      }
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
   106
    }
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
   107
  }
61195
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   108
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   109
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   110
  /* asynchronous refresh */
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   111
62262
8bf765c9c2e5 separate delay_repaint to ensure reactivity, indepently of future_refresh status;
wenzelm
parents: 62092
diff changeset
   112
  private val future_refresh = Synchronized(Future.value(()))
8bf765c9c2e5 separate delay_repaint to ensure reactivity, indepently of future_refresh status;
wenzelm
parents: 62092
diff changeset
   113
  private def is_running(): Boolean = !future_refresh.value.is_finished
61195
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   114
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   115
  def invoke(): Unit = delay_refresh.invoke()
62262
8bf765c9c2e5 separate delay_repaint to ensure reactivity, indepently of future_refresh status;
wenzelm
parents: 62092
diff changeset
   116
  def revoke(): Unit = { delay_refresh.revoke(); future_refresh.change(x => { x.cancel; x }) }
61195
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   117
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   118
  private val delay_refresh =
71704
b9a5eb0f3b43 clarified modules;
wenzelm
parents: 65911
diff changeset
   119
    Delay.first(PIDE.options.seconds("editor_update_delay"), gui = true) {
64884
b2e78c0ce537 more robust: delay switches thread context from timer to GUI and may get out of sync with revoke operation;
wenzelm
parents: 63774
diff changeset
   120
      if (!doc_view.rich_text_area.check_robust_body) invoke()
b2e78c0ce537 more robust: delay switches thread context from timer to GUI and may get out of sync with revoke operation;
wenzelm
parents: 63774
diff changeset
   121
      else {
61195
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   122
        JEdit_Lib.buffer_lock(buffer) {
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   123
          val rendering = doc_view.get_rendering()
61196
67c20ce71d22 eliminated pointless jedit_text_overview_limit;
wenzelm
parents: 61195
diff changeset
   124
          val overview = get_overview()
61195
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   125
62262
8bf765c9c2e5 separate delay_repaint to ensure reactivity, indepently of future_refresh status;
wenzelm
parents: 62092
diff changeset
   126
          if (rendering.snapshot.is_outdated || is_running()) invoke()
61904
30f70d1b97c9 more thorough event propagation;
wenzelm
parents: 61747
diff changeset
   127
          else {
61195
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   128
            val line_offsets =
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   129
            {
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   130
              val line_manager = JEdit_Lib.buffer_line_manager(buffer)
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   131
              val a = new Array[Int](line_manager.getLineCount)
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   132
              for (i <- 1 until a.length) a(i) = line_manager.getLineEndOffset(i - 1)
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   133
              a
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   134
            }
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   135
62262
8bf765c9c2e5 separate delay_repaint to ensure reactivity, indepently of future_refresh status;
wenzelm
parents: 62092
diff changeset
   136
            future_refresh.change(_ =>
8bf765c9c2e5 separate delay_repaint to ensure reactivity, indepently of future_refresh status;
wenzelm
parents: 62092
diff changeset
   137
              Future.fork {
61195
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   138
                val line_count = overview.line_count
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   139
                val char_count = overview.char_count
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   140
                val L = overview.L
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   141
                val H = overview.H
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   142
65911
f97d163479b9 clarified modules;
wenzelm
parents: 64884
diff changeset
   143
                @tailrec def loop(l: Int, h: Int, p: Int, q: Int, colors: List[Color_Info])
f97d163479b9 clarified modules;
wenzelm
parents: 64884
diff changeset
   144
                  : List[Color_Info] =
61195
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   145
                {
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   146
                  Exn.Interrupt.expose()
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   147
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   148
                  if (l < line_count && h < H) {
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   149
                    val p1 = p + H
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   150
                    val q1 = q + HEIGHT * L
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   151
                    val (l1, h1) =
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   152
                      if (p1 >= q1) (l + 1, h + (p1 - q) / L)
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   153
                      else (l + (q1 - p) / H, h + HEIGHT)
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   154
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   155
                    val start = line_offsets(l)
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   156
                    val end =
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   157
                      if (l1 < line_count) line_offsets(l1)
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   158
                      else char_count
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   159
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   160
                    val colors1 =
61196
67c20ce71d22 eliminated pointless jedit_text_overview_limit;
wenzelm
parents: 61195
diff changeset
   161
                      (rendering.overview_color(Text.Range(start, end)), colors) match {
61195
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   162
                        case (Some(color), (old_color, old_h, old_h1) :: rest)
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   163
                        if color == old_color && old_h1 == h => (color, old_h, h1) :: rest
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   164
                        case (Some(color), _) => (color, h, h1) :: colors
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   165
                        case (None, _) => colors
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   166
                      }
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   167
                    loop(l1, h1, p + (l1 - l) * H, q + (h1 - h) * L, colors1)
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   168
                  }
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   169
                  else colors.reverse
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   170
                }
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   171
                val new_colors = loop(0, 0, 0, 0, Nil)
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   172
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   173
                GUI_Thread.later {
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   174
                  current_overview = overview
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   175
                  current_colors = new_colors
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   176
                  repaint()
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   177
                }
62262
8bf765c9c2e5 separate delay_repaint to ensure reactivity, indepently of future_refresh status;
wenzelm
parents: 62092
diff changeset
   178
              }
8bf765c9c2e5 separate delay_repaint to ensure reactivity, indepently of future_refresh status;
wenzelm
parents: 62092
diff changeset
   179
            )
61195
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   180
          }
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   181
        }
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   182
      }
42419fe6f660 fast synchronous painting and asynchronous refresh of text overview, reduces GUI thread latency from 100ms to 1ms for big files like src/HOL/Multivariate_Analsyis/Integration.thy;
wenzelm
parents: 57613
diff changeset
   183
    }
46572
3074685ab7ed separate module for text status overview;
wenzelm
parents:
diff changeset
   184
}