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 import org.crsh.text.ui.UIBuilder;
025 import org.crsh.text.ui.UIBuilderRenderable;
026
027 import java.io.Closeable;
028 import java.io.IOException;
029 import java.io.InterruptedIOException;
030 import java.io.PrintWriter;
031 import java.util.Collections;
032
033 public class RenderPrintWriter extends PrintWriter {
034
035 /** . */
036 private final RenderWriter out;
037
038 public RenderPrintWriter(ScreenContext out) {
039 super(new RenderWriter(out));
040
041 //
042 this.out = (RenderWriter)super.out;
043 }
044
045 public RenderPrintWriter(ScreenContext out, Closeable closeable) {
046 super(new RenderWriter(out, closeable));
047
048 //
049 this.out = (RenderWriter)super.out;
050 }
051
052 public final boolean isEmpty() {
053 return out.isEmpty();
054 }
055
056 public final void print(Object obj, Color foreground) {
057 try {
058 out.provide(Style.style(foreground));
059 }
060 catch (InterruptedIOException x) {
061 Thread.currentThread().interrupt();
062 }
063 catch (IOException x) {
064 setError();
065 }
066 print(obj);
067 try {
068 out.provide(Style.reset);
069 }
070 catch (InterruptedIOException x) {
071 Thread.currentThread().interrupt();
072 }
073 catch (IOException x) {
074 setError();
075 }
076 }
077
078 public final void println(Object obj, Color foreground) {
079 print(obj, Style.style(foreground));
080 println();
081 }
082
083 public final void print(Object obj, Color foreground, Color background) {
084 try {
085 out.provide(Style.style(foreground, background));
086 }
087 catch (InterruptedIOException x) {
088 Thread.currentThread().interrupt();
089 }
090 catch (IOException x) {
091 setError();
092 }
093 print(obj);
094 try {
095 out.provide(Style.reset);
096 }
097 catch (InterruptedIOException x) {
098 Thread.currentThread().interrupt();
099 }
100 catch (IOException x) {
101 setError();
102 }
103 }
104
105 public final void println(Object obj, Color foreground, Color background) {
106 print(obj, Style.style(foreground, background));
107 println();
108 }
109
110 public final void print(Object obj, Decoration decoration) {
111 try {
112 out.provide(Style.style(decoration));
113 }
114 catch (InterruptedIOException x) {
115 Thread.currentThread().interrupt();
116 }
117 catch (IOException x) {
118 setError();
119 }
120 print(obj);
121 try {
122 out.provide(Style.reset);
123 }
124 catch (InterruptedIOException x) {
125 Thread.currentThread().interrupt();
126 }
127 catch (IOException x) {
128 setError();
129 }
130 }
131
132 public final void println(Object obj, Decoration decoration) {
133 print(obj, Style.style(decoration));
134 println();
135 }
136
137 public final void print(Object obj, Decoration decoration, Color foreground) {
138 print(obj, Style.style(decoration, foreground));
139 println();
140 }
141
142 public final void println(Object obj, Decoration decoration, Color foreground) {
143 print(obj, Style.style(decoration, foreground, null));
144 println();
145 }
146
147 public final void print(Object obj, Decoration decoration, Color foreground, Color background) {
148 print(obj, Style.style(decoration, foreground, background));
149 println();
150 }
151
152 public final void println(Object obj, Decoration decoration, Color foreground, Color background) {
153 print(obj, Style.style(decoration, foreground, background));
154 println();
155 }
156
157 public final void print(Object obj, Style style) {
158 try {
159 out.provide(style);
160 }
161 catch (InterruptedIOException x) {
162 Thread.currentThread().interrupt();
163 }
164 catch (IOException x) {
165 setError();
166 }
167 print(obj);
168 try {
169 out.provide(Style.reset);
170 }
171 catch (InterruptedIOException x) {
172 Thread.currentThread().interrupt();
173 }
174 catch (IOException x) {
175 setError();
176 }
177 }
178
179 public final void println(Object obj, Style style) {
180 print(obj, style);
181 println();
182 }
183
184 /**
185 * Groovy left shift operator.
186 *
187 * @param o the appended
188 * @return this object
189 */
190 public final RenderPrintWriter leftShift(Object o) {
191 if (o instanceof Style) {
192 try {
193 out.provide((Style)o);
194 }
195 catch (InterruptedIOException x) {
196 Thread.currentThread().interrupt();
197 }
198 catch (IOException x) {
199 setError();
200 }
201 } else if (o instanceof Decoration) {
202 try {
203 out.provide((Style.style((Decoration)o)));
204 }
205 catch (InterruptedIOException x) {
206 Thread.currentThread().interrupt();
207 }
208 catch (IOException x) {
209 setError();
210 }
211 } else if (o instanceof Color) {
212 try {
213 out.provide(Style.style((Color)o));
214 }
215 catch (InterruptedIOException x) {
216 Thread.currentThread().interrupt();
217 }
218 catch (IOException x) {
219 setError();
220 }
221 } else {
222 print(o);
223 }
224 return this;
225 }
226
227 public final RenderPrintWriter cls() {
228 try {
229 out.provide(CLS.INSTANCE);
230 }
231 catch (InterruptedIOException x) {
232 Thread.currentThread().interrupt();
233 }
234 catch (IOException x) {
235 setError();
236 }
237 return this;
238 }
239
240 @Override
241 public void println(Object x) {
242 print(x);
243 println();
244 }
245
246 public void show(Element element) {
247 element.render(new RenderAppendable(this.out));
248 }
249
250 @Override
251 public void print(Object obj) {
252 if (obj instanceof UIBuilder) {
253 RenderAppendable out = new RenderAppendable(this.out);
254 new UIBuilderRenderable().renderer(Collections.singleton((UIBuilder)obj).iterator()).render(out);
255 } else if (obj instanceof Element) {
256 RenderAppendable out = new RenderAppendable(this.out);
257 ((Element)obj).renderer().render(out);
258 } else {
259 super.print(obj);
260 }
261 }
262 }