/* * Copyright (c) 2002, 2009, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * * * * * * * * * * * * * * * * * * * */ package javax.swing.plaf.synth; import sun.awt.AppContext; import java.util.HashMap; import java.util.Locale; import java.util.Map; import javax.swing.JComponent; import javax.swing.UIDefaults; /** * A distinct rendering area of a Swing component. A component may * support one or more regions. Specific component regions are defined * by the typesafe enumeration in this class. *
 * Regions are typically used as a way to identify the Components
 * and areas a particular style is to apply to. Synth's file format allows you
 * to bind styles based on the name of a Region.
 * The name is derived from the field name of the constant:
 * 
SPLIT_PANE
 * Region you would use SplitPane.
 * The following shows a custom SynthStyleFactory
 * that returns a specific style for split panes:
 * 
 *    public SynthStyle getStyle(JComponent c, Region id) {
 *        if (id == Region.SPLIT_PANE) {
 *            return splitPaneStyle;
 *        }
 *        ...
 *    }
 * 
 * The following xml
 * accomplishes the same thing:
 * * <style id="splitPaneStyle"> * ... * </style> * <bind style="splitPaneStyle" type="region" key="SplitPane"/> ** * @since 1.5 * @author Scott Violet */ public class Region { private static final Object UI_TO_REGION_MAP_KEY = new Object(); private static final Object LOWER_CASE_NAME_MAP_KEY = new Object(); /** * ArrowButton's are special types of buttons that also render a * directional indicator, typically an arrow. ArrowButtons are used by * composite components, for example ScrollBar's contain ArrowButtons. * To bind a style to this
Region use the name
     * ArrowButton.
     */
    public static final Region ARROW_BUTTON = new Region("ArrowButton", false);
    /**
     * Button region. To bind a style to this Region use the name
     * Button.
     */
    public static final Region BUTTON = new Region("Button", false);
    /**
     * CheckBox region. To bind a style to this Region use the name
     * CheckBox.
     */
    public static final Region CHECK_BOX = new Region("CheckBox", false);
    /**
     * CheckBoxMenuItem region. To bind a style to this Region use
     * the name CheckBoxMenuItem.
     */
    public static final Region CHECK_BOX_MENU_ITEM = new Region("CheckBoxMenuItem", false);
    /**
     * ColorChooser region. To bind a style to this Region use
     * the name ColorChooser.
     */
    public static final Region COLOR_CHOOSER = new Region("ColorChooser", false);
    /**
     * ComboBox region. To bind a style to this Region use
     * the name ComboBox.
     */
    public static final Region COMBO_BOX = new Region("ComboBox", false);
    /**
     * DesktopPane region. To bind a style to this Region use
     * the name DesktopPane.
     */
    public static final Region DESKTOP_PANE = new Region("DesktopPane", false);
    /**
     * DesktopIcon region. To bind a style to this Region use
     * the name DesktopIcon.
     */
    public static final Region DESKTOP_ICON = new Region("DesktopIcon", false);
    /**
     * EditorPane region. To bind a style to this Region use
     * the name EditorPane.
     */
    public static final Region EDITOR_PANE = new Region("EditorPane", false);
    /**
     * FileChooser region. To bind a style to this Region use
     * the name FileChooser.
     */
    public static final Region FILE_CHOOSER = new Region("FileChooser", false);
    /**
     * FormattedTextField region. To bind a style to this Region use
     * the name FormattedTextField.
     */
    public static final Region FORMATTED_TEXT_FIELD = new Region("FormattedTextField", false);
    /**
     * InternalFrame region. To bind a style to this Region use
     * the name InternalFrame.
     */
    public static final Region INTERNAL_FRAME = new Region("InternalFrame", false);
    /**
     * TitlePane of an InternalFrame. The TitlePane typically
     * shows a menu, title, widgets to manipulate the internal frame.
     * To bind a style to this Region use the name
     * InternalFrameTitlePane.
     */
    public static final Region INTERNAL_FRAME_TITLE_PANE = new Region("InternalFrameTitlePane", false);
    /**
     * Label region. To bind a style to this Region use the name
     * Label.
     */
    public static final Region LABEL = new Region("Label", false);
    /**
     * List region. To bind a style to this Region use the name
     * List.
     */
    public static final Region LIST = new Region("List", false);
    /**
     * Menu region. To bind a style to this Region use the name
     * Menu.
     */
    public static final Region MENU = new Region("Menu", false);
    /**
     * MenuBar region. To bind a style to this Region use the name
     * MenuBar.
     */
    public static final Region MENU_BAR = new Region("MenuBar", false);
    /**
     * MenuItem region. To bind a style to this Region use the name
     * MenuItem.
     */
    public static final Region MENU_ITEM = new Region("MenuItem", false);
    /**
     * Accelerator region of a MenuItem. To bind a style to this
     * Region use the name MenuItemAccelerator.
     */
    public static final Region MENU_ITEM_ACCELERATOR = new Region("MenuItemAccelerator", true);
    /**
     * OptionPane region. To bind a style to this Region use
     * the name OptionPane.
     */
    public static final Region OPTION_PANE = new Region("OptionPane", false);
    /**
     * Panel region. To bind a style to this Region use the name
     * Panel.
     */
    public static final Region PANEL = new Region("Panel", false);
    /**
     * PasswordField region. To bind a style to this Region use
     * the name PasswordField.
     */
    public static final Region PASSWORD_FIELD = new Region("PasswordField", false);
    /**
     * PopupMenu region. To bind a style to this Region use
     * the name PopupMenu.
     */
    public static final Region POPUP_MENU = new Region("PopupMenu", false);
    /**
     * PopupMenuSeparator region. To bind a style to this Region
     * use the name PopupMenuSeparator.
     */
    public static final Region POPUP_MENU_SEPARATOR = new Region("PopupMenuSeparator", false);
    /**
     * ProgressBar region. To bind a style to this Region
     * use the name ProgressBar.
     */
    public static final Region PROGRESS_BAR = new Region("ProgressBar", false);
    /**
     * RadioButton region. To bind a style to this Region
     * use the name RadioButton.
     */
    public static final Region RADIO_BUTTON = new Region("RadioButton", false);
    /**
     * RegionButtonMenuItem region. To bind a style to this Region
     * use the name RadioButtonMenuItem.
     */
    public static final Region RADIO_BUTTON_MENU_ITEM = new Region("RadioButtonMenuItem", false);
    /**
     * RootPane region. To bind a style to this Region use
     * the name RootPane.
     */
    public static final Region ROOT_PANE = new Region("RootPane", false);
    /**
     * ScrollBar region. To bind a style to this Region use
     * the name ScrollBar.
     */
    public static final Region SCROLL_BAR = new Region("ScrollBar", false);
    /**
     * Track of the ScrollBar. To bind a style to this Region use
     * the name ScrollBarTrack.
     */
    public static final Region SCROLL_BAR_TRACK = new Region("ScrollBarTrack", true);
    /**
     * Thumb of the ScrollBar. The thumb is the region of the ScrollBar
     * that gives a graphical depiction of what percentage of the View is
     * currently visible. To bind a style to this Region use
     * the name ScrollBarThumb.
     */
    public static final Region SCROLL_BAR_THUMB = new Region("ScrollBarThumb", true);
    /**
     * ScrollPane region. To bind a style to this Region use
     * the name ScrollPane.
     */
    public static final Region SCROLL_PANE = new Region("ScrollPane", false);
    /**
     * Separator region. To bind a style to this Region use
     * the name Separator.
     */
    public static final Region SEPARATOR = new Region("Separator", false);
    /**
     * Slider region. To bind a style to this Region use
     * the name Slider.
     */
    public static final Region SLIDER = new Region("Slider", false);
    /**
     * Track of the Slider. To bind a style to this Region use
     * the name SliderTrack.
     */
    public static final Region SLIDER_TRACK = new Region("SliderTrack", true);
    /**
     * Thumb of the Slider. The thumb of the Slider identifies the current
     * value. To bind a style to this Region use the name
     * SliderThumb.
     */
    public static final Region SLIDER_THUMB = new Region("SliderThumb", true);
    /**
     * Spinner region. To bind a style to this Region use the name
     * Spinner.
     */
    public static final Region SPINNER = new Region("Spinner", false);
    /**
     * SplitPane region. To bind a style to this Region use the name
     * SplitPane.
     */
    public static final Region SPLIT_PANE = new Region("SplitPane", false);
    /**
     * Divider of the SplitPane. To bind a style to this Region
     * use the name SplitPaneDivider.
     */
    public static final Region SPLIT_PANE_DIVIDER = new Region("SplitPaneDivider", true);
    /**
     * TabbedPane region. To bind a style to this Region use
     * the name TabbedPane.
     */
    public static final Region TABBED_PANE = new Region("TabbedPane", false);
    /**
     * Region of a TabbedPane for one tab. To bind a style to this
     * Region use the name TabbedPaneTab.
     */
    public static final Region TABBED_PANE_TAB = new Region("TabbedPaneTab", true);
    /**
     * Region of a TabbedPane containing the tabs. To bind a style to this
     * Region use the name TabbedPaneTabArea.
     */
    public static final Region TABBED_PANE_TAB_AREA = new Region("TabbedPaneTabArea", true);
    /**
     * Region of a TabbedPane containing the content. To bind a style to this
     * Region use the name TabbedPaneContent.
     */
    public static final Region TABBED_PANE_CONTENT = new Region("TabbedPaneContent", true);
    /**
     * Table region. To bind a style to this Region use
     * the name Table.
     */
    public static final Region TABLE = new Region("Table", false);
    /**
     * TableHeader region. To bind a style to this Region use
     * the name TableHeader.
     */
    public static final Region TABLE_HEADER = new Region("TableHeader", false);
    /**
     * TextArea region. To bind a style to this Region use
     * the name TextArea.
     */
    public static final Region TEXT_AREA = new Region("TextArea", false);
    /**
     * TextField region. To bind a style to this Region use
     * the name TextField.
     */
    public static final Region TEXT_FIELD = new Region("TextField", false);
    /**
     * TextPane region. To bind a style to this Region use
     * the name TextPane.
     */
    public static final Region TEXT_PANE = new Region("TextPane", false);
    /**
     * ToggleButton region. To bind a style to this Region use
     * the name ToggleButton.
     */
    public static final Region TOGGLE_BUTTON = new Region("ToggleButton", false);
    /**
     * ToolBar region. To bind a style to this Region use
     * the name ToolBar.
     */
    public static final Region TOOL_BAR = new Region("ToolBar", false);
    /**
     * Region of the ToolBar containing the content. To bind a style to this
     * Region use the name ToolBarContent.
     */
    public static final Region TOOL_BAR_CONTENT = new Region("ToolBarContent", true);
    /**
     * Region for the Window containing the ToolBar. To bind a style to this
     * Region use the name ToolBarDragWindow.
     */
    public static final Region TOOL_BAR_DRAG_WINDOW = new Region("ToolBarDragWindow", false);
    /**
     * ToolTip region. To bind a style to this Region use
     * the name ToolTip.
     */
    public static final Region TOOL_TIP = new Region("ToolTip", false);
    /**
     * ToolBar separator region. To bind a style to this Region use
     * the name ToolBarSeparator.
     */
    public static final Region TOOL_BAR_SEPARATOR = new Region("ToolBarSeparator", false);
    /**
     * Tree region. To bind a style to this Region use the name
     * Tree.
     */
    public static final Region TREE = new Region("Tree", false);
    /**
     * Region of the Tree for one cell. To bind a style to this
     * Region use the name TreeCell.
     */
    public static final Region TREE_CELL = new Region("TreeCell", true);
    /**
     * Viewport region. To bind a style to this Region use
     * the name Viewport.
     */
    public static final Region VIEWPORT = new Region("Viewport", false);
    private static MapJComponent subclass
     * with a custom ComponentUI class.
     *
     * @param name Name of the region
     * @param ui String that will be returned from
     *           component.getUIClassID. This will be null
     *           if this is a subregion.
     * @param subregion Whether or not this is a subregion.
     */
    protected Region(String name, String ui, boolean subregion) {
        this(name, subregion);
        if (ui != null) {
            getUItoRegionMap().put(ui, this);
        }
    }
    /**
     * Returns true if the Region is a subregion of a Component, otherwise
     * false. For example, Region.BUTTON corresponds do a
     * Component so that Region.BUTTON.isSubregion()
     * returns false.
     *
     * @return true if the Region is a subregion of a Component.
     */
    public boolean isSubregion() {
        return subregion;
    }
    /**
     * Returns the name of the region.
     *
     * @return name of the Region.
     */
    public String getName() {
        return name;
    }
    /**
     * Returns the name, in lowercase.
     *
     * @return lower case representation of the name of the Region
     */
    String getLowerCaseName() {
        Map