content: /*
   *    This program is free software; you can redistribute it and/or modify
   *    it under the terms of the GNU General Public License as published by
   *    the Free Software Foundation; either version 2 of the License, or
   *    (at your option) any later version.
   *
   *    This program is distributed in the hope that it will be useful,
   *    but WITHOUT ANY WARRANTY; without even the implied warranty of
   *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   *    GNU General Public License for more details.
   *
   *    You should have received a copy of the GNU General Public License
   *    along with this program; if not, write to the Free Software
   *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   */
  
  /*
   * ReaderToTextArea.java
   * Copyright (C) 2009 University of Waikato, Hamilton, New Zealand
   */
  
  package weka.gui;
  
  import java.awt.Color;
  import java.io.LineNumberReader;
  import java.io.Reader;
  
  import javax.swing.JTextPane;
  import javax.swing.text.Style;
  import javax.swing.text.StyleConstants;
  import javax.swing.text.StyleContext;
  import javax.swing.text.StyledDocument;
  
  /**
   * A class that sends all lines from a reader to a JTextPane component.
   * 
   * @author Len Trigg (trigg@cs.waikato.ac.nz)
   * @author FracPete (fracpete at waikato dot ac dot nz)
   * @version $Revision: 5142 $
   */
  public class ReaderToTextPane
    extends Thread {
  
    /** The reader being monitored. */
    protected LineNumberReader m_Input;
  
    /** The output text component. */
    protected JTextPane m_Output;
    
    /** the color to use. */
    protected Color m_Color;
  
    /**
     * Sets up the thread. Using black as color for displaying the text.
     *
     * @param input 	the Reader to monitor
     * @param output 	the TextArea to send output to
     */
    public ReaderToTextPane(Reader input, JTextPane output) {
      this(input, output, Color.BLACK);
    }
  
    /**
     * Sets up the thread.
     *
     * @param input 	the Reader to monitor
     * @param output 	the TextArea to send output to
     * @param color	the color to use
     */
    public ReaderToTextPane(Reader input, JTextPane output, Color color) {
      StyledDocument      doc;
      Style               style;
  
      setDaemon(true);
      
      m_Color  = color;
      m_Input  = new LineNumberReader(input);
      m_Output = output;
      
      doc   = m_Output.getStyledDocument();
      style = StyleContext.getDefaultStyleContext()
                          .getStyle(StyleContext.DEFAULT_STYLE);
      style = doc.addStyle(getStyleName(), style);
      StyleConstants.setFontFamily(style, "monospaced");
      StyleConstants.setForeground(style, m_Color);
    }
    
    /**
     * Returns the color in use.
     * 
     * @return		the color
     */
    public Color getColor() {
      return m_Color;
    }
    
    /**
     * Returns the style name.
     * 
     * @return		the style name
     */
    protected String getStyleName() {
      return "" + m_Color.hashCode();
    }
  
    /**
     * Sit here listening for lines of input and appending them straight
     * to the text component.
     */
    public void run() {
      while (true) {
        try {
  	StyledDocument doc = m_Output.getStyledDocument();
  	doc.insertString(
  	    doc.getLength(), 
  	    m_Input.readLine() + '\n', 
  	    doc.getStyle(getStyleName()));
  	m_Output.setCaretPosition(doc.getLength());
        }
        catch (Exception ex) {
  	try {
  	  sleep(100);
  	}
  	catch (Exception e) {
  	  // ignored
  	}
        }
      }
    }
  }
  