/* * Copyright (c) 2001-2005 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.contrib.jgoodies.looks; import java.awt.Dimension; import java.util.HashMap; import java.util.Map; import javax.swing.UIManager; import org.pushingpixels.lafwidget.utils.LookUtils; import org.pushingpixels.substance.internal.contrib.jgoodies.looks.common.ShadowPopup; /** * Provides access to several optional properties for the JGoodies L&Fs, * either by a key to the <code>UIDefaults</code> table or via a method or both. * * @author Karsten Lentzsch */ public final class Options { // Look & Feel Names **************************************************** public static final String PLASTIC_NAME = "com.jgoodies.looks.plastic.PlasticLookAndFeel"; public static final String PLASTIC3D_NAME = "com.jgoodies.looks.plastic.Plastic3DLookAndFeel"; public static final String PLASTICXP_NAME = "com.jgoodies.looks.plastic.PlasticXPLookAndFeel"; public static final String JGOODIES_WINDOWS_NAME = "com.jgoodies.looks.windows.WindowsLookAndFeel"; /** * This outdated constant will be removed in the Looks version 1.4. * * @deprecated Replaced by {@link #JGOODIES_WINDOWS_NAME}. */ @Deprecated public static final String EXT_WINDOWS_NAME = JGOODIES_WINDOWS_NAME; public static final String DEFAULT_LOOK_NAME = PLASTIC3D_NAME; /** * Holds a Map that enables the look&feel replacement mechanism to * replace one look by another. Maps the original class names to their * replacement class names. */ private static final Map LAF_REPLACEMENTS; static { LAF_REPLACEMENTS = new HashMap(); initializeDefaultReplacements(); } // Keys for Overriding Font Settings ************************************ public static final String MENU_FONT_KEY = "jgoodies.menuFont"; public static final String CONTROL_FONT_KEY = "jgoodies.controlFont"; public static final String FONT_SIZE_HINTS_KEY = "jgoodies.fontSizeHints"; public static final String USE_SYSTEM_FONTS_KEY = "swing.useSystemFontSettings"; public static final String USE_SYSTEM_FONTS_APP_KEY = "Application.useSystemFontSettings"; // Optional Global User Properties ************************************** public static final String DEFAULT_ICON_SIZE_KEY = "jgoodies.defaultIconSize"; public static final String USE_NARROW_BUTTONS_KEY = "jgoodies.useNarrowButtons"; public static final String TAB_ICONS_ENABLED_KEY = "jgoodies.tabIconsEnabled"; public static final String POPUP_DROP_SHADOW_ENABLED_KEY = "jgoodies.popupDropShadowEnabled"; // Optional Client Properties ******************************************* /** * Hint that the button margin should be narrow. */ public static final String IS_NARROW_KEY = "jgoodies.isNarrow"; /** * Hint that the scroll pane border should be etched. */ public static final String IS_ETCHED_KEY = "jgoodies.isEtched"; /** * Hint for the style: Single or Both, see <code>HeaderStyle</code>. */ public static final String HEADER_STYLE_KEY = "jgoodies.headerStyle"; /** * Hint that the menu items in the menu have no icons. */ public static final String NO_ICONS_KEY = "jgoodies.noIcons"; /** * A client property key for JTrees. Used with the angled and none style * values. */ public static final String TREE_LINE_STYLE_KEY = "JTree.lineStyle"; /** * A client property value for JTrees that indicates that lines shall be * drawn. */ public static final String TREE_LINE_STYLE_ANGLED_VALUE = "Angled"; /** * A client property value for JTrees that indicates that lines shall be * hidden. */ public static final String TREE_LINE_STYLE_NONE_VALUE = "None"; /** * A client property key for JTabbedPanes that indicates that no content * border shall be painted. Supported by the Plastic look&feel family. * This effect will be achieved also if the EMBEDDED property is true. */ public static final String NO_CONTENT_BORDER_KEY = "jgoodies.noContentBorder"; /** * A client property key for JTabbedPanes that indicates that tabs are * painted with a special embedded appearance. Supported by the Plastic * look&feel family. This effect will be achieved also if the EMBEDDED * property is true. */ public static final String EMBEDDED_TABS_KEY = "jgoodies.embeddedTabs"; // System Settings ******************************************************** /** * Holds the Boolean system property value for the tab icon enablement, or * null, if it has not been set. If this property has been set, we log a * message about the choosen value. * * @see #isTabIconsEnabled() */ private static final Boolean TAB_ICONS_ENABLED_SYSTEM_VALUE = LookUtils .getBooleanSystemProperty(TAB_ICONS_ENABLED_KEY, "Icons in tabbed panes"); /** * Holds the Boolean system property value for the popup drop shadow * enablement, or null, if it has not been set. If this property has been * set, we log a message about the choosen value. * <p> * * This property just set the feature's enablement, not its actual * activation. For example, drop shadows are always inactive on the Mac OS * X, because this platform already provides shadows. The activation is * requested in <code>#isPopupDropShadowActive</code>. * * @see #isPopupDropShadowEnabled() * @see #isPopupDropShadowActive() */ private static final Boolean POPUP_DROP_SHADOW_ENABLED_SYSTEM_VALUE = LookUtils .getBooleanSystemProperty(POPUP_DROP_SHADOW_ENABLED_KEY, "Popup drop shadows"); // Private **************************************************************** private static final Dimension DEFAULT_ICON_SIZE = new Dimension(20, 20); private Options() { // Override default constructor; prevents instantiation. } // Accessing Options ****************************************************** /** * Returns whether a hint is set in the UIManager that indicates, that a * look&feel may use the native system fonts. * * @return true if the UIManager indicates that system fonts shall be used * @see #setUseSystemFonts(boolean) */ public static boolean getUseSystemFonts() { return UIManager.get(USE_SYSTEM_FONTS_APP_KEY).equals(Boolean.TRUE); } /** * Sets a value in the UIManager to indicate, that a look&feel may use * the native system fonts. * * @param useSystemFonts * true to enable system fonts in the UIManager * @see #getUseSystemFonts() */ public static void setUseSystemFonts(boolean useSystemFonts) { UIManager .put(USE_SYSTEM_FONTS_APP_KEY, Boolean.valueOf(useSystemFonts)); } /** * Returns the default icon size that is used in menus, menu items and * toolbars. Menu items that have no icon set are aligned using the default * icon dimensions. * * @return the dimension of the default icon * @see #setDefaultIconSize(Dimension) */ public static Dimension getDefaultIconSize() { Dimension size = UIManager.getDimension(DEFAULT_ICON_SIZE_KEY); return size == null ? DEFAULT_ICON_SIZE : size; } /** * Sets the default icon size. * * @param defaultIconSize * the default icon size to set * @see #getDefaultIconSize() */ public static void setDefaultIconSize(Dimension defaultIconSize) { UIManager.put(DEFAULT_ICON_SIZE_KEY, defaultIconSize); } /** * Returns the global <code>FontSizeHints</code> that can be overriden by a * look-specific setting. * * @return the gobally used FontSizeHints object * @see #setGlobalFontSizeHints(FontSizeHints) */ public static FontSizeHints getGlobalFontSizeHints() { Object value = UIManager.get(FONT_SIZE_HINTS_KEY); if (value != null) return (FontSizeHints) value; String name = LookUtils.getSystemProperty(FONT_SIZE_HINTS_KEY, ""); try { return FontSizeHints.valueOf(name); } catch (IllegalArgumentException e) { return FontSizeHints.DEFAULT; } } /** * Sets the global <code>FontSizeHints</code>. * * @param hints * the FontSizeHints object to be used globally * @see #getGlobalFontSizeHints() */ public static void setGlobalFontSizeHints(FontSizeHints hints) { UIManager.put(FONT_SIZE_HINTS_KEY, hints); } /** * Checks and answers if we shall use narrow button margins of 4 pixels. * Sun's L&F implementations use a much wider button margin of 14 * pixels, which leads to good button minimum width in the typical case. * <p> * * Using narrow button margins can potentially cause compatibility issues, * so this feature must be switched on programmatically. * <p> * * If you use narrow margin, you should take care of minimum button width, * either by the layout management or appropriate ButtonUI minimum widths. * * @return true if all buttons shall use narrow margins * @see #setUseNarrowButtons(boolean) */ public static boolean getUseNarrowButtons() { return UIManager.getBoolean(USE_NARROW_BUTTONS_KEY); } /** * Sets if we use narrow or standard button margins. * * @param b * true to use narrow button margins globally * @see #getUseNarrowButtons() */ public static void setUseNarrowButtons(boolean b) { UIManager.put(USE_NARROW_BUTTONS_KEY, Boolean.valueOf(b)); } /** * Checks and answers if we shall use icons in JTabbedPanes. By default, tab * icons are enabled. If the user has set a system property, we log a * message about the choosen style. * * @return true if icons in tabbed panes are enabled, false if disabled * @see #setTabIconsEnabled(boolean) */ public static boolean isTabIconsEnabled() { return TAB_ICONS_ENABLED_SYSTEM_VALUE == null ? !Boolean.FALSE .equals(UIManager.get(TAB_ICONS_ENABLED_KEY)) : TAB_ICONS_ENABLED_SYSTEM_VALUE.booleanValue(); } /** * Enables or disables the use of icons in JTabbedPanes. * * @param b * true to enable icons in tabbed panes, false to disable them * @see #isTabIconsEnabled() */ public static void setTabIconsEnabled(boolean b) { UIManager.put(TAB_ICONS_ENABLED_KEY, Boolean.valueOf(b)); } /** * Checks and answers whether popup drop shadows are active. This feature * shall be inactive with toolkits that use native drop shadows, such as * Aqua on the Mac OS X. It is also inactive if the ShadowPopup cannot * snapshot the desktop background (due to security and AWT exceptions). * Otherwise the feature's enablement state is returned. * <p> * * Currently only the Mac OS X is detected as platform where the toolkit * uses native drop shadows. * * @return true if drop shadows are active, false if inactive * * @see #isPopupDropShadowEnabled() * @see #setPopupDropShadowEnabled(boolean) */ public static boolean isPopupDropShadowActive() { return !LookUtils.getToolkitUsesNativeDropShadows() && ShadowPopup.canSnapshot() && isPopupDropShadowEnabled(); } /** * Checks and answers whether the optional drop shadows for PopupMenus are * enabled or disabled. * * @return true if drop shadows are enabled, false if disabled * * @see #isPopupDropShadowActive() * @see #setPopupDropShadowEnabled(boolean) */ public static boolean isPopupDropShadowEnabled() { if (POPUP_DROP_SHADOW_ENABLED_SYSTEM_VALUE != null) return POPUP_DROP_SHADOW_ENABLED_SYSTEM_VALUE.booleanValue(); Object value = UIManager.get(POPUP_DROP_SHADOW_ENABLED_KEY); return value == null ? isPopupDropShadowEnabledDefault() : Boolean.TRUE .equals(value); } /** * Enables or disables drop shadows in PopupMenus. Note that drop shadows * are always inactive on platforms that provide native drop shadows such as * the Mac OS X. * <p> * * It is recommended to enable this feature only on platforms that * accelerate translucency and snapshots with the hardware. * * @param b * true to enable drop shadows, false to disable them * * @see #isPopupDropShadowActive() * @see #isPopupDropShadowEnabled() */ public static void setPopupDropShadowEnabled(boolean b) { UIManager.put(POPUP_DROP_SHADOW_ENABLED_KEY, Boolean.valueOf(b)); } /** * Checks and answers whether popup drop shadows are enabled or disabled by * default. True for modern Windows platforms: Windows 98/ME/2000/XP. * <p> * * TODO: Consider enabling popup drop shadows on Linux by default. * <p> * * TODO: Consider moving the default to the individual L&F's component * defaults initialization. For example Plastic and Plastic3D may disable * this feature by default, while PlasticXP enables it by default. * * @return false */ private static boolean isPopupDropShadowEnabledDefault() { return LookUtils.IS_OS_WINDOWS_MODERN; } // Look And Feel Replacements ******************************************* /** * Puts a replacement name for a given <code>LookAndFeel</code> class name * in the list of all look and feel replacements. * * @param original * the name of the look-and-feel to replace * @param replacement * the name of the replacement look-and-feel * @see #removeLookAndFeelReplacement(String) * @see #getReplacementClassNameFor(String) */ public static void putLookAndFeelReplacement(String original, String replacement) { LAF_REPLACEMENTS.put(original, replacement); } /** * Removes a replacement name for a given <code>LookAndFeel</code> class * name from the list of all look and feel replacements. * * @param original * the name of the look-and-feel that has been replaced * @see #putLookAndFeelReplacement(String, String) * @see #getReplacementClassNameFor(String) */ public static void removeLookAndFeelReplacement(String original) { LAF_REPLACEMENTS.remove(original); } /** * Initializes some default class name replacements, that replace Sun's Java * look and feel, and Sun's Windows look and feel by the appropriate * JGoodies replacements. * * @see #putLookAndFeelReplacement(String, String) * @see #removeLookAndFeelReplacement(String) * @see #getReplacementClassNameFor(String) */ public static void initializeDefaultReplacements() { putLookAndFeelReplacement("javax.swing.plaf.metal.MetalLookAndFeel", PLASTIC3D_NAME); putLookAndFeelReplacement( "com.sun.java.swing.plaf.windows.WindowsLookAndFeel", JGOODIES_WINDOWS_NAME); } /** * Returns the class name that can be used to replace the specified * <code>LookAndFeel</code> class name. * * @param className * the name of the look-and-feel class * @return the name of the suggested replacement class * @see #putLookAndFeelReplacement(String, String) * @see #removeLookAndFeelReplacement(String) * @see #initializeDefaultReplacements() */ public static String getReplacementClassNameFor(String className) { String replacement = (String) LAF_REPLACEMENTS.get(className); return replacement == null ? className : replacement; } /** * Returns the class name for a cross-platform <code>LookAndFeel</code>. * * @return the name of a cross platform look-and-feel class * @see #getSystemLookAndFeelClassName() */ public static String getCrossPlatformLookAndFeelClassName() { return PLASTIC3D_NAME; } /** * Returns the class name for a system specific <code>LookAndFeel</code>. * * @return the name of the system look-and-feel class * @see #getCrossPlatformLookAndFeelClassName() */ public static String getSystemLookAndFeelClassName() { String osName = System.getProperty("os.name"); if (osName.startsWith("Windows")) return Options.JGOODIES_WINDOWS_NAME; else if (osName.startsWith("Mac")) return UIManager.getSystemLookAndFeelClassName(); else return getCrossPlatformLookAndFeelClassName(); } }