Home » openjdk-7 » javax » swing » plaf » basic » [javadoc | source]

    1   /*
    2    * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
    3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    4    *
    5    * This code is free software; you can redistribute it and/or modify it
    6    * under the terms of the GNU General Public License version 2 only, as
    7    * published by the Free Software Foundation.  Oracle designates this
    8    * particular file as subject to the "Classpath" exception as provided
    9    * by Oracle in the LICENSE file that accompanied this code.
   10    *
   11    * This code is distributed in the hope that it will be useful, but WITHOUT
   12    * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   13    * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   14    * version 2 for more details (a copy is included in the LICENSE file that
   15    * accompanied this code).
   16    *
   17    * You should have received a copy of the GNU General Public License version
   18    * 2 along with this work; if not, write to the Free Software Foundation,
   19    * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   20    *
   21    * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
   22    * or visit www.oracle.com if you need additional information or have any
   23    * questions.
   24    */
   25   
   26   package javax.swing.plaf.basic;
   27   
   28   import java.awt.Font;
   29   import java.awt.Color;
   30   import java.awt.SystemColor;
   31   import java.awt.event;
   32   import java.awt.Insets;
   33   import java.awt.Component;
   34   import java.awt.Container;
   35   import java.awt.FocusTraversalPolicy;
   36   import java.awt.AWTEvent;
   37   import java.awt.Toolkit;
   38   import java.awt.Point;
   39   import java.net.URL;
   40   import java.io;
   41   import java.awt.Dimension;
   42   import java.awt.KeyboardFocusManager;
   43   import java.security.AccessController;
   44   import java.security.PrivilegedAction;
   45   import java.util;
   46   import java.lang.reflect;
   47   import javax.sound.sampled;
   48   
   49   import sun.awt.AppContext;
   50   
   51   import sun.swing.SwingLazyValue;
   52   import sun.swing.SwingUtilities2;
   53   
   54   import javax.swing.LookAndFeel;
   55   import javax.swing.AbstractAction;
   56   import javax.swing.Action;
   57   import javax.swing.ActionMap;
   58   import javax.swing.BorderFactory;
   59   import javax.swing.JComponent;
   60   import javax.swing.ImageIcon;
   61   import javax.swing.UIDefaults;
   62   import javax.swing.UIManager;
   63   import javax.swing.KeyStroke;
   64   import javax.swing.JTextField;
   65   import javax.swing.DefaultListCellRenderer;
   66   import javax.swing.FocusManager;
   67   import javax.swing.LayoutFocusTraversalPolicy;
   68   import javax.swing.SwingUtilities;
   69   import javax.swing.MenuSelectionManager;
   70   import javax.swing.MenuElement;
   71   import javax.swing.border;
   72   import javax.swing.plaf;
   73   import javax.swing.text.JTextComponent;
   74   import javax.swing.text.DefaultEditorKit;
   75   import javax.swing.JInternalFrame;
   76   import java.beans.PropertyVetoException;
   77   import java.awt.Window;
   78   import java.beans.PropertyChangeListener;
   79   import java.beans.PropertyChangeEvent;
   80   
   81   
   82   /**
   83    * A base class to use in creating a look and feel for Swing.
   84    * <p>
   85    * Each of the {@code ComponentUI}s provided by {@code
   86    * BasicLookAndFeel} derives its behavior from the defaults
   87    * table. Unless otherwise noted each of the {@code ComponentUI}
   88    * implementations in this package document the set of defaults they
   89    * use. Unless otherwise noted the defaults are installed at the time
   90    * {@code installUI} is invoked, and follow the recommendations
   91    * outlined in {@code LookAndFeel} for installing defaults.
   92    * <p>
   93    * <strong>Warning:</strong>
   94    * Serialized objects of this class will not be compatible with
   95    * future Swing releases. The current serialization support is
   96    * appropriate for short term storage or RMI between applications running
   97    * the same version of Swing.  As of 1.4, support for long term storage
   98    * of all JavaBeans<sup><font size="-2">TM</font></sup>
   99    * has been added to the <code>java.beans</code> package.
  100    * Please see {@link java.beans.XMLEncoder}.
  101    *
  102    * @author unattributed
  103    */
  104   public abstract class BasicLookAndFeel extends LookAndFeel implements Serializable
  105   {
  106       /**
  107        * Whether or not the developer has created a JPopupMenu.
  108        */
  109       static boolean needsEventHelper;
  110   
  111       /**
  112        * Lock used when manipulating clipPlaying.
  113        */
  114       private transient Object audioLock = new Object();
  115       /**
  116        * The Clip that is currently playing (set in AudioAction).
  117        */
  118       private Clip clipPlaying;
  119   
  120       AWTEventHelper invocator = null;
  121   
  122       /*
  123        * Listen for our AppContext being disposed
  124        */
  125       private PropertyChangeListener disposer = null;
  126   
  127       /**
  128        * Returns the look and feel defaults. The returned {@code UIDefaults}
  129        * is populated by invoking, in order, {@code initClassDefaults},
  130        * {@code initSystemColorDefaults} and {@code initComponentDefaults}.
  131        * <p>
  132        * While this method is public, it should only be invoked by the
  133        * {@code UIManager} when the look and feel is set as the current
  134        * look and feel and after {@code initialize} has been invoked.
  135        *
  136        * @return the look and feel defaults
  137        *
  138        * @see #initClassDefaults
  139        * @see #initSystemColorDefaults
  140        * @see #initComponentDefaults
  141        */
  142       public UIDefaults getDefaults() {
  143           UIDefaults table = new UIDefaults(610, 0.75f);
  144   
  145           initClassDefaults(table);
  146           initSystemColorDefaults(table);
  147           initComponentDefaults(table);
  148   
  149           return table;
  150       }
  151   
  152       /**
  153        * {@inheritDoc}
  154        */
  155       public void initialize() {
  156           if (needsEventHelper) {
  157               installAWTEventListener();
  158           }
  159       }
  160   
  161       void installAWTEventListener() {
  162           if (invocator == null) {
  163               invocator = new AWTEventHelper();
  164               needsEventHelper = true;
  165   
  166               // Add a PropertyChangeListener to our AppContext so we're alerted
  167               // when the AppContext is disposed(), at which time this laf should
  168               // be uninitialize()d.
  169               disposer = new PropertyChangeListener() {
  170                   public void propertyChange(PropertyChangeEvent prpChg) {
  171                       uninitialize();
  172                   }
  173               };
  174               AppContext.getAppContext().addPropertyChangeListener(
  175                                                           AppContext.GUI_DISPOSED,
  176                                                           disposer);
  177           }
  178       }
  179   
  180       /**
  181        * {@inheritDoc}
  182        */
  183       public void uninitialize() {
  184           AppContext context = AppContext.getAppContext();
  185           synchronized (BasicPopupMenuUI.MOUSE_GRABBER_KEY) {
  186               Object grabber = context.get(BasicPopupMenuUI.MOUSE_GRABBER_KEY);
  187               if (grabber != null) {
  188                   ((BasicPopupMenuUI.MouseGrabber)grabber).uninstall();
  189               }
  190           }
  191           synchronized (BasicPopupMenuUI.MENU_KEYBOARD_HELPER_KEY) {
  192               Object helper =
  193                       context.get(BasicPopupMenuUI.MENU_KEYBOARD_HELPER_KEY);
  194               if (helper != null) {
  195                   ((BasicPopupMenuUI.MenuKeyboardHelper)helper).uninstall();
  196               }
  197           }
  198   
  199           if(invocator != null) {
  200               AccessController.doPrivileged(invocator);
  201               invocator = null;
  202           }
  203   
  204           if (disposer != null) {
  205               // Note that we're likely calling removePropertyChangeListener()
  206               // during the course of AppContext.firePropertyChange().
  207               // However, EventListenerAggreggate has code to safely modify
  208               // the list under such circumstances.
  209               context.removePropertyChangeListener(AppContext.GUI_DISPOSED,
  210                                                    disposer);
  211               disposer = null;
  212           }
  213       }
  214   
  215       /**
  216        * Populates {@code table} with mappings from {@code uiClassID} to the
  217        * fully qualified name of the ui class. The value for a
  218        * particular {@code uiClassID} is {@code
  219        * "javax.swing.plaf.basic.Basic + uiClassID"}. For example, the
  220        * value for the {@code uiClassID} {@code TreeUI} is {@code
  221        * "javax.swing.plaf.basic.BasicTreeUI"}.
  222        *
  223        * @param table the {@code UIDefaults} instance the entries are
  224        *        added to
  225        * @throws NullPointerException if {@code table} is {@code null}
  226        *
  227        * @see javax.swing.LookAndFeel
  228        * @see #getDefaults
  229        */
  230       protected void initClassDefaults(UIDefaults table)
  231       {
  232           final String basicPackageName = "javax.swing.plaf.basic.";
  233           Object[] uiDefaults = {
  234                      "ButtonUI", basicPackageName + "BasicButtonUI",
  235                    "CheckBoxUI", basicPackageName + "BasicCheckBoxUI",
  236                "ColorChooserUI", basicPackageName + "BasicColorChooserUI",
  237          "FormattedTextFieldUI", basicPackageName + "BasicFormattedTextFieldUI",
  238                     "MenuBarUI", basicPackageName + "BasicMenuBarUI",
  239                        "MenuUI", basicPackageName + "BasicMenuUI",
  240                    "MenuItemUI", basicPackageName + "BasicMenuItemUI",
  241            "CheckBoxMenuItemUI", basicPackageName + "BasicCheckBoxMenuItemUI",
  242         "RadioButtonMenuItemUI", basicPackageName + "BasicRadioButtonMenuItemUI",
  243                 "RadioButtonUI", basicPackageName + "BasicRadioButtonUI",
  244                "ToggleButtonUI", basicPackageName + "BasicToggleButtonUI",
  245                   "PopupMenuUI", basicPackageName + "BasicPopupMenuUI",
  246                 "ProgressBarUI", basicPackageName + "BasicProgressBarUI",
  247                   "ScrollBarUI", basicPackageName + "BasicScrollBarUI",
  248                  "ScrollPaneUI", basicPackageName + "BasicScrollPaneUI",
  249                   "SplitPaneUI", basicPackageName + "BasicSplitPaneUI",
  250                      "SliderUI", basicPackageName + "BasicSliderUI",
  251                   "SeparatorUI", basicPackageName + "BasicSeparatorUI",
  252                     "SpinnerUI", basicPackageName + "BasicSpinnerUI",
  253            "ToolBarSeparatorUI", basicPackageName + "BasicToolBarSeparatorUI",
  254          "PopupMenuSeparatorUI", basicPackageName + "BasicPopupMenuSeparatorUI",
  255                  "TabbedPaneUI", basicPackageName + "BasicTabbedPaneUI",
  256                    "TextAreaUI", basicPackageName + "BasicTextAreaUI",
  257                   "TextFieldUI", basicPackageName + "BasicTextFieldUI",
  258               "PasswordFieldUI", basicPackageName + "BasicPasswordFieldUI",
  259                    "TextPaneUI", basicPackageName + "BasicTextPaneUI",
  260                  "EditorPaneUI", basicPackageName + "BasicEditorPaneUI",
  261                        "TreeUI", basicPackageName + "BasicTreeUI",
  262                       "LabelUI", basicPackageName + "BasicLabelUI",
  263                        "ListUI", basicPackageName + "BasicListUI",
  264                     "ToolBarUI", basicPackageName + "BasicToolBarUI",
  265                     "ToolTipUI", basicPackageName + "BasicToolTipUI",
  266                    "ComboBoxUI", basicPackageName + "BasicComboBoxUI",
  267                       "TableUI", basicPackageName + "BasicTableUI",
  268                 "TableHeaderUI", basicPackageName + "BasicTableHeaderUI",
  269               "InternalFrameUI", basicPackageName + "BasicInternalFrameUI",
  270                 "DesktopPaneUI", basicPackageName + "BasicDesktopPaneUI",
  271                 "DesktopIconUI", basicPackageName + "BasicDesktopIconUI",
  272                 "FileChooserUI", basicPackageName + "BasicFileChooserUI",
  273                  "OptionPaneUI", basicPackageName + "BasicOptionPaneUI",
  274                       "PanelUI", basicPackageName + "BasicPanelUI",
  275                    "ViewportUI", basicPackageName + "BasicViewportUI",
  276                    "RootPaneUI", basicPackageName + "BasicRootPaneUI",
  277           };
  278   
  279           table.putDefaults(uiDefaults);
  280       }
  281   
  282       /**
  283        * Populates {@code table} with system colors. This creates an
  284        * array of {@code name-color} pairs and invokes {@code
  285        * loadSystemColors}.
  286        * <p>
  287        * The name is a {@code String} that corresponds to the name of
  288        * one of the static {@code SystemColor} fields in the {@code
  289        * SystemColor} class.  A name-color pair is created for every
  290        * such {@code SystemColor} field.
  291        * <p>
  292        * The {@code color} corresponds to a hex {@code String} as
  293        * understood by {@code Color.decode}. For example, one of the
  294        * {@code name-color} pairs is {@code
  295        * "desktop"-"#005C5C"}. This corresponds to the {@code
  296        * SystemColor} field {@code desktop}, with a color value of
  297        * {@code new Color(0x005C5C)}.
  298        * <p>
  299        * The following shows two of the {@code name-color} pairs:
  300        * <pre>
  301        *   String[] nameColorPairs = new String[] {
  302        *          "desktop", "#005C5C",
  303        *    "activeCaption", "#000080" };
  304        *   loadSystemColors(table, nameColorPairs, isNativeLookAndFeel());
  305        * </pre>
  306        *
  307        * As previously stated, this invokes {@code loadSystemColors}
  308        * with the supplied {@code table} and {@code name-color} pair
  309        * array. The last argument to {@code loadSystemColors} indicates
  310        * whether the value of the field in {@code SystemColor} should be
  311        * used. This method passes the value of {@code
  312        * isNativeLookAndFeel()} as the last argument to {@code loadSystemColors}.
  313        *
  314        * @param table the {@code UIDefaults} object the values are added to
  315        * @throws NullPointerException if {@code table} is {@code null}
  316        *
  317        * @see java.awt.SystemColor
  318        * @see #getDefaults
  319        * @see #loadSystemColors
  320        */
  321       protected void initSystemColorDefaults(UIDefaults table)
  322       {
  323           String[] defaultSystemColors = {
  324                   "desktop", "#005C5C", /* Color of the desktop background */
  325             "activeCaption", "#000080", /* Color for captions (title bars) when they are active. */
  326         "activeCaptionText", "#FFFFFF", /* Text color for text in captions (title bars). */
  327       "activeCaptionBorder", "#C0C0C0", /* Border color for caption (title bar) window borders. */
  328           "inactiveCaption", "#808080", /* Color for captions (title bars) when not active. */
  329       "inactiveCaptionText", "#C0C0C0", /* Text color for text in inactive captions (title bars). */
  330     "inactiveCaptionBorder", "#C0C0C0", /* Border color for inactive caption (title bar) window borders. */
  331                    "window", "#FFFFFF", /* Default color for the interior of windows */
  332              "windowBorder", "#000000", /* ??? */
  333                "windowText", "#000000", /* ??? */
  334                      "menu", "#C0C0C0", /* Background color for menus */
  335                  "menuText", "#000000", /* Text color for menus  */
  336                      "text", "#C0C0C0", /* Text background color */
  337                  "textText", "#000000", /* Text foreground color */
  338             "textHighlight", "#000080", /* Text background color when selected */
  339         "textHighlightText", "#FFFFFF", /* Text color when selected */
  340          "textInactiveText", "#808080", /* Text color when disabled */
  341                   "control", "#C0C0C0", /* Default color for controls (buttons, sliders, etc) */
  342               "controlText", "#000000", /* Default color for text in controls */
  343          "controlHighlight", "#C0C0C0", /* Specular highlight (opposite of the shadow) */
  344        "controlLtHighlight", "#FFFFFF", /* Highlight color for controls */
  345             "controlShadow", "#808080", /* Shadow color for controls */
  346           "controlDkShadow", "#000000", /* Dark shadow color for controls */
  347                 "scrollbar", "#E0E0E0", /* Scrollbar background (usually the "track") */
  348                      "info", "#FFFFE1", /* ??? */
  349                  "infoText", "#000000"  /* ??? */
  350           };
  351   
  352           loadSystemColors(table, defaultSystemColors, isNativeLookAndFeel());
  353       }
  354   
  355   
  356       /**
  357        * Populates {@code table} with the {@code name-color} pairs in
  358        * {@code systemColors}. Refer to
  359        * {@link #initSystemColorDefaults(UIDefaults)} for details on
  360        * the format of {@code systemColors}.
  361        * <p>
  362        * An entry is added to {@code table} for each of the {@code name-color}
  363        * pairs in {@code systemColors}. The entry key is
  364        * the {@code name} of the {@code name-color} pair.
  365        * <p>
  366        * The value of the entry corresponds to the {@code color} of the
  367        * {@code name-color} pair.  The value of the entry is calculated
  368        * in one of two ways. With either approach the value is always a
  369        * {@code ColorUIResource}.
  370        * <p>
  371        * If {@code useNative} is {@code false}, the {@code color} is
  372        * created by using {@code Color.decode} to convert the {@code
  373        * String} into a {@code Color}. If {@code decode} can not convert
  374        * the {@code String} into a {@code Color} ({@code
  375        * NumberFormatException} is thrown) then a {@code
  376        * ColorUIResource} of black is used.
  377        * <p>
  378        * If {@code useNative} is {@code true}, the {@code color} is the
  379        * value of the field in {@code SystemColor} with the same name as
  380        * the {@code name} of the {@code name-color} pair. If the field
  381        * is not valid, a {@code ColorUIResource} of black is used.
  382        *
  383        * @param table the {@code UIDefaults} object the values are added to
  384        * @param systemColors array of {@code name-color} pairs as described
  385        *        in {@link #initSystemColorDefaults(UIDefaults)}
  386        * @param useNative whether the color is obtained from {@code SystemColor}
  387        *        or {@code Color.decode}
  388        * @throws NullPointerException if {@code systemColors} is {@code null}; or
  389        *         {@code systemColors} is not empty, and {@code table} is
  390        *         {@code null}; or one of the
  391        *         names of the {@code name-color} pairs is {@code null}; or
  392        *         {@code useNative} is {@code false} and one of the
  393        *         {@code colors} of the {@code name-color} pairs is {@code null}
  394        * @throws ArrayIndexOutOfBoundsException if {@code useNative} is
  395        *         {@code false} and {@code systemColors.length} is odd
  396        *
  397        * @see #initSystemColorDefaults(javax.swing.UIDefaults)
  398        * @see java.awt.SystemColor
  399        * @see java.awt.Color#decode(String)
  400        */
  401       protected void loadSystemColors(UIDefaults table, String[] systemColors, boolean useNative)
  402       {
  403           /* PENDING(hmuller) We don't load the system colors below because
  404            * they're not reliable.  Hopefully we'll be able to do better in
  405            * a future version of AWT.
  406            */
  407           if (useNative) {
  408               for(int i = 0; i < systemColors.length; i += 2) {
  409                   Color color = Color.black;
  410                   try {
  411                       String name = systemColors[i];
  412                       color = (Color)(SystemColor.class.getField(name).get(null));
  413                   } catch (Exception e) {
  414                   }
  415                   table.put(systemColors[i], new ColorUIResource(color));
  416               }
  417           } else {
  418               for(int i = 0; i < systemColors.length; i += 2) {
  419                   Color color = Color.black;
  420                   try {
  421                       color = Color.decode(systemColors[i + 1]);
  422                   }
  423                   catch(NumberFormatException e) {
  424                       e.printStackTrace();
  425                   }
  426                   table.put(systemColors[i], new ColorUIResource(color));
  427               }
  428           }
  429       }
  430       /**
  431        * Initialize the defaults table with the name of the ResourceBundle
  432        * used for getting localized defaults.  Also initialize the default
  433        * locale used when no locale is passed into UIDefaults.get().  The
  434        * default locale should generally not be relied upon. It is here for
  435        * compatability with releases prior to 1.4.
  436        */
  437       private void initResourceBundle(UIDefaults table) {
  438           table.setDefaultLocale( Locale.getDefault() );
  439           table.addResourceBundle( "com.sun.swing.internal.plaf.basic.resources.basic" );
  440       }
  441   
  442       /**
  443        * Populates {@code table} with the defaults for the basic look and
  444        * feel.
  445        *
  446        * @param table the {@code UIDefaults} to add the values to
  447        * @throws NullPointerException if {@code table} is {@code null}
  448        */
  449       protected void initComponentDefaults(UIDefaults table)
  450       {
  451   
  452           initResourceBundle(table);
  453   
  454           // *** Shared Integers
  455           Integer fiveHundred = new Integer(500);
  456   
  457           // *** Shared Longs
  458           Long oneThousand = new Long(1000);
  459   
  460           // *** Shared Fonts
  461           Integer twelve = new Integer(12);
  462           Integer fontPlain = new Integer(Font.PLAIN);
  463           Integer fontBold = new Integer(Font.BOLD);
  464           Object dialogPlain12 = new SwingLazyValue(
  465                             "javax.swing.plaf.FontUIResource",
  466                             null,
  467                             new Object[] {Font.DIALOG, fontPlain, twelve});
  468           Object serifPlain12 = new SwingLazyValue(
  469                             "javax.swing.plaf.FontUIResource",
  470                             null,
  471                             new Object[] {Font.SERIF, fontPlain, twelve});
  472           Object sansSerifPlain12 =  new SwingLazyValue(
  473                             "javax.swing.plaf.FontUIResource",
  474                             null,
  475                             new Object[] {Font.SANS_SERIF, fontPlain, twelve});
  476           Object monospacedPlain12 = new SwingLazyValue(
  477                             "javax.swing.plaf.FontUIResource",
  478                             null,
  479                             new Object[] {Font.MONOSPACED, fontPlain, twelve});
  480           Object dialogBold12 = new SwingLazyValue(
  481                             "javax.swing.plaf.FontUIResource",
  482                             null,
  483                             new Object[] {Font.DIALOG, fontBold, twelve});
  484   
  485   
  486           // *** Shared Colors
  487           ColorUIResource red = new ColorUIResource(Color.red);
  488           ColorUIResource black = new ColorUIResource(Color.black);
  489           ColorUIResource white = new ColorUIResource(Color.white);
  490           ColorUIResource yellow = new ColorUIResource(Color.yellow);
  491           ColorUIResource gray = new ColorUIResource(Color.gray);
  492           ColorUIResource lightGray = new ColorUIResource(Color.lightGray);
  493           ColorUIResource darkGray = new ColorUIResource(Color.darkGray);
  494           ColorUIResource scrollBarTrack = new ColorUIResource(224, 224, 224);
  495   
  496           Color control = table.getColor("control");
  497           Color controlDkShadow = table.getColor("controlDkShadow");
  498           Color controlHighlight = table.getColor("controlHighlight");
  499           Color controlLtHighlight = table.getColor("controlLtHighlight");
  500           Color controlShadow = table.getColor("controlShadow");
  501           Color controlText = table.getColor("controlText");
  502           Color menu = table.getColor("menu");
  503           Color menuText = table.getColor("menuText");
  504           Color textHighlight = table.getColor("textHighlight");
  505           Color textHighlightText = table.getColor("textHighlightText");
  506           Color textInactiveText = table.getColor("textInactiveText");
  507           Color textText = table.getColor("textText");
  508           Color window = table.getColor("window");
  509   
  510           // *** Shared Insets
  511           InsetsUIResource zeroInsets = new InsetsUIResource(0,0,0,0);
  512           InsetsUIResource twoInsets = new InsetsUIResource(2,2,2,2);
  513           InsetsUIResource threeInsets = new InsetsUIResource(3,3,3,3);
  514   
  515           // *** Shared Borders
  516           Object marginBorder = new SwingLazyValue(
  517                             "javax.swing.plaf.basic.BasicBorders$MarginBorder");
  518           Object etchedBorder = new SwingLazyValue(
  519                             "javax.swing.plaf.BorderUIResource",
  520                             "getEtchedBorderUIResource");
  521           Object loweredBevelBorder = new SwingLazyValue(
  522                             "javax.swing.plaf.BorderUIResource",
  523                             "getLoweredBevelBorderUIResource");
  524   
  525           Object popupMenuBorder = new SwingLazyValue(
  526                             "javax.swing.plaf.basic.BasicBorders",
  527                             "getInternalFrameBorder");
  528   
  529           Object blackLineBorder = new SwingLazyValue(
  530                             "javax.swing.plaf.BorderUIResource",
  531                             "getBlackLineBorderUIResource");
  532           Object focusCellHighlightBorder = new SwingLazyValue(
  533                             "javax.swing.plaf.BorderUIResource$LineBorderUIResource",
  534                             null,
  535                             new Object[] {yellow});
  536   
  537           Object noFocusBorder = new BorderUIResource.EmptyBorderUIResource(1,1,1,1);
  538   
  539           Object tableHeaderBorder = new SwingLazyValue(
  540                             "javax.swing.plaf.BorderUIResource$BevelBorderUIResource",
  541                             null,
  542                             new Object[] { new Integer(BevelBorder.RAISED),
  543                                            controlLtHighlight,
  544                                            control,
  545                                            controlDkShadow,
  546                                            controlShadow });
  547   
  548   
  549           // *** Button value objects
  550   
  551           Object buttonBorder =
  552               new SwingLazyValue(
  553                               "javax.swing.plaf.basic.BasicBorders",
  554                               "getButtonBorder");
  555   
  556           Object buttonToggleBorder =
  557               new SwingLazyValue(
  558                               "javax.swing.plaf.basic.BasicBorders",
  559                               "getToggleButtonBorder");
  560   
  561           Object radioButtonBorder =
  562               new SwingLazyValue(
  563                               "javax.swing.plaf.basic.BasicBorders",
  564                               "getRadioButtonBorder");
  565   
  566           // *** FileChooser / FileView value objects
  567   
  568           Object newFolderIcon = SwingUtilities2.makeIcon(getClass(),
  569                                                           BasicLookAndFeel.class,
  570                                                           "icons/NewFolder.gif");
  571           Object upFolderIcon = SwingUtilities2.makeIcon(getClass(),
  572                                                          BasicLookAndFeel.class,
  573                                                          "icons/UpFolder.gif");
  574           Object homeFolderIcon = SwingUtilities2.makeIcon(getClass(),
  575                                                            BasicLookAndFeel.class,
  576                                                            "icons/HomeFolder.gif");
  577           Object detailsViewIcon = SwingUtilities2.makeIcon(getClass(),
  578                                                             BasicLookAndFeel.class,
  579                                                             "icons/DetailsView.gif");
  580           Object listViewIcon = SwingUtilities2.makeIcon(getClass(),
  581                                                          BasicLookAndFeel.class,
  582                                                          "icons/ListView.gif");
  583           Object directoryIcon = SwingUtilities2.makeIcon(getClass(),
  584                                                           BasicLookAndFeel.class,
  585                                                           "icons/Directory.gif");
  586           Object fileIcon = SwingUtilities2.makeIcon(getClass(),
  587                                                      BasicLookAndFeel.class,
  588                                                      "icons/File.gif");
  589           Object computerIcon = SwingUtilities2.makeIcon(getClass(),
  590                                                          BasicLookAndFeel.class,
  591                                                          "icons/Computer.gif");
  592           Object hardDriveIcon = SwingUtilities2.makeIcon(getClass(),
  593                                                           BasicLookAndFeel.class,
  594                                                           "icons/HardDrive.gif");
  595           Object floppyDriveIcon = SwingUtilities2.makeIcon(getClass(),
  596                                                             BasicLookAndFeel.class,
  597                                                             "icons/FloppyDrive.gif");
  598   
  599   
  600           // *** InternalFrame value objects
  601   
  602           Object internalFrameBorder = new SwingLazyValue(
  603                   "javax.swing.plaf.basic.BasicBorders",
  604                   "getInternalFrameBorder");
  605   
  606           // *** List value objects
  607   
  608           Object listCellRendererActiveValue = new UIDefaults.ActiveValue() {
  609               public Object createValue(UIDefaults table) {
  610                   return new DefaultListCellRenderer.UIResource();
  611               }
  612           };
  613   
  614   
  615           // *** Menus value objects
  616   
  617           Object menuBarBorder =
  618               new SwingLazyValue(
  619                   "javax.swing.plaf.basic.BasicBorders",
  620                   "getMenuBarBorder");
  621   
  622           Object menuItemCheckIcon =
  623               new SwingLazyValue(
  624                   "javax.swing.plaf.basic.BasicIconFactory",
  625                   "getMenuItemCheckIcon");
  626   
  627           Object menuItemArrowIcon =
  628               new SwingLazyValue(
  629                   "javax.swing.plaf.basic.BasicIconFactory",
  630                   "getMenuItemArrowIcon");
  631   
  632   
  633           Object menuArrowIcon =
  634               new SwingLazyValue(
  635                   "javax.swing.plaf.basic.BasicIconFactory",
  636                   "getMenuArrowIcon");
  637   
  638           Object checkBoxIcon =
  639               new SwingLazyValue(
  640                   "javax.swing.plaf.basic.BasicIconFactory",
  641                   "getCheckBoxIcon");
  642   
  643           Object radioButtonIcon =
  644               new SwingLazyValue(
  645                   "javax.swing.plaf.basic.BasicIconFactory",
  646                   "getRadioButtonIcon");
  647   
  648           Object checkBoxMenuItemIcon =
  649               new SwingLazyValue(
  650                   "javax.swing.plaf.basic.BasicIconFactory",
  651                   "getCheckBoxMenuItemIcon");
  652   
  653           Object radioButtonMenuItemIcon =
  654               new SwingLazyValue(
  655                   "javax.swing.plaf.basic.BasicIconFactory",
  656                   "getRadioButtonMenuItemIcon");
  657   
  658           Object menuItemAcceleratorDelimiter = "+";
  659   
  660           // *** OptionPane value objects
  661   
  662           Object optionPaneMinimumSize = new DimensionUIResource(262, 90);
  663   
  664           Integer zero =  new Integer(0);
  665           Object zeroBorder = new SwingLazyValue(
  666                              "javax.swing.plaf.BorderUIResource$EmptyBorderUIResource",
  667                              new Object[] {zero, zero, zero, zero});
  668   
  669           Integer ten = new Integer(10);
  670           Object optionPaneBorder = new SwingLazyValue(
  671                              "javax.swing.plaf.BorderUIResource$EmptyBorderUIResource",
  672                              new Object[] {ten, ten, twelve, ten});
  673   
  674           Object optionPaneButtonAreaBorder = new SwingLazyValue(
  675                              "javax.swing.plaf.BorderUIResource$EmptyBorderUIResource",
  676                              new Object[] {new Integer(6), zero, zero, zero});
  677   
  678   
  679           // *** ProgessBar value objects
  680   
  681           Object progressBarBorder =
  682               new SwingLazyValue(
  683                               "javax.swing.plaf.basic.BasicBorders",
  684                               "getProgressBarBorder");
  685   
  686           // ** ScrollBar value objects
  687   
  688           Object minimumThumbSize = new DimensionUIResource(8,8);
  689           Object maximumThumbSize = new DimensionUIResource(4096,4096);
  690   
  691           // ** Slider value objects
  692   
  693           Object sliderFocusInsets = twoInsets;
  694   
  695           Object toolBarSeparatorSize = new DimensionUIResource( 10, 10 );
  696   
  697   
  698           // *** SplitPane value objects
  699   
  700           Object splitPaneBorder =
  701               new SwingLazyValue(
  702                               "javax.swing.plaf.basic.BasicBorders",
  703                               "getSplitPaneBorder");
  704           Object splitPaneDividerBorder =
  705               new SwingLazyValue(
  706                               "javax.swing.plaf.basic.BasicBorders",
  707                               "getSplitPaneDividerBorder");
  708   
  709           // ** TabbedBane value objects
  710   
  711           Object tabbedPaneTabInsets = new InsetsUIResource(0, 4, 1, 4);
  712   
  713           Object tabbedPaneTabPadInsets = new InsetsUIResource(2, 2, 2, 1);
  714   
  715           Object tabbedPaneTabAreaInsets = new InsetsUIResource(3, 2, 0, 2);
  716   
  717           Object tabbedPaneContentBorderInsets = new InsetsUIResource(2, 2, 3, 3);
  718   
  719   
  720           // *** Text value objects
  721   
  722           Object textFieldBorder =
  723               new SwingLazyValue(
  724                               "javax.swing.plaf.basic.BasicBorders",
  725                               "getTextFieldBorder");
  726   
  727           Object editorMargin = threeInsets;
  728   
  729           Object caretBlinkRate = fiveHundred;
  730           Integer four = new Integer(4);
  731   
  732           Object[] allAuditoryCues = new Object[] {
  733                   "CheckBoxMenuItem.commandSound",
  734                   "InternalFrame.closeSound",
  735                   "InternalFrame.maximizeSound",
  736                   "InternalFrame.minimizeSound",
  737                   "InternalFrame.restoreDownSound",
  738                   "InternalFrame.restoreUpSound",
  739                   "MenuItem.commandSound",
  740                   "OptionPane.errorSound",
  741                   "OptionPane.informationSound",
  742                   "OptionPane.questionSound",
  743                   "OptionPane.warningSound",
  744                   "PopupMenu.popupSound",
  745                   "RadioButtonMenuItem.commandSound"};
  746   
  747           Object[] noAuditoryCues = new Object[] {"mute"};
  748   
  749           // *** Component Defaults
  750   
  751           Object[] defaults = {
  752               // *** Auditory Feedback
  753               "AuditoryCues.cueList", allAuditoryCues,
  754               "AuditoryCues.allAuditoryCues", allAuditoryCues,
  755               "AuditoryCues.noAuditoryCues", noAuditoryCues,
  756               // this key defines which of the various cues to render.
  757               // L&Fs that want auditory feedback NEED to override playList.
  758               "AuditoryCues.playList", null,
  759   
  760               // *** Buttons
  761               "Button.defaultButtonFollowsFocus", Boolean.TRUE,
  762               "Button.font", dialogPlain12,
  763               "Button.background", control,
  764               "Button.foreground", controlText,
  765               "Button.shadow", controlShadow,
  766               "Button.darkShadow", controlDkShadow,
  767               "Button.light", controlHighlight,
  768               "Button.highlight", controlLtHighlight,
  769               "Button.border", buttonBorder,
  770               "Button.margin", new InsetsUIResource(2, 14, 2, 14),
  771               "Button.textIconGap", four,
  772               "Button.textShiftOffset", zero,
  773               "Button.focusInputMap", new UIDefaults.LazyInputMap(new Object[] {
  774                            "SPACE", "pressed",
  775                   "released SPACE", "released",
  776                            "ENTER", "pressed",
  777                   "released ENTER", "released"
  778                 }),
  779   
  780               "ToggleButton.font", dialogPlain12,
  781               "ToggleButton.background", control,
  782               "ToggleButton.foreground", controlText,
  783               "ToggleButton.shadow", controlShadow,
  784               "ToggleButton.darkShadow", controlDkShadow,
  785               "ToggleButton.light", controlHighlight,
  786               "ToggleButton.highlight", controlLtHighlight,
  787               "ToggleButton.border", buttonToggleBorder,
  788               "ToggleButton.margin", new InsetsUIResource(2, 14, 2, 14),
  789               "ToggleButton.textIconGap", four,
  790               "ToggleButton.textShiftOffset", zero,
  791               "ToggleButton.focusInputMap",
  792                 new UIDefaults.LazyInputMap(new Object[] {
  793                               "SPACE", "pressed",
  794                      "released SPACE", "released"
  795                   }),
  796   
  797               "RadioButton.font", dialogPlain12,
  798               "RadioButton.background", control,
  799               "RadioButton.foreground", controlText,
  800               "RadioButton.shadow", controlShadow,
  801               "RadioButton.darkShadow", controlDkShadow,
  802               "RadioButton.light", controlHighlight,
  803               "RadioButton.highlight", controlLtHighlight,
  804               "RadioButton.border", radioButtonBorder,
  805               "RadioButton.margin", twoInsets,
  806               "RadioButton.textIconGap", four,
  807               "RadioButton.textShiftOffset", zero,
  808               "RadioButton.icon", radioButtonIcon,
  809               "RadioButton.focusInputMap",
  810                  new UIDefaults.LazyInputMap(new Object[] {
  811                             "SPACE", "pressed",
  812                    "released SPACE", "released",
  813                            "RETURN", "pressed"
  814                 }),
  815   
  816               "CheckBox.font", dialogPlain12,
  817               "CheckBox.background", control,
  818               "CheckBox.foreground", controlText,
  819               "CheckBox.border", radioButtonBorder,
  820               "CheckBox.margin", twoInsets,
  821               "CheckBox.textIconGap", four,
  822               "CheckBox.textShiftOffset", zero,
  823               "CheckBox.icon", checkBoxIcon,
  824               "CheckBox.focusInputMap",
  825                  new UIDefaults.LazyInputMap(new Object[] {
  826                               "SPACE", "pressed",
  827                      "released SPACE", "released"
  828                    }),
  829               "FileChooser.useSystemExtensionHiding", Boolean.FALSE,
  830   
  831               // *** ColorChooser
  832               "ColorChooser.font", dialogPlain12,
  833               "ColorChooser.background", control,
  834               "ColorChooser.foreground", controlText,
  835   
  836               "ColorChooser.swatchesSwatchSize", new Dimension(10, 10),
  837               "ColorChooser.swatchesRecentSwatchSize", new Dimension(10, 10),
  838               "ColorChooser.swatchesDefaultRecentColor", control,
  839   
  840               // *** ComboBox
  841               "ComboBox.font", sansSerifPlain12,
  842               "ComboBox.background", window,
  843               "ComboBox.foreground", textText,
  844               "ComboBox.buttonBackground", control,
  845               "ComboBox.buttonShadow", controlShadow,
  846               "ComboBox.buttonDarkShadow", controlDkShadow,
  847               "ComboBox.buttonHighlight", controlLtHighlight,
  848               "ComboBox.selectionBackground", textHighlight,
  849               "ComboBox.selectionForeground", textHighlightText,
  850               "ComboBox.disabledBackground", control,
  851               "ComboBox.disabledForeground", textInactiveText,
  852               "ComboBox.timeFactor", oneThousand,
  853               "ComboBox.isEnterSelectablePopup", Boolean.FALSE,
  854               "ComboBox.ancestorInputMap",
  855                  new UIDefaults.LazyInputMap(new Object[] {
  856                         "ESCAPE", "hidePopup",
  857                        "PAGE_UP", "pageUpPassThrough",
  858                      "PAGE_DOWN", "pageDownPassThrough",
  859                           "HOME", "homePassThrough",
  860                            "END", "endPassThrough",
  861                          "ENTER", "enterPressed"
  862                    }),
  863   
  864               // *** FileChooser
  865   
  866               "FileChooser.newFolderIcon", newFolderIcon,
  867               "FileChooser.upFolderIcon", upFolderIcon,
  868               "FileChooser.homeFolderIcon", homeFolderIcon,
  869               "FileChooser.detailsViewIcon", detailsViewIcon,
  870               "FileChooser.listViewIcon", listViewIcon,
  871               "FileChooser.readOnly", Boolean.FALSE,
  872               "FileChooser.usesSingleFilePane", Boolean.FALSE,
  873               "FileChooser.ancestorInputMap",
  874                  new UIDefaults.LazyInputMap(new Object[] {
  875                        "ESCAPE", "cancelSelection",
  876                        "F5", "refresh",
  877                    }),
  878   
  879               "FileView.directoryIcon", directoryIcon,
  880               "FileView.fileIcon", fileIcon,
  881               "FileView.computerIcon", computerIcon,
  882               "FileView.hardDriveIcon", hardDriveIcon,
  883               "FileView.floppyDriveIcon", floppyDriveIcon,
  884   
  885               // *** InternalFrame
  886               "InternalFrame.titleFont", dialogBold12,
  887               "InternalFrame.borderColor", control,
  888               "InternalFrame.borderShadow", controlShadow,
  889               "InternalFrame.borderDarkShadow", controlDkShadow,
  890               "InternalFrame.borderHighlight", controlLtHighlight,
  891               "InternalFrame.borderLight", controlHighlight,
  892               "InternalFrame.border", internalFrameBorder,
  893               "InternalFrame.icon",   SwingUtilities2.makeIcon(getClass(),
  894                                                                BasicLookAndFeel.class,
  895                                                                "icons/JavaCup16.png"),
  896   
  897               /* Default frame icons are undefined for Basic. */
  898               "InternalFrame.maximizeIcon",
  899               new SwingLazyValue(
  900                              "javax.swing.plaf.basic.BasicIconFactory",
  901                              "createEmptyFrameIcon"),
  902               "InternalFrame.minimizeIcon",
  903               new SwingLazyValue(
  904                              "javax.swing.plaf.basic.BasicIconFactory",
  905                              "createEmptyFrameIcon"),
  906               "InternalFrame.iconifyIcon",
  907               new SwingLazyValue(
  908                              "javax.swing.plaf.basic.BasicIconFactory",
  909                              "createEmptyFrameIcon"),
  910               "InternalFrame.closeIcon",
  911               new SwingLazyValue(
  912                              "javax.swing.plaf.basic.BasicIconFactory",
  913                              "createEmptyFrameIcon"),
  914               // InternalFrame Auditory Cue Mappings
  915               "InternalFrame.closeSound", null,
  916               "InternalFrame.maximizeSound", null,
  917               "InternalFrame.minimizeSound", null,
  918               "InternalFrame.restoreDownSound", null,
  919               "InternalFrame.restoreUpSound", null,
  920   
  921               "InternalFrame.activeTitleBackground", table.get("activeCaption"),
  922               "InternalFrame.activeTitleForeground", table.get("activeCaptionText"),
  923               "InternalFrame.inactiveTitleBackground", table.get("inactiveCaption"),
  924               "InternalFrame.inactiveTitleForeground", table.get("inactiveCaptionText"),
  925               "InternalFrame.windowBindings", new Object[] {
  926                 "shift ESCAPE", "showSystemMenu",
  927                   "ctrl SPACE", "showSystemMenu",
  928                       "ESCAPE", "hideSystemMenu"},
  929   
  930               "InternalFrameTitlePane.iconifyButtonOpacity", Boolean.TRUE,
  931               "InternalFrameTitlePane.maximizeButtonOpacity", Boolean.TRUE,
  932               "InternalFrameTitlePane.closeButtonOpacity", Boolean.TRUE,
  933   
  934           "DesktopIcon.border", internalFrameBorder,
  935   
  936               "Desktop.minOnScreenInsets", threeInsets,
  937               "Desktop.background", table.get("desktop"),
  938               "Desktop.ancestorInputMap",
  939                  new UIDefaults.LazyInputMap(new Object[] {
  940                    "ctrl F5", "restore",
  941                    "ctrl F4", "close",
  942                    "ctrl F7", "move",
  943                    "ctrl F8", "resize",
  944                      "RIGHT", "right",
  945                   "KP_RIGHT", "right",
  946                "shift RIGHT", "shrinkRight",
  947             "shift KP_RIGHT", "shrinkRight",
  948                       "LEFT", "left",
  949                    "KP_LEFT", "left",
  950                 "shift LEFT", "shrinkLeft",
  951              "shift KP_LEFT", "shrinkLeft",
  952                         "UP", "up",
  953                      "KP_UP", "up",
  954                   "shift UP", "shrinkUp",
  955                "shift KP_UP", "shrinkUp",
  956                       "DOWN", "down",
  957                    "KP_DOWN", "down",
  958                 "shift DOWN", "shrinkDown",
  959              "shift KP_DOWN", "shrinkDown",
  960                     "ESCAPE", "escape",
  961                    "ctrl F9", "minimize",
  962                   "ctrl F10", "maximize",
  963                    "ctrl F6", "selectNextFrame",
  964                   "ctrl TAB", "selectNextFrame",
  965                "ctrl alt F6", "selectNextFrame",
  966          "shift ctrl alt F6", "selectPreviousFrame",
  967                   "ctrl F12", "navigateNext",
  968             "shift ctrl F12", "navigatePrevious"
  969                 }),
  970   
  971               // *** Label
  972               "Label.font", dialogPlain12,
  973               "Label.background", control,
  974               "Label.foreground", controlText,
  975               "Label.disabledForeground", white,
  976               "Label.disabledShadow", controlShadow,
  977               "Label.border", null,
  978   
  979               // *** List
  980               "List.font", dialogPlain12,
  981               "List.background", window,
  982               "List.foreground", textText,
  983               "List.selectionBackground", textHighlight,
  984               "List.selectionForeground", textHighlightText,
  985               "List.noFocusBorder", noFocusBorder,
  986               "List.focusCellHighlightBorder", focusCellHighlightBorder,
  987               "List.dropLineColor", controlShadow,
  988               "List.border", null,
  989               "List.cellRenderer", listCellRendererActiveValue,
  990               "List.timeFactor", oneThousand,
  991               "List.focusInputMap",
  992                  new UIDefaults.LazyInputMap(new Object[] {
  993                              "ctrl C", "copy",
  994                              "ctrl V", "paste",
  995                              "ctrl X", "cut",
  996                                "COPY", "copy",
  997                               "PASTE", "paste",
  998                                 "CUT", "cut",
  999                      "control INSERT", "copy",
 1000                        "shift INSERT", "paste",
 1001                        "shift DELETE", "cut",
 1002                                  "UP", "selectPreviousRow",
 1003                               "KP_UP", "selectPreviousRow",
 1004                            "shift UP", "selectPreviousRowExtendSelection",
 1005                         "shift KP_UP", "selectPreviousRowExtendSelection",
 1006                       "ctrl shift UP", "selectPreviousRowExtendSelection",
 1007                    "ctrl shift KP_UP", "selectPreviousRowExtendSelection",
 1008                             "ctrl UP", "selectPreviousRowChangeLead",
 1009                          "ctrl KP_UP", "selectPreviousRowChangeLead",
 1010                                "DOWN", "selectNextRow",
 1011                             "KP_DOWN", "selectNextRow",
 1012                          "shift DOWN", "selectNextRowExtendSelection",
 1013                       "shift KP_DOWN", "selectNextRowExtendSelection",
 1014                     "ctrl shift DOWN", "selectNextRowExtendSelection",
 1015                  "ctrl shift KP_DOWN", "selectNextRowExtendSelection",
 1016                           "ctrl DOWN", "selectNextRowChangeLead",
 1017                        "ctrl KP_DOWN", "selectNextRowChangeLead",
 1018                                "LEFT", "selectPreviousColumn",
 1019                             "KP_LEFT", "selectPreviousColumn",
 1020                          "shift LEFT", "selectPreviousColumnExtendSelection",
 1021                       "shift KP_LEFT", "selectPreviousColumnExtendSelection",
 1022                     "ctrl shift LEFT", "selectPreviousColumnExtendSelection",
 1023                  "ctrl shift KP_LEFT", "selectPreviousColumnExtendSelection",
 1024                           "ctrl LEFT", "selectPreviousColumnChangeLead",
 1025                        "ctrl KP_LEFT", "selectPreviousColumnChangeLead",
 1026                               "RIGHT", "selectNextColumn",
 1027                            "KP_RIGHT", "selectNextColumn",
 1028                         "shift RIGHT", "selectNextColumnExtendSelection",
 1029                      "shift KP_RIGHT", "selectNextColumnExtendSelection",
 1030                    "ctrl shift RIGHT", "selectNextColumnExtendSelection",
 1031                 "ctrl shift KP_RIGHT", "selectNextColumnExtendSelection",
 1032                          "ctrl RIGHT", "selectNextColumnChangeLead",
 1033                       "ctrl KP_RIGHT", "selectNextColumnChangeLead",
 1034                                "HOME", "selectFirstRow",
 1035                          "shift HOME", "selectFirstRowExtendSelection",
 1036                     "ctrl shift HOME", "selectFirstRowExtendSelection",
 1037                           "ctrl HOME", "selectFirstRowChangeLead",
 1038                                 "END", "selectLastRow",
 1039                           "shift END", "selectLastRowExtendSelection",
 1040                      "ctrl shift END", "selectLastRowExtendSelection",
 1041                            "ctrl END", "selectLastRowChangeLead",
 1042                             "PAGE_UP", "scrollUp",
 1043                       "shift PAGE_UP", "scrollUpExtendSelection",
 1044                  "ctrl shift PAGE_UP", "scrollUpExtendSelection",
 1045                        "ctrl PAGE_UP", "scrollUpChangeLead",
 1046                           "PAGE_DOWN", "scrollDown",
 1047                     "shift PAGE_DOWN", "scrollDownExtendSelection",
 1048                "ctrl shift PAGE_DOWN", "scrollDownExtendSelection",
 1049                      "ctrl PAGE_DOWN", "scrollDownChangeLead",
 1050                              "ctrl A", "selectAll",
 1051                          "ctrl SLASH", "selectAll",
 1052                     "ctrl BACK_SLASH", "clearSelection",
 1053                               "SPACE", "addToSelection",
 1054                          "ctrl SPACE", "toggleAndAnchor",
 1055                         "shift SPACE", "extendTo",
 1056                    "ctrl shift SPACE", "moveSelectionTo"
 1057                    }),
 1058               "List.focusInputMap.RightToLeft",
 1059                  new UIDefaults.LazyInputMap(new Object[] {
 1060                                "LEFT", "selectNextColumn",
 1061                             "KP_LEFT", "selectNextColumn",
 1062                          "shift LEFT", "selectNextColumnExtendSelection",
 1063                       "shift KP_LEFT", "selectNextColumnExtendSelection",
 1064                     "ctrl shift LEFT", "selectNextColumnExtendSelection",
 1065                  "ctrl shift KP_LEFT", "selectNextColumnExtendSelection",
 1066                           "ctrl LEFT", "selectNextColumnChangeLead",
 1067                        "ctrl KP_LEFT", "selectNextColumnChangeLead",
 1068                               "RIGHT", "selectPreviousColumn",
 1069                            "KP_RIGHT", "selectPreviousColumn",
 1070                         "shift RIGHT", "selectPreviousColumnExtendSelection",
 1071                      "shift KP_RIGHT", "selectPreviousColumnExtendSelection",
 1072                    "ctrl shift RIGHT", "selectPreviousColumnExtendSelection",
 1073                 "ctrl shift KP_RIGHT", "selectPreviousColumnExtendSelection",
 1074                          "ctrl RIGHT", "selectPreviousColumnChangeLead",
 1075                       "ctrl KP_RIGHT", "selectPreviousColumnChangeLead",
 1076                    }),
 1077   
 1078               // *** Menus
 1079               "MenuBar.font", dialogPlain12,
 1080               "MenuBar.background", menu,
 1081               "MenuBar.foreground", menuText,
 1082               "MenuBar.shadow", controlShadow,
 1083               "MenuBar.highlight", controlLtHighlight,
 1084               "MenuBar.border", menuBarBorder,
 1085               "MenuBar.windowBindings", new Object[] {
 1086                   "F10", "takeFocus" },
 1087   
 1088               "MenuItem.font", dialogPlain12,
 1089               "MenuItem.acceleratorFont", dialogPlain12,
 1090               "MenuItem.background", menu,
 1091               "MenuItem.foreground", menuText,
 1092               "MenuItem.selectionForeground", textHighlightText,
 1093               "MenuItem.selectionBackground", textHighlight,
 1094               "MenuItem.disabledForeground", null,
 1095               "MenuItem.acceleratorForeground", menuText,
 1096               "MenuItem.acceleratorSelectionForeground", textHighlightText,
 1097               "MenuItem.acceleratorDelimiter", menuItemAcceleratorDelimiter,
 1098               "MenuItem.border", marginBorder,
 1099               "MenuItem.borderPainted", Boolean.FALSE,
 1100               "MenuItem.margin", twoInsets,
 1101               "MenuItem.checkIcon", menuItemCheckIcon,
 1102               "MenuItem.arrowIcon", menuItemArrowIcon,
 1103               "MenuItem.commandSound", null,
 1104   
 1105               "RadioButtonMenuItem.font", dialogPlain12,
 1106               "RadioButtonMenuItem.acceleratorFont", dialogPlain12,
 1107               "RadioButtonMenuItem.background", menu,
 1108               "RadioButtonMenuItem.foreground", menuText,
 1109               "RadioButtonMenuItem.selectionForeground", textHighlightText,
 1110               "RadioButtonMenuItem.selectionBackground", textHighlight,
 1111               "RadioButtonMenuItem.disabledForeground", null,
 1112               "RadioButtonMenuItem.acceleratorForeground", menuText,
 1113               "RadioButtonMenuItem.acceleratorSelectionForeground", textHighlightText,
 1114               "RadioButtonMenuItem.border", marginBorder,
 1115               "RadioButtonMenuItem.borderPainted", Boolean.FALSE,
 1116               "RadioButtonMenuItem.margin", twoInsets,
 1117               "RadioButtonMenuItem.checkIcon", radioButtonMenuItemIcon,
 1118               "RadioButtonMenuItem.arrowIcon", menuItemArrowIcon,
 1119               "RadioButtonMenuItem.commandSound", null,
 1120   
 1121               "CheckBoxMenuItem.font", dialogPlain12,
 1122               "CheckBoxMenuItem.acceleratorFont", dialogPlain12,
 1123               "CheckBoxMenuItem.background", menu,
 1124               "CheckBoxMenuItem.foreground", menuText,
 1125               "CheckBoxMenuItem.selectionForeground", textHighlightText,
 1126               "CheckBoxMenuItem.selectionBackground", textHighlight,
 1127               "CheckBoxMenuItem.disabledForeground", null,
 1128               "CheckBoxMenuItem.acceleratorForeground", menuText,
 1129               "CheckBoxMenuItem.acceleratorSelectionForeground", textHighlightText,
 1130               "CheckBoxMenuItem.border", marginBorder,
 1131               "CheckBoxMenuItem.borderPainted", Boolean.FALSE,
 1132               "CheckBoxMenuItem.margin", twoInsets,
 1133               "CheckBoxMenuItem.checkIcon", checkBoxMenuItemIcon,
 1134               "CheckBoxMenuItem.arrowIcon", menuItemArrowIcon,
 1135               "CheckBoxMenuItem.commandSound", null,
 1136   
 1137               "Menu.font", dialogPlain12,
 1138               "Menu.acceleratorFont", dialogPlain12,
 1139               "Menu.background", menu,
 1140               "Menu.foreground", menuText,
 1141               "Menu.selectionForeground", textHighlightText,
 1142               "Menu.selectionBackground", textHighlight,
 1143               "Menu.disabledForeground", null,
 1144               "Menu.acceleratorForeground", menuText,
 1145               "Menu.acceleratorSelectionForeground", textHighlightText,
 1146               "Menu.border", marginBorder,
 1147               "Menu.borderPainted", Boolean.FALSE,
 1148               "Menu.margin", twoInsets,
 1149               "Menu.checkIcon", menuItemCheckIcon,
 1150               "Menu.arrowIcon", menuArrowIcon,
 1151               "Menu.menuPopupOffsetX", new Integer(0),
 1152               "Menu.menuPopupOffsetY", new Integer(0),
 1153               "Menu.submenuPopupOffsetX", new Integer(0),
 1154               "Menu.submenuPopupOffsetY", new Integer(0),
 1155               "Menu.shortcutKeys", new int[] {KeyEvent.ALT_MASK},
 1156               "Menu.crossMenuMnemonic", Boolean.TRUE,
 1157               // Menu.cancelMode affects the cancel menu action behaviour;
 1158               // currently supports:
 1159               // "hideLastSubmenu" (default)
 1160               //     hides the last open submenu,
 1161               //     and move selection one step back
 1162               // "hideMenuTree"
 1163               //     resets selection and
 1164               //     hide the entire structure of open menu and its submenus
 1165               "Menu.cancelMode", "hideLastSubmenu",
 1166   
 1167                // Menu.preserveTopLevelSelection affects
 1168                // the cancel menu action behaviour
 1169                // if set to true then top level menu selection
 1170                // will be preserved when the last popup was cancelled;
 1171                // the menu itself will be unselect with the next cancel action
 1172                "Menu.preserveTopLevelSelection", Boolean.FALSE,
 1173   
 1174               // PopupMenu
 1175               "PopupMenu.font", dialogPlain12,
 1176               "PopupMenu.background", menu,
 1177               "PopupMenu.foreground", menuText,
 1178               "PopupMenu.border", popupMenuBorder,
 1179                    // Internal Frame Auditory Cue Mappings
 1180               "PopupMenu.popupSound", null,
 1181               // These window InputMap bindings are used when the Menu is
 1182               // selected.
 1183               "PopupMenu.selectedWindowInputMapBindings", new Object[] {
 1184                     "ESCAPE", "cancel",
 1185                       "DOWN", "selectNext",
 1186                    "KP_DOWN", "selectNext",
 1187                         "UP", "selectPrevious",
 1188                      "KP_UP", "selectPrevious",
 1189                       "LEFT", "selectParent",
 1190                    "KP_LEFT", "selectParent",
 1191                      "RIGHT", "selectChild",
 1192                   "KP_RIGHT", "selectChild",
 1193                      "ENTER", "return",
 1194                 "ctrl ENTER", "return",
 1195                      "SPACE", "return"
 1196               },
 1197               "PopupMenu.selectedWindowInputMapBindings.RightToLeft", new Object[] {
 1198                       "LEFT", "selectChild",
 1199                    "KP_LEFT", "selectChild",
 1200                      "RIGHT", "selectParent",
 1201                   "KP_RIGHT", "selectParent",
 1202               },
 1203               "PopupMenu.consumeEventOnClose", Boolean.FALSE,
 1204   
 1205               // *** OptionPane
 1206               // You can additionaly define OptionPane.messageFont which will
 1207               // dictate the fonts used for the message, and
 1208               // OptionPane.buttonFont, which defines the font for the buttons.
 1209               "OptionPane.font", dialogPlain12,
 1210               "OptionPane.background", control,
 1211               "OptionPane.foreground", controlText,
 1212               "OptionPane.messageForeground", controlText,
 1213               "OptionPane.border", optionPaneBorder,
 1214               "OptionPane.messageAreaBorder", zeroBorder,
 1215               "OptionPane.buttonAreaBorder", optionPaneButtonAreaBorder,
 1216               "OptionPane.minimumSize", optionPaneMinimumSize,
 1217               "OptionPane.errorIcon", SwingUtilities2.makeIcon(getClass(),
 1218                                                                BasicLookAndFeel.class,
 1219                                                                "icons/Error.gif"),
 1220               "OptionPane.informationIcon", SwingUtilities2.makeIcon(getClass(),
 1221                                                                      BasicLookAndFeel.class,
 1222                                                                      "icons/Inform.gif"),
 1223               "OptionPane.warningIcon", SwingUtilities2.makeIcon(getClass(),
 1224                                                                  BasicLookAndFeel.class,
 1225                                                                  "icons/Warn.gif"),
 1226               "OptionPane.questionIcon", SwingUtilities2.makeIcon(getClass(),
 1227                                                                   BasicLookAndFeel.class,
 1228                                                                   "icons/Question.gif"),
 1229               "OptionPane.windowBindings", new Object[] {
 1230                   "ESCAPE", "close" },
 1231                    // OptionPane Auditory Cue Mappings
 1232               "OptionPane.errorSound", null,
 1233               "OptionPane.informationSound", null, // Info and Plain
 1234               "OptionPane.questionSound", null,
 1235               "OptionPane.warningSound", null,
 1236               "OptionPane.buttonClickThreshhold", fiveHundred,
 1237   
 1238               // *** Panel
 1239               "Panel.font", dialogPlain12,
 1240               "Panel.background", control,
 1241               "Panel.foreground", textText,
 1242   
 1243               // *** ProgressBar
 1244               "ProgressBar.font", dialogPlain12,
 1245               "ProgressBar.foreground",  textHighlight,
 1246               "ProgressBar.background", control,
 1247               "ProgressBar.selectionForeground", control,
 1248               "ProgressBar.selectionBackground", textHighlight,
 1249               "ProgressBar.border", progressBarBorder,
 1250               "ProgressBar.cellLength", new Integer(1),
 1251               "ProgressBar.cellSpacing", zero,
 1252               "ProgressBar.repaintInterval", new Integer(50),
 1253               "ProgressBar.cycleTime", new Integer(3000),
 1254               "ProgressBar.horizontalSize", new DimensionUIResource(146, 12),
 1255               "ProgressBar.verticalSize", new DimensionUIResource(12, 146),
 1256   
 1257              // *** Separator
 1258               "Separator.shadow", controlShadow,          // DEPRECATED - DO NOT USE!
 1259               "Separator.highlight", controlLtHighlight,  // DEPRECATED - DO NOT USE!
 1260   
 1261               "Separator.background", controlLtHighlight,
 1262               "Separator.foreground", controlShadow,
 1263   
 1264               // *** ScrollBar/ScrollPane/Viewport
 1265               "ScrollBar.background", scrollBarTrack,
 1266               "ScrollBar.foreground", control,
 1267               "ScrollBar.track", table.get("scrollbar"),
 1268               "ScrollBar.trackHighlight", controlDkShadow,
 1269               "ScrollBar.thumb", control,
 1270               "ScrollBar.thumbHighlight", controlLtHighlight,
 1271               "ScrollBar.thumbDarkShadow", controlDkShadow,
 1272               "ScrollBar.thumbShadow", controlShadow,
 1273               "ScrollBar.border", null,
 1274               "ScrollBar.minimumThumbSize", minimumThumbSize,
 1275               "ScrollBar.maximumThumbSize", maximumThumbSize,
 1276               "ScrollBar.ancestorInputMap",
 1277                  new UIDefaults.LazyInputMap(new Object[] {
 1278                          "RIGHT", "positiveUnitIncrement",
 1279                       "KP_RIGHT", "positiveUnitIncrement",
 1280                           "DOWN", "positiveUnitIncrement",
 1281                        "KP_DOWN", "positiveUnitIncrement",
 1282                      "PAGE_DOWN", "positiveBlockIncrement",
 1283                           "LEFT", "negativeUnitIncrement",
 1284                        "KP_LEFT", "negativeUnitIncrement",
 1285                             "UP", "negativeUnitIncrement",
 1286                          "KP_UP", "negativeUnitIncrement",
 1287                        "PAGE_UP", "negativeBlockIncrement",
 1288                           "HOME", "minScroll",
 1289                            "END", "maxScroll"
 1290                    }),
 1291               "ScrollBar.ancestorInputMap.RightToLeft",
 1292                  new UIDefaults.LazyInputMap(new Object[] {
 1293                          "RIGHT", "negativeUnitIncrement",
 1294                       "KP_RIGHT", "negativeUnitIncrement",
 1295                           "LEFT", "positiveUnitIncrement",
 1296                        "KP_LEFT", "positiveUnitIncrement",
 1297                    }),
 1298               "ScrollBar.width", new Integer(16),
 1299   
 1300               "ScrollPane.font", dialogPlain12,
 1301               "ScrollPane.background", control,
 1302               "ScrollPane.foreground", controlText,
 1303               "ScrollPane.border", textFieldBorder,
 1304               "ScrollPane.viewportBorder", null,
 1305               "ScrollPane.ancestorInputMap",
 1306                  new UIDefaults.LazyInputMap(new Object[] {
 1307                              "RIGHT", "unitScrollRight",
 1308                           "KP_RIGHT", "unitScrollRight",
 1309                               "DOWN", "unitScrollDown",
 1310                            "KP_DOWN", "unitScrollDown",
 1311                               "LEFT", "unitScrollLeft",
 1312                            "KP_LEFT", "unitScrollLeft",
 1313                                 "UP", "unitScrollUp",
 1314                              "KP_UP", "unitScrollUp",
 1315                            "PAGE_UP", "scrollUp",
 1316                          "PAGE_DOWN", "scrollDown",
 1317                       "ctrl PAGE_UP", "scrollLeft",
 1318                     "ctrl PAGE_DOWN", "scrollRight",
 1319                          "ctrl HOME", "scrollHome",
 1320                           "ctrl END", "scrollEnd"
 1321                    }),
 1322               "ScrollPane.ancestorInputMap.RightToLeft",
 1323                  new UIDefaults.LazyInputMap(new Object[] {
 1324                       "ctrl PAGE_UP", "scrollRight",
 1325                     "ctrl PAGE_DOWN", "scrollLeft",
 1326                    }),
 1327   
 1328               "Viewport.font", dialogPlain12,
 1329               "Viewport.background", control,
 1330               "Viewport.foreground", textText,
 1331   
 1332               // *** Slider
 1333               "Slider.font", dialogPlain12,
 1334               "Slider.foreground", control,
 1335               "Slider.background", control,
 1336               "Slider.highlight", controlLtHighlight,
 1337               "Slider.tickColor", Color.black,
 1338               "Slider.shadow", controlShadow,
 1339               "Slider.focus", controlDkShadow,
 1340               "Slider.border", null,
 1341               "Slider.horizontalSize", new Dimension(200, 21),
 1342               "Slider.verticalSize", new Dimension(21, 200),
 1343               "Slider.minimumHorizontalSize", new Dimension(36, 21),
 1344               "Slider.minimumVerticalSize", new Dimension(21, 36),
 1345               "Slider.focusInsets", sliderFocusInsets,
 1346               "Slider.focusInputMap",
 1347                  new UIDefaults.LazyInputMap(new Object[] {
 1348                          "RIGHT", "positiveUnitIncrement",
 1349                       "KP_RIGHT", "positiveUnitIncrement",
 1350                           "DOWN", "negativeUnitIncrement",
 1351                        "KP_DOWN", "negativeUnitIncrement",
 1352                      "PAGE_DOWN", "negativeBlockIncrement",
 1353                           "LEFT", "negativeUnitIncrement",
 1354                        "KP_LEFT", "negativeUnitIncrement",
 1355                             "UP", "positiveUnitIncrement",
 1356                          "KP_UP", "positiveUnitIncrement",
 1357                        "PAGE_UP", "positiveBlockIncrement",
 1358                           "HOME", "minScroll",
 1359                            "END", "maxScroll"
 1360                    }),
 1361               "Slider.focusInputMap.RightToLeft",
 1362                  new UIDefaults.LazyInputMap(new Object[] {
 1363                          "RIGHT", "negativeUnitIncrement",
 1364                       "KP_RIGHT", "negativeUnitIncrement",
 1365                           "LEFT", "positiveUnitIncrement",
 1366                        "KP_LEFT", "positiveUnitIncrement",
 1367                    }),
 1368               "Slider.onlyLeftMouseButtonDrag", Boolean.TRUE,
 1369   
 1370               // *** Spinner
 1371               "Spinner.font", monospacedPlain12,
 1372               "Spinner.background", control,
 1373               "Spinner.foreground", control,
 1374               "Spinner.border", textFieldBorder,
 1375               "Spinner.arrowButtonBorder", null,
 1376               "Spinner.arrowButtonInsets", null,
 1377               "Spinner.arrowButtonSize", new Dimension(16, 5),
 1378               "Spinner.ancestorInputMap",
 1379                  new UIDefaults.LazyInputMap(new Object[] {
 1380                                  "UP", "increment",
 1381                               "KP_UP", "increment",
 1382                                "DOWN", "decrement",
 1383                             "KP_DOWN", "decrement",
 1384                  }),
 1385               "Spinner.editorBorderPainted", Boolean.FALSE,
 1386               "Spinner.editorAlignment", JTextField.TRAILING,
 1387   
 1388               // *** SplitPane
 1389               "SplitPane.background", control,
 1390               "SplitPane.highlight", controlLtHighlight,
 1391               "SplitPane.shadow", controlShadow,
 1392               "SplitPane.darkShadow", controlDkShadow,
 1393               "SplitPane.border", splitPaneBorder,
 1394               "SplitPane.dividerSize", new Integer(7),
 1395               "SplitPaneDivider.border", splitPaneDividerBorder,
 1396               "SplitPaneDivider.draggingColor", darkGray,
 1397               "SplitPane.ancestorInputMap",
 1398                  new UIDefaults.LazyInputMap(new Object[] {
 1399                           "UP", "negativeIncrement",
 1400                         "DOWN", "positiveIncrement",
 1401                         "LEFT", "negativeIncrement",
 1402                        "RIGHT", "positiveIncrement",
 1403                        "KP_UP", "negativeIncrement",
 1404                      "KP_DOWN", "positiveIncrement",
 1405                      "KP_LEFT", "negativeIncrement",
 1406                     "KP_RIGHT", "positiveIncrement",
 1407                         "HOME", "selectMin",
 1408                          "END", "selectMax",
 1409                           "F8", "startResize",
 1410                           "F6", "toggleFocus",
 1411                     "ctrl TAB", "focusOutForward",
 1412               "ctrl shift TAB", "focusOutBackward"
 1413                    }),
 1414   
 1415               // *** TabbedPane
 1416               "TabbedPane.font", dialogPlain12,
 1417               "TabbedPane.background", control,
 1418               "TabbedPane.foreground", controlText,
 1419               "TabbedPane.highlight", controlLtHighlight,
 1420               "TabbedPane.light", controlHighlight,
 1421               "TabbedPane.shadow", controlShadow,
 1422               "TabbedPane.darkShadow", controlDkShadow,
 1423               "TabbedPane.selected", null,
 1424               "TabbedPane.focus", controlText,
 1425               "TabbedPane.textIconGap", four,
 1426   
 1427               // Causes tabs to be painted on top of the content area border.
 1428               // The amount of overlap is then controlled by tabAreaInsets.bottom,
 1429               // which is zero by default
 1430               "TabbedPane.tabsOverlapBorder", Boolean.FALSE,
 1431               "TabbedPane.selectionFollowsFocus", Boolean.TRUE,
 1432   
 1433               "TabbedPane.labelShift", 1,
 1434               "TabbedPane.selectedLabelShift", -1,
 1435               "TabbedPane.tabInsets", tabbedPaneTabInsets,
 1436               "TabbedPane.selectedTabPadInsets", tabbedPaneTabPadInsets,
 1437               "TabbedPane.tabAreaInsets", tabbedPaneTabAreaInsets,
 1438               "TabbedPane.contentBorderInsets", tabbedPaneContentBorderInsets,
 1439               "TabbedPane.tabRunOverlay", new Integer(2),
 1440               "TabbedPane.tabsOpaque", Boolean.TRUE,
 1441               "TabbedPane.contentOpaque", Boolean.TRUE,
 1442               "TabbedPane.focusInputMap",
 1443                 new UIDefaults.LazyInputMap(new Object[] {
 1444                            "RIGHT", "navigateRight",
 1445                         "KP_RIGHT", "navigateRight",
 1446                             "LEFT", "navigateLeft",
 1447                          "KP_LEFT", "navigateLeft",
 1448                               "UP", "navigateUp",
 1449                            "KP_UP", "navigateUp",
 1450                             "DOWN", "navigateDown",
 1451                          "KP_DOWN", "navigateDown",
 1452                        "ctrl DOWN", "requestFocusForVisibleComponent",
 1453                     "ctrl KP_DOWN", "requestFocusForVisibleComponent",
 1454                   }),
 1455               "TabbedPane.ancestorInputMap",
 1456                  new UIDefaults.LazyInputMap(new Object[] {
 1457                      "ctrl PAGE_DOWN", "navigatePageDown",
 1458                        "ctrl PAGE_UP", "navigatePageUp",
 1459                             "ctrl UP", "requestFocus",
 1460                          "ctrl KP_UP", "requestFocus",
 1461                    }),
 1462   
 1463   
 1464               // *** Table
 1465               "Table.font", dialogPlain12,
 1466               "Table.foreground", controlText,  // cell text color
 1467               "Table.background", window,  // cell background color
 1468               "Table.selectionForeground", textHighlightText,
 1469               "Table.selectionBackground", textHighlight,
 1470               "Table.dropLineColor", controlShadow,
 1471               "Table.dropLineShortColor", black,
 1472               "Table.gridColor", gray,  // grid line color
 1473               "Table.focusCellBackground", window,
 1474               "Table.focusCellForeground", controlText,
 1475               "Table.focusCellHighlightBorder", focusCellHighlightBorder,
 1476               "Table.scrollPaneBorder", loweredBevelBorder,
 1477               "Table.ancestorInputMap",
 1478                  new UIDefaults.LazyInputMap(new Object[] {
 1479                                  "ctrl C", "copy",
 1480                                  "ctrl V", "paste",
 1481                                  "ctrl X", "cut",
 1482                                    "COPY", "copy",
 1483                                   "PASTE", "paste",
 1484                                     "CUT", "cut",
 1485                          "control INSERT", "copy",
 1486                            "shift INSERT", "paste",
 1487                            "shift DELETE", "cut",
 1488                                   "RIGHT", "selectNextColumn",
 1489                                "KP_RIGHT", "selectNextColumn",
 1490                             "shift RIGHT", "selectNextColumnExtendSelection",
 1491                          "shift KP_RIGHT", "selectNextColumnExtendSelection",
 1492                        "ctrl shift RIGHT", "selectNextColumnExtendSelection",
 1493                     "ctrl shift KP_RIGHT", "selectNextColumnExtendSelection",
 1494                              "ctrl RIGHT", "selectNextColumnChangeLead",
 1495                           "ctrl KP_RIGHT", "selectNextColumnChangeLead",
 1496                                    "LEFT", "selectPreviousColumn",
 1497                                 "KP_LEFT", "selectPreviousColumn",
 1498                              "shift LEFT", "selectPreviousColumnExtendSelection",
 1499                           "shift KP_LEFT", "selectPreviousColumnExtendSelection",
 1500                         "ctrl shift LEFT", "selectPreviousColumnExtendSelection",
 1501                      "ctrl shift KP_LEFT", "selectPreviousColumnExtendSelection",
 1502                               "ctrl LEFT", "selectPreviousColumnChangeLead",
 1503                            "ctrl KP_LEFT", "selectPreviousColumnChangeLead",
 1504                                    "DOWN", "selectNextRow",
 1505                                 "KP_DOWN", "selectNextRow",
 1506                              "shift DOWN", "selectNextRowExtendSelection",
 1507                           "shift KP_DOWN", "selectNextRowExtendSelection",
 1508                         "ctrl shift DOWN", "selectNextRowExtendSelection",
 1509                      "ctrl shift KP_DOWN", "selectNextRowExtendSelection",
 1510                               "ctrl DOWN", "selectNextRowChangeLead",
 1511                            "ctrl KP_DOWN", "selectNextRowChangeLead",
 1512                                      "UP", "selectPreviousRow",
 1513                                   "KP_UP", "selectPreviousRow",
 1514                                "shift UP", "selectPreviousRowExtendSelection",
 1515                             "shift KP_UP", "selectPreviousRowExtendSelection",
 1516                           "ctrl shift UP", "selectPreviousRowExtendSelection",
 1517                        "ctrl shift KP_UP", "selectPreviousRowExtendSelection",
 1518                                 "ctrl UP", "selectPreviousRowChangeLead",
 1519                              "ctrl KP_UP", "selectPreviousRowChangeLead",
 1520                                    "HOME", "selectFirstColumn",
 1521                              "shift HOME", "selectFirstColumnExtendSelection",
 1522                         "ctrl shift HOME", "selectFirstRowExtendSelection",
 1523                               "ctrl HOME", "selectFirstRow",
 1524                                     "END", "selectLastColumn",
 1525                               "shift END", "selectLastColumnExtendSelection",
 1526                          "ctrl shift END", "selectLastRowExtendSelection",
 1527                                "ctrl END", "selectLastRow",
 1528                                 "PAGE_UP", "scrollUpChangeSelection",
 1529                           "shift PAGE_UP", "scrollUpExtendSelection",
 1530                      "ctrl shift PAGE_UP", "scrollLeftExtendSelection",
 1531                            "ctrl PAGE_UP", "scrollLeftChangeSelection",
 1532                               "PAGE_DOWN", "scrollDownChangeSelection",
 1533                         "shift PAGE_DOWN", "scrollDownExtendSelection",
 1534                    "ctrl shift PAGE_DOWN", "scrollRightExtendSelection",
 1535                          "ctrl PAGE_DOWN", "scrollRightChangeSelection",
 1536                                     "TAB", "selectNextColumnCell",
 1537                               "shift TAB", "selectPreviousColumnCell",
 1538                                   "ENTER", "selectNextRowCell",
 1539                             "shift ENTER", "selectPreviousRowCell",
 1540                                  "ctrl A", "selectAll",
 1541                              "ctrl SLASH", "selectAll",
 1542                         "ctrl BACK_SLASH", "clearSelection",
 1543                                  "ESCAPE", "cancel",
 1544                                      "F2", "startEditing",
 1545                                   "SPACE", "addToSelection",
 1546                              "ctrl SPACE", "toggleAndAnchor",
 1547                             "shift SPACE", "extendTo",
 1548                        "ctrl shift SPACE", "moveSelectionTo",
 1549                                      "F8", "focusHeader"
 1550                    }),
 1551               "Table.ancestorInputMap.RightToLeft",
 1552                  new UIDefaults.LazyInputMap(new Object[] {
 1553                                   "RIGHT", "selectPreviousColumn",
 1554                                "KP_RIGHT", "selectPreviousColumn",
 1555                             "shift RIGHT", "selectPreviousColumnExtendSelection",
 1556                          "shift KP_RIGHT", "selectPreviousColumnExtendSelection",
 1557                        "ctrl shift RIGHT", "selectPreviousColumnExtendSelection",
 1558                     "ctrl shift KP_RIGHT", "selectPreviousColumnExtendSelection",
 1559                              "ctrl RIGHT", "selectPreviousColumnChangeLead",
 1560                           "ctrl KP_RIGHT", "selectPreviousColumnChangeLead",
 1561                                    "LEFT", "selectNextColumn",
 1562                                 "KP_LEFT", "selectNextColumn",
 1563                              "shift LEFT", "selectNextColumnExtendSelection",
 1564                           "shift KP_LEFT", "selectNextColumnExtendSelection",
 1565                         "ctrl shift LEFT", "selectNextColumnExtendSelection",
 1566                      "ctrl shift KP_LEFT", "selectNextColumnExtendSelection",
 1567                               "ctrl LEFT", "selectNextColumnChangeLead",
 1568                            "ctrl KP_LEFT", "selectNextColumnChangeLead",
 1569                            "ctrl PAGE_UP", "scrollRightChangeSelection",
 1570                          "ctrl PAGE_DOWN", "scrollLeftChangeSelection",
 1571                      "ctrl shift PAGE_UP", "scrollRightExtendSelection",
 1572                    "ctrl shift PAGE_DOWN", "scrollLeftExtendSelection",
 1573                    }),
 1574               "Table.ascendingSortIcon",  new SwingLazyValue(
 1575                        "sun.swing.icon.SortArrowIcon",
 1576                        null, new Object[] { Boolean.TRUE,
 1577                                             "Table.sortIconColor" }),
 1578               "Table.descendingSortIcon",  new SwingLazyValue(
 1579                        "sun.swing.icon.SortArrowIcon",
 1580                        null, new Object[] { Boolean.FALSE,
 1581                                             "Table.sortIconColor" }),
 1582               "Table.sortIconColor", controlShadow,
 1583   
 1584               "TableHeader.font", dialogPlain12,
 1585               "TableHeader.foreground", controlText, // header text color
 1586               "TableHeader.background", control, // header background
 1587               "TableHeader.cellBorder", tableHeaderBorder,
 1588   
 1589               // Support for changing the background/border of the currently
 1590               // selected header column when the header has the keyboard focus.
 1591               "TableHeader.focusCellBackground", table.getColor("text"), // like text component bg
 1592               "TableHeader.focusCellForeground", null,
 1593               "TableHeader.focusCellBorder", null,
 1594               "TableHeader.ancestorInputMap",
 1595                  new UIDefaults.LazyInputMap(new Object[] {
 1596                                   "SPACE", "toggleSortOrder",
 1597                                    "LEFT", "selectColumnToLeft",
 1598                                 "KP_LEFT", "selectColumnToLeft",
 1599                                   "RIGHT", "selectColumnToRight",
 1600                                "KP_RIGHT", "selectColumnToRight",
 1601                                "alt LEFT", "moveColumnLeft",
 1602                             "alt KP_LEFT", "moveColumnLeft",
 1603                               "alt RIGHT", "moveColumnRight",
 1604                            "alt KP_RIGHT", "moveColumnRight",
 1605                          "alt shift LEFT", "resizeLeft",
 1606                       "alt shift KP_LEFT", "resizeLeft",
 1607                         "alt shift RIGHT", "resizeRight",
 1608                      "alt shift KP_RIGHT", "resizeRight",
 1609                                  "ESCAPE", "focusTable",
 1610                  }),
 1611   
 1612               // *** Text
 1613               "TextField.font", sansSerifPlain12,
 1614               "TextField.background", window,
 1615               "TextField.foreground", textText,
 1616               "TextField.shadow", controlShadow,
 1617               "TextField.darkShadow", controlDkShadow,
 1618               "TextField.light", controlHighlight,
 1619               "TextField.highlight", controlLtHighlight,
 1620               "TextField.inactiveForeground", textInactiveText,
 1621               "TextField.inactiveBackground", control,
 1622               "TextField.selectionBackground", textHighlight,
 1623               "TextField.selectionForeground", textHighlightText,
 1624               "TextField.caretForeground", textText,
 1625               "TextField.caretBlinkRate", caretBlinkRate,
 1626               "TextField.border", textFieldBorder,
 1627               "TextField.margin", zeroInsets,
 1628   
 1629               "FormattedTextField.font", sansSerifPlain12,
 1630               "FormattedTextField.background", window,
 1631               "FormattedTextField.foreground", textText,
 1632               "FormattedTextField.inactiveForeground", textInactiveText,
 1633               "FormattedTextField.inactiveBackground", control,
 1634               "FormattedTextField.selectionBackground", textHighlight,
 1635               "FormattedTextField.selectionForeground", textHighlightText,
 1636               "FormattedTextField.caretForeground", textText,
 1637               "FormattedTextField.caretBlinkRate", caretBlinkRate,
 1638               "FormattedTextField.border", textFieldBorder,
 1639               "FormattedTextField.margin", zeroInsets,
 1640               "FormattedTextField.focusInputMap",
 1641                 new UIDefaults.LazyInputMap(new Object[] {
 1642                              "ctrl C", DefaultEditorKit.copyAction,
 1643                              "ctrl V", DefaultEditorKit.pasteAction,
 1644                              "ctrl X", DefaultEditorKit.cutAction,
 1645                                "COPY", DefaultEditorKit.copyAction,
 1646                               "PASTE", DefaultEditorKit.pasteAction,
 1647                                 "CUT", DefaultEditorKit.cutAction,
 1648                      "control INSERT", DefaultEditorKit.copyAction,
 1649                        "shift INSERT", DefaultEditorKit.pasteAction,
 1650                        "shift DELETE", DefaultEditorKit.cutAction,
 1651                          "shift LEFT", DefaultEditorKit.selectionBackwardAction,
 1652                       "shift KP_LEFT", DefaultEditorKit.selectionBackwardAction,
 1653                         "shift RIGHT", DefaultEditorKit.selectionForwardAction,
 1654                      "shift KP_RIGHT", DefaultEditorKit.selectionForwardAction,
 1655                           "ctrl LEFT", DefaultEditorKit.previousWordAction,
 1656                        "ctrl KP_LEFT", DefaultEditorKit.previousWordAction,
 1657                          "ctrl RIGHT", DefaultEditorKit.nextWordAction,
 1658                       "ctrl KP_RIGHT", DefaultEditorKit.nextWordAction,
 1659                     "ctrl shift LEFT", DefaultEditorKit.selectionPreviousWordAction,
 1660                  "ctrl shift KP_LEFT", DefaultEditorKit.selectionPreviousWordAction,
 1661                    "ctrl shift RIGHT", DefaultEditorKit.selectionNextWordAction,
 1662                 "ctrl shift KP_RIGHT", DefaultEditorKit.selectionNextWordAction,
 1663                              "ctrl A", DefaultEditorKit.selectAllAction,
 1664                                "HOME", DefaultEditorKit.beginLineAction,
 1665                                 "END", DefaultEditorKit.endLineAction,
 1666                          "shift HOME", DefaultEditorKit.selectionBeginLineAction,
 1667                           "shift END", DefaultEditorKit.selectionEndLineAction,
 1668                          "BACK_SPACE", DefaultEditorKit.deletePrevCharAction,
 1669                    "shift BACK_SPACE", DefaultEditorKit.deletePrevCharAction,
 1670                              "ctrl H", DefaultEditorKit.deletePrevCharAction,
 1671                              "DELETE", DefaultEditorKit.deleteNextCharAction,
 1672                         "ctrl DELETE", DefaultEditorKit.deleteNextWordAction,
 1673                     "ctrl BACK_SPACE", DefaultEditorKit.deletePrevWordAction,
 1674                               "RIGHT", DefaultEditorKit.forwardAction,
 1675                                "LEFT", DefaultEditorKit.backwardAction,
 1676                            "KP_RIGHT", DefaultEditorKit.forwardAction,
 1677                             "KP_LEFT", DefaultEditorKit.backwardAction,
 1678                               "ENTER", JTextField.notifyAction,
 1679                     "ctrl BACK_SLASH", "unselect",
 1680                     "control shift O", "toggle-componentOrientation",
 1681                              "ESCAPE", "reset-field-edit",
 1682                                  "UP", "increment",
 1683                               "KP_UP", "increment",
 1684                                "DOWN", "decrement",
 1685                             "KP_DOWN", "decrement",
 1686                 }),
 1687   
 1688               "PasswordField.font", monospacedPlain12,
 1689               "PasswordField.background", window,
 1690               "PasswordField.foreground", textText,
 1691               "PasswordField.inactiveForeground", textInactiveText,
 1692               "PasswordField.inactiveBackground", control,
 1693               "PasswordField.selectionBackground", textHighlight,
 1694               "PasswordField.selectionForeground", textHighlightText,
 1695               "PasswordField.caretForeground", textText,
 1696               "PasswordField.caretBlinkRate", caretBlinkRate,
 1697               "PasswordField.border", textFieldBorder,
 1698               "PasswordField.margin", zeroInsets,
 1699               "PasswordField.echoChar", '*',
 1700   
 1701               "TextArea.font", monospacedPlain12,
 1702               "TextArea.background", window,
 1703               "TextArea.foreground", textText,
 1704               "TextArea.inactiveForeground", textInactiveText,
 1705               "TextArea.selectionBackground", textHighlight,
 1706               "TextArea.selectionForeground", textHighlightText,
 1707               "TextArea.caretForeground", textText,
 1708               "TextArea.caretBlinkRate", caretBlinkRate,
 1709               "TextArea.border", marginBorder,
 1710               "TextArea.margin", zeroInsets,
 1711   
 1712               "TextPane.font", serifPlain12,
 1713               "TextPane.background", white,
 1714               "TextPane.foreground", textText,
 1715               "TextPane.selectionBackground", textHighlight,
 1716               "TextPane.selectionForeground", textHighlightText,
 1717               "TextPane.caretForeground", textText,
 1718               "TextPane.caretBlinkRate", caretBlinkRate,
 1719               "TextPane.inactiveForeground", textInactiveText,
 1720               "TextPane.border", marginBorder,
 1721               "TextPane.margin", editorMargin,
 1722   
 1723               "EditorPane.font", serifPlain12,
 1724               "EditorPane.background", white,
 1725               "EditorPane.foreground", textText,
 1726               "EditorPane.selectionBackground", textHighlight,
 1727               "EditorPane.selectionForeground", textHighlightText,
 1728               "EditorPane.caretForeground", textText,
 1729               "EditorPane.caretBlinkRate", caretBlinkRate,
 1730               "EditorPane.inactiveForeground", textInactiveText,
 1731               "EditorPane.border", marginBorder,
 1732               "EditorPane.margin", editorMargin,
 1733   
 1734               "html.pendingImage", SwingUtilities2.makeIcon(getClass(),
 1735                                       BasicLookAndFeel.class,
 1736                                       "icons/image-delayed.png"),
 1737               "html.missingImage", SwingUtilities2.makeIcon(getClass(),
 1738                                       BasicLookAndFeel.class,
 1739                                       "icons/image-failed.png"),
 1740               // *** TitledBorder
 1741               "TitledBorder.font", dialogPlain12,
 1742               "TitledBorder.titleColor", controlText,
 1743               "TitledBorder.border", etchedBorder,
 1744   
 1745               // *** ToolBar
 1746               "ToolBar.font", dialogPlain12,
 1747               "ToolBar.background", control,
 1748               "ToolBar.foreground", controlText,
 1749               "ToolBar.shadow", controlShadow,
 1750               "ToolBar.darkShadow", controlDkShadow,
 1751               "ToolBar.light", controlHighlight,
 1752               "ToolBar.highlight", controlLtHighlight,
 1753               "ToolBar.dockingBackground", control,
 1754               "ToolBar.dockingForeground", red,
 1755               "ToolBar.floatingBackground", control,
 1756               "ToolBar.floatingForeground", darkGray,
 1757               "ToolBar.border", etchedBorder,
 1758               "ToolBar.separatorSize", toolBarSeparatorSize,
 1759               "ToolBar.ancestorInputMap",
 1760                  new UIDefaults.LazyInputMap(new Object[] {
 1761                           "UP", "navigateUp",
 1762                        "KP_UP", "navigateUp",
 1763                         "DOWN", "navigateDown",
 1764                      "KP_DOWN", "navigateDown",
 1765                         "LEFT", "navigateLeft",
 1766                      "KP_LEFT", "navigateLeft",
 1767                        "RIGHT", "navigateRight",
 1768                     "KP_RIGHT", "navigateRight"
 1769                    }),
 1770   
 1771               // *** ToolTips
 1772               "ToolTip.font", sansSerifPlain12,
 1773               "ToolTip.background", table.get("info"),
 1774               "ToolTip.foreground", table.get("infoText"),
 1775               "ToolTip.border", blackLineBorder,
 1776               // ToolTips also support backgroundInactive, borderInactive,
 1777               // and foregroundInactive
 1778   
 1779           // *** ToolTipManager
 1780               // ToolTipManager.enableToolTipMode currently supports:
 1781               // "allWindows" (default):
 1782               //     enables tool tips for all windows of all java applications,
 1783               //     whether the windows are active or inactive
 1784               // "activeApplication"
 1785               //     enables tool tips for windows of an application only when
 1786               //     the application has an active window
 1787               "ToolTipManager.enableToolTipMode", "allWindows",
 1788   
 1789           // *** Tree
 1790               "Tree.paintLines", Boolean.TRUE,
 1791               "Tree.lineTypeDashed", Boolean.FALSE,
 1792               "Tree.font", dialogPlain12,
 1793               "Tree.background", window,
 1794               "Tree.foreground", textText,
 1795               "Tree.hash", gray,
 1796               "Tree.textForeground", textText,
 1797               "Tree.textBackground", table.get("text"),
 1798               "Tree.selectionForeground", textHighlightText,
 1799               "Tree.selectionBackground", textHighlight,
 1800               "Tree.selectionBorderColor", black,
 1801               "Tree.dropLineColor", controlShadow,
 1802               "Tree.editorBorder", blackLineBorder,
 1803               "Tree.leftChildIndent", new Integer(7),
 1804               "Tree.rightChildIndent", new Integer(13),
 1805               "Tree.rowHeight", new Integer(16),
 1806               "Tree.scrollsOnExpand", Boolean.TRUE,
 1807               "Tree.openIcon", SwingUtilities2.makeIcon(getClass(),
 1808                                                         BasicLookAndFeel.class,
 1809                                                         "icons/TreeOpen.gif"),
 1810               "Tree.closedIcon", SwingUtilities2.makeIcon(getClass(),
 1811                                                           BasicLookAndFeel.class,
 1812                                                           "icons/TreeClosed.gif"),
 1813               "Tree.leafIcon", SwingUtilities2.makeIcon(getClass(),
 1814                                                         BasicLookAndFeel.class,
 1815                                                         "icons/TreeLeaf.gif"),
 1816               "Tree.expandedIcon", null,
 1817               "Tree.collapsedIcon", null,
 1818               "Tree.changeSelectionWithFocus", Boolean.TRUE,
 1819               "Tree.drawsFocusBorderAroundIcon", Boolean.FALSE,
 1820               "Tree.timeFactor", oneThousand,
 1821               "Tree.focusInputMap",
 1822                  new UIDefaults.LazyInputMap(new Object[] {
 1823                                    "ctrl C", "copy",
 1824                                    "ctrl V", "paste",
 1825                                    "ctrl X", "cut",
 1826                                      "COPY", "copy",
 1827                                     "PASTE", "paste",
 1828                                       "CUT", "cut",
 1829                            "control INSERT", "copy",
 1830                              "shift INSERT", "paste",
 1831                              "shift DELETE", "cut",
 1832                                        "UP", "selectPrevious",
 1833                                     "KP_UP", "selectPrevious",
 1834                                  "shift UP", "selectPreviousExtendSelection",
 1835                               "shift KP_UP", "selectPreviousExtendSelection",
 1836                             "ctrl shift UP", "selectPreviousExtendSelection",
 1837                          "ctrl shift KP_UP", "selectPreviousExtendSelection",
 1838                                   "ctrl UP", "selectPreviousChangeLead",
 1839                                "ctrl KP_UP", "selectPreviousChangeLead",
 1840                                      "DOWN", "selectNext",
 1841                                   "KP_DOWN", "selectNext",
 1842                                "shift DOWN", "selectNextExtendSelection",
 1843                             "shift KP_DOWN", "selectNextExtendSelection",
 1844                           "ctrl shift DOWN", "selectNextExtendSelection",
 1845                        "ctrl shift KP_DOWN", "selectNextExtendSelection",
 1846                                 "ctrl DOWN", "selectNextChangeLead",
 1847                              "ctrl KP_DOWN", "selectNextChangeLead",
 1848                                     "RIGHT", "selectChild",
 1849                                  "KP_RIGHT", "selectChild",
 1850                                      "LEFT", "selectParent",
 1851                                   "KP_LEFT", "selectParent",
 1852                                   "PAGE_UP", "scrollUpChangeSelection",
 1853                             "shift PAGE_UP", "scrollUpExtendSelection",
 1854                        "ctrl shift PAGE_UP", "scrollUpExtendSelection",
 1855                              "ctrl PAGE_UP", "scrollUpChangeLead",
 1856                                 "PAGE_DOWN", "scrollDownChangeSelection",
 1857                           "shift PAGE_DOWN", "scrollDownExtendSelection",
 1858                      "ctrl shift PAGE_DOWN", "scrollDownExtendSelection",
 1859                            "ctrl PAGE_DOWN", "scrollDownChangeLead",
 1860                                      "HOME", "selectFirst",
 1861                                "shift HOME", "selectFirstExtendSelection",
 1862                           "ctrl shift HOME", "selectFirstExtendSelection",
 1863                                 "ctrl HOME", "selectFirstChangeLead",
 1864                                       "END", "selectLast",
 1865                                 "shift END", "selectLastExtendSelection",
 1866                            "ctrl shift END", "selectLastExtendSelection",
 1867                                  "ctrl END", "selectLastChangeLead",
 1868                                        "F2", "startEditing",
 1869                                    "ctrl A", "selectAll",
 1870                                "ctrl SLASH", "selectAll",
 1871                           "ctrl BACK_SLASH", "clearSelection",
 1872                                 "ctrl LEFT", "scrollLeft",
 1873                              "ctrl KP_LEFT", "scrollLeft",
 1874                                "ctrl RIGHT", "scrollRight",
 1875                             "ctrl KP_RIGHT", "scrollRight",
 1876                                     "SPACE", "addToSelection",
 1877                                "ctrl SPACE", "toggleAndAnchor",
 1878                               "shift SPACE", "extendTo",
 1879                          "ctrl shift SPACE", "moveSelectionTo"
 1880                    }),
 1881               "Tree.focusInputMap.RightToLeft",
 1882                  new UIDefaults.LazyInputMap(new Object[] {
 1883                                     "RIGHT", "selectParent",
 1884                                  "KP_RIGHT", "selectParent",
 1885                                      "LEFT", "selectChild",
 1886                                   "KP_LEFT", "selectChild",
 1887                    }),
 1888               "Tree.ancestorInputMap",
 1889                  new UIDefaults.LazyInputMap(new Object[] {
 1890                        "ESCAPE", "cancel"
 1891                    }),
 1892               // Bind specific keys that can invoke popup on currently
 1893               // focused JComponent
 1894               "RootPane.ancestorInputMap",
 1895                   new UIDefaults.LazyInputMap(new Object[] {
 1896                        "shift F10", "postPopup",
 1897                     "CONTEXT_MENU", "postPopup"
 1898                     }),
 1899   
 1900               // These bindings are only enabled when there is a default
 1901               // button set on the rootpane.
 1902               "RootPane.defaultButtonWindowKeyBindings", new Object[] {
 1903                                "ENTER", "press",
 1904                       "released ENTER", "release",
 1905                           "ctrl ENTER", "press",
 1906                  "ctrl released ENTER", "release"
 1907                 },
 1908           };
 1909   
 1910           table.putDefaults(defaults);
 1911       }
 1912   
 1913   
 1914       /**
 1915        * Returns the ui that is of type <code>klass</code>, or null if
 1916        * one can not be found.
 1917        */
 1918       static Object getUIOfType(ComponentUI ui, Class klass) {
 1919           if (klass.isInstance(ui)) {
 1920               return ui;
 1921           }
 1922           return null;
 1923       }
 1924   
 1925       // ********* Auditory Cue support methods and objects *********
 1926       // also see the "AuditoryCues" section of the defaults table
 1927   
 1928       /**
 1929        * Returns an <code>ActionMap</code> containing the audio actions
 1930        * for this look and feel.
 1931        * <P>
 1932        * The returned <code>ActionMap</code> contains <code>Actions</code> that
 1933        * embody the ability to render an auditory cue. These auditory
 1934        * cues map onto user and system activities that may be useful
 1935        * for an end user to know about (such as a dialog box appearing).
 1936        * <P>
 1937        * At the appropriate time,
 1938        * the {@code ComponentUI} is responsible for obtaining an
 1939        * <code>Action</code> out of the <code>ActionMap</code> and passing
 1940        * it to <code>playSound</code>.
 1941        * <P>
 1942        * This method first looks up the {@code ActionMap} from the
 1943        * defaults using the key {@code "AuditoryCues.actionMap"}.
 1944        * <p>
 1945        * If the value is {@code non-null}, it is returned. If the value
 1946        * of the default {@code "AuditoryCues.actionMap"} is {@code null}
 1947        * and the value of the default {@code "AuditoryCues.cueList"} is
 1948        * {@code non-null}, an {@code ActionMapUIResource} is created and
 1949        * populated. Population is done by iterating over each of the
 1950        * elements of the {@code "AuditoryCues.cueList"} array, and
 1951        * invoking {@code createAudioAction()} to create an {@code
 1952        * Action} for each element.  The resulting {@code Action} is
 1953        * placed in the {@code ActionMapUIResource}, using the array
 1954        * element as the key.  For example, if the {@code
 1955        * "AuditoryCues.cueList"} array contains a single-element, {@code
 1956        * "audioKey"}, the {@code ActionMapUIResource} is created, then
 1957        * populated by way of {@code actionMap.put(cueList[0],
 1958        * createAudioAction(cueList[0]))}.
 1959        * <p>
 1960        * If the value of the default {@code "AuditoryCues.actionMap"} is
 1961        * {@code null} and the value of the default
 1962        * {@code "AuditoryCues.cueList"} is {@code null}, an empty
 1963        * {@code ActionMapUIResource} is created.
 1964        *
 1965        *
 1966        * @return      an ActionMap containing {@code Actions}
 1967        *              responsible for playing auditory cues
 1968        * @throws ClassCastException if the value of the
 1969        *         default {@code "AuditoryCues.actionMap"} is not an
 1970        *         {@code ActionMap}, or the value of the default
 1971        *         {@code "AuditoryCues.cueList"} is not an {@code Object[]}
 1972        * @see #createAudioAction
 1973        * @see #playSound(Action)
 1974        * @since 1.4
 1975        */
 1976       protected ActionMap getAudioActionMap() {
 1977           ActionMap audioActionMap = (ActionMap)UIManager.get(
 1978                                                 "AuditoryCues.actionMap");
 1979           if (audioActionMap == null) {
 1980               Object[] acList = (Object[])UIManager.get("AuditoryCues.cueList");
 1981               if (acList != null) {
 1982                   audioActionMap = new ActionMapUIResource();
 1983                   for(int counter = acList.length-1; counter >= 0; counter--) {
 1984                       audioActionMap.put(acList[counter],
 1985                                          createAudioAction(acList[counter]));
 1986                   }
 1987               }
 1988               UIManager.getLookAndFeelDefaults().put("AuditoryCues.actionMap",
 1989                                                      audioActionMap);
 1990           }
 1991           return audioActionMap;
 1992       }
 1993   
 1994       /**
 1995        * Creates and returns an {@code Action} used to play a sound.
 1996        * <p>
 1997        * If {@code key} is {@code non-null}, an {@code Action} is created
 1998        * using the value from the defaults with key {@code key}. The value
 1999        * identifies the sound resource to load when
 2000        * {@code actionPerformed} is invoked on the {@code Action}. The
 2001        * sound resource is loaded into a {@code byte[]} by way of
 2002        * {@code getClass().getResourceAsStream()}.
 2003        *
 2004        * @param key the key identifying the audio action
 2005        * @return      an {@code Action} used to play the source, or {@code null}
 2006        *              if {@code key} is {@code null}
 2007        * @see #playSound(Action)
 2008        * @since 1.4
 2009        */
 2010       protected Action createAudioAction(Object key) {
 2011           if (key != null) {
 2012               String audioKey = (String)key;
 2013               String audioValue = (String)UIManager.get(key);
 2014               return new AudioAction(audioKey, audioValue);
 2015           } else {
 2016               return null;
 2017           }
 2018       }
 2019   
 2020       /**
 2021        * Pass the name String to the super constructor. This is used
 2022        * later to identify the Action and decide whether to play it or
 2023        * not. Store the resource String. I is used to get the audio
 2024        * resource. In this case, the resource is an audio file.
 2025        *
 2026        * @since 1.4
 2027        */
 2028       private class AudioAction extends AbstractAction implements LineListener {
 2029           // We strive to only play one sound at a time (other platforms
 2030           // appear to do this). This is done by maintaining the field
 2031           // clipPlaying. Every time a sound is to be played,
 2032           // cancelCurrentSound is invoked to cancel any sound that may be
 2033           // playing.
 2034           private String audioResource;
 2035           private byte[] audioBuffer;
 2036   
 2037           /**
 2038            * The String is the name of the Action and
 2039            * points to the audio resource.
 2040            * The byte[] is a buffer of the audio bits.
 2041            */
 2042           public AudioAction(String name, String resource) {
 2043               super(name);
 2044               audioResource = resource;
 2045           }
 2046   
 2047           public void actionPerformed(ActionEvent e) {
 2048               if (audioBuffer == null) {
 2049                   audioBuffer = loadAudioData(audioResource);
 2050               }
 2051               if (audioBuffer != null) {
 2052                   cancelCurrentSound(null);
 2053                   try {
 2054                       AudioInputStream soundStream =
 2055                           AudioSystem.getAudioInputStream(
 2056                               new ByteArrayInputStream(audioBuffer));
 2057                       DataLine.Info info =
 2058                           new DataLine.Info(Clip.class, soundStream.getFormat());
 2059                       Clip clip = (Clip) AudioSystem.getLine(info);
 2060                       clip.open(soundStream);
 2061                       clip.addLineListener(this);
 2062   
 2063                       synchronized(audioLock) {
 2064                           clipPlaying = clip;
 2065                       }
 2066   
 2067                       clip.start();
 2068                   } catch (Exception ex) {}
 2069               }
 2070           }
 2071   
 2072           public void update(LineEvent event) {
 2073               if (event.getType() == LineEvent.Type.STOP) {
 2074                   cancelCurrentSound((Clip)event.getLine());
 2075               }
 2076           }
 2077   
 2078           /**
 2079            * If the parameter is null, or equal to the currently
 2080            * playing sound, then cancel the currently playing sound.
 2081            */
 2082           private void cancelCurrentSound(Clip clip) {
 2083               Clip lastClip = null;
 2084   
 2085               synchronized(audioLock) {
 2086                   if (clip == null || clip == clipPlaying) {
 2087                       lastClip = clipPlaying;
 2088                       clipPlaying = null;
 2089                   }
 2090               }
 2091   
 2092               if (lastClip != null) {
 2093                   lastClip.removeLineListener(this);
 2094                   lastClip.close();
 2095               }
 2096           }
 2097       }
 2098   
 2099       /**
 2100        * Utility method that loads audio bits for the specified
 2101        * <code>soundFile</code> filename. If this method is unable to
 2102        * build a viable path name from the <code>baseClass</code> and
 2103        * <code>soundFile</code> passed into this method, it will
 2104        * return <code>null</code>.
 2105        *
 2106        * @param soundFile    the name of the audio file to be retrieved
 2107        *                     from disk
 2108        * @return             A byte[] with audio data or null
 2109        * @since 1.4
 2110        */
 2111       private byte[] loadAudioData(final String soundFile){
 2112           if (soundFile == null) {
 2113               return null;
 2114           }
 2115           /* Copy resource into a byte array.  This is
 2116            * necessary because several browsers consider
 2117            * Class.getResource a security risk since it
 2118            * can be used to load additional classes.
 2119            * Class.getResourceAsStream just returns raw
 2120            * bytes, which we can convert to a sound.
 2121            */
 2122           byte[] buffer = AccessController.doPrivileged(
 2123                                                    new PrivilegedAction<byte[]>() {
 2124                   public byte[] run() {
 2125                       try {
 2126                           InputStream resource = BasicLookAndFeel.this.
 2127                               getClass().getResourceAsStream(soundFile);
 2128                           if (resource == null) {
 2129                               return null;
 2130                           }
 2131                           BufferedInputStream in =
 2132                               new BufferedInputStream(resource);
 2133                           ByteArrayOutputStream out =
 2134                               new ByteArrayOutputStream(1024);
 2135                           byte[] buffer = new byte[1024];
 2136                           int n;
 2137                           while ((n = in.read(buffer)) > 0) {
 2138                               out.write(buffer, 0, n);
 2139                           }
 2140                           in.close();
 2141                           out.flush();
 2142                           buffer = out.toByteArray();
 2143                           return buffer;
 2144                       } catch (IOException ioe) {
 2145                           System.err.println(ioe.toString());
 2146                           return null;
 2147                       }
 2148                   }
 2149               });
 2150           if (buffer == null) {
 2151               System.err.println(getClass().getName() + "/" +
 2152                                  soundFile + " not found.");
 2153               return null;
 2154           }
 2155           if (buffer.length == 0) {
 2156               System.err.println("warning: " + soundFile +
 2157                                  " is zero-length");
 2158               return null;
 2159           }
 2160           return buffer;
 2161       }
 2162   
 2163       /**
 2164        * If necessary, invokes {@code actionPerformed} on
 2165        * {@code audioAction} to play a sound.
 2166        * The {@code actionPerformed} method is invoked if the value of
 2167        * the {@code "AuditoryCues.playList"} default is a {@code
 2168        * non-null} {@code Object[]} containing a {@code String} entry
 2169        * equal to the name of the {@code audioAction}.
 2170        *
 2171        * @param audioAction an Action that knows how to render the audio
 2172        *                    associated with the system or user activity
 2173        *                    that is occurring; a value of {@code null}, is
 2174        *                    ignored
 2175        * @throws ClassCastException if {@code audioAction} is {@code non-null}
 2176        *         and the value of the default {@code "AuditoryCues.playList"}
 2177        *         is not an {@code Object[]}
 2178        * @since 1.4
 2179        */
 2180       protected void playSound(Action audioAction) {
 2181           if (audioAction != null) {
 2182               Object[] audioStrings = (Object[])
 2183                                       UIManager.get("AuditoryCues.playList");
 2184               if (audioStrings != null) {
 2185                   // create a HashSet to help us decide to play or not
 2186                   HashSet<Object> audioCues = new HashSet<Object>();
 2187                   for (Object audioString : audioStrings) {
 2188                       audioCues.add(audioString);
 2189                   }
 2190                   // get the name of the Action
 2191                   String actionName = (String)audioAction.getValue(Action.NAME);
 2192                   // if the actionName is in the audioCues HashSet, play it.
 2193                   if (audioCues.contains(actionName)) {
 2194                       audioAction.actionPerformed(new
 2195                           ActionEvent(this, ActionEvent.ACTION_PERFORMED,
 2196                                       actionName));
 2197                   }
 2198               }
 2199           }
 2200       }
 2201   
 2202   
 2203       /**
 2204        * Sets the parent of the passed in ActionMap to be the audio action
 2205        * map.
 2206        */
 2207       static void installAudioActionMap(ActionMap map) {
 2208           LookAndFeel laf = UIManager.getLookAndFeel();
 2209           if (laf instanceof BasicLookAndFeel) {
 2210               map.setParent(((BasicLookAndFeel)laf).getAudioActionMap());
 2211           }
 2212       }
 2213   
 2214   
 2215       /**
 2216        * Helper method to play a named sound.
 2217        *
 2218        * @param c JComponent to play the sound for.
 2219        * @param actionKey Key for the sound.
 2220        */
 2221       static void playSound(JComponent c, Object actionKey) {
 2222           LookAndFeel laf = UIManager.getLookAndFeel();
 2223           if (laf instanceof BasicLookAndFeel) {
 2224               ActionMap map = c.getActionMap();
 2225               if (map != null) {
 2226                   Action audioAction = map.get(actionKey);
 2227                   if (audioAction != null) {
 2228                       // pass off firing the Action to a utility method
 2229                       ((BasicLookAndFeel)laf).playSound(audioAction);
 2230                   }
 2231               }
 2232           }
 2233       }
 2234   
 2235       /**
 2236        * This class contains listener that watches for all the mouse
 2237        * events that can possibly invoke popup on the component
 2238        */
 2239       class AWTEventHelper implements AWTEventListener,PrivilegedAction<Object> {
 2240           AWTEventHelper() {
 2241               super();
 2242               AccessController.doPrivileged(this);
 2243           }
 2244   
 2245           public Object run() {
 2246               Toolkit tk = Toolkit.getDefaultToolkit();
 2247               if(invocator == null) {
 2248                   tk.addAWTEventListener(this, AWTEvent.MOUSE_EVENT_MASK);
 2249               } else {
 2250                   tk.removeAWTEventListener(invocator);
 2251               }
 2252               // Return value not used.
 2253               return null;
 2254           }
 2255   
 2256           public void eventDispatched(AWTEvent ev) {
 2257               int eventID = ev.getID();
 2258               if((eventID & AWTEvent.MOUSE_EVENT_MASK) != 0) {
 2259                   MouseEvent me = (MouseEvent) ev;
 2260                   if(me.isPopupTrigger()) {
 2261                       MenuElement[] elems = MenuSelectionManager
 2262                               .defaultManager()
 2263                               .getSelectedPath();
 2264                       if(elems != null && elems.length != 0) {
 2265                           return;
 2266                           // We shall not interfere with already opened menu
 2267                       }
 2268                       Object c = me.getSource();
 2269                       JComponent src = null;
 2270                       if(c instanceof JComponent) {
 2271                           src = (JComponent) c;
 2272                       } else if(c instanceof BasicSplitPaneDivider) {
 2273                           // Special case - if user clicks on divider we must
 2274                           // invoke popup from the SplitPane
 2275                           src = (JComponent)
 2276                               ((BasicSplitPaneDivider)c).getParent();
 2277                       }
 2278                       if(src != null) {
 2279                           if(src.getComponentPopupMenu() != null) {
 2280                               Point pt = src.getPopupLocation(me);
 2281                               if(pt == null) {
 2282                                   pt = me.getPoint();
 2283                                   pt = SwingUtilities.convertPoint((Component)c,
 2284                                                                     pt, src);
 2285                               }
 2286                               src.getComponentPopupMenu().show(src, pt.x, pt.y);
 2287                               me.consume();
 2288                           }
 2289                       }
 2290                   }
 2291               }
 2292               /* Activate a JInternalFrame if necessary. */
 2293               if (eventID == MouseEvent.MOUSE_PRESSED) {
 2294                   Object object = ev.getSource();
 2295                   if (!(object instanceof Component)) {
 2296                       return;
 2297                   }
 2298                   Component component = (Component)object;
 2299                   if (component != null) {
 2300                       Component parent = component;
 2301                       while (parent != null && !(parent instanceof Window)) {
 2302                           if (parent instanceof JInternalFrame) {
 2303                               // Activate the frame.
 2304                               try { ((JInternalFrame)parent).setSelected(true); }
 2305                               catch (PropertyVetoException e1) { }
 2306                           }
 2307                           parent = parent.getParent();
 2308                       }
 2309                   }
 2310               }
 2311           }
 2312       }
 2313   }

Home » openjdk-7 » javax » swing » plaf » basic » [javadoc | source]