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