/* * Copyright (c) 2002, 2014, 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.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: *

    *
  1. Map all characters to lowercase. *
  2. Map the first character to uppercase. *
  3. Map the first character after underscores to uppercase. *
  4. Remove all underscores. *
* For example, to identify the 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 Map getUItoRegionMap() { AppContext context = AppContext.getAppContext(); @SuppressWarnings("unchecked") Map map = (Map) context.get(UI_TO_REGION_MAP_KEY); if (map == null) { map = new HashMap(); map.put("ArrowButtonUI", ARROW_BUTTON); map.put("ButtonUI", BUTTON); map.put("CheckBoxUI", CHECK_BOX); map.put("CheckBoxMenuItemUI", CHECK_BOX_MENU_ITEM); map.put("ColorChooserUI", COLOR_CHOOSER); map.put("ComboBoxUI", COMBO_BOX); map.put("DesktopPaneUI", DESKTOP_PANE); map.put("DesktopIconUI", DESKTOP_ICON); map.put("EditorPaneUI", EDITOR_PANE); map.put("FileChooserUI", FILE_CHOOSER); map.put("FormattedTextFieldUI", FORMATTED_TEXT_FIELD); map.put("InternalFrameUI", INTERNAL_FRAME); map.put("InternalFrameTitlePaneUI", INTERNAL_FRAME_TITLE_PANE); map.put("LabelUI", LABEL); map.put("ListUI", LIST); map.put("MenuUI", MENU); map.put("MenuBarUI", MENU_BAR); map.put("MenuItemUI", MENU_ITEM); map.put("OptionPaneUI", OPTION_PANE); map.put("PanelUI", PANEL); map.put("PasswordFieldUI", PASSWORD_FIELD); map.put("PopupMenuUI", POPUP_MENU); map.put("PopupMenuSeparatorUI", POPUP_MENU_SEPARATOR); map.put("ProgressBarUI", PROGRESS_BAR); map.put("RadioButtonUI", RADIO_BUTTON); map.put("RadioButtonMenuItemUI", RADIO_BUTTON_MENU_ITEM); map.put("RootPaneUI", ROOT_PANE); map.put("ScrollBarUI", SCROLL_BAR); map.put("ScrollPaneUI", SCROLL_PANE); map.put("SeparatorUI", SEPARATOR); map.put("SliderUI", SLIDER); map.put("SpinnerUI", SPINNER); map.put("SplitPaneUI", SPLIT_PANE); map.put("TabbedPaneUI", TABBED_PANE); map.put("TableUI", TABLE); map.put("TableHeaderUI", TABLE_HEADER); map.put("TextAreaUI", TEXT_AREA); map.put("TextFieldUI", TEXT_FIELD); map.put("TextPaneUI", TEXT_PANE); map.put("ToggleButtonUI", TOGGLE_BUTTON); map.put("ToolBarUI", TOOL_BAR); map.put("ToolTipUI", TOOL_TIP); map.put("ToolBarSeparatorUI", TOOL_BAR_SEPARATOR); map.put("TreeUI", TREE); map.put("ViewportUI", VIEWPORT); context.put(UI_TO_REGION_MAP_KEY, map); } return map; } private static Map getLowerCaseNameMap() { AppContext context = AppContext.getAppContext(); @SuppressWarnings("unchecked") Map map = (Map) context.get(LOWER_CASE_NAME_MAP_KEY); if (map == null) { map = new HashMap(); context.put(LOWER_CASE_NAME_MAP_KEY, map); } return map; } static Region getRegion(JComponent c) { return getUItoRegionMap().get(c.getUIClassID()); } static void registerUIs(UIDefaults table) { for (Object key : getUItoRegionMap().keySet()) { table.put(key, "javax.swing.plaf.synth.SynthLookAndFeel"); } } private final String name; private final boolean subregion; private Region(String name, boolean subregion) { if (name == null) { throw new NullPointerException("You must specify a non-null name"); } this.name = name; this.subregion = subregion; } /** * Creates a Region with the specified name. This should only be * used if you are creating your own JComponent 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 lowerCaseNameMap = getLowerCaseNameMap(); String lowerCaseName = lowerCaseNameMap.get(this); if (lowerCaseName == null) { lowerCaseName = name.toLowerCase(Locale.ENGLISH); lowerCaseNameMap.put(this, lowerCaseName); } return lowerCaseName; } /** * Returns the name of the Region. * * @return name of the Region. */ @Override public String toString() { return name; } }