Source code: com/diaam/lgpl/ts/SwingTextDocumentWriter.java
1 /*
2 * $Log: SwingTextDocumentWriter.java,v $
3 * Revision 1.1 2000/11/10 15:31:30 vonarnim
4 * - deplacement (et nouvelle version) de TerminalStandard dans ctulu
5 *
6 * Revision 1.1 1999/11/04 20:03:33 Herve_AGNOUX
7 * Initial revision
8 *
9 */
10 /*
11 -- TerminalStandard v111999--
12
13 Fichier : SwingTextDocumentWriter.java
14 Décembre 1998
15 Auteur : Hervé AGNOUX, hagnoux@mail.club-internet.fr
16 License LGPL.
17 */
18 package com.diaam.lgpl.ts;
19
20 import java.awt.BorderLayout;
21 import java.awt.Dimension;
22 import java.io.IOException;
23 import java.io.OutputStream;
24 import java.io.Writer;
25 import java.util.Vector;
26
27 import javax.swing.*;
28 import javax.swing.text.*;
29
30 /**
31 * <code>SwingTextDocumentWriter</code> est un writer pour écrire dans
32 * un document swing.<p>
33 * Quelles sont les modifs par rapport à la précédente version ? L'ajout
34 * de la méthode "asStream", et l'ajout de la gestion des attributs.
35 * <p>Cette classe est en diffusion LGPL, et elle est téléchargeable à
36 * <a href="http://perso.club-internet.fr/hagnoux/java/TerminalStandard">
37 * http://perso.club-internet.fr/hagnoux/java/TerminalStandard</a>.<br>
38 * @author <a href="h_agnoux.html">Hervé AGNOUX</a>,
39 * hagnoux@mail.club-internet.fr
40 * @version 1.1 février 1999.
41 */
42 public class SwingTextDocumentWriter extends java.io.Writer
43 {
44 private Document monDocument;
45 private boolean ouvert = true;
46 private int lOffsetAtteint;
47 private AttributeSet mesAttributs;
48 private Vector buffer;
49 private Writer log;
50
51 /**
52 * Le constructeur enregistre le document dans lequel écrire, et
53 * initialise l'offset pour repérer la fin du dernier write, et initialise
54 * les attributs des caractères pour repérer ceux qui sont passés par
55 * son entremise.
56 * @param doc le document swing.
57 */
58 public SwingTextDocumentWriter(Document doc, Writer _log)
59 {
60 log=_log;
61 SimpleAttributeSet sas;
62
63 sas = new SimpleAttributeSet();
64 sas.addAttribute(this, "encore mieux !");
65 mesAttributs = sas;
66 monDocument = doc;
67 lOffsetAtteint = monDocument.getLength();
68 buffer = new Vector();
69 }
70
71 public SwingTextDocumentWriter(Document doc)
72 {
73 this(doc, null);
74 }
75
76 /**
77 * Pas grand chose à dire. A chaque <code>write</code>, l'instance
78 * mémorise l'offset du dernier caractère écrit, qui sera renvoyé par
79 * <code>offsetAtteint</code>.
80 * @param cbuf Tableau de caractères
81 * @param off offset dans le tableau à partir duquel il faut écrire les
82 * caractères.
83 * @param len nombre de caractères à écrire.
84 * @exception IOException la méthode transforme les exceptions swing en
85 * IOException.
86 */
87 public void write(char cbuf[], int off, int len) throws IOException
88 {
89 String s = new String(cbuf, off, len);
90 buffer.addElement(s);
91 if( log!=null ) log.write(cbuf, off, len);
92 }
93
94 /**
95 * Ne fait rien.
96 * @exception IOException ...si l'on flush alors que le flux est fermé.
97 */
98 public void flush() throws IOException
99 {
100 if (!ouvert)
101 throw new IOException("Ecrivain fermé");
102 if( log!=null ) log.flush();
103 try
104 {
105 Vector v;
106 String ss[];
107 final StringBuffer sb;
108
109 v = (Vector)buffer.clone();
110 buffer.removeAllElements();
111 ss = new String[v.size()];
112 v.copyInto(ss);
113 sb = new StringBuffer();
114 for (int i = 0; i < ss.length; i++)
115 {
116 sb.append(ss[i]);
117 }
118 monDocument.insertString
119 (monDocument.getLength(), sb.toString(), mesAttributs);
120 lOffsetAtteint = monDocument.getLength();
121 }
122 catch (BadLocationException ble)
123 {
124 throw new IOException(ble.toString());
125 }
126 catch (Exception e){}
127 }
128
129 /**
130 * Ne fait rien, à part renseigner un flag pour mémoriser que le flux
131 * et fermé.
132 */
133 public void close() throws IOException
134 {
135 if( log!=null ) log.close();
136 ouvert = false;
137 }
138
139 /**
140 * Permet de savoir l'offset du dernier caractère écrit, pour divers
141 * traitements (empecher son effacement, en l'occurence). Cette façon de
142 * faire n'est pas géniale, et il y en aura probablement une autre plus tard.
143 */
144 public int offsetAtteint()
145 {
146 return lOffsetAtteint;
147 }
148
149 /**
150 * Pour les tests.
151 * @exception Exception pour se débarasser.
152 */
153 public static void main(String args[]) throws Exception
154 {
155 JFrame jf;
156 JPanel jp;
157 JScrollPane jsp;
158 JTextArea jta;
159 SwingTextDocumentWriter stdw;
160
161 jf = new JFrame("Test SwingTestDocumentWriter");
162 jp = new JPanel();
163 jp.setLayout(new BorderLayout());
164 jp.setPreferredSize(new Dimension(400, 250));
165 jta = new JTextArea();
166 jta.setEditable(false);
167 jsp = new JScrollPane(jta);
168 jp.add("Center", jsp);
169 jf.setContentPane(jp);
170 jf.pack();
171 stdw = new SwingTextDocumentWriter(jta.getDocument());
172 stdw.write("Tapez 'q' pour sortir.\n");
173 stdw.write
174 ("Tout ce que vous écrivez sur l'entrée standard "+
175 "sera écrit ici : ");
176 jf.show();
177 while (true)
178 {
179 char lu;
180
181 lu = (char)System.in.read();
182 if (lu == 'q')
183 System.exit(0);
184 stdw.write(lu);
185 }
186 }
187
188 /**
189 * @return un Stream intermédiaire.
190 */
191 public OutputStream asStream()
192 {
193 return new Stream();
194 }
195
196 private class Stream extends java.io.OutputStream
197 {
198 char buf[] = new char[1];
199
200 public void write(int b) throws IOException
201 {
202 buf[0] = (char)b;
203 SwingTextDocumentWriter.this.write(buf, 0, 1);
204 flush();
205 }
206
207 public void write(byte b[], int off, int len) throws IOException
208 {
209 char c[];
210
211 c = new char[b.length];
212 for (int i = off; i < off + len; i++)
213 c[i] = (char)b[i];
214 SwingTextDocumentWriter.this.write(c, off, len);
215 flush();
216 }
217
218 public void flush() throws IOException
219 {
220 SwingTextDocumentWriter.this.flush();
221 }
222
223 }
224 }