1 /*
   2  * Copyright (c) 1997, 2014, 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 /*
  27  * <p>These classes are designed to be used while the
  28  * corresponding <code>LookAndFeel</code> class has been installed
  29  * (<code>UIManager.setLookAndFeel(new <i>XXX</i>LookAndFeel())</code>).
  30  * Using them while a different <code>LookAndFeel</code> is installed
  31  * may produce unexpected results, including exceptions.
  32  * Additionally, changing the <code>LookAndFeel</code>
  33  * maintained by the <code>UIManager</code> without updating the
  34  * corresponding <code>ComponentUI</code> of any
  35  * <code>JComponent</code>s may also produce unexpected results,
  36  * such as the wrong colors showing up, and is generally not
  37  * encouraged.
  38  *
  39  */
  40 
  41 package com.sun.java.swing.plaf.windows;
  42 
  43 import java.awt.*;
  44 import java.awt.image.BufferedImage;
  45 import java.awt.image.ImageFilter;
  46 import java.awt.image.ImageProducer;
  47 import java.awt.image.FilteredImageSource;
  48 import java.awt.image.RGBImageFilter;
  49 
  50 import javax.swing.plaf.*;
  51 import javax.swing.*;
  52 import javax.swing.plaf.basic.*;
  53 import javax.swing.border.*;
  54 import javax.swing.text.DefaultEditorKit;
  55 import static javax.swing.UIDefaults.LazyValue;
  56 
  57 import java.awt.Font;
  58 import java.awt.Color;
  59 import java.awt.event.ActionEvent;
  60 
  61 import java.security.AccessController;
  62 
  63 import sun.awt.SunToolkit;
  64 import sun.awt.OSInfo;
  65 import sun.awt.shell.ShellFolder;
  66 import sun.font.FontUtilities;
  67 import sun.security.action.GetPropertyAction;
  68 
  69 import sun.swing.DefaultLayoutStyle;
  70 import sun.swing.ImageIconUIResource;
  71 import sun.swing.icon.SortArrowIcon;
  72 import sun.swing.SwingUtilities2;
  73 import sun.swing.StringUIClientPropertyKey;
  74 import sun.swing.plaf.windows.ClassicSortArrowIcon;
  75 
  76 import static com.sun.java.swing.plaf.windows.TMSchema.*;
  77 import static com.sun.java.swing.plaf.windows.XPStyle.Skin;
  78 
  79 import com.sun.java.swing.plaf.windows.WindowsIconFactory.VistaMenuItemCheckIconFactory;
  80 
  81 /**
  82  * Implements the Windows95/98/NT/2000 Look and Feel.
  83  * UI classes not implemented specifically for Windows will
  84  * default to those implemented in Basic.
  85  * <p>
  86  * <strong>Warning:</strong>
  87  * Serialized objects of this class will not be compatible with
  88  * future Swing releases.  The current serialization support is appropriate
  89  * for short term storage or RMI between applications running the same
  90  * version of Swing.  A future release of Swing will provide support for
  91  * long term persistence.
  92  *
  93  * @author unattributed
  94  */
  95 @SuppressWarnings("serial") // Superclass is not serializable across versions
  96 public class WindowsLookAndFeel extends BasicLookAndFeel
  97 {
  98     /**
  99      * A client property that can be used with any JComponent that will end up
 100      * calling the LookAndFeel.getDisabledIcon method. This client property,
 101      * when set to Boolean.TRUE, will cause getDisabledIcon to use an
 102      * alternate algorithm for creating disabled icons to produce icons
 103      * that appear similar to the native Windows file chooser
 104      */
 105     static final Object HI_RES_DISABLED_ICON_CLIENT_KEY =
 106         new StringUIClientPropertyKey(
 107             "WindowsLookAndFeel.generateHiResDisabledIcon");
 108 
 109     private boolean updatePending = false;
 110 
 111     private boolean useSystemFontSettings = true;
 112     private boolean useSystemFontSizeSettings;
 113 
 114     // These properties are not used directly, but are kept as
 115     // private members to avoid being GC'd.
 116     private DesktopProperty themeActive, dllName, colorName, sizeName;
 117     private DesktopProperty aaSettings;
 118 
 119     private transient LayoutStyle style;
 120 
 121     /**
 122      * Base dialog units along the horizontal axis.
 123      */
 124     private int baseUnitX;
 125 
 126     /**
 127      * Base dialog units along the vertical axis.
 128      */
 129     private int baseUnitY;
 130 
 131     public String getName() {
 132         return "Windows";
 133     }
 134 
 135     public String getDescription() {
 136         return "The Microsoft Windows Look and Feel";
 137     }
 138 
 139     public String getID() {
 140         return "Windows";
 141     }
 142 
 143     public boolean isNativeLookAndFeel() {
 144         return OSInfo.getOSType() == OSInfo.OSType.WINDOWS;
 145     }
 146 
 147     public boolean isSupportedLookAndFeel() {
 148         return isNativeLookAndFeel();
 149     }
 150 
 151     public void initialize() {
 152         super.initialize();
 153 
 154         // Set the flag which determines which version of Windows should
 155         // be rendered. This flag only need to be set once.
 156         // if version <= 4.0 then the classic LAF should be loaded.
 157         if (OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_95) <= 0) {
 158             isClassicWindows = true;
 159         } else {
 160             isClassicWindows = false;
 161             XPStyle.invalidateStyle();
 162         }
 163 
 164         // Using the fonts set by the user can potentially cause
 165         // performance and compatibility issues, so allow this feature
 166         // to be switched off either at runtime or programmatically
 167         //
 168         String systemFonts = java.security.AccessController.doPrivileged(
 169                new GetPropertyAction("swing.useSystemFontSettings"));
 170         useSystemFontSettings = (systemFonts == null ||
 171                                  Boolean.valueOf(systemFonts).booleanValue());
 172 
 173         if (useSystemFontSettings) {
 174             Object value = UIManager.get("Application.useSystemFontSettings");
 175 
 176             useSystemFontSettings = (value == null ||
 177                                      Boolean.TRUE.equals(value));
 178         }
 179         KeyboardFocusManager.getCurrentKeyboardFocusManager().
 180             addKeyEventPostProcessor(WindowsRootPaneUI.altProcessor);
 181 
 182     }
 183 
 184     /**
 185      * Initialize the uiClassID to BasicComponentUI mapping.
 186      * The JComponent classes define their own uiClassID constants
 187      * (see AbstractComponent.getUIClassID).  This table must
 188      * map those constants to a BasicComponentUI class of the
 189      * appropriate type.
 190      *
 191      * @see BasicLookAndFeel#getDefaults
 192      */
 193     protected void initClassDefaults(UIDefaults table)
 194     {
 195         super.initClassDefaults(table);
 196 
 197         final String windowsPackageName = "com.sun.java.swing.plaf.windows.";
 198 
 199         Object[] uiDefaults = {
 200               "ButtonUI", windowsPackageName + "WindowsButtonUI",
 201             "CheckBoxUI", windowsPackageName + "WindowsCheckBoxUI",
 202     "CheckBoxMenuItemUI", windowsPackageName + "WindowsCheckBoxMenuItemUI",
 203                "LabelUI", windowsPackageName + "WindowsLabelUI",
 204          "RadioButtonUI", windowsPackageName + "WindowsRadioButtonUI",
 205  "RadioButtonMenuItemUI", windowsPackageName + "WindowsRadioButtonMenuItemUI",
 206         "ToggleButtonUI", windowsPackageName + "WindowsToggleButtonUI",
 207          "ProgressBarUI", windowsPackageName + "WindowsProgressBarUI",
 208               "SliderUI", windowsPackageName + "WindowsSliderUI",
 209            "SeparatorUI", windowsPackageName + "WindowsSeparatorUI",
 210            "SplitPaneUI", windowsPackageName + "WindowsSplitPaneUI",
 211              "SpinnerUI", windowsPackageName + "WindowsSpinnerUI",
 212           "TabbedPaneUI", windowsPackageName + "WindowsTabbedPaneUI",
 213             "TextAreaUI", windowsPackageName + "WindowsTextAreaUI",
 214            "TextFieldUI", windowsPackageName + "WindowsTextFieldUI",
 215        "PasswordFieldUI", windowsPackageName + "WindowsPasswordFieldUI",
 216             "TextPaneUI", windowsPackageName + "WindowsTextPaneUI",
 217           "EditorPaneUI", windowsPackageName + "WindowsEditorPaneUI",
 218                 "TreeUI", windowsPackageName + "WindowsTreeUI",
 219              "ToolBarUI", windowsPackageName + "WindowsToolBarUI",
 220     "ToolBarSeparatorUI", windowsPackageName + "WindowsToolBarSeparatorUI",
 221             "ComboBoxUI", windowsPackageName + "WindowsComboBoxUI",
 222          "TableHeaderUI", windowsPackageName + "WindowsTableHeaderUI",
 223        "InternalFrameUI", windowsPackageName + "WindowsInternalFrameUI",
 224          "DesktopPaneUI", windowsPackageName + "WindowsDesktopPaneUI",
 225          "DesktopIconUI", windowsPackageName + "WindowsDesktopIconUI",
 226          "FileChooserUI", windowsPackageName + "WindowsFileChooserUI",
 227                 "MenuUI", windowsPackageName + "WindowsMenuUI",
 228             "MenuItemUI", windowsPackageName + "WindowsMenuItemUI",
 229              "MenuBarUI", windowsPackageName + "WindowsMenuBarUI",
 230            "PopupMenuUI", windowsPackageName + "WindowsPopupMenuUI",
 231   "PopupMenuSeparatorUI", windowsPackageName + "WindowsPopupMenuSeparatorUI",
 232            "ScrollBarUI", windowsPackageName + "WindowsScrollBarUI",
 233             "RootPaneUI", windowsPackageName + "WindowsRootPaneUI"
 234         };
 235 
 236         table.putDefaults(uiDefaults);
 237     }
 238 
 239     /**
 240      * Load the SystemColors into the defaults table.  The keys
 241      * for SystemColor defaults are the same as the names of
 242      * the public fields in SystemColor.  If the table is being
 243      * created on a native Windows platform we use the SystemColor
 244      * values, otherwise we create color objects whose values match
 245      * the defaults Windows95 colors.
 246      */
 247     protected void initSystemColorDefaults(UIDefaults table)
 248     {
 249         String[] defaultSystemColors = {
 250                 "desktop", "#005C5C", /* Color of the desktop background */
 251           "activeCaption", "#000080", /* Color for captions (title bars) when they are active. */
 252       "activeCaptionText", "#FFFFFF", /* Text color for text in captions (title bars). */
 253     "activeCaptionBorder", "#C0C0C0", /* Border color for caption (title bar) window borders. */
 254         "inactiveCaption", "#808080", /* Color for captions (title bars) when not active. */
 255     "inactiveCaptionText", "#C0C0C0", /* Text color for text in inactive captions (title bars). */
 256   "inactiveCaptionBorder", "#C0C0C0", /* Border color for inactive caption (title bar) window borders. */
 257                  "window", "#FFFFFF", /* Default color for the interior of windows */
 258            "windowBorder", "#000000", /* ??? */
 259              "windowText", "#000000", /* ??? */
 260                    "menu", "#C0C0C0", /* Background color for menus */
 261        "menuPressedItemB", "#000080", /* LightShadow of menubutton highlight */
 262        "menuPressedItemF", "#FFFFFF", /* Default color for foreground "text" in menu item */
 263                "menuText", "#000000", /* Text color for menus  */
 264                    "text", "#C0C0C0", /* Text background color */
 265                "textText", "#000000", /* Text foreground color */
 266           "textHighlight", "#000080", /* Text background color when selected */
 267       "textHighlightText", "#FFFFFF", /* Text color when selected */
 268        "textInactiveText", "#808080", /* Text color when disabled */
 269                 "control", "#C0C0C0", /* Default color for controls (buttons, sliders, etc) */
 270             "controlText", "#000000", /* Default color for text in controls */
 271        "controlHighlight", "#C0C0C0",
 272 
 273   /*"controlHighlight", "#E0E0E0",*/ /* Specular highlight (opposite of the shadow) */
 274      "controlLtHighlight", "#FFFFFF", /* Highlight color for controls */
 275           "controlShadow", "#808080", /* Shadow color for controls */
 276         "controlDkShadow", "#000000", /* Dark shadow color for controls */
 277               "scrollbar", "#E0E0E0", /* Scrollbar background (usually the "track") */
 278                    "info", "#FFFFE1", /* ??? */
 279                "infoText", "#000000"  /* ??? */
 280         };
 281 
 282         loadSystemColors(table, defaultSystemColors, isNativeLookAndFeel());
 283     }
 284 
 285    /**
 286      * Initialize the defaults table with the name of the ResourceBundle
 287      * used for getting localized defaults.
 288      */
 289     private void initResourceBundle(UIDefaults table) {
 290         table.addResourceBundle( "com.sun.java.swing.plaf.windows.resources.windows" );
 291     }
 292 
 293     // XXX - there are probably a lot of redundant values that could be removed.
 294     // ie. Take a look at RadioButtonBorder, etc...
 295     protected void initComponentDefaults(UIDefaults table)
 296     {
 297         super.initComponentDefaults( table );
 298 
 299         initResourceBundle(table);
 300 
 301         // *** Shared Fonts
 302         LazyValue dialogPlain12 = t -> new FontUIResource(Font.DIALOG, Font.PLAIN, 12);
 303 
 304         LazyValue sansSerifPlain12 =  t -> new FontUIResource(Font.SANS_SERIF, Font.PLAIN, 12);
 305         LazyValue monospacedPlain12 = t -> new FontUIResource(Font.MONOSPACED, Font.PLAIN, 12);
 306         LazyValue dialogBold12 = t -> new FontUIResource(Font.DIALOG, Font.BOLD, 12);
 307 
 308         // *** Colors
 309         // XXX - some of these doens't seem to be used
 310         ColorUIResource red = new ColorUIResource(Color.red);
 311         ColorUIResource black = new ColorUIResource(Color.black);
 312         ColorUIResource white = new ColorUIResource(Color.white);
 313         ColorUIResource gray = new ColorUIResource(Color.gray);
 314         ColorUIResource darkGray = new ColorUIResource(Color.darkGray);
 315         ColorUIResource scrollBarTrackHighlight = darkGray;
 316 
 317         // Set the flag which determines which version of Windows should
 318         // be rendered. This flag only need to be set once.
 319         // if version <= 4.0 then the classic LAF should be loaded.
 320         isClassicWindows = OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_95) <= 0;
 321 
 322         // *** Tree
 323         Object treeExpandedIcon = WindowsTreeUI.ExpandedIcon.createExpandedIcon();
 324 
 325         Object treeCollapsedIcon = WindowsTreeUI.CollapsedIcon.createCollapsedIcon();
 326 
 327 
 328         // *** Text
 329         Object fieldInputMap = new UIDefaults.LazyInputMap(new Object[] {
 330                       "control C", DefaultEditorKit.copyAction,
 331                       "control V", DefaultEditorKit.pasteAction,
 332                       "control X", DefaultEditorKit.cutAction,
 333                            "COPY", DefaultEditorKit.copyAction,
 334                           "PASTE", DefaultEditorKit.pasteAction,
 335                             "CUT", DefaultEditorKit.cutAction,
 336                  "control INSERT", DefaultEditorKit.copyAction,
 337                    "shift INSERT", DefaultEditorKit.pasteAction,
 338                    "shift DELETE", DefaultEditorKit.cutAction,
 339                       "control A", DefaultEditorKit.selectAllAction,
 340              "control BACK_SLASH", "unselect"/*DefaultEditorKit.unselectAction*/,
 341                      "shift LEFT", DefaultEditorKit.selectionBackwardAction,
 342                     "shift RIGHT", DefaultEditorKit.selectionForwardAction,
 343                    "control LEFT", DefaultEditorKit.previousWordAction,
 344                   "control RIGHT", DefaultEditorKit.nextWordAction,
 345              "control shift LEFT", DefaultEditorKit.selectionPreviousWordAction,
 346             "control shift RIGHT", DefaultEditorKit.selectionNextWordAction,
 347                            "HOME", DefaultEditorKit.beginLineAction,
 348                             "END", DefaultEditorKit.endLineAction,
 349                      "shift HOME", DefaultEditorKit.selectionBeginLineAction,
 350                       "shift END", DefaultEditorKit.selectionEndLineAction,
 351                      "BACK_SPACE", DefaultEditorKit.deletePrevCharAction,
 352                "shift BACK_SPACE", DefaultEditorKit.deletePrevCharAction,
 353                          "ctrl H", DefaultEditorKit.deletePrevCharAction,
 354                          "DELETE", DefaultEditorKit.deleteNextCharAction,
 355                     "ctrl DELETE", DefaultEditorKit.deleteNextWordAction,
 356                 "ctrl BACK_SPACE", DefaultEditorKit.deletePrevWordAction,
 357                           "RIGHT", DefaultEditorKit.forwardAction,
 358                            "LEFT", DefaultEditorKit.backwardAction,
 359                        "KP_RIGHT", DefaultEditorKit.forwardAction,
 360                         "KP_LEFT", DefaultEditorKit.backwardAction,
 361                           "ENTER", JTextField.notifyAction,
 362                 "control shift O", "toggle-componentOrientation"/*DefaultEditorKit.toggleComponentOrientation*/
 363         });
 364 
 365         Object passwordInputMap = new UIDefaults.LazyInputMap(new Object[] {
 366                       "control C", DefaultEditorKit.copyAction,
 367                       "control V", DefaultEditorKit.pasteAction,
 368                       "control X", DefaultEditorKit.cutAction,
 369                            "COPY", DefaultEditorKit.copyAction,
 370                           "PASTE", DefaultEditorKit.pasteAction,
 371                             "CUT", DefaultEditorKit.cutAction,
 372                  "control INSERT", DefaultEditorKit.copyAction,
 373                    "shift INSERT", DefaultEditorKit.pasteAction,
 374                    "shift DELETE", DefaultEditorKit.cutAction,
 375                       "control A", DefaultEditorKit.selectAllAction,
 376              "control BACK_SLASH", "unselect"/*DefaultEditorKit.unselectAction*/,
 377                      "shift LEFT", DefaultEditorKit.selectionBackwardAction,
 378                     "shift RIGHT", DefaultEditorKit.selectionForwardAction,
 379                    "control LEFT", DefaultEditorKit.beginLineAction,
 380                   "control RIGHT", DefaultEditorKit.endLineAction,
 381              "control shift LEFT", DefaultEditorKit.selectionBeginLineAction,
 382             "control shift RIGHT", DefaultEditorKit.selectionEndLineAction,
 383                            "HOME", DefaultEditorKit.beginLineAction,
 384                             "END", DefaultEditorKit.endLineAction,
 385                      "shift HOME", DefaultEditorKit.selectionBeginLineAction,
 386                       "shift END", DefaultEditorKit.selectionEndLineAction,
 387                      "BACK_SPACE", DefaultEditorKit.deletePrevCharAction,
 388                "shift BACK_SPACE", DefaultEditorKit.deletePrevCharAction,
 389                          "ctrl H", DefaultEditorKit.deletePrevCharAction,
 390                          "DELETE", DefaultEditorKit.deleteNextCharAction,
 391                           "RIGHT", DefaultEditorKit.forwardAction,
 392                            "LEFT", DefaultEditorKit.backwardAction,
 393                        "KP_RIGHT", DefaultEditorKit.forwardAction,
 394                         "KP_LEFT", DefaultEditorKit.backwardAction,
 395                           "ENTER", JTextField.notifyAction,
 396                 "control shift O", "toggle-componentOrientation"/*DefaultEditorKit.toggleComponentOrientation*/
 397         });
 398 
 399         Object multilineInputMap = new UIDefaults.LazyInputMap(new Object[] {
 400                       "control C", DefaultEditorKit.copyAction,
 401                       "control V", DefaultEditorKit.pasteAction,
 402                       "control X", DefaultEditorKit.cutAction,
 403                            "COPY", DefaultEditorKit.copyAction,
 404                           "PASTE", DefaultEditorKit.pasteAction,
 405                             "CUT", DefaultEditorKit.cutAction,
 406                  "control INSERT", DefaultEditorKit.copyAction,
 407                    "shift INSERT", DefaultEditorKit.pasteAction,
 408                    "shift DELETE", DefaultEditorKit.cutAction,
 409                      "shift LEFT", DefaultEditorKit.selectionBackwardAction,
 410                     "shift RIGHT", DefaultEditorKit.selectionForwardAction,
 411                    "control LEFT", DefaultEditorKit.previousWordAction,
 412                   "control RIGHT", DefaultEditorKit.nextWordAction,
 413              "control shift LEFT", DefaultEditorKit.selectionPreviousWordAction,
 414             "control shift RIGHT", DefaultEditorKit.selectionNextWordAction,
 415                       "control A", DefaultEditorKit.selectAllAction,
 416              "control BACK_SLASH", "unselect"/*DefaultEditorKit.unselectAction*/,
 417                            "HOME", DefaultEditorKit.beginLineAction,
 418                             "END", DefaultEditorKit.endLineAction,
 419                      "shift HOME", DefaultEditorKit.selectionBeginLineAction,
 420                       "shift END", DefaultEditorKit.selectionEndLineAction,
 421                    "control HOME", DefaultEditorKit.beginAction,
 422                     "control END", DefaultEditorKit.endAction,
 423              "control shift HOME", DefaultEditorKit.selectionBeginAction,
 424               "control shift END", DefaultEditorKit.selectionEndAction,
 425                              "UP", DefaultEditorKit.upAction,
 426                            "DOWN", DefaultEditorKit.downAction,
 427                      "BACK_SPACE", DefaultEditorKit.deletePrevCharAction,
 428                "shift BACK_SPACE", DefaultEditorKit.deletePrevCharAction,
 429                          "ctrl H", DefaultEditorKit.deletePrevCharAction,
 430                          "DELETE", DefaultEditorKit.deleteNextCharAction,
 431                     "ctrl DELETE", DefaultEditorKit.deleteNextWordAction,
 432                 "ctrl BACK_SPACE", DefaultEditorKit.deletePrevWordAction,
 433                           "RIGHT", DefaultEditorKit.forwardAction,
 434                            "LEFT", DefaultEditorKit.backwardAction,
 435                        "KP_RIGHT", DefaultEditorKit.forwardAction,
 436                         "KP_LEFT", DefaultEditorKit.backwardAction,
 437                         "PAGE_UP", DefaultEditorKit.pageUpAction,
 438                       "PAGE_DOWN", DefaultEditorKit.pageDownAction,
 439                   "shift PAGE_UP", "selection-page-up",
 440                 "shift PAGE_DOWN", "selection-page-down",
 441              "ctrl shift PAGE_UP", "selection-page-left",
 442            "ctrl shift PAGE_DOWN", "selection-page-right",
 443                        "shift UP", DefaultEditorKit.selectionUpAction,
 444                      "shift DOWN", DefaultEditorKit.selectionDownAction,
 445                           "ENTER", DefaultEditorKit.insertBreakAction,
 446                             "TAB", DefaultEditorKit.insertTabAction,
 447                       "control T", "next-link-action",
 448                 "control shift T", "previous-link-action",
 449                   "control SPACE", "activate-link-action",
 450                 "control shift O", "toggle-componentOrientation"/*DefaultEditorKit.toggleComponentOrientation*/
 451         });
 452 
 453         Object menuItemAcceleratorDelimiter = "+";
 454 
 455         Object ControlBackgroundColor = new DesktopProperty(
 456                                                        "win.3d.backgroundColor",
 457                                                         table.get("control"));
 458         Object ControlLightColor      = new DesktopProperty(
 459                                                        "win.3d.lightColor",
 460                                                         table.get("controlHighlight"));
 461         Object ControlHighlightColor  = new DesktopProperty(
 462                                                        "win.3d.highlightColor",
 463                                                         table.get("controlLtHighlight"));
 464         Object ControlShadowColor     = new DesktopProperty(
 465                                                        "win.3d.shadowColor",
 466                                                         table.get("controlShadow"));
 467         Object ControlDarkShadowColor = new DesktopProperty(
 468                                                        "win.3d.darkShadowColor",
 469                                                         table.get("controlDkShadow"));
 470         Object ControlTextColor       = new DesktopProperty(
 471                                                        "win.button.textColor",
 472                                                         table.get("controlText"));
 473         Object MenuBackgroundColor    = new DesktopProperty(
 474                                                        "win.menu.backgroundColor",
 475                                                         table.get("menu"));
 476         Object MenuBarBackgroundColor = new DesktopProperty(
 477                                                        "win.menubar.backgroundColor",
 478                                                         table.get("menu"));
 479         Object MenuTextColor          = new DesktopProperty(
 480                                                        "win.menu.textColor",
 481                                                         table.get("menuText"));
 482         Object SelectionBackgroundColor = new DesktopProperty(
 483                                                        "win.item.highlightColor",
 484                                                         table.get("textHighlight"));
 485         Object SelectionTextColor     = new DesktopProperty(
 486                                                        "win.item.highlightTextColor",
 487                                                         table.get("textHighlightText"));
 488         Object WindowBackgroundColor  = new DesktopProperty(
 489                                                        "win.frame.backgroundColor",
 490                                                         table.get("window"));
 491         Object WindowTextColor        = new DesktopProperty(
 492                                                        "win.frame.textColor",
 493                                                         table.get("windowText"));
 494         Object WindowBorderWidth      = new DesktopProperty(
 495                                                        "win.frame.sizingBorderWidth",
 496                                                        Integer.valueOf(1));
 497         Object TitlePaneHeight        = new DesktopProperty(
 498                                                        "win.frame.captionHeight",
 499                                                        Integer.valueOf(18));
 500         Object TitleButtonWidth       = new DesktopProperty(
 501                                                        "win.frame.captionButtonWidth",
 502                                                        Integer.valueOf(16));
 503         Object TitleButtonHeight      = new DesktopProperty(
 504                                                        "win.frame.captionButtonHeight",
 505                                                        Integer.valueOf(16));
 506         Object InactiveTextColor      = new DesktopProperty(
 507                                                        "win.text.grayedTextColor",
 508                                                         table.get("textInactiveText"));
 509         Object ScrollbarBackgroundColor = new DesktopProperty(
 510                                                        "win.scrollbar.backgroundColor",
 511                                                         table.get("scrollbar"));
 512         Object buttonFocusColor = new FocusColorProperty();
 513 
 514         Object TextBackground         = new XPColorValue(Part.EP_EDIT, null, Prop.FILLCOLOR,
 515                                                          WindowBackgroundColor);
 516         //The following four lines were commented out as part of bug 4991597
 517         //This code *is* correct, however it differs from WindowsXP and is, apparently
 518         //a Windows XP bug. Until Windows fixes this bug, we shall also exhibit the same
 519         //behavior
 520         //Object ReadOnlyTextBackground = new XPColorValue(Part.EP_EDITTEXT, State.READONLY, Prop.FILLCOLOR,
 521         //                                                 ControlBackgroundColor);
 522         //Object DisabledTextBackground = new XPColorValue(Part.EP_EDITTEXT, State.DISABLED, Prop.FILLCOLOR,
 523         //                                                 ControlBackgroundColor);
 524         Object ReadOnlyTextBackground = ControlBackgroundColor;
 525         Object DisabledTextBackground = ControlBackgroundColor;
 526 
 527         Object MenuFont = dialogPlain12;
 528         Object FixedControlFont = monospacedPlain12;
 529         Object ControlFont = dialogPlain12;
 530         Object MessageFont = dialogPlain12;
 531         Object WindowFont = dialogBold12;
 532         Object ToolTipFont = sansSerifPlain12;
 533         Object IconFont = ControlFont;
 534 
 535         Object scrollBarWidth = new DesktopProperty("win.scrollbar.width", Integer.valueOf(16));
 536 
 537         Object menuBarHeight = new DesktopProperty("win.menu.height", null);
 538 
 539         Object hotTrackingOn = new DesktopProperty("win.item.hotTrackingOn", true);
 540 
 541         Object showMnemonics = new DesktopProperty("win.menu.keyboardCuesOn", Boolean.TRUE);
 542 
 543         if (useSystemFontSettings) {
 544             MenuFont = getDesktopFontValue("win.menu.font", MenuFont);
 545             FixedControlFont = getDesktopFontValue("win.ansiFixed.font", FixedControlFont);
 546             ControlFont = getDesktopFontValue("win.defaultGUI.font", ControlFont);
 547             MessageFont = getDesktopFontValue("win.messagebox.font", MessageFont);
 548             WindowFont = getDesktopFontValue("win.frame.captionFont", WindowFont);
 549             IconFont    = getDesktopFontValue("win.icon.font", IconFont);
 550             ToolTipFont = getDesktopFontValue("win.tooltip.font", ToolTipFont);
 551 
 552             /* Put the desktop AA settings in the defaults.
 553              * JComponent.setUI() retrieves this and makes it available
 554              * as a client property on the JComponent. Use the same key name
 555              * for both client property and UIDefaults.
 556              * Also need to set up listeners for changes in these settings.
 557              */
 558             Object aaTextInfo = SwingUtilities2.AATextInfo.getAATextInfo(true);
 559             table.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, aaTextInfo);
 560             this.aaSettings =
 561                 new FontDesktopProperty(SunToolkit.DESKTOPFONTHINTS);
 562         }
 563         if (useSystemFontSizeSettings) {
 564             MenuFont = new WindowsFontSizeProperty("win.menu.font.height", Font.DIALOG, Font.PLAIN, 12);
 565             FixedControlFont = new WindowsFontSizeProperty("win.ansiFixed.font.height", Font.MONOSPACED,
 566                        Font.PLAIN, 12);
 567             ControlFont = new WindowsFontSizeProperty("win.defaultGUI.font.height", Font.DIALOG, Font.PLAIN, 12);
 568             MessageFont = new WindowsFontSizeProperty("win.messagebox.font.height", Font.DIALOG, Font.PLAIN, 12);
 569             WindowFont = new WindowsFontSizeProperty("win.frame.captionFont.height", Font.DIALOG, Font.BOLD, 12);
 570             ToolTipFont = new WindowsFontSizeProperty("win.tooltip.font.height", Font.SANS_SERIF, Font.PLAIN, 12);
 571             IconFont    = new WindowsFontSizeProperty("win.icon.font.height", Font.DIALOG, Font.PLAIN, 12);
 572         }
 573 
 574 
 575         if (!(this instanceof WindowsClassicLookAndFeel) &&
 576             (OSInfo.getOSType() == OSInfo.OSType.WINDOWS &&
 577              OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_XP) >= 0) &&
 578             AccessController.doPrivileged(new GetPropertyAction("swing.noxp")) == null) {
 579 
 580             // These desktop properties are not used directly, but are needed to
 581             // trigger realoading of UI's.
 582             this.themeActive = new TriggerDesktopProperty("win.xpstyle.themeActive");
 583             this.dllName     = new TriggerDesktopProperty("win.xpstyle.dllName");
 584             this.colorName   = new TriggerDesktopProperty("win.xpstyle.colorName");
 585             this.sizeName    = new TriggerDesktopProperty("win.xpstyle.sizeName");
 586         }
 587 
 588 
 589         Object[] defaults = {
 590             // *** Auditory Feedback
 591             // this key defines which of the various cues to render
 592             // Overridden from BasicL&F. This L&F should play all sounds
 593             // all the time. The infrastructure decides what to play.
 594             // This is disabled until sound bugs can be resolved.
 595             "AuditoryCues.playList", null, // table.get("AuditoryCues.cueList"),
 596 
 597             "Application.useSystemFontSettings", Boolean.valueOf(useSystemFontSettings),
 598 
 599             "TextField.focusInputMap", fieldInputMap,
 600             "PasswordField.focusInputMap", passwordInputMap,
 601             "TextArea.focusInputMap", multilineInputMap,
 602             "TextPane.focusInputMap", multilineInputMap,
 603             "EditorPane.focusInputMap", multilineInputMap,
 604 
 605             // Buttons
 606             "Button.font", ControlFont,
 607             "Button.background", ControlBackgroundColor,
 608             // Button.foreground, Button.shadow, Button.darkShadow,
 609             // Button.disabledForground, and Button.disabledShadow are only
 610             // used for Windows Classic. Windows XP will use colors
 611             // from the current visual style.
 612             "Button.foreground", ControlTextColor,
 613             "Button.shadow", ControlShadowColor,
 614             "Button.darkShadow", ControlDarkShadowColor,
 615             "Button.light", ControlLightColor,
 616             "Button.highlight", ControlHighlightColor,
 617             "Button.disabledForeground", InactiveTextColor,
 618             "Button.disabledShadow", ControlHighlightColor,
 619             "Button.focus", buttonFocusColor,
 620             "Button.dashedRectGapX", new XPValue(Integer.valueOf(3), Integer.valueOf(5)),
 621             "Button.dashedRectGapY", new XPValue(Integer.valueOf(3), Integer.valueOf(4)),
 622             "Button.dashedRectGapWidth", new XPValue(Integer.valueOf(6), Integer.valueOf(10)),
 623             "Button.dashedRectGapHeight", new XPValue(Integer.valueOf(6), Integer.valueOf(8)),
 624             "Button.textShiftOffset", new XPValue(Integer.valueOf(0),
 625                                                   Integer.valueOf(1)),
 626             // W2K keyboard navigation hidding.
 627             "Button.showMnemonics", showMnemonics,
 628             "Button.focusInputMap",
 629                new UIDefaults.LazyInputMap(new Object[] {
 630                             "SPACE", "pressed",
 631                    "released SPACE", "released"
 632                  }),
 633 
 634             "Caret.width",
 635                   new DesktopProperty("win.caret.width", null),
 636 
 637             "CheckBox.font", ControlFont,
 638             "CheckBox.interiorBackground", WindowBackgroundColor,
 639             "CheckBox.background", ControlBackgroundColor,
 640             "CheckBox.foreground", WindowTextColor,
 641             "CheckBox.shadow", ControlShadowColor,
 642             "CheckBox.darkShadow", ControlDarkShadowColor,
 643             "CheckBox.light", ControlLightColor,
 644             "CheckBox.highlight", ControlHighlightColor,
 645             "CheckBox.focus", buttonFocusColor,
 646             "CheckBox.focusInputMap",
 647                new UIDefaults.LazyInputMap(new Object[] {
 648                             "SPACE", "pressed",
 649                    "released SPACE", "released"
 650                  }),
 651             // margin is 2 all the way around, BasicBorders.RadioButtonBorder
 652             // (checkbox uses RadioButtonBorder) is 2 all the way around too.
 653             "CheckBox.totalInsets", new Insets(4, 4, 4, 4),
 654 
 655             "CheckBoxMenuItem.font", MenuFont,
 656             "CheckBoxMenuItem.background", MenuBackgroundColor,
 657             "CheckBoxMenuItem.foreground", MenuTextColor,
 658             "CheckBoxMenuItem.selectionForeground", SelectionTextColor,
 659             "CheckBoxMenuItem.selectionBackground", SelectionBackgroundColor,
 660             "CheckBoxMenuItem.acceleratorForeground", MenuTextColor,
 661             "CheckBoxMenuItem.acceleratorSelectionForeground", SelectionTextColor,
 662             "CheckBoxMenuItem.commandSound", "win.sound.menuCommand",
 663 
 664             "ComboBox.font", ControlFont,
 665             "ComboBox.background", WindowBackgroundColor,
 666             "ComboBox.foreground", WindowTextColor,
 667             "ComboBox.buttonBackground", ControlBackgroundColor,
 668             "ComboBox.buttonShadow", ControlShadowColor,
 669             "ComboBox.buttonDarkShadow", ControlDarkShadowColor,
 670             "ComboBox.buttonHighlight", ControlHighlightColor,
 671             "ComboBox.selectionBackground", SelectionBackgroundColor,
 672             "ComboBox.selectionForeground", SelectionTextColor,
 673             "ComboBox.editorBorder", new XPValue(new EmptyBorder(1,2,1,1),
 674                                                  new EmptyBorder(1,4,1,4)),
 675             "ComboBox.disabledBackground",
 676                         new XPColorValue(Part.CP_COMBOBOX, State.DISABLED,
 677                         Prop.FILLCOLOR, DisabledTextBackground),
 678             "ComboBox.disabledForeground",
 679                         new XPColorValue(Part.CP_COMBOBOX, State.DISABLED,
 680                         Prop.TEXTCOLOR, InactiveTextColor),
 681             "ComboBox.ancestorInputMap", new UIDefaults.LazyInputMap(new Object[] {
 682                    "ESCAPE", "hidePopup",
 683                   "PAGE_UP", "pageUpPassThrough",
 684                 "PAGE_DOWN", "pageDownPassThrough",
 685                      "HOME", "homePassThrough",
 686                       "END", "endPassThrough",
 687                      "DOWN", "selectNext2",
 688                   "KP_DOWN", "selectNext2",
 689                        "UP", "selectPrevious2",
 690                     "KP_UP", "selectPrevious2",
 691                     "ENTER", "enterPressed",
 692                        "F4", "togglePopup",
 693                  "alt DOWN", "togglePopup",
 694               "alt KP_DOWN", "togglePopup",
 695                    "alt UP", "togglePopup",
 696                 "alt KP_UP", "togglePopup"
 697               }),
 698 
 699             // DeskTop.
 700             "Desktop.background", new DesktopProperty(
 701                                                  "win.desktop.backgroundColor",
 702                                                   table.get("desktop")),
 703             "Desktop.ancestorInputMap",
 704                new UIDefaults.LazyInputMap(new Object[] {
 705                    "ctrl F5", "restore",
 706                    "ctrl F4", "close",
 707                    "ctrl F7", "move",
 708                    "ctrl F8", "resize",
 709                    "RIGHT", "right",
 710                    "KP_RIGHT", "right",
 711                    "LEFT", "left",
 712                    "KP_LEFT", "left",
 713                    "UP", "up",
 714                    "KP_UP", "up",
 715                    "DOWN", "down",
 716                    "KP_DOWN", "down",
 717                    "ESCAPE", "escape",
 718                    "ctrl F9", "minimize",
 719                    "ctrl F10", "maximize",
 720                    "ctrl F6", "selectNextFrame",
 721                    "ctrl TAB", "selectNextFrame",
 722                    "ctrl alt F6", "selectNextFrame",
 723                    "shift ctrl alt F6", "selectPreviousFrame",
 724                    "ctrl F12", "navigateNext",
 725                    "shift ctrl F12", "navigatePrevious"
 726                }),
 727 
 728             // DesktopIcon
 729             "DesktopIcon.width", Integer.valueOf(160),
 730 
 731             "EditorPane.font", ControlFont,
 732             "EditorPane.background", WindowBackgroundColor,
 733             "EditorPane.foreground", WindowTextColor,
 734             "EditorPane.selectionBackground", SelectionBackgroundColor,
 735             "EditorPane.selectionForeground", SelectionTextColor,
 736             "EditorPane.caretForeground", WindowTextColor,
 737             "EditorPane.inactiveForeground", InactiveTextColor,
 738             "EditorPane.inactiveBackground", WindowBackgroundColor,
 739             "EditorPane.disabledBackground", DisabledTextBackground,
 740 
 741             "FileChooser.homeFolderIcon",  new LazyWindowsIcon(null,
 742                                                                "icons/HomeFolder.gif"),
 743             "FileChooser.listFont", IconFont,
 744             "FileChooser.listViewBackground", new XPColorValue(Part.LVP_LISTVIEW, null, Prop.FILLCOLOR,
 745                                                                WindowBackgroundColor),
 746             "FileChooser.listViewBorder", new XPBorderValue(Part.LVP_LISTVIEW,
 747                (LazyValue) t -> BorderUIResource.getLoweredBevelBorderUIResource()),
 748             "FileChooser.listViewIcon",    new LazyWindowsIcon("fileChooserIcon ListView",
 749                                                                "icons/ListView.gif"),
 750             "FileChooser.listViewWindowsStyle", Boolean.TRUE,
 751             "FileChooser.detailsViewIcon", new LazyWindowsIcon("fileChooserIcon DetailsView",
 752                                                                "icons/DetailsView.gif"),
 753             "FileChooser.viewMenuIcon", new LazyWindowsIcon("fileChooserIcon ViewMenu",
 754                                                             "icons/ListView.gif"),
 755             "FileChooser.upFolderIcon",    new LazyWindowsIcon("fileChooserIcon UpFolder",
 756                                                                "icons/UpFolder.gif"),
 757             "FileChooser.newFolderIcon",   new LazyWindowsIcon("fileChooserIcon NewFolder",
 758                                                                "icons/NewFolder.gif"),
 759             "FileChooser.useSystemExtensionHiding", Boolean.TRUE,
 760 
 761             "FileChooser.usesSingleFilePane", Boolean.TRUE,
 762             "FileChooser.noPlacesBar", new DesktopProperty("win.comdlg.noPlacesBar",
 763                                                            Boolean.FALSE),
 764             "FileChooser.ancestorInputMap",
 765                new UIDefaults.LazyInputMap(new Object[] {
 766                      "ESCAPE", "cancelSelection",
 767                      "F2", "editFileName",
 768                      "F5", "refresh",
 769                      "BACK_SPACE", "Go Up"
 770                  }),
 771 
 772             "FileView.directoryIcon", SwingUtilities2.makeIcon(getClass(),
 773                                                                WindowsLookAndFeel.class,
 774                                                                "icons/Directory.gif"),
 775             "FileView.fileIcon", SwingUtilities2.makeIcon(getClass(),
 776                                                           WindowsLookAndFeel.class,
 777                                                           "icons/File.gif"),
 778             "FileView.computerIcon", SwingUtilities2.makeIcon(getClass(),
 779                                                               WindowsLookAndFeel.class,
 780                                                               "icons/Computer.gif"),
 781             "FileView.hardDriveIcon", SwingUtilities2.makeIcon(getClass(),
 782                                                                WindowsLookAndFeel.class,
 783                                                                "icons/HardDrive.gif"),
 784             "FileView.floppyDriveIcon", SwingUtilities2.makeIcon(getClass(),
 785                                                                  WindowsLookAndFeel.class,
 786                                                                  "icons/FloppyDrive.gif"),
 787 
 788             "FormattedTextField.font", ControlFont,
 789             "InternalFrame.titleFont", WindowFont,
 790             "InternalFrame.titlePaneHeight",   TitlePaneHeight,
 791             "InternalFrame.titleButtonWidth",  TitleButtonWidth,
 792             "InternalFrame.titleButtonHeight", TitleButtonHeight,
 793             "InternalFrame.titleButtonToolTipsOn", hotTrackingOn,
 794             "InternalFrame.borderColor", ControlBackgroundColor,
 795             "InternalFrame.borderShadow", ControlShadowColor,
 796             "InternalFrame.borderDarkShadow", ControlDarkShadowColor,
 797             "InternalFrame.borderHighlight", ControlHighlightColor,
 798             "InternalFrame.borderLight", ControlLightColor,
 799             "InternalFrame.borderWidth", WindowBorderWidth,
 800             "InternalFrame.minimizeIconBackground", ControlBackgroundColor,
 801             "InternalFrame.resizeIconHighlight", ControlLightColor,
 802             "InternalFrame.resizeIconShadow", ControlShadowColor,
 803             "InternalFrame.activeBorderColor", new DesktopProperty(
 804                                                        "win.frame.activeBorderColor",
 805                                                        table.get("windowBorder")),
 806             "InternalFrame.inactiveBorderColor", new DesktopProperty(
 807                                                        "win.frame.inactiveBorderColor",
 808                                                        table.get("windowBorder")),
 809             "InternalFrame.activeTitleBackground", new DesktopProperty(
 810                                                         "win.frame.activeCaptionColor",
 811                                                          table.get("activeCaption")),
 812             "InternalFrame.activeTitleGradient", new DesktopProperty(
 813                                                         "win.frame.activeCaptionGradientColor",
 814                                                          table.get("activeCaption")),
 815             "InternalFrame.activeTitleForeground", new DesktopProperty(
 816                                                         "win.frame.captionTextColor",
 817                                                          table.get("activeCaptionText")),
 818             "InternalFrame.inactiveTitleBackground", new DesktopProperty(
 819                                                         "win.frame.inactiveCaptionColor",
 820                                                          table.get("inactiveCaption")),
 821             "InternalFrame.inactiveTitleGradient", new DesktopProperty(
 822                                                         "win.frame.inactiveCaptionGradientColor",
 823                                                          table.get("inactiveCaption")),
 824             "InternalFrame.inactiveTitleForeground", new DesktopProperty(
 825                                                         "win.frame.inactiveCaptionTextColor",
 826                                                          table.get("inactiveCaptionText")),
 827 
 828             "InternalFrame.maximizeIcon",
 829                 WindowsIconFactory.createFrameMaximizeIcon(),
 830             "InternalFrame.minimizeIcon",
 831                 WindowsIconFactory.createFrameMinimizeIcon(),
 832             "InternalFrame.iconifyIcon",
 833                 WindowsIconFactory.createFrameIconifyIcon(),
 834             "InternalFrame.closeIcon",
 835                 WindowsIconFactory.createFrameCloseIcon(),
 836             "InternalFrame.icon",
 837                (LazyValue) t -> new Object[]{
 838                     // The constructor takes one arg: an array of UIDefaults.LazyValue
 839                     // representing the icons
 840                         SwingUtilities2.makeIcon(getClass(), BasicLookAndFeel.class, "icons/JavaCup16.png"),
 841                         SwingUtilities2.makeIcon(getClass(), WindowsLookAndFeel.class, "icons/JavaCup32.png")
 842                 },
 843             // Internal Frame Auditory Cue Mappings
 844             "InternalFrame.closeSound", "win.sound.close",
 845             "InternalFrame.maximizeSound", "win.sound.maximize",
 846             "InternalFrame.minimizeSound", "win.sound.minimize",
 847             "InternalFrame.restoreDownSound", "win.sound.restoreDown",
 848             "InternalFrame.restoreUpSound", "win.sound.restoreUp",
 849 
 850             "InternalFrame.windowBindings", new Object[] {
 851                 "shift ESCAPE", "showSystemMenu",
 852                   "ctrl SPACE", "showSystemMenu",
 853                       "ESCAPE", "hideSystemMenu"},
 854 
 855             // Label
 856             "Label.font", ControlFont,
 857             "Label.background", ControlBackgroundColor,
 858             "Label.foreground", WindowTextColor,
 859             "Label.disabledForeground", InactiveTextColor,
 860             "Label.disabledShadow", ControlHighlightColor,
 861 
 862             // List.
 863             "List.font", ControlFont,
 864             "List.background", WindowBackgroundColor,
 865             "List.foreground", WindowTextColor,
 866             "List.selectionBackground", SelectionBackgroundColor,
 867             "List.selectionForeground", SelectionTextColor,
 868             "List.lockToPositionOnScroll", Boolean.TRUE,
 869             "List.focusInputMap",
 870                new UIDefaults.LazyInputMap(new Object[] {
 871                            "ctrl C", "copy",
 872                            "ctrl V", "paste",
 873                            "ctrl X", "cut",
 874                              "COPY", "copy",
 875                             "PASTE", "paste",
 876                               "CUT", "cut",
 877                    "control INSERT", "copy",
 878                      "shift INSERT", "paste",
 879                      "shift DELETE", "cut",
 880                                "UP", "selectPreviousRow",
 881                             "KP_UP", "selectPreviousRow",
 882                          "shift UP", "selectPreviousRowExtendSelection",
 883                       "shift KP_UP", "selectPreviousRowExtendSelection",
 884                     "ctrl shift UP", "selectPreviousRowExtendSelection",
 885                  "ctrl shift KP_UP", "selectPreviousRowExtendSelection",
 886                           "ctrl UP", "selectPreviousRowChangeLead",
 887                        "ctrl KP_UP", "selectPreviousRowChangeLead",
 888                              "DOWN", "selectNextRow",
 889                           "KP_DOWN", "selectNextRow",
 890                        "shift DOWN", "selectNextRowExtendSelection",
 891                     "shift KP_DOWN", "selectNextRowExtendSelection",
 892                   "ctrl shift DOWN", "selectNextRowExtendSelection",
 893                "ctrl shift KP_DOWN", "selectNextRowExtendSelection",
 894                         "ctrl DOWN", "selectNextRowChangeLead",
 895                      "ctrl KP_DOWN", "selectNextRowChangeLead",
 896                              "LEFT", "selectPreviousColumn",
 897                           "KP_LEFT", "selectPreviousColumn",
 898                        "shift LEFT", "selectPreviousColumnExtendSelection",
 899                     "shift KP_LEFT", "selectPreviousColumnExtendSelection",
 900                   "ctrl shift LEFT", "selectPreviousColumnExtendSelection",
 901                "ctrl shift KP_LEFT", "selectPreviousColumnExtendSelection",
 902                         "ctrl LEFT", "selectPreviousColumnChangeLead",
 903                      "ctrl KP_LEFT", "selectPreviousColumnChangeLead",
 904                             "RIGHT", "selectNextColumn",
 905                          "KP_RIGHT", "selectNextColumn",
 906                       "shift RIGHT", "selectNextColumnExtendSelection",
 907                    "shift KP_RIGHT", "selectNextColumnExtendSelection",
 908                  "ctrl shift RIGHT", "selectNextColumnExtendSelection",
 909               "ctrl shift KP_RIGHT", "selectNextColumnExtendSelection",
 910                        "ctrl RIGHT", "selectNextColumnChangeLead",
 911                     "ctrl KP_RIGHT", "selectNextColumnChangeLead",
 912                              "HOME", "selectFirstRow",
 913                        "shift HOME", "selectFirstRowExtendSelection",
 914                   "ctrl shift HOME", "selectFirstRowExtendSelection",
 915                         "ctrl HOME", "selectFirstRowChangeLead",
 916                               "END", "selectLastRow",
 917                         "shift END", "selectLastRowExtendSelection",
 918                    "ctrl shift END", "selectLastRowExtendSelection",
 919                          "ctrl END", "selectLastRowChangeLead",
 920                           "PAGE_UP", "scrollUp",
 921                     "shift PAGE_UP", "scrollUpExtendSelection",
 922                "ctrl shift PAGE_UP", "scrollUpExtendSelection",
 923                      "ctrl PAGE_UP", "scrollUpChangeLead",
 924                         "PAGE_DOWN", "scrollDown",
 925                   "shift PAGE_DOWN", "scrollDownExtendSelection",
 926              "ctrl shift PAGE_DOWN", "scrollDownExtendSelection",
 927                    "ctrl PAGE_DOWN", "scrollDownChangeLead",
 928                            "ctrl A", "selectAll",
 929                        "ctrl SLASH", "selectAll",
 930                   "ctrl BACK_SLASH", "clearSelection",
 931                             "SPACE", "addToSelection",
 932                        "ctrl SPACE", "toggleAndAnchor",
 933                       "shift SPACE", "extendTo",
 934                  "ctrl shift SPACE", "moveSelectionTo"
 935                  }),
 936 
 937             // PopupMenu
 938             "PopupMenu.font", MenuFont,
 939             "PopupMenu.background", MenuBackgroundColor,
 940             "PopupMenu.foreground", MenuTextColor,
 941             "PopupMenu.popupSound", "win.sound.menuPopup",
 942             "PopupMenu.consumeEventOnClose", Boolean.TRUE,
 943 
 944             // Menus
 945             "Menu.font", MenuFont,
 946             "Menu.foreground", MenuTextColor,
 947             "Menu.background", MenuBackgroundColor,
 948             "Menu.useMenuBarBackgroundForTopLevel", Boolean.TRUE,
 949             "Menu.selectionForeground", SelectionTextColor,
 950             "Menu.selectionBackground", SelectionBackgroundColor,
 951             "Menu.acceleratorForeground", MenuTextColor,
 952             "Menu.acceleratorSelectionForeground", SelectionTextColor,
 953             "Menu.menuPopupOffsetX", Integer.valueOf(0),
 954             "Menu.menuPopupOffsetY", Integer.valueOf(0),
 955             "Menu.submenuPopupOffsetX", Integer.valueOf(-4),
 956             "Menu.submenuPopupOffsetY", Integer.valueOf(-3),
 957             "Menu.crossMenuMnemonic", Boolean.FALSE,
 958             "Menu.preserveTopLevelSelection", Boolean.TRUE,
 959 
 960             // MenuBar.
 961             "MenuBar.font", MenuFont,
 962             "MenuBar.background", new XPValue(MenuBarBackgroundColor,
 963                                               MenuBackgroundColor),
 964             "MenuBar.foreground", MenuTextColor,
 965             "MenuBar.shadow", ControlShadowColor,
 966             "MenuBar.highlight", ControlHighlightColor,
 967             "MenuBar.height", menuBarHeight,
 968             "MenuBar.rolloverEnabled", hotTrackingOn,
 969             "MenuBar.windowBindings", new Object[] {
 970                 "F10", "takeFocus" },
 971 
 972             "MenuItem.font", MenuFont,
 973             "MenuItem.acceleratorFont", MenuFont,
 974             "MenuItem.foreground", MenuTextColor,
 975             "MenuItem.background", MenuBackgroundColor,
 976             "MenuItem.selectionForeground", SelectionTextColor,
 977             "MenuItem.selectionBackground", SelectionBackgroundColor,
 978             "MenuItem.disabledForeground", InactiveTextColor,
 979             "MenuItem.acceleratorForeground", MenuTextColor,
 980             "MenuItem.acceleratorSelectionForeground", SelectionTextColor,
 981             "MenuItem.acceleratorDelimiter", menuItemAcceleratorDelimiter,
 982                  // Menu Item Auditory Cue Mapping
 983             "MenuItem.commandSound", "win.sound.menuCommand",
 984              // indicates that keyboard navigation won't skip disabled menu items
 985             "MenuItem.disabledAreNavigable", Boolean.TRUE,
 986 
 987             "RadioButton.font", ControlFont,
 988             "RadioButton.interiorBackground", WindowBackgroundColor,
 989             "RadioButton.background", ControlBackgroundColor,
 990             "RadioButton.foreground", WindowTextColor,
 991             "RadioButton.shadow", ControlShadowColor,
 992             "RadioButton.darkShadow", ControlDarkShadowColor,
 993             "RadioButton.light", ControlLightColor,
 994             "RadioButton.highlight", ControlHighlightColor,
 995             "RadioButton.focus", buttonFocusColor,
 996             "RadioButton.focusInputMap",
 997                new UIDefaults.LazyInputMap(new Object[] {
 998                           "SPACE", "pressed",
 999                  "released SPACE", "released"
1000               }),
1001             // margin is 2 all the way around, BasicBorders.RadioButtonBorder
1002             // is 2 all the way around too.
1003             "RadioButton.totalInsets", new Insets(4, 4, 4, 4),
1004 
1005 
1006             "RadioButtonMenuItem.font", MenuFont,
1007             "RadioButtonMenuItem.foreground", MenuTextColor,
1008             "RadioButtonMenuItem.background", MenuBackgroundColor,
1009             "RadioButtonMenuItem.selectionForeground", SelectionTextColor,
1010             "RadioButtonMenuItem.selectionBackground", SelectionBackgroundColor,
1011             "RadioButtonMenuItem.disabledForeground", InactiveTextColor,
1012             "RadioButtonMenuItem.acceleratorForeground", MenuTextColor,
1013             "RadioButtonMenuItem.acceleratorSelectionForeground", SelectionTextColor,
1014             "RadioButtonMenuItem.commandSound", "win.sound.menuCommand",
1015 
1016             // OptionPane.
1017             "OptionPane.font", MessageFont,
1018             "OptionPane.messageFont", MessageFont,
1019             "OptionPane.buttonFont", MessageFont,
1020             "OptionPane.background", ControlBackgroundColor,
1021             "OptionPane.foreground", WindowTextColor,
1022             "OptionPane.buttonMinimumWidth", new XPDLUValue(50, 50, SwingConstants.EAST),
1023             "OptionPane.messageForeground", ControlTextColor,
1024             "OptionPane.errorIcon",       new LazyWindowsIcon("optionPaneIcon Error",
1025                                                               "icons/Error.gif"),
1026             "OptionPane.informationIcon", new LazyWindowsIcon("optionPaneIcon Information",
1027                                                               "icons/Inform.gif"),
1028             "OptionPane.questionIcon",    new LazyWindowsIcon("optionPaneIcon Question",
1029                                                               "icons/Question.gif"),
1030             "OptionPane.warningIcon",     new LazyWindowsIcon("optionPaneIcon Warning",
1031                                                               "icons/Warn.gif"),
1032             "OptionPane.windowBindings", new Object[] {
1033                 "ESCAPE", "close" },
1034                  // Option Pane Auditory Cue Mappings
1035             "OptionPane.errorSound", "win.sound.hand", // Error
1036             "OptionPane.informationSound", "win.sound.asterisk", // Info Plain
1037             "OptionPane.questionSound", "win.sound.question", // Question
1038             "OptionPane.warningSound", "win.sound.exclamation", // Warning
1039 
1040             "FormattedTextField.focusInputMap",
1041               new UIDefaults.LazyInputMap(new Object[] {
1042                            "ctrl C", DefaultEditorKit.copyAction,
1043                            "ctrl V", DefaultEditorKit.pasteAction,
1044                            "ctrl X", DefaultEditorKit.cutAction,
1045                              "COPY", DefaultEditorKit.copyAction,
1046                             "PASTE", DefaultEditorKit.pasteAction,
1047                               "CUT", DefaultEditorKit.cutAction,
1048                    "control INSERT", DefaultEditorKit.copyAction,
1049                      "shift INSERT", DefaultEditorKit.pasteAction,
1050                      "shift DELETE", DefaultEditorKit.cutAction,
1051                        "shift LEFT", DefaultEditorKit.selectionBackwardAction,
1052                     "shift KP_LEFT", DefaultEditorKit.selectionBackwardAction,
1053                       "shift RIGHT", DefaultEditorKit.selectionForwardAction,
1054                    "shift KP_RIGHT", DefaultEditorKit.selectionForwardAction,
1055                         "ctrl LEFT", DefaultEditorKit.previousWordAction,
1056                      "ctrl KP_LEFT", DefaultEditorKit.previousWordAction,
1057                        "ctrl RIGHT", DefaultEditorKit.nextWordAction,
1058                     "ctrl KP_RIGHT", DefaultEditorKit.nextWordAction,
1059                   "ctrl shift LEFT", DefaultEditorKit.selectionPreviousWordAction,
1060                "ctrl shift KP_LEFT", DefaultEditorKit.selectionPreviousWordAction,
1061                  "ctrl shift RIGHT", DefaultEditorKit.selectionNextWordAction,
1062               "ctrl shift KP_RIGHT", DefaultEditorKit.selectionNextWordAction,
1063                            "ctrl A", DefaultEditorKit.selectAllAction,
1064                              "HOME", DefaultEditorKit.beginLineAction,
1065                               "END", DefaultEditorKit.endLineAction,
1066                        "shift HOME", DefaultEditorKit.selectionBeginLineAction,
1067                         "shift END", DefaultEditorKit.selectionEndLineAction,
1068                        "BACK_SPACE", DefaultEditorKit.deletePrevCharAction,
1069                  "shift BACK_SPACE", DefaultEditorKit.deletePrevCharAction,
1070                            "ctrl H", DefaultEditorKit.deletePrevCharAction,
1071                            "DELETE", DefaultEditorKit.deleteNextCharAction,
1072                       "ctrl DELETE", DefaultEditorKit.deleteNextWordAction,
1073                   "ctrl BACK_SPACE", DefaultEditorKit.deletePrevWordAction,
1074                             "RIGHT", DefaultEditorKit.forwardAction,
1075                              "LEFT", DefaultEditorKit.backwardAction,
1076                          "KP_RIGHT", DefaultEditorKit.forwardAction,
1077                           "KP_LEFT", DefaultEditorKit.backwardAction,
1078                             "ENTER", JTextField.notifyAction,
1079                   "ctrl BACK_SLASH", "unselect",
1080                    "control shift O", "toggle-componentOrientation",
1081                            "ESCAPE", "reset-field-edit",
1082                                "UP", "increment",
1083                             "KP_UP", "increment",
1084                              "DOWN", "decrement",
1085                           "KP_DOWN", "decrement",
1086               }),
1087             "FormattedTextField.inactiveBackground", ReadOnlyTextBackground,
1088             "FormattedTextField.disabledBackground", DisabledTextBackground,
1089 
1090             // *** Panel
1091             "Panel.font", ControlFont,
1092             "Panel.background", ControlBackgroundColor,
1093             "Panel.foreground", WindowTextColor,
1094 
1095             // *** PasswordField
1096             "PasswordField.font", ControlFont,
1097             "PasswordField.background", TextBackground,
1098             "PasswordField.foreground", WindowTextColor,
1099             "PasswordField.inactiveForeground", InactiveTextColor,      // for disabled
1100             "PasswordField.inactiveBackground", ReadOnlyTextBackground, // for readonly
1101             "PasswordField.disabledBackground", DisabledTextBackground, // for disabled
1102             "PasswordField.selectionBackground", SelectionBackgroundColor,
1103             "PasswordField.selectionForeground", SelectionTextColor,
1104             "PasswordField.caretForeground",WindowTextColor,
1105             "PasswordField.echoChar", new XPValue(new Character((char)0x25CF),
1106                                                   new Character('*')),
1107 
1108             // *** ProgressBar
1109             "ProgressBar.font", ControlFont,
1110             "ProgressBar.foreground",  SelectionBackgroundColor,
1111             "ProgressBar.background", ControlBackgroundColor,
1112             "ProgressBar.shadow", ControlShadowColor,
1113             "ProgressBar.highlight", ControlHighlightColor,
1114             "ProgressBar.selectionForeground", ControlBackgroundColor,
1115             "ProgressBar.selectionBackground", SelectionBackgroundColor,
1116             "ProgressBar.cellLength", Integer.valueOf(7),
1117             "ProgressBar.cellSpacing", Integer.valueOf(2),
1118             "ProgressBar.indeterminateInsets", new Insets(3, 3, 3, 3),
1119 
1120             // *** RootPane.
1121             // These bindings are only enabled when there is a default
1122             // button set on the rootpane.
1123             "RootPane.defaultButtonWindowKeyBindings", new Object[] {
1124                              "ENTER", "press",
1125                     "released ENTER", "release",
1126                         "ctrl ENTER", "press",
1127                "ctrl released ENTER", "release"
1128               },
1129 
1130             // *** ScrollBar.
1131             "ScrollBar.background", ScrollbarBackgroundColor,
1132             "ScrollBar.foreground", ControlBackgroundColor,
1133             "ScrollBar.track", white,
1134             "ScrollBar.trackForeground", ScrollbarBackgroundColor,
1135             "ScrollBar.trackHighlight", black,
1136             "ScrollBar.trackHighlightForeground", scrollBarTrackHighlight,
1137             "ScrollBar.thumb", ControlBackgroundColor,
1138             "ScrollBar.thumbHighlight", ControlHighlightColor,
1139             "ScrollBar.thumbDarkShadow", ControlDarkShadowColor,
1140             "ScrollBar.thumbShadow", ControlShadowColor,
1141             "ScrollBar.width", scrollBarWidth,
1142             "ScrollBar.ancestorInputMap",
1143                new UIDefaults.LazyInputMap(new Object[] {
1144                        "RIGHT", "positiveUnitIncrement",
1145                     "KP_RIGHT", "positiveUnitIncrement",
1146                         "DOWN", "positiveUnitIncrement",
1147                      "KP_DOWN", "positiveUnitIncrement",
1148                    "PAGE_DOWN", "positiveBlockIncrement",
1149               "ctrl PAGE_DOWN", "positiveBlockIncrement",
1150                         "LEFT", "negativeUnitIncrement",
1151                      "KP_LEFT", "negativeUnitIncrement",
1152                           "UP", "negativeUnitIncrement",
1153                        "KP_UP", "negativeUnitIncrement",
1154                      "PAGE_UP", "negativeBlockIncrement",
1155                 "ctrl PAGE_UP", "negativeBlockIncrement",
1156                         "HOME", "minScroll",
1157                          "END", "maxScroll"
1158                  }),
1159 
1160             // *** ScrollPane.
1161             "ScrollPane.font", ControlFont,
1162             "ScrollPane.background", ControlBackgroundColor,
1163             "ScrollPane.foreground", ControlTextColor,
1164             "ScrollPane.ancestorInputMap",
1165                new UIDefaults.LazyInputMap(new Object[] {
1166                            "RIGHT", "unitScrollRight",
1167                         "KP_RIGHT", "unitScrollRight",
1168                             "DOWN", "unitScrollDown",
1169                          "KP_DOWN", "unitScrollDown",
1170                             "LEFT", "unitScrollLeft",
1171                          "KP_LEFT", "unitScrollLeft",
1172                               "UP", "unitScrollUp",
1173                            "KP_UP", "unitScrollUp",
1174                          "PAGE_UP", "scrollUp",
1175                        "PAGE_DOWN", "scrollDown",
1176                     "ctrl PAGE_UP", "scrollLeft",
1177                   "ctrl PAGE_DOWN", "scrollRight",
1178                        "ctrl HOME", "scrollHome",
1179                         "ctrl END", "scrollEnd"
1180                  }),
1181 
1182             // *** Separator
1183             "Separator.background", ControlHighlightColor,
1184             "Separator.foreground", ControlShadowColor,
1185 
1186             // *** Slider.
1187             "Slider.font", ControlFont,
1188             "Slider.foreground", ControlBackgroundColor,
1189             "Slider.background", ControlBackgroundColor,
1190             "Slider.highlight", ControlHighlightColor,
1191             "Slider.shadow", ControlShadowColor,
1192             "Slider.focus", ControlDarkShadowColor,
1193             "Slider.focusInputMap",
1194                new UIDefaults.LazyInputMap(new Object[] {
1195                        "RIGHT", "positiveUnitIncrement",
1196                     "KP_RIGHT", "positiveUnitIncrement",
1197                         "DOWN", "negativeUnitIncrement",
1198                      "KP_DOWN", "negativeUnitIncrement",
1199                    "PAGE_DOWN", "negativeBlockIncrement",
1200                         "LEFT", "negativeUnitIncrement",
1201                      "KP_LEFT", "negativeUnitIncrement",
1202                           "UP", "positiveUnitIncrement",
1203                        "KP_UP", "positiveUnitIncrement",
1204                      "PAGE_UP", "positiveBlockIncrement",
1205                         "HOME", "minScroll",
1206                          "END", "maxScroll"
1207                  }),
1208 
1209             // Spinner
1210             "Spinner.font", ControlFont,
1211             "Spinner.ancestorInputMap",
1212                new UIDefaults.LazyInputMap(new Object[] {
1213                                "UP", "increment",
1214                             "KP_UP", "increment",
1215                              "DOWN", "decrement",
1216                           "KP_DOWN", "decrement",
1217                }),
1218 
1219             // *** SplitPane
1220             "SplitPane.background", ControlBackgroundColor,
1221             "SplitPane.highlight", ControlHighlightColor,
1222             "SplitPane.shadow", ControlShadowColor,
1223             "SplitPane.darkShadow", ControlDarkShadowColor,
1224             "SplitPane.dividerSize", Integer.valueOf(5),
1225             "SplitPane.ancestorInputMap",
1226                new UIDefaults.LazyInputMap(new Object[] {
1227                         "UP", "negativeIncrement",
1228                       "DOWN", "positiveIncrement",
1229                       "LEFT", "negativeIncrement",
1230                      "RIGHT", "positiveIncrement",
1231                      "KP_UP", "negativeIncrement",
1232                    "KP_DOWN", "positiveIncrement",
1233                    "KP_LEFT", "negativeIncrement",
1234                   "KP_RIGHT", "positiveIncrement",
1235                       "HOME", "selectMin",
1236                        "END", "selectMax",
1237                         "F8", "startResize",
1238                         "F6", "toggleFocus",
1239                   "ctrl TAB", "focusOutForward",
1240             "ctrl shift TAB", "focusOutBackward"
1241                }),
1242 
1243             // *** TabbedPane
1244             "TabbedPane.tabsOverlapBorder", new XPValue(Boolean.TRUE, Boolean.FALSE),
1245             "TabbedPane.tabInsets",         new XPValue(new InsetsUIResource(1, 4, 1, 4),
1246                                                         new InsetsUIResource(0, 4, 1, 4)),
1247             "TabbedPane.tabAreaInsets",     new XPValue(new InsetsUIResource(3, 2, 2, 2),
1248                                                         new InsetsUIResource(3, 2, 0, 2)),
1249             "TabbedPane.font", ControlFont,
1250             "TabbedPane.background", ControlBackgroundColor,
1251             "TabbedPane.foreground", ControlTextColor,
1252             "TabbedPane.highlight", ControlHighlightColor,
1253             "TabbedPane.light", ControlLightColor,
1254             "TabbedPane.shadow", ControlShadowColor,
1255             "TabbedPane.darkShadow", ControlDarkShadowColor,
1256             "TabbedPane.focus", ControlTextColor,
1257             "TabbedPane.focusInputMap",
1258               new UIDefaults.LazyInputMap(new Object[] {
1259                          "RIGHT", "navigateRight",
1260                       "KP_RIGHT", "navigateRight",
1261                           "LEFT", "navigateLeft",
1262                        "KP_LEFT", "navigateLeft",
1263                             "UP", "navigateUp",
1264                          "KP_UP", "navigateUp",
1265                           "DOWN", "navigateDown",
1266                        "KP_DOWN", "navigateDown",
1267                      "ctrl DOWN", "requestFocusForVisibleComponent",
1268                   "ctrl KP_DOWN", "requestFocusForVisibleComponent",
1269                 }),
1270             "TabbedPane.ancestorInputMap",
1271                new UIDefaults.LazyInputMap(new Object[] {
1272                          "ctrl TAB", "navigateNext",
1273                    "ctrl shift TAB", "navigatePrevious",
1274                    "ctrl PAGE_DOWN", "navigatePageDown",
1275                      "ctrl PAGE_UP", "navigatePageUp",
1276                           "ctrl UP", "requestFocus",
1277                        "ctrl KP_UP", "requestFocus",
1278                  }),
1279 
1280             // *** Table
1281             "Table.font", ControlFont,
1282             "Table.foreground", ControlTextColor,  // cell text color
1283             "Table.background", WindowBackgroundColor,  // cell background color
1284             "Table.highlight", ControlHighlightColor,
1285             "Table.light", ControlLightColor,
1286             "Table.shadow", ControlShadowColor,
1287             "Table.darkShadow", ControlDarkShadowColor,
1288             "Table.selectionForeground", SelectionTextColor,
1289             "Table.selectionBackground", SelectionBackgroundColor,
1290             "Table.gridColor", gray,  // grid line color
1291             "Table.focusCellBackground", WindowBackgroundColor,
1292             "Table.focusCellForeground", ControlTextColor,
1293             "Table.ancestorInputMap",
1294                new UIDefaults.LazyInputMap(new Object[] {
1295                                "ctrl C", "copy",
1296                                "ctrl V", "paste",
1297                                "ctrl X", "cut",
1298                                  "COPY", "copy",
1299                                 "PASTE", "paste",
1300                                   "CUT", "cut",
1301                        "control INSERT", "copy",
1302                          "shift INSERT", "paste",
1303                          "shift DELETE", "cut",
1304                                 "RIGHT", "selectNextColumn",
1305                              "KP_RIGHT", "selectNextColumn",
1306                           "shift RIGHT", "selectNextColumnExtendSelection",
1307                        "shift KP_RIGHT", "selectNextColumnExtendSelection",
1308                      "ctrl shift RIGHT", "selectNextColumnExtendSelection",
1309                   "ctrl shift KP_RIGHT", "selectNextColumnExtendSelection",
1310                            "ctrl RIGHT", "selectNextColumnChangeLead",
1311                         "ctrl KP_RIGHT", "selectNextColumnChangeLead",
1312                                  "LEFT", "selectPreviousColumn",
1313                               "KP_LEFT", "selectPreviousColumn",
1314                            "shift LEFT", "selectPreviousColumnExtendSelection",
1315                         "shift KP_LEFT", "selectPreviousColumnExtendSelection",
1316                       "ctrl shift LEFT", "selectPreviousColumnExtendSelection",
1317                    "ctrl shift KP_LEFT", "selectPreviousColumnExtendSelection",
1318                             "ctrl LEFT", "selectPreviousColumnChangeLead",
1319                          "ctrl KP_LEFT", "selectPreviousColumnChangeLead",
1320                                  "DOWN", "selectNextRow",
1321                               "KP_DOWN", "selectNextRow",
1322                            "shift DOWN", "selectNextRowExtendSelection",
1323                         "shift KP_DOWN", "selectNextRowExtendSelection",
1324                       "ctrl shift DOWN", "selectNextRowExtendSelection",
1325                    "ctrl shift KP_DOWN", "selectNextRowExtendSelection",
1326                             "ctrl DOWN", "selectNextRowChangeLead",
1327                          "ctrl KP_DOWN", "selectNextRowChangeLead",
1328                                    "UP", "selectPreviousRow",
1329                                 "KP_UP", "selectPreviousRow",
1330                              "shift UP", "selectPreviousRowExtendSelection",
1331                           "shift KP_UP", "selectPreviousRowExtendSelection",
1332                         "ctrl shift UP", "selectPreviousRowExtendSelection",
1333                      "ctrl shift KP_UP", "selectPreviousRowExtendSelection",
1334                               "ctrl UP", "selectPreviousRowChangeLead",
1335                            "ctrl KP_UP", "selectPreviousRowChangeLead",
1336                                  "HOME", "selectFirstColumn",
1337                            "shift HOME", "selectFirstColumnExtendSelection",
1338                       "ctrl shift HOME", "selectFirstRowExtendSelection",
1339                             "ctrl HOME", "selectFirstRow",
1340                                   "END", "selectLastColumn",
1341                             "shift END", "selectLastColumnExtendSelection",
1342                        "ctrl shift END", "selectLastRowExtendSelection",
1343                              "ctrl END", "selectLastRow",
1344                               "PAGE_UP", "scrollUpChangeSelection",
1345                         "shift PAGE_UP", "scrollUpExtendSelection",
1346                    "ctrl shift PAGE_UP", "scrollLeftExtendSelection",
1347                          "ctrl PAGE_UP", "scrollLeftChangeSelection",
1348                             "PAGE_DOWN", "scrollDownChangeSelection",
1349                       "shift PAGE_DOWN", "scrollDownExtendSelection",
1350                  "ctrl shift PAGE_DOWN", "scrollRightExtendSelection",
1351                        "ctrl PAGE_DOWN", "scrollRightChangeSelection",
1352                                   "TAB", "selectNextColumnCell",
1353                             "shift TAB", "selectPreviousColumnCell",
1354                                 "ENTER", "selectNextRowCell",
1355                           "shift ENTER", "selectPreviousRowCell",
1356                                "ctrl A", "selectAll",
1357                            "ctrl SLASH", "selectAll",
1358                       "ctrl BACK_SLASH", "clearSelection",
1359                                "ESCAPE", "cancel",
1360                                    "F2", "startEditing",
1361                                 "SPACE", "addToSelection",
1362                            "ctrl SPACE", "toggleAndAnchor",
1363                           "shift SPACE", "extendTo",
1364                      "ctrl shift SPACE", "moveSelectionTo",
1365                                    "F8", "focusHeader"
1366                  }),
1367             "Table.sortIconHighlight", ControlShadowColor,
1368             "Table.sortIconLight", white,
1369 
1370             "TableHeader.font", ControlFont,
1371             "TableHeader.foreground", ControlTextColor, // header text color
1372             "TableHeader.background", ControlBackgroundColor, // header background
1373             "TableHeader.focusCellBackground",
1374                 new XPValue(XPValue.NULL_VALUE,     // use default bg from XP styles
1375                             WindowBackgroundColor), // or white bg otherwise
1376 
1377             // *** TextArea
1378             "TextArea.font", FixedControlFont,
1379             "TextArea.background", WindowBackgroundColor,
1380             "TextArea.foreground", WindowTextColor,
1381             "TextArea.inactiveForeground", InactiveTextColor,
1382             "TextArea.inactiveBackground", WindowBackgroundColor,
1383             "TextArea.disabledBackground", DisabledTextBackground,
1384             "TextArea.selectionBackground", SelectionBackgroundColor,
1385             "TextArea.selectionForeground", SelectionTextColor,
1386             "TextArea.caretForeground", WindowTextColor,
1387 
1388             // *** TextField
1389             "TextField.font", ControlFont,
1390             "TextField.background", TextBackground,
1391             "TextField.foreground", WindowTextColor,
1392             "TextField.shadow", ControlShadowColor,
1393             "TextField.darkShadow", ControlDarkShadowColor,
1394             "TextField.light", ControlLightColor,
1395             "TextField.highlight", ControlHighlightColor,
1396             "TextField.inactiveForeground", InactiveTextColor,      // for disabled
1397             "TextField.inactiveBackground", ReadOnlyTextBackground, // for readonly
1398             "TextField.disabledBackground", DisabledTextBackground, // for disabled
1399             "TextField.selectionBackground", SelectionBackgroundColor,
1400             "TextField.selectionForeground", SelectionTextColor,
1401             "TextField.caretForeground", WindowTextColor,
1402 
1403             // *** TextPane
1404             "TextPane.font", ControlFont,
1405             "TextPane.background", WindowBackgroundColor,
1406             "TextPane.foreground", WindowTextColor,
1407             "TextPane.selectionBackground", SelectionBackgroundColor,
1408             "TextPane.selectionForeground", SelectionTextColor,
1409             "TextPane.inactiveBackground", WindowBackgroundColor,
1410             "TextPane.disabledBackground", DisabledTextBackground,
1411             "TextPane.caretForeground", WindowTextColor,
1412 
1413             // *** TitledBorder
1414             "TitledBorder.font", ControlFont,
1415             "TitledBorder.titleColor",
1416                         new XPColorValue(Part.BP_GROUPBOX, null, Prop.TEXTCOLOR,
1417                                          WindowTextColor),
1418 
1419             // *** ToggleButton
1420             "ToggleButton.font", ControlFont,
1421             "ToggleButton.background", ControlBackgroundColor,
1422             "ToggleButton.foreground", ControlTextColor,
1423             "ToggleButton.shadow", ControlShadowColor,
1424             "ToggleButton.darkShadow", ControlDarkShadowColor,
1425             "ToggleButton.light", ControlLightColor,
1426             "ToggleButton.highlight", ControlHighlightColor,
1427             "ToggleButton.focus", ControlTextColor,
1428             "ToggleButton.textShiftOffset", Integer.valueOf(1),
1429             "ToggleButton.focusInputMap",
1430               new UIDefaults.LazyInputMap(new Object[] {
1431                             "SPACE", "pressed",
1432                    "released SPACE", "released"
1433                 }),
1434 
1435             // *** ToolBar
1436             "ToolBar.font", MenuFont,
1437             "ToolBar.background", ControlBackgroundColor,
1438             "ToolBar.foreground", ControlTextColor,
1439             "ToolBar.shadow", ControlShadowColor,
1440             "ToolBar.darkShadow", ControlDarkShadowColor,
1441             "ToolBar.light", ControlLightColor,
1442             "ToolBar.highlight", ControlHighlightColor,
1443             "ToolBar.dockingBackground", ControlBackgroundColor,
1444             "ToolBar.dockingForeground", red,
1445             "ToolBar.floatingBackground", ControlBackgroundColor,
1446             "ToolBar.floatingForeground", darkGray,
1447             "ToolBar.ancestorInputMap",
1448                new UIDefaults.LazyInputMap(new Object[] {
1449                         "UP", "navigateUp",
1450                      "KP_UP", "navigateUp",
1451                       "DOWN", "navigateDown",
1452                    "KP_DOWN", "navigateDown",
1453                       "LEFT", "navigateLeft",
1454                    "KP_LEFT", "navigateLeft",
1455                      "RIGHT", "navigateRight",
1456                   "KP_RIGHT", "navigateRight"
1457                  }),
1458             "ToolBar.separatorSize", null,
1459 
1460             // *** ToolTip
1461             "ToolTip.font", ToolTipFont,
1462             "ToolTip.background", new DesktopProperty("win.tooltip.backgroundColor", table.get("info")),
1463             "ToolTip.foreground", new DesktopProperty("win.tooltip.textColor", table.get("infoText")),
1464 
1465         // *** ToolTipManager
1466             "ToolTipManager.enableToolTipMode", "activeApplication",
1467 
1468         // *** Tree
1469             "Tree.selectionBorderColor", black,
1470             "Tree.drawDashedFocusIndicator", Boolean.TRUE,
1471             "Tree.lineTypeDashed", Boolean.TRUE,
1472             "Tree.font", ControlFont,
1473             "Tree.background", WindowBackgroundColor,
1474             "Tree.foreground", WindowTextColor,
1475             "Tree.hash", gray,
1476             "Tree.leftChildIndent", Integer.valueOf(8),
1477             "Tree.rightChildIndent", Integer.valueOf(11),
1478             "Tree.textForeground", WindowTextColor,
1479             "Tree.textBackground", WindowBackgroundColor,
1480             "Tree.selectionForeground", SelectionTextColor,
1481             "Tree.selectionBackground", SelectionBackgroundColor,
1482             "Tree.expandedIcon", treeExpandedIcon,
1483             "Tree.collapsedIcon", treeCollapsedIcon,
1484             "Tree.openIcon",   new ActiveWindowsIcon("win.icon.shellIconBPP",
1485                                    "shell32Icon 5", "icons/TreeOpen.gif"),
1486             "Tree.closedIcon", new ActiveWindowsIcon("win.icon.shellIconBPP",
1487                                    "shell32Icon 4", "icons/TreeClosed.gif"),
1488             "Tree.focusInputMap",
1489                new UIDefaults.LazyInputMap(new Object[] {
1490                                     "ADD", "expand",
1491                                "SUBTRACT", "collapse",
1492                                  "ctrl C", "copy",
1493                                  "ctrl V", "paste",
1494                                  "ctrl X", "cut",
1495                                    "COPY", "copy",
1496                                   "PASTE", "paste",
1497                                     "CUT", "cut",
1498                          "control INSERT", "copy",
1499                            "shift INSERT", "paste",
1500                            "shift DELETE", "cut",
1501                                      "UP", "selectPrevious",
1502                                   "KP_UP", "selectPrevious",
1503                                "shift UP", "selectPreviousExtendSelection",
1504                             "shift KP_UP", "selectPreviousExtendSelection",
1505                           "ctrl shift UP", "selectPreviousExtendSelection",
1506                        "ctrl shift KP_UP", "selectPreviousExtendSelection",
1507                                 "ctrl UP", "selectPreviousChangeLead",
1508                              "ctrl KP_UP", "selectPreviousChangeLead",
1509                                    "DOWN", "selectNext",
1510                                 "KP_DOWN", "selectNext",
1511                              "shift DOWN", "selectNextExtendSelection",
1512                           "shift KP_DOWN", "selectNextExtendSelection",
1513                         "ctrl shift DOWN", "selectNextExtendSelection",
1514                      "ctrl shift KP_DOWN", "selectNextExtendSelection",
1515                               "ctrl DOWN", "selectNextChangeLead",
1516                            "ctrl KP_DOWN", "selectNextChangeLead",
1517                                   "RIGHT", "selectChild",
1518                                "KP_RIGHT", "selectChild",
1519                                    "LEFT", "selectParent",
1520                                 "KP_LEFT", "selectParent",
1521                                 "PAGE_UP", "scrollUpChangeSelection",
1522                           "shift PAGE_UP", "scrollUpExtendSelection",
1523                      "ctrl shift PAGE_UP", "scrollUpExtendSelection",
1524                            "ctrl PAGE_UP", "scrollUpChangeLead",
1525                               "PAGE_DOWN", "scrollDownChangeSelection",
1526                         "shift PAGE_DOWN", "scrollDownExtendSelection",
1527                    "ctrl shift PAGE_DOWN", "scrollDownExtendSelection",
1528                          "ctrl PAGE_DOWN", "scrollDownChangeLead",
1529                                    "HOME", "selectFirst",
1530                              "shift HOME", "selectFirstExtendSelection",
1531                         "ctrl shift HOME", "selectFirstExtendSelection",
1532                               "ctrl HOME", "selectFirstChangeLead",
1533                                     "END", "selectLast",
1534                               "shift END", "selectLastExtendSelection",
1535                          "ctrl shift END", "selectLastExtendSelection",
1536                                "ctrl END", "selectLastChangeLead",
1537                                      "F2", "startEditing",
1538                                  "ctrl A", "selectAll",
1539                              "ctrl SLASH", "selectAll",
1540                         "ctrl BACK_SLASH", "clearSelection",
1541                               "ctrl LEFT", "scrollLeft",
1542                            "ctrl KP_LEFT", "scrollLeft",
1543                              "ctrl RIGHT", "scrollRight",
1544                           "ctrl KP_RIGHT", "scrollRight",
1545                                   "SPACE", "addToSelection",
1546                              "ctrl SPACE", "toggleAndAnchor",
1547                             "shift SPACE", "extendTo",
1548                        "ctrl shift SPACE", "moveSelectionTo"
1549                  }),
1550             "Tree.ancestorInputMap",
1551                new UIDefaults.LazyInputMap(new Object[] {
1552                      "ESCAPE", "cancel"
1553                  }),
1554 
1555             // *** Viewport
1556             "Viewport.font", ControlFont,
1557             "Viewport.background", ControlBackgroundColor,
1558             "Viewport.foreground", WindowTextColor,
1559 
1560 
1561         };
1562 
1563         table.putDefaults(defaults);
1564         table.putDefaults(getLazyValueDefaults());
1565         initVistaComponentDefaults(table);
1566     }
1567 
1568     static boolean isOnVista() {
1569         return OSInfo.getOSType() == OSInfo.OSType.WINDOWS
1570                 && OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_VISTA) >= 0;
1571     }
1572 
1573     private void initVistaComponentDefaults(UIDefaults table) {
1574         if (! isOnVista()) {
1575             return;
1576         }
1577         /* START handling menus for Vista */
1578         String[] menuClasses = { "MenuItem", "Menu",
1579                 "CheckBoxMenuItem", "RadioButtonMenuItem",
1580         };
1581 
1582         Object menuDefaults[] = new Object[menuClasses.length * 2];
1583 
1584         /* all the menus need to be non opaque. */
1585         for (int i = 0, j = 0; i < menuClasses.length; i++) {
1586             String key = menuClasses[i] + ".opaque";
1587             Object oldValue = table.get(key);
1588             menuDefaults[j++] = key;
1589             menuDefaults[j++] =
1590                 new XPValue(Boolean.FALSE, oldValue);
1591         }
1592         table.putDefaults(menuDefaults);
1593 
1594         /*
1595          * acceleratorSelectionForeground color is the same as
1596          * acceleratorForeground
1597          */
1598         for (int i = 0, j = 0; i < menuClasses.length; i++) {
1599             String key = menuClasses[i] + ".acceleratorSelectionForeground";
1600             Object oldValue = table.get(key);
1601             menuDefaults[j++] = key;
1602             menuDefaults[j++] =
1603                 new XPValue(
1604                     table.getColor(
1605                         menuClasses[i] + ".acceleratorForeground"),
1606                         oldValue);
1607         }
1608         table.putDefaults(menuDefaults);
1609 
1610         /* they have the same MenuItemCheckIconFactory */
1611         VistaMenuItemCheckIconFactory menuItemCheckIconFactory =
1612             WindowsIconFactory.getMenuItemCheckIconFactory();
1613         for (int i = 0, j = 0; i < menuClasses.length; i++) {
1614             String key = menuClasses[i] + ".checkIconFactory";
1615             Object oldValue = table.get(key);
1616             menuDefaults[j++] = key;
1617             menuDefaults[j++] =
1618                 new XPValue(menuItemCheckIconFactory, oldValue);
1619         }
1620         table.putDefaults(menuDefaults);
1621 
1622         for (int i = 0, j = 0; i < menuClasses.length; i++) {
1623             String key = menuClasses[i] + ".checkIcon";
1624             Object oldValue = table.get(key);
1625             menuDefaults[j++] = key;
1626             menuDefaults[j++] =
1627                 new XPValue(menuItemCheckIconFactory.getIcon(menuClasses[i]),
1628                     oldValue);
1629         }
1630         table.putDefaults(menuDefaults);
1631 
1632 
1633         /* height can be even */
1634         for (int i = 0, j = 0; i < menuClasses.length; i++) {
1635             String key = menuClasses[i] + ".evenHeight";
1636             Object oldValue = table.get(key);
1637             menuDefaults[j++] = key;
1638             menuDefaults[j++] = new XPValue(Boolean.TRUE, oldValue);
1639         }
1640         table.putDefaults(menuDefaults);
1641 
1642         /* no margins */
1643         InsetsUIResource insets = new InsetsUIResource(0, 0, 0, 0);
1644         for (int i = 0, j = 0; i < menuClasses.length; i++) {
1645             String key = menuClasses[i] + ".margin";
1646             Object oldValue = table.get(key);
1647             menuDefaults[j++] = key;
1648             menuDefaults[j++] = new XPValue(insets, oldValue);
1649         }
1650         table.putDefaults(menuDefaults);
1651 
1652         /* set checkIcon offset */
1653         Integer checkIconOffsetInteger =
1654             Integer.valueOf(0);
1655         for (int i = 0, j = 0; i < menuClasses.length; i++) {
1656             String key = menuClasses[i] + ".checkIconOffset";
1657             Object oldValue = table.get(key);
1658             menuDefaults[j++] = key;
1659             menuDefaults[j++] =
1660                 new XPValue(checkIconOffsetInteger, oldValue);
1661         }
1662         table.putDefaults(menuDefaults);
1663 
1664         /* set width of the gap after check icon */
1665         Integer afterCheckIconGap = WindowsPopupMenuUI.getSpanBeforeGutter()
1666                 + WindowsPopupMenuUI.getGutterWidth()
1667                 + WindowsPopupMenuUI.getSpanAfterGutter();
1668         for (int i = 0, j = 0; i < menuClasses.length; i++) {
1669             String key = menuClasses[i] + ".afterCheckIconGap";
1670             Object oldValue = table.get(key);
1671             menuDefaults[j++] = key;
1672             menuDefaults[j++] =
1673                 new XPValue(afterCheckIconGap, oldValue);
1674         }
1675         table.putDefaults(menuDefaults);
1676 
1677         /* text is started after this position */
1678         Object minimumTextOffset = new UIDefaults.ActiveValue() {
1679             public Object createValue(UIDefaults table) {
1680                 return VistaMenuItemCheckIconFactory.getIconWidth()
1681                 + WindowsPopupMenuUI.getSpanBeforeGutter()
1682                 + WindowsPopupMenuUI.getGutterWidth()
1683                 + WindowsPopupMenuUI.getSpanAfterGutter();
1684             }
1685         };
1686         for (int i = 0, j = 0; i < menuClasses.length; i++) {
1687             String key = menuClasses[i] + ".minimumTextOffset";
1688             Object oldValue = table.get(key);
1689             menuDefaults[j++] = key;
1690             menuDefaults[j++] = new XPValue(minimumTextOffset, oldValue);
1691         }
1692         table.putDefaults(menuDefaults);
1693 
1694         /*
1695          * JPopupMenu has a bit of free space around menu items
1696          */
1697         String POPUP_MENU_BORDER = "PopupMenu.border";
1698 
1699         Object popupMenuBorder = new XPBorderValue(Part.MENU,
1700             (LazyValue) t -> BasicBorders.getInternalFrameBorder(),
1701                   BorderFactory.createEmptyBorder(2, 2, 2, 2));
1702         table.put(POPUP_MENU_BORDER, popupMenuBorder);
1703         /* END handling menus for Vista */
1704 
1705         /* START table handling for Vista */
1706         table.put("Table.ascendingSortIcon", new XPValue(
1707             new SkinIcon(Part.HP_HEADERSORTARROW, State.SORTEDDOWN),
1708                (LazyValue) t -> new ClassicSortArrowIcon(true)));
1709         table.put("Table.descendingSortIcon", new XPValue(
1710             new SkinIcon(Part.HP_HEADERSORTARROW, State.SORTEDUP),
1711                (LazyValue) t -> new ClassicSortArrowIcon(false)));
1712         /* END table handling for Vista */
1713     }
1714 
1715     /**
1716      * If we support loading of fonts from the desktop this will return
1717      * a DesktopProperty representing the font. If the font can't be
1718      * represented in the current encoding this will return null and
1719      * turn off the use of system fonts.
1720      */
1721     private Object getDesktopFontValue(String fontName, Object backup) {
1722         if (useSystemFontSettings) {
1723             return new WindowsFontProperty(fontName, backup);
1724         }
1725         return null;
1726     }
1727 
1728     // When a desktop property change is detected, these classes must be
1729     // reinitialized in the defaults table to ensure the classes reference
1730     // the updated desktop property values (colors mostly)
1731     //
1732     private Object[] getLazyValueDefaults() {
1733 
1734         Object buttonBorder =
1735             new XPBorderValue(Part.BP_PUSHBUTTON,
1736                (LazyValue) t -> BasicBorders.getButtonBorder());
1737 
1738         Object textFieldBorder =
1739             new XPBorderValue(Part.EP_EDIT,
1740                (LazyValue) t -> BasicBorders.getTextFieldBorder());
1741 
1742         Object textFieldMargin =
1743             new XPValue(new InsetsUIResource(2, 2, 2, 2),
1744                         new InsetsUIResource(1, 1, 1, 1));
1745 
1746         Object spinnerBorder =
1747             new XPBorderValue(Part.EP_EDIT, textFieldBorder,
1748                               new EmptyBorder(2, 2, 2, 2));
1749 
1750         Object spinnerArrowInsets =
1751             new XPValue(new InsetsUIResource(1, 1, 1, 1),
1752                         null);
1753 
1754         Object comboBoxBorder = new XPBorderValue(Part.CP_COMBOBOX, textFieldBorder);
1755 
1756         // For focus rectangle for cells and trees.
1757         LazyValue focusCellHighlightBorder = t -> WindowsBorders.getFocusCellHighlightBorder();
1758 
1759         LazyValue etchedBorder = t -> BorderUIResource.getEtchedBorderUIResource();
1760 
1761         LazyValue internalFrameBorder = t -> WindowsBorders.getInternalFrameBorder();
1762 
1763         LazyValue loweredBevelBorder = t -> BorderUIResource.getLoweredBevelBorderUIResource();
1764 
1765 
1766         LazyValue marginBorder = t -> new BasicBorders.MarginBorder();
1767 
1768         LazyValue menuBarBorder = t -> BasicBorders.getMenuBarBorder();
1769 
1770 
1771         Object popupMenuBorder = new XPBorderValue(Part.MENU,
1772             (LazyValue) t -> BasicBorders.getInternalFrameBorder());
1773 
1774         // *** ProgressBar
1775         LazyValue progressBarBorder = t -> WindowsBorders.getProgressBarBorder();
1776 
1777         LazyValue radioButtonBorder = t -> BasicBorders.getRadioButtonBorder();
1778 
1779         Object scrollPaneBorder =
1780             new XPBorderValue(Part.LBP_LISTBOX, textFieldBorder);
1781 
1782         Object tableScrollPaneBorder =
1783             new XPBorderValue(Part.LBP_LISTBOX, loweredBevelBorder);
1784 
1785         LazyValue tableHeaderBorder = t -> WindowsBorders.getTableHeaderBorder();
1786 
1787         // *** ToolBar
1788         LazyValue toolBarBorder = t -> WindowsBorders.getToolBarBorder();
1789 
1790         // *** ToolTips
1791         LazyValue toolTipBorder = t -> BorderUIResource.getBlackLineBorderUIResource();
1792 
1793 
1794 
1795         LazyValue checkBoxIcon = t -> WindowsIconFactory.getCheckBoxIcon();
1796 
1797         LazyValue radioButtonIcon = t -> WindowsIconFactory.getRadioButtonIcon();
1798 
1799         LazyValue radioButtonMenuItemIcon = t -> WindowsIconFactory.getRadioButtonMenuItemIcon();
1800 
1801         LazyValue menuItemCheckIcon = t -> WindowsIconFactory.getMenuItemCheckIcon();
1802 
1803         LazyValue menuItemArrowIcon = t -> WindowsIconFactory.getMenuItemArrowIcon();
1804 
1805         LazyValue menuArrowIcon = t -> WindowsIconFactory.getMenuArrowIcon();
1806 
1807 
1808         Object[] lazyDefaults = {
1809             "Button.border", buttonBorder,
1810             "CheckBox.border", radioButtonBorder,
1811             "ComboBox.border", comboBoxBorder,
1812             "DesktopIcon.border", internalFrameBorder,
1813             "FormattedTextField.border", textFieldBorder,
1814             "FormattedTextField.margin", textFieldMargin,
1815             "InternalFrame.border", internalFrameBorder,
1816             "List.focusCellHighlightBorder", focusCellHighlightBorder,
1817             "Table.focusCellHighlightBorder", focusCellHighlightBorder,
1818             "Menu.border", marginBorder,
1819             "MenuBar.border", menuBarBorder,
1820             "MenuItem.border", marginBorder,
1821             "PasswordField.border", textFieldBorder,
1822             "PasswordField.margin", textFieldMargin,
1823             "PopupMenu.border", popupMenuBorder,
1824             "ProgressBar.border", progressBarBorder,
1825             "RadioButton.border", radioButtonBorder,
1826             "ScrollPane.border", scrollPaneBorder,
1827             "Spinner.border", spinnerBorder,
1828             "Spinner.arrowButtonInsets", spinnerArrowInsets,
1829             "Spinner.arrowButtonSize", new Dimension(17, 9),
1830             "Table.scrollPaneBorder", tableScrollPaneBorder,
1831             "TableHeader.cellBorder", tableHeaderBorder,
1832             "TextArea.margin", textFieldMargin,
1833             "TextField.border", textFieldBorder,
1834             "TextField.margin", textFieldMargin,
1835             "TitledBorder.border",
1836                         new XPBorderValue(Part.BP_GROUPBOX, etchedBorder),
1837             "ToggleButton.border", radioButtonBorder,
1838             "ToolBar.border", toolBarBorder,
1839             "ToolTip.border", toolTipBorder,
1840 
1841             "CheckBox.icon", checkBoxIcon,
1842             "Menu.arrowIcon", menuArrowIcon,
1843             "MenuItem.checkIcon", menuItemCheckIcon,
1844             "MenuItem.arrowIcon", menuItemArrowIcon,
1845             "RadioButton.icon", radioButtonIcon,
1846             "RadioButtonMenuItem.checkIcon", radioButtonMenuItemIcon,
1847             "InternalFrame.layoutTitlePaneAtOrigin",
1848                         new XPValue(Boolean.TRUE, Boolean.FALSE),
1849             "Table.ascendingSortIcon", new XPValue(
1850                (LazyValue) t -> new SortArrowIcon(true,"Table.sortIconColor"),
1851                   (LazyValue) t -> new ClassicSortArrowIcon(true)),
1852             "Table.descendingSortIcon", new XPValue(
1853                (LazyValue) t -> new SortArrowIcon(false,"Table.sortIconColor"),
1854                   (LazyValue) t -> new ClassicSortArrowIcon(false)),
1855         };
1856 
1857         return lazyDefaults;
1858     }
1859 
1860     public void uninitialize() {
1861         super.uninitialize();
1862 
1863         if (WindowsPopupMenuUI.mnemonicListener != null) {
1864             MenuSelectionManager.defaultManager().
1865                 removeChangeListener(WindowsPopupMenuUI.mnemonicListener);
1866         }
1867         KeyboardFocusManager.getCurrentKeyboardFocusManager().
1868             removeKeyEventPostProcessor(WindowsRootPaneUI.altProcessor);
1869         DesktopProperty.flushUnreferencedProperties();
1870     }
1871 
1872 
1873     // Toggle flag for drawing the mnemonic state
1874     private static boolean isMnemonicHidden = true;
1875 
1876     // Flag which indicates that the Win98/Win2k/WinME features
1877     // should be disabled.
1878     private static boolean isClassicWindows = false;
1879 
1880     /**
1881      * Sets the state of the hide mnemonic flag. This flag is used by the
1882      * component UI delegates to determine if the mnemonic should be rendered.
1883      * This method is a non operation if the underlying operating system
1884      * does not support the mnemonic hiding feature.
1885      *
1886      * @param hide true if mnemonics should be hidden
1887      * @since 1.4
1888      */
1889     public static void setMnemonicHidden(boolean hide) {
1890         if (UIManager.getBoolean("Button.showMnemonics") == true) {
1891             // Do not hide mnemonics if the UI defaults do not support this
1892             isMnemonicHidden = false;
1893         } else {
1894             isMnemonicHidden = hide;
1895         }
1896     }
1897 
1898     /**
1899      * Gets the state of the hide mnemonic flag. This only has meaning
1900      * if this feature is supported by the underlying OS.
1901      *
1902      * @return true if mnemonics are hidden, otherwise, false
1903      * @see #setMnemonicHidden
1904      * @since 1.4
1905      */
1906     public static boolean isMnemonicHidden() {
1907         if (UIManager.getBoolean("Button.showMnemonics") == true) {
1908             // Do not hide mnemonics if the UI defaults do not support this
1909             isMnemonicHidden = false;
1910         }
1911         return isMnemonicHidden;
1912     }
1913 
1914     /**
1915      * Gets the state of the flag which indicates if the old Windows
1916      * look and feel should be rendered. This flag is used by the
1917      * component UI delegates as a hint to determine which style the component
1918      * should be rendered.
1919      *
1920      * @return true if Windows 95 and Windows NT 4 look and feel should
1921      *         be rendered
1922      * @since 1.4
1923      */
1924     public static boolean isClassicWindows() {
1925         return isClassicWindows;
1926     }
1927 
1928     /**
1929      * <p>
1930      * Invoked when the user attempts an invalid operation,
1931      * such as pasting into an uneditable <code>JTextField</code>
1932      * that has focus.
1933      * </p>
1934      * <p>
1935      * If the user has enabled visual error indication on
1936      * the desktop, this method will flash the caption bar
1937      * of the active window. The user can also set the
1938      * property awt.visualbell=true to achieve the same
1939      * results.
1940      * </p>
1941      *
1942      * @param component Component the error occurred in, may be
1943      *                  null indicating the error condition is
1944      *                  not directly associated with a
1945      *                  <code>Component</code>.
1946      *
1947      * @see javax.swing.LookAndFeel#provideErrorFeedback
1948      */
1949      public void provideErrorFeedback(Component component) {
1950          super.provideErrorFeedback(component);
1951      }
1952 
1953     /**
1954      * {@inheritDoc}
1955      */
1956     public LayoutStyle getLayoutStyle() {
1957         LayoutStyle style = this.style;
1958         if (style == null) {
1959             style = new WindowsLayoutStyle();
1960             this.style = style;
1961         }
1962         return style;
1963     }
1964 
1965     // ********* Auditory Cue support methods and objects *********
1966 
1967     /**
1968      * Returns an <code>Action</code>.
1969      * <P>
1970      * This Action contains the information and logic to render an
1971      * auditory cue. The <code>Object</code> that is passed to this
1972      * method contains the information needed to render the auditory
1973      * cue. Normally, this <code>Object</code> is a <code>String</code>
1974      * that points to a <code>Toolkit</code> <code>desktopProperty</code>.
1975      * This <code>desktopProperty</code> is resolved by AWT and the
1976      * Windows OS.
1977      * <P>
1978      * This <code>Action</code>'s <code>actionPerformed</code> method
1979      * is fired by the <code>playSound</code> method.
1980      *
1981      * @return      an Action which knows how to render the auditory
1982      *              cue for one particular system or user activity
1983      * @see #playSound(Action)
1984      * @since 1.4
1985      */
1986     protected Action createAudioAction(Object key) {
1987         if (key != null) {
1988             String audioKey = (String)key;
1989             String audioValue = (String)UIManager.get(key);
1990             return new AudioAction(audioKey, audioValue);
1991         } else {
1992             return null;
1993         }
1994     }
1995 
1996     static void repaintRootPane(Component c) {
1997         JRootPane root = null;
1998         for (; c != null; c = c.getParent()) {
1999             if (c instanceof JRootPane) {
2000                 root = (JRootPane)c;
2001             }
2002         }
2003 
2004         if (root != null) {
2005             root.repaint();
2006         } else {
2007             c.repaint();
2008         }
2009     }
2010 
2011     /**
2012      * Pass the name String to the super constructor. This is used
2013      * later to identify the Action and decide whether to play it or
2014      * not. Store the resource String. It is used to get the audio
2015      * resource. In this case, the resource is a <code>Runnable</code>
2016      * supplied by <code>Toolkit</code>. This <code>Runnable</code> is
2017      * effectively a pointer down into the Win32 OS that knows how to
2018      * play the right sound.
2019      *
2020      * @since 1.4
2021      */
2022     @SuppressWarnings("serial") // Superclass is not serializable across versions
2023     private static class AudioAction extends AbstractAction {
2024         private Runnable audioRunnable;
2025         private String audioResource;
2026         /**
2027          * We use the String as the name of the Action and as a pointer to
2028          * the underlying OSes audio resource.
2029          */
2030         public AudioAction(String name, String resource) {
2031             super(name);
2032             audioResource = resource;
2033         }
2034         public void actionPerformed(ActionEvent e) {
2035             if (audioRunnable == null) {
2036                 audioRunnable = (Runnable)Toolkit.getDefaultToolkit().getDesktopProperty(audioResource);
2037             }
2038             if (audioRunnable != null) {
2039                 // Runnable appears to block until completed playing, hence
2040                 // start up another thread to handle playing.
2041                 new Thread(audioRunnable).start();
2042             }
2043         }
2044     }
2045 
2046     /**
2047      * Gets an <code>Icon</code> from the native libraries if available,
2048      * otherwise gets it from an image resource file.
2049      */
2050     private static class LazyWindowsIcon implements UIDefaults.LazyValue {
2051         private String nativeImage;
2052         private String resource;
2053 
2054         LazyWindowsIcon(String nativeImage, String resource) {
2055             this.nativeImage = nativeImage;
2056             this.resource = resource;
2057         }
2058 
2059         public Object createValue(UIDefaults table) {
2060             if (nativeImage != null) {
2061                 Image image = (Image)ShellFolder.get(nativeImage);
2062                 if (image != null) {
2063                     return new ImageIcon(image);
2064                 }
2065             }
2066             return SwingUtilities2.makeIcon(getClass(),
2067                                             WindowsLookAndFeel.class,
2068                                             resource);
2069         }
2070     }
2071 
2072 
2073     /**
2074      * Gets an <code>Icon</code> from the native libraries if available.
2075      * A desktop property is used to trigger reloading the icon when needed.
2076      */
2077     private class ActiveWindowsIcon implements UIDefaults.ActiveValue {
2078         private Icon icon;
2079         private String nativeImageName;
2080         private String fallbackName;
2081         private DesktopProperty desktopProperty;
2082 
2083         ActiveWindowsIcon(String desktopPropertyName,
2084                             String nativeImageName, String fallbackName) {
2085             this.nativeImageName = nativeImageName;
2086             this.fallbackName = fallbackName;
2087 
2088             if (OSInfo.getOSType() == OSInfo.OSType.WINDOWS &&
2089                     OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_XP) < 0) {
2090                 // This desktop property is needed to trigger reloading the icon.
2091                 // It is kept in member variable to avoid GC.
2092                 this.desktopProperty = new TriggerDesktopProperty(desktopPropertyName) {
2093                     @Override protected void updateUI() {
2094                         icon = null;
2095                         super.updateUI();
2096                     }
2097                 };
2098             }
2099         }
2100 
2101         @Override
2102         public Object createValue(UIDefaults table) {
2103             if (icon == null) {
2104                 Image image = (Image)ShellFolder.get(nativeImageName);
2105                 if (image != null) {
2106                     icon = new ImageIconUIResource(image);
2107                 }
2108             }
2109             if (icon == null && fallbackName != null) {
2110                 UIDefaults.LazyValue fallback = (UIDefaults.LazyValue)
2111                         SwingUtilities2.makeIcon(WindowsLookAndFeel.class,
2112                             BasicLookAndFeel.class, fallbackName);
2113                 icon = (Icon) fallback.createValue(table);
2114             }
2115             return icon;
2116         }
2117     }
2118 
2119     /**
2120      * Icon backed-up by XP Skin.
2121      */
2122     private static class SkinIcon implements Icon, UIResource {
2123         private final Part part;
2124         private final State state;
2125         SkinIcon(Part part, State state) {
2126             this.part = part;
2127             this.state = state;
2128         }
2129 
2130         /**
2131          * Draw the icon at the specified location.  Icon implementations
2132          * may use the Component argument to get properties useful for
2133          * painting, e.g. the foreground or background color.
2134          */
2135         public void paintIcon(Component c, Graphics g, int x, int y) {
2136             XPStyle xp = XPStyle.getXP();
2137             assert xp != null;
2138             if (xp != null) {
2139                 Skin skin = xp.getSkin(null, part);
2140                 skin.paintSkin(g, x, y, state);
2141             }
2142         }
2143 
2144         /**
2145          * Returns the icon's width.
2146          *
2147          * @return an int specifying the fixed width of the icon.
2148          */
2149         public int getIconWidth() {
2150             int width = 0;
2151             XPStyle xp = XPStyle.getXP();
2152             assert xp != null;
2153             if (xp != null) {
2154                 Skin skin = xp.getSkin(null, part);
2155                 width = skin.getWidth();
2156             }
2157             return width;
2158         }
2159 
2160         /**
2161          * Returns the icon's height.
2162          *
2163          * @return an int specifying the fixed height of the icon.
2164          */
2165         public int getIconHeight() {
2166             int height = 0;
2167             XPStyle xp = XPStyle.getXP();
2168             if (xp != null) {
2169                 Skin skin = xp.getSkin(null, part);
2170                 height = skin.getHeight();
2171             }
2172             return height;
2173         }
2174 
2175     }
2176 
2177     /**
2178      * DesktopProperty for fonts. If a font with the name 'MS Sans Serif'
2179      * is returned, it is mapped to 'Microsoft Sans Serif'.
2180      */
2181     private static class WindowsFontProperty extends DesktopProperty {
2182         WindowsFontProperty(String key, Object backup) {
2183             super(key, backup);
2184         }
2185 
2186         public void invalidate(LookAndFeel laf) {
2187             if ("win.defaultGUI.font.height".equals(getKey())) {
2188                 ((WindowsLookAndFeel)laf).style = null;
2189             }
2190             super.invalidate(laf);
2191         }
2192 
2193         protected Object configureValue(Object value) {
2194             if (value instanceof Font) {
2195                 Font font = (Font)value;
2196                 if ("MS Sans Serif".equals(font.getName())) {
2197                     int size = font.getSize();
2198                     // 4950968: Workaround to mimic the way Windows maps the default
2199                     // font size of 6 pts to the smallest available bitmap font size.
2200                     // This happens mostly on Win 98/Me & NT.
2201                     int dpi;
2202                     try {
2203                         dpi = Toolkit.getDefaultToolkit().getScreenResolution();
2204                     } catch (HeadlessException ex) {
2205                         dpi = 96;
2206                     }
2207                     if (Math.round(size * 72F / dpi) < 8) {
2208                         size = Math.round(8 * dpi / 72F);
2209                     }
2210                     Font msFont = new FontUIResource("Microsoft Sans Serif",
2211                                           font.getStyle(), size);
2212                     if (msFont.getName() != null &&
2213                         msFont.getName().equals(msFont.getFamily())) {
2214                         font = msFont;
2215                     } else if (size != font.getSize()) {
2216                         font = new FontUIResource("MS Sans Serif",
2217                                                   font.getStyle(), size);
2218                     }
2219                 }
2220 
2221                 if (FontUtilities.fontSupportsDefaultEncoding(font)) {
2222                     if (!(font instanceof UIResource)) {
2223                         font = new FontUIResource(font);
2224                     }
2225                 }
2226                 else {
2227                     font = FontUtilities.getCompositeFontUIResource(font);
2228                 }
2229                 return font;
2230 
2231             }
2232             return super.configureValue(value);
2233         }
2234     }
2235 
2236 
2237     /**
2238      * DesktopProperty for fonts that only gets sizes from the desktop,
2239      * font name and style are passed into the constructor
2240      */
2241     private static class WindowsFontSizeProperty extends DesktopProperty {
2242         private String fontName;
2243         private int fontSize;
2244         private int fontStyle;
2245 
2246         WindowsFontSizeProperty(String key, String fontName,
2247                                 int fontStyle, int fontSize) {
2248             super(key, null);
2249             this.fontName = fontName;
2250             this.fontSize = fontSize;
2251             this.fontStyle = fontStyle;
2252         }
2253 
2254         protected Object configureValue(Object value) {
2255             if (value == null) {
2256                 value = new FontUIResource(fontName, fontStyle, fontSize);
2257             }
2258             else if (value instanceof Integer) {
2259                 value = new FontUIResource(fontName, fontStyle,
2260                                            ((Integer)value).intValue());
2261             }
2262             return value;
2263         }
2264     }
2265 
2266 
2267     /**
2268      * A value wrapper that actively retrieves values from xp or falls back
2269      * to the classic value if not running XP styles.
2270      */
2271     private static class XPValue implements UIDefaults.ActiveValue {
2272         protected Object classicValue, xpValue;
2273 
2274         // A constant that lets you specify null when using XP styles.
2275         private final static Object NULL_VALUE = new Object();
2276 
2277         XPValue(Object xpValue, Object classicValue) {
2278             this.xpValue = xpValue;
2279             this.classicValue = classicValue;
2280         }
2281 
2282         public Object createValue(UIDefaults table) {
2283             Object value = null;
2284             if (XPStyle.getXP() != null) {
2285                 value = getXPValue(table);
2286             }
2287 
2288             if (value == null) {
2289                 value = getClassicValue(table);
2290             } else if (value == NULL_VALUE) {
2291                 value = null;
2292             }
2293 
2294             return value;
2295         }
2296 
2297         protected Object getXPValue(UIDefaults table) {
2298             return recursiveCreateValue(xpValue, table);
2299         }
2300 
2301         protected Object getClassicValue(UIDefaults table) {
2302             return recursiveCreateValue(classicValue, table);
2303         }
2304 
2305         private Object recursiveCreateValue(Object value, UIDefaults table) {
2306             if (value instanceof UIDefaults.LazyValue) {
2307                 value = ((UIDefaults.LazyValue)value).createValue(table);
2308             }
2309             if (value instanceof UIDefaults.ActiveValue) {
2310                 return ((UIDefaults.ActiveValue)value).createValue(table);
2311             } else {
2312                 return value;
2313             }
2314         }
2315     }
2316 
2317     private static class XPBorderValue extends XPValue {
2318         private final Border extraMargin;
2319 
2320         XPBorderValue(Part xpValue, Object classicValue) {
2321             this(xpValue, classicValue, null);
2322         }
2323 
2324         XPBorderValue(Part xpValue, Object classicValue, Border extraMargin) {
2325             super(xpValue, classicValue);
2326             this.extraMargin = extraMargin;
2327         }
2328 
2329         public Object getXPValue(UIDefaults table) {
2330             Border xpBorder = XPStyle.getXP().getBorder(null, (Part)xpValue);
2331             if (extraMargin != null) {
2332                 return new BorderUIResource.
2333                         CompoundBorderUIResource(xpBorder, extraMargin);
2334             } else {
2335                 return xpBorder;
2336             }
2337         }
2338     }
2339 
2340     private static class XPColorValue extends XPValue {
2341         XPColorValue(Part part, State state, Prop prop, Object classicValue) {
2342             super(new XPColorValueKey(part, state, prop), classicValue);
2343         }
2344 
2345         public Object getXPValue(UIDefaults table) {
2346             XPColorValueKey key = (XPColorValueKey)xpValue;
2347             return XPStyle.getXP().getColor(key.skin, key.prop, null);
2348         }
2349 
2350         private static class XPColorValueKey {
2351             Skin skin;
2352             Prop prop;
2353 
2354             XPColorValueKey(Part part, State state, Prop prop) {
2355                 this.skin = new Skin(part, state);
2356                 this.prop = prop;
2357             }
2358         }
2359     }
2360 
2361     private class XPDLUValue extends XPValue {
2362         private int direction;
2363 
2364         XPDLUValue(int xpdlu, int classicdlu, int direction) {
2365             super(Integer.valueOf(xpdlu), Integer.valueOf(classicdlu));
2366             this.direction = direction;
2367         }
2368 
2369         public Object getXPValue(UIDefaults table) {
2370             int px = dluToPixels(((Integer)xpValue).intValue(), direction);
2371             return Integer.valueOf(px);
2372         }
2373 
2374         public Object getClassicValue(UIDefaults table) {
2375             int px = dluToPixels(((Integer)classicValue).intValue(), direction);
2376             return Integer.valueOf(px);
2377         }
2378     }
2379 
2380     private class TriggerDesktopProperty extends DesktopProperty {
2381         TriggerDesktopProperty(String key) {
2382             super(key, null);
2383             // This call adds a property change listener for the property,
2384             // which triggers a call to updateUI(). The value returned
2385             // is not interesting here.
2386             getValueFromDesktop();
2387         }
2388 
2389         protected void updateUI() {
2390             super.updateUI();
2391 
2392             // Make sure property change listener is readded each time
2393             getValueFromDesktop();
2394         }
2395     }
2396 
2397     private class FontDesktopProperty extends TriggerDesktopProperty {
2398         FontDesktopProperty(String key) {
2399             super(key);
2400         }
2401 
2402         protected void updateUI() {
2403             Object aaTextInfo = SwingUtilities2.AATextInfo.getAATextInfo(true);
2404             UIDefaults defaults = UIManager.getLookAndFeelDefaults();
2405             defaults.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, aaTextInfo);
2406             super.updateUI();
2407         }
2408     }
2409 
2410     // Windows LayoutStyle.  From:
2411     // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwue/html/ch14e.asp
2412     @SuppressWarnings("fallthrough")
2413     private class WindowsLayoutStyle extends DefaultLayoutStyle {
2414         @Override
2415         public int getPreferredGap(JComponent component1,
2416                 JComponent component2, ComponentPlacement type, int position,
2417                 Container parent) {
2418             // Checks args
2419             super.getPreferredGap(component1, component2, type, position,
2420                                   parent);
2421 
2422             switch(type) {
2423             case INDENT:
2424                 // Windows doesn't spec this
2425                 if (position == SwingConstants.EAST ||
2426                         position == SwingConstants.WEST) {
2427                     int indent = getIndent(component1, position);
2428                     if (indent > 0) {
2429                         return indent;
2430                     }
2431                     return 10;
2432                 }
2433                 // Fall through to related.
2434             case RELATED:
2435                 if (isLabelAndNonlabel(component1, component2, position)) {
2436                     // Between text labels and their associated controls (for
2437                     // example, text boxes and list boxes): 3
2438                     // NOTE: We're not honoring:
2439                     // 'Text label beside a button 3 down from the top of
2440                     // the button,' but I suspect that is an attempt to
2441                     // enforce a baseline layout which will be handled
2442                     // separately.  In order to enforce this we would need
2443                     // this API to return a more complicated type (Insets,
2444                     // or something else).
2445                     return getButtonGap(component1, component2, position,
2446                                         dluToPixels(3, position));
2447                 }
2448                 // Between related controls: 4
2449                 return getButtonGap(component1, component2, position,
2450                                     dluToPixels(4, position));
2451             case UNRELATED:
2452                 // Between unrelated controls: 7
2453                 return getButtonGap(component1, component2, position,
2454                                     dluToPixels(7, position));
2455             }
2456             return 0;
2457         }
2458 
2459         @Override
2460         public int getContainerGap(JComponent component, int position,
2461                                    Container parent) {
2462             // Checks args
2463             super.getContainerGap(component, position, parent);
2464             return getButtonGap(component, position, dluToPixels(7, position));
2465         }
2466 
2467     }
2468 
2469     /**
2470      * Converts the dialog unit argument to pixels along the specified
2471      * axis.
2472      */
2473     private int dluToPixels(int dlu, int direction) {
2474         if (baseUnitX == 0) {
2475             calculateBaseUnits();
2476         }
2477         if (direction == SwingConstants.EAST ||
2478             direction == SwingConstants.WEST) {
2479             return dlu * baseUnitX / 4;
2480         }
2481         assert (direction == SwingConstants.NORTH ||
2482                 direction == SwingConstants.SOUTH);
2483         return dlu * baseUnitY / 8;
2484     }
2485 
2486     /**
2487      * Calculates the dialog unit mapping.
2488      */
2489     private void calculateBaseUnits() {
2490         // This calculation comes from:
2491         // http://support.microsoft.com/default.aspx?scid=kb;EN-US;125681
2492         FontMetrics metrics = Toolkit.getDefaultToolkit().getFontMetrics(
2493                 UIManager.getFont("Button.font"));
2494         baseUnitX = metrics.stringWidth(
2495                 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
2496         baseUnitX = (baseUnitX / 26 + 1) / 2;
2497         // The -1 comes from experimentation.
2498         baseUnitY = metrics.getAscent() + metrics.getDescent() - 1;
2499     }
2500 
2501     /**
2502      * {@inheritDoc}
2503      *
2504      * @since 1.6
2505      */
2506     public Icon getDisabledIcon(JComponent component, Icon icon) {
2507         // if the component has a HI_RES_DISABLED_ICON_CLIENT_KEY
2508         // client property set to Boolean.TRUE, then use the new
2509         // hi res algorithm for creating the disabled icon (used
2510         // in particular by the WindowsFileChooserUI class)
2511         if (icon != null
2512                 && component != null
2513                 && Boolean.TRUE.equals(component.getClientProperty(HI_RES_DISABLED_ICON_CLIENT_KEY))
2514                 && icon.getIconWidth() > 0
2515                 && icon.getIconHeight() > 0) {
2516             BufferedImage img = new BufferedImage(icon.getIconWidth(),
2517                     icon.getIconWidth(), BufferedImage.TYPE_INT_ARGB);
2518             icon.paintIcon(component, img.getGraphics(), 0, 0);
2519             ImageFilter filter = new RGBGrayFilter();
2520             ImageProducer producer = new FilteredImageSource(img.getSource(), filter);
2521             Image resultImage = component.createImage(producer);
2522             return new ImageIconUIResource(resultImage);
2523         }
2524         return super.getDisabledIcon(component, icon);
2525     }
2526 
2527     private static class RGBGrayFilter extends RGBImageFilter {
2528         public RGBGrayFilter() {
2529             canFilterIndexColorModel = true;
2530         }
2531         public int filterRGB(int x, int y, int rgb) {
2532             // find the average of red, green, and blue
2533             float avg = (((rgb >> 16) & 0xff) / 255f +
2534                           ((rgb >>  8) & 0xff) / 255f +
2535                            (rgb        & 0xff) / 255f) / 3;
2536             // pull out the alpha channel
2537             float alpha = (((rgb>>24)&0xff)/255f);
2538             // calc the average
2539             avg = Math.min(1.0f, (1f-avg)/(100.0f/35.0f) + avg);
2540             // turn back into rgb
2541             int rgbval = (int)(alpha * 255f) << 24 |
2542                          (int)(avg   * 255f) << 16 |
2543                          (int)(avg   * 255f) <<  8 |
2544                          (int)(avg   * 255f);
2545             return rgbval;
2546         }
2547     }
2548 
2549     private static class FocusColorProperty extends DesktopProperty {
2550         public FocusColorProperty () {
2551             // Fallback value is never used because of the configureValue method doesn't return null
2552             super("win.3d.backgroundColor", Color.BLACK);
2553         }
2554 
2555         @Override
2556         protected Object configureValue(Object value) {
2557             Object highContrastOn = Toolkit.getDefaultToolkit().
2558                     getDesktopProperty("win.highContrast.on");
2559             if (highContrastOn == null || !((Boolean) highContrastOn).booleanValue()) {
2560                 return Color.BLACK;
2561             }
2562             return Color.BLACK.equals(value) ? Color.WHITE : Color.BLACK;
2563         }
2564     }
2565 
2566 }