Expose width/height in TApplication constructor, attempt on ECMA48
[fanfix.git] / src / jexer / bits / ColorTheme.java
CommitLineData
daa4106c 1/*
624ce48e
KL
2 * Jexer - Java Text User Interface
3 *
e16dda65 4 * The MIT License (MIT)
624ce48e 5 *
a2018e99 6 * Copyright (C) 2017 Kevin Lamonte
624ce48e 7 *
e16dda65
KL
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
624ce48e 14 *
e16dda65
KL
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
624ce48e 17 *
e16dda65
KL
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24 * DEALINGS IN THE SOFTWARE.
7b5261bc
KL
25 *
26 * @author Kevin Lamonte [kevin.lamonte@gmail.com]
27 * @version 1
624ce48e
KL
28 */
29package jexer.bits;
30
2420f903
KL
31import java.io.BufferedReader;
32import java.io.FileReader;
33import java.io.FileWriter;
34import java.io.IOException;
68c5cd6b 35import java.io.Reader;
3649b921
KL
36import java.util.ArrayList;
37import java.util.List;
38import java.util.Set;
2420f903
KL
39import java.util.SortedMap;
40import java.util.StringTokenizer;
41import java.util.TreeMap;
624ce48e
KL
42
43/**
7b5261bc
KL
44 * ColorTheme is a collection of colors keyed by string. A default theme is
45 * also provided that matches the blue-and-white theme used by Turbo Vision.
624ce48e 46 */
7b5261bc 47public final class ColorTheme {
624ce48e
KL
48
49 /**
7b5261bc 50 * The current theme colors.
624ce48e 51 */
2420f903
KL
52 private SortedMap<String, CellAttributes> colors;
53
54 /**
7b5261bc 55 * Public constructor sets the theme to the default.
2420f903
KL
56 */
57 public ColorTheme() {
7b5261bc
KL
58 colors = new TreeMap<String, CellAttributes>();
59 setDefaultTheme();
2420f903 60 }
624ce48e
KL
61
62 /**
7b5261bc 63 * Retrieve the CellAttributes for a named theme color.
624ce48e 64 *
7b5261bc
KL
65 * @param name theme color name, e.g. "twindow.border"
66 * @return color associated with name, e.g. bold yellow on blue
624ce48e 67 */
7b5261bc
KL
68 public CellAttributes getColor(final String name) {
69 CellAttributes attr = (CellAttributes) colors.get(name);
70 return attr;
624ce48e
KL
71 }
72
3649b921
KL
73 /**
74 * Retrieve all the names in the theme.
75 *
76 * @return a list of names
77 */
78 public List<String> getColorNames() {
79 Set<String> keys = colors.keySet();
80 List<String> names = new ArrayList<String>(keys.size());
81 names.addAll(keys);
82 return names;
83 }
84
91c9a837
KL
85 /**
86 * Set the color for a named theme color.
87 *
88 * @param name theme color name, e.g. "twindow.border"
89 * @param color the new color to associate with name, e.g. bold yellow on
90 * blue
91 */
92 public void setColor(final String name, final CellAttributes color) {
93 colors.put(name, color);
94 }
95
624ce48e 96 /**
7b5261bc 97 * Save the color theme mappings to an ASCII file.
624ce48e
KL
98 *
99 * @param filename file to write to
7b5261bc 100 * @throws IOException if the I/O fails
624ce48e 101 */
7b5261bc
KL
102 public void save(final String filename) throws IOException {
103 FileWriter file = new FileWriter(filename);
104 for (String key: colors.keySet()) {
105 CellAttributes color = getColor(key);
106 file.write(String.format("%s = %s\n", key, color));
107 }
108 file.close();
624ce48e
KL
109 }
110
111 /**
7b5261bc 112 * Read color theme mappings from an ASCII file.
624ce48e
KL
113 *
114 * @param filename file to read from
7b5261bc 115 * @throws IOException if the I/O fails
624ce48e 116 */
7b5261bc 117 public void load(final String filename) throws IOException {
68c5cd6b
KL
118 load(new FileReader(filename));
119 }
120
a0d734e6
KL
121 /**
122 * Set a color based on a text string. Color text string is of the form:
123 * <code>[ bold ] [ blink ] { foreground on background }</code>
124 *
125 * @param key the color key string
126 * @param text the text string
127 */
128 public void setColorFromString(final String key, final String text) {
129 boolean bold = false;
130 boolean blink = false;
131 String foreColor;
132 String backColor;
133 String token;
134
135 StringTokenizer tokenizer = new StringTokenizer(text);
136 token = tokenizer.nextToken();
137 while (token.equals("bold") || token.equals("blink")) {
138 if (token.equals("bold")) {
139 bold = true;
140 token = tokenizer.nextToken();
141 }
142 if (token.equals("blink")) {
143 blink = true;
144 token = tokenizer.nextToken();
145 }
146 }
147
148 // What's left is "blah on blah"
149 foreColor = token.toLowerCase();
150
151 if (!tokenizer.nextToken().toLowerCase().equals("on")) {
152 // Invalid line.
153 return;
154 }
155 backColor = tokenizer.nextToken().toLowerCase();
156
157 CellAttributes color = new CellAttributes();
158 if (bold) {
159 color.setBold(true);
160 }
161 if (blink) {
162 color.setBlink(true);
163 }
164 color.setForeColor(Color.getColor(foreColor));
165 color.setBackColor(Color.getColor(backColor));
166 colors.put(key, color);
167 }
168
68c5cd6b
KL
169 /**
170 * Read color theme mappings from a Reader. The reader is closed at the
171 * end.
172 *
173 * @param reader the reader to read from
174 * @throws IOException if the I/O fails
175 */
176 public void load(final Reader reader) throws IOException {
177 BufferedReader bufferedReader = new BufferedReader(reader);
178 String line = bufferedReader.readLine();
179 for (; line != null; line = bufferedReader.readLine()) {
7b5261bc
KL
180 // Look for lines that resemble:
181 // "key = blah on blah"
182 // "key = bold blah on blah"
6f8ff91a
KL
183 // "key = blink bold blah on blah"
184 // "key = bold blink blah on blah"
185 // "key = blink blah on blah"
a0d734e6
KL
186 if (line.indexOf('=') == -1) {
187 // Invalid line.
7b5261bc
KL
188 continue;
189 }
a0d734e6
KL
190 String key = line.substring(0, line.indexOf(':')).trim();
191 String text = line.substring(line.indexOf(':') + 1);
192 setColorFromString(key, text);
7b5261bc 193 }
cf9af8df 194 // All done.
68c5cd6b 195 bufferedReader.close();
624ce48e
KL
196 }
197
2420f903
KL
198 /**
199 * Sets to defaults that resemble the Borland IDE colors.
200 */
624ce48e 201 public void setDefaultTheme() {
7b5261bc
KL
202 CellAttributes color;
203
204 // TWindow border
205 color = new CellAttributes();
206 color.setForeColor(Color.WHITE);
207 color.setBackColor(Color.BLUE);
208 color.setBold(true);
209 colors.put("twindow.border", color);
210
211 // TWindow background
212 color = new CellAttributes();
213 color.setForeColor(Color.YELLOW);
214 color.setBackColor(Color.BLUE);
215 color.setBold(true);
216 colors.put("twindow.background", color);
217
218 // TWindow border - inactive
219 color = new CellAttributes();
220 color.setForeColor(Color.BLACK);
221 color.setBackColor(Color.BLUE);
222 color.setBold(true);
223 colors.put("twindow.border.inactive", color);
224
225 // TWindow background - inactive
226 color = new CellAttributes();
227 color.setForeColor(Color.YELLOW);
228 color.setBackColor(Color.BLUE);
229 color.setBold(true);
230 colors.put("twindow.background.inactive", color);
231
232 // TWindow border - modal
233 color = new CellAttributes();
234 color.setForeColor(Color.WHITE);
235 color.setBackColor(Color.WHITE);
236 color.setBold(true);
237 colors.put("twindow.border.modal", color);
238
239 // TWindow background - modal
240 color = new CellAttributes();
241 color.setForeColor(Color.BLACK);
242 color.setBackColor(Color.WHITE);
243 color.setBold(false);
244 colors.put("twindow.background.modal", color);
245
246 // TWindow border - modal + inactive
247 color = new CellAttributes();
248 color.setForeColor(Color.BLACK);
249 color.setBackColor(Color.WHITE);
250 color.setBold(true);
251 colors.put("twindow.border.modal.inactive", color);
252
253 // TWindow background - modal + inactive
254 color = new CellAttributes();
255 color.setForeColor(Color.BLACK);
256 color.setBackColor(Color.WHITE);
257 color.setBold(false);
258 colors.put("twindow.background.modal.inactive", color);
259
260 // TWindow border - during window movement - modal
261 color = new CellAttributes();
262 color.setForeColor(Color.GREEN);
263 color.setBackColor(Color.WHITE);
264 color.setBold(true);
265 colors.put("twindow.border.modal.windowmove", color);
266
267 // TWindow border - during window movement
268 color = new CellAttributes();
269 color.setForeColor(Color.GREEN);
270 color.setBackColor(Color.BLUE);
271 color.setBold(true);
272 colors.put("twindow.border.windowmove", color);
273
274 // TWindow background - during window movement
275 color = new CellAttributes();
276 color.setForeColor(Color.YELLOW);
277 color.setBackColor(Color.BLUE);
278 color.setBold(false);
279 colors.put("twindow.background.windowmove", color);
280
0ee88b6d 281 // TDesktop background
7b5261bc
KL
282 color = new CellAttributes();
283 color.setForeColor(Color.BLUE);
284 color.setBackColor(Color.WHITE);
285 color.setBold(false);
0ee88b6d 286 colors.put("tdesktop.background", color);
7b5261bc
KL
287
288 // TButton text
289 color = new CellAttributes();
290 color.setForeColor(Color.BLACK);
291 color.setBackColor(Color.GREEN);
292 color.setBold(false);
293 colors.put("tbutton.inactive", color);
294 color = new CellAttributes();
3649b921 295 color.setForeColor(Color.CYAN);
7b5261bc
KL
296 color.setBackColor(Color.GREEN);
297 color.setBold(true);
298 colors.put("tbutton.active", color);
299 color = new CellAttributes();
300 color.setForeColor(Color.BLACK);
301 color.setBackColor(Color.WHITE);
302 color.setBold(true);
303 colors.put("tbutton.disabled", color);
304 color = new CellAttributes();
305 color.setForeColor(Color.YELLOW);
306 color.setBackColor(Color.GREEN);
307 color.setBold(true);
308 colors.put("tbutton.mnemonic", color);
309 color = new CellAttributes();
310 color.setForeColor(Color.YELLOW);
311 color.setBackColor(Color.GREEN);
312 color.setBold(true);
313 colors.put("tbutton.mnemonic.highlighted", color);
314
315 // TLabel text
316 color = new CellAttributes();
317 color.setForeColor(Color.WHITE);
318 color.setBackColor(Color.BLUE);
319 color.setBold(true);
320 colors.put("tlabel", color);
321
322 // TText text
323 color = new CellAttributes();
324 color.setForeColor(Color.WHITE);
e8a11f98 325 color.setBackColor(Color.BLUE);
7b5261bc
KL
326 color.setBold(false);
327 colors.put("ttext", color);
328
329 // TField text
330 color = new CellAttributes();
331 color.setForeColor(Color.WHITE);
332 color.setBackColor(Color.BLUE);
333 color.setBold(false);
334 colors.put("tfield.inactive", color);
335 color = new CellAttributes();
336 color.setForeColor(Color.YELLOW);
337 color.setBackColor(Color.BLACK);
338 color.setBold(true);
339 colors.put("tfield.active", color);
340
341 // TCheckbox
342 color = new CellAttributes();
343 color.setForeColor(Color.WHITE);
344 color.setBackColor(Color.BLUE);
345 color.setBold(false);
346 colors.put("tcheckbox.inactive", color);
347 color = new CellAttributes();
348 color.setForeColor(Color.YELLOW);
349 color.setBackColor(Color.BLACK);
350 color.setBold(true);
351 colors.put("tcheckbox.active", color);
352
7b5261bc
KL
353 // TRadioButton
354 color = new CellAttributes();
355 color.setForeColor(Color.WHITE);
356 color.setBackColor(Color.BLUE);
357 color.setBold(false);
358 colors.put("tradiobutton.inactive", color);
359 color = new CellAttributes();
360 color.setForeColor(Color.YELLOW);
361 color.setBackColor(Color.BLACK);
362 color.setBold(true);
363 colors.put("tradiobutton.active", color);
364
365 // TRadioGroup
366 color = new CellAttributes();
367 color.setForeColor(Color.WHITE);
368 color.setBackColor(Color.BLUE);
369 color.setBold(false);
370 colors.put("tradiogroup.inactive", color);
371 color = new CellAttributes();
372 color.setForeColor(Color.YELLOW);
373 color.setBackColor(Color.BLUE);
374 color.setBold(true);
375 colors.put("tradiogroup.active", color);
376
377 // TMenu
378 color = new CellAttributes();
379 color.setForeColor(Color.BLACK);
380 color.setBackColor(Color.WHITE);
381 color.setBold(false);
382 colors.put("tmenu", color);
383 color = new CellAttributes();
384 color.setForeColor(Color.BLACK);
385 color.setBackColor(Color.GREEN);
386 color.setBold(false);
387 colors.put("tmenu.highlighted", color);
388 color = new CellAttributes();
389 color.setForeColor(Color.RED);
390 color.setBackColor(Color.WHITE);
391 color.setBold(false);
392 colors.put("tmenu.mnemonic", color);
393 color = new CellAttributes();
394 color.setForeColor(Color.RED);
395 color.setBackColor(Color.GREEN);
396 color.setBold(false);
397 colors.put("tmenu.mnemonic.highlighted", color);
398 color = new CellAttributes();
399 color.setForeColor(Color.BLACK);
400 color.setBackColor(Color.WHITE);
401 color.setBold(true);
402 colors.put("tmenu.disabled", color);
403
404 // TProgressBar
405 color = new CellAttributes();
406 color.setForeColor(Color.BLUE);
407 color.setBackColor(Color.BLUE);
408 color.setBold(true);
409 colors.put("tprogressbar.complete", color);
410 color = new CellAttributes();
411 color.setForeColor(Color.WHITE);
412 color.setBackColor(Color.BLUE);
413 color.setBold(false);
414 colors.put("tprogressbar.incomplete", color);
415
416 // THScroller / TVScroller
417 color = new CellAttributes();
418 color.setForeColor(Color.CYAN);
419 color.setBackColor(Color.BLUE);
420 color.setBold(false);
421 colors.put("tscroller.bar", color);
422 color = new CellAttributes();
423 color.setForeColor(Color.BLUE);
424 color.setBackColor(Color.CYAN);
425 color.setBold(false);
426 colors.put("tscroller.arrows", color);
427
428 // TTreeView
429 color = new CellAttributes();
430 color.setForeColor(Color.WHITE);
431 color.setBackColor(Color.BLUE);
432 color.setBold(false);
433 colors.put("ttreeview", color);
434 color = new CellAttributes();
435 color.setForeColor(Color.GREEN);
436 color.setBackColor(Color.BLUE);
437 color.setBold(true);
438 colors.put("ttreeview.expandbutton", color);
439 color = new CellAttributes();
440 color.setForeColor(Color.BLACK);
441 color.setBackColor(Color.CYAN);
442 color.setBold(false);
443 colors.put("ttreeview.selected", color);
444 color = new CellAttributes();
445 color.setForeColor(Color.RED);
446 color.setBackColor(Color.BLUE);
447 color.setBold(false);
448 colors.put("ttreeview.unreadable", color);
449 color = new CellAttributes();
b6faeac0
KL
450 // color.setForeColor(Color.BLACK);
451 // color.setBackColor(Color.BLUE);
452 // color.setBold(true);
453 color.setForeColor(Color.WHITE);
7b5261bc 454 color.setBackColor(Color.BLUE);
b6faeac0 455 color.setBold(false);
7b5261bc
KL
456 colors.put("ttreeview.inactive", color);
457
3649b921 458 // TList
7b5261bc
KL
459 color = new CellAttributes();
460 color.setForeColor(Color.WHITE);
461 color.setBackColor(Color.BLUE);
462 color.setBold(false);
3649b921 463 colors.put("tlist", color);
7b5261bc
KL
464 color = new CellAttributes();
465 color.setForeColor(Color.BLACK);
466 color.setBackColor(Color.CYAN);
467 color.setBold(false);
3649b921 468 colors.put("tlist.selected", color);
7b5261bc
KL
469 color = new CellAttributes();
470 color.setForeColor(Color.BLACK);
471 color.setBackColor(Color.CYAN);
472 color.setBold(false);
3649b921 473 colors.put("tlist.unreadable", color);
7b5261bc 474 color = new CellAttributes();
b6faeac0
KL
475 // color.setForeColor(Color.BLACK);
476 // color.setBackColor(Color.BLUE);
477 // color.setBold(true);
478 color.setForeColor(Color.WHITE);
7b5261bc 479 color.setBackColor(Color.BLUE);
b6faeac0 480 color.setBold(false);
3649b921 481 colors.put("tlist.inactive", color);
7b5261bc 482
2ce6dab2
KL
483 // TStatusBar
484 color = new CellAttributes();
485 color.setForeColor(Color.BLACK);
486 color.setBackColor(Color.WHITE);
487 color.setBold(false);
488 colors.put("tstatusbar.text", color);
489 color = new CellAttributes();
490 color.setForeColor(Color.RED);
491 color.setBackColor(Color.WHITE);
492 color.setBold(false);
493 colors.put("tstatusbar.button", color);
494 color = new CellAttributes();
495 color.setForeColor(Color.WHITE);
496 color.setBackColor(Color.BLUE);
497 color.setBold(false);
498 colors.put("tstatusbar.selected", color);
499
7b5261bc
KL
500 // TEditor
501 color = new CellAttributes();
502 color.setForeColor(Color.WHITE);
e8a11f98 503 color.setBackColor(Color.BLUE);
7b5261bc
KL
504 color.setBold(false);
505 colors.put("teditor", color);
624ce48e 506
624ce48e
KL
507 }
508
a0d734e6
KL
509 /**
510 * Make human-readable description of this Cell.
511 *
512 * @return displayable String
513 */
514 @Override
515 public String toString() {
516 return colors.toString();
517 }
518
624ce48e 519}