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-- |
34342
b2781f2cd80a
LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff
changeset
|
1 |
/* |
34349 | 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 | 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 | 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 | 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 | 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 | 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 | 43 |
//automated scrolling, new message ind |
44 |
val infopanel = new JPanel |
|
45 |
val auto_scroll = new JRadioButton("Auto Scroll", false) |
|
34360 | 46 |
//indicates new messages with a new color, and shows number of messages in cache |
47 |
val message_ind = new JTextArea("0") |
|
48 |
infopanel.add(message_ind) |
|
34355 | 49 |
infopanel.add(auto_scroll) |
50 |
add (infopanel, BorderLayout.SOUTH) |
|
34342
b2781f2cd80a
LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff
changeset
|
51 |
|
34360 | 52 |
// DoubleBuffering for smoother updates |
53 |
this.setDoubleBuffered(true) |
|
54 |
message_view.setDoubleBuffered(true) |
|
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 | 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 | 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 | 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 | 114 |
if(message_view.getComponentCount >= 1){ |
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 | 118 |
{ |
119 |
message_offset -= message_view.getComponent(0).getHeight |
|
120 |
message_no -= 1 |
|
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 | 126 |
message_no += 1 |
127 |
val panel = set_message (message_no, 0) |
|
128 |
message_offset += panel.getHeight |
|
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 | 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 | 139 |
message_view.getComponents map (c => { |
140 |
val newrect = c.getBounds |
|
141 |
newrect.y = newrect.y + y |
|
142 |
c.setBounds(newrect) |
|
143 |
}) |
|
144 |
repaint() |
|
34355 | 145 |
} else { |
146 |
vscroll.setValue(message_no) |
|
34351 | 147 |
} |
148 |
} |
|
149 |
} |
|
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 | 164 |
//indicate new messages in a maximum frequency of 1/300 ms |
165 |
val message_ind_timer : Timer = new Timer(300, new ActionListener { |
|
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 | 168 |
//fire scroll-event if necessary and wanted |
169 |
if(message_no != message_buffer.size |
|
170 |
&& auto_scroll.isSelected) { |
|
171 |
vscroll.setValue(message_buffer.size - 1) |
|
172 |
} |
|
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 | 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 | 180 |
vscroll.setMaximum (Math.max(1, message_buffer.size)) |
181 |
message_ind.setBackground(java.awt.Color.red) |
|
182 |
message_ind.setText(message_buffer.size.toString) |
|
183 |
if (! message_ind_timer.isRunning()){ |
|
184 |
if(auto_scroll.isSelected) vscroll.setValue(message_buffer.size - 1) |
|
185 |
message_ind_timer.setRepeats(false) |
|
186 |
message_ind_timer.start() |
|
34351 | 187 |
} |
34342
b2781f2cd80a
LazyScroller: rendering messages only when needed
immler@in.tum.de
parents:
diff
changeset
|
188 |
} |
34351 | 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 | 193 |
if (e.getSource == vscroll){ |
194 |
message_no = e.getValue |
|
195 |
message_offset = 0 |
|
196 |
update_view |
|
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 | 208 |
// TODO: register somewhere |
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 | 212 |
if(state != null) new Thread{ |
213 |
override def run() { |
|
214 |
while (i < 500) { |
|
215 |
add_message(state.document) |
|
216 |
i += 1 |
|
217 |
try {Thread.sleep(3)} |
|
218 |
catch{case _ =>} |
|
219 |
} |
|
220 |
} |
|
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 |