/* * Copyright (C) 2004 The Concord Consortium, Inc., * 10 Concord Crossing, Concord, MA 01742 * * Web Site: http://www.concord.org * Email: info@concord.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * END LICENSE */ // // Class : TextOutputStream // // Copyright � 1998, The Concord Consortium // // Original Author: Edward Burke // // $Revision: 1.1 $ // $Date: 2011-02-18 13:39:30 $ // $Author: moll $ // package org.concord.swing.text; import java.io.IOException; import java.io.Reader; import javax.swing.JTextArea; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.AbstractDocument; import javax.swing.text.Document; public class TextReader extends Reader implements DocumentListener { protected JTextArea text; protected Document document; protected StringBuffer buffer; protected Thread inputWaitThread; private volatile boolean threadSuspended = false; public TextReader(JTextArea ta) { text = ta; document = text.getDocument(); buffer = new StringBuffer(""); } public void close() throws IOException { } public int read() throws IOException { char [] cbuf = new char[1]; read(cbuf); return (int) cbuf[0]; } public int read(char cbuf[]) throws IOException { return read(cbuf, 0, cbuf.length); } public int read(char cbuf[], int off, int len) throws IOException { document.addDocumentListener(this); try { synchronized(this) { threadSuspended = true; while (threadSuspended) wait(); } } catch (InterruptedException e) { } buffer.getChars(0, len, cbuf, off); buffer = new StringBuffer(buffer.toString().substring(len)); document.removeDocumentListener(this); return len; } public boolean ready() throws IOException { return buffer.length() > 0; } public int available() throws IOException { return buffer.length(); } public void changedUpdate(DocumentEvent docEvent) { handleDocEvent(docEvent); } public void insertUpdate(DocumentEvent docEvent) { handleDocEvent(docEvent); } public void removeUpdate(DocumentEvent docEvent) { handleDocEvent(docEvent); } public void handleDocEvent(DocumentEvent docEvent) { AbstractDocument doc = (AbstractDocument) docEvent.getDocument(); int len = docEvent.getLength(); int i = docEvent.getOffset(); DocumentEvent.EventType det = docEvent.getType(); try { String currentText = doc.getText(0, doc.getLength()); int n = currentText.length(); currentText = currentText.substring(n - 1, n); buffer.append(currentText); synchronized (this) { threadSuspended = false; notify(); } } catch (Exception e) { throw new RuntimeException("handleDOcEvent: " + e.toString()); } } }