src/Tools/jEdit/src/jedit/ScrollerDockable.scala
author immler@in.tum.de
Mon, 10 Nov 2008 19:31:27 +0100
changeset 34361 3e7568e833d9
parent 34360 b7af69a030a1
child 34365 5691af1d34cd
permissions -rw-r--r--
selecting text of state view
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 scala.collection.mutable.ArrayBuffer
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    12
34359
e4ca265c9c8b removed imports
immler@in.tum.de
parents: 34358
diff changeset
    13
import java.awt.{ BorderLayout, Adjustable }
34357
61674cd653f9 scroll to first message immediately; potential later messages periodically
immler@in.tum.de
parents: 34356
diff changeset
    14
import java.awt.event.{ ActionListener, ActionEvent, AdjustmentListener, AdjustmentEvent, ComponentListener, ComponentEvent }
34359
e4ca265c9c8b removed imports
immler@in.tum.de
parents: 34358
diff changeset
    15
import javax.swing.{ JPanel, JRadioButton, JScrollBar, JTextArea, Timer }
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    16
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    17
import org.w3c.dom.Document
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    18
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    19
import org.xhtmlrenderer.simple.XHTMLPanel
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    20
import org.xhtmlrenderer.context.AWTFontResolver
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.gjt.sp.jedit.View
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    23
34349
1714aeef8388 renamed class
immler@in.tum.de
parents: 34348
diff changeset
    24
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
    25
  //holding the unrendered messages
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    26
  val message_buffer = new ArrayBuffer[Document]()
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    27
  //rendered messages
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    28
  var message_cache = Map[Int, XHTMLPanel]()
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    29
  // defining the current view
34355
3ae10f5d40aa prepared for automatic scrolling
immler@in.tum.de
parents: 34354
diff changeset
    30
  val scrollunit = 1
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    31
  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
    32
  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
    33
  // absolute positioning for messages
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    34
  val message_view = new JPanel
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    35
  message_view.setLayout(null)
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    36
  // setting up view
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    37
  setLayout(new BorderLayout())
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    38
  val vscroll = new JScrollBar(Adjustable.VERTICAL, 0, 1, 0, 1)
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    39
  vscroll.addAdjustmentListener(this)
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    40
  add (vscroll, BorderLayout.EAST)
34343
4a3bdb561d11 correct resizing of xhtml-panels
immler@in.tum.de
parents: 34342
diff changeset
    41
  add (message_view, BorderLayout.CENTER)
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    42
  addComponentListener(this)
34355
3ae10f5d40aa prepared for automatic scrolling
immler@in.tum.de
parents: 34354
diff changeset
    43
  //automated scrolling, new message ind
3ae10f5d40aa prepared for automatic scrolling
immler@in.tum.de
parents: 34354
diff changeset
    44
  val infopanel = new JPanel
3ae10f5d40aa prepared for automatic scrolling
immler@in.tum.de
parents: 34354
diff changeset
    45
  val auto_scroll = new JRadioButton("Auto Scroll", false)
34360
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
    46
  //indicates new messages with a new color, and shows number of messages in cache
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
    47
  val message_ind = new JTextArea("0")
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
    48
  infopanel.add(message_ind)
34355
3ae10f5d40aa prepared for automatic scrolling
immler@in.tum.de
parents: 34354
diff changeset
    49
  infopanel.add(auto_scroll)
