/** * Copyright (C) 2002-2012 The FreeCol Team * * This file is part of FreeCol. * * FreeCol 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. * * FreeCol 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 FreeCol. If not, see <http://www.gnu.org/licenses/>. */ package net.sf.freecol.client.gui.plaf; import java.awt.Cursor; import java.awt.Font; import java.awt.Image; import java.awt.Point; import java.awt.Toolkit; import java.io.File; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.UIDefaults; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.plaf.ColorUIResource; import javax.swing.plaf.metal.DefaultMetalTheme; import javax.swing.plaf.metal.MetalLookAndFeel; import net.sf.freecol.common.FreeColException; import net.sf.freecol.common.resources.ResourceManager; /** * Implements the FreeCol look and feel. */ public class FreeColLookAndFeel extends MetalLookAndFeel { private static final Logger logger = Logger.getLogger(FreeColLookAndFeel.class.getName()); /** * Initiates a new FreeCol look and feel. * * @param dataDirectory The home of the FreeCol data files. * @exception FreeColException If the ui directory could not be found. */ public FreeColLookAndFeel(File dataDirectory) throws FreeColException { super(); setCurrentTheme(new DefaultMetalTheme() { protected ColorUIResource getPrimary1() { return new ColorUIResource(ResourceManager.getColor("lookAndFeel.primary1.color")); } protected ColorUIResource getPrimary2() { return new ColorUIResource(ResourceManager.getColor("lookAndFeel.backgroundSelect.color")); } protected ColorUIResource getPrimary3() { return new ColorUIResource(ResourceManager.getColor("lookAndFeel.primary3.color")); } protected ColorUIResource getSecondary1() { return new ColorUIResource(ResourceManager.getColor("lookAndFeel.secondary1.color")); } protected ColorUIResource getSecondary2() { return new ColorUIResource(ResourceManager.getColor("lookAndFeel.disabled.color")); } protected ColorUIResource getSecondary3() { return new ColorUIResource(ResourceManager.getColor("lookAndFeel.background.color")); } public ColorUIResource getMenuDisabledForeground() { return new ColorUIResource(ResourceManager.getColor("lookAndFeel.disabledMenu.color")); } }); if (!dataDirectory.isDirectory()) { throw new FreeColException("Data directory is not a directory."); } } /** * Creates the look and feel specific defaults table. * * @return The defaults table. */ public UIDefaults getDefaults() { UIDefaults u = super.getDefaults(); try { int offset = "FreeCol".length(); for (Class<?> uiClass : new Class[] { FreeColButtonUI.class, FreeColCheckBoxUI.class, FreeColComboBoxUI.class, FreeColFileChooserUI.class, FreeColLabelUI.class, FreeColListUI.class, FreeColMenuBarUI.class, FreeColMenuItemUI.class, FreeColOptionPaneUI.class, FreeColPanelUI.class, FreeColPopupMenuUI.class, FreeColRadioButtonUI.class, FreeColScrollPaneUI.class, FreeColTableHeaderUI.class, FreeColTableUI.class, FreeColTextAreaUI.class, FreeColTextFieldUI.class, FreeColToolTipUI.class, FreeColTransparentPanelUI.class }) { String name = uiClass.getName(); int index = name.lastIndexOf("FreeCol"); if (index >= 0) { index += offset; String shortName = name.substring(index); u.put(shortName, name); u.put(name, uiClass); } } // Sharing FreeColBrightPanelUI: String brightPanelUI = "net.sf.freecol.client.gui.plaf.FreeColBrightPanelUI"; u.put(brightPanelUI, Class.forName(brightPanelUI)); u.put("InPortPanelUI", brightPanelUI); u.put("CargoPanelUI", brightPanelUI); u.put("BuildingsPanelUI", brightPanelUI); u.put("OutsideColonyPanelUI", brightPanelUI); u.put("WarehousePanelUI", brightPanelUI); u.put("ConstructionPanelUI", brightPanelUI); u.put("PopulationPanelUI", brightPanelUI); u.put("WarehouseGoodsPanelUI", brightPanelUI); u.put("ReportPanelUI", brightPanelUI); u.put("ColopediaPanelUI", brightPanelUI); u.put("TilePanelUI", brightPanelUI); u.put("OptionGroupUI", brightPanelUI); // Sharing FreeColTransparentPanelUI: String transparentPanelUI = "net.sf.freecol.client.gui.plaf.FreeColTransparentPanelUI"; u.put(transparentPanelUI, Class.forName(transparentPanelUI)); u.put("MarketPanelUI", transparentPanelUI); u.put("EuropeCargoPanelUI", transparentPanelUI); u.put("ToAmericaPanelUI", transparentPanelUI); u.put("ToEuropePanelUI", transparentPanelUI); u.put("EuropeInPortPanelUI", transparentPanelUI); u.put("DocksPanelUI", transparentPanelUI); // Add cursors: Image im = ResourceManager.getImage("cursor.go.image"); if (im != null) { u.put("cursor.go", Toolkit.getDefaultToolkit() .createCustomCursor(im, new Point(im.getWidth(null)/2, im.getHeight(null)/2), "go")); } else { u.put("cursor.go", Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); } } catch (ClassNotFoundException e) { logger.log(Level.SEVERE, "Failed to load look and feel!", e); System.exit(-1); } return u; } /** * Installs a FreeColLookAndFeel as the default look and feel. * * @param fclaf The <code>FreeColLookAndFeel</code> to install. * @param defaultFont A <code>Font</code> to use by default. * @throws FreeColException if the installation fails. */ public static void install(FreeColLookAndFeel fclaf, Font defaultFont) throws FreeColException { try { UIManager.setLookAndFeel(fclaf); } catch (UnsupportedLookAndFeelException e) { throw new FreeColException(e.getMessage()); } // Set the default font in all UI elements. UIDefaults u = UIManager.getDefaults(); java.util.Enumeration<Object> keys = u.keys(); while (keys.hasMoreElements()) { Object key = keys.nextElement(); if (u.get(key) instanceof javax.swing.plaf.FontUIResource) { u.put(key, defaultFont); } } } /** * Gets a one line description of this Look and Feel. * * @return "The default Look and Feel for FreeCol" */ public String getDescription() { return "The default Look and Feel for FreeCol"; } /** * Gets the name of this Look and Feel. * * @return "FreeCol Look and Feel" */ public String getName() { return "FreeCol Look and Feel"; } }