/*
 * Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved.
 *  
 * JTattoo is multiple licensed. If your are an open source developer you can use
 * it under the terms and conditions of the GNU General Public License version 2.0
 * or later as published by the Free Software Foundation.
 *  
 * see: gpl-2.0.txt
 * 
 * If you pay for a license you will become a registered user who could use the
 * software under the terms and conditions of the GNU Lesser General Public License
 * version 2.0 or later with classpath exception as published by the Free Software
 * Foundation.
 * 
 * see: lgpl-2.0.txt
 * see: classpath-exception.txt
 * 
 * Registered users could also use JTattoo under the terms and conditions of the 
 * Apache License, Version 2.0 as published by the Apache Software Foundation.
 *  
 * see: APACHE-LICENSE-2.0.txt
 */
package com.jtattoo.plaf;

import java.awt.Color;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.plaf.ColorUIResource;
import javax.swing.plaf.InsetsUIResource;
import javax.swing.plaf.metal.MetalLookAndFeel;
import javax.swing.plaf.metal.MetalTheme;

/**
 * @author Michael Hagen
 */
abstract public class AbstractLookAndFeel extends MetalLookAndFeel {

    // Workaround to avoid a bug in the java 1.3 VM
    static {
        try {
            if (JTattooUtilities.getJavaVersion() < 1.4) {
                UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
            }
        } catch (Exception ex) {
        }
    }

    protected static String currentThemeName = "abstractTheme";

    private static AbstractTheme myTheme = null;

    abstract public AbstractBorderFactory getBorderFactory();

    abstract public AbstractIconFactory getIconFactory();

    protected void initSystemColorDefaults(UIDefaults table) {
        Object[] systemColors = {
            "desktop", getDesktopColor(), // Color of the desktop background

            "activeCaption", getWindowTitleBackgroundColor(), // Color for captions (title bars) when they are active.
            "activeCaptionLight", getWindowTitleColorLight(),
            "activeCaptionDark", getWindowTitleColorDark(),
            "activeCaptionText", getWindowTitleForegroundColor(), // Text color for text in captions (title bars).
            "activeCaptionBorder", getWindowBorderColor(), // Border color for caption (title bar) window borders.

            "inactiveCaption", getWindowInactiveTitleBackgroundColor(), // Color for captions (title bars) when not active.
            "inactiveCaptionLight", getWindowInactiveTitleColorLight(), //
            "inactiveCaptionDark", getWindowInactiveTitleColorDark(), //
            "inactiveCaptionText", getWindowInactiveTitleForegroundColor(), // Text color for text in inactive captions (title bars).
            "inactiveCaptionBorder", getWindowInactiveBorderColor(), // Border color for inactive caption (title bar) window borders.

            "window", getInputBackgroundColor(), // Default color for the interior of windows, list, tree etc
            "windowBorder", getBackgroundColor(), // ???
            "windowText", getControlForegroundColor(), // ???

            "menu", getMenuBackgroundColor(), // Background color for menus
            "menuText", getMenuForegroundColor(), // Text color for menus
            "MenuBar.rolloverEnabled", Boolean.TRUE,
            "text", getBackgroundColor(), // Text background color
            "textText", getControlForegroundColor(), // Text foreground color
            "textHighlight", getSelectionBackgroundColor(), // Text background color when selected
            "textHighlightText", getSelectionForegroundColor(), // Text color when selected
            "textInactiveText", getDisabledForegroundColor(), // Text color when disabled

            "control", getControlBackgroundColor(), // Default color for controls (buttons, sliders, etc)
            "controlText", getControlForegroundColor(), // Default color for text in controls
            "controlHighlight", getControlHighlightColor(), // Specular highlight (opposite of the shadow)
            "controlLtHighlight", getControlHighlightColor(), // Highlight color for controls
            "controlShadow", getControlShadowColor(), // Shadow color for controls
            "controlDkShadow", getControlDarkShadowColor(), // Dark shadow color for controls

            "scrollbar", getControlBackgroundColor(), // Scrollbar background (usually the "track")
            "info", getTooltipBackgroundColor(), // ToolTip Background
            "infoText", getTooltipForegroundColor() // ToolTip Text
        };

        for (int i = 0; i < systemColors.length; i += 2) {
            table.put((String) systemColors[i], systemColors[i + 1]);
        }
    }

