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((char)0x25CF, '*'),
1106 
1107             // *** ProgressBar
1108             "ProgressBar.font", ControlFont,
1109             "ProgressBar.foreground",  SelectionBackgroundColor,
1110             "ProgressBar.background", ControlBackgroundColor,
1111             "ProgressBar.shadow", ControlShadowColor,
1112             "ProgressBar.highlight", ControlHighlightColor,
1113             "ProgressBar.selectionForeground", ControlBackgroundColor,
1114             "ProgressBar.selectionBackground", SelectionBackgroundColor,
1115             "ProgressBar.cellLength", Integer.valueOf(7),
1116             "ProgressBar.cellSpacing", Integer.valueOf(2),
1117             "ProgressBar.indeterminateInsets", new Insets(3, 3, 3, 3),
1118 
1119             // *** RootPane.
1120             // These bindings are only enabled when there is a default
1121             // button set on the rootpane.
1122             "RootPane.defaultButtonWindowKeyBindings", new Object[] {
1123                              "ENTER", "press",
1124                     "released ENTER", "release",
1125                         "ctrl ENTER", "press",
1126                "ctrl released ENTER", "release"
1127               },
1128 
1129             // *** ScrollBar.
1130             "ScrollBar.background", ScrollbarBackgroundColor,
1131             "ScrollBar.foreground", ControlBackgroundColor,
1132             "ScrollBar.track", white,
1133             "ScrollBar.trackForeground", ScrollbarBackgroundColor,
1134             "ScrollBar.trackHighlight", black,
1135             "ScrollBar.trackHighlightForeground", scrollBarTrackHighlight,
1136             "ScrollBar.thumb", ControlBackgroundColor,
1137             "ScrollBar.thumbHighlight", ControlHighlightColor,
1138             "ScrollBar.thumbDarkShadow", ControlDarkShadowColor,
1139             "ScrollBar.thumbShadow", ControlShadowColor,
1140             "ScrollBar.width", scrollBarWidth,
1141             "ScrollBar.ancestorInputMap",
1142                new UIDefaults.LazyInputMap(new Object[] {
1143                        "RIGHT", "positiveUnitIncrement",
1144                     "KP_RIGHT", "positiveUnitIncrement",
1145                         "DOWN", "positiveUnitIncrement",
1146                      "KP_DOWN", "positiveUnitIncrement",
1147                    "PAGE_DOWN", "positiveBlockIncrement",
1148               "ctrl PAGE_DOWN", "positiveBlockIncrement",
1149                         "LEFT", "negativeUnitIncrement",
1150                      "KP_LEFT", "negativeUnitIncrement",
1151                           "UP", "negativeUnitIncrement",
1152                        "KP_UP", "negativeUnitIncrement",
1153                      "PAGE_UP", "negativeBlockIncrement",
1154                 "ctrl PAGE_UP", "negativeBlockIncrement",
1155                         "HOME", "minScroll",
1156                          "END", "maxScroll"
1157                  }),
1158 
1159             // *** ScrollPane.
1160             "ScrollPane.font", ControlFont,
1161             "ScrollPane.background", ControlBackgroundColor,
1162             "ScrollPane.foreground", ControlTextColor,
1163             "ScrollPane.ancestorInputMap",
1164                new UIDefaults.LazyInputMap(new Object[] {
1165                            "RIGHT", "unitScrollRight",
1166                         "KP_RIGHT", "unitScrollRight",
1167                             "DOWN", "unitScrollDown",
1168                          "KP_DOWN", "unitScrollDown",
1169                             "LEFT", "unitScrollLeft",
1170                          "KP_LEFT", "unitScrollLeft",
1171                               "UP", "unitScrollUp",
1172                            "KP_UP", "unitScrollUp",
1173                          "PAGE_UP", "scrollUp",
1174                        "PAGE_DOWN", "scrollDown",
1175                     "ctrl PAGE_UP", "scrollLeft",
1176                   "ctrl PAGE_DOWN", "scrollRight",
1177                        "ctrl HOME", "scrollHome",
1178                         "ctrl END", "scrollEnd"
1179                  }),
1180 
1181             // *** Separator
1182             "Separator.background", ControlHighlightColor,
1183             "Separator.foreground", ControlShadowColor,
1184 
1185             // *** Slider.
1186             "Slider.font", ControlFont,
1187             "Slider.foreground", ControlBackgroundColor,
1188             "Slider.background", ControlBackgroundColor,
1189             "Slider.highlight", ControlHighlightColor,
1190             "Slider.shadow", ControlShadowColor,
1191             "Slider.focus", ControlDarkShadowColor,
1192             "Slider.focusInputMap",
1193                new UIDefaults.LazyInputMap(new Object[] {
1194                        "RIGHT", "positiveUnitIncrement",
1195                     "KP_RIGHT", "positiveUnitIncrement",
1196                         "DOWN", "negativeUnitIncrement",
1197                      "KP_DOWN", "negativeUnitIncrement",
1198                    "PAGE_DOWN", "negativeBlockIncrement",
1199                         "LEFT", "negativeUnitIncrement",
1200                      "KP_LEFT", "negativeUnitIncrement",
1201                           "UP", "positiveUnitIncrement",
1202                        "KP_UP", "positiveUnitIncrement",
1203                      "PAGE_UP", "positiveBlockIncrement",
1204                         "HOME", "minScroll",
1205                          "END", "maxScroll"
1206                  }),
1207 
1208             // Spinner
1209             "Spinner.font", ControlFont,
1210             "Spinner.ancestorInputMap",
1211                new UIDefaults.LazyInputMap(new Object[] {
1212                                "UP", "increment",
1213                             "KP_UP", "increment",
1214                              "DOWN", "decrement",
1215                           "KP_DOWN", "decrement",
1216                }),
1217 
1218             // *** SplitPane
1219             "SplitPane.background", ControlBackgroundColor,
1220             "SplitPane.highlight", ControlHighlightColor,
1221             "SplitPane.shadow", ControlShadowColor,
1222             "SplitPane.darkShadow", ControlDarkShadowColor,
1223             "SplitPane.dividerSize", Integer.valueOf(5),
1224             "SplitPane.ancestorInputMap",
1225                new UIDefaults.LazyInputMap(new Object[] {
1226                         "UP", "negativeIncrement",
1227                       "DOWN", "positiveIncrement",
1228                       "LEFT", "negativeIncrement",
1229                      "RIGHT", "positiveIncrement",
1230                      "KP_UP", "negativeIncrement",
1231                    "KP_DOWN", "positiveIncrement",
1232                    "KP_LEFT", "negativeIncrement",
1233                   "KP_RIGHT", "positiveIncrement",
1234                       "HOME", "selectMin",
1235                        "END", "selectMax",
1236                         "F8", "startResize",
1237                         "F6", "toggleFocus",
1238                   "ctrl TAB", "focusOutForward",
1239             "ctrl shift TAB", "focusOutBackward"
1240                }),
1241 
1242             // *** TabbedPane
1243             "TabbedPane.tabsOverlapBorder", new XPValue(Boolean.TRUE, Boolean.FALSE),
1244             "TabbedPane.tabInsets",         new XPValue(new InsetsUIResource(1, 4, 1, 4),
1245                                                         new InsetsUIResource(0, 4, 1, 4)),
1246             "TabbedPane.tabAreaInsets",     new XPValue(new InsetsUIResource(3, 2, 2, 2),
1247                                                         new InsetsUIResource(3, 2, 0, 2)),
1248             "TabbedPane.font", ControlFont,
1249             "TabbedPane.background", ControlBackgroundColor,
1250             "TabbedPane.foreground", ControlTextColor,
1251             "TabbedPane.highlight", ControlHighlightColor,
1252             "TabbedPane.light", ControlLightColor,
1253             "TabbedPane.shadow", ControlShadowColor,
1254             "TabbedPane.darkShadow", ControlDarkShadowColor,
1255             "TabbedPane.focus", ControlTextColor,
1256             "TabbedPane.focusInputMap",
1257               new UIDefaults.LazyInputMap(new Object[] {
1258                          "RIGHT", "navigateRight",
1259                       "KP_RIGHT", "navigateRight",
1260                           "LEFT", "navigateLeft",
1261                        "KP_LEFT", "navigateLeft",
1262                             "UP", "navigateUp",
1263                          "KP_UP", "navigateUp",
1264                           "DOWN", "navigateDown",
1265                        "KP_DOWN", "navigateDown",
1266                      "ctrl DOWN", "requestFocusForVisibleComponent",
1267                   "ctrl KP_DOWN", "requestFocusForVisibleComponent",
1268                 }),
1269             "TabbedPane.ancestorInputMap",
1270                new UIDefaults.LazyInputMap(new Object[] {
1271                          "ctrl TAB", "navigateNext",
1272                    "ctrl shift TAB", "navigatePrevious",
1273                    "ctrl PAGE_DOWN", "navigatePageDown",
1274                      "ctrl PAGE_UP", "navigatePageUp",
1275                           "ctrl UP", "requestFocus",
1276                        "ctrl KP_UP", "requestFocus",
1277                  }),
1278 
1279             // *** Table
1280             "Table.font", ControlFont,
1281             "Table.foreground", ControlTextColor,  // cell text color
1282             "Table.background", WindowBackgroundColor,  // cell background color
1283             "Table.highlight", ControlHighlightColor,
1284             "Table.light", ControlLightColor,
1285             "Table.shadow", ControlShadowColor,
1286             "Table.darkShadow", ControlDarkShadowColor,
1287             "Table.selectionForeground", SelectionTextColor,
1288             "Table.selectionBackground", SelectionBackgroundColor,
1289             "Table.gridColor", gray,  // grid line color
1290             "Table.focusCellBackground", WindowBackgroundColor,
1291             "Table.focusCellForeground", ControlTextColor,
1292             "Table.ancestorInputMap",
1293                new UIDefaults.LazyInputMap(new Object[] {
1294                                "ctrl C", "copy",
1295                                "ctrl V", "paste",
1296                                "ctrl X", "cut",
1297                                  "COPY", "copy",
1298                                 "PASTE", "paste",
1299                                   "CUT", "cut",
1300                        "control INSERT", "copy",
1301                          "shift INSERT", "paste",
1302                          "shift DELETE", "cut",
1303                                 "RIGHT", "selectNextColumn",
1304                              "KP_RIGHT", "selectNextColumn",
1305                           "shift RIGHT", "selectNextColumnExtendSelection",
1306                        "shift KP_RIGHT", "selectNextColumnExtendSelection",
1307                      "ctrl shift RIGHT", "selectNextColumnExtendSelection",
1308                   "ctrl shift KP_RIGHT", "selectNextColumnExtendSelection",
1309                            "ctrl RIGHT", "selectNextColumnChangeLead",
1310                         "ctrl KP_RIGHT", "selectNextColumnChangeLead",
1311                                  "LEFT", "selectPreviousColumn",
1312                               "KP_LEFT", "selectPreviousColumn",
1313                            "shift LEFT", "selectPreviousColumnExtendSelection",
1314                         "shift KP_LEFT", "selectPreviousColumnExtendSelection",
1315                       "ctrl shift LEFT", "selectPreviousColumnExtendSelection",
1316                    "ctrl shift KP_LEFT", "selectPreviousColumnExtendSelection",
1317                             "ctrl LEFT", "selectPreviousColumnChangeLead",
1318                          "ctrl KP_LEFT", "selectPreviousColumnChangeLead",
1319                                  "DOWN", "selectNextRow",
1320                               "KP_DOWN", "selectNextRow",
1321                            "shift DOWN", "selectNextRowExtendSelection",
1322                         "shift KP_DOWN", "selectNextRowExtendSelection",
1323                       "ctrl shift DOWN", "selectNextRowExtendSelection",
1324                    "ctrl shift KP_DOWN", "selectNextRowExtendSelection",
1325                             "ctrl DOWN", "selectNextRowChangeLead",
1326                          "ctrl KP_DOWN", "selectNextRowChangeLead",
1327                                    "UP", "selectPreviousRow",
1328                                 "KP_UP", "selectPreviousRow",
1329                              "shift UP", "selectPreviousRowExtendSelection",
1330                           "shift KP_UP", "selectPreviousRowExtendSelection",
1331                         "ctrl shift UP", "selectPreviousRowExtendSelection",
1332                      "ctrl shift KP_UP", "selectPreviousRowExtendSelection",
1333                               "ctrl UP", "selectPreviousRowChangeLead",
1334                            "ctrl KP_UP", "selectPreviousRowChangeLead",
1335                                  "HOME", "selectFirstColumn",
1336                            "shift HOME", "selectFirstColumnExtendSelection",
1337                       "ctrl shift HOME", "selectFirstRowExtendSelection",
1338                             "ctrl HOME", "selectFirstRow",
1339                                   "END", "selectLastColumn",
1340                             "shift END", "selectLastColumnExtendSelection",
1341                        "ctrl shift END", "selectLastRowExtendSelection",
1342                              "ctrl END", "selectLastRow",
1343                               "PAGE_UP", "scrollUpChangeSelection",
1344                         "shift PAGE_UP", "scrollUpExtendSelection",
1345                    "ctrl shift PAGE_UP", "scrollLeftExtendSelection",
1346                          "ctrl PAGE_UP", "scrollLeftChangeSelection",
1347                             "PAGE_DOWN", "scrollDownChangeSelection",
1348                       "shift PAGE_DOWN", "scrollDownExtendSelection",
1349                  "ctrl shift PAGE_DOWN", "scrollRightExtendSelection",
1350                        "ctrl PAGE_DOWN", "scrollRightChangeSelection",
1351                                   "TAB", "selectNextColumnCell",
1352                             "shift TAB", "selectPreviousColumnCell",
1353                                 "ENTER", "selectNextRowCell",
1354                           "shift ENTER", "selectPreviousRowCell",
1355                                "ctrl A", "selectAll",
1356                            "ctrl SLASH", "selectAll",
1357                       "ctrl BACK_SLASH", "clearSelection",
1358                                "ESCAPE", "cancel",
1359                                    "F2", "startEditing",
1360                                 "SPACE", "addToSelection",
1361                            "ctrl SPACE", "toggleAndAnchor",
1362                           "shift SPACE", "extendTo",
1363                      "ctrl shift SPACE", "moveSelectionTo",
1364                                    "F8", "focusHeader"
1365                  }),
1366             "Table.sortIconHighlight", ControlShadowColor,
1367             "Table.sortIconLight", white,
1368 
1369             "TableHeader.font", ControlFont,
1370             "TableHeader.foreground", ControlTextColor, // header text color
1371             "TableHeader.background", ControlBackgroundColor, // header background
1372             "TableHeader.focusCellBackground",
1373                 new XPValue(XPValue.NULL_VALUE,     // use default bg from XP styles
1374                             WindowBackgroundColor), // or white bg otherwise
1375 
1376             // *** TextArea
1377             "TextArea.font", FixedControlFont,
1378             "TextArea.background", WindowBackgroundColor,
1379             "TextArea.foreground", WindowTextColor,
1380             "TextArea.inactiveForeground", InactiveTextColor,
1381             "TextArea.inactiveBackground", WindowBackgroundColor,
1382             "TextArea.disabledBackground", DisabledTextBackground,
1383             "TextArea.selectionBackground", SelectionBackgroundColor,
1384             "TextArea.selectionForeground", SelectionTextColor,
1385             "TextArea.caretForeground", WindowTextColor,
1386 
1387             // *** TextField
1388             "TextField.font", ControlFont,
1389             "TextField.background", TextBackground,
1390             "TextField.foreground", WindowTextColor,
1391             "TextField.shadow", ControlShadowColor,
1392             "TextField.darkShadow", ControlDarkShadowColor,
1393             "TextField.light", ControlLightColor,
1394             "TextField.highlight", ControlHighlightColor,
1395             "TextField.inactiveForeground", InactiveTextColor,      // for disabled
1396             "TextField.inactiveBackground", ReadOnlyTextBackground, // for readonly
1397             "TextField.disabledBackground", DisabledTextBackground, // for disabled
1398             "TextField.selectionBackground", SelectionBackgroundColor,
1399             "TextField.selectionForeground", SelectionTextColor,
1400             "TextField.caretForeground", WindowTextColor,
1401 
1402             // *** TextPane
1403             "TextPane.font", ControlFont,
1404             "TextPane.background", WindowBackgroundColor,
1405             "TextPane.foreground", WindowTextColor,
1406             "TextPane.selectionBackground", SelectionBackgroundColor,
1407             "TextPane.selectionForeground", SelectionTextColor,
1408             "TextPane.inactiveBackground", WindowBackgroundColor,
1409             "TextPane.disabledBackground", DisabledTextBackground,
1410             "TextPane.caretForeground", WindowTextColor,
1411 
1412             // *** TitledBorder
1413             "TitledBorder.font", ControlFont,
1414             "TitledBorder.titleColor",
1415                         new XPColorValue(Part.BP_GROUPBOX, null, Prop.TEXTCOLOR,
1416                                          WindowTextColor),
1417 
1418             // *** ToggleButton
1419             "ToggleButton.font", ControlFont,
1420             "ToggleButton.background", ControlBackgroundColor,
1421             "ToggleButton.foreground", ControlTextColor,
1422             "ToggleButton.shadow", ControlShadowColor,
1423             "ToggleButton.darkShadow", ControlDarkShadowColor,
1424             "ToggleButton.light", ControlLightColor,
1425             "ToggleButton.highlight", ControlHighlightColor,
1426             "ToggleButton.focus", ControlTextColor,
1427             "ToggleButton.textShiftOffset", Integer.valueOf(1),
1428             "ToggleButton.focusInputMap",
1429               new UIDefaults.LazyInputMap(new Object[] {
1430                             "SPACE", "pressed",
1431                    "released SPACE", "released"
1432                 }),
1433 
1434             // *** ToolBar
1435             "ToolBar.font", MenuFont,
1436             "ToolBar.background", ControlBackgroundColor,
1437             "ToolBar.foreground", ControlTextColor,
1438             "ToolBar.shadow", ControlShadowColor,
1439             "ToolBar.darkShadow", ControlDarkShadowColor,
1440             "ToolBar.light", ControlLightColor,
1441             "ToolBar.highlight", ControlHighlightColor,
1442             "ToolBar.dockingBackground", ControlBackgroundColor,
1443             "ToolBar.dockingForeground", red,
1444             "ToolBar.floatingBackground", ControlBackgroundColor,
1445             "ToolBar.floatingForeground", darkGray,
1446             "ToolBar.ancestorInputMap",
1447                new UIDefaults.LazyInputMap(new Object[] {
1448                         "UP", "navigateUp",
1449                      "KP_UP", "navigateUp",
1450                       "DOWN", "navigateDown",
1451                    "KP_DOWN", "navigateDown",
1452                       "LEFT", "navigateLeft",
1453                    "KP_LEFT", "navigateLeft",
1454                      "RIGHT", "navigateRight",
1455                   "KP_RIGHT", "navigateRight"
1456                  }),
1457             "ToolBar.separatorSize", null,
1458 
1459             // *** ToolTip
1460             "ToolTip.font", ToolTipFont,
1461             "ToolTip.background", new DesktopProperty("win.tooltip.backgroundColor", table.get("info")),
1462             "ToolTip.foreground", new DesktopProperty("win.tooltip.textColor", table.get("infoText")),
1463 
1464         // *** ToolTipManager
1465             "ToolTipManager.enableToolTipMode", "activeApplication",
1466 
1467         // *** Tree
1468             "Tree.selectionBorderColor", black,
1469             "Tree.drawDashedFocusIndicator", Boolean.TRUE,
1470             "Tree.lineTypeDashed", Boolean.TRUE,
1471             "Tree.font", ControlFont,
1472             "Tree.background", WindowBackgroundColor,
1473             "Tree.foreground", WindowTextColor,
1474             "Tree.hash", gray,
1475             "Tree.leftChildIndent", Integer.valueOf(8),
1476             "Tree.rightChildIndent", Integer.valueOf(11),
1477             "Tree.textForeground", WindowTextColor,
1478             "Tree.textBackground", WindowBackgroundColor,
1479             "Tree.selectionForeground", SelectionTextColor,
1480             "Tree.selectionBackground", SelectionBackgroundColor,
1481             "Tree.expandedIcon", treeExpandedIcon,
1482             "Tree.collapsedIcon", treeCollapsedIcon,
1483             "Tree.openIcon",   new ActiveWindowsIcon("win.icon.shellIconBPP",
1484                                    "shell32Icon 5", "icons/TreeOpen.gif"),
1485             "Tree.closedIcon", new ActiveWindowsIcon("win.icon.shellIconBPP",
1486                                    "shell32Icon 4", "icons/TreeClosed.gif"),
1487             "Tree.focusInputMap",
1488                new UIDefaults.LazyInputMap(new Object[] {
1489                                     "ADD", "expand",
1490                                "SUBTRACT", "collapse",
1491                                  "ctrl C", "copy",
1492                                  "ctrl V", "paste",
1493                                  "ctrl X", "cut",
1494                                    "COPY", "copy",
1495                                   "PASTE", "paste",
1496                                     "CUT", "cut",
1497                          "control INSERT", "copy",
1498                            "shift INSERT", "paste",
1499                            "shift DELETE", "cut",
1500                                      "UP", "selectPrevious",
1501                                   "KP_UP", "selectPrevious",
1502                                "shift UP", "selectPreviousExtendSelection",
1503                             "shift KP_UP", "selectPreviousExtendSelection",
1504                           "ctrl shift UP", "selectPreviousExtendSelection",
1505                        "ctrl shift KP_UP", "selectPreviousExtendSelection",
1506                                 "ctrl UP", "selectPreviousChangeLead",
1507                              "ctrl KP_UP", "selectPreviousChangeLead",
1508                                    "DOWN", "selectNext",
1509                                 "KP_DOWN", "selectNext",
1510                              "shift DOWN", "selectNextExtendSelection",
1511                           "shift KP_DOWN", "selectNextExtendSelection",
1512                         "ctrl shift DOWN", "selectNextExtendSelection",
1513                      "ctrl shift KP_DOWN", "selectNextExtendSelection",
1514                               "ctrl DOWN", "selectNextChangeLead",
1515                            "ctrl KP_DOWN", "selectNextChangeLead",
1516                                   "RIGHT", "selectChild",
1517                                "KP_RIGHT", "selectChild",
1518                                    "LEFT", "selectParent",
1519                                 "KP_LEFT", "selectParent",
1520                                 "PAGE_UP", "scrollUpChangeSelection",
1521                           "shift PAGE_UP", "scrollUpExtendSelection",
1522                      "ctrl shift PAGE_UP", "scrollUpExtendSelection",
1523                            "ctrl PAGE_UP", "scrollUpChangeLead",
1524                               "PAGE_DOWN", "scrollDownChangeSelection",
1525                         "shift PAGE_DOWN", "scrollDownExtendSelection",
1526                    "ctrl shift PAGE_DOWN", "scrollDownExtendSelection",
1527                          "ctrl PAGE_DOWN", "scrollDownChangeLead",
1528                                    "HOME", "selectFirst",
1529                              "shift HOME", "selectFirstExtendSelection",
1530                         "ctrl shift HOME", "selectFirstExtendSelection",
1531                               "ctrl HOME", "selectFirstChangeLead",
1532                                     "END", "selectLast",
1533                               "shift END", "selectLastExtendSelection",
1534                          "ctrl shift END", "selectLastExtendSelection",
1535                                "ctrl END", "selectLastChangeLead",
1536                                      "F2", "startEditing",
1537                                  "ctrl A", "selectAll",
1538                              "ctrl SLASH", "selectAll",
1539                         "ctrl BACK_SLASH", "clearSelection",
1540                               "ctrl LEFT", "scrollLeft",
1541                            "ctrl KP_LEFT", "scrollLeft",
1542                              "ctrl RIGHT", "scrollRight",
1543                           "ctrl KP_RIGHT", "scrollRight",
1544                                   "SPACE", "addToSelection",
1545                              "ctrl SPACE", "toggleAndAnchor",
1546                             "shift SPACE", "extendTo",
1547                        "ctrl shift SPACE", "moveSelectionTo"
1548                  }),
1549             "Tree.ancestorInputMap",
1550                new UIDefaults.LazyInputMap(new Object[] {
1551                      "ESCAPE", "cancel"
1552                  }),
1553 
1554             // *** Viewport
1555             "Viewport.font", ControlFont,
1556             "Viewport.background", ControlBackgroundColor,
1557             "Viewport.foreground", WindowTextColor,
1558 
1559 
1560         };
1561 
1562         table.putDefaults(defaults);
1563         table.putDefaults(getLazyValueDefaults());
1564         initVistaComponentDefaults(table);
1565     }
1566 
1567     static boolean isOnVista() {
1568         return OSInfo.getOSType() == OSInfo.OSType.WINDOWS
1569                 && OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_VISTA) >= 0;
1570     }
1571 
1572     private void initVistaComponentDefaults(UIDefaults table) {
1573         if (! isOnVista()) {
1574             return;
1575         }
1576         /* START handling menus for Vista */
1577         String[] menuClasses = { "MenuItem", "Menu",
1578                 "CheckBoxMenuItem", "RadioButtonMenuItem",
1579         };
1580 
1581         Object menuDefaults[] = new Object[menuClasses.length * 2];
1582 
1583         /* all the menus need to be non opaque. */
1584         for (int i = 0, j = 0; i < menuClasses.length; i++) {
1585             String key = menuClasses[i] + ".opaque";
1586             Object oldValue = table.get(key);
1587             menuDefaults[j++] = key;
1588             menuDefaults[j++] =
1589                 new XPValue(Boolean.FALSE, oldValue);
1590         }
1591         table.putDefaults(menuDefaults);
1592 
1593         /*
1594          * acceleratorSelectionForeground color is the same as
1595          * acceleratorForeground
1596          */
1597         for (int i = 0, j = 0; i < menuClasses.length; i++) {
1598             String key = menuClasses[i] + ".acceleratorSelectionForeground";
1599             Object oldValue = table.get(key);
1600             menuDefaults[j++] = key;
1601             menuDefaults[j++] =
1602                 new XPValue(
1603                     table.getColor(
1604                         menuClasses[i] + ".acceleratorForeground"),
1605                         oldValue);
1606         }
1607         table.putDefaults(menuDefaults);
1608 
1609         /* they have the same MenuItemCheckIconFactory */
1610         VistaMenuItemCheckIconFactory menuItemCheckIconFactory =
1611             WindowsIconFactory.getMenuItemCheckIconFactory();
1612         for (int i = 0, j = 0; i < menuClasses.length; i++) {
1613             String key = menuClasses[i] + ".checkIconFactory";
1614             Object oldValue = table.get(key);
1615             menuDefaults[j++] = key;
1616             menuDefaults[j++] =
1617                 new XPValue(menuItemCheckIconFactory, oldValue);
1618         }
1619         table.putDefaults(menuDefaults);
1620 
1621         for (int i = 0, j = 0; i < menuClasses.length; i++) {
1622             String key = menuClasses[i] + ".checkIcon";
1623             Object oldValue = table.get(key);
1624             menuDefaults[j++] = key;
1625             menuDefaults[j++] =
1626                 new XPValue(menuItemCheckIconFactory.getIcon(menuClasses[i]),
1627                     oldValue);
1628         }
1629         table.putDefaults(menuDefaults);
1630 
1631 
1632         /* height can be even */
1633         for (int i = 0, j = 0; i < menuClasses.length; i++) {
1634             String key = menuClasses[i] + ".evenHeight";
1635             Object oldValue = table.get(key);
1636             menuDefaults[j++] = key;
1637             menuDefaults[j++] = new XPValue(Boolean.TRUE, oldValue);
1638         }
1639         table.putDefaults(menuDefaults);
1640 
1641         /* no margins */
1642         InsetsUIResource insets = new InsetsUIResource(0, 0, 0, 0);
1643         for (int i = 0, j = 0; i < menuClasses.length; i++) {
1644             String key = menuClasses[i] + ".margin";
1645             Object oldValue = table.get(key);
1646             menuDefaults[j++] = key;
1647             menuDefaults[j++] = new XPValue(insets, oldValue);
1648         }
1649         table.putDefaults(menuDefaults);
1650 
1651         /* set checkIcon offset */
1652         Integer checkIconOffsetInteger =
1653             Integer.valueOf(0);
1654         for (int i = 0, j = 0; i < menuClasses.length; i++) {
1655             String key = menuClasses[i] + ".checkIconOffset";
1656             Object oldValue = table.get(key);
1657             menuDefaults[j++] = key;
1658             menuDefaults[j++] =
1659                 new XPValue(checkIconOffsetInteger, oldValue);
1660         }
1661         table.putDefaults(menuDefaults);
1662 
1663         /* set width of the gap after check icon */
1664         Integer afterCheckIconGap = WindowsPopupMenuUI.getSpanBeforeGutter()
1665                 + WindowsPopupMenuUI.getGutterWidth()
1666                 + WindowsPopupMenuUI.getSpanAfterGutter();
1667         for (int i = 0, j = 0; i < menuClasses.length; i++) {
1668             String key = menuClasses[i] + ".afterCheckIconGap";
1669             Object oldValue = table.get(key);
1670             menuDefaults[j++] = key;
1671             menuDefaults[j++] =
1672                 new XPValue(afterCheckIconGap, oldValue);
1673         }
1674         table.putDefaults(menuDefaults);
1675 
1676         /* text is started after this position */
1677         Object minimumTextOffset = new UIDefaults.ActiveValue() {
1678             public Object createValue(UIDefaults table) {
1679                 return VistaMenuItemCheckIconFactory.getIconWidth()
1680                 + WindowsPopupMenuUI.getSpanBeforeGutter()
1681                 + WindowsPopupMenuUI.getGutterWidth()
1682                 + WindowsPopupMenuUI.getSpanAfterGutter();
1683             }
1684         };
1685         for (int i = 0, j = 0; i < menuClasses.length; i++) {
1686             String key = menuClasses[i] + ".minimumTextOffset";
1687             Object oldValue = table.get(key);
1688             menuDefaults[j++] = key;
1689             menuDefaults[j++] = new XPValue(minimumTextOffset, oldValue);
1690         }
1691         table.putDefaults(menuDefaults);
1692 
1693         /*
1694          * JPopupMenu has a bit of free space around menu items
1695          */
1696         String POPUP_MENU_BORDER = "PopupMenu.border";
1697 
1698         Object popupMenuBorder = new XPBorderValue(Part.MENU,
1699             (LazyValue) t -> BasicBorders.getInternalFrameBorder(),
1700                   BorderFactory.createEmptyBorder(2, 2, 2, 2));
1701         table.put(POPUP_MENU_BORDER, popupMenuBorder);
1702         /* END handling menus for Vista */
1703 
1704         /* START table handling for Vista */
1705         table.put("Table.ascendingSortIcon", new XPValue(
1706             new SkinIcon(Part.HP_HEADERSORTARROW, State.SORTEDDOWN),
1707                (LazyValue) t -> new ClassicSortArrowIcon(true)));
1708         table.put("Table.descendingSortIcon", new XPValue(
1709             new SkinIcon(Part.HP_HEADERSORTARROW, State.SORTEDUP),
1710                (LazyValue) t -> new ClassicSortArrowIcon(false)));
1711         /* END table handling for Vista */
1712     }
1713 
1714     /**
1715      * If we support loading of fonts from the desktop this will return
1716      * a DesktopProperty representing the font. If the font can't be
1717      * represented in the current encoding this will return null and
1718      * turn off the use of system fonts.
1719      */
1720     private Object getDesktopFontValue(String fontName, Object backup) {
1721         if (useSystemFontSettings) {
1722             return new WindowsFontProperty(fontName, backup);
1723         }
1724         return null;
1725     }
1726 
1727     // When a desktop property change is detected, these classes must be
1728     // reinitialized in the defaults table to ensure the classes reference
1729     // the updated desktop property values (colors mostly)
1730     //
1731     private Object[] getLazyValueDefaults() {
1732 
1733         Object buttonBorder =
1734             new XPBorderValue(Part.BP_PUSHBUTTON,
1735                (LazyValue) t -> BasicBorders.getButtonBorder());
1736 
1737         Object textFieldBorder =
1738             new XPBorderValue(Part.EP_EDIT,
1739                (LazyValue) t -> BasicBorders.getTextFieldBorder());
1740 
1741         Object textFieldMargin =
1742             new XPValue(new InsetsUIResource(2, 2, 2, 2),
1743                         new InsetsUIResource(1, 1, 1, 1));
1744 
1745         Object spinnerBorder =
1746             new XPBorderValue(Part.EP_EDIT, textFieldBorder,
1747                               new EmptyBorder(2, 2, 2, 2));
1748 
1749         Object spinnerArrowInsets =
1750             new XPValue(new InsetsUIResource(1, 1, 1, 1),
1751                         null);
1752 
1753         Object comboBoxBorder = new XPBorderValue(Part.CP_COMBOBOX, textFieldBorder);
1754 
1755         // For focus rectangle for cells and trees.
1756         LazyValue focusCellHighlightBorder = t -> WindowsBorders.getFocusCellHighlightBorder();
1757 
1758         LazyValue etchedBorder = t -> BorderUIResource.getEtchedBorderUIResource();
1759 
1760         LazyValue internalFrameBorder = t -> WindowsBorders.getInternalFrameBorder();
1761 
1762         LazyValue loweredBevelBorder = t -> BorderUIResource.getLoweredBevelBorderUIResource();
1763 
1764 
1765         LazyValue marginBorder = t -> new BasicBorders.MarginBorder();
1766 
1767         LazyValue menuBarBorder = t -> BasicBorders.getMenuBarBorder();
1768 
1769 
1770         Object popupMenuBorder = new XPBorderValue(Part.MENU,
1771             (LazyValue) t -> BasicBorders.getInternalFrameBorder());
1772 
1773         // *** ProgressBar
1774         LazyValue progressBarBorder = t -> WindowsBorders.getProgressBarBorder();
1775 
1776         LazyValue radioButtonBorder = t -> BasicBorders.getRadioButtonBorder();
1777 
1778         Object scrollPaneBorder =
1779             new XPBorderValue(Part.LBP_LISTBOX, textFieldBorder);
1780 
1781         Object tableScrollPaneBorder =
1782             new XPBorderValue(Part.LBP_LISTBOX, loweredBevelBorder);
1783 
1784         LazyValue tableHeaderBorder = t -> WindowsBorders.getTableHeaderBorder();
1785 
1786         // *** ToolBar
1787         LazyValue toolBarBorder = t -> WindowsBorders.getToolBarBorder();
1788 
1789         // *** ToolTips
1790         LazyValue toolTipBorder = t -> BorderUIResource.getBlackLineBorderUIResource();
1791 
1792 
1793 
1794         LazyValue checkBoxIcon = t -> WindowsIconFactory.getCheckBoxIcon();
1795 
1796         LazyValue radioButtonIcon = t -> WindowsIconFactory.getRadioButtonIcon();
1797 
1798         LazyValue radioButtonMenuItemIcon = t -> WindowsIconFactory.getRadioButtonMenuItemIcon();
1799 
1800         LazyValue menuItemCheckIcon = t -> WindowsIconFactory.getMenuItemCheckIcon();
1801 
1802         LazyValue menuItemArrowIcon = t -> WindowsIconFactory.getMenuItemArrowIcon();
1803 
1804         LazyValue menuArrowIcon = t -> WindowsIconFactory.getMenuArrowIcon();
1805 
1806 
1807         Object[] lazyDefaults = {
1808             "Button.border", buttonBorder,
1809             "CheckBox.border", radioButtonBorder,
1810             "ComboBox.border", comboBoxBorder,
1811             "DesktopIcon.border", internalFrameBorder,
1812             "FormattedTextField.border", textFieldBorder,
1813             "FormattedTextField.margin", textFieldMargin,
1814             "InternalFrame.border", internalFrameBorder,
1815             "List.focusCellHighlightBorder", focusCellHighlightBorder,
1816             "Table.focusCellHighlightBorder", focusCellHighlightBorder,
1817             "Menu.border", marginBorder,
1818             "MenuBar.border", menuBarBorder,
1819             "MenuItem.border", marginBorder,
1820             "PasswordField.border", textFieldBorder,
1821             "PasswordField.margin", textFieldMargin,
1822             "PopupMenu.border", popupMenuBorder,
1823             "ProgressBar.border", progressBarBorder,
1824             "RadioButton.border", radioButtonBorder,
1825             "ScrollPane.border", scrollPaneBorder,
1826             "Spinner.border", spinnerBorder,
1827             "Spinner.arrowButtonInsets", spinnerArrowInsets,
1828             "Spinner.arrowButtonSize", new Dimension(17, 9),
1829             "Table.scrollPaneBorder", tableScrollPaneBorder,
1830             "TableHeader.cellBorder", tableHeaderBorder,
1831             "TextArea.margin", textFieldMargin,
1832             "TextField.border", textFieldBorder,
1833             "TextField.margin", textFieldMargin,
1834             "TitledBorder.border",
1835                         new XPBorderValue(Part.BP_GROUPBOX, etchedBorder),
1836             "ToggleButton.border", radioButtonBorder,
1837             "ToolBar.border", toolBarBorder,
1838             "ToolTip.border", toolTipBorder,
1839 
1840             "CheckBox.icon", checkBoxIcon,
1841             "Menu.arrowIcon", menuArrowIcon,
1842             "MenuItem.checkIcon", menuItemCheckIcon,
1843             "MenuItem.arrowIcon", menuItemArrowIcon,
1844             "RadioButton.icon", radioButtonIcon,
1845             "RadioButtonMenuItem.checkIcon", radioButtonMenuItemIcon,
1846             "InternalFrame.layoutTitlePaneAtOrigin",
1847                         new XPValue(Boolean.TRUE, Boolean.FALSE),
1848             "Table.ascendingSortIcon", new XPValue(
1849                (LazyValue) t -> new SortArrowIcon(true,"Table.sortIconColor"),
1850                   (LazyValue) t -> new ClassicSortArrowIcon(true)),
1851             "Table.descendingSortIcon", new XPValue(
1852                (LazyValue) t -> new SortArrowIcon(false,"Table.sortIconColor"),
1853                   (LazyValue) t -> new ClassicSortArrowIcon(false)),
1854         };
1855 
1856         return lazyDefaults;
1857     }
1858 
1859     public void uninitialize() {
1860         super.uninitialize();
1861 
1862         if (WindowsPopupMenuUI.mnemonicListener != null) {
1863             MenuSelectionManager.defaultManager().
1864                 removeChangeListener(WindowsPopupMenuUI.mnemonicListener);
1865         }
1866         KeyboardFocusManager.getCurrentKeyboardFocusManager().
1867             removeKeyEventPostProcessor(WindowsRootPaneUI.altProcessor);
1868         DesktopProperty.flushUnreferencedProperties();
1869     }
1870 
1871 
1872     // Toggle flag for drawing the mnemonic state
1873     private static boolean isMnemonicHidden = true;
1874 
1875     // Flag which indicates that the Win98/Win2k/WinME features
1876     // should be disabled.
1877     private static boolean isClassicWindows = false;
1878 
1879     /**
1880      * Sets the state of the hide mnemonic flag. This flag is used by the
1881      * component UI delegates to determine if the mnemonic should be rendered.
1882      * This method is a non operation if the underlying operating system
1883      * does not support the mnemonic hiding feature.
1884      *
1885      * @param hide true if mnemonics should be hidden
1886      * @since 1.4
1887      */
1888     public static void setMnemonicHidden(boolean hide) {
1889         if (UIManager.getBoolean("Button.showMnemonics") == true) {
1890             // Do not hide mnemonics if the UI defaults do not support this
1891             isMnemonicHidden = false;
1892         } else {
1893             isMnemonicHidden = hide;
1894         }
1895     }
1896 
1897     /**
1898      * Gets the state of the hide mnemonic flag. This only has meaning
1899      * if this feature is supported by the underlying OS.
1900      *
1901      * @return true if mnemonics are hidden, otherwise, false
1902      * @see #setMnemonicHidden
1903      * @since 1.4
1904      */
1905     public static boolean isMnemonicHidden() {
1906         if (UIManager.getBoolean("Button.showMnemonics") == true) {
1907             // Do not hide mnemonics if the UI defaults do not support this
1908             isMnemonicHidden = false;
1909         }
1910         return isMnemonicHidden;
1911     }
1912 
1913     /**
1914      * Gets the state of the flag which indicates if the old Windows
1915      * look and feel should be rendered. This flag is used by the
1916      * component UI delegates as a hint to determine which style the component
1917      * should be rendered.
1918      *
1919      * @return true if Windows 95 and Windows NT 4 look and feel should
1920      *         be rendered
1921      * @since 1.4
1922      */
1923     public static boolean isClassicWindows() {
1924         return isClassicWindows;
1925     }
1926 
1927     /**
1928      * <p>
1929      * Invoked when the user attempts an invalid operation,
1930      * such as pasting into an uneditable <code>JTextField</code>
1931      * that has focus.
1932      * </p>
1933      * <p>
1934      * If the user has enabled visual error indication on
1935      * the desktop, this method will flash the caption bar
1936      * of the active window. The user can also set the
1937      * property awt.visualbell=true to achieve the same
1938      * results.
1939      * </p>
1940      *
1941      * @param component Component the error occurred in, may be
1942      *                  null indicating the error condition is
1943      *                  not directly associated with a
1944      *                  <code>Component</code>.
1945      *
1946      * @see javax.swing.LookAndFeel#provideErrorFeedback
1947      */
1948      public void provideErrorFeedback(Component component) {
1949          super.provideErrorFeedback(component);
1950      }
1951 
1952     /**
1953      * {@inheritDoc}
1954      */
1955     public LayoutStyle getLayoutStyle() {
1956         LayoutStyle style = this.style;
1957         if (style == null) {
1958             style = new WindowsLayoutStyle();
1959             this.style = style;
1960         }
1961         return style;
1962     }
1963 
1964     // ********* Auditory Cue support methods and objects *********
1965 
1966     /**
1967      * Returns an <code>Action</code>.
1968      * <P>
1969      * This Action contains the information and logic to render an
1970      * auditory cue. The <code>Object</code> that is passed to this
1971      * method contains the information needed to render the auditory
1972      * cue. Normally, this <code>Object</code> is a <code>String</code>
1973      * that points to a <code>Toolkit</code> <code>desktopProperty</code>.
1974      * This <code>desktopProperty</code> is resolved by AWT and the
1975      * Windows OS.
1976      * <P>
1977      * This <code>Action</code>'s <code>actionPerformed</code> method
1978      * is fired by the <code>playSound</code> method.
1979      *
1980      * @return      an Action which knows how to render the auditory
1981      *              cue for one particular system or user activity
1982      * @see #playSound(Action)
1983      * @since 1.4
1984      */
1985     protected Action createAudioAction(Object key) {
1986         if (key != null) {
1987             String audioKey = (String)key;
1988             String audioValue = (String)UIManager.get(key);
1989             return new AudioAction(audioKey, audioValue);
1990         } else {
1991             return null;
1992         }
1993     }
1994 
1995     static void repaintRootPane(Component c) {
1996         JRootPane root = null;
1997         for (; c != null; c = c.getParent()) {
1998             if (c instanceof JRootPane) {
1999                 root = (JRootPane)c;
2000             }
2001         }
2002 
2003         if (root != null) {
2004             root.repaint();
2005         } else {
2006             c.repaint();
2007         }
2008     }
2009 
2010     /**
2011      * Pass the name String to the super constructor. This is used
2012      * later to identify the Action and decide whether to play it or
2013      * not. Store the resource String. It is used to get the audio
2014      * resource. In this case, the resource is a <code>Runnable</code>
2015      * supplied by <code>Toolkit</code>. This <code>Runnable</code> is
2016      * effectively a pointer down into the Win32 OS that knows how to
2017      * play the right sound.
2018      *
2019      * @since 1.4
2020      */
2021     @SuppressWarnings("serial") // Superclass is not serializable across versions
2022     private static class AudioAction extends AbstractAction {
2023         private Runnable audioRunnable;
2024         private String audioResource;
2025         /**
2026          * We use the String as the name of the Action and as a pointer to
2027          * the underlying OSes audio resource.
2028          */
2029         public AudioAction(String name, String resource) {
2030             super(name);
2031             audioResource = resource;
2032         }
2033         public void actionPerformed(ActionEvent e) {
2034             if (audioRunnable == null) {
2035                 audioRunnable = (Runnable)Toolkit.getDefaultToolkit().getDesktopProperty(audioResource);
2036             }
2037             if (audioRunnable != null) {
2038                 // Runnable appears to block until completed playing, hence
2039                 // start up another thread to handle playing.
2040                 new Thread(audioRunnable).start();
2041             }
2042         }
2043     }
2044 
2045     /**
2046      * Gets an <code>Icon</code> from the native libraries if available,
2047      * otherwise gets it from an image resource file.
2048      */
2049     private static class LazyWindowsIcon implements UIDefaults.LazyValue {
2050         private String nativeImage;
2051         private String resource;
2052 
2053         LazyWindowsIcon(String nativeImage, String resource) {
2054             this.nativeImage = nativeImage;
2055             this.resource = resource;
2056         }
2057 
2058         public Object createValue(UIDefaults table) {
2059             if (nativeImage != null) {
2060                 Image image = (Image)ShellFolder.get(nativeImage);
2061                 if (image != null) {
2062                     return new ImageIcon(image);
2063                 }
2064             }
2065             return SwingUtilities2.makeIcon(getClass(),
2066                                             WindowsLookAndFeel.class,
2067                                             resource);
2068         }
2069     }
2070 
2071 
2072     /**
2073      * Gets an <code>Icon</code> from the native libraries if available.
2074      * A desktop property is used to trigger reloading the icon when needed.
2075      */
2076     private class ActiveWindowsIcon implements UIDefaults.ActiveValue {
2077         private Icon icon;
2078         private String nativeImageName;
2079         private String fallbackName;
2080         private DesktopProperty desktopProperty;
2081 
2082         ActiveWindowsIcon(String desktopPropertyName,
2083                             String nativeImageName, String fallbackName) {
2084             this.nativeImageName = nativeImageName;
2085             this.fallbackName = fallbackName;
2086 
2087             if (OSInfo.getOSType() == OSInfo.OSType.WINDOWS &&
2088                     OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_XP) < 0) {
2089                 // This desktop property is needed to trigger reloading the icon.
2090                 // It is kept in member variable to avoid GC.
2091                 this.desktopProperty = new TriggerDesktopProperty(desktopPropertyName) {
2092                     @Override protected void updateUI() {
2093                         icon = null;
2094                         super.updateUI();
2095                     }
2096                 };
2097             }
2098         }
2099 
2100         @Override
2101         public Object createValue(UIDefaults table) {
2102             if (icon == null) {
2103                 Image image = (Image)ShellFolder.get(nativeImageName);
2104                 if (image != null) {
2105                     icon = new ImageIconUIResource(image);
2106                 }
2107             }
2108             if (icon == null && fallbackName != null) {
2109                 UIDefaults.LazyValue fallback = (UIDefaults.LazyValue)
2110                         SwingUtilities2.makeIcon(WindowsLookAndFeel.class,
2111                             BasicLookAndFeel.class, fallbackName);
2112                 icon = (Icon) fallback.createValue(table);
2113             }
2114             return icon;
2115         }
2116     }
2117 
2118     /**
2119      * Icon backed-up by XP Skin.
2120      */
2121     private static class SkinIcon implements Icon, UIResource {
2122         private final Part part;
2123         private final State state;
2124         SkinIcon(Part part, State state) {
2125             this.part = part;
2126             this.state = state;
2127         }
2128 
2129         /**
2130          * Draw the icon at the specified location.  Icon implementations
2131          * may use the Component argument to get properties useful for
2132          * painting, e.g. the foreground or background color.
2133          */
2134         public void paintIcon(Component c, Graphics g, int x, int y) {
2135             XPStyle xp = XPStyle.getXP();
2136             assert xp != null;
2137             if (xp != null) {
2138                 Skin skin = xp.getSkin(null, part);
2139                 skin.paintSkin(g, x, y, state);
2140             }
2141         }
2142 
2143         /**
2144          * Returns the icon's width.
2145          *
2146          * @return an int specifying the fixed width of the icon.
2147          */
2148         public int getIconWidth() {
2149             int width = 0;
2150             XPStyle xp = XPStyle.getXP();
2151             assert xp != null;
2152             if (xp != null) {
2153                 Skin skin = xp.getSkin(null, part);
2154                 width = skin.getWidth();
2155             }
2156             return width;
2157         }
2158 
2159         /**
2160          * Returns the icon's height.
2161          *
2162          * @return an int specifying the fixed height of the icon.
2163          */
2164         public int getIconHeight() {
2165             int height = 0;
2166             XPStyle xp = XPStyle.getXP();
2167             if (xp != null) {
2168                 Skin skin = xp.getSkin(null, part);
2169                 height = skin.getHeight();
2170             }
2171             return height;
2172         }
2173 
2174     }
2175 
2176     /**
2177      * DesktopProperty for fonts. If a font with the name 'MS Sans Serif'
2178      * is returned, it is mapped to 'Microsoft Sans Serif'.
2179      */
2180     private static class WindowsFontProperty extends DesktopProperty {
2181         WindowsFontProperty(String key, Object backup) {
2182             super(key, backup);
2183         }
2184 
2185         public void invalidate(LookAndFeel laf) {
2186             if ("win.defaultGUI.font.height".equals(getKey())) {
2187                 ((WindowsLookAndFeel)laf).style = null;
2188             }
2189             super.invalidate(laf);
2190         }
2191 
2192         protected Object configureValue(Object value) {
2193             if (value instanceof Font) {
2194                 Font font = (Font)value;
2195                 if ("MS Sans Serif".equals(font.getName())) {
2196                     int size = font.getSize();
2197                     // 4950968: Workaround to mimic the way Windows maps the default
2198                     // font size of 6 pts to the smallest available bitmap font size.
2199                     // This happens mostly on Win 98/Me & NT.
2200                     int dpi;
2201                     try {
2202                         dpi = Toolkit.getDefaultToolkit().getScreenResolution();
2203                     } catch (HeadlessException ex) {
2204                         dpi = 96;
2205                     }
2206                     if (Math.round(size * 72F / dpi) < 8) {
2207                         size = Math.round(8 * dpi / 72F);
2208                     }
2209                     Font msFont = new FontUIResource("Microsoft Sans Serif",
2210                                           font.getStyle(), size);
2211                     if (msFont.getName() != null &&
2212                         msFont.getName().equals(msFont.getFamily())) {
2213                         font = msFont;
2214                     } else if (size != font.getSize()) {
2215                         font = new FontUIResource("MS Sans Serif",
2216                                                   font.getStyle(), size);
2217                     }
2218                 }
2219 
2220                 if (FontUtilities.fontSupportsDefaultEncoding(font)) {
2221                     if (!(font instanceof UIResource)) {
2222                         font = new FontUIResource(font);
2223                     }
2224                 }
2225                 else {
2226                     font = FontUtilities.getCompositeFontUIResource(font);
2227                 }
2228                 return font;
2229 
2230             }
2231             return super.configureValue(value);
2232         }
2233     }
2234 
2235 
2236     /**
2237      * DesktopProperty for fonts that only gets sizes from the desktop,
2238      * font name and style are passed into the constructor
2239      */
2240     private static class WindowsFontSizeProperty extends DesktopProperty {
2241         private String fontName;
2242         private int fontSize;
2243         private int fontStyle;
2244 
2245         WindowsFontSizeProperty(String key, String fontName,
2246                                 int fontStyle, int fontSize) {
2247             super(key, null);
2248             this.fontName = fontName;
2249             this.fontSize = fontSize;
2250             this.fontStyle = fontStyle;
2251         }
2252 
2253         protected Object configureValue(Object value) {
2254             if (value == null) {
2255                 value = new FontUIResource(fontName, fontStyle, fontSize);
2256             }
2257             else if (value instanceof Integer) {
2258                 value = new FontUIResource(fontName, fontStyle,
2259                                            ((Integer)value).intValue());
2260             }
2261             return value;
2262         }
2263     }
2264 
2265 
2266     /**
2267      * A value wrapper that actively retrieves values from xp or falls back
2268      * to the classic value if not running XP styles.
2269      */
2270     private static class XPValue implements UIDefaults.ActiveValue {
2271         protected Object classicValue, xpValue;
2272 
2273         // A constant that lets you specify null when using XP styles.
2274         private final static Object NULL_VALUE = new Object();
2275 
2276         XPValue(Object xpValue, Object classicValue) {
2277             this.xpValue = xpValue;
2278             this.classicValue = classicValue;
2279         }
2280 
2281         public Object createValue(UIDefaults table) {
2282             Object value = null;
2283             if (XPStyle.getXP() != null) {
2284                 value = getXPValue(table);
2285             }
2286 
2287             if (value == null) {
2288                 value = getClassicValue(table);
2289             } else if (value == NULL_VALUE) {
2290                 value = null;
2291             }
2292 
2293             return value;
2294         }
2295 
2296         protected Object getXPValue(UIDefaults table) {
2297             return recursiveCreateValue(xpValue, table);
2298         }
2299 
2300         protected Object getClassicValue(UIDefaults table) {
2301             return recursiveCreateValue(classicValue, table);
2302         }
2303 
2304         private Object recursiveCreateValue(Object value, UIDefaults table) {
2305             if (value instanceof UIDefaults.LazyValue) {
2306                 value = ((UIDefaults.LazyValue)value).createValue(table);
2307             }
2308             if (value instanceof UIDefaults.ActiveValue) {
2309                 return ((UIDefaults.ActiveValue)value).createValue(table);
2310             } else {
2311                 return value;
2312             }
2313         }
2314     }
2315 
2316     private static class XPBorderValue extends XPValue {
2317         private final Border extraMargin;
2318 
2319         XPBorderValue(Part xpValue, Object classicValue) {
2320             this(xpValue, classicValue, null);
2321         }
2322 
2323         XPBorderValue(Part xpValue, Object classicValue, Border extraMargin) {
2324             super(xpValue, classicValue);
2325             this.extraMargin = extraMargin;
2326         }
2327 
2328         public Object getXPValue(UIDefaults table) {
2329             XPStyle xp = XPStyle.getXP();
2330             Border xpBorder = xp != null ? xp.getBorder(null, (Part)xpValue) : null;
2331             if (xpBorder != null && 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             XPStyle xp = XPStyle.getXP();
2348             return xp != null ? xp.getColor(key.skin, key.prop, null) : null;
2349         }
2350 
2351         private static class XPColorValueKey {
2352             Skin skin;
2353             Prop prop;
2354 
2355             XPColorValueKey(Part part, State state, Prop prop) {
2356                 this.skin = new Skin(part, state);
2357                 this.prop = prop;
2358             }
2359         }
2360     }
2361 
2362     private class XPDLUValue extends XPValue {
2363         private int direction;
2364 
2365         XPDLUValue(int xpdlu, int classicdlu, int direction) {
2366             super(Integer.valueOf(xpdlu), Integer.valueOf(classicdlu));
2367             this.direction = direction;
2368         }
2369 
2370         public Object getXPValue(UIDefaults table) {
2371             int px = dluToPixels(((Integer)xpValue).intValue(), direction);
2372             return Integer.valueOf(px);
2373         }
2374 
2375         public Object getClassicValue(UIDefaults table) {
2376             int px = dluToPixels(((Integer)classicValue).intValue(), direction);
2377             return Integer.valueOf(px);
2378         }
2379     }
2380 
2381     private class TriggerDesktopProperty extends DesktopProperty {
2382         TriggerDesktopProperty(String key) {
2383             super(key, null);
2384             // This call adds a property change listener for the property,
2385             // which triggers a call to updateUI(). The value returned
2386             // is not interesting here.
2387             getValueFromDesktop();
2388         }
2389 
2390         protected void updateUI() {
2391             super.updateUI();
2392 
2393             // Make sure property change listener is readded each time
2394             getValueFromDesktop();
2395         }
2396     }
2397 
2398     private class FontDesktopProperty extends TriggerDesktopProperty {
2399         FontDesktopProperty(String key) {
2400             super(key);
2401         }
2402 
2403         protected void updateUI() {
2404             Object aaTextInfo = SwingUtilities2.AATextInfo.getAATextInfo(true);
2405             UIDefaults defaults = UIManager.getLookAndFeelDefaults();
2406             defaults.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, aaTextInfo);
2407             super.updateUI();
2408         }
2409     }
2410 
2411     // Windows LayoutStyle.  From:
2412     // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwue/html/ch14e.asp
2413     @SuppressWarnings("fallthrough")
2414     private class WindowsLayoutStyle extends DefaultLayoutStyle {
2415         @Override
2416         public int getPreferredGap(JComponent component1,
2417                 JComponent component2, ComponentPlacement type, int position,
2418                 Container parent) {
2419             // Checks args
2420             super.getPreferredGap(component1, component2, type, position,
2421                                   parent);
2422 
2423             switch(type) {
2424             case INDENT:
2425                 // Windows doesn't spec this
2426                 if (position == SwingConstants.EAST ||
2427                         position == SwingConstants.WEST) {
2428                     int indent = getIndent(component1, position);
2429                     if (indent > 0) {
2430                         return indent;
2431                     }
2432                     return 10;
2433                 }
2434                 // Fall through to related.
2435             case RELATED:
2436                 if (isLabelAndNonlabel(component1, component2, position)) {
2437                     // Between text labels and their associated controls (for
2438                     // example, text boxes and list boxes): 3
2439                     // NOTE: We're not honoring:
2440                     // 'Text label beside a button 3 down from the top of
2441                     // the button,' but I suspect that is an attempt to
2442                     // enforce a baseline layout which will be handled
2443                     // separately.  In order to enforce this we would need
2444                     // this API to return a more complicated type (Insets,
2445                     // or something else).
2446                     return getButtonGap(component1, component2, position,
2447                                         dluToPixels(3, position));
2448                 }
2449                 // Between related controls: 4
2450                 return getButtonGap(component1, component2, position,
2451                                     dluToPixels(4, position));
2452             case UNRELATED:
2453                 // Between unrelated controls: 7
2454                 return getButtonGap(component1, component2, position,
2455                                     dluToPixels(7, position));
2456             }
2457             return 0;
2458         }
2459 
2460         @Override
2461         public int getContainerGap(JComponent component, int position,
2462                                    Container parent) {
2463             // Checks args
2464             super.getContainerGap(component, position, parent);
2465             return getButtonGap(component, position, dluToPixels(7, position));
2466         }
2467 
2468     }
2469 
2470     /**
2471      * Converts the dialog unit argument to pixels along the specified
2472      * axis.
2473      */
2474     private int dluToPixels(int dlu, int direction) {
2475         if (baseUnitX == 0) {
2476             calculateBaseUnits();
2477         }
2478         if (direction == SwingConstants.EAST ||
2479             direction == SwingConstants.WEST) {
2480             return dlu * baseUnitX / 4;
2481         }
2482         assert (direction == SwingConstants.NORTH ||
2483                 direction == SwingConstants.SOUTH);
2484         return dlu * baseUnitY / 8;
2485     }
2486 
2487     /**
2488      * Calculates the dialog unit mapping.
2489      */
2490     private void calculateBaseUnits() {
2491         // This calculation comes from:
2492         // http://support.microsoft.com/default.aspx?scid=kb;EN-US;125681
2493         FontMetrics metrics = Toolkit.getDefaultToolkit().getFontMetrics(
2494                 UIManager.getFont("Button.font"));
2495         baseUnitX = metrics.stringWidth(
2496                 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
2497         baseUnitX = (baseUnitX / 26 + 1) / 2;
2498         // The -1 comes from experimentation.
2499         baseUnitY = metrics.getAscent() + metrics.getDescent() - 1;
2500     }
2501 
2502     /**
2503      * {@inheritDoc}
2504      *
2505      * @since 1.6
2506      */
2507     public Icon getDisabledIcon(JComponent component, Icon icon) {
2508         // if the component has a HI_RES_DISABLED_ICON_CLIENT_KEY
2509         // client property set to Boolean.TRUE, then use the new
2510         // hi res algorithm for creating the disabled icon (used
2511         // in particular by the WindowsFileChooserUI class)
2512         if (icon != null
2513                 && component != null
2514                 && Boolean.TRUE.equals(component.getClientProperty(HI_RES_DISABLED_ICON_CLIENT_KEY))
2515                 && icon.getIconWidth() > 0
2516                 && icon.getIconHeight() > 0) {
2517             BufferedImage img = new BufferedImage(icon.getIconWidth(),
2518                     icon.getIconWidth(), BufferedImage.TYPE_INT_ARGB);
2519             icon.paintIcon(component, img.getGraphics(), 0, 0);
2520             ImageFilter filter = new RGBGrayFilter();
2521             ImageProducer producer = new FilteredImageSource(img.getSource(), filter);
2522             Image resultImage = component.createImage(producer);
2523             return new ImageIconUIResource(resultImage);
2524         }
2525         return super.getDisabledIcon(component, icon);
2526     }
2527 
2528     private static class RGBGrayFilter extends RGBImageFilter {
2529         public RGBGrayFilter() {
2530             canFilterIndexColorModel = true;
2531         }
2532         public int filterRGB(int x, int y, int rgb) {
2533             // find the average of red, green, and blue
2534             float avg = (((rgb >> 16) & 0xff) / 255f +
2535                           ((rgb >>  8) & 0xff) / 255f +
2536                            (rgb        & 0xff) / 255f) / 3;
2537             // pull out the alpha channel
2538             float alpha = (((rgb>>24)&0xff)/255f);
2539             // calc the average
2540             avg = Math.min(1.0f, (1f-avg)/(100.0f/35.0f) + avg);
2541             // turn back into rgb
2542             int rgbval = (int)(alpha * 255f) << 24 |
2543                          (int)(avg   * 255f) << 16 |
2544                          (int)(avg   * 255f) <<  8 |
2545                          (int)(avg   * 255f);
2546             return rgbval;
2547         }
2548     }
2549 
2550     private static class FocusColorProperty extends DesktopProperty {
2551         public FocusColorProperty () {
2552             // Fallback value is never used because of the configureValue method doesn't return null
2553             super("win.3d.backgroundColor", Color.BLACK);
2554         }
2555 
2556         @Override
2557         protected Object configureValue(Object value) {
2558             Object highContrastOn = Toolkit.getDefaultToolkit().
2559                     getDesktopProperty("win.highContrast.on");
2560             if (highContrastOn == null || !((Boolean) highContrastOn).booleanValue()) {
2561                 return Color.BLACK;
2562             }
2563             return Color.BLACK.equals(value) ? Color.WHITE : Color.BLACK;
2564         }
2565     }
2566 
2567 }