3ae10f5d40aa prepared for automatic scrolling
immler@in.tum.de
parents: 34354
diff changeset
    50
  add (infopanel, BorderLayout.SOUTH)
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    51
34360
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
    52
  // DoubleBuffering for smoother updates
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
    53
  this.setDoubleBuffered(true)
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
    54
  message_view.setDoubleBuffered(true)
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
    55
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    56
  //Render a message to a Panel
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    57
  def render (message: Document): XHTMLPanel = {
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    58
    val panel = new XHTMLPanel(new UserAgent())
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    59
    val fontResolver =
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    60
      panel.getSharedContext.getFontResolver.asInstanceOf[AWTFontResolver]
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    61
    if (Plugin.plugin.viewFont != null)
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    62
      fontResolver.setFontMapping("Isabelle", Plugin.plugin.viewFont)
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    63
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    64
    Plugin.plugin.viewFontChanged.add(font => {
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    65
      if (Plugin.plugin.viewFont != null)
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    66
        fontResolver.setFontMapping("Isabelle", Plugin.plugin.viewFont)
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    67
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    68
      panel.relayout()
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    69
    })
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
    70
34353
aa0d2f0bde83 UserAgent as seperate class, moved stylesheets, baseURL to UserAgent
immler@in.tum.de
parents: 34351
diff changeset
    71
    panel.setDocument(message, UserAgent.baseURL)
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    72
    panel
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    73
  }
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    74
  
34354
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
    75
  // panel has to be displayable in container message_view for doLayout to have
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
    76
  // an effect, especially returning correct preferredSize
34346
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
    77
  def calculate_preferred_size(panel: XHTMLPanel){
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    78
    message_view.add (panel)
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    79
    panel.setBounds (0, 0, message_view.getWidth, 1) // document has to fit into width
34361
3e7568e833d9 selecting text of state view
immler@in.tum.de
parents: 34360
diff changeset
    80
    panel.doDocumentLayout (panel.getGraphics) //lay out, preferred size is set then
34358
57a8536d09d3 minimum height for panels, immediate scrolling and correct waiting
immler@in.tum.de
parents: 34357
diff changeset
    81
    // if there are thousands of empty panels, all have to be rendered -
57a8536d09d3 minimum height for panels, immediate scrolling and correct waiting
immler@in.tum.de
parents: 34357
diff changeset
    82
    // but this takes time (even for empty panels); therefore minimum size
57a8536d09d3 minimum height for panels, immediate scrolling and correct waiting
immler@in.tum.de
parents: 34357
diff changeset
    83
    panel.setPreferredSize(new java.awt.Dimension(message_view.getWidth,Math.max(50, panel.getPreferredSize.getHeight.toInt)))
34346
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
    84
  }
34351
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
    85
   
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    86
  //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
    87
  def set_message (message_no: Int, y: Int) = {
34354
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
    88
    //add panel to cache if necessary and possible
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
    89
    if(!message_cache.isDefinedAt(message_no) && message_buffer.isDefinedAt(message_no)){
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
    90
      message_cache = message_cache.update (message_no, render (message_buffer(message_no)))
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
    91
    }
34353
aa0d2f0bde83 UserAgent as seperate class, moved stylesheets, baseURL to UserAgent
immler@in.tum.de
parents: 34351
diff changeset
    92
    val result = message_cache.get(message_no) match {
aa0d2f0bde83 UserAgent as seperate class, moved stylesheets, baseURL to UserAgent
immler@in.tum.de
parents: 34351
diff changeset
    93
      case Some(panel) => {
34354
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
    94
        // recalculate preferred size after resizing the message_view
34353
aa0d2f0bde83 UserAgent as seperate class, moved stylesheets, baseURL to UserAgent
immler@in.tum.de
parents: 34351
diff changeset
    95
        if(panel.getPreferredSize.getWidth.toInt != message_view.getWidth)
aa0d2f0bde83 UserAgent as seperate class, moved stylesheets, baseURL to UserAgent
immler@in.tum.de
parents: 34351
diff changeset
    96
          calculate_preferred_size (panel)
aa0d2f0bde83 UserAgent as seperate class, moved stylesheets, baseURL to UserAgent
immler@in.tum.de
parents: 34351
diff changeset
    97
        //place message on view
aa0d2f0bde83 UserAgent as seperate class, moved stylesheets, baseURL to UserAgent
immler@in.tum.de
parents: 34351
diff changeset
    98
        val width = panel.getPreferredSize.getWidth.toInt
aa0d2f0bde83 UserAgent as seperate class, moved stylesheets, baseURL to UserAgent
immler@in.tum.de
parents: 34351
diff changeset
    99
        val height = panel.getPreferredSize.getHeight.toInt
aa0d2f0bde83 UserAgent as seperate class, moved stylesheets, baseURL to UserAgent
immler@in.tum.de
parents: 34351
diff changeset
   100
        panel.setBounds(0, y - height, width, height)
aa0d2f0bde83 UserAgent as seperate class, moved stylesheets, baseURL to UserAgent
immler@in.tum.de
parents: 34351
diff changeset
   101
        message_view.add(panel)
aa0d2f0bde83 UserAgent as seperate class, moved stylesheets, baseURL to UserAgent
immler@in.tum.de
parents: 34351
diff changeset
   102
        panel
aa0d2f0bde83 UserAgent as seperate class, moved stylesheets, baseURL to UserAgent
immler@in.tum.de
parents: 34351
diff changeset
   103
      }
aa0d2f0bde83 UserAgent as seperate class, moved stylesheets, baseURL to UserAgent
immler@in.tum.de
parents: 34351
diff changeset
   104
      case None => null
aa0d2f0bde83 UserAgent as seperate class, moved stylesheets, baseURL to UserAgent
immler@in.tum.de
parents: 34351
diff changeset
   105
    }
aa0d2f0bde83 UserAgent as seperate class, moved stylesheets, baseURL to UserAgent
immler@in.tum.de
parents: 34351
diff changeset
   106
    result
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   107
  }
