X-Git-Url: http://git.nikiroo.be/?p=jvcard.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Fjvcard%2Ftui%2FUiColors.java;h=3fa83c7b9477f8f0fdde1b9a453add835dbbaa34;hp=834641da514d1fcdf2ebf93342d3f4daa127822c;hb=7da41ecd30228908bf2afcd07ff7943ab59d4c01;hpb=0b0b2b0ff1f5e21f7b0feb955b4b54855fb3d508 diff --git a/src/be/nikiroo/jvcard/tui/UiColors.java b/src/be/nikiroo/jvcard/tui/UiColors.java index 834641d..3fa83c7 100644 --- a/src/be/nikiroo/jvcard/tui/UiColors.java +++ b/src/be/nikiroo/jvcard/tui/UiColors.java @@ -2,6 +2,10 @@ package be.nikiroo.jvcard.tui; import java.util.HashMap; import java.util.Map; +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +import be.nikiroo.jvcard.resources.Bundles; import com.googlecode.lanterna.TextColor; import com.googlecode.lanterna.gui2.Label; @@ -16,29 +20,29 @@ public class UiColors { static private Object lock = new Object(); static private UiColors instance = null; - private Map mapForegroundColor = null; - private Map mapBackgroundColor = null; + private ResourceBundle bundle = null; + private Map colorMap = null; + + private UiColors() { + colorMap = new HashMap(); + bundle = Bundles.getBundle("colors"); + } /** - * Get the (unique) instance of this class. + * Represent an element that can be coloured (foreground/background + * colours). * - * @return the (unique) instance + * @author niki + * */ - static public UiColors getInstance() { - synchronized (lock) { - if (instance == null) - instance = new UiColors(); - } - - return instance; - } - public enum Element { - DEFAULT, // + DEFAULT, // TITLE_MAIN, TITLE_VARIABLE, TITLE_COUNT, // ACTION_KEY, ACTION_DESC, // - LINE_MESSAGE, LINE_MESSAGE_ERR, LINE_MESSAGE_QUESTION, LINE_MESSAGE_ANS, // - CONTACT_LINE, CONTACT_LINE_SEPARATOR, CONTACT_LINE_SELECTED, CONTACT_LINE_SEPARATOR_SELECTED, CONTACT_LINE_DIRTY, CONTACT_LINE_DIRTY_SELECTED; + LINE_MESSAGE, LINE_MESSAGE_ERR, LINE_MESSAGE_QUESTION, LINE_MESSAGE_ANS, // + CONTACT_LINE, CONTACT_LINE_SEPARATOR, CONTACT_LINE_SELECTED, CONTACT_LINE_SEPARATOR_SELECTED, CONTACT_LINE_DIRTY, CONTACT_LINE_DIRTY_SELECTED, // + VIEW_CONTACT_NAME, VIEW_CONTACT_NORMAL, VIEW_CONTACT_NOTES_TITLE, // + ; /** * Get the foreground colour of this element. @@ -58,73 +62,155 @@ public class UiColors { return UiColors.getInstance().getBackgroundColor(this); } + /** + * Create a new {@link Label} with the colours of this {@link Element}. + * + * @param text + * the text of the {@link Label} + * + * @return the new {@link Label} + */ public Label createLabel(String text) { return UiColors.getInstance().createLabel(this, text); } + /** + * Theme a {@link Label} with the colours of this {@link Element}. + * + * @param lbl + * the {@link Label} + */ public void themeLabel(Label lbl) { UiColors.getInstance().themeLabel(this, lbl); } } + /** + * Create a new {@link Label} with the colours of the given {@link Element}. + * + * @param el + * the {@link Element} + * @param text + * the text of the {@link Label} + * + * @return the new {@link Label} + */ private Label createLabel(Element el, String text) { + if (text == null) + text = ""; + Label lbl = new Label(text); themeLabel(el, lbl); return lbl; } + /** + * Theme a {@link Label} with the colours of the given {@link Element}. + * + * @param el + * the {@link Element} + * @param lbl + * the {@link Label} + */ private void themeLabel(Element el, Label lbl) { lbl.setForegroundColor(el.getForegroundColor()); lbl.setBackgroundColor(el.getBackgroundColor()); } - private TextColor getForegroundColor(Element el) { - if (mapForegroundColor.containsKey(el)) { - return mapForegroundColor.get(el); + /** + * Return the background colour of the given element. + * + * @param el + * the {@link Element} + * + * @return its background colour + */ + private TextColor getBackgroundColor(Element el) { + if (!colorMap.containsKey(el.name() + "_BG")) { + String value = null; + try { + value = bundle.getString(el.name() + "_BG"); + } catch (MissingResourceException mre) { + value = null; + } + colorMap.put(el.name() + "_BG", + convertToColor(value, TextColor.ANSI.BLACK)); } - return TextColor.ANSI.BLACK; + return colorMap.get(el.name() + "_BG"); } - private TextColor getBackgroundColor(Element el) { - if (mapBackgroundColor.containsKey(el)) { - return mapBackgroundColor.get(el); + /** + * Return the foreground colour of the given element. + * + * @param el + * the {@link Element} + * + * @return its foreground colour + */ + private TextColor getForegroundColor(Element el) { + if (!colorMap.containsKey(el.name() + "_FG")) { + String value = null; + try { + value = bundle.getString(el.name() + "_FG"); + } catch (MissingResourceException mre) { + value = null; + } + colorMap.put(el.name() + "_FG", + convertToColor(value, TextColor.ANSI.WHITE)); } - return TextColor.ANSI.WHITE; + return colorMap.get(el.name() + "_FG"); } - private UiColors() { - mapForegroundColor = new HashMap(); - mapBackgroundColor = new HashMap(); - - // TODO: get from a file instead? - // TODO: use a theme that doesn't give headaches... - addEl(Element.ACTION_KEY, TextColor.ANSI.WHITE, TextColor.ANSI.RED); - addEl(Element.ACTION_DESC, TextColor.ANSI.WHITE, TextColor.ANSI.BLUE); - addEl(Element.CONTACT_LINE, TextColor.ANSI.WHITE, TextColor.ANSI.BLACK); - addEl(Element.CONTACT_LINE_SELECTED, TextColor.ANSI.WHITE, - TextColor.ANSI.BLUE); - addEl(Element.CONTACT_LINE_SEPARATOR, TextColor.ANSI.RED, - TextColor.ANSI.BLACK); - addEl(Element.CONTACT_LINE_SEPARATOR_SELECTED, TextColor.ANSI.RED, - TextColor.ANSI.BLUE); - addEl(Element.LINE_MESSAGE, TextColor.ANSI.BLUE, TextColor.ANSI.WHITE); - addEl(Element.LINE_MESSAGE_ERR, TextColor.ANSI.RED, - TextColor.ANSI.WHITE); - addEl(Element.LINE_MESSAGE_QUESTION, TextColor.ANSI.BLUE, - TextColor.ANSI.WHITE); - addEl(Element.LINE_MESSAGE_ANS, TextColor.ANSI.BLUE, - TextColor.ANSI.BLACK); - addEl(Element.TITLE_MAIN, TextColor.ANSI.WHITE, TextColor.ANSI.BLUE); - addEl(Element.TITLE_VARIABLE, TextColor.ANSI.GREEN, - TextColor.ANSI.BLUE); - addEl(Element.TITLE_COUNT, TextColor.ANSI.RED, TextColor.ANSI.BLUE); + /** + * Get the (unique) instance of this class. + * + * @return the (unique) instance + */ + static public UiColors getInstance() { + synchronized (lock) { + if (instance == null) + instance = new UiColors(); + } + + return instance; } - private void addEl(Element el, TextColor fore, TextColor back) { - mapForegroundColor.put(el, fore); - mapBackgroundColor.put(el, back); + /** + * Convert the given {@link String} value to a {@link TextColor}. + * + * @param value + * the {@link String} to convert + * @param defaultColor + * the default {@link TextColor} to return if the conversion + * failed + * + * @return the converted colour + */ + static private TextColor convertToColor(String value, TextColor defaultColor) { + try { + if (value.startsWith("@")) { + int r = Integer.parseInt(value.substring(1, 3), 16); + int g = Integer.parseInt(value.substring(3, 5), 16); + int b = Integer.parseInt(value.substring(5, 7), 16); + return TextColor.Indexed.fromRGB(r, g, b); + } else if (value.startsWith("#")) { + int r = Integer.parseInt(value.substring(1, 3), 16); + int g = Integer.parseInt(value.substring(3, 5), 16); + int b = Integer.parseInt(value.substring(5, 7), 16); + return new TextColor.RGB(r, g, b); + } else if (value.replaceAll("[0-9]*", "").length() == 0) { + return new TextColor.Indexed(Integer.parseInt(value)); + } else { + return TextColor.ANSI.valueOf(value); + } + } catch (Exception e) { + new Exception("Cannot convert value to colour: " + value, e) + .printStackTrace(); + } + + return defaultColor; } }