--- a/jdk/src/macosx/classes/sun/lwawt/LWToolkit.java Fri Dec 14 11:21:09 2012 -0800
+++ b/jdk/src/macosx/classes/sun/lwawt/LWToolkit.java Fri Dec 14 11:22:16 2012 -0800
@@ -210,9 +210,9 @@
* and DialogPeer interfaces.
*/
private LWWindowPeer createDelegatedPeer(Window target, PlatformComponent platformComponent,
- PlatformWindow platformWindow)
+ PlatformWindow platformWindow, LWWindowPeer.PeerType peerType)
{
- LWWindowPeer peer = new LWWindowPeer(target, platformComponent, platformWindow);
+ LWWindowPeer peer = new LWWindowPeer(target, platformComponent, platformWindow, peerType);
targetCreatedPeer(target, peer);
peer.initialize();
return peer;
@@ -222,22 +222,29 @@
public WindowPeer createWindow(Window target) {
PlatformComponent platformComponent = createPlatformComponent();
PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.SIMPLEWINDOW);
- return createDelegatedPeer(target, platformComponent, platformWindow);
+ return createDelegatedPeer(target, platformComponent, platformWindow, LWWindowPeer.PeerType.SIMPLEWINDOW);
}
@Override
public FramePeer createFrame(Frame target) {
PlatformComponent platformComponent = createPlatformComponent();
PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.FRAME);
- return createDelegatedPeer(target, platformComponent, platformWindow);
+ return createDelegatedPeer(target, platformComponent, platformWindow, LWWindowPeer.PeerType.FRAME);
}
public LWWindowPeer createEmbeddedFrame(CEmbeddedFrame target) {
PlatformComponent platformComponent = createPlatformComponent();
- PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.EMBEDDEDFRAME);
- return createDelegatedPeer(target, platformComponent, platformWindow);
+ PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.EMBEDDED_FRAME);
+ return createDelegatedPeer(target, platformComponent, platformWindow, LWWindowPeer.PeerType.EMBEDDED_FRAME);
}
+ public LWWindowPeer createEmbeddedFrame(CViewEmbeddedFrame target) {
+ PlatformComponent platformComponent = createPlatformComponent();
+ PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.VIEW_EMBEDDED_FRAME);
+ return createDelegatedPeer(target, platformComponent, platformWindow, LWWindowPeer.PeerType.VIEW_EMBEDDED_FRAME);
+ }
+
+
CPrinterDialogPeer createCPrinterDialog(CPrinterDialog target) {
PlatformComponent platformComponent = createPlatformComponent();
PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.DIALOG);
@@ -254,7 +261,7 @@
PlatformComponent platformComponent = createPlatformComponent();
PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.DIALOG);
- return createDelegatedPeer(target, platformComponent, platformWindow);
+ return createDelegatedPeer(target, platformComponent, platformWindow, LWWindowPeer.PeerType.DIALOG);
}
@Override
--- a/jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Fri Dec 14 11:21:09 2012 -0800
+++ b/jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Fri Dec 14 11:22:16 2012 -0800
@@ -47,7 +47,8 @@
SIMPLEWINDOW,
FRAME,
DIALOG,
- EMBEDDEDFRAME
+ EMBEDDED_FRAME,
+ VIEW_EMBEDDED_FRAME
}
private static final PlatformLogger focusLog = PlatformLogger.getLogger("sun.lwawt.focus.LWWindowPeer");
@@ -108,6 +109,8 @@
private volatile boolean textured;
+ private final PeerType peerType;
+
/**
* Current modal blocker or null.
*
@@ -116,10 +119,11 @@
private LWWindowPeer blocker;
public LWWindowPeer(Window target, PlatformComponent platformComponent,
- PlatformWindow platformWindow)
+ PlatformWindow platformWindow, PeerType peerType)
{
super(target, platformComponent);
this.platformWindow = platformWindow;
+ this.peerType = peerType;
Window owner = target.getOwner();
LWWindowPeer ownerPeer = (owner != null) ? (LWWindowPeer)owner.getPeer() : null;
@@ -275,6 +279,11 @@
@Override
public void setBounds(int x, int y, int w, int h, int op) {
+
+ if((op & NO_EMBEDDED_CHECK) == 0 && getPeerType() == PeerType.VIEW_EMBEDDED_FRAME) {
+ return;
+ }
+
if ((op & SET_CLIENT_SIZE) != 0) {
// SET_CLIENT_SIZE is only applicable to window peers, so handle it here
// instead of pulling 'insets' field up to LWComponentPeer
@@ -1210,6 +1219,10 @@
return this == grabbingWindow;
}
+ public PeerType getPeerType() {
+ return peerType;
+ }
+
@Override
public String toString() {
return super.toString() + " [target is " + getTarget() + "]";
--- a/jdk/src/macosx/classes/sun/lwawt/PlatformWindow.java Fri Dec 14 11:21:09 2012 -0800
+++ b/jdk/src/macosx/classes/sun/lwawt/PlatformWindow.java Fri Dec 14 11:22:16 2012 -0800
@@ -151,4 +151,6 @@
public long getLayerPtr();
public LWWindowPeer getPeer();
+
+ public boolean isUnderMouse();
}
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CMouseInfoPeer.java Fri Dec 14 11:21:09 2012 -0800
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CMouseInfoPeer.java Fri Dec 14 11:22:16 2012 -0800
@@ -26,7 +26,6 @@
package sun.lwawt.macosx;
import java.awt.Window;
-
import sun.lwawt.LWMouseInfoPeer;
import sun.lwawt.LWWindowPeer;
@@ -41,10 +40,6 @@
return false;
}
- LWWindowPeer peer = (LWWindowPeer)w.getPeer();
- CPlatformWindow platformWindow = (CPlatformWindow)peer.getPlatformWindow();
- return nativeIsWindowUnderMouse(platformWindow.getNSWindowPtr());
+ return ((LWWindowPeer)w.getPeer()).getPlatformWindow().isUnderMouse();
}
-
- private static native boolean nativeIsWindowUnderMouse(long ptr);
}
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformEmbeddedFrame.java Fri Dec 14 11:21:09 2012 -0800
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformEmbeddedFrame.java Fri Dec 14 11:22:16 2012 -0800
@@ -25,16 +25,13 @@
package sun.lwawt.macosx;
-import sun.lwawt.PlatformWindow;
-import sun.lwawt.LWWindowPeer;
-
-import sun.java2d.opengl.CGLLayer;
+import java.awt.*;
+import sun.awt.CausedFocusEvent;
import sun.java2d.SurfaceData;
-
-import sun.awt.CausedFocusEvent;
-
-import java.awt.*;
-
+import sun.java2d.opengl.CGLLayer;
+import sun.lwawt.LWWindowPeer;
+import sun.lwawt.LWWindowPeer.PeerType;
+import sun.lwawt.PlatformWindow;
import sun.util.logging.PlatformLogger;
/*
@@ -134,6 +131,7 @@
// This method should be properly implemented for applets.
// It returns null just as a stub.
+ @Override
public PlatformWindow getTopmostPlatformWindowUnderMouse() { return null; }
@Override
@@ -192,4 +190,13 @@
@Override
public void setModalBlocked(boolean blocked) {}
+
+ /*
+ * The method could not be implemented due to CALayer restrictions.
+ * The exeption enforce clients not to use it.
+ */
+ @Override
+ public boolean isUnderMouse() {
+ throw new RuntimeException("Not implemented");
+ }
}
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformView.java Fri Dec 14 11:21:09 2012 -0800
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformView.java Fri Dec 14 11:22:16 2012 -0800
@@ -26,8 +26,11 @@
package sun.lwawt.macosx;
import java.awt.*;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.VolatileImage;
import sun.awt.CGraphicsConfig;
+import sun.awt.CGraphicsEnvironment;
import sun.lwawt.LWWindowPeer;
import sun.lwawt.macosx.event.NSEvent;
@@ -37,6 +40,10 @@
public class CPlatformView extends CFRetainedResource {
private native long nativeCreateView(int x, int y, int width, int height, long windowLayerPtr);
+ private static native void nativeSetAutoResizable(long awtView, boolean toResize);
+ private static native int nativeGetNSViewDisplayID(long awtView);
+ private static native Rectangle2D nativeGetLocationOnScreen(long awtView);
+ private static native boolean nativeIsViewUnderMouse(long ptr);
private LWWindowPeer peer;
private SurfaceData surfaceData;
@@ -59,7 +66,7 @@
public long getAWTView() {
return ptr;
- }
+ }
public boolean isOpaque() {
return !peer.isTranslucent();
@@ -158,10 +165,46 @@
}
}
+ public void setAutoResizable(boolean toResize) {
+ nativeSetAutoResizable(this.getAWTView(), toResize);
+ }
+
+ public boolean isUnderMouse() {
+ return nativeIsViewUnderMouse(getAWTView());
+ }
+
+ public GraphicsDevice getGraphicsDevice() {
+ GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
+ CGraphicsEnvironment cge = (CGraphicsEnvironment)ge;
+ int displayID = nativeGetNSViewDisplayID(getAWTView());
+ GraphicsDevice gd = cge.getScreenDevice(displayID);
+ if (gd == null) {
+ // this could possibly happen during device removal
+ // use the default screen device in this case
+ gd = ge.getDefaultScreenDevice();
+ }
+ return gd;
+ }
+
+ public Point getLocationOnScreen() {
+ Rectangle r = nativeGetLocationOnScreen(this.getAWTView()).getBounds();
+ return new Point(r.x, r.y);
+ }
+
// ----------------------------------------------------------------------
// NATIVE CALLBACKS
// ----------------------------------------------------------------------
+ /*
+ * The callback is called only in the embedded case when the view is
+ * automatically resized by the superview.
+ * In normal mode this method is never called.
+ */
+ private void deliverResize(int x, int y, int w, int h) {
+ peer.notifyReshape(x, y, w, h);
+ }
+
+
private void deliverMouseEvent(NSEvent event) {
int x = event.getX();
int y = getBounds().height - event.getY();
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Fri Dec 14 11:21:09 2012 -0800
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Fri Dec 14 11:22:16 2012 -0800
@@ -64,8 +64,6 @@
private static native void nativeDispose(long nsWindowPtr);
private static native CPlatformWindow nativeGetTopmostPlatformWindowUnderMouse();
- private static native int nativeGetNSWindowDisplayID(long nsWindowPtr);
-
// Loger to report issues happened during execution but that do not affect functionality
private static final PlatformLogger logger = PlatformLogger.getLogger("sun.lwawt.macosx.CPlatformWindow");
private static final PlatformLogger focusLogger = PlatformLogger.getLogger("sun.lwawt.macosx.focus.CPlatformWindow");
@@ -211,9 +209,8 @@
private CPlatformResponder responder;
private volatile boolean zoomed = false; // from native perspective
- public CPlatformWindow(final PeerType peerType) {
+ public CPlatformWindow() {
super(0, true);
- assert (peerType == PeerType.SIMPLEWINDOW || peerType == PeerType.DIALOG || peerType == PeerType.FRAME);
}
/*
@@ -429,16 +426,7 @@
@Override
public GraphicsDevice getGraphicsDevice() {
- GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
- CGraphicsEnvironment cge = (CGraphicsEnvironment)ge;
- int displayID = nativeGetNSWindowDisplayID(getNSWindowPtr());
- GraphicsDevice gd = cge.getScreenDevice(displayID);
- if (gd == null) {
- // this could possibly happen during device removal
- // use the default screen device in this case
- gd = ge.getDefaultScreenDevice();
- }
- return gd;
+ return contentView.getGraphicsDevice();
}
@Override // PlatformWindow
@@ -833,6 +821,11 @@
return peer;
}
+ @Override
+ public boolean isUnderMouse() {
+ return contentView.isUnderMouse();
+ }
+
public CPlatformView getContentView() {
return contentView;
}
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPrinterDialogPeer.java Fri Dec 14 11:21:09 2012 -0800
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPrinterDialogPeer.java Fri Dec 14 11:22:16 2012 -0800
@@ -41,7 +41,7 @@
public CPrinterDialogPeer(CPrinterDialog target, PlatformComponent platformComponent,
PlatformWindow platformWindow)
{
- super(target, platformComponent, platformWindow);
+ super(target, platformComponent, platformWindow, LWWindowPeer.PeerType.DIALOG);
//super(target);
fTarget = target;
super.initialize();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CViewEmbeddedFrame.java Fri Dec 14 11:22:16 2012 -0800
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2012, 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. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+package sun.lwawt.macosx;
+
+import java.awt.AWTKeyStroke;
+import java.awt.Toolkit;
+import java.lang.reflect.InvocationTargetException;
+import sun.awt.EmbeddedFrame;
+import sun.lwawt.LWToolkit;
+import sun.lwawt.LWWindowPeer;
+/*
+ * The CViewEmbeddedFrame class is used in the SWT_AWT bridge.
+ * This is a part of public API and should not be renamed or moved
+ */
+public class CViewEmbeddedFrame extends EmbeddedFrame {
+
+ private final long nsViewPtr;
+
+ private boolean isActive = false;
+
+ public CViewEmbeddedFrame(long nsViewPtr) {
+ this.nsViewPtr = nsViewPtr;
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public void addNotify() {
+ if (getPeer() == null) {
+ LWToolkit toolkit = (LWToolkit) Toolkit.getDefaultToolkit();
+ setPeer(toolkit.createEmbeddedFrame(this));
+ }
+ super.addNotify();
+ }
+
+ public long getEmbedderHandle() {
+ return nsViewPtr;
+ }
+
+ @Override
+ public void registerAccelerator(AWTKeyStroke awtks) {
+ }
+
+ @Override
+ public void unregisterAccelerator(AWTKeyStroke awtks) {
+ }
+
+ public boolean isParentWindowActive() {
+ return isActive;
+ }
+
+ /*
+ * Synthetic event delivery for focus management
+ */
+ @Override
+ public void synthesizeWindowActivation(boolean activated) {
+ if (isActive != activated) {
+ isActive = activated;
+ ((LWWindowPeer)getPeer()).notifyActivation(activated, null);
+ }
+ }
+
+ /*
+ * Initializes the embedded frame bounds and validates a component.
+ * Designed to be called from the main thread
+ * This method should be called once from the initialization of the SWT_AWT Bridge
+ */
+ @SuppressWarnings("deprecation")
+ public void validateWithBounds(final int x, final int y, final int width, final int height) {
+ try {
+ LWCToolkit.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ ((LWWindowPeer) getPeer()).setBoundsPrivate(0, 0, width, height);
+ validate();
+ setVisible(true);
+ }
+ }, null);
+ } catch (InterruptedException | InvocationTargetException ex) {}
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CViewPlatformEmbeddedFrame.java Fri Dec 14 11:22:16 2012 -0800
@@ -0,0 +1,211 @@
+/*
+ * Copyright (c) 2012, 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. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package sun.lwawt.macosx;
+
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.GraphicsDevice;
+import java.awt.Insets;
+import java.awt.MenuBar;
+import java.awt.Point;
+import java.awt.Window;
+import sun.awt.CausedFocusEvent.Cause;
+import sun.java2d.SurfaceData;
+import sun.lwawt.LWWindowPeer;
+import sun.lwawt.PlatformWindow;
+
+public class CViewPlatformEmbeddedFrame implements PlatformWindow {
+
+ private CPlatformView view;
+ private LWWindowPeer peer;
+ private CViewEmbeddedFrame target;
+ private CPlatformResponder responder;
+
+ @Override // PlatformWindow
+ public void initialize(Window target, final LWWindowPeer peer, PlatformWindow owner) {
+ this.peer = peer;
+ this.target = (CViewEmbeddedFrame) target;
+ responder = new CPlatformResponder(peer, false);
+
+ view = new CPlatformView();
+ view.initialize(peer, responder);
+
+ CWrapper.NSView.addSubview(this.target.getEmbedderHandle(), view.getAWTView());
+ view.setAutoResizable(true);
+ }
+
+ public long getNSViewPtr() {
+ return view.getAWTView();
+ }
+
+ @Override
+ public long getLayerPtr() {
+ return view.getWindowLayerPtr();
+ }
+
+ @Override
+ public LWWindowPeer getPeer() {
+ return peer;
+ }
+
+ @Override
+ public void dispose() {
+ CWrapper.NSView.removeFromSuperview(view.getAWTView());
+ view.dispose();
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ CWrapper.NSView.setHidden(view.getAWTView(), !visible);
+ }
+
+ @Override
+ public void setTitle(String title) {
+ }
+
+ @Override
+ public void setBounds(int x, int y, int w, int h) {
+ view.setBounds(x, y, w, h);
+ peer.notifyReshape(x, y, w, h);
+ }
+
+ @Override
+ public GraphicsDevice getGraphicsDevice() {
+ return view.getGraphicsDevice();
+ }
+
+ @Override
+ public Point getLocationOnScreen() {
+ return view.getLocationOnScreen();
+ }
+
+ @Override
+ public Insets getInsets() {
+ return new Insets(0, 0, 0, 0);
+ }
+
+ @Override
+ public FontMetrics getFontMetrics(Font f) {
+ throw new RuntimeException("Not implemented");
+ }
+
+ @Override
+ public SurfaceData getScreenSurface() {
+ return view.getSurfaceData();
+ }
+
+ @Override
+ public SurfaceData replaceSurfaceData() {
+ return view.replaceSurfaceData();
+ }
+
+ @Override
+ public void setModalBlocked(boolean blocked) {
+ }
+
+ @Override
+ public void toFront() {
+ }
+
+ @Override
+ public void toBack() {
+ }
+
+ @Override
+ public void setMenuBar(MenuBar mb) {
+ }
+
+ @Override
+ public void setAlwaysOnTop(boolean value) {
+ }
+
+ @Override
+ public PlatformWindow getTopmostPlatformWindowUnderMouse() {
+ return null;
+ }
+
+ @Override
+ public void updateFocusableWindowState() {
+ }
+
+ @Override
+ public boolean rejectFocusRequest(Cause cause) {
+ return false;
+ }
+
+ @Override
+ public boolean requestWindowFocus() {
+ return true;
+ }
+
+ @Override
+ public boolean isActive() {
+ return target.isParentWindowActive();
+ }
+
+ @Override
+ public void setResizable(boolean resizable) {
+ }
+
+ @Override
+ public void setSizeConstraints(int minW, int minH, int maxW, int maxH) {
+ }
+
+ @Override
+ public Graphics transformGraphics(Graphics g) {
+ return g;
+ }
+
+ @Override
+ public void updateIconImages() {
+ }
+
+ @Override
+ public void setOpacity(float opacity) {
+ }
+
+ @Override
+ public void setOpaque(boolean isOpaque) {
+ }
+
+ @Override
+ public void enterFullScreenMode() {
+ }
+
+ @Override
+ public void exitFullScreenMode() {
+ }
+
+ @Override
+ public void setWindowState(int windowState) {
+ }
+
+ @Override
+ public boolean isUnderMouse() {
+ return view.isUnderMouse();
+ }
+}
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CWrapper.java Fri Dec 14 11:21:09 2012 -0800
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CWrapper.java Fri Dec 14 11:22:16 2012 -0800
@@ -85,6 +85,8 @@
public static native void enterFullScreenMode(long view);
public static native void exitFullScreenMode(long view);
+
+ public static native void setHidden(long view, boolean hidden);
}
public static final class NSObject {
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Fri Dec 14 11:21:09 2012 -0800
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Fri Dec 14 11:22:16 2012 -0800
@@ -156,10 +156,13 @@
@Override
protected PlatformWindow createPlatformWindow(PeerType peerType) {
- if (peerType == PeerType.EMBEDDEDFRAME) {
+ if (peerType == PeerType.EMBEDDED_FRAME) {
return new CPlatformEmbeddedFrame();
+ } else if (peerType == PeerType.VIEW_EMBEDDED_FRAME) {
+ return new CViewPlatformEmbeddedFrame();
} else {
- return new CPlatformWindow(peerType);
+ assert (peerType == PeerType.SIMPLEWINDOW || peerType == PeerType.DIALOG || peerType == PeerType.FRAME);
+ return new CPlatformWindow();
}
}
--- a/jdk/src/macosx/native/sun/awt/AWTSurfaceLayers.m Fri Dec 14 11:21:09 2012 -0800
+++ b/jdk/src/macosx/native/sun/awt/AWTSurfaceLayers.m Fri Dec 14 11:22:16 2012 -0800
@@ -99,17 +99,16 @@
__block AWTSurfaceLayers *surfaceLayers = nil;
JNF_COCOA_ENTER(env);
-AWT_ASSERT_NOT_APPKIT_THREAD;
- [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
- AWT_ASSERT_APPKIT_THREAD;
-
- CALayer *windowLayer = jlong_to_ptr(windowLayerPtr);
- surfaceLayers = [[AWTSurfaceLayers alloc] initWithWindowLayer: windowLayer];
- CFRetain(surfaceLayers);
- [surfaceLayers release];
+ [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
+ AWT_ASSERT_APPKIT_THREAD;
+
+ CALayer *windowLayer = jlong_to_ptr(windowLayerPtr);
+ surfaceLayers = [[AWTSurfaceLayers alloc] initWithWindowLayer: windowLayer];
+ CFRetain(surfaceLayers);
+ [surfaceLayers release];
}];
-
+
JNF_COCOA_EXIT(env);
return ptr_to_jlong(surfaceLayers);
@@ -126,12 +125,13 @@
JNF_COCOA_ENTER(env);
AWTSurfaceLayers *surfaceLayers = OBJC(surfaceLayersPtr);
- [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
+
+ [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
AWT_ASSERT_APPKIT_THREAD;
CGRect rect = CGRectMake(x, y, width, height);
[surfaceLayers setBounds: rect];
- }];
+ }];
JNF_COCOA_EXIT(env);
}
--- a/jdk/src/macosx/native/sun/awt/AWTView.m Fri Dec 14 11:21:09 2012 -0800
+++ b/jdk/src/macosx/native/sun/awt/AWTView.m Fri Dec 14 11:22:16 2012 -0800
@@ -83,6 +83,7 @@
mouseIsOver = NO;
[self resetTrackingArea];
+ [self setAutoresizesSubviews:NO];
if (windowLayer != nil) {
self.cglLayer = windowLayer;
@@ -174,6 +175,11 @@
* Automatically triggered functions.
*/
+- (void)resizeWithOldSuperviewSize:(NSSize)oldBoundsSize {
+ [super resizeWithOldSuperviewSize: oldBoundsSize];
+ [self deliverResize: [self frame]];
+}
+
/*
* MouseEvents support
*/
@@ -437,6 +443,18 @@
}
}
+-(void) deliverResize: (NSRect) rect {
+ jint x = (jint) rect.origin.x;
+ jint y = (jint) rect.origin.y;
+ jint w = (jint) rect.size.width;
+ jint h = (jint) rect.size.height;
+ JNIEnv *env = [ThreadUtilities getJNIEnv];
+ static JNF_CLASS_CACHE(jc_PlatformView, "sun/lwawt/macosx/CPlatformView");
+ static JNF_MEMBER_CACHE(jm_deliverResize, jc_PlatformView, "deliverResize", "(IIII)V");
+ JNFCallVoidMethod(env, m_cPlatformView, jm_deliverResize, x,y,w,h);
+}
+
+
- (void) drawRect:(NSRect)dirtyRect {
AWT_ASSERT_APPKIT_THREAD;
@@ -1220,21 +1238,19 @@
__block AWTView *newView = nil;
JNF_COCOA_ENTER(env);
-AWT_ASSERT_NOT_APPKIT_THREAD;
NSRect rect = NSMakeRect(originX, originY, width, height);
jobject cPlatformView = (*env)->NewGlobalRef(env, obj);
- [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
+ [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
AWT_ASSERT_APPKIT_THREAD;
-
+
CALayer *windowLayer = jlong_to_ptr(windowLayerPtr);
AWTView *view = [[AWTView alloc] initWithRect:rect
platformView:cPlatformView
windowLayer:windowLayer];
CFRetain(view);
[view release]; // GC
-
newView = view;
}];
@@ -1242,3 +1258,125 @@
return ptr_to_jlong(newView);
}
+
+/*
+ * Class: sun_lwawt_macosx_CPlatformView
+ * Method: nativeSetAutoResizable
+ * Signature: (JZ)V;
+ */
+
+JNIEXPORT void JNICALL
+Java_sun_lwawt_macosx_CPlatformView_nativeSetAutoResizable
+(JNIEnv *env, jclass cls, jlong viewPtr, jboolean toResize)
+{
+JNF_COCOA_ENTER(env);
+
+ NSView *view = (NSView *)jlong_to_ptr(viewPtr);
+
+ [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
+ AWT_ASSERT_APPKIT_THREAD;
+
+ if (toResize) {
+ [view setAutoresizingMask: NSViewHeightSizable | NSViewWidthSizable];
+ } else {
+ [view setAutoresizingMask: NSViewMinYMargin | NSViewMaxXMargin];
+ }
+
+ if ([view superview] != nil) {
+ [[view superview] setAutoresizesSubviews:(BOOL)toResize];
+ }
+
+ }];
+JNF_COCOA_EXIT(env);
+}
+
+/*
+ * Class: sun_lwawt_macosx_CPlatformView
+ * Method: nativeGetNSViewDisplayID
+ * Signature: (J)I;
+ */
+
+JNIEXPORT jint JNICALL
+Java_sun_lwawt_macosx_CPlatformView_nativeGetNSViewDisplayID
+(JNIEnv *env, jclass cls, jlong viewPtr)
+{
+ __block jint ret; //CGDirectDisplayID
+
+JNF_COCOA_ENTER(env);
+
+ NSView *view = (NSView *)jlong_to_ptr(viewPtr);
+ NSWindow *window = [view window];
+
+ [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
+ AWT_ASSERT_APPKIT_THREAD;
+
+ ret = (jint)[[AWTWindow getNSWindowDisplayID_AppKitThread: window] intValue];
+ }];
+
+JNF_COCOA_EXIT(env);
+
+ return ret;
+}
+
+/*
+ * Class: sun_lwawt_macosx_CPlatformView
+ * Method: nativeGetLocationOnScreen
+ * Signature: (J)Ljava/awt/Rectangle;
+ */
+
+JNIEXPORT jobject JNICALL
+Java_sun_lwawt_macosx_CPlatformView_nativeGetLocationOnScreen
+(JNIEnv *env, jclass cls, jlong viewPtr)
+{
+ jobject jRect = NULL;
+
+JNF_COCOA_ENTER(env);
+
+ __block NSRect rect = NSZeroRect;
+
+ NSView *view = (NSView *)jlong_to_ptr(viewPtr);
+ [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
+ AWT_ASSERT_APPKIT_THREAD;
+
+ NSRect viewBounds = [view bounds];
+ NSRect frameInWindow = [view convertRect:viewBounds toView:nil];
+ rect = [[view window] convertRectToScreen:frameInWindow];
+ NSRect screenRect = [[NSScreen mainScreen] frame];
+ //Convert coordinates to top-left corner origin
+ rect.origin.y = screenRect.size.height - rect.origin.y - viewBounds.size.height;
+ }];
+ jRect = NSToJavaRect(env, rect);
+
+JNF_COCOA_EXIT(env);
+
+ return jRect;
+}
+
+/*
+ * Class: sun_lwawt_macosx_CPlatformView
+ * Method: nativeIsViewUnderMouse
+ * Signature: (J)Z;
+ */
+
+JNIEXPORT jboolean JNICALL Java_sun_lwawt_macosx_CPlatformView_nativeIsViewUnderMouse
+(JNIEnv *env, jclass clazz, jlong viewPtr)
+{
+ __block jboolean underMouse = JNI_FALSE;
+
+JNF_COCOA_ENTER(env);
+
+ NSView *nsView = OBJC(viewPtr);
+ [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
+ AWT_ASSERT_APPKIT_THREAD;
+
+ NSPoint ptWindowCoords = [[nsView window] mouseLocationOutsideOfEventStream];
+ NSPoint ptViewCoords = [nsView convertPoint:ptWindowCoords fromView:nil];
+ underMouse = [nsView hitTest:ptViewCoords] != nil;
+ }];
+
+JNF_COCOA_EXIT(env);
+
+ return underMouse;
+}
+
+
--- a/jdk/src/macosx/native/sun/awt/AWTWindow.m Fri Dec 14 11:21:09 2012 -0800
+++ b/jdk/src/macosx/native/sun/awt/AWTWindow.m Fri Dec 14 11:22:16 2012 -0800
@@ -1156,34 +1156,6 @@
/*
* Class: sun_lwawt_macosx_CPlatformWindow
- * Method: nativeGetDisplayID_AppKitThread
- * Signature: (J)I
- */
-JNIEXPORT jint JNICALL
-Java_sun_lwawt_macosx_CPlatformWindow_nativeGetNSWindowDisplayID
-(JNIEnv *env, jclass clazz, jlong windowPtr)
-{
- __block jint ret; // CGDirectDisplayID
-
-JNF_COCOA_ENTER(env);
-
- NSWindow *window = OBJC(windowPtr);
-
- if ([NSThread isMainThread]) {
- ret = (jint)[[AWTWindow getNSWindowDisplayID_AppKitThread: window] intValue];
- } else {
- [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
- ret = (jint)[[AWTWindow getNSWindowDisplayID_AppKitThread: window] intValue];
- }];
- }
-
-JNF_COCOA_EXIT(env);
-
- return ret;
-}
-
-/*
- * Class: sun_lwawt_macosx_CPlatformWindow
* Method: _toggleFullScreenMode
* Signature: (J)V
*/
@@ -1203,27 +1175,6 @@
JNF_COCOA_EXIT(env);
}
-JNIEXPORT jboolean JNICALL Java_sun_lwawt_macosx_CMouseInfoPeer_nativeIsWindowUnderMouse
-(JNIEnv *env, jclass clazz, jlong windowPtr)
-{
- __block jboolean underMouse = JNI_FALSE;
-
-JNF_COCOA_ENTER(env);
-AWT_ASSERT_NOT_APPKIT_THREAD;
-
- NSWindow *nsWindow = OBJC(windowPtr);
- [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^() {
- AWT_ASSERT_APPKIT_THREAD;
-
- NSPoint pt = [nsWindow mouseLocationOutsideOfEventStream];
- underMouse = [[nsWindow contentView] hitTest:pt] != nil;
- }];
-
-JNF_COCOA_EXIT(env);
-
- return underMouse;
-}
-
JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPlatformWindow_nativeSetEnabled
(JNIEnv *env, jclass clazz, jlong windowPtr, jboolean isEnabled)
{
--- a/jdk/src/macosx/native/sun/awt/CCursorManager.m Fri Dec 14 11:21:09 2012 -0800
+++ b/jdk/src/macosx/native/sun/awt/CCursorManager.m Fri Dec 14 11:22:16 2012 -0800
@@ -123,14 +123,15 @@
jobject jpt = NULL;
JNF_COCOA_ENTER(env);
-AWT_ASSERT_NOT_APPKIT_THREAD;
__block NSPoint pt = NSZeroPoint;
- [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
- AWT_ASSERT_APPKIT_THREAD;
-
- pt = ConvertNSScreenPoint(env, [NSEvent mouseLocation]);
+
+ [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
+ AWT_ASSERT_APPKIT_THREAD;
+
+ pt = ConvertNSScreenPoint(env, [NSEvent mouseLocation]);
}];
+
jpt = NSToJavaPoint(env, pt);
JNF_COCOA_EXIT(env);
--- a/jdk/src/macosx/native/sun/awt/CWrapper.m Fri Dec 14 11:21:09 2012 -0800
+++ b/jdk/src/macosx/native/sun/awt/CWrapper.m Fri Dec 14 11:22:16 2012 -0800
@@ -651,6 +651,26 @@
}
/*
+ * Class: sun_lwawt_macosx_CWrapper$NSView
+ * Method: setHidden
+ * Signature: (JZ)V
+ */
+JNIEXPORT jlong JNICALL
+Java_sun_lwawt_macosx_CWrapper_00024NSView_setHidden
+(JNIEnv *env, jclass cls, jlong viewPtr, jboolean toHide)
+{
+ JNF_COCOA_ENTER(env);
+
+ NSView *view = (NSView *)jlong_to_ptr(viewPtr);
+ [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
+ [view setHidden:(BOOL)toHide];
+ }];
+
+ JNF_COCOA_EXIT(env);
+}
+
+
+/*
* Class: sun_lwawt_macosx_CWrapper$NSScreen
* Method: frame
* Signature: (J)Ljava/awt/Rectangle;
--- a/jdk/src/macosx/native/sun/awt/awt.m Fri Dec 14 11:21:09 2012 -0800
+++ b/jdk/src/macosx/native/sun/awt/awt.m Fri Dec 14 11:22:16 2012 -0800
@@ -95,7 +95,7 @@
CFRelease(busyObserver);
CFRelease(notBusyObserver);
-
+
if (!headless) setBusy(YES);
// Set the java name of the AppKit main thread appropriately.
@@ -367,7 +367,8 @@
CFRunLoopRef runLoop = [[NSRunLoop currentRunLoop] getCFRunLoop];
CFRunLoopRemoveObserver(runLoop, busyObserver, kCFRunLoopDefaultMode);
CFRunLoopRemoveObserver(runLoop, notBusyObserver, kCFRunLoopDefaultMode);
-
+ // We don't track if the runloop is busy, so set it free to let AWT finish when it needs
+ setBusy(NO);
busyObserver = NULL;
notBusyObserver = NULL;
} else {
--- a/jdk/src/macosx/native/sun/java2d/opengl/CGLLayer.m Fri Dec 14 11:21:09 2012 -0800
+++ b/jdk/src/macosx/native/sun/java2d/opengl/CGLLayer.m Fri Dec 14 11:22:16 2012 -0800
@@ -151,16 +151,15 @@
__block CGLLayer *layer = nil;
JNF_COCOA_ENTER(env);
-AWT_ASSERT_NOT_APPKIT_THREAD;
JNFJObjectWrapper *javaLayer = [JNFJObjectWrapper wrapperWithJObject:obj withEnv:env];
- [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
- AWT_ASSERT_APPKIT_THREAD;
-
- layer = [[CGLLayer alloc] initWithJavaLayer: javaLayer];
+ [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
+ AWT_ASSERT_APPKIT_THREAD;
+
+ layer = [[CGLLayer alloc] initWithJavaLayer: javaLayer];
}];
-
+
JNF_COCOA_EXIT(env);
return ptr_to_jlong(layer);
--- a/jdk/src/macosx/native/sun/osxapp/ThreadUtilities.h Fri Dec 14 11:21:09 2012 -0800
+++ b/jdk/src/macosx/native/sun/osxapp/ThreadUtilities.h Fri Dec 14 11:22:16 2012 -0800
@@ -139,7 +139,7 @@
+ (JNIEnv*)getJNIEnvUncached;
+ (void)performOnMainThread:(SEL)aSelector onObject:(id)target withObject:(id)arg waitUntilDone:(BOOL)wait awtMode:(BOOL)inAWT;
-
++ (void)performOnMainThreadWaiting:(BOOL)wait block:(void (^)())block;
@end
void OSXAPP_SetJavaVM(JavaVM *vm);
--- a/jdk/src/macosx/native/sun/osxapp/ThreadUtilities.m Fri Dec 14 11:21:09 2012 -0800
+++ b/jdk/src/macosx/native/sun/osxapp/ThreadUtilities.m Fri Dec 14 11:22:16 2012 -0800
@@ -245,6 +245,14 @@
}
}
++ (void)performOnMainThreadWaiting:(BOOL)wait block:(void (^)())block {
+ if ([NSThread isMainThread] && wait == YES) {
+ block();
+ } else {
+ [JNFRunLoop performOnMainThreadWaiting:wait withBlock:block];
+ }
+}
+
@end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JInternalFrame/5066752/bug5066752.java Fri Dec 14 11:22:16 2012 -0800
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2012, 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 5066752
+ @summary Transparent JDesktopPane impossible because isOpaque() returns true
+ @author mb50250: area=JDesktopPane
+ @library ../../regtesthelpers
+ @build Util
+ @run main bug5066752
+*/
+
+import java.awt.*;
+import javax.swing.*;
+import sun.awt.*;
+
+public class bug5066752
+{
+ private static JFrame frame;
+
+ public static void main(String[] args) throws Exception {
+ SunToolkit tk = (SunToolkit)Toolkit.getDefaultToolkit();
+ Robot r = new Robot();
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ createAndShowGUI();
+ }
+ });
+ tk.realSync();
+
+ r.delay(600);
+
+ Point p = Util.getCenterPoint(frame);
+ Color color = r.getPixelColor((int) p.getX(), (int) p.getY());
+ if (!color.equals(Color.RED)) {
+ throw new Exception("Test failed: JDesktopPane isn't transparent. Expected color is (red color): " + Color.RED + ", actual color is: " + color);
+ }
+ }
+
+ private static void createAndShowGUI() {
+ frame = new JFrame();
+
+ frame.setLayout(new BorderLayout());
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+ JPanel panel = new JPanel();
+ panel.setLayout(new BorderLayout());
+ panel.setBackground(Color.RED);
+ frame.add(panel, BorderLayout.CENTER);
+
+ JDesktopPane dp = new JDesktopPane();
+ dp.setOpaque(false);
+ panel.add(dp, BorderLayout.CENTER);
+
+ frame.setBounds(200, 200, 300, 200);
+ frame.setVisible(true);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/RepaintManager/IconifyTest/IconifyTest.java Fri Dec 14 11:22:16 2012 -0800
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2012, 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 4665214
+ * @summary Makes sure that RepaintManager doesn't attempt to repaint
+ * a frame when it is iconified.
+ * @author Scott Violet
+ * @run main IconifyTest
+ */
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import sun.awt.*;
+
+public class IconifyTest {
+ private static volatile boolean windowIconifiedIsCalled = false;
+ private static volatile boolean frameIsRepainted = false;
+ static JFrame frame;
+ static JButton button;
+
+ public static void main(String[] args) throws Throwable {
+ SunToolkit toolkit = (SunToolkit) SunToolkit.getDefaultToolkit();
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ frame = new JFrame();
+ button = new JButton("HI");
+ frame.getContentPane().add(button);
+ frame.addWindowListener(new WindowAdapter() {
+ public void windowIconified(WindowEvent e) {
+ windowIconifiedIsCalled = true;
+ RepaintManager rm = RepaintManager.currentManager(null);
+ rm.paintDirtyRegions();
+ button.repaint();
+ if (!rm.getDirtyRegion(button).isEmpty()) {
+ frameIsRepainted = true;
+ }
+ }
+ });
+ frame.pack();
+ frame.setVisible(true);
+ }
+ });
+ toolkit.realSync();
+
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ frame.setExtendedState(Frame.ICONIFIED);
+ }
+ });
+ toolkit.realSync();
+
+ if (!windowIconifiedIsCalled) {
+ throw new Exception("Test failed: window was not iconified.");
+ }
+ if (frameIsRepainted) {
+ throw new Exception("Test failed: frame was repainted when window was iconified.");
+ }
+ }
+}