/* * @(#)DefaultMetalTheme.java 1.27 04/03/03 * * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package javax.swing.plaf.metal; import javax.swing.plaf.*; import javax.swing.*; import java.awt.*; import sun.security.action.GetPropertyAction; /** * This class describes the default Metal Theme. *
* Warning:
* Serialized objects of this class will not be compatible with
* future Swing releases. The current serialization support is
* appropriate for short term storage or RMI between applications running
* the same version of Swing. As of 1.4, support for long term storage
* of all JavaBeansTM
* has been added to the java.beans
package.
* Please see {@link java.beans.XMLEncoder}.
*
* @version 1.27 03/03/04
* @author Steve Wilson
*/
public class DefaultMetalTheme extends MetalTheme {
/**
* Whether or not fonts should be plain. This is only used if
* the defaults property 'swing.boldMetal' == "false".
*/
private static final boolean PLAIN_FONTS;
/**
* Names of the fonts to use.
*/
private static final String[] fontNames = {
"Dialog", "Dialog", "Dialog", "Dialog", "Dialog", "Dialog"
};
/**
* Styles for the fonts. This is ignored if the defaults property
* swing.boldMetal
is false, or PLAIN_FONTS is true.
*/
private static final int[] fontStyles = {
Font.BOLD, Font.PLAIN, Font.PLAIN, Font.BOLD, Font.BOLD, Font.PLAIN
};
/**
* Sizes for the fonts.
*/
private static final int[] fontSizes = {
12, 12, 12, 12, 12, 10
};
// note the properties listed here can currently be used by people
// providing runtimes to hint what fonts are good. For example the bold
// dialog font looks bad on a Mac, so Apple could use this property to
// hint at a good font.
//
// However, we don't promise to support these forever. We may move
// to getting these from the swing.properties file, or elsewhere.
/**
* System property names used to look up fonts.
*/
private static final String[] defaultNames = {
"swing.plaf.metal.controlFont",
"swing.plaf.metal.systemFont",
"swing.plaf.metal.userFont",
"swing.plaf.metal.controlFont",
"swing.plaf.metal.controlFont",
"swing.plaf.metal.smallFont"
};
/**
* Returns the ideal font name for the font identified by key.
*/
static String getDefaultFontName(int key) {
return fontNames[key];
}
/**
* Returns the ideal font size for the font identified by key.
*/
static int getDefaultFontSize(int key) {
return fontSizes[key];
}
/**
* Returns the ideal font style for the font identified by key.
*/
static int getDefaultFontStyle(int key) {
if (key != WINDOW_TITLE_FONT) {
Object boldMetal = UIManager.get("swing.boldMetal");
if (boldMetal != null) {
if (Boolean.FALSE.equals(boldMetal)) {
return Font.PLAIN;
}
}
else if (PLAIN_FONTS) {
return Font.PLAIN;
}
}
return fontStyles[key];
}
/**
* Returns the default used to look up the specified font.
*/
static String getDefaultPropertyName(int key) {
return defaultNames[key];
}
static {
Object boldProperty = java.security.AccessController.doPrivileged(
new GetPropertyAction("swing.boldMetal"));
if (boldProperty == null || !"false".equals(boldProperty)) {
PLAIN_FONTS = false;
}
else {
PLAIN_FONTS = true;
}
}
private static final ColorUIResource primary1 = new ColorUIResource(
102, 102, 153);
private static final ColorUIResource primary2 = new ColorUIResource(153,
153, 204);
private static final ColorUIResource primary3 = new ColorUIResource(
204, 204, 255);
private static final ColorUIResource secondary1 = new ColorUIResource(
102, 102, 102);
private static final ColorUIResource secondary2 = new ColorUIResource(
153, 153, 153);
private static final ColorUIResource secondary3 = new ColorUIResource(
204, 204, 204);
private FontDelegate fontDelegate;
public String getName() { return "Steel"; }
public DefaultMetalTheme() {
install();
}
// these are blue in Metal Default Theme
protected ColorUIResource getPrimary1() { return primary1; }
protected ColorUIResource getPrimary2() { return primary2; }
protected ColorUIResource getPrimary3() { return primary3; }
// these are gray in Metal Default Theme
protected ColorUIResource getSecondary1() { return secondary1; }
protected ColorUIResource getSecondary2() { return secondary2; }
protected ColorUIResource getSecondary3() { return secondary3; }
public FontUIResource getControlTextFont() {
return getFont(CONTROL_TEXT_FONT);
}
public FontUIResource getSystemTextFont() {
return getFont(SYSTEM_TEXT_FONT);
}
public FontUIResource getUserTextFont() {
return getFont(USER_TEXT_FONT);
}
public FontUIResource getMenuTextFont() {
return getFont(MENU_TEXT_FONT);
}
public FontUIResource getWindowTitleFont() {
return getFont(WINDOW_TITLE_FONT);
}
public FontUIResource getSubTextFont() {
return getFont(SUB_TEXT_FONT);
}
private FontUIResource getFont(int key) {
return fontDelegate.getFont(key);
}
void install() {
if (MetalLookAndFeel.isWindows() &&
MetalLookAndFeel.useSystemFonts()) {
fontDelegate = new WindowsFontDelegate();
}
else {
fontDelegate = new FontDelegate();
}
}
/**
* Returns true if this is a theme provided by the core platform.
*/
boolean isSystemTheme() {
return (getClass() == DefaultMetalTheme.class);
}
/**
* FontDelegates add an extra level of indirection to obtaining fonts.
*/
private static class FontDelegate {
private static int[] defaultMapping = {
CONTROL_TEXT_FONT, SYSTEM_TEXT_FONT,
USER_TEXT_FONT, CONTROL_TEXT_FONT,
CONTROL_TEXT_FONT, SUB_TEXT_FONT
};
FontUIResource fonts[];
// menu and window are mapped to controlFont
public FontDelegate() {
fonts = new FontUIResource[6];
}
public FontUIResource getFont(int type) {
int mappedType = defaultMapping[type];
if (fonts[type] == null) {
Font f = getPrivilegedFont(mappedType);
if (f == null) {
f = new Font(getDefaultFontName(type),
getDefaultFontStyle(type),
getDefaultFontSize(type));
}
fonts[type] = new FontUIResource(f);
}
return fonts[type];
}
/**
* This is the same as invoking
* Font.getFont(key)
, with the exception
* that it is wrapped inside a doPrivileged
call.
*/
protected Font getPrivilegedFont(final int key) {
return (Font)java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction() {
public Object run() {
return Font.getFont(getDefaultPropertyName(key));
}
}
);
}
}
/**
* The WindowsFontDelegate uses DesktopProperties to obtain fonts.
*/
private static class WindowsFontDelegate extends FontDelegate {
private MetalFontDesktopProperty[] props;
private boolean[] checkedPriviledged;
public WindowsFontDelegate() {
props = new MetalFontDesktopProperty[6];
checkedPriviledged = new boolean[6];
}
public FontUIResource getFont(int type) {
if (fonts[type] != null) {
return fonts[type];
}
if (!checkedPriviledged[type]) {
Font f = getPrivilegedFont(type);
checkedPriviledged[type] = true;
if (f != null) {
fonts[type] = new FontUIResource(f);
return fonts[type];
}
}
if (props[type] == null) {
props[type] = new MetalFontDesktopProperty(type);
}
// While passing null may seem bad, we don't actually use
// the table and looking it up is rather expensive.
return (FontUIResource)props[type].createValue(null);
}
}
}