diff --git a/java/awt/dnd/DragSource.java b/java/awt/dnd/DragSource.java index af8b376684..bd8d4133d9 100644 --- a/java/awt/dnd/DragSource.java +++ b/java/awt/dnd/DragSource.java @@ -144,15 +144,11 @@ public void startDrag(DragGestureEvent trigger, Cursor dragCursor, { flavorMap = map; - if (peer == null) - peer = Toolkit.getDefaultToolkit().createDragSourceContextPeer(trigger); - - if (context == null) - context = createDragSourceContext(peer, trigger, - dragCursor, - dragImage, - imageOffset, trans, - dsl); + // Each drag gets its own peer and context; reusing the first ones + // would drag the first Transferable again. + peer = Toolkit.getDefaultToolkit().createDragSourceContextPeer(trigger); + context = createDragSourceContext(peer, trigger, dragCursor, + dragImage, imageOffset, trans, dsl); if (peer == null) throw new InvalidDnDOperationException(); diff --git a/java/awt/dnd/DropTargetContext.java b/java/awt/dnd/DropTargetContext.java index 4c21a6e8ad..e9a8cda91e 100644 --- a/java/awt/dnd/DropTargetContext.java +++ b/java/awt/dnd/DropTargetContext.java @@ -117,11 +117,18 @@ public void removeNotify() protected void setTargetActions(int actions) { targetActions = actions; + if (dtcp != null) + dtcp.setTargetActions(actions); } protected int getTargetActions() { - return targetActions; + // As in the JDK, the peer knows the actions; without one, use the + // drop target's default actions. + if (dtcp != null) + return dtcp.getTargetActions(); + return targetActions != 0 ? targetActions + : dropTarget.getDefaultActions(); } /** @@ -162,7 +169,7 @@ protected void rejectDrop () protected DataFlavor[] getCurrentDataFlavors () { if (dtcp != null) - dtcp.getTransferDataFlavors(); + return dtcp.getTransferDataFlavors(); return null; } diff --git a/java/awt/dnd/DropTargetDragEvent.java b/java/awt/dnd/DropTargetDragEvent.java index 21c9e2b35c..db06c237d1 100644 --- a/java/awt/dnd/DropTargetDragEvent.java +++ b/java/awt/dnd/DropTargetDragEvent.java @@ -90,7 +90,7 @@ public DropTargetDragEvent (DropTargetContext context, Point location, | DnDConstants.ACTION_LINK | DnDConstants.ACTION_REFERENCE; - if (~(srcActions ^ srcActionsMask) != 0) + if ((srcActions & ~srcActionsMask) != 0) throw new IllegalArgumentException (); this.dropAction = dropAction; diff --git a/java/awt/dnd/DropTargetDropEvent.java b/java/awt/dnd/DropTargetDropEvent.java index 333f8c6cc5..9944ec9558 100644 --- a/java/awt/dnd/DropTargetDropEvent.java +++ b/java/awt/dnd/DropTargetDropEvent.java @@ -104,7 +104,7 @@ public DropTargetDropEvent(DropTargetContext dtc, Point location, | DnDConstants.ACTION_LINK | DnDConstants.ACTION_REFERENCE; - if (~(actions ^ actionsMask) != 0) + if ((actions & ~actionsMask) != 0) throw new IllegalArgumentException(); this.dropAction = dropAction;