/*
* This file is part of muCommander, http://www.mucommander.com
* Copyright (C) 2002-2016 Maxence Bernard
*
* muCommander 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 3 of the License, or
* (at your option) any later version.
*
* muCommander 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, see <http://www.gnu.org/licenses/>.
*/
package com.mucommander.ui.theme;
import java.awt.*;
import java.util.WeakHashMap;
/**
* Contains cached colors and fonts for current theme.
*
* @author Mariusz Jakubowski
*/
public class ThemeCache implements ThemeListener {
// - Color definitions -----------------------------------------------------------
// -------------------------------------------------------------------------------
public static Color[][][] foregroundColors;
public static Color[][] backgroundColors;
public static Color unmatchedForeground;
public static Color unmatchedBackground;
public static Color activeOutlineColor;
public static Color inactiveOutlineColor;
public static final int NORMAL = 0;
public static final int SELECTED = 1;
public static final int ALTERNATE = 2;
public static final int SECONDARY = 3;
public static final int INACTIVE = 0;
public static final int ACTIVE = 1;
public static final int HIDDEN_FILE = 0;
public static final int FOLDER = 1;
public static final int ARCHIVE = 2;
public static final int SYMLINK = 3;
public static final int MARKED = 4;
public static final int PLAIN_FILE = 5;
// - Font definitions ------------------------------------------------------------
// -------------------------------------------------------------------------------
public static Font tableFont;
/** Theme cache instance */
public static final ThemeCache instance = new ThemeCache();
// - Initialisation --------------------------------------------------------------
// -------------------------------------------------------------------------------
static {
foregroundColors = new Color[2][2][6];
backgroundColors = new Color[2][4];
// Active background colors.
backgroundColors[ACTIVE][NORMAL] = ThemeManager.getCurrentColor(Theme.FILE_TABLE_BACKGROUND_COLOR);
backgroundColors[ACTIVE][SELECTED] = ThemeManager.getCurrentColor(Theme.FILE_TABLE_SELECTED_BACKGROUND_COLOR);
backgroundColors[ACTIVE][ALTERNATE] = ThemeManager.getCurrentColor(Theme.FILE_TABLE_ALTERNATE_BACKGROUND_COLOR);
backgroundColors[ACTIVE][SECONDARY] = ThemeManager.getCurrentColor(Theme.FILE_TABLE_SELECTED_SECONDARY_BACKGROUND_COLOR);
// Inactive background colors.
backgroundColors[INACTIVE][NORMAL] = ThemeManager.getCurrentColor(Theme.FILE_TABLE_INACTIVE_BACKGROUND_COLOR);
backgroundColors[INACTIVE][SELECTED] = ThemeManager.getCurrentColor(Theme.FILE_TABLE_INACTIVE_SELECTED_BACKGROUND_COLOR);
backgroundColors[INACTIVE][ALTERNATE] = ThemeManager.getCurrentColor(Theme.FILE_TABLE_INACTIVE_ALTERNATE_BACKGROUND_COLOR);
backgroundColors[INACTIVE][SECONDARY] = ThemeManager.getCurrentColor(Theme.FILE_TABLE_INACTIVE_SELECTED_SECONDARY_BACKGROUND_COLOR);
// Normal foreground foregroundColors.
foregroundColors[ACTIVE][NORMAL][HIDDEN_FILE] = ThemeManager.getCurrentColor(Theme.HIDDEN_FILE_FOREGROUND_COLOR);
foregroundColors[ACTIVE][NORMAL][FOLDER] = ThemeManager.getCurrentColor(Theme.FOLDER_FOREGROUND_COLOR);
foregroundColors[ACTIVE][NORMAL][ARCHIVE] = ThemeManager.getCurrentColor(Theme.ARCHIVE_FOREGROUND_COLOR);
foregroundColors[ACTIVE][NORMAL][SYMLINK] = ThemeManager.getCurrentColor(Theme.SYMLINK_FOREGROUND_COLOR);
foregroundColors[ACTIVE][NORMAL][MARKED] = ThemeManager.getCurrentColor(Theme.MARKED_FOREGROUND_COLOR);
foregroundColors[ACTIVE][NORMAL][PLAIN_FILE] = ThemeManager.getCurrentColor(Theme.FILE_FOREGROUND_COLOR);
// Normal unfocused foreground foregroundColors.
foregroundColors[INACTIVE][NORMAL][HIDDEN_FILE] = ThemeManager.getCurrentColor(Theme.HIDDEN_FILE_INACTIVE_FOREGROUND_COLOR);
foregroundColors[INACTIVE][NORMAL][FOLDER] = ThemeManager.getCurrentColor(Theme.FOLDER_INACTIVE_FOREGROUND_COLOR);
foregroundColors[INACTIVE][NORMAL][ARCHIVE] = ThemeManager.getCurrentColor(Theme.ARCHIVE_INACTIVE_FOREGROUND_COLOR);
foregroundColors[INACTIVE][NORMAL][SYMLINK] = ThemeManager.getCurrentColor(Theme.SYMLINK_INACTIVE_FOREGROUND_COLOR);
foregroundColors[INACTIVE][NORMAL][MARKED] = ThemeManager.getCurrentColor(Theme.MARKED_INACTIVE_FOREGROUND_COLOR);
foregroundColors[INACTIVE][NORMAL][PLAIN_FILE] = ThemeManager.getCurrentColor(Theme.FILE_INACTIVE_FOREGROUND_COLOR);
// Selected foreground foregroundColors.
foregroundColors[ACTIVE][SELECTED][HIDDEN_FILE] = ThemeManager.getCurrentColor(Theme.HIDDEN_FILE_SELECTED_FOREGROUND_COLOR);
foregroundColors[ACTIVE][SELECTED][FOLDER] = ThemeManager.getCurrentColor(Theme.FOLDER_SELECTED_FOREGROUND_COLOR);
foregroundColors[ACTIVE][SELECTED][ARCHIVE] = ThemeManager.getCurrentColor(Theme.ARCHIVE_SELECTED_FOREGROUND_COLOR);
foregroundColors[ACTIVE][SELECTED][SYMLINK] = ThemeManager.getCurrentColor(Theme.SYMLINK_SELECTED_FOREGROUND_COLOR);
foregroundColors[ACTIVE][SELECTED][MARKED] = ThemeManager.getCurrentColor(Theme.MARKED_SELECTED_FOREGROUND_COLOR);
foregroundColors[ACTIVE][SELECTED][PLAIN_FILE] = ThemeManager.getCurrentColor(Theme.FILE_SELECTED_FOREGROUND_COLOR);
// Selected unfocused foreground foregroundColors.
foregroundColors[INACTIVE][SELECTED][HIDDEN_FILE] = ThemeManager.getCurrentColor(Theme.HIDDEN_FILE_INACTIVE_SELECTED_FOREGROUND_COLOR);
foregroundColors[INACTIVE][SELECTED][FOLDER] = ThemeManager.getCurrentColor(Theme.FOLDER_INACTIVE_SELECTED_FOREGROUND_COLOR);
foregroundColors[INACTIVE][SELECTED][ARCHIVE] = ThemeManager.getCurrentColor(Theme.ARCHIVE_INACTIVE_SELECTED_FOREGROUND_COLOR);
foregroundColors[INACTIVE][SELECTED][SYMLINK] = ThemeManager.getCurrentColor(Theme.SYMLINK_INACTIVE_SELECTED_FOREGROUND_COLOR);
foregroundColors[INACTIVE][SELECTED][MARKED] = ThemeManager.getCurrentColor(Theme.MARKED_INACTIVE_SELECTED_FOREGROUND_COLOR);
foregroundColors[INACTIVE][SELECTED][PLAIN_FILE] = ThemeManager.getCurrentColor(Theme.FILE_INACTIVE_SELECTED_FOREGROUND_COLOR);
unmatchedForeground = ThemeManager.getCurrentColor(Theme.FILE_TABLE_UNMATCHED_FOREGROUND_COLOR);
unmatchedBackground = ThemeManager.getCurrentColor(Theme.FILE_TABLE_UNMATCHED_BACKGROUND_COLOR);
tableFont = ThemeManager.getCurrentFont(Theme.FILE_TABLE_FONT);
activeOutlineColor = ThemeManager.getCurrentColor(Theme.FILE_TABLE_SELECTED_OUTLINE_COLOR);
inactiveOutlineColor = ThemeManager.getCurrentColor(Theme.FILE_TABLE_INACTIVE_SELECTED_OUTLINE_COLOR);
ThemeManager.addCurrentThemeListener(instance);
}
/** Listeners. */
private static WeakHashMap<ThemeListener, ?> listeners = new WeakHashMap<ThemeListener, Object>();
private ThemeCache() {
}
public static void addThemeListener(ThemeListener listener) {
listeners.put(listener, null);
}
public static void removeThemeListener(ThemeListener listener) {
listeners.remove(listener);
}
private static void fireColorChanged(ColorChangedEvent event) {
for(ThemeListener listener : listeners.keySet())
listener.colorChanged(event);
}
private static void fireFontChanged(FontChangedEvent event) {
for(ThemeListener listener : listeners.keySet())
listener.fontChanged(event);
}
// - Theme listening -------------------------------------------------------------
// -------------------------------------------------------------------------------
/**
* Receives theme color changes notifications.
*/
public void colorChanged(ColorChangedEvent event) {
switch(event.getColorId()) {
// Plain file color.
case Theme.FILE_FOREGROUND_COLOR:
foregroundColors[ACTIVE][NORMAL][PLAIN_FILE] = event.getColor();
break;
// Selected file color.
case Theme.FILE_SELECTED_FOREGROUND_COLOR:
foregroundColors[ACTIVE][SELECTED][PLAIN_FILE] = event.getColor();
break;
// Hidden files.
case Theme.HIDDEN_FILE_FOREGROUND_COLOR:
foregroundColors[ACTIVE][NORMAL][HIDDEN_FILE] = event.getColor();
break;
// Selected hidden files.
case Theme.HIDDEN_FILE_SELECTED_FOREGROUND_COLOR:
foregroundColors[ACTIVE][SELECTED][HIDDEN_FILE] = event.getColor();
break;
// Folders.
case Theme.FOLDER_FOREGROUND_COLOR:
foregroundColors[ACTIVE][NORMAL][FOLDER] = event.getColor();
break;
// Selected folders.
case Theme.FOLDER_SELECTED_FOREGROUND_COLOR:
foregroundColors[ACTIVE][SELECTED][FOLDER] = event.getColor();
break;
// Archives.
case Theme.ARCHIVE_FOREGROUND_COLOR:
foregroundColors[ACTIVE][NORMAL][ARCHIVE] = event.getColor();
break;
// Selected archives.
case Theme.ARCHIVE_SELECTED_FOREGROUND_COLOR:
foregroundColors[ACTIVE][SELECTED][ARCHIVE] = event.getColor();
break;
// Symlinks.
case Theme.SYMLINK_FOREGROUND_COLOR:
foregroundColors[ACTIVE][NORMAL][SYMLINK] = event.getColor();
break;
// Selected symlinks.
case Theme.SYMLINK_SELECTED_FOREGROUND_COLOR:
foregroundColors[ACTIVE][SELECTED][SYMLINK] = event.getColor();
break;
// Marked files.
case Theme.MARKED_FOREGROUND_COLOR:
foregroundColors[ACTIVE][NORMAL][MARKED] = event.getColor();
break;
// Selected marked files.
case Theme.MARKED_SELECTED_FOREGROUND_COLOR:
foregroundColors[ACTIVE][SELECTED][MARKED] = event.getColor();
break;
// Plain file color.
case Theme.FILE_INACTIVE_FOREGROUND_COLOR:
foregroundColors[INACTIVE][NORMAL][PLAIN_FILE] = event.getColor();
break;
// Selected file color.
case Theme.FILE_INACTIVE_SELECTED_FOREGROUND_COLOR:
foregroundColors[INACTIVE][SELECTED][PLAIN_FILE] = event.getColor();
break;
// Hidden files.
case Theme.HIDDEN_FILE_INACTIVE_FOREGROUND_COLOR:
foregroundColors[INACTIVE][NORMAL][HIDDEN_FILE] = event.getColor();
break;
// Selected hidden files.
case Theme.HIDDEN_FILE_INACTIVE_SELECTED_FOREGROUND_COLOR:
foregroundColors[INACTIVE][SELECTED][HIDDEN_FILE] = event.getColor();
break;
// Folders.
case Theme.FOLDER_INACTIVE_FOREGROUND_COLOR:
foregroundColors[INACTIVE][NORMAL][FOLDER] = event.getColor();
break;
// Selected folders.
case Theme.FOLDER_INACTIVE_SELECTED_FOREGROUND_COLOR:
foregroundColors[INACTIVE][SELECTED][FOLDER] = event.getColor();
break;
// Archives.
case Theme.ARCHIVE_INACTIVE_FOREGROUND_COLOR:
foregroundColors[INACTIVE][NORMAL][ARCHIVE] = event.getColor();
break;
// Selected archives.
case Theme.ARCHIVE_INACTIVE_SELECTED_FOREGROUND_COLOR:
foregroundColors[INACTIVE][SELECTED][ARCHIVE] = event.getColor();
break;
// Symlinks.
case Theme.SYMLINK_INACTIVE_FOREGROUND_COLOR:
foregroundColors[INACTIVE][NORMAL][SYMLINK] = event.getColor();
break;
// Selected symlinks.
case Theme.SYMLINK_INACTIVE_SELECTED_FOREGROUND_COLOR:
foregroundColors[INACTIVE][SELECTED][SYMLINK] = event.getColor();
break;
// Marked files.
case Theme.MARKED_INACTIVE_FOREGROUND_COLOR:
foregroundColors[INACTIVE][NORMAL][MARKED] = event.getColor();
break;
// Selected marked files.
case Theme.MARKED_INACTIVE_SELECTED_FOREGROUND_COLOR:
foregroundColors[INACTIVE][SELECTED][MARKED] = event.getColor();
break;
// Unmatched foreground
case Theme.FILE_TABLE_UNMATCHED_FOREGROUND_COLOR:
unmatchedForeground = event.getColor();
break;
// Unmached background
case Theme.FILE_TABLE_UNMATCHED_BACKGROUND_COLOR:
unmatchedBackground = event.getColor();
break;
// Active normal background.
case Theme.FILE_TABLE_BACKGROUND_COLOR:
backgroundColors[ACTIVE][NORMAL] = event.getColor();
break;
// Active selected background.
case Theme.FILE_TABLE_SELECTED_BACKGROUND_COLOR:
backgroundColors[ACTIVE][SELECTED] = event.getColor();
break;
// Active alternate background.
case Theme.FILE_TABLE_ALTERNATE_BACKGROUND_COLOR:
backgroundColors[ACTIVE][ALTERNATE] = event.getColor();
break;
// Inactive normal background.
case Theme.FILE_TABLE_INACTIVE_BACKGROUND_COLOR:
backgroundColors[INACTIVE][NORMAL] = event.getColor();
break;
// Inactive selected background.
case Theme.FILE_TABLE_INACTIVE_SELECTED_BACKGROUND_COLOR:
backgroundColors[INACTIVE][SELECTED] = event.getColor();
break;
// Inactive alternate background.
case Theme.FILE_TABLE_INACTIVE_ALTERNATE_BACKGROUND_COLOR:
backgroundColors[INACTIVE][ALTERNATE] = event.getColor();
break;
// Active selection outline.
case Theme.FILE_TABLE_SELECTED_OUTLINE_COLOR:
activeOutlineColor = event.getColor();
break;
// Inactive selection outline.
case Theme.FILE_TABLE_INACTIVE_SELECTED_OUTLINE_COLOR:
inactiveOutlineColor = event.getColor();
break;
// Secondary background color.
case Theme.FILE_TABLE_SELECTED_SECONDARY_BACKGROUND_COLOR:
backgroundColors[ACTIVE][SECONDARY] = event.getColor();
break;
// Inactive secondary background color.
case Theme.FILE_TABLE_INACTIVE_SELECTED_SECONDARY_BACKGROUND_COLOR:
backgroundColors[INACTIVE][SECONDARY] = event.getColor();
break;
default:
return;
}
fireColorChanged(event);
}
/**
* Receives theme font changes notifications.
*/
public void fontChanged(FontChangedEvent event) {
switch (event.getFontId()) {
case Theme.FILE_TABLE_FONT:
tableFont = event.getFont();
break;
default:
return;
}
fireFontChanged(event);
}
}