/**
* @(#)PaletteLookAndFeel.java
*
* Copyright (c) 2008 The authors and contributors of JHotDraw.
* You may not use, copy or modify this file, except in compliance with the
* accompanying license terms.
*/
package org.jhotdraw.gui.plaf.palette;
import edu.umd.cs.findbugs.annotations.Nullable;
import java.awt.*;
import java.util.Enumeration;
import java.util.ResourceBundle;
import javax.swing.*;
import javax.swing.UIDefaults.*;
import javax.swing.border.Border;
import javax.swing.plaf.*;
import javax.swing.plaf.basic.*;
/**
* A LookAndFeel for components in the palette windows of a drawing editor.
*
* @author Werner Randelshofer
* @version $Id$
*/
public class PaletteLookAndFeel extends BasicLookAndFeel {
private static final long serialVersionUID = 1L;
/**
* Shared instance.
*/
private static PaletteLookAndFeel instance;
/**
* Cached defaults.
*/
private UIDefaults cachedDefaults;
public static PaletteLookAndFeel getInstance() {
if (instance == null) {
instance = new PaletteLookAndFeel();
}
return instance;
}
@Override
public String getName() {
return "Palette Look and Feel";
}
@Override
public String getID() {
return "Palette";
}
@Override
public String getDescription() {
return "A look and feel for palette components";
}
@Override
public boolean isNativeLookAndFeel() {
return false;
}
@Override
public boolean isSupportedLookAndFeel() {
return true;
}
public UIDefaults getCachedDefaults() {
if (cachedDefaults == null) {
cachedDefaults = getDefaults();
}
return cachedDefaults;
}
/**
* Looks up up the given key in our map and resolves LazyValues
* or ActiveValues.
*/
public Object get(Object key) {
UIDefaults defaults = getCachedDefaults();
/* Quickly handle the common case, without grabbing
* a lock.
*/
Object value = defaults.get(key);
if (!(value instanceof ActiveValue)
&& !(value instanceof LazyValue)) {
return value;
}
return value;
}
public boolean getBoolean(String key) {
return ((Boolean) get(key)).booleanValue();
}
public Border getBorder(String key) {
return (Border) get(key);
}
public Color getColor(String key) {
return (Color) get(key);
}
public Font getFont(String key) {
return (Font) get(key);
}
public Icon getIcon(String key) {
return (Icon) get(key);
}
public int getInt(String key) {
return (Integer) get(key);
}
public Insets getInsets(String key) {
return (Insets) get(key);
}
public String getString(String key) {
return (String) get(key);
}
/**
* Convenience method for initializing a components foreground
* background and font properties with values from the current
* defaults table. The properties are only set if the current
* value is either null or a UIResource.
*
* @param c the target component for installing default color/font properties
* @param defaultBgName the key for the default background
* @param defaultFgName the key for the default foreground
* @param defaultFontName the key for the default font
*
* @see #installColors
* @see UIManager#getColor
* @see UIManager#getFont
*/
public static void installColorsAndFont(JComponent c,
String defaultBgName,
String defaultFgName,
String defaultFontName) {
Font f = c.getFont();
if (f == null || f instanceof UIResource) {
c.setFont(getInstance().getFont(defaultFontName));
}
installColors(c, defaultBgName, defaultFgName);
}
/**
* Convenience method for installing a component's default Border
* object on the specified component if either the border is
* currently null or already an instance of UIResource.
* @param c the target component for installing default border
* @param defaultBorderName the key specifying the default border
*/
public static void installBorder(JComponent c, String defaultBorderName) {
Border b = c.getBorder();
if (b == null || b instanceof UIResource) {
c.setBorder(getInstance().getBorder(defaultBorderName));
}
}
/**
* Convenience method for initializing a component's foreground
* and background color properties with values from the current
* defaults table. The properties are only set if the current
* value is either null or a UIResource.
*
* @param c the target component for installing default color/font properties
* @param defaultBgName the key for the default background
* @param defaultFgName the key for the default foreground
*
* @see #installColorsAndFont
* @see UIManager#getColor
*/
public static void installColors(JComponent c,
String defaultBgName,
String defaultFgName) {
PaletteLookAndFeel plaf = getInstance();
Color bg = c.getBackground();
if (bg == null || bg instanceof UIResource) {
c.setBackground(plaf.getColor(defaultBgName));
}
Color fg = c.getForeground();
if (fg == null || fg instanceof UIResource) {
c.setForeground(plaf.getColor(defaultFgName));
}
}
@Override
protected void initComponentDefaults(UIDefaults table) {
super.initComponentDefaults(table);
// Add resource bundle to the table.
// Since this does not seem to work in sandboxed environments, we check
// whether we succeeded and - in case of failure - put the values in
// by ourselves.
table.addResourceBundle("org.jhotdraw.gui.Labels");
if (table.getString("ColorChooser.rgbSliders") == null) {
ResourceBundle rb = ResourceBundle.getBundle("org.jhotdraw.gui.Labels");
for (String key : rb.keySet()) {
table.put(key, rb.getObject(key));
}
}
// *** Shared Fonts
Integer fontPlain = Font.PLAIN;
Integer fontBold = Font.BOLD;
Object dialogPlain11 = new ProxyLazyValue(
"javax.swing.plaf.FontUIResource",
null,
new Object[]{"Dialog Sans", fontPlain, 11});
Object dialogPlain12 = new ProxyLazyValue(
"javax.swing.plaf.FontUIResource",
null,
new Object[]{"Dialog Sans", fontPlain, 12});
Object fieldPlain12 = new ProxyLazyValue(
"javax.swing.plaf.FontUIResource",
null,
new Object[]{"Verdana", fontPlain, 12});
Object dialogBold12 = new ProxyLazyValue(
"javax.swing.plaf.FontUIResource",
null,
new Object[]{"Dialog", fontBold, 12});
// *** Shared Colors
ColorUIResource black = new ColorUIResource(Color.black);
ColorUIResource control = new ColorUIResource(0xf0f0f0);
ColorUIResource controlText = black;
ColorUIResource selectionBackground = new ColorUIResource(0xb5d5ff);
ColorUIResource selectionForeground = black;
ColorUIResource listSelectionBackground = new ColorUIResource(0x3875d7);
Object focusCellHighlightBorder = new UIDefaults.ProxyLazyValue(
"javax.swing.plaf.BorderUIResource$LineBorderUIResource",
// null,
new Object[]{listSelectionBackground});
// *** Shared Insets
InsetsUIResource zeroInsets = new InsetsUIResource(0, 0, 0, 0);
// *** Shared Borders
/*Object buttonBorder =
new ProxyLazyValue(
"org.jhotdraw.gui.plaf.palette.BackdropBorder$UIResource",
new Object[] {new PaletteButtonBorder()});*/
Object buttonBorder = new BackdropBorder.UIResource(new PaletteButtonBorder());
Object textBorder = new BackdropBorder.UIResource(new PaletteTextComponentBorder());
Object[] defaults = {
// *** Fonts
"SmallSystemFont", dialogPlain11,
// *** Buttons
"Button.font", dialogPlain12,
"Button.background", control,
"Button.foreground", controlText,
"Button.border", buttonBorder,
"Button.margin", zeroInsets,
// *** FontChooser
"Button.background", control,
"Button.foreground", controlText,
"Button.border", buttonBorder,
"Button.margin", zeroInsets,
// *** ColorChooser
// class names of default choosers
"ColorChooser.font", dialogPlain11,
"ColorChooser.defaultChoosers", new String[]{
"org.jhotdraw.gui.plaf.palette.colorchooser.PaletteSwatchesChooser",
"org.jhotdraw.gui.plaf.palette.colorchooser.PaletteColorWheelChooser",
"org.jhotdraw.gui.plaf.palette.colorchooser.PaletteColorSlidersChooser",},
"ColorChooser.textSliderGap", 3,
//
// *** FormattedTextField
"FormattedTextField.font", fieldPlain12,
"FormattedTextField.background", control,
"FormattedTextField.foreground", controlText,
"FormattedTextField.border", textBorder,
"FormattedTextField.margin", zeroInsets,
"FormattedTextField.opaque", Boolean.TRUE,
"FormattedTextField.errorIndicatorForeground", new ColorUIResource(0xfe4a41),
"FormattedTextField.selectionBackground", selectionBackground,
"FormattedTextField.selectionForeground", selectionForeground,
// *** Labels
"Label.font", dialogPlain12,
"Label.border", new UIDefaults.ProxyLazyValue(
"javax.swing.plaf.BorderUIResource$EmptyBorderUIResource",
new Object[]{0, 0, 0, 0}),
// *** Lists
"List.focusCellHighlightBorder", focusCellHighlightBorder,
"List.cellRenderer", new UIDefaults.ProxyLazyValue("org.jhotdraw.gui.plaf.palette.PaletteListCellRenderer"),
// *** Panels
"Panel.background", control,
"Panel.foreground", controlText,
"Panel.opaque", Boolean.TRUE,
// *** Ribbons
"Ribbon.border", new UIDefaults.ProxyLazyValue("javax.swing.border.MatteBorder", new Object[]{new Insets(1, 0, 0, 0), new Color(0x777777)}), //
// *** ScrollPane
"ScrollPane.border", new UIDefaults.ProxyLazyValue("javax.swing.border.MatteBorder", new Object[]{new Insets(1, 1, 1, 1), new Color(0xa5a5a5)}), //
// *** Slider
"Slider.background", control,
"Slider.foreground", controlText,
"Slider.horizontalSize", new DimensionUIResource(100, 20),
"Slider.verticalSize", new DimensionUIResource(20, 100),
"Slider.northThumb.small", new UIDefaults.ProxyLazyValue(
"org.jhotdraw.gui.plaf.palette.PaletteSliderThumbIcon",
new Object[]{"/org/jhotdraw/gui/plaf/palette/images/Slider.northThumbs.small.png", 6, true}),
"Slider.westThumb.small", new UIDefaults.ProxyLazyValue(
"org.jhotdraw.gui.plaf.palette.PaletteSliderThumbIcon",
new Object[]{"/org/jhotdraw/gui/plaf/palette/images/Slider.westThumbs.small.png", 6, true}),
// *** TabbedPane
"TabbedPane.font", dialogPlain12,
"TabbedPane.selectedFont", dialogBold12,
"TabbedPane.background", control,
"TabbedPane.contentAreaColor", control,
"TabbedPane.foreground", controlText,
"TabbedPane.highlight", new ColorUIResource(0xa5a5a5),
"TabbedPane.lightHighlight", new ColorUIResource(0xa5a5a5),
"TabbedPane.shadow", new ColorUIResource(0xa5a5a5),
"TabbedPane.darkShadow", new ColorUIResource(0x333333),
// *** TextArea
"TextArea.selectionBackground", selectionBackground,
"TextArea.selectionForeground", selectionForeground,
// *** TextField
"TextField.font", fieldPlain12,
"TextField.background", control,
"TextField.foreground", controlText,
"TextField.border", textBorder,
"TextField.margin", zeroInsets,
"TextField.opaque", Boolean.TRUE,
"TextField.selectionBackground", selectionBackground,
"TextField.selectionForeground", selectionForeground,
// *** ToolBar
"ToolBar.font", dialogPlain12,
"ToolBar.background", control,
"ToolBar.foreground", controlText,
"ToolBar.dockingBackground", control,
// "ToolBar.dockingForeground", red,
"ToolBar.floatingBackground", control,
// "ToolBar.floatingForeground", darkGray,
// "ToolBar.border", etchedBorder,
"ToolBar.border", new UIDefaults.ProxyLazyValue("org.jhotdraw.gui.plaf.palette.PaletteToolBarBorder$UIResource"), //
// "ToolBar.separatorSize", toolBarSeparatorSize,
};
table.putDefaults(defaults);
}
/**
* Returns the ui that is of type <code>klass</code>, or null if
* one can not be found.
*/
@Nullable
static Object getUIOfType(ComponentUI ui, Class<?> klass) {
if (klass.isInstance(ui)) {
return ui;
}
return null;
}
}