Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

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 }