34354
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
   108
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
   109
  //move view a given amount of pixels
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
   110
  // attention: y should be small, because messages are rendered incremental
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
   111
  // (no knowledge on height of messages)
34351
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   112
  def move_view (y : Int) = {
34354
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
   113
    var update = false
34351
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   114
    if(message_view.getComponentCount >= 1){
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   115
      message_offset += y
34354
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
   116
      //remove bottommost panels
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
   117
      while (message_offset >= message_view.getComponent(0).getHeight)
34351
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   118
      {
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   119
        message_offset -= message_view.getComponent(0).getHeight
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   120
        message_no -= 1
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   121
        update_view
34354
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
   122
        update = true
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
   123
      }
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
   124
      //insert panels at the bottom
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
   125
      while (message_offset < 0) {
34351
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   126
        message_no += 1
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   127
        val panel = set_message (message_no, 0)
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   128
        message_offset += panel.getHeight
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   129
        update_view
34354
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
   130
        update = true
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
   131
     }
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
   132
      //insert panel at the top
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
   133
      if (message_view.getComponent(message_view.getComponentCount - 1).getY + y > 0){
34351
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   134
        update_view
34354
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
   135
        update = true
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
   136
      }
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
   137
      //simply move panels
110f5f6902dc cleaned up a bit, scrolling arbitrary heights (incremental rendering)
immler@in.tum.de
parents: 34353
diff changeset
   138
      if(!update){
34351
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   139
        message_view.getComponents map (c => {
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   140
            val newrect = c.getBounds
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   141
            newrect.y = newrect.y + y
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   142
            c.setBounds(newrect)
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   143
          })
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   144
        repaint()
34355
3ae10f5d40aa prepared for automatic scrolling
immler@in.tum.de
parents: 34354
diff changeset
   145
      } else {
3ae10f5d40aa prepared for automatic scrolling
immler@in.tum.de
parents: 34354
diff changeset
   146
        vscroll.setValue(message_no)
34351
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   147
      }
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   148
    }
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   149
  }
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   150
  
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
   151
  def update_view = {
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
   152
    message_view.removeAll()
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   153
    var n = message_no
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   154
    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
   155
    while (y >= 0 && n >= 0){
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   156
      val panel = set_message (n, y)
34358
57a8536d09d3 minimum height for panels, immediate scrolling and correct waiting
immler@in.tum.de
parents: 34357
diff changeset
   157
      panel.setBorder(javax.swing.border.LineBorder.createBlackLineBorder)
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   158
      y = y - panel.getHeight
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   159
      n = n - 1
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
    repaint()
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
   162
  }
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
   163
34360
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   164
  //indicate new messages in a maximum frequency of 1/300 ms
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   165
  val message_ind_timer : Timer = new Timer(300, new ActionListener {
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   166
      // this method is called to indicate a new message
34357
61674cd653f9 scroll to first message immediately; potential later messages periodically
immler@in.tum.de
parents: 34356
diff changeset
   167
      override def actionPerformed(e:ActionEvent){
34360
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   168
        //fire scroll-event if necessary and wanted
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   169
        if(message_no != message_buffer.size
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   170
          && auto_scroll.isSelected) {
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   171
          vscroll.setValue(message_buffer.size - 1)
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   172
        }
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   173
        message_ind.setBackground(java.awt.Color.white)
34357
61674cd653f9 scroll to first message immediately; potential later messages periodically
immler@in.tum.de
parents: 34356
diff changeset
   174
      }
61674cd653f9 scroll to first message immediately; potential later messages periodically
immler@in.tum.de
parents: 34356
diff changeset
   175
    })
61674cd653f9 scroll to first message immediately; potential later messages periodically
immler@in.tum.de
parents: 34356
diff changeset
   176
34360
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   177
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   178
  def add_message (message: Document) = {
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
   179
    message_buffer += message
34360
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   180
    vscroll.setMaximum (Math.max(1, message_buffer.size))
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   181
    message_ind.setBackground(java.awt.Color.red)
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   182
    message_ind.setText(message_buffer.size.toString)
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   183
    if (! message_ind_timer.isRunning()){
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   184
      if(auto_scroll.isSelected) vscroll.setValue(message_buffer.size - 1)
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   185
      message_ind_timer.setRepeats(false)
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   186
      message_ind_timer.start()
34351
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   187
    }
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
   188
  }
34351
1c919f65c296 fine scrolling principally possible
immler@in.tum.de
parents: 34350
diff changeset
   189
  
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
   190
  override def adjustmentValueChanged (e : AdjustmentEvent) = {
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   191
    //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
   192
    // because all events could be sent as TRACK e.g. on my mac
34355
3ae10f5d40aa prepared for automatic scrolling
immler@in.tum.de
parents: 34354
diff changeset
   193
    if (e.getSource == vscroll){
3ae10f5d40aa prepared for automatic scrolling
immler@in.tum.de
parents: 34354
diff changeset
   194
        message_no = e.getValue
3ae10f5d40aa prepared for automatic scrolling
immler@in.tum.de
parents: 34354
diff changeset
   195
        message_offset = 0
3ae10f5d40aa prepared for automatic scrolling
immler@in.tum.de
parents: 34354
diff changeset
   196
        update_view
3ae10f5d40aa prepared for automatic scrolling
immler@in.tum.de
parents: 34354
diff changeset
   197
    }
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   198
  }
34346
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
   199
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
   200
  // handle Component-Events
634024f57c18 faster resizing, unlimited caching(but cache is cleared on resize)
immler@in.tum.de
parents: 34344
diff changeset
   201
  override def componentShown(e: ComponentEvent){}
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   202
  override def componentHidden(e: ComponentEvent){}
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   203
  override def componentMoved(e: ComponentEvent){}
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   204
  override def componentResized(e: ComponentEvent){
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   205
    update_view
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   206
  }
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   207
  
34360
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   208
  // TODO: register somewhere
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   209
  // here only 'emulation of message stream'
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   210
  Plugin.plugin.stateUpdate.add(state => {
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   211
    var i = 0
34360
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   212
    if(state != null) new Thread{
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   213
      override def run() {
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   214
        while (i < 500) {
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   215
          add_message(state.document)
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   216
          i += 1
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   217
          try {Thread.sleep(3)}
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   218
          catch{case _ =>}
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   219
        }
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   220
      }
b7af69a030a1 worked over autoscrolling
immler@in.tum.de
parents: 34359
diff changeset
   221
    }.start
34344
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   222
  })
3775958051c5 absolute positioning according to preferred size of panels,
immler@in.tum.de
parents: 34343
diff changeset
   223
}
34342
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
   224
b2781f2cd80a LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff changeset
   225