package com.limegroup.gnutella.gui.themes;
import java.awt.Color;
import java.io.File;
import java.io.IOException;
import com.limegroup.gnutella.gui.Main;
import com.limegroup.gnutella.settings.IntSetting;
import com.limegroup.gnutella.settings.ColorSetting;
import com.limegroup.gnutella.settings.FontNameSetting;
import com.limegroup.gnutella.settings.SettingsFactory;
import com.limegroup.gnutella.util.FileUtils;
import com.limegroup.gnutella.util.CommonUtils;
/**
* This class contains key/value pairs for the current "theme." The
* theme defines values for the colors, fonts, etc, of the application.
*/
public final class ThemeFileHandler {
/**
* The current theme version.
*/
private static final int CURRENT_VERSION = 2;
/**
* Handle to the <tt>SettingsFactory</tt> for theme settings.
*/
private static SettingsFactory FACTORY;
/**
* Private constructor to ensure that this class is not constructed.
*/
private ThemeFileHandler() {}
static {
reload();
}
/**
* Reloads the file from disk if the theme is not already expanded.
*/
public static void reload() {
reload(false);
}
/**
* Reloads the file from disk to read values from.
*/
public static void reload(boolean force) {
File themeFile = ThemeSettings.THEME_FILE.getValue();
if( !ThemeSettings.isThemeFile(themeFile) )
ThemeSettings.THEME_FILE.revertToDefault();
themeFile = ThemeSettings.THEME_FILE.getValue();
File themeDir = ThemeSettings.extractThemeDir(themeFile);
// if the theme hasn't already been expanded, then it's
// probably a new theme, so expand it
if(force || !themeDir.isDirectory()) {
// if the theme file didn't exist, revert to default.
// this is done here instead of above because
// it doesn't matter if the file doesn't exist
// if we've already expanded it once in the past.
if( !themeFile.exists() ) {
ThemeSettings.THEME_FILE.revertToDefault();
themeFile = ThemeSettings.THEME_FILE.getValue();
themeDir = ThemeSettings.extractThemeDir(themeFile);
}
// unpack the zip -- if an error occurred, revert to the default
// theme & unpack that if necessary.
if(!ThemeSettings.expandTheme(themeFile, themeDir, force)) {
ThemeSettings.THEME_FILE.revertToDefault();
themeFile = ThemeSettings.THEME_FILE.getValue();
themeDir = ThemeSettings.extractThemeDir(themeFile);
if(!themeDir.isDirectory())
ThemeSettings.expandTheme(themeFile, themeDir, false);
}
}
final File THEME_PROPS = new File(themeDir, "theme.txt");
handleFactory(THEME_PROPS);
ThemeSettings.THEME_DIR.setValue(themeDir);
copySplashImage(themeDir);
if(CommonUtils.isMacOSX()) {
File f = new File(CommonUtils.getUserSettingsDir(), "useBrushedMetal");
if(ThemeSettings.isBrushedMetalTheme()) {
try {
FileUtils.touch(f);
} catch(IOException oops) {}
} else {
f.delete();
}
}
}
/**
* Copies the splash from the theme directory to the user settings directory,
* so that future startups can display the splash screen quickly.
*/
public static void copySplashImage(File dir) {
File src = new File(dir, "splash.png");
File dst = new File(CommonUtils.getUserSettingsDir(), Main.SPLASH_FILE);
if(src.exists()) {
if(!dst.exists() || src.length() != dst.length() || src.lastModified() != dst.lastModified()) {
dst.delete();
CommonUtils.copy(src, dst);
long modified = src.lastModified();
if(modified > 0)
dst.setLastModified(modified);
}
}
}
/**
* Determines if the current theme is current.
*/
public static boolean isCurrent() {
return CURRENT_VERSION <= VERSION.getValue();
}
/**
* Either creates the factory or reloads it as needed.
*/
private static void handleFactory(File file) {
if(FACTORY == null) {
FACTORY = new SettingsFactory(file);
} else {
FACTORY.changeFile(file);
fixFontSettings();
}
}
/**
* Fixes the font settings.
*/
private static void fixFontSettings() {
// Fix some of the font settings to not be small bold & verdana
checkFontSetting(CONTROL_TEXT_FONT_NAME,
CONTROL_TEXT_FONT_STYLE,
CONTROL_TEXT_FONT_SIZE);
checkFontSetting(SYSTEM_TEXT_FONT_NAME,
SYSTEM_TEXT_FONT_STYLE,
SYSTEM_TEXT_FONT_SIZE);
checkFontSetting(USER_TEXT_FONT_NAME,
USER_TEXT_FONT_STYLE,
USER_TEXT_FONT_SIZE);
checkFontSetting(MENU_TEXT_FONT_NAME,
MENU_TEXT_FONT_STYLE,
MENU_TEXT_FONT_SIZE);
checkFontSetting(WINDOW_TITLE_FONT_NAME,
WINDOW_TITLE_FONT_STYLE,
WINDOW_TITLE_FONT_SIZE);
checkFontSetting(SUB_TEXT_FONT_NAME,
SUB_TEXT_FONT_STYLE,
SUB_TEXT_FONT_SIZE);
}
private static void checkFontSetting(FontNameSetting font,
IntSetting style,
IntSetting size) {
if(font.getValue().toLowerCase().equals("verdana") &&
style.getValue() == 1 &&
size.getValue() == 10) {
font.setValue("dialog");
style.setValue(0);
size.setValue(11);
}
}
/////////////////// FONTS //////////////////////
/**
* Setting for the control text font name.
*/
public static final FontNameSetting CONTROL_TEXT_FONT_NAME =
FACTORY.createFontNameSetting("CONTROL_TEXT_FONT_NAME", "dialog");
/**
* Setting for the control text font style.
*/
public static final IntSetting CONTROL_TEXT_FONT_STYLE =
FACTORY.createIntSetting("CONTROL_TEXT_FONT_STYLE", 1);
/**
* Setting for the control text font size.
*/
public static final IntSetting CONTROL_TEXT_FONT_SIZE =
FACTORY.createIntSetting("CONTROL_TEXT_FONT_SIZE", 11);
/**
* Setting for the system text font name.
*/
public static final FontNameSetting SYSTEM_TEXT_FONT_NAME =
FACTORY.createFontNameSetting("SYSTEM_TEXT_FONT_NAME", "dialog");
/**
* Setting for the system text font style.
*/
public static final IntSetting SYSTEM_TEXT_FONT_STYLE =
FACTORY.createIntSetting("SYSTEM_TEXT_FONT_STYLE", 0);
/**
* Setting for the system text font size.
*/
public static final IntSetting SYSTEM_TEXT_FONT_SIZE =
FACTORY.createIntSetting("SYSTEM_TEXT_FONT_SIZE", 11);
/**
* Setting for the user text font name.
*/
public static final FontNameSetting USER_TEXT_FONT_NAME =
FACTORY.createFontNameSetting("USER_TEXT_FONT_NAME", "dialog");
/**
* Setting for the user text font style.
*/
public static final IntSetting USER_TEXT_FONT_STYLE =
FACTORY.createIntSetting("USER_TEXT_FONT_STYLE", 0);
/**
* Setting for the user text font size.
*/
public static final IntSetting USER_TEXT_FONT_SIZE =
FACTORY.createIntSetting("USER_TEXT_FONT_SIZE", 11);
/**
* Setting for the menu text font name.
*/
public static final FontNameSetting MENU_TEXT_FONT_NAME =
FACTORY.createFontNameSetting("MENU_TEXT_FONT_NAME", "dialog");
/**
* Setting for the menu text font style.
*/
public static final IntSetting MENU_TEXT_FONT_STYLE =
FACTORY.createIntSetting("MENU_TEXT_FONT_STYLE", 1);
/**
* Setting for the menu text font size.
*/
public static final IntSetting MENU_TEXT_FONT_SIZE =
FACTORY.createIntSetting("MENU_TEXT_FONT_SIZE", 11);
/**
* Setting for the window title font name.
*/
public static final FontNameSetting WINDOW_TITLE_FONT_NAME =
FACTORY.createFontNameSetting("WINDOW_TITLE_FONT_NAME", "dialog");
/**
* Setting for the window title font style.
*/
public static final IntSetting WINDOW_TITLE_FONT_STYLE =
FACTORY.createIntSetting("WINDOW_TITLE_FONT_STYLE", 1);
/**
* Setting for the window title font size.
*/
public static final IntSetting WINDOW_TITLE_FONT_SIZE =
FACTORY.createIntSetting("WINDOW_TITLE_FONT_SIZE", 11);
/**
* Setting for the sub text font name.
*/
public static final FontNameSetting SUB_TEXT_FONT_NAME =
FACTORY.createFontNameSetting("SUB_TEXT_FONT_NAME", "dialog");
/**
* Setting for the sub text font style.
*/
public static final IntSetting SUB_TEXT_FONT_STYLE =
FACTORY.createIntSetting("SUB_TEXT_FONT_STYLE", 0);
/**
* Setting for the sub text font size.
*/
public static final IntSetting SUB_TEXT_FONT_SIZE =
FACTORY.createIntSetting("SUB_TEXT_FONT_SIZE", 10);
/////////////////// END FONTS //////////////////////
/**
* Setting for the primary 1 Color.
*/
public static final ColorSetting PRIMARY1_COLOR =
FACTORY.createColorSetting("PRIMARY1_COLOR",
new Color(74,110,188));
/**
* Setting for the primary 2 Color.
*/
public static final ColorSetting PRIMARY2_COLOR =
FACTORY.createColorSetting("PRIMARY2_COLOR",
new Color(135,145,170));
/**
* Setting for the primary 3 Color.
*/
public static final ColorSetting PRIMARY3_COLOR =
FACTORY.createColorSetting("PRIMARY3_COLOR",
new Color(216,225,244));
/**
* Setting for the secondary 1 Color.
*/
public static final ColorSetting SECONDARY1_COLOR =
FACTORY.createColorSetting("SECONDARY1_COLOR",
new Color(50,68,107));
/**
* Setting for the secondary 2 Color.
*/
public static final ColorSetting SECONDARY2_COLOR =
FACTORY.createColorSetting("SECONDARY2_COLOR",
new Color(167,173,190));
/**
* Setting for the secondary 3 Color.
*/
public static final ColorSetting SECONDARY3_COLOR =
FACTORY.createColorSetting("SECONDARY3_COLOR",
new Color(199,201,209));
/**
* Setting for the window 1 Color.
*/
public static final ColorSetting WINDOW1_COLOR =
FACTORY.createColorSetting("WINDOW1_COLOR",
new Color(0,0,0));
/**
* Setting for the window 2 Color.
*/
public static final ColorSetting WINDOW2_COLOR =
FACTORY.createColorSetting("WINDOW2_COLOR",
new Color(199,201,209));
/**
* Setting for the window 3 Color.
*/
public static final ColorSetting WINDOW3_COLOR =
FACTORY.createColorSetting("WINDOW3_COLOR",
new Color(199,201,209));
/**
* Setting for the window 4 Color.
*/
public static final ColorSetting WINDOW4_COLOR =
FACTORY.createColorSetting("WINDOW4_COLOR",
new Color(0,0,0));
/**
* Setting for the window 5 Color.
*/
public static final ColorSetting WINDOW5_COLOR =
FACTORY.createColorSetting("WINDOW5_COLOR",
new Color(0,0,0));
/**
* Setting for the window 6 Color.
*/
public static final ColorSetting WINDOW6_COLOR =
FACTORY.createColorSetting("WINDOW6_COLOR",
new Color(255,255,255));
/**
* Setting for the window 7 Color.
*/
public static final ColorSetting WINDOW7_COLOR =
FACTORY.createColorSetting("WINDOW7_COLOR",
new Color(255,255,255));
/**
* Setting for the window 8 Color.
*/
public static final ColorSetting WINDOW8_COLOR =
FACTORY.createColorSetting("WINDOW8_COLOR",
new Color(0,0,0));
/**
* Setting for the window 9 Color.
*/
public static final ColorSetting WINDOW9_COLOR =
FACTORY.createColorSetting("WINDOW9_COLOR",
new Color(0,0,0));
/**
* Setting for the window 10 Color.
*/
public static final ColorSetting WINDOW10_COLOR =
FACTORY.createColorSetting("WINDOW10_COLOR",
new Color(0,0,0));
/**
* Setting for the window 11 Color.
*/
public static final ColorSetting WINDOW11_COLOR =
FACTORY.createColorSetting("WINDOW11_COLOR",
new Color(0,0,0));
/**
* Setting for the window 12 Color.
*/
public static final ColorSetting WINDOW12_COLOR =
FACTORY.createColorSetting("WINDOW12_COLOR",
new Color(199,201,209));
/**
* Setting for the table header background Color.
*/
public static final ColorSetting TABLE_HEADER_BACKGROUND_COLOR =
FACTORY.createColorSetting("TABLE_HEADER_BACKGROUND_COLOR",
new Color(117, 142, 197));
/**
* Setting for the table odd row Color Color.
*/
public static final ColorSetting TABLE_BACKGROUND_COLOR =
FACTORY.createColorSetting("TABLE_BACKGROUND_COLOR",
new Color(255,255,255));
/**
* Setting for the table even row Color.
*/
public static final ColorSetting TABLE_ALTERNATE_COLOR =
FACTORY.createColorSetting("TABLE_ALTERNATE_COLOR",
new Color(248, 248, 255));
/**
* Setting for the not sharing label Color.
*/
public static final ColorSetting NOT_SHARING_LABEL_COLOR =
FACTORY.createColorSetting("NOT_SHARING_LABEL_COLOR",
new Color(208, 0, 5));
/**
* Setting for the search result speed Color.
*/
public static final ColorSetting SEARCH_RESULT_SPEED_COLOR =
FACTORY.createColorSetting("SEARCH_RESULT_SPEED_COLOR",
new Color(7,170,0));
/**
* Setting for the search result speed Color.
*/
public static final ColorSetting SEARCH_SPAM_RESULT_COLOR =
FACTORY.createColorSetting("SEARCH_SPAM_RESAULT_COLOR",
new Color(255,125,125));
/**
* Setting for the playlist "playing song" Color.
*/
public static final ColorSetting PLAYING_SONG_COLOR =
FACTORY.createColorSetting("PLAYING_SONG_COLOR",
new Color(7,170,0));
/**
* Setting for the search ip address Color.
*/
public static final ColorSetting SEARCH_IP_COLOR =
FACTORY.createColorSetting("SEARCH_IP_COLOR",
new Color(0,0,0));
/**
* Setting for the search ip private address Color.
*/
public static final ColorSetting SEARCH_PRIVATE_IP_COLOR =
FACTORY.createColorSetting("SEARCH_PRIVATE_IP_COLOR",
new Color(255, 0, 0));
/**
* Setting for the top of the filter title color.
*/
public static final ColorSetting FILTER_TITLE_TOP_COLOR =
FACTORY.createColorSetting("SEARCH_FILTER_TITLE_TOP_COLOR",
TABLE_HEADER_BACKGROUND_COLOR.getValue());
/**
* Setting for the filter title color.
*/
public static final ColorSetting FILTER_TITLE_COLOR =
FACTORY.createColorSetting("SEARCH_FILTER_TITLE_COLOR",
TABLE_HEADER_BACKGROUND_COLOR.getValue());
/**
* Setting for the background grid color.
*/
public static final ColorSetting SEARCH_GRID_COLOR =
FACTORY.createColorSetting("SEARCH_GRID_COLOR",
new Color(0, 0, 0));
/**
* Setting for the top search panel background color.
*/
public static final ColorSetting SEARCH_PANEL_BG_1 =
FACTORY.createColorSetting("SEARCH_PANEL_BG_1",
TABLE_HEADER_BACKGROUND_COLOR.getValue());
/**
* Setting for the bottom search panel background color.
*/
public static final ColorSetting SEARCH_PANEL_BG_2 =
FACTORY.createColorSetting("SEARCH_PANEL_BG_2",
TABLE_HEADER_BACKGROUND_COLOR.getValue());
/**
* The current theme version.
*/
public static final IntSetting VERSION =
FACTORY.createIntSetting("THEME_VERSION", 0);
static {
fixFontSettings();
}
/*
public static void main(String[] args) {
ThemeSettings.reload();
}
*/
}