    protected void initComponentDefaults(UIDefaults table) {
        super.initComponentDefaults(table);

        BaseBorders.initDefaults();
        BaseIcons.initDefaults();

        Object textFieldBorder = getBorderFactory().getTextFieldBorder();
        Object comboBoxBorder = getBorderFactory().getComboBoxBorder();
        Object scrollPaneBorder = getBorderFactory().getScrollPaneBorder();
        Object tableScrollPaneBorder = getBorderFactory().getTableScrollPaneBorder();
        Object tabbedPaneBorder = getBorderFactory().getTabbedPaneBorder();
        Object buttonBorder = getBorderFactory().getButtonBorder();
        Object toggleButtonBorder = getBorderFactory().getToggleButtonBorder();
        Object titledBorderBorder = new UIDefaults.ProxyLazyValue("javax.swing.plaf.BorderUIResource$LineBorderUIResource", new Object[]{getFrameColor()});
        Object menuBarBorder = getBorderFactory().getMenuBarBorder();
        Object popupMenuBorder = getBorderFactory().getPopupMenuBorder();
        Object menuItemBorder = getBorderFactory().getMenuItemBorder();
        Object toolBarBorder = getBorderFactory().getToolBarBorder();
        Object progressBarBorder = getBorderFactory().getProgressBarBorder();
        Object toolTipBorder = new UIDefaults.ProxyLazyValue("javax.swing.plaf.BorderUIResource$LineBorderUIResource", new Object[]{getFrameColor()});
        Object focusCellHighlightBorder = new UIDefaults.ProxyLazyValue("javax.swing.plaf.BorderUIResource$LineBorderUIResource", new Object[]{getFocusCellColor()});
        Object optionPaneBorder = BorderFactory.createEmptyBorder(0, 0, 0, 0);
        Object optionPaneMessageAreaBorder = BorderFactory.createEmptyBorder(8, 8, 8, 8);
        Object optionPaneButtonAreaBorder = BorderFactory.createEmptyBorder(0, 8, 8, 8);
        Object windowBorder = getBorderFactory().getInternalFrameBorder();

        Color c = getBackgroundColor();
        ColorUIResource progressBarBackground = new ColorUIResource(ColorHelper.brighter(c, 20));

        // DEFAULTS TABLE
        Object[] defaults = {
            "controlTextFont", getControlTextFont(),
            "systemTextFont ", getSystemTextFont(),
            "userTextFont", getUserTextFont(),
            "menuTextFont", getMenuTextFont(),
            "windowTitleFont", getWindowTitleFont(),
            "subTextFont", getSubTextFont(),
            "Label.font", getUserTextFont(),
            "Label.background", getBackgroundColor(),
            "Label.foreground", getForegroundColor(),
            "Label.disabledText", getDisabledForegroundColor(),
            "Label.disabledShadow", getWhite(),
            // Text (Note: many are inherited)
            "TextField.border", textFieldBorder,
            "TextField.foreground", getInputForegroundColor(),
            "TextField.background", getInputBackgroundColor(),
            "TextField.disabledForeground", getDisabledForegroundColor(),
            "TextField.disabledBackground", getDisabledBackgroundColor(),
            "TextField.inactiveForeground", getDisabledForegroundColor(),
            "TextField.inactiveBackground", getDisabledBackgroundColor(),
            "TextArea.foreground", getInputForegroundColor(),
            "TextArea.background", getInputBackgroundColor(),
            "TextArea.disabledForeground", getDisabledForegroundColor(),
            "TextArea.disabledBackground", getDisabledBackgroundColor(),
            "TextArea.inactiveForeground", getDisabledForegroundColor(),
            "TextArea.inactiveBackground", getDisabledBackgroundColor(),
            "EditorPane.foreground", getInputForegroundColor(),
            "EditorPane.background", getInputBackgroundColor(),
            "EditorPane.disabledForeground", getDisabledForegroundColor(),
            "EditorPane.disabledBackground", getDisabledBackgroundColor(),
            "EditorPane.inactiveForeground", getDisabledForegroundColor(),
            "EditorPane.inactiveBackground", getDisabledBackgroundColor(),
            "FormattedTextField.border", textFieldBorder,
            "FormattedTextField.foreground", getInputForegroundColor(),
            "FormattedTextField.background", getInputBackgroundColor(),
            "FormattedTextField.disabledForeground", getDisabledForegroundColor(),
            "FormattedTextField.disabledBackground", getDisabledBackgroundColor(),
            "FormattedTextField.inactiveForeground", getDisabledForegroundColor(),
            "FormattedTextField.inactiveBackground", getDisabledBackgroundColor(),
            "PasswordField.border", textFieldBorder,
            "PasswordField.foreground", getInputForegroundColor(),
            "PasswordField.background", getInputBackgroundColor(),
            "PasswordField.disabledForeground", getDisabledForegroundColor(),
            "PasswordField.disabledBackground", getDisabledBackgroundColor(),
            "PasswordField.inactiveForeground", getDisabledForegroundColor(),
            "PasswordField.inactiveBackground", getDisabledBackgroundColor(),
            // Buttons
            "Button.background", getButtonBackgroundColor(),
            "Button.foreground", getButtonForegroundColor(),
            "Button.disabledText", getDisabledForegroundColor(),
            "Button.disabledShadow", getWhite(),
            "Button.select", getSelectionBackgroundColor(),
            "Button.border", buttonBorder,
            "Button.frame", getFrameColor(),
            "Button.focus", getFocusColor(),
            "Button.rolloverColor", getTheme().getRolloverColor(),
            "Button.rolloverForeground", getTheme().getRolloverForegroundColor(),
            "CheckBox.font", getUserTextFont(),
            "CheckBox.background", getBackgroundColor(),
            "CheckBox.foreground", getForegroundColor(),
            "CheckBox.disabledText", getDisabledForegroundColor(),
            "CheckBox.disabledShadow", getWhite(),
            "Checkbox.select", getSelectionBackgroundColor(),
            "CheckBox.focus", getFocusColor(),
            "CheckBox.icon", getIconFactory().getCheckBoxIcon(),
            "RadioButton.font", getUserTextFont(),
            "RadioButton.background", getBackgroundColor(),
            "RadioButton.foreground", getForegroundColor(),
            "RadioButton.disabledText", getDisabledForegroundColor(),
            "RadioButton.disabledShadow", getWhite(),
            "RadioButton.select", getSelectionBackgroundColor(),
            "RadioButton.icon", getIconFactory().getRadioButtonIcon(),
            "RadioButton.focus", getFocusColor(),
            "ToggleButton.background", getButtonBackgroundColor(),
            "ToggleButton.foreground", getButtonForegroundColor(),
            "ToggleButton.select", getSelectionBackgroundColor(),
            "ToggleButton.text", getButtonForegroundColor(),
            "ToggleButton.disabledText", getDisabledForegroundColor(),
            "ToggleButton.disabledShadow", getWhite(),
            "ToggleButton.disabledSelectedText", getDisabledForegroundColor(),
            "ToggleButton.disabledBackground", getButtonBackgroundColor(),
            "ToggleButton.disabledSelectedBackground", getSelectionBackgroundColor(),
            "ToggleButton.focus", getFocusColor(),
            "ToggleButton.border", toggleButtonBorder,
            // ToolTip
            "ToolTip.border", toolTipBorder,
            "ToolTip.foreground", getTooltipForegroundColor(),
            "ToolTip.background", getTooltipBackgroundColor(),
            // Slider
            "Slider.border", null,
            "Slider.foreground", getFrameColor(),
            "Slider.background", getBackgroundColor(),
            "Slider.focus", getFocusColor(),
            "Slider.focusInsets", new InsetsUIResource(0, 0, 0, 0),
            "Slider.trackWidth", 7,
            "Slider.majorTickLength", 6,
            // Progress Bar
            "ProgressBar.border", progressBarBorder,
            "ProgressBar.background", progressBarBackground,
            "ProgressBar.selectionForeground", getSelectionForegroundColor(),
            "ProgressBar.selectionBackground", getForegroundColor(),
            // Combo Box
            "ComboBox.border", comboBoxBorder,
            "ComboBox.background", getInputBackgroundColor(),
            "ComboBox.foreground", getInputForegroundColor(),
            "ComboBox.selectionBackground", getSelectionBackgroundColor(),
            "ComboBox.selectionForeground", getSelectionForegroundColor(),
            "ComboBox.selectionBorderColor", getFocusColor(),
            "ComboBox.disabledBackground", getDisabledBackgroundColor(),
            "ComboBox.disabledForeground", getDisabledForegroundColor(),
            "ComboBox.listBackground", getInputBackgroundColor(),
            "ComboBox.listForeground", getInputForegroundColor(),
            "ComboBox.font", getUserTextFont(),
            // Panel
            "Panel.foreground", getForegroundColor(),
            "Panel.background", getBackgroundColor(),
            "Panel.darkBackground", getTheme().getBackgroundColorDark(),
            "Panel.lightBackground", getTheme().getBackgroundColorLight(),
            "Panel.alterBackground", getTheme().getAlterBackgroundColor(),
            "Panel.font", getUserTextFont(),
            // RootPane
            "RootPane.frameBorder", windowBorder,
            "RootPane.plainDialogBorder", windowBorder,
            "RootPane.informationDialogBorder", windowBorder,
            "RootPane.errorDialogBorder", windowBorder,
            "RootPane.colorChooserDialogBorder", windowBorder,
            "RootPane.fileChooserDialogBorder", windowBorder,
            "RootPane.questionDialogBorder", windowBorder,
            "RootPane.warningDialogBorder", windowBorder,
            // InternalFrame
            "InternalFrame.border", getBorderFactory().getInternalFrameBorder(),
            "InternalFrame.font", getWindowTitleFont(),
            "InternalFrame.paletteBorder", getBorderFactory().getPaletteBorder(),
            "InternalFrame.paletteTitleHeight", 11,
            "InternalFrame.paletteCloseIcon", getIconFactory().getPaletteCloseIcon(),
            "InternalFrame.icon", getIconFactory().getMenuIcon(),
            "InternalFrame.iconifyIcon", getIconFactory().getIconIcon(),
            "InternalFrame.maximizeIcon", getIconFactory().getMaxIcon(),
            "InternalFrame.altMaximizeIcon", getIconFactory().getMinIcon(),
            "InternalFrame.minimizeIcon", getIconFactory().getMinIcon(),
            "InternalFrame.closeIcon", getIconFactory().getCloseIcon(),
            // Titled Border
            "TitledBorder.titleColor", getForegroundColor(),
            "TitledBorder.border", titledBorderBorder,
            // List
            "List.focusCellHighlightBorder", focusCellHighlightBorder,
            "List.font", getUserTextFont(),
            "List.foreground", getInputForegroundColor(),
            "List.background", getInputBackgroundColor(),
            "List.selectionForeground", getSelectionForegroundColor(),
            "List.selectionBackground", getSelectionBackgroundColor(),
            "List.disabledForeground", getDisabledForegroundColor(),
            "List.disabledBackground", getDisabledBackgroundColor(),
            // ScrollBar
            "ScrollBar.background", getControlBackgroundColor(),
            "ScrollBar.highlight", getControlHighlightColor(),
            "ScrollBar.shadow", getControlShadowColor(),
            "ScrollBar.darkShadow", getControlDarkShadowColor(),
            "ScrollBar.thumb", getControlBackgroundColor(),
            "ScrollBar.thumbShadow", getControlShadowColor(),
            "ScrollBar.thumbHighlight", getControlHighlightColor(),
            "ScrollBar.width", 17,
            "ScrollBar.allowsAbsolutePositioning", Boolean.TRUE,
            // ScrollPane
            "ScrollPane.border", scrollPaneBorder,
            "ScrollPane.foreground", getForegroundColor(),
            "ScrollPane.background", getBackgroundColor(),
            // Viewport
            "Viewport.foreground", getForegroundColor(),
            "Viewport.background", getBackgroundColor(),
            "Viewport.font", getUserTextFont(),
            // Tabbed Pane
            "TabbedPane.boder", tabbedPaneBorder,
            "TabbedPane.background", getBackgroundColor(),
            "TabbedPane.tabAreaBackground", getTabAreaBackgroundColor(),
            "TabbedPane.unselectedBackground", getControlColorDark(),
            "TabbedPane.foreground", getControlForegroundColor(),
            "TabbedPane.selected", getBackgroundColor(),
            "TabbedPane.selectedForeground", getTabSelectionForegroundColor(),
            "TabbedPane.tabAreaInsets", new InsetsUIResource(5, 5, 5, 5),
            "TabbedPane.contentBorderInsets", new InsetsUIResource(0, 0, 0, 0),
            "TabbedPane.tabInsets", new InsetsUIResource(1, 6, 1, 6),
            "TabbedPane.focus", getFocusColor(),
            // TabbedPane ScrollButton
            "TabbedPane.selected", getButtonBackgroundColor(),
            "TabbedPane.shadow", new ColorUIResource(180, 180, 180),
            "TabbedPane.darkShadow", new ColorUIResource(120, 120, 120),
            "TabbedPane.highlight", new ColorUIResource(Color.white),
            // Tab Colors in Netbeans
            "tab_unsel_fill", getControlBackgroundColor(),
            "tab_sel_fill", getControlBackgroundColor(),
            // Table
            "Table.focusCellHighlightBorder", focusCellHighlightBorder,
            "Table.scrollPaneBorder", tableScrollPaneBorder,
            "Table.foreground", getInputForegroundColor(),
            "Table.background", getInputBackgroundColor(),
            "Table.gridColor", getGridColor(),
            "TableHeader.foreground", getControlForegroundColor(),
            "TableHeader.background", getBackgroundColor(),
            "TableHeader.cellBorder", getBorderFactory().getTableHeaderBorder(),
            // MenuBar
            "MenuBar.border", menuBarBorder,
            "MenuBar.foreground", getMenuForegroundColor(),
            "MenuBar.background", getMenuBackgroundColor(),
            // Menu
            "Menu.border", menuItemBorder,
            "Menu.borderPainted", Boolean.TRUE,
            "Menu.foreground", getMenuForegroundColor(),
            "Menu.background", getMenuBackgroundColor(),
            "Menu.selectionForeground", getMenuSelectionForegroundColor(),
            "Menu.selectionBackground", getMenuSelectionBackgroundColor(),
            "Menu.disabledForeground", getDisabledForegroundColor(),
            "Menu.acceleratorForeground", getMenuForegroundColor(),
            "Menu.acceleratorSelectionForeground", getMenuSelectionForegroundColor(),
            "Menu.arrowIcon", getIconFactory().getMenuArrowIcon(),
            // Popup Menu
            "PopupMenu.background", getMenuBackgroundColor(),
            "PopupMenu.border", popupMenuBorder,
            // Menu Item
            "MenuItem.border", menuItemBorder,
            "MenuItem.borderPainted", Boolean.TRUE,
            "MenuItem.foreground", getMenuForegroundColor(),
            "MenuItem.background", getMenuBackgroundColor(),
            "MenuItem.selectionForeground", getMenuSelectionForegroundColor(),
            "MenuItem.selectionBackground", getMenuSelectionBackgroundColor(),
            "MenuItem.disabledForeground", getDisabledForegroundColor(),
            "MenuItem.disabledShadow", getWhite(),
            "MenuItem.acceleratorForeground", getMenuForegroundColor(),
            "MenuItem.acceleratorSelectionForeground", getMenuSelectionForegroundColor(),
            "CheckBoxMenuItem.border", menuItemBorder,
            "CheckBoxMenuItem.borderPainted", Boolean.TRUE,
            "CheckBoxMenuItem.foreground", getMenuForegroundColor(),
            "CheckBoxMenuItem.background", getMenuBackgroundColor(),
            "CheckBoxMenuItem.selectionForeground", getMenuSelectionForegroundColor(),
            "CheckBoxMenuItem.selectionBackground", getMenuSelectionBackgroundColor(),
            "CheckBoxMenuItem.disabledForeground", getDisabledForegroundColor(),
            "CheckBoxMenuItem.disabledShadow", getWhite(),
            "CheckBoxMenuItem.acceleratorForeground", getMenuForegroundColor(),
            "CheckBoxMenuItem.acceleratorSelectionForeground", getMenuSelectionForegroundColor(),
            "CheckBoxMenuItem.checkIcon", getIconFactory().getMenuCheckBoxIcon(),
            "RadioButtonMenuItem.border", menuItemBorder,
            "RadioButtonMenuItem.borderPainted", Boolean.TRUE,
            "RadioButtonMenuItem.foreground", getMenuForegroundColor(),
            "RadioButtonMenuItem.background", getMenuBackgroundColor(),
            "RadioButtonMenuItem.selectionForeground", getMenuSelectionForegroundColor(),
            "RadioButtonMenuItem.selectionBackground", getMenuSelectionBackgroundColor(),
            "RadioButtonMenuItem.disabledForeground", getDisabledForegroundColor(),
            "RadioButtonMenuItem.disabledShadow", getWhite(),
            "RadioButtonMenuItem.acceleratorForeground", getMenuForegroundColor(),
            "RadioButtonMenuItem.acceleratorSelectionForeground", getMenuSelectionForegroundColor(),
            "RadioButtonMenuItem.checkIcon", getIconFactory().getMenuRadioButtonIcon(),
            // OptionPane.
            "OptionPane.errorIcon", getIconFactory().getOptionPaneErrorIcon(),
            "OptionPane.informationIcon", getIconFactory().getOptionPaneInformationIcon(),
            "OptionPane.warningIcon", getIconFactory().getOptionPaneWarningIcon(),
            "OptionPane.questionIcon", getIconFactory().getOptionPaneQuestionIcon(),
            "OptionPane.border", optionPaneBorder,
            "OptionPane.messageAreaBorder", optionPaneMessageAreaBorder,
            "OptionPane.buttonAreaBorder", optionPaneButtonAreaBorder,
            // File View
            "FileView.directoryIcon", getIconFactory().getTreeOpenIcon(),
            "FileView.fileIcon", getIconFactory().getTreeLeafIcon(),
            "FileView.computerIcon", getIconFactory().getFileViewComputerIcon(),
            "FileView.hardDriveIcon", getIconFactory().getFileViewHardDriveIcon(),
            "FileView.floppyDriveIcon", getIconFactory().getFileViewFloppyDriveIcon(),
            // File Chooser
            "FileChooser.upFolderIcon", getIconFactory().getFileChooserUpFolderIcon(),
            "FileChooser.homeFolderIcon", getIconFactory().getFileChooserHomeFolderIcon(),
            "FileChooser.newFolderIcon", getIconFactory().getFileChooserNewFolderIcon(),
            "FileChooser.listViewIcon", getIconFactory().getFileChooserListViewIcon(),
            "FileChooser.detailsViewIcon", getIconFactory().getFileChooserDetailViewIcon(),
            "FileChooser.viewMenuIcon", getIconFactory().getFileChooserDetailViewIcon(),
            // Separator
            "Separator.background", getBackgroundColor(),
            "Separator.foreground", getControlForegroundColor(),
            // SplitPane
            "SplitPane.centerOneTouchButtons", Boolean.TRUE,
            "SplitPane.dividerSize", 7,
            "SplitPane.border", BorderFactory.createEmptyBorder(),
            // Tree
            "Tree.background", getInputBackgroundColor(),
            "Tree.foreground", getInputForegroundColor(),
            "Tree.textForeground", getInputForegroundColor(),
            "Tree.textBackground", getInputBackgroundColor(),
            "Tree.selectionForeground", getSelectionForegroundColor(),
            "Tree.selectionBackground", getSelectionBackgroundColor(),
            "Tree.disabledForeground", getDisabledForegroundColor(),
            "Tree.disabledBackground", getDisabledBackgroundColor(),
            "Tree.openIcon", getIconFactory().getTreeOpenIcon(),
            "Tree.closedIcon", getIconFactory().getTreeCloseIcon(),
            "Tree.leafIcon", getIconFactory().getTreeLeafIcon(),
            "Tree.expandedIcon", getIconFactory().getTreeExpandedIcon(),
            "Tree.collapsedIcon", getIconFactory().getTreeCollapsedIcon(),
            "Tree.selectionBorderColor", getFocusCellColor(),
            "Tree.line", getFrameColor(), // horiz lines
            "Tree.hash", getFrameColor(), // legs

            // ToolBar
            "JToolBar.isRollover", Boolean.TRUE,
            "ToolBar.border", toolBarBorder,
            "ToolBar.background", getToolbarBackgroundColor(),
            "ToolBar.foreground", getToolbarForegroundColor(),
            "ToolBar.dockingBackground", getToolbarBackgroundColor(),
            "ToolBar.dockingForeground", getToolbarDockingColor(),
            "ToolBar.floatingBackground", getToolbarBackgroundColor(),
            "ToolBar.floatingForeground", getToolbarForegroundColor(),};
        table.putDefaults(defaults);

        if (JTattooUtilities.getJavaVersion() >= 1.5) {
            table.put("Spinner.font", getControlTextFont());
            table.put("Spinner.background", getButtonBackgroundColor());
            table.put("Spinner.foreground", getButtonForegroundColor());
            table.put("Spinner.border", getBorderFactory().getSpinnerBorder());
            table.put("Spinner.arrowButtonInsets", null);
            table.put("Spinner.arrowButtonBorder", BorderFactory.createEmptyBorder());
            table.put("Spinner.editorBorderPainted", Boolean.FALSE);
        }
        if (getTheme().isMacStyleScrollBarOn()) {
            if (getTheme().isSmallFontSize()) {
                table.put("ScrollBar.width", 8);
                table.put("SplitPane.dividerSize", 7);
            } else if (getTheme().isMediumFontSize()) {
                table.put("ScrollBar.width", 10);
                table.put("SplitPane.dividerSize", 9);
            } else {
                table.put("ScrollBar.width", 12);
                table.put("SplitPane.dividerSize", 11);
            }
        } else {
            if (getTheme().isSmallFontSize()) {
                table.put("ScrollBar.width", 17);
                table.put("SplitPane.dividerSize", 7);
            } else if (getTheme().isMediumFontSize()) {
                table.put("ScrollBar.width", 19);
                table.put("SplitPane.dividerSize", 9);
            } else {
                table.put("ScrollBar.width", 21);
                table.put("SplitPane.dividerSize", 11);
            }
        }
    }

