# HG changeset patch
# User aivanov
# Date 1402062692 -14400
# Node ID cd4631f0afdc0a81b3e9f1cd5586f80cf04ea2ef
# Parent ee53c90dfeb10c0186846f183984a70e5118ba18
8039383: NPE when changing Windows theme
Reviewed-by: pchelko, anthony
diff -r ee53c90dfeb1 -r cd4631f0afdc jdk/src/share/classes/com/sun/java/swing/plaf/windows/AnimationController.java
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/AnimationController.java Fri Jun 06 14:58:41 2014 +0400
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/AnimationController.java Fri Jun 06 17:51:32 2014 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -130,11 +130,14 @@
//one second seems plausible value
duration = 1000;
} else {
- duration = XPStyle.getXP().getThemeTransitionDuration(
- c, part,
- normalizeState(oldState),
- normalizeState(newState),
- Prop.TRANSITIONDURATIONS);
+ XPStyle xp = XPStyle.getXP();
+ duration = (xp != null)
+ ? xp.getThemeTransitionDuration(
+ c, part,
+ normalizeState(oldState),
+ normalizeState(newState),
+ Prop.TRANSITIONDURATIONS)
+ : 1000;
}
controller.startAnimation(c, part, oldState, newState, duration);
}
diff -r ee53c90dfeb1 -r cd4631f0afdc jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsComboBoxUI.java
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsComboBoxUI.java Fri Jun 06 14:58:41 2014 +0400
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsComboBoxUI.java Fri Jun 06 17:51:32 2014 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -37,6 +37,7 @@
import static com.sun.java.swing.plaf.windows.TMSchema.Part;
import static com.sun.java.swing.plaf.windows.TMSchema.State;
import static com.sun.java.swing.plaf.windows.XPStyle.Skin;
+
import sun.swing.DefaultLookup;
import sun.swing.StringUIClientPropertyKey;
@@ -231,6 +232,9 @@
private void paintXPComboBoxBackground(Graphics g, JComponent c) {
XPStyle xp = XPStyle.getXP();
+ if (xp == null) {
+ return;
+ }
State state = getXPComboBoxState(c);
Skin skin = null;
if (! comboBox.isEditable()
@@ -400,8 +404,9 @@
* @return a button which represents the popup control
*/
protected JButton createArrowButton() {
- if (XPStyle.getXP() != null) {
- return new XPComboBoxButton();
+ XPStyle xp = XPStyle.getXP();
+ if (xp != null) {
+ return new XPComboBoxButton(xp);
} else {
return super.createArrowButton();
}
@@ -409,9 +414,9 @@
@SuppressWarnings("serial") // Superclass is not serializable across versions
private class XPComboBoxButton extends XPStyle.GlyphButton {
- public XPComboBoxButton() {
+ public XPComboBoxButton(XPStyle xp) {
super(null,
- (! XPStyle.getXP().isSkinDefined(comboBox, Part.CP_DROPDOWNBUTTONRIGHT))
+ (! xp.isSkinDefined(comboBox, Part.CP_DROPDOWNBUTTONRIGHT))
? Part.CP_DROPDOWNBUTTON
: (comboBox.getComponentOrientation() == ComponentOrientation.RIGHT_TO_LEFT)
? Part.CP_DROPDOWNBUTTONLEFT
@@ -424,10 +429,11 @@
protected State getState() {
State rv;
rv = super.getState();
+ XPStyle xp = XPStyle.getXP();
if (rv != State.DISABLED
&& comboBox != null && ! comboBox.isEditable()
- && XPStyle.getXP().isSkinDefined(comboBox,
- Part.CP_DROPDOWNBUTTONRIGHT)) {
+ && xp != null && xp.isSkinDefined(comboBox,
+ Part.CP_DROPDOWNBUTTONRIGHT)) {
/*
* for non editable ComboBoxes Vista seems to have the
* same glyph for all non DISABLED states
diff -r ee53c90dfeb1 -r cd4631f0afdc jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsGraphicsUtils.java
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsGraphicsUtils.java Fri Jun 06 14:58:41 2014 +0400
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsGraphicsUtils.java Fri Jun 06 17:51:32 2014 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -125,6 +125,9 @@
static void paintXPText(AbstractButton b, Part part, State state,
Graphics g, int x, int y, String text, int mnemIndex) {
XPStyle xp = XPStyle.getXP();
+ if (xp == null) {
+ return;
+ }
Color textColor = b.getForeground();
if (textColor instanceof UIResource) {
diff -r ee53c90dfeb1 -r cd4631f0afdc jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java Fri Jun 06 14:58:41 2014 +0400
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java Fri Jun 06 17:51:32 2014 +0400
@@ -623,8 +623,8 @@
@SuppressWarnings("serial") // Same-version serialization only
private static class MenuArrowIcon implements Icon, UIResource, Serializable {
public void paintIcon(Component c, Graphics g, int x, int y) {
- if (WindowsMenuItemUI.isVistaPainting()) {
- XPStyle xp = XPStyle.getXP();
+ XPStyle xp = XPStyle.getXP();
+ if (xp != null && WindowsMenuItemUI.isVistaPainting()) {
State state = State.NORMAL;
if (c instanceof JMenuItem) {
state = ((JMenuItem) c).getModel().isEnabled()
@@ -657,16 +657,18 @@
}
}
public int getIconWidth() {
- if (WindowsMenuItemUI.isVistaPainting()) {
- Skin skin = XPStyle.getXP().getSkin(null, Part.MP_POPUPSUBMENU);
+ XPStyle xp = XPStyle.getXP();
+ if (xp != null && WindowsMenuItemUI.isVistaPainting()) {
+ Skin skin = xp.getSkin(null, Part.MP_POPUPSUBMENU);
return skin.getWidth();
} else {
return 4;
}
}
public int getIconHeight() {
- if (WindowsMenuItemUI.isVistaPainting()) {
- Skin skin = XPStyle.getXP().getSkin(null, Part.MP_POPUPSUBMENU);
+ XPStyle xp = XPStyle.getXP();
+ if (xp != null && WindowsMenuItemUI.isVistaPainting()) {
+ Skin skin = xp.getSkin(null, Part.MP_POPUPSUBMENU);
return skin.getHeight();
} else {
return 8;
@@ -692,7 +694,8 @@
}
static int getIconWidth() {
- return XPStyle.getXP().getSkin(null, Part.MP_POPUPCHECK).getWidth()
+ XPStyle xp = XPStyle.getXP();
+ return ((xp != null) ? xp.getSkin(null, Part.MP_POPUPCHECK).getWidth() : 16)
+ 2 * OFFSET;
}
@@ -756,12 +759,17 @@
Icon icon = getIcon();
int height = 0;
if (icon != null) {
- height = icon.getIconHeight() + 2 * OFFSET;
+ height = icon.getIconHeight();
} else {
- Skin skin =
- XPStyle.getXP().getSkin(null, Part.MP_POPUPCHECK);
- height = skin.getHeight() + 2 * OFFSET;
+ XPStyle xp = XPStyle.getXP();
+ if (xp != null) {
+ Skin skin = xp.getSkin(null, Part.MP_POPUPCHECK);
+ height = skin.getHeight();
+ } else {
+ height = 16;
+ }
}
+ height += 2 * OFFSET;
return height;
}
@@ -809,14 +817,16 @@
? State.BULLETDISABLED
: State.CHECKMARKDISABLED;
}
- Skin skin;
XPStyle xp = XPStyle.getXP();
- skin = xp.getSkin(c, backgroundPart);
- skin.paintSkin(g, x, y,
- getIconWidth(), getIconHeight(), backgroundState);
- if (icon == null) {
- skin = xp.getSkin(c, part);
- skin.paintSkin(g, x + OFFSET, y + OFFSET, state);
+ if (xp != null) {
+ Skin skin;
+ skin = xp.getSkin(c, backgroundPart);
+ skin.paintSkin(g, x, y,
+ getIconWidth(), getIconHeight(), backgroundState);
+ if (icon == null) {
+ skin = xp.getSkin(c, part);
+ skin.paintSkin(g, x + OFFSET, y + OFFSET, state);
+ }
}
}
}
diff -r ee53c90dfeb1 -r cd4631f0afdc jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsInternalFrameTitlePane.java
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsInternalFrameTitlePane.java Fri Jun 06 14:58:41 2014 +0400
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsInternalFrameTitlePane.java Fri Jun 06 17:51:32 2014 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -86,14 +86,15 @@
}
} else {
buttonWidth += 2;
- selectedTitleGradientColor =
- UIManager.getColor("InternalFrame.activeTitleGradient");
- notSelectedTitleGradientColor =
- UIManager.getColor("InternalFrame.inactiveTitleGradient");
Color activeBorderColor =
UIManager.getColor("InternalFrame.activeBorderColor");
setBorder(BorderFactory.createLineBorder(activeBorderColor, 1));
}
+ // JDK-8039383: initialize these colors because getXP() may return null when theme is changed
+ selectedTitleGradientColor =
+ UIManager.getColor("InternalFrame.activeTitleGradient");
+ notSelectedTitleGradientColor =
+ UIManager.getColor("InternalFrame.inactiveTitleGradient");
}
protected void uninstallListeners() {
@@ -388,7 +389,7 @@
public class WindowsTitlePaneLayout extends BasicInternalFrameTitlePane.TitlePaneLayout {
private Insets captionMargin = null;
private Insets contentMargin = null;
- private XPStyle xp = XPStyle.getXP();
+ private final XPStyle xp = XPStyle.getXP();
WindowsTitlePaneLayout() {
if (xp != null) {
diff -r ee53c90dfeb1 -r cd4631f0afdc jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java Fri Jun 06 14:58:41 2014 +0400
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java Fri Jun 06 17:51:32 2014 +0400
@@ -2327,8 +2327,9 @@
}
public Object getXPValue(UIDefaults table) {
- Border xpBorder = XPStyle.getXP().getBorder(null, (Part)xpValue);
- if (extraMargin != null) {
+ XPStyle xp = XPStyle.getXP();
+ Border xpBorder = xp != null ? xp.getBorder(null, (Part)xpValue) : null;
+ if (xpBorder != null && extraMargin != null) {
return new BorderUIResource.
CompoundBorderUIResource(xpBorder, extraMargin);
} else {
@@ -2344,7 +2345,8 @@
public Object getXPValue(UIDefaults table) {
XPColorValueKey key = (XPColorValueKey)xpValue;
- return XPStyle.getXP().getColor(key.skin, key.prop, null);
+ XPStyle xp = XPStyle.getXP();
+ return xp != null ? xp.getColor(key.skin, key.prop, null) : null;
}
private static class XPColorValueKey {
diff -r ee53c90dfeb1 -r cd4631f0afdc jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuBarUI.java
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuBarUI.java Fri Jun 06 14:58:41 2014 +0400
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuBarUI.java Fri Jun 06 17:51:32 2014 +0400
@@ -156,8 +156,8 @@
@Override
public void paint(Graphics g, JComponent c) {
- if (WindowsMenuItemUI.isVistaPainting()) {
- XPStyle xp = XPStyle.getXP();
+ XPStyle xp = XPStyle.getXP();
+ if (xp != null && WindowsMenuItemUI.isVistaPainting()) {
Skin skin;
skin = xp.getSkin(c, Part.MP_BARBACKGROUND);
int width = c.getWidth();
diff -r ee53c90dfeb1 -r cd4631f0afdc jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java Fri Jun 06 14:58:41 2014 +0400
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java Fri Jun 06 17:51:32 2014 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -109,7 +109,8 @@
static void paintBackground(WindowsMenuItemUIAccessor menuItemUI,
Graphics g, JMenuItem menuItem, Color bgColor) {
assert isVistaPainting();
- if (isVistaPainting()) {
+ XPStyle xp = XPStyle.getXP();
+ if (xp != null && isVistaPainting()) {
int menuWidth = menuItem.getWidth();
int menuHeight = menuItem.getHeight();
if (menuItem.isOpaque()) {
@@ -118,7 +119,6 @@
g.fillRect(0,0, menuWidth, menuHeight);
g.setColor(oldColor);
}
- XPStyle xp = XPStyle.getXP();
Part part = menuItemUI.getPart(menuItem);
Skin skin = xp.getSkin(menuItem, part);
skin.paintSkin(g, 0 , 0,
diff -r ee53c90dfeb1 -r cd4631f0afdc jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsPopupMenuSeparatorUI.java
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsPopupMenuSeparatorUI.java Fri Jun 06 14:58:41 2014 +0400
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsPopupMenuSeparatorUI.java Fri Jun 06 17:51:32 2014 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -50,7 +50,8 @@
public void paint(Graphics g, JComponent c) {
Dimension s = c.getSize();
- if (WindowsMenuItemUI.isVistaPainting()) {
+ XPStyle xp = XPStyle.getXP();
+ if (xp != null && WindowsMenuItemUI.isVistaPainting()) {
int x = 1;
Component parent = c.getParent();
if (parent instanceof JComponent) {
@@ -67,7 +68,7 @@
x += WindowsPopupMenuUI.getGutterWidth();
}
}
- Skin skin = XPStyle.getXP().getSkin(c, Part.MP_POPUPSEPARATOR);
+ Skin skin = xp.getSkin(c, Part.MP_POPUPSEPARATOR);
int skinHeight = skin.getHeight();
int y = (s.height - skinHeight) / 2;
skin.paintSkin(g, x, y, s.width - x - 1, skinHeight, State.NORMAL);
diff -r ee53c90dfeb1 -r cd4631f0afdc jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsPopupMenuUI.java
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsPopupMenuUI.java Fri Jun 06 14:58:41 2014 +0400
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsPopupMenuUI.java Fri Jun 06 17:51:32 2014 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -194,8 +194,8 @@
@Override
public void paint(Graphics g, JComponent c) {
- if (WindowsMenuItemUI.isVistaPainting()) {
- XPStyle xp = XPStyle.getXP();
+ XPStyle xp = XPStyle.getXP();
+ if (xp != null && WindowsMenuItemUI.isVistaPainting()) {
Skin skin = xp.getSkin(c, Part.MP_POPUPBACKGROUND);
skin.paintSkin(g, 0, 0, c.getWidth(),c.getHeight(), State.NORMAL);
int textOffset = getTextOffset(c);
diff -r ee53c90dfeb1 -r cd4631f0afdc jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsProgressBarUI.java
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsProgressBarUI.java Fri Jun 06 14:58:41 2014 +0400
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsProgressBarUI.java Fri Jun 06 17:51:32 2014 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -322,8 +322,9 @@
private Rectangle getFullChunkBounds(Rectangle box) {
boolean vertical = (progressBar.getOrientation() == JProgressBar.VERTICAL);
XPStyle xp = XPStyle.getXP();
- int gap = xp.getInt(progressBar, Part.PP_PROGRESS, null,
- Prop.PROGRESSSPACESIZE, 0);
+ int gap = (xp != null) ? xp.getInt(progressBar, Part.PP_PROGRESS,
+ null, Prop.PROGRESSSPACESIZE, 0)
+ : 0;
if (!vertical) {
int chunksize = box.width+gap;
@@ -338,6 +339,9 @@
boolean vertical,
int bgwidth, int bgheight) {
XPStyle xp = XPStyle.getXP();
+ if (xp == null) {
+ return;
+ }
// create a new graphics to keep drawing surface state
Graphics2D gfx = (Graphics2D)g.create();
@@ -396,6 +400,9 @@
private void paintXPBackground(Graphics g, boolean vertical,
int barRectWidth, int barRectHeight) {
XPStyle xp = XPStyle.getXP();
+ if (xp == null) {
+ return;
+ }
Part part = vertical ? Part.PP_BARVERT : Part.PP_BAR;
Skin skin = xp.getSkin(progressBar, part);
diff -r ee53c90dfeb1 -r cd4631f0afdc jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsSliderUI.java
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsSliderUI.java Fri Jun 06 14:58:41 2014 +0400
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsSliderUI.java Fri Jun 06 17:51:32 2014 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -215,7 +215,6 @@
}
private Part getXPThumbPart() {
- XPStyle xp = XPStyle.getXP();
Part part;
boolean vertical = (slider.getOrientation() == JSlider.VERTICAL);
boolean leftToRight = slider.getComponentOrientation().isLeftToRight();
diff -r ee53c90dfeb1 -r cd4631f0afdc jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsSpinnerUI.java
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsSpinnerUI.java Fri Jun 06 14:58:41 2014 +0400
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsSpinnerUI.java Fri Jun 06 17:51:32 2014 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -63,6 +63,9 @@
private void paintXPBackground(Graphics g, JComponent c) {
XPStyle xp = XPStyle.getXP();
+ if (xp == null) {
+ return;
+ }
Skin skin = xp.getSkin(c, Part.EP_EDIT);
State state = getXPState(c);
skin.paintSkin(g, 0, 0, c.getWidth(), c.getHeight(), state);
diff -r ee53c90dfeb1 -r cd4631f0afdc jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsTableHeaderUI.java
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsTableHeaderUI.java Fri Jun 06 14:58:41 2014 +0400
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsTableHeaderUI.java Fri Jun 06 17:51:32 2014 +0400
@@ -91,9 +91,10 @@
this.column = column;
this.hasRollover = (column == getRolloverColumn());
if (skin == null) {
- skin = XPStyle.getXP().getSkin(header, Part.HP_HEADERITEM);
+ XPStyle xp = XPStyle.getXP();
+ skin = (xp != null) ? xp.getSkin(header, Part.HP_HEADERITEM) : null;
}
- Insets margins = skin.getContentMargin();
+ Insets margins = (skin != null) ? skin.getContentMargin() : null;
Border border = null;
int contentTop = 0;
int contentLeft = 0;
diff -r ee53c90dfeb1 -r cd4631f0afdc jdk/src/share/classes/com/sun/java/swing/plaf/windows/XPStyle.java
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/XPStyle.java Fri Jun 06 14:58:41 2014 +0400
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/XPStyle.java Fri Jun 06 17:51:32 2014 +0400
@@ -52,6 +52,7 @@
import sun.awt.image.SunWritableRaster;
import sun.awt.windows.ThemeReader;
+import sun.awt.windows.WToolkit;
import sun.security.action.GetPropertyAction;
import sun.swing.CachedPainter;
@@ -99,7 +100,7 @@
if (themeActive == null) {
Toolkit toolkit = Toolkit.getDefaultToolkit();
themeActive =
- (Boolean)toolkit.getDesktopProperty("win.xpstyle.themeActive");
+ (Boolean)toolkit.getDesktopProperty(WToolkit.XPSTYLE_THEME_ACTIVE);
if (themeActive == null) {
themeActive = Boolean.FALSE;
}
@@ -115,7 +116,7 @@
}
}
}
- return xp;
+ return ThemeReader.isXPStyleEnabled() ? xp : null;
}
static boolean isVista() {
@@ -180,9 +181,10 @@
* should probably be cached there instead of here.
*/
Dimension getDimension(Component c, Part part, State state, Prop prop) {
- return ThemeReader.getPosition(part.getControlName(c), part.getValue(),
- State.getValue(part, state),
- prop.getValue());
+ Dimension d = ThemeReader.getPosition(part.getControlName(c), part.getValue(),
+ State.getValue(part, state),
+ prop.getValue());
+ return (d != null) ? d : new Dimension();
}
/** Get a named Point
(e.g. a location or an offset) value
@@ -199,11 +201,7 @@
Dimension d = ThemeReader.getPosition(part.getControlName(c), part.getValue(),
State.getValue(part, state),
prop.getValue());
- if (d != null) {
- return new Point(d.width, d.height);
- } else {
- return null;
- }
+ return (d != null) ? new Point(d.width, d.height) : new Point();
}
/** Get a named Insets
value from the current style
@@ -217,9 +215,10 @@
* The return value is already cached in those places.
*/
Insets getMargin(Component c, Part part, State state, Prop prop) {
- return ThemeReader.getThemeMargins(part.getControlName(c), part.getValue(),
- State.getValue(part, state),
- prop.getValue());
+ Insets insets = ThemeReader.getThemeMargins(part.getControlName(c), part.getValue(),
+ State.getValue(part, state),
+ prop.getValue());
+ return (insets != null) ? insets : new Insets(0, 0, 0, 0);
}
@@ -509,16 +508,17 @@
int boundingWidth = 100;
int boundingHeight = 100;
- return ThemeReader.getThemeBackgroundContentMargins(
+ Insets insets = ThemeReader.getThemeBackgroundContentMargins(
part.getControlName(null), part.getValue(),
0, boundingWidth, boundingHeight);
+ return (insets != null) ? insets : new Insets(0, 0, 0, 0);
}
private int getWidth(State state) {
if (size == null) {
size = getPartSize(part, state);
}
- return size.width;
+ return (size != null) ? size.width : 0;
}
int getWidth() {
@@ -529,7 +529,7 @@
if (size == null) {
size = getPartSize(part, state);
}
- return size.height;
+ return (size != null) ? size.height : 0;
}
int getHeight() {
@@ -586,6 +586,9 @@
* @param state which state to paint
*/
void paintSkin(Graphics g, int dx, int dy, int dw, int dh, State state) {
+ if (XPStyle.getXP() == null) {
+ return;
+ }
if (ThemeReader.isGetThemeTransitionDurationDefined()
&& component instanceof JComponent
&& SwingUtilities.getAncestorOfClass(CellRendererPane.class,
@@ -611,6 +614,9 @@
* @param state which state to paint
*/
void paintSkinRaw(Graphics g, int dx, int dy, int dw, int dh, State state) {
+ if (XPStyle.getXP() == null) {
+ return;
+ }
skinPainter.paint(null, g, dx, dy, dw, dh, this, state);
}
@@ -630,7 +636,7 @@
void paintSkin(Graphics g, int dx, int dy, int dw, int dh, State state,
boolean borderFill) {
if(borderFill && "borderfill".equals(getTypeEnumName(component, part,
- state, Prop.BGTYPE))) {
+ state, Prop.BGTYPE)) && XPStyle.getXP() == null) {
return;
}
skinPainter.paint(null, g, dx, dy, dw, dh, this, state);
@@ -684,7 +690,7 @@
public GlyphButton(Component parent, Part part) {
XPStyle xp = getXP();
- skin = xp.getSkin(parent, part);
+ skin = xp != null ? xp.getSkin(parent, part) : null;
setBorder(null);
setContentAreaFilled(false);
setMinimumSize(new Dimension(5, 5));
@@ -709,13 +715,16 @@
}
public void paintComponent(Graphics g) {
+ if (XPStyle.getXP() == null || skin == null) {
+ return;
+ }
Dimension d = getSize();
skin.paintSkin(g, 0, 0, d.width, d.height, getState());
}
public void setPart(Component parent, Part part) {
XPStyle xp = getXP();
- skin = xp.getSkin(parent, part);
+ skin = xp != null ? xp.getSkin(parent, part) : null;
revalidate();
repaint();
}
diff -r ee53c90dfeb1 -r cd4631f0afdc jdk/src/windows/classes/sun/awt/windows/ThemeReader.java
--- a/jdk/src/windows/classes/sun/awt/windows/ThemeReader.java Fri Jun 06 14:58:41 2014 +0400
+++ b/jdk/src/windows/classes/sun/awt/windows/ThemeReader.java Fri Jun 06 17:51:32 2014 +0400
@@ -61,6 +61,8 @@
private static final Lock readLock = readWriteLock.readLock();
private static final Lock writeLock = readWriteLock.writeLock();
+ static volatile boolean xpStyleEnabled;
+
static void flush() {
writeLock.lock();
try {
@@ -76,6 +78,10 @@
public static native boolean isThemed();
+ public static boolean isXPStyleEnabled() {
+ return xpStyleEnabled;
+ }
+
// this should be called only with writeLock held
private static Long getThemeImpl(String widget) {
Long theme = widgetToTheme.get(widget);
diff -r ee53c90dfeb1 -r cd4631f0afdc jdk/src/windows/classes/sun/awt/windows/WToolkit.java
--- a/jdk/src/windows/classes/sun/awt/windows/WToolkit.java Fri Jun 06 14:58:41 2014 +0400
+++ b/jdk/src/windows/classes/sun/awt/windows/WToolkit.java Fri Jun 06 17:51:32 2014 +0400
@@ -72,6 +72,9 @@
private static final PlatformLogger log = PlatformLogger.getLogger("sun.awt.windows.WToolkit");
+ // Desktop property which specifies whether XP visual styles are in effect
+ public static final String XPSTYLE_THEME_ACTIVE = "win.xpstyle.themeActive";
+
static GraphicsConfiguration config;
// System clipboard.
@@ -894,7 +897,7 @@
private synchronized void lazilyInitWProps() {
if (wprops == null) {
wprops = new WDesktopProperties(this);
- updateProperties();
+ updateProperties(wprops.getProperties());
}
}
@@ -929,21 +932,27 @@
* Windows doesn't always send WM_SETTINGCHANGE when it should.
*/
private void windowsSettingChange() {
+ // JDK-8039383: Have to update the value of XPSTYLE_THEME_ACTIVE property
+ // as soon as possible to prevent NPE and other errors because theme data
+ // has become unavailable.
+ final Map props = getWProps();
+ updateXPStyleEnabled(props.get(XPSTYLE_THEME_ACTIVE));
+
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
- updateProperties();
+ updateProperties(props);
}
});
}
- private synchronized void updateProperties() {
- if (null == wprops) {
- // wprops has not been initialized, so we have nothing to update
+ private synchronized void updateProperties(final Map props) {
+ if (null == props) {
return;
}
- Map props = wprops.getProperties();
+ updateXPStyleEnabled(props.get(XPSTYLE_THEME_ACTIVE));
+
for (String propName : props.keySet()) {
Object val = props.get(propName);
if (log.isLoggable(PlatformLogger.Level.FINER)) {
@@ -953,6 +962,14 @@
}
}
+ private synchronized Map getWProps() {
+ return (wprops != null) ? wprops.getProperties() : null;
+ }
+
+ private void updateXPStyleEnabled(final Object dskProp) {
+ ThemeReader.xpStyleEnabled = Boolean.TRUE.equals(dskProp);
+ }
+
@Override
public synchronized void addPropertyChangeListener(String name, PropertyChangeListener pcl) {
if (name == null) {