src/Tools/jEdit/src/jedit/ScrollerDockable.scala
author immler@in.tum.de
Sun, 02 Nov 2008 14:32:18 +0100
changeset 34349 1714aeef8388
parent 34348 abea94120f4b
child 34350 aa4f35a305fa
permissions -rw-r--r--
renamed class
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
     1
/*
34349
1714aeef8388 renamed class
immler@in.tum.de
parents: 34348
diff changeset
     2
 * ScrollerDockable.scala
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
     3
 *
34346
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
     4
 * TODO: clearer seperation of tasks: layout message_view, layout panel (with preferredsize), repaint, relayout, ...
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
     5
 * + relayout on ValueIsAdjusting while scrolling
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
     6
 * + scrolling *one* panel 
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
     7
 */
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
     8
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
     9
package isabelle.jedit
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    10
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    11
import java.io.{ ByteArrayInputStream, FileInputStream, InputStream }
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    12
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    13
import scala.collection.mutable.ArrayBuffer
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    14
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    15
import java.awt.{ BorderLayout, GridLayout, Adjustable, Rectangle, Scrollbar }
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    16
import java.awt.image.BufferedImage
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    17
import java.awt.event.{ AdjustmentListener, AdjustmentEvent, ComponentListener, ComponentEvent }
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    18
import javax.swing.{ JScrollBar, JPanel, JScrollPane, ScrollPaneConstants }
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    19
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    20
import isabelle.IsabelleSystem.getenv
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    21
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    22
import org.xml.sax.InputSource;
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    23
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    24
import org.w3c.dom.Document
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    25
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    26
import org.xhtmlrenderer.simple.XHTMLPanel
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    27
import org.xhtmlrenderer.context.AWTFontResolver
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    28
import org.xhtmlrenderer.swing.NaiveUserAgent
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    29
import org.xhtmlrenderer.resource.CSSResource
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    30
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    31
import org.gjt.sp.jedit.View
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    32
34349
1714aeef8388 renamed class
immler@in.tum.de
parents: 34348
diff changeset
    33
object ScrollerDockable {
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    34
  val baseURL = "file://localhost" + getenv("ISABELLE_HOME") + "/lib/html/"
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    35
  val userStylesheet = 
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    36
    "file://localhost" + getenv("ISABELLE_HOME_USER") + "/etc/user.css";
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    37
  val stylesheet = """
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    38
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    39
@import "isabelle.css";
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    40
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    41
@import '""" + userStylesheet + """';
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    42
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    43
messages, message {
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    44
  display: block;
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    45
  white-space: pre-wrap;
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    46
  font-family: Isabelle;
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    47
}
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    48
"""
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    49
}
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    50
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    51
34349
1714aeef8388 renamed class
immler@in.tum.de
parents: 34348
diff changeset
    52
