blob: e6442584b830af772cbdc096ca316419c11a24fe [file] [log] [blame]
/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
/*
Part of the Processing project - http://processing.org
Copyright (c) 2004-06 Ben Fry and Casey Reas
Copyright (c) 2001-04 Massachusetts Institute of Technology
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package processing.app;
import java.awt.*;
import java.io.*;
import java.util.*;
import processing.app.syntax.*;
import processing.core.*;
import static processing.app.I18n._;
/**
* Storage class for theme settings. This was separated from the Preferences
* class for 1.0 so that the coloring wouldn't conflict with previous releases
* and to make way for future ability to customize.
*/
public class Theme {
/** Copy of the defaults in case the user mangles a preference. */
static HashMap<String,String> defaults;
/** Table of attributes/values for the theme. */
static HashMap<String,String> table = new HashMap<String,String>();;
static protected void init() {
try {
load(Base.getLibStream("theme/theme.txt"));
} catch (Exception te) {
Base.showError(null, _("Could not read color theme settings.\n" +
"You'll need to reinstall Processing."), te);
}
// check for platform-specific properties in the defaults
String platformExt = "." + Base.getPlatformName();
int platformExtLength = platformExt.length();
for (String key : table.keySet()) {
if (key.endsWith(platformExt)) {
// this is a key specific to a particular platform
String actualKey = key.substring(0, key.length() - platformExtLength);
String value = get(key);
table.put(actualKey, value);
}
}
// other things that have to be set explicitly for the defaults
setColor("run.window.bgcolor", SystemColor.control);
// clone the hash table
defaults = (HashMap<String, String>) table.clone();
}
static protected void load(InputStream input) throws IOException {
String[] lines = PApplet.loadStrings(input);
for (String line : lines) {
if ((line.length() == 0) ||
(line.charAt(0) == '#')) continue;
// this won't properly handle = signs being in the text
int equals = line.indexOf('=');
if (equals != -1) {
String key = line.substring(0, equals).trim();
String value = line.substring(equals + 1).trim();
table.put(key, value);
}
}
}
static public String get(String attribute) {
return (String) table.get(attribute);
}
static public String getDefault(String attribute) {
return (String) defaults.get(attribute);
}
static public void set(String attribute, String value) {
table.put(attribute, value);
}
static public boolean getBoolean(String attribute) {
String value = get(attribute);
return (new Boolean(value)).booleanValue();
}
static public void setBoolean(String attribute, boolean value) {
set(attribute, value ? "true" : "false");
}
static public int getInteger(String attribute) {
return Integer.parseInt(get(attribute));
}
static public void setInteger(String key, int value) {
set(key, String.valueOf(value));
}
static public Color getColor(String name) {
Color parsed = null;
String s = get(name);
if ((s != null) && (s.indexOf("#") == 0)) {
try {
int v = Integer.parseInt(s.substring(1), 16);
parsed = new Color(v);
} catch (Exception e) {
}
}
return parsed;
}
static public void setColor(String attr, Color what) {
set(attr, "#" + PApplet.hex(what.getRGB() & 0xffffff, 6));
}
static public Font getFont(String attr) {
boolean replace = false;
String value = get(attr);
if (value == null) {
//System.out.println("reset 1");
value = getDefault(attr);
replace = true;
}
String[] pieces = PApplet.split(value, ',');
if (pieces.length != 3) {
value = getDefault(attr);
//System.out.println("reset 2 for " + attr);
pieces = PApplet.split(value, ',');
//PApplet.println(pieces);
replace = true;
}
String name = pieces[0];
int style = Font.PLAIN; // equals zero
if (pieces[1].indexOf("bold") != -1) {
style |= Font.BOLD;
}
if (pieces[1].indexOf("italic") != -1) {
style |= Font.ITALIC;
}
int size = PApplet.parseInt(pieces[2], 12);
Font font = new Font(name, style, size);
// replace bad font with the default
if (replace) {
//System.out.println(attr + " > " + value);
//setString(attr, font.getName() + ",plain," + font.getSize());
set(attr, value);
}
return font;
}
static public SyntaxStyle getStyle(String what) {
String str = get("editor." + what + ".style");
StringTokenizer st = new StringTokenizer(str, ",");
String s = st.nextToken();
if (s.indexOf("#") == 0) s = s.substring(1);
Color color = new Color(Integer.parseInt(s, 16));
s = st.nextToken();
boolean bold = (s.indexOf("bold") != -1);
boolean italic = (s.indexOf("italic") != -1);
boolean underlined = (s.indexOf("underlined") != -1);
return new SyntaxStyle(color, italic, bold, underlined);
}
}