    public static void setTheme(AbstractTheme theme) {
        if (theme == null) {
            return;
        }

        MetalLookAndFeel.setCurrentTheme(theme);
        myTheme = theme;
        if (isWindowDecorationOn()) {
            DecorationHelper.decorateWindows(Boolean.TRUE);
        } else {
            DecorationHelper.decorateWindows(Boolean.FALSE);
        }
    }

    /**
     * Set a theme by name. Allowed themes may come from the list returned by getThemes
     *
     * @param name the name of the theme
     */
    public static void setTheme(String name) {
        // Overwrite this in derived classes
    }

    public static AbstractTheme getTheme() {
        return myTheme;
    }

    public static MetalTheme getCurrentTheme() {
        return myTheme;
    }

    public static java.util.List getThemes() {
        ArrayList<String> themes = new ArrayList<String>();
        themes.add(getTheme().getName());
        return themes;
    }

    public static boolean isWindowDecorationOn() {
        return getTheme().isWindowDecorationOn();
    }

    public static ColorUIResource getForegroundColor() {
        return getTheme().getForegroundColor();
    }

    public static ColorUIResource getDisabledForegroundColor() {
        return getTheme().getDisabledForegroundColor();
    }

    public static ColorUIResource getBackgroundColor() {
        return getTheme().getBackgroundColor();
    }

