| /* MultiLookAndFeel.java -- |
| Copyright (C) 2005 Free Software Foundation, Inc. |
| |
| This file is part of GNU Classpath. |
| |
| GNU Classpath is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 2, or (at your option) |
| any later version. |
| |
| GNU Classpath 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 for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with GNU Classpath; see the file COPYING. If not, write to the |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
| 02110-1301 USA. |
| |
| Linking this library statically or dynamically with other modules is |
| making a combined work based on this library. Thus, the terms and |
| conditions of the GNU General Public License cover the whole |
| combination. |
| |
| As a special exception, the copyright holders of this library give you |
| permission to link this library with independent modules to produce an |
| executable, regardless of the license terms of these independent |
| modules, and to copy and distribute the resulting executable under |
| terms of your choice, provided that you also meet, for each linked |
| independent module, the terms and conditions of the license of that |
| module. An independent module is a module which is not derived from |
| or based on this library. If you modify this library, you may extend |
| this exception to your version of the library, but you are not |
| obligated to do so. If you do not wish to do so, delete this |
| exception statement from your version. */ |
| |
| package javax.swing.plaf.multi; |
| |
| import java.util.Vector; |
| |
| import javax.swing.JComponent; |
| import javax.swing.LookAndFeel; |
| import javax.swing.UIDefaults; |
| import javax.swing.UIManager; |
| import javax.swing.plaf.ComponentUI; |
| |
| /** |
| * A look and feel that provides the ability to use auxiliary look and feels |
| * in addition to the primary look and feel. |
| */ |
| public class MultiLookAndFeel extends LookAndFeel |
| { |
| |
| /** |
| * Creates a new instance of the look and feel. |
| */ |
| public MultiLookAndFeel() |
| { |
| // Nothing to do here. |
| } |
| |
| /** |
| * Returns the name for the look and feel. |
| * |
| * @return "Multiplexing Look and Feel". |
| */ |
| public String getName() |
| { |
| return "Multiplexing Look and Feel"; |
| } |
| |
| /** |
| * Returns an identifier for the look and feel. |
| * |
| * @return "Multiplex". |
| */ |
| public String getID() |
| { |
| return "Multiplex"; |
| } |
| |
| /** |
| * Returns a description of the look and feel. |
| * |
| * @return A description of the look and feel. |
| */ |
| public String getDescription() |
| { |
| return "Allows multiple UI instances per component instance"; |
| } |
| |
| /** |
| * Returns <code>false</code> to indicate that this look and feel is not |
| * native to any platform. |
| * |
| * @return <code>false</code>. |
| */ |
| public boolean isNativeLookAndFeel() |
| { |
| return false; |
| } |
| |
| /** |
| * Returns <code>true</code> always, since this look and feel is supported on |
| * all platforms. |
| * |
| * @return <code>true</code>. |
| */ |
| public boolean isSupportedLookAndFeel() |
| { |
| return true; |
| } |
| |
| /** |
| * Creates and returns the UI defaults for this look and feel. |
| * |
| * @return The UI defaults. |
| */ |
| public UIDefaults getDefaults() |
| { |
| UIDefaults defaults = new UIDefaults(); |
| defaults.put("ButtonUI", "javax.swing.plaf.multi.MultiButtonUI"); |
| defaults.put("CheckBoxUI", "javax.swing.plaf.multi.MultiButtonUI"); |
| defaults.put("CheckBoxMenuItemUI", "javax.swing.plaf.multi.MultiMenuItemUI"); |
| defaults.put("ColorChooserUI", |
| "javax.swing.plaf.multi.MultiColorChooserUI"); |
| defaults.put("ComboBoxUI", "javax.swing.plaf.multi.MultiComboBoxUI"); |
| defaults.put("DesktopPaneUI", "javax.swing.plaf.multi.MultiDesktopPaneUI"); |
| defaults.put("DesktopIconUI", "javax.swing.plaf.multi.MultiDesktopIconUI"); |
| defaults.put("EditorPaneUI", "javax.swing.plaf.multi.MultiTextUI"); |
| defaults.put("FileChooserUI", "javax.swing.plaf.multi.MultiFileChooserUI"); |
| defaults.put("FormattedTextFieldUI", "javax.swing.plaf.multi.MultiTextUI"); |
| defaults.put("InternalFrameUI", |
| "javax.swing.plaf.multi.MultiInternalFrameUI"); |
| defaults.put("LabelUI", "javax.swing.plaf.multi.MultiLabelUI"); |
| defaults.put("ListUI", "javax.swing.plaf.multi.MultiListUI"); |
| defaults.put("MenuItemUI", "javax.swing.plaf.multi.MultiMenuItemUI"); |
| defaults.put("MenuUI", "javax.swing.plaf.multi.MultiMenuItemUI"); |
| defaults.put("MenuBarUI", "javax.swing.plaf.multi.MultiMenuBarUI"); |
| defaults.put("OptionPaneUI", "javax.swing.plaf.multi.MultiOptionPaneUI"); |
| defaults.put("PanelUI", "javax.swing.plaf.multi.MultiPanelUI"); |
| defaults.put("PasswordFieldUI", "javax.swing.plaf.multi.MultiTextUI"); |
| defaults.put("PopupMenuUI", "javax.swing.plaf.multi.MultiPopupMenuUI"); |
| defaults.put("PopupMenuSeparatorUI", |
| "javax.swing.plaf.multi.MultiSeparatorUI"); |
| defaults.put("ProgressBarUI", "javax.swing.plaf.multi.MultiProgressBarUI"); |
| defaults.put("RadioButtonUI", "javax.swing.plaf.multi.MultiButtonUI"); |
| defaults.put("RadioButtonMenuItemUI", |
| "javax.swing.plaf.multi.MultiMenuItemUI"); |
| defaults.put("RootPaneUI", "javax.swing.plaf.multi.MultiRootPaneUI"); |
| defaults.put("ScrollBarUI", "javax.swing.plaf.multi.MultiScrollBarUI"); |
| defaults.put("ScrollPaneUI", "javax.swing.plaf.multi.MultiScrollPaneUI"); |
| defaults.put("SeparatorUI", "javax.swing.plaf.multi.MultiSeparatorUI"); |
| defaults.put("SliderUI", "javax.swing.plaf.multi.MultiSliderUI"); |
| defaults.put("SpinnerUI", "javax.swing.plaf.multi.MultiSpinnerUI"); |
| defaults.put("SplitPaneUI", "javax.swing.plaf.multi.MultiSplitPaneUI"); |
| defaults.put("TabbedPaneUI", "javax.swing.plaf.multi.MultiTabbedPaneUI"); |
| defaults.put("TableHeaderUI", "javax.swing.plaf.multi.MultiTableHeaderUI"); |
| defaults.put("TableUI", "javax.swing.plaf.multi.MultiTableUI"); |
| defaults.put("TextAreaUI", "javax.swing.plaf.multi.MultiTextUI"); |
| defaults.put("TextFieldUI", "javax.swing.plaf.multi.MultiTextUI"); |
| defaults.put("TextPaneUI", "javax.swing.plaf.multi.MultiTextUI"); |
| defaults.put("ToggleButtonUI", "javax.swing.plaf.multi.MultiButtonUI"); |
| defaults.put("ToolBarSeparatorUI", |
| "javax.swing.plaf.multi.MultiSeparatorUI"); |
| defaults.put("ToolBarUI", "javax.swing.plaf.multi.MultiToolBarUI"); |
| defaults.put("ToolTipUI", "javax.swing.plaf.multi.MultiToolTipUI"); |
| defaults.put("ViewportUI", "javax.swing.plaf.multi.MultiViewportUI"); |
| return defaults; |
| } |
| |
| /** |
| * Creates the UI delegates for the <code>target</code> component and |
| * returns a multiplexing UI delegate (<code>mui</code>) if there are |
| * multiple delegates. |
| * |
| * @param mui a multiplexing UI delegate appropriate for the component. |
| * @param uis a vector into which the UI delegates will be added. |
| * @param target the target component. |
| * |
| * @return A UI delegate. |
| */ |
| public static ComponentUI createUIs(ComponentUI mui, Vector uis, |
| JComponent target) |
| { |
| // get primary UI delegate for 'target', and add it to uis |
| ComponentUI ui = null; |
| LookAndFeel primary = UIManager.getLookAndFeel(); |
| if (primary != null) |
| { |
| ui = UIManager.getUI(target); |
| uis.add(ui); |
| } |
| // for any auxiliary look and feels in use, get the UI delegate and add |
| // it to uis |
| LookAndFeel[] auxlafs = UIManager.getAuxiliaryLookAndFeels(); |
| for (int i = 0; i < auxlafs.length; i++) |
| { |
| LookAndFeel auxlaf = auxlafs[i]; |
| // FIXME: here I call getDefaults() to get the UI delegate from the |
| // auxiliary look and feel. But getDefaults() creates a new set of |
| // defaults every time it is called, which is wasteful. Unfortunately |
| // I cannot find another way to get the UI delegate, so I'm doing it |
| // anyway... |
| UIDefaults defaults = auxlaf.getDefaults(); |
| ui = defaults.getUI(target); |
| if (ui != null) |
| uis.add(ui); |
| } |
| // if uis contains more than 1 delegate, return mui, otherwise return |
| // the primary delegate |
| if (uis.size() > 1) |
| return mui; |
| else |
| return ui; |
| } |
| |
| /** |
| * Returns an array containing the same {@link ComponentUI} instances as |
| * <code>uis</code>. If <code>uis</code> is <code>null</code>, a zero-length |
| * array is returned. |
| * |
| * @param uis a list of {@link ComponentUI} references (<code>null</code> |
| * permitted). |
| * |
| * @return An array containing the same {@link ComponentUI} instances as |
| * <code>uis</code>, or <code>null</code> if <code>uis</code> is |
| * empty. |
| */ |
| protected static ComponentUI[] uisToArray(Vector uis) |
| { |
| if (uis == null) |
| return new ComponentUI[0]; |
| int size = uis.size(); |
| if (size == 0) |
| return null; |
| ComponentUI[] result = new ComponentUI[size]; |
| uis.copyInto(result); |
| return result; |
| } |
| |
| } |