# HG changeset patch # User lana # Date 1355883290 28800 # Node ID 41967e1d81c72c4f187e9e5f7232838bb2bc9081 # Parent ca1bf7f03ffb681398bff85205bab555620da32a# Parent 930f09368456d4eca0fcf468288ec04d998a6137 Merge diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/macosx/classes/sun/lwawt/LWToolkit.java --- a/jdk/src/macosx/classes/sun/lwawt/LWToolkit.java Tue Dec 18 14:49:39 2012 -0800 +++ b/jdk/src/macosx/classes/sun/lwawt/LWToolkit.java Tue Dec 18 18:14:50 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 diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java --- a/jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Tue Dec 18 14:49:39 2012 -0800 +++ b/jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Tue Dec 18 18:14:50 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() + "]"; diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/macosx/classes/sun/lwawt/PlatformWindow.java --- a/jdk/src/macosx/classes/sun/lwawt/PlatformWindow.java Tue Dec 18 14:49:39 2012 -0800 +++ b/jdk/src/macosx/classes/sun/lwawt/PlatformWindow.java Tue Dec 18 18:14:50 2012 -0800 @@ -151,4 +151,6 @@ public long getLayerPtr(); public LWWindowPeer getPeer(); + + public boolean isUnderMouse(); } diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/macosx/classes/sun/lwawt/macosx/CMouseInfoPeer.java --- a/jdk/src/macosx/classes/sun/lwawt/macosx/CMouseInfoPeer.java Tue Dec 18 14:49:39 2012 -0800 +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CMouseInfoPeer.java Tue Dec 18 18:14:50 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); } diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformEmbeddedFrame.java --- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformEmbeddedFrame.java Tue Dec 18 14:49:39 2012 -0800 +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformEmbeddedFrame.java Tue Dec 18 18:14:50 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"); + } } diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformView.java --- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformView.java Tue Dec 18 14:49:39 2012 -0800 +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformView.java Tue Dec 18 18:14:50 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(); diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java --- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Tue Dec 18 14:49:39 2012 -0800 +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Tue Dec 18 18:14:50 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; } diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/macosx/classes/sun/lwawt/macosx/CPrinterDialogPeer.java --- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPrinterDialogPeer.java Tue Dec 18 14:49:39 2012 -0800 +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPrinterDialogPeer.java Tue Dec 18 18:14:50 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(); diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/macosx/classes/sun/lwawt/macosx/CViewEmbeddedFrame.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CViewEmbeddedFrame.java Tue Dec 18 18:14:50 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) {} + } +} diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/macosx/classes/sun/lwawt/macosx/CViewPlatformEmbeddedFrame.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CViewPlatformEmbeddedFrame.java Tue Dec 18 18:14:50 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(); + } +} diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/macosx/classes/sun/lwawt/macosx/CWrapper.java --- a/jdk/src/macosx/classes/sun/lwawt/macosx/CWrapper.java Tue Dec 18 14:49:39 2012 -0800 +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CWrapper.java Tue Dec 18 18:14:50 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 { diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java --- a/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Tue Dec 18 14:49:39 2012 -0800 +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Tue Dec 18 18:14:50 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(); } } diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/macosx/native/sun/awt/AWTSurfaceLayers.m --- a/jdk/src/macosx/native/sun/awt/AWTSurfaceLayers.m Tue Dec 18 14:49:39 2012 -0800 +++ b/jdk/src/macosx/native/sun/awt/AWTSurfaceLayers.m Tue Dec 18 18:14:50 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); } diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/macosx/native/sun/awt/AWTView.m --- a/jdk/src/macosx/native/sun/awt/AWTView.m Tue Dec 18 14:49:39 2012 -0800 +++ b/jdk/src/macosx/native/sun/awt/AWTView.m Tue Dec 18 18:14:50 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; +} + + diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/macosx/native/sun/awt/AWTWindow.m --- a/jdk/src/macosx/native/sun/awt/AWTWindow.m Tue Dec 18 14:49:39 2012 -0800 +++ b/jdk/src/macosx/native/sun/awt/AWTWindow.m Tue Dec 18 18:14:50 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) { diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/macosx/native/sun/awt/CCursorManager.m --- a/jdk/src/macosx/native/sun/awt/CCursorManager.m Tue Dec 18 14:49:39 2012 -0800 +++ b/jdk/src/macosx/native/sun/awt/CCursorManager.m Tue Dec 18 18:14:50 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); diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/macosx/native/sun/awt/CWrapper.m --- a/jdk/src/macosx/native/sun/awt/CWrapper.m Tue Dec 18 14:49:39 2012 -0800 +++ b/jdk/src/macosx/native/sun/awt/CWrapper.m Tue Dec 18 18:14:50 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; diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/macosx/native/sun/awt/awt.m --- a/jdk/src/macosx/native/sun/awt/awt.m Tue Dec 18 14:49:39 2012 -0800 +++ b/jdk/src/macosx/native/sun/awt/awt.m Tue Dec 18 18:14:50 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 { diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/macosx/native/sun/java2d/opengl/CGLLayer.m --- a/jdk/src/macosx/native/sun/java2d/opengl/CGLLayer.m Tue Dec 18 14:49:39 2012 -0800 +++ b/jdk/src/macosx/native/sun/java2d/opengl/CGLLayer.m Tue Dec 18 18:14:50 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); diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/macosx/native/sun/osxapp/ThreadUtilities.h --- a/jdk/src/macosx/native/sun/osxapp/ThreadUtilities.h Tue Dec 18 14:49:39 2012 -0800 +++ b/jdk/src/macosx/native/sun/osxapp/ThreadUtilities.h Tue Dec 18 18:14:50 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); diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/macosx/native/sun/osxapp/ThreadUtilities.m --- a/jdk/src/macosx/native/sun/osxapp/ThreadUtilities.m Tue Dec 18 14:49:39 2012 -0800 +++ b/jdk/src/macosx/native/sun/osxapp/ThreadUtilities.m Tue Dec 18 18:14:50 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 diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/src/solaris/classes/sun/print/UnixPrintJob.java --- a/jdk/src/solaris/classes/sun/print/UnixPrintJob.java Tue Dec 18 14:49:39 2012 -0800 +++ b/jdk/src/solaris/classes/sun/print/UnixPrintJob.java Tue Dec 18 18:14:50 2012 -0800 @@ -939,7 +939,7 @@ * is not removed for some reason, request that it is * removed when the VM exits. */ - spoolFile = Files.createTempFile("javaprint", ".ps").toFile(); + spoolFile = Files.createTempFile("javaprint", "").toFile(); spoolFile.deleteOnExit(); } result = new FileOutputStream(spoolFile); diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/test/javax/swing/JInternalFrame/5066752/bug5066752.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JInternalFrame/5066752/bug5066752.java Tue Dec 18 18:14:50 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); + } +} diff -r ca1bf7f03ffb -r 41967e1d81c7 jdk/test/javax/swing/RepaintManager/IconifyTest/IconifyTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/RepaintManager/IconifyTest/IconifyTest.java Tue Dec 18 18:14:50 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."); + } + } +}