    public static ColorUIResource getAlterBackgroundColor() {
        return getTheme().getAlterBackgroundColor();
    }

    public static ColorUIResource getDisabledBackgroundColor() {
        return getTheme().getDisabledBackgroundColor();
    }

    public static ColorUIResource getInputForegroundColor() {
        return getTheme().getInputForegroundColor();
    }

    public static ColorUIResource getInputBackgroundColor() {
        return getTheme().getInputBackgroundColor();
    }

    public static ColorUIResource getFocusColor() {
        return getTheme().getFocusColor();
    }

    public static ColorUIResource getFocusCellColor() {
        return getTheme().getFocusCellColor();
    }

    public static ColorUIResource getFrameColor() {
        return getTheme().getFrameColor();
    }

    public static ColorUIResource getGridColor() {
        return getTheme().getGridColor();
    }

    public static ColorUIResource getSelectionForegroundColor() {
        return getTheme().getSelectionForegroundColor();
    }

    public static ColorUIResource getSelectionBackgroundColor() {
        return getTheme().getSelectionBackgroundColor();
    }

    public static ColorUIResource getButtonForegroundColor() {
        return getTheme().getButtonForegroundColor();
    }

    public static ColorUIResource getButtonBackgroundColor() {
        return getTheme().getButtonBackgroundColor();
    }

