# HG changeset patch # User serb # Date 1396437788 -14400 # Node ID a558c7acb1ade450c3bf2df9187f63e50148edf0 # Parent 367d67fc074c1b293479b82e1fbfd347c3ab6873 8029196: Focus border of JButton.buttonType=roundRect is cut off Reviewed-by: pchelko, alexsch diff -r 367d67fc074c -r a558c7acb1ad jdk/src/macosx/classes/apple/laf/JRSUIConstants.java --- a/jdk/src/macosx/classes/apple/laf/JRSUIConstants.java Tue Apr 01 12:38:37 2014 -0700 +++ b/jdk/src/macosx/classes/apple/laf/JRSUIConstants.java Wed Apr 02 15:23:08 2014 +0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,13 @@ import java.lang.annotation.Native; public final class JRSUIConstants { + + /** + * There is no way to get width of focus border, so it is hardcoded here. + * All components, which can be focused should take care about it. + */ + public static final int FOCUS_SIZE = 4; + private static native long getPtrForConstant(final int constant); static class Key { diff -r 367d67fc074c -r a558c7acb1ad jdk/src/macosx/classes/com/apple/laf/AquaButtonExtendedTypes.java --- a/jdk/src/macosx/classes/com/apple/laf/AquaButtonExtendedTypes.java Tue Apr 01 12:38:37 2014 -0700 +++ b/jdk/src/macosx/classes/com/apple/laf/AquaButtonExtendedTypes.java Wed Apr 02 15:23:08 2014 +0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,6 +36,8 @@ import com.apple.laf.AquaUtilControlSize.*; import com.apple.laf.AquaUtils.RecyclableSingleton; +import static apple.laf.JRSUIConstants.FOCUS_SIZE; + /** * All the "magic numbers" in this class should go away once * "default font" and sizes for controls in Java Aqua Look and Feel @@ -145,7 +147,8 @@ protected static Map getAllTypes() { final Map specifiersByName = new HashMap(); - final Insets focusInsets = new Insets(4, 4, 4, 4); + final Insets focusInsets = new Insets(FOCUS_SIZE, FOCUS_SIZE, + FOCUS_SIZE, FOCUS_SIZE); final TypeSpecifier[] specifiers = { new TypeSpecifier("toolbar", true) { diff -r 367d67fc074c -r a558c7acb1ad jdk/src/macosx/classes/com/apple/laf/AquaPainter.java --- a/jdk/src/macosx/classes/com/apple/laf/AquaPainter.java Tue Apr 01 12:38:37 2014 -0700 +++ b/jdk/src/macosx/classes/com/apple/laf/AquaPainter.java Wed Apr 02 15:23:08 2014 +0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -141,39 +141,59 @@ paintFromSingleCachedImage(g, control, stateToPaint, boundsRect); } + /** + * Paints a native control, which identified by its size and a set of + * additional arguments using a cached image. + * + * @param g Graphics to draw the control + * @param control the reference to the native control + * @param controlState the state of the native control + * @param bounds the rectangle where the native part should be drawn. + * Note: the focus can/will be drawn outside of this bounds. + */ static void paintFromSingleCachedImage(final Graphics2D g, - final JRSUIControl control, final JRSUIState controlState, - final Rectangle bounds) { + final JRSUIControl control, + final JRSUIState controlState, + final Rectangle bounds) { if (bounds.width <= 0 || bounds.height <= 0) { return; } + int focus = 0; + if (controlState.is(JRSUIConstants.Focused.YES)) { + focus = JRSUIConstants.FOCUS_SIZE; + } + + final int imgX = bounds.x - focus; + final int imgY = bounds.y - focus; + final int imgW = bounds.width + (focus << 1); + final int imgH = bounds.height + (focus << 1); final GraphicsConfiguration config = g.getDeviceConfiguration(); final ImageCache cache = ImageCache.getInstance(); - final int width = bounds.width; - final int height = bounds.height; - AquaPixelsKey key = new AquaPixelsKey(config, - width, height, bounds, controlState); - Image img = (BufferedImage) cache.getImage(key); + final AquaPixelsKey key = new AquaPixelsKey(config, imgW, imgH, + bounds, controlState); + Image img = cache.getImage(key); if (img == null) { - Image baseImage = createImage(width, height, bounds, control, - controlState); + Image baseImage = createImage(imgX, imgY, imgW, imgH, bounds, + control, controlState); img = new MultiResolutionBufferedImage(baseImage, - (rvWidth, rvHeight) -> createImage(rvWidth, rvHeight, - bounds, control, controlState)); + (rvWidth, rvHeight) -> createImage(imgX, imgY, + rvWidth, rvHeight, bounds, control, controlState)); if (!controlState.is(JRSUIConstants.Animating.YES)) { cache.setImage(key, img); } } - g.drawImage(img, bounds.x, bounds.y, bounds.width, bounds.height, null); + g.drawImage(img, imgX, imgY, imgW, imgH, null); } - private static Image createImage(int imgW, int imgH, final Rectangle bounds, - final JRSUIControl control, JRSUIState controlState) { + private static Image createImage(int imgX, int imgY, int imgW, int imgH, + final Rectangle bounds, + final JRSUIControl control, + JRSUIState controlState) { BufferedImage img = new BufferedImage(imgW, imgH, BufferedImage.TYPE_INT_ARGB_PRE); @@ -181,8 +201,9 @@ final DataBufferInt buffer = (DataBufferInt) raster.getDataBuffer(); control.set(controlState); - control.paint(SunWritableRaster.stealData(buffer, 0), - imgW, imgH, 0, 0, bounds.width, bounds.height); + control.paint(SunWritableRaster.stealData(buffer, 0), imgW, imgH, + bounds.x - imgX, bounds.y - imgY, bounds.width, + bounds.height); SunWritableRaster.markDirty(buffer); return img; } @@ -212,6 +233,7 @@ this.hash = hash(); } + @Override public int getPixelCount() { return pixelCount; } diff -r 367d67fc074c -r a558c7acb1ad jdk/src/macosx/native/com/apple/laf/JRSUIController.m --- a/jdk/src/macosx/native/com/apple/laf/JRSUIController.m Tue Apr 01 12:38:37 2014 -0700 +++ b/jdk/src/macosx/native/com/apple/laf/JRSUIController.m Wed Apr 02 15:23:08 2014 +0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -199,7 +199,7 @@ CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); CGContextRef cgRef = CGBitmapContextCreate(rawPixelData, imgW, imgH, 8, imgW * 4, colorspace, kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host); CGColorSpaceRelease(colorspace); - CGContextScaleCTM(cgRef, imgW/w , imgH/h); + CGContextScaleCTM(cgRef, imgW/(w + x + x) , imgH/(h + y + y)); jint status = doPaintCGContext(cgRef, controlPtr, oldProperties, newProperties, x, y, w, h); CGContextRelease(cgRef);