--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaCaret.java Tue Sep 08 22:14:25 2015 +0000
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaCaret.java Tue Sep 08 15:19:19 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2015, 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
@@ -36,19 +36,27 @@
import javax.swing.text.*;
@SuppressWarnings("serial") // Superclass is not serializable across versions
-public class AquaCaret extends DefaultCaret implements UIResource, PropertyChangeListener {
- final boolean isMultiLineEditor;
- final JTextComponent c;
-
- boolean mFocused = false;
+public class AquaCaret extends DefaultCaret
+ implements UIResource, PropertyChangeListener {
- public AquaCaret(final Window inParentWindow, final JTextComponent inComponent) {
- super();
- c = inComponent;
- isMultiLineEditor = (c instanceof JTextArea || c instanceof JEditorPane);
- inComponent.addPropertyChangeListener(this);
+ private boolean isMultiLineEditor;
+ private boolean mFocused = false;
+ private boolean fPainting = false;
+
+ @Override
+ public void install(final JTextComponent c) {
+ super.install(c);
+ isMultiLineEditor = c instanceof JTextArea || c instanceof JEditorPane;
+ c.addPropertyChangeListener(this);
}
+ @Override
+ public void deinstall(final JTextComponent c) {
+ c.removePropertyChangeListener(this);
+ super.deinstall(c);
+ }
+
+ @Override
protected Highlighter.HighlightPainter getSelectionPainter() {
return AquaHighlighter.getInstance();
}
@@ -56,11 +64,13 @@
/**
* Only show the flashing caret if the selection range is zero
*/
+ @Override
public void setVisible(boolean e) {
if (e) e = getDot() == getMark();
super.setVisible(e);
}
+ @Override
protected void fireStateChanged() {
// If we have focus the caret should only flash if the range length is zero
if (mFocused) setVisible(getComponent().isEditable());
@@ -68,6 +78,7 @@
super.fireStateChanged();
}
+ @Override
public void propertyChange(final PropertyChangeEvent evt) {
final String propertyName = evt.getPropertyName();
@@ -87,6 +98,7 @@
// --- FocusListener methods --------------------------
private boolean shouldSelectAllOnFocus = true;
+ @Override
public void focusGained(final FocusEvent e) {
final JTextComponent component = getComponent();
if (!component.isEnabled() || !component.isEditable()) {
@@ -122,12 +134,13 @@
super.focusGained(e);
}
+ @Override
public void focusLost(final FocusEvent e) {
mFocused = false;
shouldSelectAllOnFocus = true;
if (isMultiLineEditor) {
setVisible(false);
- c.repaint();
+ getComponent().repaint();
} else {
super.focusLost(e);
}
@@ -136,6 +149,7 @@
// This fixes the problem where when on the mac you have to ctrl left click to
// get popup triggers the caret has code that only looks at button number.
// see radar # 3125390
+ @Override
public void mousePressed(final MouseEvent e) {
if (!e.isPopupTrigger()) {
super.mousePressed(e);
@@ -153,6 +167,7 @@
* @param r the current location of the caret
* @see #paint
*/
+ @Override
protected synchronized void damage(final Rectangle r) {
if (r == null || fPainting) return;
@@ -182,12 +197,12 @@
repaint();
}
- boolean fPainting = false;
-
- // See <rdar://problem/3833837> 1.4.2_05-141.3: JTextField performance with Aqua L&F
- // We are getting into a circular condition with the BasicCaret paint code since it doesn't know about the fact that our
- // damage routine above elminates the border. Sadly we can't easily change either one, so we will
- // add a painting flag and not damage during a repaint.
+ // See <rdar://problem/3833837> 1.4.2_05-141.3: JTextField performance with
+ // Aqua L&F. We are getting into a circular condition with the BasicCaret
+ // paint code since it doesn't know about the fact that our damage routine
+ // above elminates the border. Sadly we can't easily change either one, so
+ // we will add a painting flag and not damage during a repaint.
+ @Override
public void paint(final Graphics g) {
if (isVisible()) {
fPainting = true;
--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaEditorPaneUI.java Tue Sep 08 22:14:25 2015 +0000
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaEditorPaneUI.java Tue Sep 08 15:19:19 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2015, 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
@@ -39,6 +39,7 @@
}
boolean oldDragState = false;
+ @Override
protected void installDefaults(){
super.installDefaults();
if(!GraphicsEnvironment.isHeadless()){
@@ -47,6 +48,7 @@
}
}
+ @Override
protected void uninstallDefaults(){
if(!GraphicsEnvironment.isHeadless()){
getComponent().setDragEnabled(oldDragState);
@@ -55,12 +57,14 @@
}
FocusListener focusListener;
+ @Override
protected void installListeners(){
super.installListeners();
focusListener = createFocusListener();
getComponent().addFocusListener(focusListener);
}
+ @Override
protected void installKeyboardActions() {
super.installKeyboardActions();
AquaKeyBindings bindings = AquaKeyBindings.instance();
@@ -69,6 +73,7 @@
bindings.installAquaUpDownActions(c);
}
+ @Override
protected void uninstallListeners(){
getComponent().removeFocusListener(focusListener);
super.uninstallListeners();
@@ -78,12 +83,12 @@
return new AquaFocusHandler();
}
- protected Caret createCaret(){
- final Window owningWindow = SwingUtilities.getWindowAncestor(getComponent());
- final AquaCaret returnValue = new AquaCaret(owningWindow, getComponent());
- return returnValue;
+ @Override
+ protected Caret createCaret() {
+ return new AquaCaret();
}
+ @Override
protected Highlighter createHighlighter(){
return new AquaHighlighter();
}
--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaInternalFrameUI.java Tue Sep 08 22:14:25 2015 +0000
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaInternalFrameUI.java Tue Sep 08 15:19:19 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2015, 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
@@ -66,6 +66,7 @@
protected Color fNotSelectedTextColor;
AquaInternalFrameBorder fAquaBorder;
+ private ResizeBox resizeBox;
// for button tracking
boolean fMouseOverPressedButton;
@@ -96,6 +97,7 @@
}
/// Inherit (but be careful to check everything they call):
+ @Override
public void installUI(final JComponent c) {
// super.installUI(c); // Swing 1.1.1 has a bug in installUI - it doesn't check for null northPane
frame = (JInternalFrame)c;
@@ -125,12 +127,14 @@
c.setBorder(new CompoundUIBorder(fIsPallet ? paletteWindowShadow.get() : documentWindowShadow.get(), c.getBorder()));
}
+ @Override
protected void installDefaults() {
super.installDefaults();
fSelectedTextColor = UIManager.getColor("InternalFrame.activeTitleForeground");
fNotSelectedTextColor = UIManager.getColor("InternalFrame.inactiveTitleForeground");
}
+ @Override
public void setSouthPane(final JComponent c) {
if (southPane != null) {
frame.remove(southPane);
@@ -144,6 +148,7 @@
}
static final RecyclableSingleton<Icon> closeIcon = new RecyclableSingleton<Icon>() {
+ @Override
protected Icon getInstance() {
return new AquaInternalFrameButtonIcon(Widget.TITLE_BAR_CLOSE_BOX);
}
@@ -153,6 +158,7 @@
}
static final RecyclableSingleton<Icon> minimizeIcon = new RecyclableSingleton<Icon>() {
+ @Override
protected Icon getInstance() {
return new AquaInternalFrameButtonIcon(Widget.TITLE_BAR_COLLAPSE_BOX);
}
@@ -162,6 +168,7 @@
}
static final RecyclableSingleton<Icon> zoomIcon = new RecyclableSingleton<Icon>() {
+ @Override
protected Icon getInstance() {
return new AquaInternalFrameButtonIcon(Widget.TITLE_BAR_ZOOM_BOX);
}
@@ -175,6 +182,7 @@
painter.state.set(widget);
}
+ @Override
public void paintIcon(final Component c, final Graphics g, final int x, final int y) {
painter.state.set(getStateFor(c));
super.paintIcon(c, g, x, y);
@@ -184,28 +192,24 @@
return State.ROLLOVER;
}
+ @Override
public int getIconWidth() {
return 19;
}
+ @Override
public int getIconHeight() {
return 19;
}
}
+ @Override
protected void installKeyboardActions() {
} //$ Not Mac-ish - should we support?
- protected ResizeBox resizeBox;
+ @Override
protected void installComponents() {
final JLayeredPane layeredPane = frame.getLayeredPane();
- if (resizeBox != null) {
- resizeBox.removeListeners();
- layeredPane.removeComponentListener(resizeBox);
- layeredPane.remove(resizeBox);
- resizeBox = null;
- }
-
resizeBox = new ResizeBox(layeredPane);
resizeBox.repositionResizeBox();
@@ -218,6 +222,7 @@
}
/// Inherit all the listeners - that's the main reason we subclass Basic!
+ @Override
protected void installListeners() {
fPropertyListener = new PropertyListener();
frame.addPropertyChangeListener(fPropertyListener);
@@ -225,22 +230,36 @@
}
// uninstallDefaults
- // uninstallComponents
+
+ @Override
+ protected void uninstallComponents() {
+ super.uninstallComponents();
+ final JLayeredPane layeredPane = frame.getLayeredPane();
+ resizeBox.removeListeners();
+ layeredPane.removeComponentListener(resizeBox);
+ layeredPane.remove(resizeBox);
+ resizeBox = null;
+ }
+
+ @Override
protected void uninstallListeners() {
super.uninstallListeners();
frame.removePropertyChangeListener(fPropertyListener);
}
+ @Override
protected void uninstallKeyboardActions() {
}
// Called when a DesktopIcon replaces an InternalFrame & vice versa
//protected void replacePane(JComponent currentPane, JComponent newPane) {}
+ @Override
protected void installMouseHandlers(final JComponent c) {
c.addMouseListener(borderListener);
c.addMouseMotionListener(borderListener);
}
+ @Override
protected void deinstallMouseHandlers(final JComponent c) {
c.removeMouseListener(borderListener);
c.removeMouseMotionListener(borderListener);
@@ -256,6 +275,7 @@
return map;
}
+ @Override
public Dimension getPreferredSize(JComponent x) {
Dimension preferredSize = super.getPreferredSize(x);
Dimension minimumSize = frame.getMinimumSize();
@@ -268,6 +288,7 @@
return preferredSize;
}
+ @Override
public void setNorthPane(final JComponent c) {
replacePane(northPane, c);
northPane = c;
@@ -278,6 +299,7 @@
* and adds it to the frame.
* Reverse process for the <code>currentPane</code>.
*/
+ @Override
protected void replacePane(final JComponent currentPane, final JComponent newPane) {
if (currentPane != null) {
deinstallMouseHandlers(currentPane);
@@ -290,6 +312,7 @@
}
// Our "Border" listener is shared by the AquaDesktopIcon
+ @Override
protected MouseInputAdapter createBorderListener(final JInternalFrame w) {
return new AquaBorderListener();
}
@@ -374,6 +397,7 @@
protected final int RESIZE_NONE = 0;
private boolean discardRelease = false;
+ @Override
public void mouseClicked(final MouseEvent e) {
if (didForwardEvent(e)) return;
@@ -406,6 +430,7 @@
fAquaBorder.repaintButtonArea(frame);
}
+ @Override
public void mouseReleased(final MouseEvent e) {
if (didForwardEvent(e)) return;
@@ -461,6 +486,7 @@
resizeDir = RESIZE_NONE;
}
+ @Override
public void mousePressed(final MouseEvent e) {
if (didForwardEvent(e)) return;
@@ -527,6 +553,7 @@
return true;
}
+ @Override
public void mouseDragged(final MouseEvent e) {
// do not forward drags
// if (didForwardEvent(e)) return;
@@ -576,6 +603,7 @@
return;
}
+ @Override
public void mouseMoved(final MouseEvent e) {
if (didForwardEvent(e)) return;
updateRollover(e);
@@ -614,7 +642,11 @@
if (hitComponent == null || hitComponent == frame) return false;
final Point hitComponentPoint = SwingUtilities.convertPoint(pane, parentPoint, hitComponent);
- hitComponent.dispatchEvent(new MouseEvent(hitComponent, e.getID(), e.getWhen(), e.getModifiers(), hitComponentPoint.x, hitComponentPoint.y, e.getClickCount(), e.isPopupTrigger(), e.getButton()));
+ hitComponent.dispatchEvent(
+ new MouseEvent(hitComponent, e.getID(), e.getWhen(),
+ e.getModifiers(), hitComponentPoint.x,
+ hitComponentPoint.y, e.getClickCount(),
+ e.isPopupTrigger(), e.getButton()));
return true;
}
@@ -668,6 +700,7 @@
}
class PropertyListener implements PropertyChangeListener {
+ @Override
public void propertyChange(final PropertyChangeEvent e) {
final String name = e.getPropertyName();
if (FRAME_TYPE.equals(name)) {
@@ -704,14 +737,17 @@
} // end class PaletteListener
static final InternalFrameShadow documentWindowShadow = new InternalFrameShadow() {
+ @Override
Border getForegroundShadowBorder() {
return new AquaUtils.SlicedShadowBorder(new Painter() {
+ @Override
public void paint(final Graphics g, final int x, final int y, final int w, final int h) {
g.setColor(new Color(0, 0, 0, 196));
g.fillRoundRect(x, y, w, h, 16, 16);
g.fillRect(x, y + h - 16, w, 16);
}
}, new Painter() {
+ @Override
public void paint(final Graphics g, int x, int y, int w, int h) {
g.setColor(new Color(0, 0, 0, 64));
g.drawLine(x + 2, y - 8, x + w - 2, y - 8);
@@ -720,14 +756,17 @@
0, 7, 1.1f, 1.0f, 24, 51, 51, 25, 25, 25, 25);
}
+ @Override
Border getBackgroundShadowBorder() {
return new AquaUtils.SlicedShadowBorder(new Painter() {
+ @Override
public void paint(final Graphics g, final int x, final int y, final int w, final int h) {
g.setColor(new Color(0, 0, 0, 128));
g.fillRoundRect(x - 3, y - 8, w + 6, h, 16, 16);
g.fillRect(x - 3, y + h - 20, w + 6, 19);
}
}, new Painter() {
+ @Override
public void paint(final Graphics g, int x, int y, int w, int h) {
g.setColor(new Color(0, 0, 0, 32));
g.drawLine(x, y - 11, x + w - 1, y - 11);
@@ -738,8 +777,10 @@
};
static final InternalFrameShadow paletteWindowShadow = new InternalFrameShadow() {
+ @Override
Border getForegroundShadowBorder() {
return new AquaUtils.SlicedShadowBorder(new Painter() {
+ @Override
public void paint(final Graphics g, final int x, final int y, final int w, final int h) {
g.setColor(new Color(0, 0, 0, 128));
g.fillRect(x, y + 3, w, h - 3);
@@ -748,6 +789,7 @@
0, 3, 1.0f, 1.0f, 10, 25, 25, 12, 12, 12, 12);
}
+ @Override
Border getBackgroundShadowBorder() {
return getForegroundShadowBorder();
}
@@ -762,19 +804,23 @@
abstract Border getForegroundShadowBorder();
abstract Border getBackgroundShadowBorder();
+ @Override
protected Border getInstance() {
final Border fgShadow = getForegroundShadowBorder();
final Border bgShadow = getBackgroundShadowBorder();
return new Border() {
+ @Override
public Insets getBorderInsets(final Component c) {
return fgShadow.getBorderInsets(c);
}
+ @Override
public boolean isBorderOpaque() {
return false;
}
+ @Override
public void paintBorder(final Component c, final Graphics g, final int x, final int y, final int w, final int h) {
if (((JInternalFrame)c).isSelected()) {
fgShadow.paintBorder(c, g, x, y, w, h);
@@ -790,6 +836,7 @@
@Override
protected Icon getInstance() {
return new AquaIcon.ScalingJRSUIIcon(11, 11) {
+ @Override
public void initIconPainter(final AquaPainter<JRSUIState> iconState) {
iconState.state.set(Widget.GROW_BOX_TEXTURED);
iconState.state.set(WindowType.UTILITY);
@@ -799,12 +846,15 @@
};
@SuppressWarnings("serial") // Superclass is not serializable across versions
- class ResizeBox extends JLabel implements MouseListener, MouseMotionListener, MouseWheelListener, ComponentListener, PropertyChangeListener, UIResource {
- final JLayeredPane layeredPane;
- Dimension originalSize;
- Point originalLocation;
+ private final class ResizeBox extends JLabel
+ implements MouseListener, MouseMotionListener, MouseWheelListener,
+ ComponentListener, PropertyChangeListener, UIResource {
- public ResizeBox(final JLayeredPane layeredPane) {
+ private final JLayeredPane layeredPane;
+ private Dimension originalSize;
+ private Point originalLocation;
+
+ ResizeBox(final JLayeredPane layeredPane) {
super(RESIZE_ICON.get());
setSize(11, 11);
this.layeredPane = layeredPane;
@@ -895,14 +945,18 @@
return c;
}
+ @Override
public void mouseClicked(final MouseEvent e) {
forwardEventToFrame(e);
}
+ @Override
public void mouseEntered(final MouseEvent e) { }
+ @Override
public void mouseExited(final MouseEvent e) { }
+ @Override
public void mousePressed(final MouseEvent e) {
if (frame == null) return;
@@ -916,6 +970,7 @@
forwardEventToFrame(e);
}
+ @Override
public void mouseReleased(final MouseEvent e) {
if (originalLocation != null) {
resizeInternalFrame(e.getPoint());
@@ -927,13 +982,16 @@
forwardEventToFrame(e);
}
+ @Override
public void mouseDragged(final MouseEvent e) {
resizeInternalFrame(e.getPoint());
repositionResizeBox();
}
+ @Override
public void mouseMoved(final MouseEvent e) { }
+ @Override
public void mouseWheelMoved(final MouseWheelEvent e) {
final Point pt = new Point();
final Component c = getComponentToForwardTo(e, pt);
@@ -945,20 +1003,25 @@
e.getPreciseWheelRotation()));
}
+ @Override
public void componentResized(final ComponentEvent e) {
repositionResizeBox();
}
+ @Override
public void componentShown(final ComponentEvent e) {
repositionResizeBox();
}
+ @Override
public void componentMoved(final ComponentEvent e) {
repositionResizeBox();
}
+ @Override
public void componentHidden(final ComponentEvent e) { }
+ @Override
public void propertyChange(final PropertyChangeEvent evt) {
if (!"resizable".equals(evt.getPropertyName())) return;
setVisible(Boolean.TRUE.equals(evt.getNewValue()));
--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaSpinnerUI.java Tue Sep 08 22:14:25 2015 +0000
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaSpinnerUI.java Tue Sep 08 15:19:19 2015 -0700
@@ -49,12 +49,14 @@
* so we can't subclass!
*/
public class AquaSpinnerUI extends SpinnerUI {
- private static final RecyclableSingleton<? extends PropertyChangeListener> propertyChangeListener = new RecyclableSingletonFromDefaultConstructor<PropertyChangeHandler>(PropertyChangeHandler.class);
+ private static final RecyclableSingleton<? extends PropertyChangeListener> propertyChangeListener
+ = new RecyclableSingletonFromDefaultConstructor<>(PropertyChangeHandler.class);
static PropertyChangeListener getPropertyChangeListener() {
return propertyChangeListener.get();
}
- private static final RecyclableSingleton<ArrowButtonHandler> nextButtonHandler = new RecyclableSingleton<ArrowButtonHandler>() {
+ private static final RecyclableSingleton<ArrowButtonHandler> nextButtonHandler
+ = new RecyclableSingleton<ArrowButtonHandler>() {
@Override
protected ArrowButtonHandler getInstance() {
return new ArrowButtonHandler("increment", true);
@@ -63,7 +65,8 @@
static ArrowButtonHandler getNextButtonHandler() {
return nextButtonHandler.get();
}
- private static final RecyclableSingleton<ArrowButtonHandler> previousButtonHandler = new RecyclableSingleton<ArrowButtonHandler>() {
+ private static final RecyclableSingleton<ArrowButtonHandler> previousButtonHandler
+ = new RecyclableSingleton<ArrowButtonHandler>() {
@Override
protected ArrowButtonHandler getInstance() {
return new ArrowButtonHandler("decrement", false);
@@ -73,8 +76,10 @@
return previousButtonHandler.get();
}
- JSpinner spinner;
- SpinPainter spinPainter;
+ private JSpinner spinner;
+ private SpinPainter spinPainter;
+ private TransparentButton next;
+ private TransparentButton prev;
public static ComponentUI createUI(final JComponent c) {
return new AquaSpinnerUI();
@@ -87,12 +92,13 @@
}
boolean wasOpaque;
+ @Override
public void installUI(final JComponent c) {
this.spinner = (JSpinner)c;
installDefaults();
installListeners();
- final TransparentButton next = createNextButton();
- final TransparentButton prev = createPreviousButton();
+ next = createNextButton();
+ prev = createPreviousButton();
spinPainter = new SpinPainter(next, prev);
maybeAdd(next, "Next");
@@ -111,11 +117,21 @@
spinner.setOpaque(false);
}
+ @Override
public void uninstallUI(final JComponent c) {
uninstallDefaults();
uninstallListeners();
spinner.setOpaque(wasOpaque);
+ spinPainter = null;
spinner = null;
+ // AquaButtonUI install some listeners to all parents, which means that
+ // we need to uninstall UI here to remove those listeners, because after
+ // we remove them from spinner we lost the latest reference to them,
+ // and our standard uninstallUI machinery will not call them.
+ next.getUI().uninstallUI(next);
+ prev.getUI().uninstallUI(prev);
+ next = null;
+ prev = null;
c.removeAll();
}
@@ -164,6 +180,7 @@
/**
* {@inheritDoc}
*/
+ @Override
public int getBaseline(JComponent c, int width, int height) {
super.getBaseline(c, width, height);
JComponent editor = spinner.getEditor();
@@ -182,6 +199,7 @@
/**
* {@inheritDoc}
*/
+ @Override
public Component.BaselineResizeBehavior getBaselineResizeBehavior(
JComponent c) {
super.getBaselineResizeBehavior(c);
@@ -200,8 +218,10 @@
interceptRepaints = true;
}
+ @Override
public void paint(final Graphics g) {}
+ @Override
public void repaint() {
// only intercept repaints if we are after this has been initialized
// otherwise we can't talk to our containing class
@@ -315,6 +335,7 @@
return (src instanceof JSpinner) ? (JSpinner)src : null;
}
+ @Override
public void actionPerformed(final ActionEvent e) {
if (!(e.getSource() instanceof javax.swing.Timer)) {
// Most likely resulting from being in ActionMap.
@@ -423,6 +444,7 @@
return -1;
}
+ @Override
public void mousePressed(final MouseEvent e) {
if (!SwingUtilities.isLeftMouseButton(e) || !e.getComponent().isEnabled()) return;
spinner = eventToSpinner(e);
@@ -431,13 +453,17 @@
focusSpinnerIfNecessary();
}
+ @Override
public void mouseReleased(final MouseEvent e) {
autoRepeatTimer.stop();
spinner = null;
}
+ @Override
public void mouseClicked(final MouseEvent e) {}
+ @Override
public void mouseEntered(final MouseEvent e) {}
+ @Override
public void mouseExited(final MouseEvent e) {}
/**
@@ -485,6 +511,7 @@
}
}
+ @Override
public void paint(final Graphics g) {
if (spinner.isOpaque()) {
g.setColor(spinner.getBackground());
@@ -511,6 +538,7 @@
painter.paint(g, spinner, 0, 0, bounds.width, bounds.height);
}
+ @Override
public Dimension getPreferredSize() {
final Size size = AquaUtilControlSize.getUserSizeFrom(this);
@@ -533,6 +561,7 @@
private Component editor = null;
private Component painter = null;
+ @Override
public void addLayoutComponent(final String name, final Component c) {
if ("Next".equals(name)) {
nextButton = c;
@@ -545,6 +574,7 @@
}
}
+ @Override
public void removeLayoutComponent(Component c) {
if (c == nextButton) {
c = null;
@@ -561,6 +591,7 @@
return (c == null) ? new Dimension(0, 0) : c.getPreferredSize();
}
+ @Override
public Dimension preferredLayoutSize(final Container parent) {
// Dimension nextD = preferredSize(nextButton);
// Dimension previousD = preferredSize(previousButton);
@@ -579,6 +610,7 @@
return size;
}
+ @Override
public Dimension minimumLayoutSize(final Container parent) {
return preferredLayoutSize(parent);
}
@@ -589,6 +621,7 @@
}
}
+ @Override
public void layoutContainer(final Container parent) {
final Insets insets = parent.getInsets();
final int availWidth = parent.getWidth() - (insets.left + insets.right);
@@ -629,6 +662,7 @@
* property changes are delegated to protected methods.
*/
static class PropertyChangeHandler implements PropertyChangeListener {
+ @Override
public void propertyChange(final PropertyChangeEvent e) {
final String propertyName = e.getPropertyName();
final JSpinner spinner = (JSpinner)(e.getSource());
--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTabbedPaneUI.java Tue Sep 08 22:14:25 2015 +0000
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTabbedPaneUI.java Tue Sep 08 15:19:19 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2015, 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
@@ -95,6 +95,17 @@
super.assureRectsCreated(tabCount);
}
+ @Override
+ protected void uninstallListeners() {
+ // We're not just a mouseListener, we're a mouseMotionListener
+ if (mouseListener instanceof MouseHandler) {
+ final MouseHandler mh = (MouseHandler) mouseListener;
+ mh.dispose();
+ tabPane.removeMouseMotionListener(mh);
+ }
+ super.uninstallListeners();
+ }
+
protected void uninstallDefaults() {
contentDrawingInsets.set(0, 0, 0, 0);
}
@@ -409,7 +420,15 @@
paintTabNormalFromRect(g, tabPlacement, rects[tabIndex], tabIndex, fIconRect, fTextRect, active, frameActive, isLeftToRight);
}
- protected void paintTabNormalFromRect(final Graphics g, final int tabPlacement, final Rectangle tabRect, final int nonRectIndex, final Rectangle iconRect, final Rectangle textRect, final boolean active, final boolean frameActive, final boolean isLeftToRight) {
+ protected void paintTabNormalFromRect(final Graphics g,
+ final int tabPlacement,
+ final Rectangle tabRect,
+ final int nonRectIndex,
+ final Rectangle iconRect,
+ final Rectangle textRect,
+ final boolean active,
+ final boolean frameActive,
+ final boolean isLeftToRight) {
final int selectedIndex = tabPane.getSelectedIndex();
final boolean isSelected = selectedIndex == nonRectIndex;
@@ -420,7 +439,12 @@
paintContents(g, tabPlacement, nonRectIndex, tabRect, iconRect, textRect, isSelected);
}
- protected void paintCUITab(final Graphics g, final int tabPlacement, final Rectangle tabRect, final boolean isSelected, final boolean frameActive, final boolean isLeftToRight, final int nonRectIndex) {
+ protected void paintCUITab(final Graphics g, final int tabPlacement,
+ final Rectangle tabRect,
+ final boolean isSelected,
+ final boolean frameActive,
+ final boolean isLeftToRight,
+ final int nonRectIndex) {
final int tabCount = tabPane.getTabCount();
final boolean needsLeftScrollTab = visibleTabState.needsLeftScrollTab();
@@ -835,14 +859,20 @@
}
}
- public class MouseHandler extends MouseInputAdapter implements ActionListener {
- protected int trackingTab = -3;
- protected Timer popupTimer = new Timer(500, this);
+ class MouseHandler extends MouseInputAdapter implements ActionListener {
+
+ int trackingTab = -3;
+ private final Timer popupTimer = new Timer(500, this);
- public MouseHandler() {
+ MouseHandler() {
popupTimer.setRepeats(false);
}
+ void dispose (){
+ popupTimer.removeActionListener(this);
+ popupTimer.stop();
+ }
+
public void mousePressed(final MouseEvent e) {
final JTabbedPane pane = (JTabbedPane)e.getSource();
if (!pane.isEnabled()) {
--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTextAreaUI.java Tue Sep 08 22:14:25 2015 +0000
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTextAreaUI.java Tue Sep 08 15:19:19 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2015, 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
@@ -42,6 +42,7 @@
}
AquaFocusHandler handler;
+ @Override
protected void installListeners() {
super.installListeners();
@@ -53,6 +54,7 @@
AquaUtilControlSize.addSizePropertyListener(c);
}
+ @Override
protected void uninstallListeners() {
final JTextComponent c = getComponent();
@@ -66,6 +68,7 @@
}
boolean oldDragState = false;
+ @Override
protected void installDefaults() {
if (!GraphicsEnvironment.isHeadless()) {
oldDragState = getComponent().getDragEnabled();
@@ -74,6 +77,7 @@
super.installDefaults();
}
+ @Override
protected void uninstallDefaults() {
if (!GraphicsEnvironment.isHeadless()) {
getComponent().setDragEnabled(oldDragState);
@@ -81,7 +85,9 @@
super.uninstallDefaults();
}
- // Install a default keypress action which handles Cmd and Option keys properly
+ // Install a default keypress action which handles Cmd and Option keys
+ // properly
+ @Override
protected void installKeyboardActions() {
super.installKeyboardActions();
AquaKeyBindings bindings = AquaKeyBindings.instance();
@@ -90,13 +96,12 @@
bindings.installAquaUpDownActions(c);
}
+ @Override
protected Caret createCaret() {
- final JTextComponent c = getComponent();
- final Window owningWindow = SwingUtilities.getWindowAncestor(c);
- final AquaCaret returnValue = new AquaCaret(owningWindow, c);
- return returnValue;
+ return new AquaCaret();
}
+ @Override
protected Highlighter createHighlighter() {
return new AquaHighlighter();
}
--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTextFieldUI.java Tue Sep 08 22:14:25 2015 +0000
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTextFieldUI.java Tue Sep 08 15:19:19 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2015, 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
@@ -42,6 +42,7 @@
protected JComponentPainter delegate;
protected AquaFocusHandler handler;
+ @Override
protected void installListeners() {
super.installListeners();
@@ -55,6 +56,7 @@
AquaTextFieldSearch.installSearchFieldListener(c);
}
+ @Override
protected void uninstallListeners() {
final JTextComponent c = getComponent();
AquaTextFieldSearch.uninstallSearchFieldListener(c);
@@ -67,6 +69,7 @@
}
boolean oldDragState = false;
+ @Override
protected void installDefaults() {
if (!GraphicsEnvironment.isHeadless()) {
oldDragState = getComponent().getDragEnabled();
@@ -76,6 +79,7 @@
super.installDefaults();
}
+ @Override
protected void uninstallDefaults() {
super.uninstallDefaults();
@@ -84,12 +88,15 @@
}
}
- // Install a default keypress action which handles Cmd and Option keys properly
+ // Install a default keypress action which handles Cmd and Option keys
+ // properly
+ @Override
protected void installKeyboardActions() {
super.installKeyboardActions();
AquaKeyBindings.instance().setDefaultAction(getKeymapName());
}
+ @Override
protected Rectangle getVisibleEditorRect() {
final Rectangle rect = super.getVisibleEditorRect();
if (rect == null) return null;
@@ -102,6 +109,7 @@
return rect;
}
+ @Override
protected void paintSafely(final Graphics g) {
paintBackgroundSafely(g);
super.paintSafely(g);
@@ -149,20 +157,23 @@
// the common case
final int shrinkage = AquaTextFieldBorder.getShrinkageFor(c, height);
- g.fillRect(insets.left - 2, insets.top - shrinkage - 1, width - insets.right - insets.left + 4, height - insets.bottom - insets.top + shrinkage * 2 + 2);
+ g.fillRect(insets.left - 2, insets.top - shrinkage - 1,
+ width - insets.right - insets.left + 4,
+ height - insets.bottom - insets.top + shrinkage * 2 + 2);
}
+ @Override
protected void paintBackground(final Graphics g) {
// we have already ensured that the background is painted to our liking
// by paintBackgroundSafely(), called from paintSafely().
}
+ @Override
protected Caret createCaret() {
- final JTextComponent c = getComponent();
- final Window owningWindow = SwingUtilities.getWindowAncestor(c);
- return new AquaCaret(owningWindow, c);
+ return new AquaCaret();
}
+ @Override
protected Highlighter createHighlighter() {
return new AquaHighlighter();
}
--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTextPaneUI.java Tue Sep 08 22:14:25 2015 +0000
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTextPaneUI.java Tue Sep 08 15:19:19 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2015, 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
@@ -43,6 +43,7 @@
}
AquaFocusHandler handler;
+ @Override
protected void installListeners() {
super.installListeners();
final JComponent c = getComponent();
@@ -52,6 +53,7 @@
AquaUtilControlSize.addSizePropertyListener(c);
}
+ @Override
protected void uninstallListeners() {
final JComponent c = getComponent();
AquaUtilControlSize.removeSizePropertyListener(c);
@@ -62,6 +64,7 @@
}
boolean oldDragState = false;
+ @Override
protected void installDefaults() {
final JTextComponent c = getComponent();
if (!GraphicsEnvironment.isHeadless()) {
@@ -71,6 +74,7 @@
super.installDefaults();
}
+ @Override
protected void uninstallDefaults() {
if (!GraphicsEnvironment.isHeadless()) {
getComponent().setDragEnabled(oldDragState);
@@ -78,7 +82,9 @@
super.uninstallDefaults();
}
- // Install a default keypress action which handles Cmd and Option keys properly
+ // Install a default keypress action which handles Cmd and Option keys
+ // properly
+ @Override
protected void installKeyboardActions() {
super.installKeyboardActions();
AquaKeyBindings bindings = AquaKeyBindings.instance();
@@ -88,12 +94,12 @@
bindings.installAquaUpDownActions(c);
}
+ @Override
protected Caret createCaret() {
- final JTextComponent c = getComponent();
- final Window owningWindow = SwingUtilities.getWindowAncestor(c);
- return new AquaCaret(owningWindow, c);
+ return new AquaCaret();
}
+ @Override
protected Highlighter createHighlighter() {
return new AquaHighlighter();
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMidiAudioFileReader.java Tue Sep 08 22:14:25 2015 +0000
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMidiAudioFileReader.java Tue Sep 08 15:19:19 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2015, 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
@@ -25,10 +25,8 @@
package com.sun.media.sound;
-import java.io.File;
import java.io.IOException;
import java.io.InputStream;
-import java.net.URL;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MetaMessage;
@@ -44,28 +42,27 @@
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.UnsupportedAudioFileException;
-import javax.sound.sampled.spi.AudioFileReader;
/**
* MIDI File Audio Renderer/Reader.
*
* @author Karl Helgason
*/
-public final class SoftMidiAudioFileReader extends AudioFileReader {
+public final class SoftMidiAudioFileReader extends SunFileReader {
+
+ private static final Type MIDI = new Type("MIDI", "mid");
- public static final Type MIDI = new Type("MIDI", "mid");
- private static AudioFormat format = new AudioFormat(44100, 16, 2, true, false);
+ private static final AudioFormat format = new AudioFormat(44100, 16, 2,
+ true, false);
- public AudioFileFormat getAudioFileFormat(Sequence seq)
- throws UnsupportedAudioFileException, IOException {
-
+ private static AudioFileFormat getAudioFileFormat(final Sequence seq) {
long totallen = seq.getMicrosecondLength() / 1000000;
long len = (long) (format.getFrameRate() * (totallen + 4));
return new AudioFileFormat(MIDI, format, (int) len);
}
- public AudioInputStream getAudioInputStream(Sequence seq)
- throws UnsupportedAudioFileException, IOException {
+ private AudioInputStream getAudioInputStream(final Sequence seq)
+ throws InvalidMidiDataException {
AudioSynthesizer synth = (AudioSynthesizer) new SoftSynthesizer();
AudioInputStream stream;
Receiver recv;
@@ -73,7 +70,7 @@
stream = synth.openStream(format, null);
recv = synth.getReceiver();
} catch (MidiUnavailableException e) {
- throw new IOException(e.toString());
+ throw new InvalidMidiDataException(e.toString());
}
float divtype = seq.getDivisionType();
Track[] tracks = seq.getTracks();
@@ -111,7 +108,7 @@
if (((MetaMessage) msg).getType() == 0x51) {
byte[] data = ((MetaMessage) msg).getData();
if (data.length < 3) {
- throw new UnsupportedAudioFileException();
+ throw new InvalidMidiDataException();
}
mpq = ((data[0] & 0xff) << 16)
| ((data[1] & 0xff) << 8) | (data[2] & 0xff);
@@ -128,91 +125,25 @@
return stream;
}
- public AudioInputStream getAudioInputStream(InputStream inputstream)
+ @Override
+ public AudioInputStream getAudioInputStream(final InputStream stream)
throws UnsupportedAudioFileException, IOException {
-
- inputstream.mark(200);
- Sequence seq;
+ stream.mark(200);
try {
- seq = MidiSystem.getSequence(inputstream);
- } catch (InvalidMidiDataException e) {
- inputstream.reset();
- throw new UnsupportedAudioFileException();
- } catch (IOException e) {
- inputstream.reset();
+ return getAudioInputStream(MidiSystem.getSequence(stream));
+ } catch (final InvalidMidiDataException ignored) {
+ stream.reset();
throw new UnsupportedAudioFileException();
}
- return getAudioInputStream(seq);
- }
-
- public AudioFileFormat getAudioFileFormat(URL url)
- throws UnsupportedAudioFileException, IOException {
- Sequence seq;
- try {
- seq = MidiSystem.getSequence(url);
- } catch (InvalidMidiDataException e) {
- throw new UnsupportedAudioFileException();
- } catch (IOException e) {
- throw new UnsupportedAudioFileException();
- }
- return getAudioFileFormat(seq);
- }
-
- public AudioFileFormat getAudioFileFormat(File file)
- throws UnsupportedAudioFileException, IOException {
- Sequence seq;
- try {
- seq = MidiSystem.getSequence(file);
- } catch (InvalidMidiDataException e) {
- throw new UnsupportedAudioFileException();
- } catch (IOException e) {
- throw new UnsupportedAudioFileException();
- }
- return getAudioFileFormat(seq);
}
- public AudioInputStream getAudioInputStream(URL url)
+ @Override
+ AudioFileFormat getAudioFileFormatImpl(final InputStream stream)
throws UnsupportedAudioFileException, IOException {
- Sequence seq;
try {
- seq = MidiSystem.getSequence(url);
- } catch (InvalidMidiDataException e) {
- throw new UnsupportedAudioFileException();
- } catch (IOException e) {
+ return getAudioFileFormat(MidiSystem.getSequence(stream));
+ } catch (final InvalidMidiDataException ignored) {
throw new UnsupportedAudioFileException();
}
- return getAudioInputStream(seq);
- }
-
- public AudioInputStream getAudioInputStream(File file)
- throws UnsupportedAudioFileException, IOException {
- if (!file.getName().toLowerCase().endsWith(".mid"))
- throw new UnsupportedAudioFileException();
- Sequence seq;
- try {
- seq = MidiSystem.getSequence(file);
- } catch (InvalidMidiDataException e) {
- throw new UnsupportedAudioFileException();
- } catch (IOException e) {
- throw new UnsupportedAudioFileException();
- }
- return getAudioInputStream(seq);
- }
-
- public AudioFileFormat getAudioFileFormat(InputStream inputstream)
- throws UnsupportedAudioFileException, IOException {
-
- inputstream.mark(200);
- Sequence seq;
- try {
- seq = MidiSystem.getSequence(inputstream);
- } catch (InvalidMidiDataException e) {
- inputstream.reset();
- throw new UnsupportedAudioFileException();
- } catch (IOException e) {
- inputstream.reset();
- throw new UnsupportedAudioFileException();
- }
- return getAudioFileFormat(seq);
}
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunFileReader.java Tue Sep 08 22:14:25 2015 +0000
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunFileReader.java Tue Sep 08 15:19:19 2015 -0700
@@ -52,10 +52,6 @@
try {
return getAudioFileFormatImpl(stream);
} finally {
- // According to specification the following is not strictly
- // necessary, if we got correct format. But it was implemented like
- // that in 1.3.0 - 1.8. So I leave it as it was, but it seems
- // specification should be updated.
stream.reset();
}
}
--- a/jdk/src/java.desktop/share/classes/java/awt/Font.java Tue Sep 08 22:14:25 2015 +0000
+++ b/jdk/src/java.desktop/share/classes/java/awt/Font.java Tue Sep 08 15:19:19 2015 -0700
@@ -128,7 +128,9 @@
* <p>
* For a discussion of the relative advantages and disadvantages of using
* physical or logical fonts, see the
- * <a href="http://www.oracle.com/technetwork/java/javase/tech/faq-jsp-138165.html">Internationalization FAQ</a>
+ * <a href="https://docs.oracle.com/javase/tutorial/2d/text/fonts.html#advantages-and-disadvantages">
+ * Physical and Logical Fonts</a>
+ * in <a href="https://docs.oracle.com/javase/tutorial/index.html">The Java Tutorials</a>
* document.
*
* <h3>Font Faces and Names</h3>
--- a/jdk/src/java.desktop/share/classes/java/beans/XMLEncoder.java Tue Sep 08 22:14:25 2015 +0000
+++ b/jdk/src/java.desktop/share/classes/java/beans/XMLEncoder.java Tue Sep 08 15:19:19 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2015, 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
@@ -614,10 +614,12 @@
}
if (isArgument && target instanceof Field && methodName.equals("get")) {
- Field f = (Field)target;
- writeln("<object class=" + quote(f.getDeclaringClass().getName()) +
- " field=" + quote(f.getName()) + "/>");
- return;
+ Field f = (Field) target;
+ if (Modifier.isStatic(f.getModifiers())) {
+ writeln("<object class=" + quote(f.getDeclaringClass().getName()) +
+ " field=" + quote(f.getName()) + "/>");
+ return;
+ }
}
Class<?> primitiveType = primitiveTypeFor(value.getClass());
--- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/AudioSystem.java Tue Sep 08 22:14:25 2015 +0000
+++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/AudioSystem.java Tue Sep 08 15:19:19 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2015, 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
@@ -912,9 +912,9 @@
* must point to valid audio file data. The implementation of this method
* may require multiple parsers to examine the stream to determine whether
* they support it. These parsers must be able to mark the stream, read
- * enough data to determine whether they support the stream, and, if not,
- * reset the stream's read pointer to its original position. If the input
- * stream does not support these operations, this method may fail with an
+ * enough data to determine whether they support the stream, and reset the
+ * stream's read pointer to its original position. If the input stream does
+ * not support these operations, this method may fail with an
* {@code IOException}.
*
* @param stream the input stream from which file format information should
@@ -1025,9 +1025,9 @@
* must point to valid audio file data. The implementation of this method
* may require multiple parsers to examine the stream to determine whether
* they support it. These parsers must be able to mark the stream, read
- * enough data to determine whether they support the stream, and, if not,
- * reset the stream's read pointer to its original position. If the input
- * stream does not support these operation, this method may fail with an
+ * enough data to determine whether they support the stream, and reset the
+ * stream's read pointer to its original position. If the input stream does
+ * not support these operation, this method may fail with an
* {@code IOException}.
*
* @param stream the input stream from which the {@code AudioInputStream}
--- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/spi/AudioFileReader.java Tue Sep 08 22:14:25 2015 +0000
+++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/spi/AudioFileReader.java Tue Sep 08 15:19:19 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2015, 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
@@ -49,9 +49,9 @@
* must point to valid audio file data. In general, audio file readers may
* need to read some data from the stream before determining whether they
* support it. These parsers must be able to mark the stream, read enough
- * data to determine whether they support the stream, and, if not, reset the
- * stream's read pointer to its original position. If the input stream does
- * not support this, this method may fail with an {@code IOException}.
+ * data to determine whether they support the stream, and reset the stream's
+ * read pointer to its original position. If the input stream does not
+ * support this, this method may fail with an {@code IOException}.
*
* @param stream the input stream from which file format information should
* be extracted
@@ -101,9 +101,9 @@
* must point to valid audio file data. In general, audio file readers may
* need to read some data from the stream before determining whether they
* support it. These parsers must be able to mark the stream, read enough
- * data to determine whether they support the stream, and, if not, reset the
- * stream's read pointer to its original position. If the input stream does
- * not support this, this method may fail with an {@code IOException}.
+ * data to determine whether they support the stream, and reset the stream's
+ * read pointer to its original position. If the input stream does not
+ * support this, this method may fail with an {@code IOException}.
*
* @param stream the input stream from which the {@code AudioInputStream}
* should be constructed
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTableHeaderUI.java Tue Sep 08 22:14:25 2015 +0000
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTableHeaderUI.java Tue Sep 08 15:19:19 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, 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
@@ -403,6 +403,7 @@
protected void uninstallListeners() {
header.removeMouseListener(mouseInputListener);
header.removeMouseMotionListener(mouseInputListener);
+ header.removeFocusListener(focusListener);
mouseInputListener = null;
}
--- a/jdk/test/java/awt/Focus/RequestOnCompWithNullParent/RequestOnCompWithNullParent1.java Tue Sep 08 22:14:25 2015 +0000
+++ b/jdk/test/java/awt/Focus/RequestOnCompWithNullParent/RequestOnCompWithNullParent1.java Tue Sep 08 15:19:19 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2015, 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
@@ -24,19 +24,14 @@
/*
@test
@bug 6418028
- @summary java/awt/Focus/RequestOnCompWithNullParent/RequestOnCompWithNullParent_Barrier.java fails
@author oleg.sukhodolsky: area=awt.focus
@library ../../regtesthelpers
+ @modules java.desktop/java.awt.peer
+ java.desktop/sun.awt
@build Util
@run main RequestOnCompWithNullParent1
*/
-/**
- * RequestOnCompWithNullParent1.java
- *
- * summary: java/awt/Focus/RequestOnCompWithNullParent/RequestOnCompWithNullParent_Barrier.java fails
- */
-
import java.awt.*;
import java.awt.event.*;
import java.awt.peer.ButtonPeer;
@@ -46,26 +41,21 @@
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
-import test.java.awt.regtesthelpers.Util;
-//*** global search and replace RequestOnCompWithNullParent1 with name of the test ***
+import sun.awt.AWTAccessor;
-public class RequestOnCompWithNullParent1
-{
+public class RequestOnCompWithNullParent1 {
- private static void init() {
- //*** Create instructions for the user here ***
- String[] instructions =
- {
- "This is an AUTOMATIC test, simply wait until it is done.",
- "The result (passed or failed) will be shown in the",
- "message window below."
- };
- Sysout.createDialog( );
- Sysout.printInstructions( instructions );
+ public static void main(final String[] args) throws Exception {
+ Frame frame = new Frame("test for 6418028");
+ try {
+ test(frame);
+ } finally {
+ frame.dispose();
+ }
+ }
-
- Frame frame = new Frame("test for 6418028");
+ private static void test(final Frame frame) throws Exception {
frame.setLayout(new FlowLayout());
Button btn1 = new Button("Button1");
frame.add(btn1);
@@ -80,153 +70,26 @@
});
frame.setVisible(true);
- Util.waitForIdle(null);
+ new Robot().waitForIdle();
btn2.instrumentPeer();
btn2.requestFocusInWindow();
btn2.restorePeer();
- frame.dispose();
- RequestOnCompWithNullParent1.pass();
- }//End init()
-
-
-
- /*****************************************************
- * Standard Test Machinery Section
- * DO NOT modify anything in this section -- it's a
- * standard chunk of code which has all of the
- * synchronisation necessary for the test harness.
- * By keeping it the same in all tests, it is easier
- * to read and understand someone else's test, as
- * well as insuring that all tests behave correctly
- * with the test harness.
- * There is a section following this for test-
- * classes
- ******************************************************/
- private static boolean theTestPassed = false;
- private static boolean testGeneratedInterrupt = false;
- private static String failureMessage = "";
-
- private static Thread mainThread = null;
-
- private static int sleepTime = 300000;
-
- // Not sure about what happens if multiple of this test are
- // instantiated in the same VM. Being static (and using
- // static vars), it aint gonna work. Not worrying about
- // it for now.
- public static void main( String args[] ) throws InterruptedException
- {
- mainThread = Thread.currentThread();
- try
- {
- init();
- }
- catch( TestPassedException e )
- {
- //The test passed, so just return from main and harness will
- // interepret this return as a pass
- return;
- }
- //At this point, neither test pass nor test fail has been
- // called -- either would have thrown an exception and ended the
- // test, so we know we have multiple threads.
-
- //Test involves other threads, so sleep and wait for them to
- // called pass() or fail()
- try
- {
- Thread.sleep( sleepTime );
- //Timed out, so fail the test
- throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" );
- }
- catch (InterruptedException e)
- {
- //The test harness may have interrupted the test. If so, rethrow the exception
- // so that the harness gets it and deals with it.
- if( ! testGeneratedInterrupt ) throw e;
-
- //reset flag in case hit this code more than once for some reason (just safety)
- testGeneratedInterrupt = false;
-
- if ( theTestPassed == false )
- {
- throw new RuntimeException( failureMessage );
- }
- }
-
- }//main
-
- public static synchronized void setTimeoutTo( int seconds )
- {
- sleepTime = seconds * 1000;
}
-
- public static synchronized void pass()
- {
- Sysout.println( "The test passed." );
- Sysout.println( "The test is over, hit Ctl-C to stop Java VM" );
- //first check if this is executing in main thread
- if ( mainThread == Thread.currentThread() )
- {
- //Still in the main thread, so set the flag just for kicks,
- // and throw a test passed exception which will be caught
- // and end the test.
- theTestPassed = true;
- throw new TestPassedException();
- }
- theTestPassed = true;
- testGeneratedInterrupt = true;
- mainThread.interrupt();
- }//pass()
-
- public static synchronized void fail()
- {
- //test writer didn't specify why test failed, so give generic
- fail( "it just plain failed! :-)" );
- }
-
- public static synchronized void fail( String whyFailed )
- {
- Sysout.println( "The test failed: " + whyFailed );
- Sysout.println( "The test is over, hit Ctl-C to stop Java VM" );
- //check if this called from main thread
- if ( mainThread == Thread.currentThread() )
- {
- //If main thread, fail now 'cause not sleeping
- throw new RuntimeException( whyFailed );
- }
- theTestPassed = false;
- testGeneratedInterrupt = true;
- failureMessage = whyFailed;
- mainThread.interrupt();
- }//fail()
-
-}// class RequestOnCompWithNullParent1
-
-//This exception is used to exit from any level of call nesting
-// when it's determined that the test has passed, and immediately
-// end the test.
-class TestPassedException extends RuntimeException
-{
}
-//*********** End Standard Test Machinery Section **********
-
-
-//************ Begin classes defined for the test ****************
-
class TestButton extends Button {
ButtonPeer origPeer;
ButtonPeer proxiedPeer;
/** Creates a new instance of TestButton */
- public TestButton(String text) {
+ TestButton(String text) {
super(text);
}
public void instrumentPeer() {
- origPeer = (ButtonPeer) getPeer();
+ origPeer = AWTAccessor.getComponentAccessor().getPeer(this);
+
InvocationHandler handler = new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) {
if (method.getName().equals("requestFocus")) {
@@ -248,7 +111,9 @@
}
};
- proxiedPeer = (ButtonPeer) Proxy.newProxyInstance(ButtonPeer.class.getClassLoader(), new Class[] {ButtonPeer.class}, handler);
+ proxiedPeer = (ButtonPeer) Proxy.newProxyInstance(
+ ButtonPeer.class.getClassLoader(),
+ new Class[] {ButtonPeer.class}, handler);
setPeer(proxiedPeer);
}
@@ -275,145 +140,3 @@
}
}
}
-//************** End classes defined for the test *******************
-
-
-
-
-/****************************************************
- Standard Test Machinery
- DO NOT modify anything below -- it's a standard
- chunk of code whose purpose is to make user
- interaction uniform, and thereby make it simpler
- to read and understand someone else's test.
- ****************************************************/
-
-/**
- This is part of the standard test machinery.
- It creates a dialog (with the instructions), and is the interface
- for sending text messages to the user.
- To print the instructions, send an array of strings to Sysout.createDialog
- WithInstructions method. Put one line of instructions per array entry.
- To display a message for the tester to see, simply call Sysout.println
- with the string to be displayed.
- This mimics System.out.println but works within the test harness as well
- as standalone.
- */
-
-class Sysout
-{
- private static TestDialog dialog;
-
- public static void createDialogWithInstructions( String[] instructions )
- {
- dialog = new TestDialog( new Frame(), "Instructions" );
- dialog.printInstructions( instructions );
- dialog.setVisible(true);
- println( "Any messages for the tester will display here." );
- }
-
- public static void createDialog( )
- {
- dialog = new TestDialog( new Frame(), "Instructions" );
- String[] defInstr = { "Instructions will appear here. ", "" } ;
- dialog.printInstructions( defInstr );
- dialog.setVisible(true);
- println( "Any messages for the tester will display here." );
- }
-
-
- public static void printInstructions( String[] instructions )
- {
- dialog.printInstructions( instructions );
- }
-
-
- public static void println( String messageIn )
- {
- dialog.displayMessage( messageIn );
- System.out.println(messageIn);
- }
-
-}// Sysout class
-
-/**
- This is part of the standard test machinery. It provides a place for the
- test instructions to be displayed, and a place for interactive messages
- to the user to be displayed.
- To have the test instructions displayed, see Sysout.
- To have a message to the user be displayed, see Sysout.
- Do not call anything in this dialog directly.
- */
-class TestDialog extends Dialog
-{
-
- TextArea instructionsText;
- TextArea messageText;
- int maxStringLength = 80;
-
- //DO NOT call this directly, go through Sysout
- public TestDialog( Frame frame, String name )
- {
- super( frame, name );
- int scrollBoth = TextArea.SCROLLBARS_BOTH;
- instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
- add( "North", instructionsText );
-
- messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
- add("Center", messageText);
-
- pack();
-
- setVisible(true);
- }// TestDialog()
-
- //DO NOT call this directly, go through Sysout
- public void printInstructions( String[] instructions )
- {
- //Clear out any current instructions
- instructionsText.setText( "" );
-
- //Go down array of instruction strings
-
- String printStr, remainingStr;
- for( int i=0; i < instructions.length; i++ )
- {
- //chop up each into pieces maxSringLength long
- remainingStr = instructions[ i ];
- while( remainingStr.length() > 0 )
- {
- //if longer than max then chop off first max chars to print
- if( remainingStr.length() >= maxStringLength )
- {
- //Try to chop on a word boundary
- int posOfSpace = remainingStr.
- lastIndexOf( ' ', maxStringLength - 1 );
-
- if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
-
- printStr = remainingStr.substring( 0, posOfSpace + 1 );
- remainingStr = remainingStr.substring( posOfSpace + 1 );
- }
- //else just print
- else
- {
- printStr = remainingStr;
- remainingStr = "";
- }
-
- instructionsText.append( printStr + "\n" );
-
- }// while
-
- }// for
-
- }//printInstructions()
-
- //DO NOT call this directly, go through Sysout
- public void displayMessage( String messageIn )
- {
- messageText.append( messageIn + "\n" );
- System.out.println(messageIn);
- }
-
-}// TestDialog class
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Modal/InvisibleParentTest/InvisibleParentTest.html Tue Sep 08 15:19:19 2015 -0700
@@ -0,0 +1,45 @@
+<!--
+ Copyright (c) 2013, 2015, 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
+ under the terms of the GNU General Public License version 2 only, as
+ published by the Free Software Foundation.
+
+ This code is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ version 2 for more details (a copy is included in the LICENSE file that
+ accompanied this code).
+
+ You should have received a copy of the GNU General Public License version
+ 2 along with this work; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+
+ Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ or visit www.oracle.com if you need additional information or have any
+ questions.
+-->
+
+<html>
+<!--
+ @test
+ @bug 6401700 6412803
+ @requires (os.family != "windows")
+ @summary Tests that modal dialog is shown on the screen and
+iconified/restored correctly if its parent window is invisible
+ @author artem.ananiev: area=awt.modal
+ @run applet/manual=yesno InvisibleParentTest.html
+ -->
+<head>
+<title> InvisibleParentTest </title>
+</head>
+<body>
+
+<h1>InvisibleParentTest<br>Bug ID: 6401700, 6412803</h1>
+
+<p> See the dialog box (usually in upper left corner) for instructions</p>
+
+<APPLET CODE="InvisibleParentTest.class" WIDTH=200 HEIGHT=200></APPLET>
+</body>
+</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Modal/InvisibleParentTest/InvisibleParentTest.java Tue Sep 08 15:19:19 2015 -0700
@@ -0,0 +1,235 @@
+/*
+ * Copyright (c) 2013, 2015, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ test
+ @bug 6401700 6412803
+ @summary Tests that modal dialog is shown on the screen and
+iconified/restored correctly if some of its blocked windows are invisible
+ @author artem.ananiev: area=awt.modal
+ @run applet/manual=yesno InvisibleParentTest.html
+*/
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.Button;
+import java.awt.Component;
+import java.awt.Dialog;
+import java.awt.Frame;
+import java.awt.TextArea;
+import java.awt.Window;
+
+public class InvisibleParentTest extends Applet
+{
+ public void init()
+ {
+ setLayout(new BorderLayout());
+
+ String[] instructions =
+ {
+ "If your system is Windows, press PASS button.",
+ "When the test starts two windows should appear: frame G1 and",
+ " dialog D1. Another one frame F1 should be minimized.",
+ " If the dialog is not shown (minimizied), press FAIL button.",
+ "Then minimize frame G1 and restore F1. If the dialog D1 is not",
+ " restored together with F1, press FAIL, else PASS"
+ };
+ Sysout.createDialogWithInstructions( instructions );
+ }
+
+ public void start ()
+ {
+ Button b;
+
+ setSize (200,200);
+ setVisible(true);
+ validate();
+
+ Component c = this;
+ while ((c != null) && !(c instanceof Window))
+ {
+ c = c.getParent();
+ }
+ if (c != null)
+ {
+ ((Window)c).setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE);
+ }
+
+ Frame f1 = new Frame("F1");
+ f1.setBounds(100, 300, 100, 100);
+ f1.setVisible(true);
+ f1.setExtendedState(Frame.ICONIFIED);
+
+ Frame g1 = new Frame("G1");
+ g1.setBounds(150, 350, 100, 100);
+ g1.setVisible(true);
+
+ final Dialog d1 = new Dialog((Frame)null, "D1", Dialog.ModalityType.APPLICATION_MODAL);
+ d1.setBounds(200, 400, 100, 100);
+ new Thread(new Runnable()
+ {
+ public void run()
+ {
+ d1.setVisible(true);
+ }
+ }).start();
+ }
+}
+
+/****************************************************
+ Standard Test Machinery
+ DO NOT modify anything below -- it's a standard
+ chunk of code whose purpose is to make user
+ interaction uniform, and thereby make it simpler
+ to read and understand someone else's test.
+ ****************************************************/
+
+/**
+ This is part of the standard test machinery.
+ It creates a dialog (with the instructions), and is the interface
+ for sending text messages to the user.
+ To print the instructions, send an array of strings to Sysout.createDialog
+ WithInstructions method. Put one line of instructions per array entry.
+ To display a message for the tester to see, simply call Sysout.println
+ with the string to be displayed.
+ This mimics System.out.println but works within the test harness as well
+ as standalone.
+ */
+
+class Sysout
+{
+ private static TestDialog dialog;
+
+ public static void createDialogWithInstructions( String[] instructions )
+ {
+ dialog = new TestDialog( new Frame(), "Instructions" );
+ dialog.printInstructions( instructions );
+ dialog.setVisible(true);
+ println( "Any messages for the tester will display here." );
+ }
+
+ public static void createDialog( )
+ {
+ dialog = new TestDialog( new Frame(), "Instructions" );
+ String[] defInstr = { "Instructions will appear here. ", "" } ;
+ dialog.printInstructions( defInstr );
+ dialog.setVisible(true);
+ println( "Any messages for the tester will display here." );
+ }
+
+
+ public static void printInstructions( String[] instructions )
+ {
+ dialog.printInstructions( instructions );
+ }
+
+
+ public static void println( String messageIn )
+ {
+ dialog.displayMessage( messageIn );
+ }
+
+}// Sysout class
+
+/**
+ This is part of the standard test machinery. It provides a place for the
+ test instructions to be displayed, and a place for interactive messages
+ to the user to be displayed.
+ To have the test instructions displayed, see Sysout.
+ To have a message to the user be displayed, see Sysout.
+ Do not call anything in this dialog directly.
+ */
+class TestDialog extends Dialog
+{
+
+ TextArea instructionsText;
+ TextArea messageText;
+ int maxStringLength = 80;
+
+ //DO NOT call this directly, go through Sysout
+ public TestDialog( Frame frame, String name )
+ {
+ super( frame, name );
+ setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE);
+ int scrollBoth = TextArea.SCROLLBARS_BOTH;
+ instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
+ add( "North", instructionsText );
+
+ messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
+ add("Center", messageText);
+
+ pack();
+
+ setVisible(true);
+ }// TestDialog()
+
+ //DO NOT call this directly, go through Sysout
+ public void printInstructions( String[] instructions )
+ {
+ //Clear out any current instructions
+ instructionsText.setText( "" );
+
+ //Go down array of instruction strings
+
+ String printStr, remainingStr;
+ for( int i=0; i < instructions.length; i++ )
+ {
+ //chop up each into pieces maxSringLength long
+ remainingStr = instructions[ i ];
+ while( remainingStr.length() > 0 )
+ {
+ //if longer than max then chop off first max chars to print
+ if( remainingStr.length() >= maxStringLength )
+ {
+ //Try to chop on a word boundary
+ int posOfSpace = remainingStr.
+ lastIndexOf( ' ', maxStringLength - 1 );
+
+ if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
+
+ printStr = remainingStr.substring( 0, posOfSpace + 1 );
+ remainingStr = remainingStr.substring( posOfSpace + 1 );
+ }
+ //else just print
+ else
+ {
+ printStr = remainingStr;
+ remainingStr = "";
+ }
+
+ instructionsText.append( printStr + "\n" );
+
+ }// while
+
+ }// for
+
+ }//printInstructions()
+
+ //DO NOT call this directly, go through Sysout
+ public void displayMessage( String messageIn )
+ {
+ messageText.append( messageIn + "\n" );
+ System.out.println(messageIn);
+ }
+
+}// TestDialog class
--- a/jdk/test/java/awt/PrintJob/Text/StringWidth.java Tue Sep 08 22:14:25 2015 +0000
+++ b/jdk/test/java/awt/PrintJob/Text/StringWidth.java Tue Sep 08 15:19:19 2015 -0700
@@ -23,7 +23,6 @@
import java.awt.*;
import java.util.Properties;
-import sun.awt.*;
public class StringWidth extends Frame {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/image/MultiResolutionImageCommonTest.java Tue Sep 08 15:19:19 2015 -0700
@@ -0,0 +1,205 @@
+/*
+ * Copyright (c) 2013, 2015, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.image.BufferedImage;
+import sun.awt.SunHints;
+import java.awt.geom.AffineTransform;
+import java.util.Arrays;
+import java.util.List;
+import sun.awt.image.MultiResolutionImage;
+
+/**
+ * @test @bug 8011059
+ * @author Alexander Scherbatiy
+ * @summary Test MultiResolution image loading and painting with various scaling
+ * combinations
+ * @modules java.desktop/sun.awt
+ * java.desktop/sun.awt.image
+ */
+public class MultiResolutionImageCommonTest {
+
+ private static final int IMAGE_WIDTH = 300;
+ private static final int IMAGE_HEIGHT = 200;
+ private static final Color COLOR_1X = Color.GREEN;
+ private static final Color COLOR_2X = Color.BLUE;
+
+ public static void main(String[] args) throws Exception {
+ testCustomMultiResolutionImage();
+ System.out.println("Test passed.");
+ }
+
+ public static void testCustomMultiResolutionImage() {
+ testCustomMultiResolutionImage(false);
+ testCustomMultiResolutionImage(true);
+ }
+
+ public static void testCustomMultiResolutionImage(
+ boolean enableImageScaling) {
+
+ Image image = new MultiResolutionBufferedImage();
+
+ // Same image size
+ BufferedImage bufferedImage = new BufferedImage(
+ IMAGE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
+ Graphics2D g2d = (Graphics2D) bufferedImage.getGraphics();
+ setImageScalingHint(g2d, enableImageScaling);
+ g2d.drawImage(image, 0, 0, null);
+ checkColor(bufferedImage.getRGB(
+ 3 * IMAGE_WIDTH / 4, 3 * IMAGE_HEIGHT / 4), false);
+
+ // Twice image size
+ bufferedImage = new BufferedImage(2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT,
+ BufferedImage.TYPE_INT_RGB);
+ g2d = (Graphics2D) bufferedImage.getGraphics();
+ setImageScalingHint(g2d, enableImageScaling);
+ g2d.drawImage(image, 0, 0, 2 * IMAGE_WIDTH,
+ 2 * IMAGE_HEIGHT, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, null);
+ checkColor(bufferedImage.getRGB(3 * IMAGE_WIDTH / 2,
+ 3 * IMAGE_HEIGHT / 2), enableImageScaling);
+
+ // Scale 2x
+ bufferedImage = new BufferedImage(
+ 2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
+ g2d = (Graphics2D) bufferedImage.getGraphics();
+ setImageScalingHint(g2d, enableImageScaling);
+ g2d.scale(2, 2);
+ g2d.drawImage(image, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, null);
+ checkColor(bufferedImage.getRGB(
+ 3 * IMAGE_WIDTH / 2, 3 * IMAGE_HEIGHT / 2), enableImageScaling);
+
+ // Rotate
+ bufferedImage = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT,
+ BufferedImage.TYPE_INT_RGB);
+ g2d = (Graphics2D) bufferedImage.getGraphics();
+ setImageScalingHint(g2d, enableImageScaling);
+ g2d.drawImage(image, 0, 0, null);
+ g2d.rotate(Math.PI / 4);
+ checkColor(bufferedImage.getRGB(
+ 3 * IMAGE_WIDTH / 4, 3 * IMAGE_HEIGHT / 4), false);
+
+ // Scale 2x and Rotate
+ bufferedImage = new BufferedImage(
+ 2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
+ g2d = (Graphics2D) bufferedImage.getGraphics();
+ setImageScalingHint(g2d, enableImageScaling);
+ g2d.scale(-2, 2);
+ g2d.rotate(-Math.PI / 10);
+ g2d.drawImage(image, -IMAGE_WIDTH, 0, IMAGE_WIDTH, IMAGE_HEIGHT, null);
+ checkColor(bufferedImage.getRGB(
+ 3 * IMAGE_WIDTH / 2, 3 * IMAGE_HEIGHT / 2), enableImageScaling);
+
+ // General Transform
+ bufferedImage = new BufferedImage(
+ 2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
+ g2d = (Graphics2D) bufferedImage.getGraphics();
+ setImageScalingHint(g2d, enableImageScaling);
+ float delta = 0.05f;
+ float cos = 1 - delta * delta / 2;
+ float sin = 1 + delta;
+ AffineTransform transform
+ = new AffineTransform(2 * cos, 0.1, 0.3, -2 * sin, 10, -5);
+ g2d.setTransform(transform);
+ g2d.drawImage(image, 0, -IMAGE_HEIGHT, IMAGE_WIDTH, IMAGE_HEIGHT, null);
+ checkColor(bufferedImage.getRGB(
+ 3 * IMAGE_WIDTH / 2, 3 * IMAGE_HEIGHT / 2), enableImageScaling);
+
+ int D = 10;
+ // From Source to small Destination region
+ bufferedImage = new BufferedImage(
+ IMAGE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
+ g2d = (Graphics2D) bufferedImage.getGraphics();
+ setImageScalingHint(g2d, enableImageScaling);
+ g2d.drawImage(image, IMAGE_WIDTH / 2, IMAGE_HEIGHT / 2,
+ IMAGE_WIDTH - D, IMAGE_HEIGHT - D,
+ D, D, IMAGE_WIDTH - D, IMAGE_HEIGHT - D, null);
+ checkColor(bufferedImage.getRGB(
+ 3 * IMAGE_WIDTH / 4, 3 * IMAGE_HEIGHT / 4), false);
+
+ // From Source to large Destination region
+ bufferedImage = new BufferedImage(
+ 2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
+ g2d = (Graphics2D) bufferedImage.getGraphics();
+ setImageScalingHint(g2d, enableImageScaling);
+ g2d.drawImage(image, D, D, 2 * IMAGE_WIDTH - D, 2 * IMAGE_HEIGHT - D,
+ IMAGE_WIDTH / 2, IMAGE_HEIGHT / 2,
+ IMAGE_WIDTH - D, IMAGE_HEIGHT - D, null);
+ checkColor(bufferedImage.getRGB(
+ 3 * IMAGE_WIDTH / 2, 3 * IMAGE_HEIGHT / 2), enableImageScaling);
+ }
+
+ static class MultiResolutionBufferedImage extends BufferedImage
+ implements MultiResolutionImage {
+
+ Image highResolutionImage;
+
+ public MultiResolutionBufferedImage() {
+ super(IMAGE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
+ highResolutionImage = new BufferedImage(
+ 2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT,
+ BufferedImage.TYPE_INT_RGB);
+ draw(getGraphics(), 1);
+ draw(highResolutionImage.getGraphics(), 2);
+ }
+
+ final void draw(Graphics graphics, float resolution) {
+ Graphics2D g2 = (Graphics2D) graphics;
+ g2.scale(resolution, resolution);
+ g2.setColor((resolution == 1) ? COLOR_1X : COLOR_2X);
+ g2.fillRect(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);
+ }
+
+ @Override
+ public Image getResolutionVariant(int width, int height) {
+ return ((width <= getWidth() && height <= getHeight()))
+ ? this : highResolutionImage;
+ }
+
+ @Override
+ public List<Image> getResolutionVariants() {
+ return Arrays.asList(this, highResolutionImage);
+ }
+ }
+
+ static void setImageScalingHint(
+ Graphics2D g2d, boolean enableImageScaling) {
+ g2d.setRenderingHint(SunHints.KEY_RESOLUTION_VARIANT, enableImageScaling
+ ? SunHints.VALUE_RESOLUTION_VARIANT_ON
+ : SunHints.VALUE_RESOLUTION_VARIANT_OFF);
+ }
+
+ static void checkColor(int rgb, boolean isImageScaled) {
+
+ if (!isImageScaled && COLOR_1X.getRGB() != rgb) {
+ throw new RuntimeException("Wrong 1x color: " + new Color(rgb));
+ }
+
+ if (isImageScaled && COLOR_2X.getRGB() != rgb) {
+ throw new RuntimeException("Wrong 2x color" + new Color(rgb));
+ }
+ }
+
+}
--- a/jdk/test/java/awt/image/MultiResolutionImageTest.java Tue Sep 08 22:14:25 2015 +0000
+++ b/jdk/test/java/awt/image/MultiResolutionImageTest.java Tue Sep 08 15:19:19 2015 -0700
@@ -31,25 +31,23 @@
import java.lang.reflect.Method;
import java.net.URL;
import javax.imageio.ImageIO;
-import sun.awt.OSInfo;
import sun.awt.SunHints;
import java.awt.MediaTracker;
-import java.awt.geom.AffineTransform;
import java.awt.image.ImageObserver;
-import java.util.Arrays;
-import java.util.List;
import javax.swing.JPanel;
-import sun.awt.SunToolkit;
+import jdk.testlibrary.Platform;
import sun.awt.image.MultiResolutionImage;
/**
- * @test
- * @bug 8011059
+ * @test @bug 8011059
* @author Alexander Scherbatiy
* @summary [macosx] Make JDK demos look perfect on retina displays
+ * @library /lib/testlibrary/
+ * @build jdk.testlibrary.Platform
+ * @requires (os.family == "mac")
* @modules java.desktop/sun.awt
* java.desktop/sun.awt.image
- * @run main MultiResolutionImageTest CUSTOM
+ * java.desktop/sun.lwawt.macosx
* @run main MultiResolutionImageTest TOOLKIT_PREPARE
* @run main MultiResolutionImageTest TOOLKIT_LOAD
* @run main MultiResolutionImageTest TOOLKIT
@@ -70,149 +68,29 @@
if (args.length == 0) {
throw new RuntimeException("Not found a test");
}
-
String test = args[0];
-
System.out.println("TEST: " + test);
- System.out.println("CHECK OS: " + checkOS());
-
- if ("CUSTOM".equals(test)) {
- testCustomMultiResolutionImage();
- } else if (checkOS()) {
- switch (test) {
- case "CUSTOM":
- break;
- case "TOOLKIT_PREPARE":
- testToolkitMultiResolutionImagePrepare();
- break;
- case "TOOLKIT_LOAD":
- testToolkitMultiResolutionImageLoad();
- break;
- case "TOOLKIT":
- testToolkitMultiResolutionImage();
- testImageNameTo2xParsing();
- break;
- default:
- throw new RuntimeException("Unknown test: " + test);
- }
- }
- }
-
- static boolean checkOS() {
- return OSInfo.getOSType() == OSInfo.OSType.MACOSX;
- }
-
- public static void testCustomMultiResolutionImage() {
- testCustomMultiResolutionImage(false);
- testCustomMultiResolutionImage(true);
- }
-
- public static void testCustomMultiResolutionImage(boolean enableImageScaling) {
-
- Image image = new MultiResolutionBufferedImage();
-
- // Same image size
- BufferedImage bufferedImage = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT,
- BufferedImage.TYPE_INT_RGB);
- Graphics2D g2d = (Graphics2D) bufferedImage.getGraphics();
- setImageScalingHint(g2d, enableImageScaling);
- g2d.drawImage(image, 0, 0, null);
- checkColor(bufferedImage.getRGB(3 * IMAGE_WIDTH / 4, 3 * IMAGE_HEIGHT / 4), false);
-
- // Twice image size
- bufferedImage = new BufferedImage(2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT,
- BufferedImage.TYPE_INT_RGB);
- g2d = (Graphics2D) bufferedImage.getGraphics();
- setImageScalingHint(g2d, enableImageScaling);
- g2d.drawImage(image, 0, 0, 2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, null);
- checkColor(bufferedImage.getRGB(3 * IMAGE_WIDTH / 2, 3 * IMAGE_HEIGHT / 2), enableImageScaling);
-
- // Scale 2x
- bufferedImage = new BufferedImage(2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
- g2d = (Graphics2D) bufferedImage.getGraphics();
- setImageScalingHint(g2d, enableImageScaling);
- g2d.scale(2, 2);
- g2d.drawImage(image, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, null);
- checkColor(bufferedImage.getRGB(3 * IMAGE_WIDTH / 2, 3 * IMAGE_HEIGHT / 2), enableImageScaling);
- // Rotate
- bufferedImage = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT,
- BufferedImage.TYPE_INT_RGB);
- g2d = (Graphics2D) bufferedImage.getGraphics();
- setImageScalingHint(g2d, enableImageScaling);
- g2d.drawImage(image, 0, 0, null);
- g2d.rotate(Math.PI / 4);
- checkColor(bufferedImage.getRGB(3 * IMAGE_WIDTH / 4, 3 * IMAGE_HEIGHT / 4), false);
-
- // Scale 2x and Rotate
- bufferedImage = new BufferedImage(2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
- g2d = (Graphics2D) bufferedImage.getGraphics();
- setImageScalingHint(g2d, enableImageScaling);
- g2d.scale(-2, 2);
- g2d.rotate(-Math.PI / 10);
- g2d.drawImage(image, -IMAGE_WIDTH, 0, IMAGE_WIDTH, IMAGE_HEIGHT, null);
- checkColor(bufferedImage.getRGB(3 * IMAGE_WIDTH / 2, 3 * IMAGE_HEIGHT / 2), enableImageScaling);
-
- // General Transform
- bufferedImage = new BufferedImage(2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
- g2d = (Graphics2D) bufferedImage.getGraphics();
- setImageScalingHint(g2d, enableImageScaling);
- float delta = 0.05f;
- float cos = 1 - delta * delta / 2;
- float sin = 1 + delta;
- AffineTransform transform = new AffineTransform(2 * cos, 0.1, 0.3, -2 * sin, 10, -5);
- g2d.setTransform(transform);
- g2d.drawImage(image, 0, -IMAGE_HEIGHT, IMAGE_WIDTH, IMAGE_HEIGHT, null);
- checkColor(bufferedImage.getRGB(3 * IMAGE_WIDTH / 2, 3 * IMAGE_HEIGHT / 2), enableImageScaling);
-
- int D = 10;
- // From Source to small Destination region
- bufferedImage = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
- g2d = (Graphics2D) bufferedImage.getGraphics();
- setImageScalingHint(g2d, enableImageScaling);
- g2d.drawImage(image, IMAGE_WIDTH / 2, IMAGE_HEIGHT / 2, IMAGE_WIDTH - D, IMAGE_HEIGHT - D,
- D, D, IMAGE_WIDTH - D, IMAGE_HEIGHT - D, null);
- checkColor(bufferedImage.getRGB(3 * IMAGE_WIDTH / 4, 3 * IMAGE_HEIGHT / 4), false);
-
- // From Source to large Destination region
- bufferedImage = new BufferedImage(2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
- g2d = (Graphics2D) bufferedImage.getGraphics();
- setImageScalingHint(g2d, enableImageScaling);
- g2d.drawImage(image, D, D, 2 * IMAGE_WIDTH - D, 2 * IMAGE_HEIGHT - D,
- IMAGE_WIDTH / 2, IMAGE_HEIGHT / 2, IMAGE_WIDTH - D, IMAGE_HEIGHT - D, null);
- checkColor(bufferedImage.getRGB(3 * IMAGE_WIDTH / 2, 3 * IMAGE_HEIGHT / 2), enableImageScaling);
- }
-
- static class MultiResolutionBufferedImage extends BufferedImage
- implements MultiResolutionImage {
-
- Image highResolutionImage;
-
- public MultiResolutionBufferedImage() {
- super(IMAGE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
- highResolutionImage = new BufferedImage(
- 2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
- draw(getGraphics(), 1);
- draw(highResolutionImage.getGraphics(), 2);
+ // To automatically pass the test if the test is not run using JTReg.
+ if (!Platform.isOSX()) {
+ System.out.println("Non-Mac platform detected. Passing the test");
+ return;
}
-
- void draw(Graphics graphics, float resolution) {
- Graphics2D g2 = (Graphics2D) graphics;
- g2.scale(resolution, resolution);
- g2.setColor((resolution == 1) ? COLOR_1X : COLOR_2X);
- g2.fillRect(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);
+ switch (test) {
+ case "TOOLKIT_PREPARE":
+ testToolkitMultiResolutionImagePrepare();
+ break;
+ case "TOOLKIT_LOAD":
+ testToolkitMultiResolutionImageLoad();
+ break;
+ case "TOOLKIT":
+ testToolkitMultiResolutionImage();
+ testImageNameTo2xParsing();
+ break;
+ default:
+ throw new RuntimeException("Unknown test: " + test);
}
-
- @Override
- public Image getResolutionVariant(int width, int height) {
- return ((width <= getWidth() && height <= getHeight()))
- ? this : highResolutionImage;
- }
-
- @Override
- public List<Image> getResolutionVariants() {
- return Arrays.asList(this, highResolutionImage);
- }
+ System.out.println("Test passed.");
}
static void testToolkitMultiResolutionImagePrepare() throws Exception {
@@ -224,8 +102,9 @@
Image image = Toolkit.getDefaultToolkit().getImage(fileName);
- SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
- toolkit.prepareImage(image, IMAGE_WIDTH, IMAGE_HEIGHT, new LoadImageObserver(image));
+ Toolkit toolkit = Toolkit.getDefaultToolkit();
+ toolkit.prepareImage(image, IMAGE_WIDTH, IMAGE_HEIGHT,
+ new LoadImageObserver(image));
testToolkitMultiResolutionImageLoad(image);
}
@@ -240,7 +119,8 @@
testToolkitMultiResolutionImageLoad(image);
}
- static void testToolkitMultiResolutionImageLoad(Image image) throws Exception {
+ static void testToolkitMultiResolutionImageLoad(Image image)
+ throws Exception {
MediaTracker tracker = new MediaTracker(new JPanel());
tracker.addImage(image, 0);
@@ -256,7 +136,7 @@
int h = image.getHeight(null);
Image resolutionVariant = ((MultiResolutionImage) image)
- .getResolutionVariant(2 * w, 2 * h);
+ .getResolutionVariant(2 * w, 2 * h);
if (image == resolutionVariant) {
throw new RuntimeException("Resolution variant is not loaded");
@@ -267,9 +147,10 @@
static void testImageLoaded(Image image) {
- SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+ Toolkit toolkit = Toolkit.getDefaultToolkit();
- int flags = toolkit.checkImage(image, IMAGE_WIDTH, IMAGE_WIDTH, new SilentImageObserver());
+ int flags = toolkit.checkImage(image, IMAGE_WIDTH, IMAGE_WIDTH,
+ new SilentImageObserver());
if ((flags & (ImageObserver.FRAMEBITS | ImageObserver.ALLBITS)) == 0) {
throw new RuntimeException("Image is not loaded!");
}
@@ -278,7 +159,8 @@
static class SilentImageObserver implements ImageObserver {
@Override
- public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
+ public boolean imageUpdate(Image img, int infoflags, int x, int y,
+ int width, int height) {
throw new RuntimeException("Observer should not be called!");
}
}
@@ -292,21 +174,25 @@
}
@Override
- public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
+ public boolean imageUpdate(Image img, int infoflags, int x, int y,
+ int width, int height) {
if (image != img) {
- throw new RuntimeException("Original image is not passed to the observer");
+ throw new RuntimeException("Original image is not passed "
+ + "to the observer");
}
if ((infoflags & ImageObserver.WIDTH) != 0) {
if (width != IMAGE_WIDTH) {
- throw new RuntimeException("Original width is not passed to the observer");
+ throw new RuntimeException("Original width is not passed "
+ + "to the observer");
}
}
if ((infoflags & ImageObserver.HEIGHT) != 0) {
if (height != IMAGE_HEIGHT) {
- throw new RuntimeException("Original height is not passed to the observer");
+ throw new RuntimeException("Original height is not passed "
+ + "to the observer");
}
}
@@ -335,7 +221,8 @@
testToolkitMultiResolutionImage(image, true);
}
- static void testToolkitMultiResolutionImageChache(String fileName, URL url) {
+ static void testToolkitMultiResolutionImageChache(String fileName,
+ URL url) {
Image img1 = Toolkit.getDefaultToolkit().getImage(fileName);
if (!(img1 instanceof MultiResolutionImage)) {
@@ -358,8 +245,8 @@
}
}
- static void testToolkitMultiResolutionImage(Image image, boolean enableImageScaling)
- throws Exception {
+ static void testToolkitMultiResolutionImage(Image image,
+ boolean enableImageScaling) throws Exception {
MediaTracker tracker = new MediaTracker(new JPanel());
tracker.addImage(image, 0);
@@ -368,15 +255,16 @@
throw new RuntimeException("Error during image loading");
}
- final BufferedImage bufferedImage1x = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT,
- BufferedImage.TYPE_INT_RGB);
+ final BufferedImage bufferedImage1x = new BufferedImage(IMAGE_WIDTH,
+ IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics2D g1x = (Graphics2D) bufferedImage1x.getGraphics();
setImageScalingHint(g1x, false);
g1x.drawImage(image, 0, 0, null);
- checkColor(bufferedImage1x.getRGB(3 * IMAGE_WIDTH / 4, 3 * IMAGE_HEIGHT / 4), false);
+ checkColor(bufferedImage1x.getRGB(3 * IMAGE_WIDTH / 4,
+ 3 * IMAGE_HEIGHT / 4), false);
Image resolutionVariant = ((MultiResolutionImage) image).
- getResolutionVariant(2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT);
+ getResolutionVariant(2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT);
if (resolutionVariant == null) {
throw new RuntimeException("Resolution variant is null");
@@ -390,23 +278,28 @@
}
final BufferedImage bufferedImage2x = new BufferedImage(2 * IMAGE_WIDTH,
- 2 * IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
+ 2 * IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics2D g2x = (Graphics2D) bufferedImage2x.getGraphics();
setImageScalingHint(g2x, enableImageScaling);
- g2x.drawImage(image, 0, 0, 2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, null);
- checkColor(bufferedImage2x.getRGB(3 * IMAGE_WIDTH / 2, 3 * IMAGE_HEIGHT / 2), enableImageScaling);
+ g2x.drawImage(image, 0, 0, 2 * IMAGE_WIDTH,
+ 2 * IMAGE_HEIGHT, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, null);
+ checkColor(bufferedImage2x.getRGB(3 * IMAGE_WIDTH / 2,
+ 3 * IMAGE_HEIGHT / 2), enableImageScaling);
if (!(image instanceof MultiResolutionImage)) {
throw new RuntimeException("Not a MultiResolutionImage");
}
- MultiResolutionImage multiResolutionImage = (MultiResolutionImage) image;
+ MultiResolutionImage multiResolutionImage
+ = (MultiResolutionImage) image;
- Image image1x = multiResolutionImage.getResolutionVariant(IMAGE_WIDTH, IMAGE_HEIGHT);
- Image image2x = multiResolutionImage.getResolutionVariant(2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT);
+ Image image1x = multiResolutionImage.getResolutionVariant(
+ IMAGE_WIDTH, IMAGE_HEIGHT);
+ Image image2x = multiResolutionImage.getResolutionVariant(
+ 2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT);
if (image1x.getWidth(null) * 2 != image2x.getWidth(null)
- || image1x.getHeight(null) * 2 != image2x.getHeight(null)) {
+ || image1x.getHeight(null) * 2 != image2x.getHeight(null)) {
throw new RuntimeException("Wrong resolution variant size");
}
}
@@ -416,13 +309,15 @@
ImageObserver observer = new ImageObserver() {
@Override
- public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
+ public boolean imageUpdate(Image img, int infoflags, int x, int y,
+ int width, int height) {
if (img != image) {
throw new RuntimeException("Wrong image in observer");
}
- if ((infoflags & (ImageObserver.ERROR | ImageObserver.ABORT)) != 0) {
+ if ((infoflags & (ImageObserver.ERROR | ImageObserver.ABORT))
+ != 0) {
throw new RuntimeException("Error during image loading");
}
@@ -432,18 +327,20 @@
};
final BufferedImage bufferedImage2x = new BufferedImage(2 * IMAGE_WIDTH,
- 2 * IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
+ 2 * IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics2D g2x = (Graphics2D) bufferedImage2x.getGraphics();
setImageScalingHint(g2x, true);
- g2x.drawImage(image, 0, 0, 2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, observer);
+ g2x.drawImage(image, 0, 0, 2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, 0, 0,
+ IMAGE_WIDTH, IMAGE_HEIGHT, observer);
}
- static void setImageScalingHint(Graphics2D g2d, boolean enableImageScaling) {
+ static void setImageScalingHint(Graphics2D g2d,
+ boolean enableImageScaling) {
g2d.setRenderingHint(SunHints.KEY_RESOLUTION_VARIANT, enableImageScaling
- ? SunHints.VALUE_RESOLUTION_VARIANT_ON
- : SunHints.VALUE_RESOLUTION_VARIANT_OFF);
+ ? SunHints.VALUE_RESOLUTION_VARIANT_ON
+ : SunHints.VALUE_RESOLUTION_VARIANT_OFF);
}
static void checkColor(int rgb, boolean isImageScaled) {
@@ -468,8 +365,9 @@
}
static void generateImage(int scale) throws Exception {
- BufferedImage image = new BufferedImage(scale * IMAGE_WIDTH, scale * IMAGE_HEIGHT,
- BufferedImage.TYPE_INT_RGB);
+ BufferedImage image = new BufferedImage(
+ scale * IMAGE_WIDTH, scale * IMAGE_HEIGHT,
+ BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(scale == 1 ? COLOR_1X : COLOR_2X);
g.fillRect(0, 0, scale * IMAGE_WIDTH, scale * IMAGE_HEIGHT);
@@ -493,7 +391,7 @@
}
throw new RuntimeException("Test name " + testName
- + ", result name: " + resultName);
+ + ", result name: " + resultName);
}
for (URL[] testURLs : TEST_URLS) {
@@ -510,7 +408,7 @@
}
throw new RuntimeException("Test url: " + testURL
- + ", result url: " + resultURL);
+ + ", result url: " + resultURL);
}
}
@@ -521,19 +419,22 @@
}
static String getTestScaledImageName(String name) throws Exception {
- Method method = getScalableImageMethod("getScaledImageName", String.class);
+ Method method = getScalableImageMethod(
+ "getScaledImageName", String.class);
return (String) method.invoke(null, name);
}
private static boolean isValidPath(String path) {
return !path.isEmpty() && !path.endsWith("/") && !path.endsWith(".")
- && !path.contains("@2x");
+ && !path.contains("@2x");
}
private static Method getScalableImageMethod(String name,
- Class... parameterTypes) throws Exception {
+ Class... parameterTypes) throws Exception {
Toolkit toolkit = Toolkit.getDefaultToolkit();
- Method method = toolkit.getClass().getDeclaredMethod(name, parameterTypes);
+ Method method = toolkit.getClass()
+ .
+ getDeclaredMethod(name, parameterTypes);
method.setAccessible(true);
return method;
}
@@ -604,9 +505,11 @@
{new URL("jar:file:/dir/Java2D.jar!/images/image.ext"),
new URL("jar:file:/dir/Java2D.jar!/images/image@2x.ext")},
{new URL("jar:file:/aaa.bbb/Java2D.jar!/images/image.ext"),
- new URL("jar:file:/aaa.bbb/Java2D.jar!/images/image@2x.ext")},
+ new URL("jar:file:/aaa.bbb/Java2D.jar!/"
+ + "images/image@2x.ext")},
{new URL("jar:file:/dir/Java2D.jar!/aaa.bbb/image.ext"),
- new URL("jar:file:/dir/Java2D.jar!/aaa.bbb/image@2x.ext")},};
+ new URL("jar:file:/dir/Java2D.jar!/"
+ + "aaa.bbb/image@2x.ext")},};
} catch (Exception e) {
throw new RuntimeException(e);
}
@@ -615,7 +518,8 @@
static class PreloadedImageObserver implements ImageObserver {
@Override
- public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
+ public boolean imageUpdate(Image img, int infoflags, int x, int y,
+ int width, int height) {
throw new RuntimeException("Image should be already preloaded");
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/ReferenceToNonStaticField.java Tue Sep 08 15:19:19 2015 -0700
@@ -0,0 +1,164 @@
+/*
+ * Copyright (c) 2015, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.font.TextAttribute;
+
+/**
+ * @test
+ * @bug 8060027
+ */
+public final class ReferenceToNonStaticField
+ extends AbstractTest<ReferenceToNonStaticField.TestValue> {
+
+ public static final class TestValue {
+
+ // reference to static field
+ public TextAttribute font_default = TextAttribute.FONT;
+ public TextAttribute family_default = TextAttribute.FAMILY;
+ public TextAttribute family_set1; // will be set to the same as default
+ public TextAttribute family_set2; // will be set to the same as default
+ public TextAttribute family_set3; // will be set to the same as default
+
+ // primitive small
+ public int int_1_default = 1;
+ public int int_10_default = 10;
+ public int int_10_set1; // will be set to the same as default
+ public int int_10_set2; // will be set to the same as default
+ public int int_10_set3; // will be set to the same as default
+
+ // primitive big
+ public int int_1000_default = 1000;
+ public int int_2000_default = 2000;
+ public int int_2000_set1; // will be set to the same as default
+ public int int_2000_set2; // will be set to the same as default
+ public int int_2000_set3; // will be set to the same as default
+
+ // wrappers
+ public Integer integer_1_default = new Integer(1);
+ public Integer integer_10_default = new Integer(10);
+ public Integer integer_10_set1; // will be set to the same as default
+ public Integer integer_10_set2; // will be set to the same as default
+ public Integer integer_10_set3; // will be set to the same as default
+
+ public TestValue() {
+ }
+
+ public TestValue(final Object ignored) {
+ // set some fields to non-default values, so they will be saved
+ family_set1 = family_default;
+ family_set3 = family_default;
+ family_set2 = family_default;
+ int_10_set1 = int_10_default;
+ int_10_set2 = int_10_default;
+ int_10_set3 = int_10_default;
+ int_2000_set1 = int_2000_default;
+ int_2000_set2 = int_2000_default;
+ int_2000_set3 = int_2000_default;
+ integer_10_set1 = integer_10_default;
+ integer_10_set2 = integer_10_default;
+ integer_10_set3 = integer_10_default;
+ }
+ }
+
+ public static void main(final String[] args) {
+ new ReferenceToNonStaticField().test(true);
+ }
+
+ protected TestValue getObject() {
+ return new TestValue(new Object());
+ }
+
+ @Override
+ protected void validate(final TestValue before,final TestValue after) {
+ super.validate(before, after);
+ validate(before);
+ validate(after);
+ }
+
+ private static void validate(final TestValue object) {
+ // reference to static field
+ if (object.font_default != TextAttribute.FONT) {
+ throw new Error("Wrong font_default: " + object.font_default);
+ }
+ if (object.family_default != TextAttribute.FAMILY) {
+ throw new Error("Wrong family_default: " + object.family_default);
+ }
+ if (object.family_set1 != object.family_default) {
+ throw new Error("Wrong family_set1: " + object.family_set1);
+ }
+ if (object.family_set2 != object.family_default) {
+ throw new Error("Wrong family_set2: " + object.family_set2);
+ }
+ if (object.family_set3 != object.family_default) {
+ throw new Error("Wrong family_set3: " + object.family_set3);
+ }
+ // primitive small
+ if (object.int_1_default != 1) {
+ throw new Error("Wrong int_1_default: " + object.int_1_default);
+ }
+ if (object.int_10_default != 10) {
+ throw new Error("Wrong int_10_default: " + object.int_10_default);
+ }
+ if (object.int_10_set1 != object.int_10_default) {
+ throw new Error("Wrong int_10_set1: " + object.int_10_set1);
+ }
+ if (object.int_10_set2 != object.int_10_default) {
+ throw new Error("Wrong int_10_set2: " + object.int_10_set2);
+ }
+ if (object.int_10_set3 != object.int_10_default) {
+ throw new Error("Wrong int_10_set3: " + object.int_10_set3);
+ }
+ // primitive big
+ if (object.int_1000_default != 1000) {
+ throw new Error("Wrong int_1000_default: " + object.int_1000_default);
+ }
+ if (object.int_2000_default != 2000) {
+ throw new Error("Wrong int_2000_default: " + object.int_2000_default);
+ }
+ if (object.int_2000_set1 != object.int_2000_default) {
+ throw new Error("Wrong int_2000_set1: " + object.int_2000_set1);
+ }
+ if (object.int_2000_set2 != object.int_2000_default) {
+ throw new Error("Wrong int_2000_set2: " + object.int_2000_set2);
+ }
+ if (object.int_2000_set3 != object.int_2000_default) {
+ throw new Error("Wrong int_2000_set3: " + object.int_2000_set3);
+ }
+ // wrappers
+ if (!object.integer_1_default.equals(new Integer(1))) {
+ throw new Error("Wrong integer_1_default: " + object.integer_1_default);
+ }
+ if (!object.integer_10_default.equals(new Integer(10))) {
+ throw new Error("Wrong integer_10_default: " + object.integer_10_default);
+ }
+ if (object.integer_10_set1 != object.integer_10_default) {
+ throw new Error("Wrong integer_10_set1: " + object.integer_10_set1);
+ }
+ if (object.integer_10_set2 != object.integer_10_default) {
+ throw new Error("Wrong integer_10_set2: " + object.integer_10_set2);
+ }
+ if (object.integer_10_set3 != object.integer_10_default) {
+ throw new Error("Wrong integer_10_set3: " + object.integer_10_set3);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sound/sampled/FileReader/RepeatedFormatReader.java Tue Sep 08 15:19:19 2015 -0700
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2015, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.sound.sampled.AudioSystem;
+import javax.sound.sampled.UnsupportedAudioFileException;
+
+/**
+ * @test
+ * @bug 8133677
+ * @summary Subsequent read from the same stream should work
+ */
+public final class RepeatedFormatReader {
+
+ // Stubs
+
+ private static byte[] headerMIDI = {0x4d, 0x54, 0x68, 0x64, // MThd
+ 0, 0, 0, 6, // read header length
+ 0, 0, // type
+ 0, 0, // numtracks
+ 0, 1, // timing
+ };
+
+ private static byte[] headerAU = {0x2e, 0x73, 0x6e, 0x64, // AU_SUN_MAGIC
+ 0, 0, 0, 0, // headerSize
+ 0, 0, 0, 0, // dataSize
+ 0, 0, 0, 1, // encoding
+ 0, 0, 0, 0, // sampleRate
+ 0, 0, 0, 1 // channels
+ };
+
+ private static byte[] headerWAV = {0x52, 0x49, 0x46, 0x46, // RIFF_MAGIC
+ 1, 1, 1, 1, // fileLength
+ 0x57, 0x41, 0x56, 0x45, // waveMagic
+ 0x66, 0x6d, 0x74, 0x20, // FMT_MAGIC
+ 3, 0, 0, 0, // length
+ 1, 0, // wav_type WAVE_FORMAT_PCM
+ 0, 1, // channels
+ 0, 0, 0, 0, // sampleRate
+ 0, 0, 0, 0, // avgBytesPerSec
+ 0, 0, // blockAlign
+ 1, 0, // sampleSizeInBits
+ 0x64, 0x61, 0x74, 0x61, // DATA_MAGIC
+ 0, 0, 0, 0, // dataLength
+ };
+
+ private static final byte[][] data = {headerMIDI, headerAU, headerWAV};
+
+ public static void main(final String[] args)
+ throws IOException, UnsupportedAudioFileException {
+ for (final byte[] bytes : data) {
+ test(bytes);
+ }
+ }
+
+ private static void test(final byte[] buffer)
+ throws IOException, UnsupportedAudioFileException {
+ final InputStream is = new ByteArrayInputStream(buffer);
+ for (int i = 0; i < 10; ++i) {
+ AudioSystem.getAudioFileFormat(is);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/UI/UnninstallUIMemoryLeaks/UnninstallUIMemoryLeaks.java Tue Sep 08 15:19:19 2015 -0700
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2015, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.EventQueue;
+import java.awt.FlowLayout;
+
+import javax.swing.*;
+import javax.swing.UIManager.LookAndFeelInfo;
+
+import static javax.swing.UIManager.getInstalledLookAndFeels;
+
+/**
+ * @test
+ * @bug 8134947
+ * @author Sergey Bylokhov
+ * @run main/timeout=300/othervm -Xmx12m -XX:+HeapDumpOnOutOfMemoryError UnninstallUIMemoryLeaks
+ */
+public final class UnninstallUIMemoryLeaks {
+
+ private static JFrame frame;
+
+ public static void main(final String[] args) throws Exception {
+ try {
+ createGUI();
+ for (final LookAndFeelInfo laf : getInstalledLookAndFeels()) {
+ final String name = laf.getName();
+ if (name.contains("OS X") || name.contains("Metal")) {
+ SwingUtilities.invokeAndWait(() -> setLookAndFeel(laf));
+ SwingUtilities.invokeAndWait(() -> {
+ for (int i = 0; i < 4000; ++i) {
+ SwingUtilities.updateComponentTreeUI(frame);
+ }
+ });
+ }
+ }
+ } finally {
+ EventQueue.invokeAndWait(() -> frame.dispose());
+ }
+ }
+
+ private static void createGUI() throws Exception {
+ EventQueue.invokeAndWait(() -> {
+ frame = new JFrame();
+ frame.setLayout(new FlowLayout());
+
+ frame.add(new JButton("JButton"));
+ frame.add(new JCheckBox("JCheckBox"));
+ frame.add(new JComboBox<>());
+ frame.add(new JEditorPane());
+ frame.add(new JFormattedTextField("JFormattedTextField"));
+ frame.add(new JLabel("label"));
+ frame.add(new JPanel());
+ frame.add(new JPasswordField("JPasswordField"));
+ frame.add(new JProgressBar());
+ frame.add(new JRadioButton("JRadioButton"));
+ frame.add(new JScrollBar());
+ frame.add(new JScrollPane());
+ frame.add(new JSeparator());
+ frame.add(new JSlider());
+ frame.add(new JSpinner());
+ frame.add(new JSplitPane());
+ frame.add(new JTabbedPane());
+ frame.add(new JTable());
+ frame.add(new JTextArea("JTextArea"));
+ frame.add(new JTextField("JTextField"));
+ frame.add(new JTextPane());
+ frame.add(new JToggleButton());
+ frame.add(new JToolBar());
+ frame.add(new JToolTip());
+ frame.add(new JTree());
+ frame.add(new JViewport());
+
+ final JMenuBar bar = new JMenuBar();
+ final JMenu menu1 = new JMenu("menu1");
+ final JMenu menu2 = new JMenu("menu2");
+ menu1.add(new JMenuItem("menuitem"));
+ menu2.add(new JCheckBoxMenuItem("JCheckBoxMenuItem"));
+ menu2.add(new JRadioButtonMenuItem("JRadioButtonMenuItem"));
+ bar.add(menu1);
+ bar.add(menu2);
+ frame.setJMenuBar(bar);
+
+ final String[] data = {"one", "two", "three", "four"};
+ final JList<String> list = new JList<>(data);
+ frame.add(list);
+
+ final JDesktopPane pane = new JDesktopPane();
+ final JInternalFrame internalFrame = new JInternalFrame();
+ internalFrame.setBounds(10, 10, 130, 130);
+ internalFrame.setVisible(true);
+ pane.add(internalFrame);
+ pane.setSize(150, 150);
+
+ frame.add(pane);
+ frame.pack();
+ frame.setSize(600, 600);
+ frame.setLocationRelativeTo(null);
+ // Commented to prevent a reference from RepaintManager
+ // frame.setVisible(true);
+ });
+ }
+
+ private static void setLookAndFeel(final LookAndFeelInfo laf) {
+ try {
+ UIManager.setLookAndFeel(laf.getClassName());
+ System.out.println("LookAndFeel: " + laf.getClassName());
+ } catch (ClassNotFoundException | InstantiationException |
+ UnsupportedLookAndFeelException | IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/plaf/basic/BasicHTML/4960629/bug4960629.java Tue Sep 08 15:19:19 2015 -0700
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2015, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ @bug 4960629 7124238
+ @summary Tests if font for html text on widgets in correct.
+ @author Denis Sharypov
+ @run main bug4960629
+*/
+
+import java.awt.Font;
+import java.lang.reflect.InvocationTargetException;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.plaf.basic.BasicHTML;
+import javax.swing.text.AttributeSet;
+import javax.swing.text.View;
+import javax.swing.text.html.StyleSheet;
+import javax.swing.text.html.HTMLDocument;
+
+public class bug4960629 {
+ private boolean passed = false;
+ private JLabel label = null;
+ private JFrame f = null;
+
+ public void createAndShowGUI() throws Exception {
+ try {
+ UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
+ label = new JLabel("<html><P>This is a test of the</P></html>");
+ System.out.println("UIManager.getLookAndFeel()"
+ + UIManager.getLookAndFeel().getClass());
+ f = new JFrame();
+ f.getContentPane().add(label);
+ f.pack();
+ f.setVisible(true);
+ test();
+ } finally {
+ f.dispose();
+ }
+ }
+
+ bug4960629() throws InvocationTargetException, InterruptedException {
+ SwingUtilities.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ createAndShowGUI();
+ } catch (Exception e) {
+ throw new RuntimeException("Exception "
+ + e.getMessage());
+ }
+ }
+ });
+ }
+
+ private void test() {
+ View root = ((View)label.getClientProperty(BasicHTML.propertyKey))
+ .getView(0);
+ int n = root.getViewCount();
+ View v = root.getView(n - 1);
+ AttributeSet attrs = v.getAttributes();
+ StyleSheet ss = ((HTMLDocument) v.getDocument()).getStyleSheet();
+ Font font = ss.getFont(attrs);
+ System.out.println(font.getSize());
+ passed = (font.getSize() == 12);
+ if(!passed) {
+ throw new RuntimeException("Test failed.");
+ }
+ }
+
+ public static void main(String args[]) throws Throwable {
+ new bug4960629();
+ }
+}