# HG changeset patch # User anthony # Date 1407838925 -14400 # Node ID 3637212ae8f2ae666a7e1e526074f6dc8928b369 # Parent dff08260db73c641bb1efb9941628fae0b0e0976 8049065: [JLightweightFrame] Support DnD for SwingNode Summary: Delegate DnD operations to LightweightContent when appropriate Reviewed-by: ant, pchelko diff -r dff08260db73 -r 3637212ae8f2 jdk/src/macosx/classes/sun/lwawt/LWLightweightFramePeer.java --- a/jdk/src/macosx/classes/sun/lwawt/LWLightweightFramePeer.java Mon Aug 11 10:42:51 2014 +0400 +++ b/jdk/src/macosx/classes/sun/lwawt/LWLightweightFramePeer.java Tue Aug 12 14:22:05 2014 +0400 @@ -94,10 +94,12 @@ @Override public void addDropTarget(DropTarget dt) { + getLwTarget().addDropTarget(dt); } @Override public void removeDropTarget(DropTarget dt) { + getLwTarget().removeDropTarget(dt); } @Override diff -r dff08260db73 -r 3637212ae8f2 jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java --- a/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Mon Aug 11 10:42:51 2014 +0400 +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Tue Aug 12 14:22:05 2014 +0400 @@ -688,6 +688,11 @@ @Override public DragSourceContextPeer createDragSourceContextPeer( DragGestureEvent dge) throws InvalidDnDOperationException { + final LightweightFrame f = SunToolkit.getLightweightFrame(dge.getComponent()); + if (f != null) { + return f.createDragSourceContextPeer(dge); + } + return CDragSourceContextPeer.createDragSourceContextPeer(dge); } @@ -696,6 +701,11 @@ public T createDragGestureRecognizer( Class abstractRecognizerClass, DragSource ds, Component c, int srcActions, DragGestureListener dgl) { + final LightweightFrame f = SunToolkit.getLightweightFrame(c); + if (f != null) { + return f.createDragGestureRecognizer(abstractRecognizerClass, ds, c, srcActions, dgl); + } + DragGestureRecognizer dgr = null; // Create a new mouse drag gesture recognizer if we have a class match: diff -r dff08260db73 -r 3637212ae8f2 jdk/src/share/classes/sun/awt/LightweightFrame.java --- a/jdk/src/share/classes/sun/awt/LightweightFrame.java Mon Aug 11 10:42:51 2014 +0400 +++ b/jdk/src/share/classes/sun/awt/LightweightFrame.java Tue Aug 12 14:22:05 2014 +0400 @@ -25,6 +25,7 @@ package sun.awt; +import java.awt.Component; import java.awt.Container; import java.awt.Frame; import java.awt.Graphics; @@ -33,6 +34,13 @@ import java.awt.MenuComponent; import java.awt.Rectangle; import java.awt.Toolkit; +import java.awt.dnd.DragGestureEvent; +import java.awt.dnd.DragGestureListener; +import java.awt.dnd.DragGestureRecognizer; +import java.awt.dnd.DragSource; +import java.awt.dnd.DropTarget; +import java.awt.dnd.InvalidDnDOperationException; +import java.awt.dnd.peer.DragSourceContextPeer; import java.awt.peer.FramePeer; /** @@ -169,4 +177,27 @@ hostW = w; hostH = h; } + + /** + * Create a drag gesture recognizer for the lightweight frame. + */ + public abstract T createDragGestureRecognizer( + Class abstractRecognizerClass, + DragSource ds, Component c, int srcActions, + DragGestureListener dgl); + + /** + * Create a drag source context peer for the lightweight frame. + */ + public abstract DragSourceContextPeer createDragSourceContextPeer(DragGestureEvent dge) throws InvalidDnDOperationException; + + /** + * Adds a drop target to the lightweight frame. + */ + public abstract void addDropTarget(DropTarget dt); + + /** + * Removes a drop target from the lightweight frame. + */ + public abstract void removeDropTarget(DropTarget dt); } diff -r dff08260db73 -r 3637212ae8f2 jdk/src/share/classes/sun/awt/SunToolkit.java --- a/jdk/src/share/classes/sun/awt/SunToolkit.java Mon Aug 11 10:42:51 2014 +0400 +++ b/jdk/src/share/classes/sun/awt/SunToolkit.java Tue Aug 12 14:22:05 2014 +0400 @@ -2014,6 +2014,19 @@ return isInstanceOf(cls.getSuperclass(), type); } + protected static LightweightFrame getLightweightFrame(Component c) { + for (; c != null; c = c.getParent()) { + if (c instanceof LightweightFrame) { + return (LightweightFrame)c; + } + if (c instanceof Window) { + // Don't traverse owner windows + return null; + } + } + return null; + } + /////////////////////////////////////////////////////////////////////////// // // The following methods help set and identify whether a particular diff -r dff08260db73 -r 3637212ae8f2 jdk/src/share/classes/sun/swing/JLightweightFrame.java --- a/jdk/src/share/classes/sun/swing/JLightweightFrame.java Mon Aug 11 10:42:51 2014 +0400 +++ b/jdk/src/share/classes/sun/swing/JLightweightFrame.java Tue Aug 12 14:22:05 2014 +0400 @@ -37,6 +37,13 @@ import java.awt.Point; import java.awt.Rectangle; import java.awt.Window; +import java.awt.dnd.DragGestureEvent; +import java.awt.dnd.DragGestureListener; +import java.awt.dnd.DragGestureRecognizer; +import java.awt.dnd.DragSource; +import java.awt.dnd.DropTarget; +import java.awt.dnd.InvalidDnDOperationException; +import java.awt.dnd.peer.DragSourceContextPeer; import java.awt.event.ContainerEvent; import java.awt.event.ContainerListener; import java.awt.image.BufferedImage; @@ -472,4 +479,27 @@ content.setCursor(target.getCursor()); } } + + public T createDragGestureRecognizer( + Class abstractRecognizerClass, + DragSource ds, Component c, int srcActions, + DragGestureListener dgl) + { + return content == null ? null : content.createDragGestureRecognizer( + abstractRecognizerClass, ds, c, srcActions, dgl); + } + + public DragSourceContextPeer createDragSourceContextPeer(DragGestureEvent dge) throws InvalidDnDOperationException { + return content == null ? null : content.createDragSourceContextPeer(dge); + } + + public void addDropTarget(DropTarget dt) { + if (content == null) return; + content.addDropTarget(dt); + } + + public void removeDropTarget(DropTarget dt) { + if (content == null) return; + content.removeDropTarget(dt); + } } diff -r dff08260db73 -r 3637212ae8f2 jdk/src/share/classes/sun/swing/LightweightContent.java --- a/jdk/src/share/classes/sun/swing/LightweightContent.java Mon Aug 11 10:42:51 2014 +0400 +++ b/jdk/src/share/classes/sun/swing/LightweightContent.java Tue Aug 12 14:22:05 2014 +0400 @@ -26,7 +26,15 @@ package sun.swing; import javax.swing.JComponent; +import java.awt.Component; import java.awt.Cursor; +import java.awt.dnd.DragGestureEvent; +import java.awt.dnd.DragGestureListener; +import java.awt.dnd.DragGestureRecognizer; +import java.awt.dnd.DragSource; +import java.awt.dnd.DropTarget; +import java.awt.dnd.InvalidDnDOperationException; +import java.awt.dnd.peer.DragSourceContextPeer; /** * The interface by means of which the {@link JLightweightFrame} class @@ -209,4 +217,33 @@ * @param cursor a cursor to set */ default public void setCursor(Cursor cursor) { } + + /** + * Create a drag gesture recognizer for the lightweight frame. + */ + default public T createDragGestureRecognizer( + Class abstractRecognizerClass, + DragSource ds, Component c, int srcActions, + DragGestureListener dgl) + { + return null; + } + + /** + * Create a drag source context peer for the lightweight frame. + */ + default public DragSourceContextPeer createDragSourceContextPeer(DragGestureEvent dge) throws InvalidDnDOperationException + { + return null; + } + + /** + * Adds a drop target to the lightweight frame. + */ + default public void addDropTarget(DropTarget dt) {} + + /** + * Removes a drop target from the lightweight frame. + */ + default public void removeDropTarget(DropTarget dt) {} } diff -r dff08260db73 -r 3637212ae8f2 jdk/src/solaris/classes/sun/awt/X11/XLightweightFramePeer.java --- a/jdk/src/solaris/classes/sun/awt/X11/XLightweightFramePeer.java Mon Aug 11 10:42:51 2014 +0400 +++ b/jdk/src/solaris/classes/sun/awt/X11/XLightweightFramePeer.java Tue Aug 12 14:22:05 2014 +0400 @@ -26,6 +26,7 @@ package sun.awt.X11; import java.awt.Graphics; +import java.awt.dnd.DropTarget; import sun.awt.LightweightFrame; import sun.swing.JLightweightFrame; @@ -69,4 +70,14 @@ public void updateCursorImmediately() { SwingAccessor.getJLightweightFrameAccessor().updateCursor((JLightweightFrame)getLwTarget()); } + + @Override + public void addDropTarget(DropTarget dt) { + getLwTarget().addDropTarget(dt); + } + + @Override + public void removeDropTarget(DropTarget dt) { + getLwTarget().removeDropTarget(dt); + } } diff -r dff08260db73 -r 3637212ae8f2 jdk/src/solaris/classes/sun/awt/X11/XToolkit.java --- a/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Mon Aug 11 10:42:51 2014 +0400 +++ b/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Tue Aug 12 14:22:05 2014 +0400 @@ -927,6 +927,11 @@ } public DragSourceContextPeer createDragSourceContextPeer(DragGestureEvent dge) throws InvalidDnDOperationException { + final LightweightFrame f = SunToolkit.getLightweightFrame(dge.getComponent()); + if (f != null) { + return f.createDragSourceContextPeer(dge); + } + return XDragSourceContextPeer.createDragSourceContextPeer(dge); } @@ -938,6 +943,11 @@ int srcActions, DragGestureListener dgl) { + final LightweightFrame f = SunToolkit.getLightweightFrame(c); + if (f != null) { + return f.createDragGestureRecognizer(recognizerClass, ds, c, srcActions, dgl); + } + if (MouseDragGestureRecognizer.class.equals(recognizerClass)) return (T)new XMouseDragGestureRecognizer(ds, c, srcActions, dgl); else diff -r dff08260db73 -r 3637212ae8f2 jdk/src/windows/classes/sun/awt/windows/WLightweightFramePeer.java --- a/jdk/src/windows/classes/sun/awt/windows/WLightweightFramePeer.java Mon Aug 11 10:42:51 2014 +0400 +++ b/jdk/src/windows/classes/sun/awt/windows/WLightweightFramePeer.java Tue Aug 12 14:22:05 2014 +0400 @@ -27,6 +27,7 @@ import java.awt.Component; import java.awt.Graphics; +import java.awt.dnd.DropTarget; import java.awt.event.ComponentEvent; import java.awt.event.MouseEvent; @@ -94,4 +95,14 @@ public boolean isLightweightFramePeer() { return true; } + + @Override + public void addDropTarget(DropTarget dt) { + getLwTarget().addDropTarget(dt); + } + + @Override + public void removeDropTarget(DropTarget dt) { + getLwTarget().removeDropTarget(dt); + } } diff -r dff08260db73 -r 3637212ae8f2 jdk/src/windows/classes/sun/awt/windows/WToolkit.java --- a/jdk/src/windows/classes/sun/awt/windows/WToolkit.java Mon Aug 11 10:42:51 2014 +0400 +++ b/jdk/src/windows/classes/sun/awt/windows/WToolkit.java Tue Aug 12 14:22:05 2014 +0400 @@ -844,6 +844,11 @@ @Override public DragSourceContextPeer createDragSourceContextPeer(DragGestureEvent dge) throws InvalidDnDOperationException { + final LightweightFrame f = SunToolkit.getLightweightFrame(dge.getComponent()); + if (f != null) { + return f.createDragSourceContextPeer(dge); + } + return WDragSourceContextPeer.createDragSourceContextPeer(dge); } @@ -854,6 +859,11 @@ DragSource ds, Component c, int srcActions, DragGestureListener dgl) { + final LightweightFrame f = SunToolkit.getLightweightFrame(c); + if (f != null) { + return f.createDragGestureRecognizer(abstractRecognizerClass, ds, c, srcActions, dgl); + } + if (MouseDragGestureRecognizer.class.equals(abstractRecognizerClass)) return (T)new WMouseDragGestureRecognizer(ds, c, srcActions, dgl); else