303 lines · 11.2 KB · Java
RawDownload
/* * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.  Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */package javax.swing.plaf.multi; import java.util.Vector;import java.lang.reflect.Method;import javax.swing.*;import javax.swing.plaf.*; /** * <p>A multiplexing look and feel that allows more than one UI * to be associated with a component at the same time. * The primary look and feel is called * the <em>default</em> look and feel, * and the other look and feels are called <em>auxiliary</em>. * <p> * * For further information, see * <a href="doc-files/multi_tsc.html" target="_top">Using the * Multiplexing Look and Feel.</a> * * <p> * <strong>Warning:</strong> * 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 JavaBeans<sup><font size="-2">TM</font></sup> * has been added to the <code>java.beans</code> package. * Please see {@link java.beans.XMLEncoder}. * * @see UIManager#addAuxiliaryLookAndFeel * @see javax.swing.plaf.multi * * @author Willie Walker */public class MultiLookAndFeel extends LookAndFeel { //////////////////////////////// LookAndFeel methods//////////////////////////////     /**     * Returns a string, suitable for use in menus,     * that identifies this look and feel.     *     * @return a string such as "Multiplexing Look and Feel"     */    public String getName() {        return "Multiplexing Look and Feel";    }     /**     * Returns a string, suitable for use by applications/services,     * that identifies this look and feel.     *     * @return "Multiplex"     */    public String getID() {        return "Multiplex";    }     /**     * Returns a one-line description of this look and feel.     *     * @return a descriptive string such as "Allows multiple UI instances per component instance"     */    public String getDescription() {        return "Allows multiple UI instances per component instance";    }     /**     * Returns <code>false</code>;     * this look and feel is not native to any platform.     *     * @return <code>false</code>     */    public boolean isNativeLookAndFeel() {        return false;    }     /**     * Returns <code>true</code>;     * every platform permits this look and feel.     *     * @return <code>true</code>     */    public boolean isSupportedLookAndFeel() {        return true;    }     /**     * Creates, initializes, and returns     * the look and feel specific defaults.     * For this look and feel,     * the defaults consist solely of     * mappings of UI class IDs     * (such as "ButtonUI")     * to <code>ComponentUI</code> class names     * (such as "javax.swing.plaf.multi.MultiButtonUI").     *     * @return an initialized <code>UIDefaults</code> object     * @see javax.swing.JComponent#getUIClassID     */    public UIDefaults getDefaults() {        String packageName = "javax.swing.plaf.multi.Multi";        Object[] uiDefaults = {                   "ButtonUI", packageName + "ButtonUI",         "CheckBoxMenuItemUI", packageName + "MenuItemUI",                 "CheckBoxUI", packageName + "ButtonUI",             "ColorChooserUI", packageName + "ColorChooserUI",                 "ComboBoxUI", packageName + "ComboBoxUI",              "DesktopIconUI", packageName + "DesktopIconUI",              "DesktopPaneUI", packageName + "DesktopPaneUI",               "EditorPaneUI", packageName + "TextUI",              "FileChooserUI", packageName + "FileChooserUI",       "FormattedTextFieldUI", packageName + "TextUI",            "InternalFrameUI", packageName + "InternalFrameUI",                    "LabelUI", packageName + "LabelUI",                     "ListUI", packageName + "ListUI",                  "MenuBarUI", packageName + "MenuBarUI",                 "MenuItemUI", packageName + "MenuItemUI",                     "MenuUI", packageName + "MenuItemUI",               "OptionPaneUI", packageName + "OptionPaneUI",                    "PanelUI", packageName + "PanelUI",            "PasswordFieldUI", packageName + "TextUI",       "PopupMenuSeparatorUI", packageName + "SeparatorUI",                "PopupMenuUI", packageName + "PopupMenuUI",              "ProgressBarUI", packageName + "ProgressBarUI",      "RadioButtonMenuItemUI", packageName + "MenuItemUI",              "RadioButtonUI", packageName + "ButtonUI",                 "RootPaneUI", packageName + "RootPaneUI",                "ScrollBarUI", packageName + "ScrollBarUI",               "ScrollPaneUI", packageName + "ScrollPaneUI",                "SeparatorUI", packageName + "SeparatorUI",                   "SliderUI", packageName + "SliderUI",                  "SpinnerUI", packageName + "SpinnerUI",                "SplitPaneUI", packageName + "SplitPaneUI",               "TabbedPaneUI", packageName + "TabbedPaneUI",              "TableHeaderUI", packageName + "TableHeaderUI",                    "TableUI", packageName + "TableUI",                 "TextAreaUI", packageName + "TextUI",                "TextFieldUI", packageName + "TextUI",                 "TextPaneUI", packageName + "TextUI",             "ToggleButtonUI", packageName + "ButtonUI",         "ToolBarSeparatorUI", packageName + "SeparatorUI",                  "ToolBarUI", packageName + "ToolBarUI",                  "ToolTipUI", packageName + "ToolTipUI",                     "TreeUI", packageName + "TreeUI",                 "ViewportUI", packageName + "ViewportUI",        };         UIDefaults table = new MultiUIDefaults(uiDefaults.length / 2, 0.75f);        table.putDefaults(uiDefaults);        return table;    } ///////////////////////////////// Utility methods for the UI's///////////////////////////////     /**     * Creates the <code>ComponentUI</code> objects     * required to present     * the <code>target</code> component,     * placing the objects in the <code>uis</code> vector and     * returning the     * <code>ComponentUI</code> object     * that best represents the component's UI.     * This method finds the <code>ComponentUI</code> objects     * by invoking     * <code>getDefaults().getUI(target)</code> on each     * default and auxiliary look and feel currently in use.     * The first UI object this method adds     * to the <code>uis</code> vector     * is for the default look and feel.     * <p>     * This method is invoked by the <code>createUI</code> method     * of <code>MultiXxxxUI</code> classes.     *     * @param mui the <code>ComponentUI</code> object     *            that represents the complete UI     *            for the <code>target</code> component;     *            this should be an instance     *            of one of the <code>MultiXxxxUI</code> classes     * @param uis a <code>Vector</code>;     *            generally this is the <code>uis</code> field     *            of the <code>mui</code> argument     * @param target a component whose UI is represented by <code>mui</code>     *     * @return <code>mui</code> if the component has any auxiliary UI objects;     *         otherwise, returns the UI object for the default look and feel     *         or <code>null</code> if the default UI object couldn't be found     *     * @see javax.swing.UIManager#getAuxiliaryLookAndFeels     * @see javax.swing.UIDefaults#getUI     * @see MultiButtonUI#uis     * @see MultiButtonUI#createUI     */    public static ComponentUI createUIs(ComponentUI mui,                                        Vector      uis,                                        JComponent  target) {        ComponentUI ui;         // Make sure we can at least get the default UI        //        ui = UIManager.getDefaults().getUI(target);        if (ui != null) {            uis.addElement(ui);            LookAndFeel[] auxiliaryLookAndFeels;            auxiliaryLookAndFeels = UIManager.getAuxiliaryLookAndFeels();            if (auxiliaryLookAndFeels != null) {                for (int i = 0; i < auxiliaryLookAndFeels.length; i++) {                    ui = auxiliaryLookAndFeels[i].getDefaults().getUI(target);                    if (ui != null) {                        uis.addElement(ui);                    }                }            }        } else {            return null;        }         // Don't bother returning the multiplexing UI if all we did was        // get a UI from just the default look and feel.        //        if (uis.size() == 1) {            return (ComponentUI) uis.elementAt(0);        } else {            return mui;        }    }     /**     * Creates an array,     * populates it with UI objects from the passed-in vector,     * and returns the array.     * If <code>uis</code> is null,     * this method returns an array with zero elements.     * If <code>uis</code> is an empty vector,     * this method returns <code>null</code>.     * A run-time error occurs if any objects in the <code>uis</code> vector     * are not of type <code>ComponentUI</code>.     *     * @param uis a vector containing <code>ComponentUI</code> objects     * @return an array equivalent to the passed-in vector     *     */    protected static ComponentUI[] uisToArray(Vector uis) {        if (uis == null) {            return new ComponentUI[0];        } else {            int count = uis.size();            if (count > 0) {                ComponentUI[] u = new ComponentUI[count];                for (int i = 0; i < count; i++) {                    u[i] = (ComponentUI)uis.elementAt(i);                }                return u;            } else {                return null;            }        }    }} /** * We want the Multiplexing LookAndFeel to be quiet and fallback * gracefully if it cannot find a UI.  This class overrides the * getUIError method of UIDefaults, which is the method that * emits error messages when it cannot find a UI class in the * LAF. */class MultiUIDefaults extends UIDefaults {    MultiUIDefaults(int initialCapacity, float loadFactor) {        super(initialCapacity, loadFactor);    }    protected void getUIError(String msg) {        System.err.println("Multiplexing LAF:  " + msg);    }}