src/Tools/jEdit/src/jedit/ScrollerDockable.scala
changeset 34360 b7af69a030a1
parent 34359 e4ca265c9c8b
child 34361 3e7568e833d9
equal deleted inserted replaced
34359:e4ca265c9c8b 34360:b7af69a030a1
    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