001: /*--
002:
003: Copyright (C) 2000-2003 Anthony Eden.
004: All rights reserved.
005:
006: Redistribution and use in source and binary forms, with or without
007: modification, are permitted provided that the following conditions
008: are met:
009:
010: 1. Redistributions of source code must retain the above copyright
011: notice, this list of conditions, and the following disclaimer.
012:
013: 2. Redistributions in binary form must reproduce the above copyright
014: notice, this list of conditions, and the disclaimer that follows
015: these conditions in the documentation and/or other materials
016: provided with the distribution.
017:
018: 3. The name "EdenLib" must not be used to endorse or promote products
019: derived from this software without prior written permission. For
020: written permission, please contact me@anthonyeden.com.
021:
022: 4. Products derived from this software may not be called "EdenLib", nor
023: may "EdenLib" appear in their name, without prior written permission
024: from Anthony Eden (me@anthonyeden.com).
025:
026: In addition, I request (but do not require) that you include in the
027: end-user documentation provided with the redistribution and/or in the
028: software itself an acknowledgement equivalent to the following:
029: "This product includes software developed by
030: Anthony Eden (http://www.anthonyeden.com/)."
031:
032: THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
033: WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
034: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
035: DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT,
036: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
037: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
038: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
039: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
040: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
041: IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
042: POSSIBILITY OF SUCH DAMAGE.
043:
044: For more information on EdenLib, please see <http://edenlib.sf.net/>.
045:
046: */
047:
048: package com.anthonyeden.lib.io;
049:
050: import java.io.Writer;
051: import java.io.IOException;
052:
053: import javax.swing.JTextArea;
054:
055: /** A implementation of the java.io.Writer class which provides writing to a
056: JTextArea via a stream.
057:
058: <p><b>Note:</b> There appears to be bug in the Macintosh implementation of
059: the JDK 1.1 where a PrintWriter writing to this class will not include the
060: correct line feeds for display in a JTextArea. There is a simple test of
061: the "java.version" system property which, if it starts with the String "1.1"
062: will cause newlines to be written each time the buffer is flushed.</p>
063:
064: @author Anthony Eden
065: */
066:
067: public class JTextAreaWriter extends Writer {
068:
069: private boolean closed = false;
070: private JTextArea textArea;
071: private StringBuffer buffer;
072:
073: /** Constructor.
074:
075: @param textArea The JTextArea to write to.
076: */
077:
078: public JTextAreaWriter(JTextArea textArea) {
079: setTextArea(textArea);
080: }
081:
082: /** Set the JTextArea to write to.
083:
084: @param textArea The JTextArea
085: */
086:
087: public void setTextArea(JTextArea textArea) {
088: if (textArea == null) {
089: throw new IllegalArgumentException(
090: "The text area must not be null.");
091: }
092: this .textArea = textArea;
093: }
094:
095: /** Close the stream. */
096:
097: public void close() {
098: closed = true;
099: }
100:
101: /** Flush the data that is currently in the buffer.
102:
103: @throws IOException
104: */
105:
106: public void flush() throws IOException {
107: if (closed) {
108: throw new IOException("The stream is not open.");
109: }
110: // the newline character should not be necessary. The PrintWriter
111: // should autmatically put the newline, but it doesn't seem to work
112: textArea.append(getBuffer().toString());
113: if (System.getProperty("java.version").startsWith("1.1")) {
114: textArea.append("\n");
115: }
116: textArea.setCaretPosition(textArea.getDocument().getLength());
117: buffer = null;
118: }
119:
120: /** Write the given character array to the output stream.
121:
122: @param charArray The character array
123: @throws IOException
124: */
125:
126: public void write(char[] charArray) throws IOException {
127: write(charArray, 0, charArray.length);
128: }
129:
130: /** Write the given character array to the output stream beginning from
131: the given offset and proceeding to until the given length is reached.
132:
133: @param charArray The character array
134: @param offset The start offset
135: @param length The length to write
136: @throws IOException
137: */
138:
139: public void write(char[] charArray, int offset, int length)
140: throws IOException {
141: if (closed) {
142: throw new IOException("The stream is not open.");
143: }
144: getBuffer().append(charArray, offset, length);
145: }
146:
147: /** Write the given character to the output stream.
148:
149: @param c The character
150: @throws IOException
151: */
152:
153: public void write(int c) throws IOException {
154: if (closed) {
155: throw new IOException("The stream is not open.");
156: }
157: getBuffer().append((char) c);
158: }
159:
160: /** Write the given String to the output stream.
161:
162: @param string The String
163: @throws IOException
164: */
165:
166: public void write(String string) throws IOException {
167: if (closed) {
168: throw new IOException("The stream is not open.");
169: }
170: getBuffer().append(string);
171: }
172:
173: /** Write the given String to the output stream beginning from the given offset
174: and proceeding to until the given length is reached.
175:
176: @param string The String
177: @param offset The start offset
178: @param length The length to write
179: @throws IOException
180: */
181:
182: public void write(String string, int offset, int length)
183: throws IOException {
184: if (closed) {
185: throw new IOException("The stream is not open.");
186: }
187: getBuffer().append(string.substring(offset, length));
188: }
189:
190: // protected methods
191:
192: /** Get the StringBuffer which holds the data prior to writing via
193: a call to the <code>flush()</code> method. This method should
194: never return null.
195:
196: @return A StringBuffer
197: */
198:
199: protected StringBuffer getBuffer() {
200: if (buffer == null) {
201: buffer = new StringBuffer();
202: }
203: return buffer;
204: }
205:
206: }
|