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 }