home *** CD-ROM | disk | FTP | other *** search
Java Source | 1998-03-20 | 9.9 KB | 277 lines |
- /*
- * @(#)LookAndFeel.java 1.9 98/01/30
- *
- * Copyright (c) 1997 Sun Microsystems, Inc. All Rights Reserved.
- *
- * This software is the confidential and proprietary information of Sun
- * Microsystems, Inc. ("Confidential Information"). You shall not
- * disclose such Confidential Information and shall use it only in
- * accordance with the terms of the license agreement you entered into
- * with Sun.
- *
- * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
- * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
- * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
- * THIS SOFTWARE OR ITS DERIVATIVES.
- *
- */
-
- package java.awt.swing;
-
- import java.awt.Font;
- import java.awt.Color;
- import java.awt.SystemColor;
-
- import java.awt.swing.plaf.basic.*;
- import java.awt.swing.BorderFactory;
- import java.awt.swing.JComponent;
- import java.awt.swing.ImageIcon;
- import java.awt.swing.UIDefaults;
- import java.awt.swing.UIManager;
- import java.awt.swing.border.*;
- import java.awt.swing.plaf.*;
-
- import java.net.URL;
- import java.io.*;
-
- /**
- * Completely characterizes a look and feel from the point of view
- * of the pluggable look and feel components.
- *
- * @version 1.9 01/30/98
- * @author Tom Ball
- * @author Hans Muller
- */
- public abstract class LookAndFeel
- {
-
- /**
- * 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)
- {
- Color bg = c.getBackground();
- if (bg == null || bg instanceof UIResource) {
- c.setBackground(UIManager.getColor(defaultBgName));
- }
-
- Color fg = c.getForeground();
- if (fg == null || fg instanceof UIResource) {
- c.setForeground(UIManager.getColor(defaultFgName));
- }
- }
-
-
- /**
- * 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(UIManager.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(UIManager.getBorder(defaultBorderName));
- }
- }
-
- /**
- * Convenience method for un-installing a component's default
- * border on the specified component if the border is
- * currently an instance of UIResource.
- * @param c the target component for uninstalling default border
- */
- public static void uninstallBorder(JComponent c) {
- if (c.getBorder() instanceof UIResource) {
- c.setBorder(null);
- }
- }
-
- /**
- * Utility method that creates a UIDefaults.LazyValue that creates
- * an ImageIcon UIResource for the specified <code>gifFile</code>
- * filename.
- */
- public static Object makeIcon(final Class baseClass, final String gifFile) {
- return new UIDefaults.LazyValue() {
- public Object createValue(UIDefaults table) {
- byte[] buffer = null;
- try {
- /* Copy resource into a byte array. This is
- * necessary because several browsers consider
- * Class.getResource a security risk because it
- * can be used to load additional classes.
- * Class.getResourceAsStream just returns raw
- * bytes, which we can convert to an image.
- */
- InputStream resource =
- baseClass.getResourceAsStream(gifFile);
- if (resource == null) {
- System.err.println(baseClass.getName() + "/" +
- gifFile + " not found.");
- return null;
- }
- BufferedInputStream in =
- new BufferedInputStream(resource);
- ByteArrayOutputStream out =
- new ByteArrayOutputStream(1024);
- buffer = new byte[1024];
- int n;
- while ((n = in.read(buffer)) > 0) {
- out.write(buffer, 0, n);
- }
- in.close();
- out.flush();
-
- buffer = out.toByteArray();
- if (buffer.length == 0) {
- System.err.println("warning: " + gifFile +
- " is zero-length");
- return null;
- }
- } catch (IOException ioe) {
- System.err.println(ioe.toString());
- return null;
- }
-
- return new IconUIResource(new ImageIcon(buffer));
- }
- };
- }
-
- /**
- * Return a short string that identifies this look and feel, e.g.
- * "CDE/Motif". This string should be appropriate for a menu item.
- * Distinct look and feels should have different names, e.g.
- * a subclass of MotifLookAndFeel that changes the way a few components
- * are rendered should be called "CDE/Motif My Way"; something
- * that would be useful to a user trying to select a L&F from a list
- * of names.
- */
- public abstract String getName();
-
-
- /**
- * Return a string that identifies this look and feel. This string
- * will be used by applications/services that want to recognize
- * well known look and feel implementations. Presently
- * the well known names are "Motif", "Windows", "Mac", "Organic". Note
- * that a derived LookAndFeel that doesn't make any fundamental changes
- * to the look or feel should not override this method.
- */
- public abstract String getID();
-
-
- /**
- * Return a one line description of this look and feel implementation,
- * e.g. "The CDE/Motif Look and Feel". This string is intended for
- * the user, e.g. in the title of a window or in a ToolTip message.
- */
- public abstract String getDescription();
-
-
- /**
- * If the underlying platform has a "native" look and feel, and this
- * is an implementation of it, return true. For example a CDE/Motif
- * look and implementation would return true when the underlying
- * platform was Solaris.
- */
- public abstract boolean isNativeLookAndFeel();
-
-
- /**
- * Return true if the underlying platform supports and or permits
- * this look and feel. This method returns false if the look
- * and feel depends on special resources or legal agreements that
- * aren't defined for the current platform.
- *
- * @see UIManager#setLookAndFeel
- */
- public abstract boolean isSupportedLookAndFeel();
-
-
- /**
- * UIManager.setLookAndFeel calls this method before the first
- * call (and typically the only call) to getDefaults(). Subclasses
- * should do any one-time setup they need here, rather than
- * in a static initializer, because look and feel class objects
- * may be loaded just to discover that isSupportedLookAndFeel()
- * returns false.
- *
- * @see #uninitialize
- * @see UIManager#setLookAndFeel
- */
- public void initialize() {
- }
-
-
- /**
- * UIManager.setLookAndFeel calls this method just before we're
- * replaced by a new default look and feel. Subclasses may
- * choose to free up some resources here.
- *
- * @see #initialize
- */
- public void uninitialize() {
- }
-
- /**
- * This method is called once by UIManager.setLookAndFeel to create
- * the look and feel specific defaults table. Other applications,
- * for example an application builder, may also call this method.
- *
- * @see #initialize
- * @see #uninitialize
- * @see UIManager#setLookAndFeel
- */
- public UIDefaults getDefaults() {
- return null;
- }
-
- public String toString() {
- return "[" + getDescription() + " - " + getClass().getName() + "]";
- }
- }
-