/*
* Copyright (c) 2001-2006 JGoodies Karsten Lentzsch. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* o Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* o Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* o Neither the name of JGoodies Karsten Lentzsch nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.pushingpixels.substance.internal.fonts;
import java.awt.Font;
import javax.swing.plaf.FontUIResource;
import org.pushingpixels.substance.api.fonts.FontPolicy;
import org.pushingpixels.substance.api.fonts.FontSet;
/**
* Provides predefined FontSet implementations.
*
* @author Karsten Lentzsch
*
* @see FontSet
* @see FontPolicy
* @see FontPolicies
*
* @since 2.0
*/
public final class FontSets {
private static FontSet logicalFontSet;
private FontSets() {
// Override default constructor; prevents instantation.
}
// Default FontSets *******************************************************
/**
* Creates and returns a FontSet that is based only on the given control
* font. The small font will be derived from the control font; all other
* fonts returned are the control font.
*
* @param controlFont
* the font used for all controls
*
* @return a FontSet based on the given fonts
*
* @throws NullPointerException
* if the control font is <code>null</code>
*/
public static FontSet createDefaultFontSet(Font controlFont) {
return createDefaultFontSet(controlFont, null);
}
/**
* Creates and returns a FontSet that is based on the given control font and
* menu font. The small font will be derived from the control font; all
* other fonts return, except the menu font, are the control font.
*
* @param controlFont
* the font used for all controls
* @param menuFont
* the font used for the menu bar and menu items
*
* @return a FontSet based on the given fonts
*
* @throws NullPointerException
* if the control font is <code>null</code>
*/
public static FontSet createDefaultFontSet(Font controlFont, Font menuFont) {
return createDefaultFontSet(controlFont, menuFont, null, null, null,
null);
}
/**
* Creates and returns a FontSet that is based on the given control font and
* menu font. The small font will be derived from the control font; all
* other fonts return, except the menu font, are the control font.
*
* @param controlFont
* the font used for all controls
* @param menuFont
* the font used for the menu bar and menu items
* @param titleFont
* used for TitledBorder, titles and titled separators
*
* @return a FontSet based on the given fonts
*
* @throws NullPointerException
* if the control font is <code>null</code>
*/
public static FontSet createDefaultFontSet(Font controlFont, Font menuFont,
Font titleFont) {
return createDefaultFontSet(controlFont, menuFont, titleFont, null,
null, null);
}
/**
* Creates and returns a FontSet for the given fonts. If a font is
* <code>null</code>, it uses the control font as fallback. If the small
* font is <code>null</code> it will be derived from the control font.
*
* @param controlFont
* used for all controls
* @param menuFont
* used for the menu bar and menu items
* @param titleFont
* used for TitledBorder, titles and titled separators
* @param messageFont
* used for OptionPanes
* @param smallFont
* used for tool tips and similar components
* @param windowTitleFont
* used for internal frame window titles
*
* @return a FontSet based on the given fonts
*
* @throws NullPointerException
* if the control font is <code>null</code>
*/
public static FontSet createDefaultFontSet(Font controlFont, Font menuFont,
Font titleFont, Font messageFont, Font smallFont,
Font windowTitleFont) {
return new DefaultFontSet(controlFont, menuFont, titleFont,
messageFont, smallFont, windowTitleFont);
}
// Logical FontSet ********************************************************
/**
* Lazily creates and returns the FontSet that returns the logical fonts
* specified by the Java runtime environment.
*
* @return a FontSets that uses the logical fonts specified by the Java
* environment
*/
public static FontSet getLogicalFontSet() {
if (logicalFontSet == null) {
logicalFontSet = new LogicalFontSet();
}
return logicalFontSet;
}
// Helper Code ************************************************************
private static final class DefaultFontSet implements FontSet {
private final FontUIResource controlFont;
private final FontUIResource menuFont;
private final FontUIResource titleFont;
private final FontUIResource messageFont;
private final FontUIResource smallFont;
private final FontUIResource windowTitleFont;
// Instance Creation --------------------------------------------------
/**
* Constructs a DefaultFontSet for the given fonts. If a font is
* <code>null</code>, it uses the control font as fallback. If the small
* font is <code>null</code> it will be derived from the control font.
*
* @param controlFont
* used for all controls
* @param menuFont
* used for the menu bar and menu items
* @param titleFont
* used for TitledBorder, titles and titled separators
* @param messageFont
* used for OptionPanes
* @param smallFont
* used for tool tips and similar components
* @param windowTitleFont
* used for internal frame window titles
*
* @throws NullPointerException
* if the control font is <code>null</code>
*/
public DefaultFontSet(Font controlFont, Font menuFont, Font titleFont,
Font messageFont, Font smallFont, Font windowTitleFont) {
this.controlFont = new FontUIResource(controlFont);
this.menuFont = menuFont != null ? new FontUIResource(menuFont)
: this.controlFont;
this.titleFont = titleFont != null ? new FontUIResource(titleFont)
: this.controlFont; // new
// FontUIResource(controlFont.deriveFont
// (Font.BOLD))
this.messageFont = messageFont != null ? new FontUIResource(
messageFont) : this.controlFont;
this.smallFont = new FontUIResource(smallFont != null ? smallFont
: controlFont.deriveFont(controlFont.getSize2D() - 2f));
this.windowTitleFont = windowTitleFont != null ? new FontUIResource(
windowTitleFont)
: this.titleFont;
}
// FontSet API --------------------------------------------------------
public FontUIResource getControlFont() {
return controlFont;
}
public FontUIResource getMenuFont() {
return menuFont;
}
public FontUIResource getTitleFont() {
return titleFont;
}
public FontUIResource getWindowTitleFont() {
return windowTitleFont;
}
public FontUIResource getSmallFont() {
return smallFont;
}
public FontUIResource getMessageFont() {
return messageFont;
}
}
/**
* Looks up and returns the logical fonts as specified by the Java runtime
* environment.
*/
private static final class LogicalFontSet implements FontSet {
private FontUIResource controlFont;
private FontUIResource titleFont;
private FontUIResource systemFont;
private FontUIResource smallFont;
public FontUIResource getControlFont() {
if (controlFont == null) {
controlFont = new FontUIResource(Font.getFont(
"swing.plaf.metal.controlFont", new Font("Dialog",
Font.PLAIN, 12)));
}
return controlFont;
}
public FontUIResource getMenuFont() {
return getControlFont();
}
public FontUIResource getTitleFont() {
if (titleFont == null) {
titleFont = new FontUIResource(getControlFont().deriveFont(
Font.BOLD));
}
return titleFont;
}
public FontUIResource getSmallFont() {
if (smallFont == null) {
smallFont = new FontUIResource(Font.getFont(
"swing.plaf.metal.smallFont", new Font("Dialog",
Font.PLAIN, 10)));
}
return smallFont;
}
public FontUIResource getMessageFont() {
if (systemFont == null) {
systemFont = new FontUIResource(Font.getFont(
"swing.plaf.metal.systemFont", new Font("Dialog",
Font.PLAIN, 12)));
}
return systemFont;
}
public FontUIResource getWindowTitleFont() {
return getTitleFont();
}
}
}