    public static ColorUIResource getButtonColorLight() {
        return getTheme().getButtonColorLight();
    }

    public static ColorUIResource getButtonColorDark() {
        return getTheme().getButtonColorDark();
    }

    public static ColorUIResource getControlForegroundColor() {
        return getTheme().getControlForegroundColor();
    }

    public static ColorUIResource getControlBackgroundColor() {
        return getTheme().getControlBackgroundColor();
    }

    public ColorUIResource getControlHighlightColor() {
        return getTheme().getControlHighlightColor();
    }

    public ColorUIResource getControlShadowColor() {
        return getTheme().getControlShadowColor();
    }

    public ColorUIResource getControlDarkShadowColor() {
        return getTheme().getControlDarkShadowColor();
    }

    public static ColorUIResource getControlColorLight() {
        return getTheme().getControlColorLight();
    }

    public static ColorUIResource getControlColorDark() {
        return getTheme().getControlColorDark();
    }

    public static ColorUIResource getWindowTitleForegroundColor() {
        return getTheme().getWindowTitleForegroundColor();
    }

    public static ColorUIResource getWindowTitleBackgroundColor() {
        return getTheme().getWindowTitleBackgroundColor();
    }

    public static ColorUIResource getWindowTitleColorLight() {
        return getTheme().getWindowTitleColorLight();
    }

