Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -34,22 +34,44 @@

import test.java.awt.regtesthelpers.Util;

import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSource;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.event.InputEvent;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import javax.imageio.ImageIO;
import javax.swing.SwingUtilities;

public class AcceptDropMultipleTimes {

private static final int FRAME_SIZE = 100;
private static final int FRAME_LOCATION = 100;
private static CountDownLatch dropCompleteLatch = new CountDownLatch(1);

private static volatile Frame f;

private static void initAndShowUI() {
f = new Frame("Test frame");
f.setBounds(FRAME_LOCATION, FRAME_LOCATION, FRAME_SIZE, FRAME_SIZE);
f.setSize(FRAME_SIZE, FRAME_SIZE);
f.setLocationRelativeTo(null);
f.setUndecorated(true);

final DraggablePanel dragSource = new DraggablePanel();
dragSource.setBackground(Color.yellow);
Expand All @@ -62,11 +84,12 @@ private static void initAndShowUI() {
dtde.acceptDrop(DnDConstants.ACTION_MOVE);

dtde.dropComplete(true);
dropCompleteLatch.countDown();
}
});
dragSource.setDropTarget(dt);
f.add(dragSource);

f.setAlwaysOnTop(true);
f.setVisible(true);
}

Expand All @@ -76,19 +99,37 @@ public static void main(String[] args) throws Throwable {
SwingUtilities.invokeAndWait(() -> initAndShowUI());

Robot r = new Robot();
r.setAutoDelay(50);
Util.waitForIdle(r);
final AtomicReference<Point> frameLoc = new AtomicReference<>();
SwingUtilities.invokeAndWait(() -> frameLoc.set(f.getLocationOnScreen()));
Point loc = frameLoc.get();
Util.drag(r,
new Point(FRAME_LOCATION + FRAME_SIZE / 3, FRAME_LOCATION + FRAME_SIZE / 3),
new Point(FRAME_LOCATION + FRAME_SIZE / 3 * 2, FRAME_LOCATION + FRAME_SIZE / 3 * 2),
InputEvent.BUTTON1_MASK);
new Point(loc.x + FRAME_SIZE / 3, loc.y + FRAME_SIZE / 3),
new Point(loc.x + FRAME_SIZE / 3 * 2, loc.y + FRAME_SIZE / 3 * 2),
InputEvent.BUTTON1_DOWN_MASK);
Util.waitForIdle(r);
if(!dropCompleteLatch.await(10, TimeUnit.SECONDS)) {
captureScreen(r);
throw new RuntimeException("Waited too long, but the drop is not completed");
}
} finally {
if (f != null) {
f.dispose();
}
}
}

