001    /*
002     * Copyright (C) 2012 eXo Platform SAS.
003     *
004     * This is free software; you can redistribute it and/or modify it
005     * under the terms of the GNU Lesser General Public License as
006     * published by the Free Software Foundation; either version 2.1 of
007     * the License, or (at your option) any later version.
008     *
009     * This software is distributed in the hope that it will be useful,
010     * but WITHOUT ANY WARRANTY; without even the implied warranty of
011     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012     * Lesser General Public License for more details.
013     *
014     * You should have received a copy of the GNU Lesser General Public
015     * License along with this software; if not, write to the Free
016     * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
017     * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
018     */
019    
020    package org.crsh.text;
021    
022    import org.crsh.shell.ScreenContext;
023    import org.crsh.text.ui.Element;
024    
025    import java.io.Closeable;
026    import java.io.IOException;
027    import java.io.InterruptedIOException;
028    import java.io.PrintWriter;
029    
030    public class RenderPrintWriter extends PrintWriter {
031    
032      /** . */
033      private final RenderWriter out;
034    
035      public RenderPrintWriter(ScreenContext out) {
036        super(new RenderWriter(out));
037    
038        //
039        this.out = (RenderWriter)super.out;
040      }
041    
042      public RenderPrintWriter(ScreenContext out, Closeable closeable) {
043        super(new RenderWriter(out, closeable));
044    
045        //
046        this.out = (RenderWriter)super.out;
047      }
048    
049      public final boolean isEmpty() {
050        return out.isEmpty();
051      }
052    
053      public final void print(Object obj, Color foreground) {
054        try {
055          out.provide(Style.style(foreground));
056        }
057        catch (InterruptedIOException x) {
058          Thread.currentThread().interrupt();
059        }
060        catch (IOException x) {
061          setError();
062        }
063        print(obj);
064        try {
065          out.provide(Style.reset);
066        }
067        catch (InterruptedIOException x) {
068          Thread.currentThread().interrupt();
069        }
070        catch (IOException x) {
071          setError();
072        }
073      }
074    
075      public final void println(Object obj, Color foreground) {
076        print(obj, Style.style(foreground));
077        println();
078      }
079    
080      public final void print(Object obj, Color foreground, Color background) {
081        try {
082          out.provide(Style.style(foreground, background));
083        }
084        catch (InterruptedIOException x) {
085          Thread.currentThread().interrupt();
086        }
087        catch (IOException x) {
088          setError();
089        }
090        print(obj);
091        try {
092          out.provide(Style.reset);
093        }
094        catch (InterruptedIOException x) {
095          Thread.currentThread().interrupt();
096        }
097        catch (IOException x) {
098          setError();
099        }
100      }
101    
102      public final void println(Object obj, Color foreground, Color background) {
103        print(obj, Style.style(foreground, background));
104        println();
105      }
106    
107      public final void print(Object obj, Decoration decoration) {
108        try {
109          out.provide(Style.style(decoration));
110        }
111        catch (InterruptedIOException x) {
112          Thread.currentThread().interrupt();
113        }
114        catch (IOException x) {
115          setError();
116        }
117        print(obj);
118        try {
119          out.provide(Style.reset);
120        }
121        catch (InterruptedIOException x) {
122          Thread.currentThread().interrupt();
123        }
124        catch (IOException x) {
125          setError();
126        }
127      }
128    
129      public final void println(Object obj, Decoration decoration) {
130        print(obj, Style.style(decoration));
131        println();
132      }
133    
134      public final void print(Object obj, Decoration decoration, Color foreground) {
135        print(obj, Style.style(decoration, foreground));
136        println();
137      }
138    
139      public final void println(Object obj, Decoration decoration, Color foreground) {
140        print(obj, Style.style(decoration, foreground, null));
141        println();
142      }
143    
144      public final void print(Object obj, Decoration decoration, Color foreground, Color background) {
145        print(obj, Style.style(decoration, foreground, background));
146        println();
147      }
148    
149      public final void println(Object obj, Decoration decoration, Color foreground, Color background) {
150        print(obj, Style.style(decoration, foreground, background));
151        println();
152      }
153    
154      public final void print(Object obj, Style style) {
155        try {
156          out.provide(style);
157        }
158        catch (InterruptedIOException x) {
159          Thread.currentThread().interrupt();
160        }
161        catch (IOException x) {
162          setError();
163        }
164        print(obj);
165        try {
166          out.provide(Style.reset);
167        }
168        catch (InterruptedIOException x) {
169          Thread.currentThread().interrupt();
170        }
171        catch (IOException x) {
172          setError();
173        }
174      }
175    
176      public final void println(Object obj, Style style) {
177        print(obj, style);
178        println();
179      }
180    
181      /**
182       * Groovy left shift operator.
183       *
184       * @param o the appended
185       * @return this object
186       */
187      public final RenderPrintWriter leftShift(Object o) {
188        if (o instanceof Style) {
189          try {
190            out.provide((Style)o);
191          }
192          catch (InterruptedIOException x) {
193            Thread.currentThread().interrupt();
194          }
195          catch (IOException x) {
196            setError();
197          }
198        } else if (o instanceof Decoration) {
199          try {
200            out.provide((Style.style((Decoration)o)));
201          }
202          catch (InterruptedIOException x) {
203            Thread.currentThread().interrupt();
204          }
205          catch (IOException x) {
206            setError();
207          }
208        } else if (o instanceof Color) {
209          try {
210            out.provide(Style.style((Color)o));
211          }
212          catch (InterruptedIOException x) {
213            Thread.currentThread().interrupt();
214          }
215          catch (IOException x) {
216            setError();
217          }
218        } else {
219          print(o);
220        }
221        return this;
222      }
223    
224      public final RenderPrintWriter cls() {
225        try {
226          out.provide(CLS.INSTANCE);
227        }
228        catch (InterruptedIOException x) {
229          Thread.currentThread().interrupt();
230        }
231        catch (IOException x) {
232          setError();
233        }
234        return this;
235      }
236    
237      @Override
238      public void println(Object x) {
239        print(x);
240        println();
241      }
242    
243      public void show(Element element) {
244        element.render(new RenderAppendable(this.out));
245      }
246    
247      @Override
248      public void print(Object obj) {
249        if (obj instanceof Element) {
250          RenderAppendable out = new RenderAppendable(this.out);
251          ((Element)obj).renderer().render(out);
252        } else {
253          super.print(obj);
254        }
255      }
256    }