jdk/src/macosx/classes/com/apple/laf/AquaPainter.java
changeset 24151 a558c7acb1ad
parent 24138 93734b110121
child 24532 24831bd48764
--- 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;
         }