private static void captureScreen(Robot r) {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
try {
ImageIO.write(
r.createScreenCapture(new Rectangle(0, 0, screenSize.width, screenSize.height)),
"png",
new File("FailedScreenImage.png")
);
} catch (IOException ignore) {
}
}
private static class DraggablePanel extends Panel implements DragGestureListener {

public DraggablePanel() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,13 @@

import test.java.awt.regtesthelpers.Util;

import javax.swing.*;
import java.awt.*;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.Point;
import java.awt.Robot;
import java.awt.datatransfer.StringSelection;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
Expand All @@ -46,23 +51,27 @@
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.event.InputEvent;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import javax.swing.SwingUtilities;

public class ExtraDragEnterTest {

private static final int FRAME_SIZE = 100;
private static final int FRAME_LOCATION = 100;

private static AtomicInteger dragEnterCalled = new AtomicInteger(0);

private static volatile Panel mainPanel;
private static volatile Frame f;
private static CountDownLatch dropCompleteLatch = new CountDownLatch(1);

private static void initAndShowUI() {
f = new Frame("Test frame");
f.setBounds(FRAME_LOCATION,FRAME_LOCATION,FRAME_SIZE,FRAME_SIZE);
f.setLocationRelativeTo(null);
f.setSize(FRAME_SIZE,FRAME_SIZE);
mainPanel = new Panel();
mainPanel.setBounds(0, 0, FRAME_SIZE, FRAME_SIZE);
mainPanel.setSize(FRAME_SIZE, FRAME_SIZE);
mainPanel.setBackground(Color.black);
mainPanel.setLayout(new GridLayout(2, 1));

Expand All @@ -74,7 +83,10 @@ private static void initAndShowUI() {
Panel dropTarget = new Panel();
dropTarget.setBackground(Color.red);
DropTarget dt = new DropTarget(dropTarget, new DropTargetAdapter() {
@Override public void drop(DropTargetDropEvent dtde) { }
@Override public void drop(DropTargetDropEvent dtde) {
System.out.println("Drop complete");
dropCompleteLatch.countDown();
}

@Override
public void dragEnter(DropTargetDragEvent dtde) {
Expand All @@ -85,6 +97,7 @@ public void dragEnter(DropTargetDragEvent dtde) {
mainPanel.add(dropTarget);

f.add(mainPanel);
f.setAlwaysOnTop(true);
f.setVisible(true);
}

Expand Down Expand Up @@ -112,6 +125,9 @@ public void run() {
if (called != 1) {
throw new RuntimeException("Failed. Drag enter called " + called + " times. Expected 1" );
}
if(!dropCompleteLatch.await(10, TimeUnit.SECONDS)) {
throw new RuntimeException("Waited too long, but the drop is not completed");
}
} finally {
if (f != null) {
f.dispose();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,12 @@

import test.java.awt.regtesthelpers.Util;

import javax.swing.*;
import java.awt.*;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.Point;
import java.awt.Robot;
import java.awt.datatransfer.StringSelection;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
Expand All @@ -47,15 +51,17 @@
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.event.InputEvent;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import javax.swing.SwingUtilities;

public class MissedDragExitTest {

private static final int FRAME_SIZE = 100;
private static final int FRAME_LOCATION = 100;

private static volatile boolean dragExitCalled = false;

private static volatile Frame f;
private static CountDownLatch dragLatch = new CountDownLatch(2);

private static void initAndShowUI() {
f = new Frame("Test frame");
Expand All @@ -69,21 +75,30 @@ private static void initAndShowUI() {

@Override
public void dragExit(DropTargetEvent dte) {
dragExitCalled = true;
System.out.println("Drag Exit");
dragLatch.countDown();
}

@Override
public void dragOver(DropTargetDragEvent dtde) {
Panel newDropTarget = new Panel();
newDropTarget.setDropTarget(new DropTarget());
newDropTarget.setBackground(Color.red);
newDropTarget.setBounds(0, 0, FRAME_SIZE, FRAME_SIZE);
dragSource.add(newDropTarget);
Panel newDropTargetPanel = new Panel();
final DropTarget dropTarget = new DropTarget(null,new DropTargetAdapter() {
@Override
public void drop(DropTargetDropEvent dtde) {
System.out.println("Drop complete");
dragLatch.countDown();
}
});
newDropTargetPanel.setDropTarget(dropTarget);
newDropTargetPanel.setBackground(Color.red);
newDropTargetPanel.setSize(FRAME_SIZE, FRAME_SIZE);
dragSource.add(newDropTargetPanel);
}
});
dragSource.setDropTarget(dt);
f.add(dragSource);

f.setAlwaysOnTop(true);
f.setVisible(true);
}

Expand All @@ -104,8 +119,7 @@ public void run() {
new Point(FRAME_LOCATION + FRAME_SIZE / 3 * 2, FRAME_LOCATION + FRAME_SIZE / 3 * 2),
InputEvent.BUTTON1_DOWN_MASK);
Util.waitForIdle(r);

if (!dragExitCalled) {
if(!dragLatch.await(10, TimeUnit.SECONDS)) {
throw new RuntimeException("Failed. Drag exit was not called" );
}
} finally {
Expand Down
Loading