    public static ColorUIResource getWindowTitleColorDark() {
        return getTheme().getWindowTitleColorDark();
    }

    public static ColorUIResource getWindowBorderColor() {
        return getTheme().getWindowBorderColor();
    }

    public static ColorUIResource getWindowInactiveTitleForegroundColor() {
        return getTheme().getWindowInactiveTitleForegroundColor();
    }

    public static ColorUIResource getWindowInactiveTitleBackgroundColor() {
        return getTheme().getWindowInactiveTitleBackgroundColor();
    }

    public static ColorUIResource getWindowInactiveTitleColorLight() {
        return getTheme().getWindowInactiveTitleColorLight();
    }

    public static ColorUIResource getWindowInactiveTitleColorDark() {
        return getTheme().getWindowInactiveTitleColorDark();
    }

    public static ColorUIResource getWindowInactiveBorderColor() {
        return getTheme().getWindowInactiveBorderColor();
    }

    public static ColorUIResource getMenuForegroundColor() {
        return getTheme().getMenuForegroundColor();
    }

    public static ColorUIResource getMenuBackgroundColor() {
        return getTheme().getMenuBackgroundColor();
    }

    public static ColorUIResource getMenuSelectionForegroundColor() {
        return getTheme().getMenuSelectionForegroundColor();
    }