class ScrollerDockable(view : View, position : String) extends JPanel with AdjustmentListener with ComponentListener {
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    53
  //holding the unrendered messages
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    54
  val message_buffer = new ArrayBuffer[Document]()
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    55
  //rendered messages
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    56
  var message_cache = Map[Int, XHTMLPanel]()
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    57
  // defining the current view
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    58
  val scrollunit = 10 
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    59
  var message_offset = 0 //how many pixels of the lowest message are hidden
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    60
  var message_no = -1  //index of the lowest message
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    61
  // absolute positioning for messages
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    62
  val message_view = new JPanel
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    63
  message_view.setLayout(null)
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    64
  // setting up view
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    65
  setLayout(new BorderLayout())
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    66
  val vscroll = new JScrollBar(Adjustable.VERTICAL, 0, 1, 0, 1)
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    67
  vscroll.addAdjustmentListener(this)
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    68
  add (vscroll, BorderLayout.EAST)
34343
4a3bdb561d11 correct resizing of xhtml-panels
immler@in.tum.de
parents: 34342
diff changeset
    69
  add (message_view, BorderLayout.CENTER)
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    70
  addComponentListener(this)
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    71
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    72
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    73
  //Render a message to a Panel
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    74
  def render (message: Document): XHTMLPanel = {
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    75
    val panel = new XHTMLPanel(new UserAgent())
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    76
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    77
    val fontResolver =
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    78
      panel.getSharedContext.getFontResolver.asInstanceOf[AWTFontResolver]
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    79
    if (Plugin.plugin.viewFont != null)
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    80
      fontResolver.setFontMapping("Isabelle", Plugin.plugin.viewFont)
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    81
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    82
    Plugin.plugin.viewFontChanged.add(font => {
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    83
      if (Plugin.plugin.viewFont != null)
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    84
        fontResolver.setFontMapping("Isabelle", Plugin.plugin.viewFont)
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    85
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    86
      panel.relayout()
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    87
    })
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    88
34349
1714aeef8388 renamed class
immler@in.tum.de
parents: 34348
diff changeset
    89
    panel.setDocument(message, ScrollerDockable.baseURL)
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    90
    panel
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    91
  }
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    92
  
34346
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
    93
  //calculates preferred size of panel
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
    94
  def calculate_preferred_size(panel: XHTMLPanel){
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    95
    message_view.add (panel)
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    96
    panel.setBounds (0, 0, message_view.getWidth, 1) // document has to fit into width
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    97
    panel.doLayout (panel.getGraphics) //lay out, preferred size is set then
34346
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
    98
  }
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
    99
  
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
   100
  //add panel to the cache
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
   101
  def add_to_cache (message_no: Int, panel: XHTMLPanel) = {
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
   102
    message_cache = message_cache.update (message_no, panel)
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
   103
    calculate_preferred_size(panel)
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   104
    System.err.println("Added " + message_no + " with preferred Size " + panel.getPreferredSize + " to cache")
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   105
  }
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   106
  
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   107
  //render and load a message into cache, place its bottom at y-coordinate;
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   108
  def set_message (message_no: Int, y: Int) = {
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   109
    //get or add panel from/to cache
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   110
    if(!message_cache.isDefinedAt(message_no)){
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   111
      add_to_cache (message_no, render (message_buffer(message_no)))
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   112
    }
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   113
    val panel = message_cache.get(message_no).get
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   114
    val width = panel.getPreferredSize.getWidth.toInt
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   115
    val height = panel.getPreferredSize.getHeight.toInt
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   116
    panel.setBounds(0, y - height, width, height)
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   117
    message_view.add(panel)
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   118
    panel
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   119
  }
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   120
  
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
   121
  def update_view = {
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
   122
    message_view.removeAll()
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   123
    var n = message_no
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   124
    var y:Int = message_view.getHeight + message_offset
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   125
    while (y >= 0 && n >= 0){
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   126
      val panel = set_message (n, y)
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   127
      y = y - panel.getHeight
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   128
      n = n - 1
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   129
    }
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   130
    repaint()
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
   131
  }
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
   132
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   133
  def add_message (message: Document) = {
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
   134
    message_buffer += message
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   135
    vscroll.setMaximum (Math.max(1, message_buffer.length))
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
   136
  }
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
   137
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
   138
  override def adjustmentValueChanged (e : AdjustmentEvent) = {
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   139
    //event-handling has to be so general (without UNIT_INCR,...)
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   140
    // because all events could be sent as TRACK e.g. on my mac
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   141
    message_no = e.getValue
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   142
    update_view
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   143
  }
34346
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
   144
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
   145
  // handle Component-Events
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
   146
  override def componentShown(e: ComponentEvent){}
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   147
  override def componentHidden(e: ComponentEvent){}
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   148
  override def componentMoved(e: ComponentEvent){}
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   149
  override def componentResized(e: ComponentEvent){
34346
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
   150
    // remove all hidden messages from cache
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
   151
    // TODO: move to unlayouted cache
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
   152
    message_cache = message_cache filter ( pair => pair match {case (no, _) =>
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
   153
      no <= message_no && no >= message_no - message_view.getComponents.length})
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
   154
    //calculate preferred size for each panel
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
   155
    message_cache foreach (pair => pair match { case (_, pa) =>
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
   156
      calculate_preferred_size (pa)
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
   157
    })
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   158
    update_view
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   159
  }
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   160
  
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   161
  //register somewhere
34346
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
   162
  // TODO: only testing atm
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   163
  Plugin.plugin.stateUpdate.add(state => {
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   164
    var i = 0
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   165
    if(state != null) while (i < 500) {
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   166
      add_message(state.document)
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   167
      i += 1
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
   168
    }
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   169
  })
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   170
}
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
   171
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
   172