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