    public static ColorUIResource getMenuSelectionBackgroundColor() {
        return getTheme().getMenuSelectionBackgroundColor();
    }

    public static ColorUIResource getMenuColorLight() {
        return getTheme().getMenuColorLight();
    }

    public static ColorUIResource getMenuColorDark() {
        return getTheme().getMenuColorDark();
    }

    public static ColorUIResource getToolbarForegroundColor() {
        return getTheme().getToolbarForegroundColor();
    }

    public static ColorUIResource getToolbarBackgroundColor() {
        return getTheme().getToolbarBackgroundColor();
    }

    public static ColorUIResource getToolbarColorLight() {
        return getTheme().getToolbarColorLight();
    }

    public static ColorUIResource getToolbarColorDark() {
        return getTheme().getToolbarColorDark();
    }

    public static ColorUIResource getToolbarDockingColor() {
        return getTheme().getFocusColor();
    }

    public static ColorUIResource getTabAreaBackgroundColor() {
        return getTheme().getTabAreaBackgroundColor();
    }

    public static ColorUIResource getTabSelectionForegroundColor() {
        return getTheme().getTabSelectionForegroundColor();
    }

    public static ColorUIResource getDesktopColor() {
        return getTheme().getDesktopColor();
    }

    public static ColorUIResource getTooltipForegroundColor() {
        return getTheme().getTooltipForegroundColor();
    }

    public static ColorUIResource getTooltipBackgroundColor() {
        return getTheme().getTooltipBackgroundColor();
    }

}
