8029196: Focus border of JButton.buttonType=roundRect is cut off
authorserb
Wed, 02 Apr 2014 15:23:08 +0400
changeset 24151 a558c7acb1ad
parent 24150 367d67fc074c
child 24152 dc585189ab28
8029196: Focus border of JButton.buttonType=roundRect is cut off Reviewed-by: pchelko, alexsch
jdk/src/macosx/classes/apple/laf/JRSUIConstants.java
jdk/src/macosx/classes/com/apple/laf/AquaButtonExtendedTypes.java
jdk/src/macosx/classes/com/apple/laf/AquaPainter.java
jdk/src/macosx/native/com/apple/laf/JRSUIController.m
--- 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 {
--- 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
  * <rdar://problem/4613866> "default font" and sizes for controls in Java Aqua Look and Feel
@@ -145,7 +147,8 @@
     protected static Map<String, TypeSpecifier> getAllTypes() {
         final Map<String, TypeSpecifier> specifiersByName = new HashMap<String, TypeSpecifier>();
 
-        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) {
--- 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;
         }
--- 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);