41 add (message_view, BorderLayout.CENTER) |
41 add (message_view, BorderLayout.CENTER) |
42 addComponentListener(this) |
42 addComponentListener(this) |
43 //automated scrolling, new message ind |
43 //automated scrolling, new message ind |
44 val infopanel = new JPanel |
44 val infopanel = new JPanel |
45 val auto_scroll = new JRadioButton("Auto Scroll", false) |
45 val auto_scroll = new JRadioButton("Auto Scroll", false) |
46 val new_message_ind = new JTextArea("0") |
46 //indicates new messages with a new color, and shows number of messages in cache |
47 infopanel.add(new_message_ind) |
47 val message_ind = new JTextArea("0") |
|
48 infopanel.add(message_ind) |
48 infopanel.add(auto_scroll) |
49 infopanel.add(auto_scroll) |
49 add (infopanel, BorderLayout.SOUTH) |
50 add (infopanel, BorderLayout.SOUTH) |
|
51 |
|
52 // DoubleBuffering for smoother updates |
|
53 this.setDoubleBuffered(true) |
|
54 message_view.setDoubleBuffered(true) |
50 |
55 |
51 //Render a message to a Panel |
56 //Render a message to a Panel |
52 def render (message: Document): XHTMLPanel = { |
57 def render (message: Document): XHTMLPanel = { |
53 val panel = new XHTMLPanel(new UserAgent()) |
58 val panel = new XHTMLPanel(new UserAgent()) |
54 |
59 panel.setFontScalingFactor(.5f) |
55 val fontResolver = |
60 val fontResolver = |
56 panel.getSharedContext.getFontResolver.asInstanceOf[AWTFontResolver] |
61 panel.getSharedContext.getFontResolver.asInstanceOf[AWTFontResolver] |
57 if (Plugin.plugin.viewFont != null) |
62 if (Plugin.plugin.viewFont != null) |
58 fontResolver.setFontMapping("Isabelle", Plugin.plugin.viewFont) |
63 fontResolver.setFontMapping("Isabelle", Plugin.plugin.viewFont) |
59 |
64 |
155 n = n - 1 |
160 n = n - 1 |
156 } |
161 } |
157 repaint() |
162 repaint() |
158 } |
163 } |
159 |
164 |
160 val scroll_delay_timer : Timer = new Timer(300, new ActionListener { |
165 //indicate new messages in a maximum frequency of 1/300 ms |
|
166 val message_ind_timer : Timer = new Timer(300, new ActionListener { |
|
167 // this method is called to indicate a new message |
161 override def actionPerformed(e:ActionEvent){ |
168 override def actionPerformed(e:ActionEvent){ |
162 //fire scroll-event => updating is done by scroll-event-handling |
169 //fire scroll-event if necessary and wanted |
163 if(message_no != message_buffer.size) vscroll.setValue(message_buffer.size - 1) |
170 if(message_no != message_buffer.size |
164 scroll_delay_timer.stop |
171 && auto_scroll.isSelected) { |
|
172 vscroll.setValue(message_buffer.size - 1) |
|
173 } |
|
174 message_ind.setBackground(java.awt.Color.white) |
165 } |
175 } |
166 }) |
176 }) |
|
177 |
167 |
178 |
168 def add_message (message: Document) = { |
179 def add_message (message: Document) = { |
169 message_buffer += message |
180 message_buffer += message |
170 vscroll.setMaximum (Math.max(1, message_buffer.length)) |
181 vscroll.setMaximum (Math.max(1, message_buffer.size)) |
171 if(message_no == -1 || auto_scroll.isSelected){ |
182 message_ind.setBackground(java.awt.Color.red) |
172 if (! scroll_delay_timer.isRunning()){ |
183 message_ind.setText(message_buffer.size.toString) |
173 vscroll.setValue(message_buffer.size - 1) |
184 if (! message_ind_timer.isRunning()){ |
174 scroll_delay_timer.start() |
185 if(auto_scroll.isSelected) vscroll.setValue(message_buffer.size - 1) |
175 } |
186 message_ind_timer.setRepeats(false) |
|
187 message_ind_timer.start() |
176 } |
188 } |
177 } |
189 } |
178 |
190 |
179 override def adjustmentValueChanged (e : AdjustmentEvent) = { |
191 override def adjustmentValueChanged (e : AdjustmentEvent) = { |
180 //event-handling has to be so general (without UNIT_INCR,...) |
192 //event-handling has to be so general (without UNIT_INCR,...) |
192 override def componentMoved(e: ComponentEvent){} |
204 override def componentMoved(e: ComponentEvent){} |
193 override def componentResized(e: ComponentEvent){ |
205 override def componentResized(e: ComponentEvent){ |
194 update_view |
206 update_view |
195 } |
207 } |
196 |
208 |
197 //register somewhere |
209 // TODO: register somewhere |
198 // TODO: only testing atm |
210 // here only 'emulation of message stream' |
199 Plugin.plugin.stateUpdate.add(state => { |
211 Plugin.plugin.stateUpdate.add(state => { |
200 var i = 0 |
212 var i = 0 |
201 if(state != null) while (i < 500) { |
213 if(state != null) new Thread{ |
202 add_message(state.document) |
214 override def run() { |
203 i += 1 |
215 while (i < 500) { |
204 } |
216 add_message(state.document) |
|
217 i += 1 |
|
218 try {Thread.sleep(3)} |
|
219 catch{case _ =>} |
|
220 } |
|
221 } |
|
222 }.start |
205 }) |
223 }) |
206 } |
224 } |
207 |
225 |
208 |
226 |