/*
* This file is part of lanterna (http://code.google.com/p/lanterna/).
*
* lanterna is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright (C) 2010-2012 Martin
*/
package com.googlecode.lanterna.gui;
import com.googlecode.lanterna.terminal.Terminal.Color;
import java.util.*;
/**
* Extend this class to create your own themes. A {@code Theme} consists of several
* {@code Theme.Definition}s, one for each {@code Theme.Category} value. When components are setting
* their colors according to the theme, they do so by calling {@code TextGraphics.applyTheme}.
*
* @author Martin
*/
public class Theme {
private static final Definition DEFAULT = new Definition(Color.BLACK, Color.WHITE, false);
private static final Definition SELECTED = new Definition(Color.WHITE, Color.BLUE, true);
private Map<Category, Definition> styles = new EnumMap<Category, Definition>(Category.class);
private static final Theme DEFAULT_INSTANCE = new Theme();
/**
* Represents things which can be styled.
*/
public enum Category {
DIALOG_AREA,
SCREEN_BACKGROUND,
SHADOW,
RAISED_BORDER,
BORDER,
BUTTON_ACTIVE,
BUTTON_INACTIVE,
BUTTON_LABEL_INACTIVE,
BUTTON_LABEL_ACTIVE,
LIST_ITEM,
LIST_ITEM_SELECTED,
CHECKBOX,
CHECKBOX_SELECTED,
TEXTBOX,
TEXTBOX_FOCUSED,
PROGRESS_BAR_COMPLETED,
PROGRESS_BAR_REMAINING
}
protected Theme() {
setDefinition(Category.DIALOG_AREA, DEFAULT);
setDefinition(Category.SCREEN_BACKGROUND, new Definition(Color.CYAN, Color.BLUE, true));
setDefinition(Category.SHADOW, new Definition(Color.BLACK, Color.BLACK, true));
setDefinition(Category.BORDER, new Definition(Color.BLACK, Color.WHITE, true));
setDefinition(Category.RAISED_BORDER, new Definition(Color.WHITE, Color.WHITE, true));
setDefinition(Category.BUTTON_LABEL_ACTIVE, new Definition(Color.YELLOW, Color.BLUE, true));
setDefinition(Category.BUTTON_LABEL_INACTIVE, new Definition(Color.BLACK, Color.WHITE, true));
setDefinition(Category.BUTTON_ACTIVE, SELECTED);
setDefinition(Category.BUTTON_INACTIVE, DEFAULT);
setDefinition(Category.LIST_ITEM, DEFAULT);
setDefinition(Category.LIST_ITEM_SELECTED, SELECTED);
setDefinition(Category.CHECKBOX, DEFAULT);
setDefinition(Category.CHECKBOX_SELECTED, SELECTED);
setDefinition(Category.TEXTBOX, SELECTED);
setDefinition(Category.TEXTBOX_FOCUSED, new Definition(Color.YELLOW, Color.BLUE, true));
setDefinition(Category.PROGRESS_BAR_COMPLETED, new Definition(Color.GREEN, Color.BLACK, false));
setDefinition(Category.PROGRESS_BAR_REMAINING, new Definition(Color.RED, Color.BLACK, false));
}
public Theme.Definition getDefinition(Category category) {
if (styles.containsKey(category) && styles.get(category) != null) {
return styles.get(category);
}
return getDefault();
}
protected void setDefinition(Category category, Definition def) {
if (def == null) {
styles.remove(category);
} else {
styles.put(category, def);
}
}
/**
* Gets the default style to use when no Category-specific style is set.
*/
protected Definition getDefaultStyle() {
return DEFAULT;
}
/**
* @deprecated use
* {@code getDefaultStyle()} instead
*/
@Deprecated
protected Definition getDefault() {
return getDefaultStyle();
}
/**
* @deprecated use {@code getDefinition} instead.
*/
@Deprecated
protected Definition getDialogEmptyArea() {
return getDefinition(Category.DIALOG_AREA);
}
/**
* @deprecated use {@code getDefinition} instead.
*/
@Deprecated
protected Definition getScreenBackground() {
return getDefinition(Category.SCREEN_BACKGROUND);
}
/**
* @deprecated use {@code getDefinition} instead.
*/
@Deprecated
protected Definition getShadow() {
return getDefinition(Category.SHADOW);
}
/**
* @deprecated use {@code getDefinition} instead.
*/
@Deprecated
protected Definition getBorder() {
return getDefinition(Category.BORDER);
}
/**
* @deprecated use {@code getDefinition} instead.
*/
@Deprecated
protected Definition getRaisedBorder() {
return getDefinition(Category.RAISED_BORDER);
}
/**
* @deprecated use {@code getDefinition} instead.
*/
@Deprecated
protected Definition getButtonLabelActive() {
return getDefinition(Category.BUTTON_LABEL_ACTIVE);
}
/**
* @deprecated use {@code getDefinition} instead.
*/
@Deprecated
protected Definition getButtonLabelInactive() {
return getDefinition(Category.BUTTON_LABEL_INACTIVE);
}
/**
* @deprecated use {@code getDefinition} instead.
*/
@Deprecated
protected Definition getButtonActive() {
return getDefinition(Category.BUTTON_ACTIVE);
}
/**
* @deprecated use {@code getDefinition} instead.
*/
@Deprecated
protected Definition getButtonInactive() {
return getDefinition(Category.BUTTON_INACTIVE);
}
/**
* @deprecated use {@code getDefinition} instead.
*/
@Deprecated
protected Definition getItem() {
return getDefinition(Category.LIST_ITEM);
}
/**
* @deprecated use {@code getDefinition} instead.
*/
@Deprecated
protected Definition getItemSelected() {
return getDefinition(Category.LIST_ITEM_SELECTED);
}
/**
* @deprecated use {@code getDefinition} instead.
*/
@Deprecated
protected Definition getCheckBox() {
return getDefinition(Category.CHECKBOX);
}
/**
* @deprecated use {@code getDefinition} instead.
*/
@Deprecated
protected Definition getCheckBoxSelected() {
return getDefinition(Category.CHECKBOX_SELECTED);
}
/**
* @deprecated use {@code getDefinition} instead.
*/
@Deprecated
protected Definition getTextBoxFocused() {
return getDefinition(Category.TEXTBOX_FOCUSED);
}
/**
* @deprecated use {@code getDefinition} instead.
*/
@Deprecated
protected Definition getTextBox() {
return getDefinition(Category.TEXTBOX);
}
public static Theme getDefaultTheme() {
return DEFAULT_INSTANCE;
}
/**
* A style definition encompassing colors and effects.
*/
public static class Definition {
private Color foreground;
private Color background;
private boolean highlighted;
private boolean underlined;
public Definition(Color foreground, Color background) {
this(foreground, background, false);
}
public Definition(Color foreground, Color background, boolean highlighted) {
this(foreground, background, highlighted, false);
}
public Definition(Color foreground, Color background, boolean highlighted, boolean underlined) {
if (foreground == null) {
throw new IllegalArgumentException("foreground color cannot be null");
}
if (background == null) {
throw new IllegalArgumentException("background color cannot be null");
}
this.foreground = foreground;
this.background = background;
this.highlighted = highlighted;
this.underlined = underlined;
}
public Color foreground() {
return foreground;
}
public Color background() {
return background;
}
public boolean isHighlighted() {
return highlighted;
}
public boolean isUnderlined() {
return underlined;
}
}
}