src/macosx/classes/sun/lwawt/macosx/CDropTargetContextPeer.java

Print this page

        

*** 24,33 **** --- 24,34 ---- */ package sun.lwawt.macosx; import java.awt.*; + import java.awt.dnd.DropTarget; import sun.awt.dnd.SunDropTargetContextPeer; import sun.awt.dnd.SunDropTargetEvent; import javax.swing.*;
*** 36,46 **** final class CDropTargetContextPeer extends SunDropTargetContextPeer { private long fNativeDropTransfer = 0; private long fNativeDataAvailable = 0; private Object fNativeData = null; ! private boolean insideTarget = true; Object awtLockAccess = new Object(); static CDropTargetContextPeer getDropTargetContextPeer() { return new CDropTargetContextPeer(); --- 37,47 ---- final class CDropTargetContextPeer extends SunDropTargetContextPeer { private long fNativeDropTransfer = 0; private long fNativeDataAvailable = 0; private Object fNativeData = null; ! private DropTarget insideTarget = null; Object awtLockAccess = new Object(); static CDropTargetContextPeer getDropTargetContextPeer() { return new CDropTargetContextPeer();
*** 86,133 **** } return fNativeData; } ! // We need to take care of dragExit message because for some reason it is not being ! // generated for lightweight components @Override protected void processMotionMessage(SunDropTargetEvent event, boolean operationChanged) { ! Component eventSource = (Component)event.getComponent(); ! Point screenPoint = event.getPoint(); ! SwingUtilities.convertPointToScreen(screenPoint, eventSource); ! Rectangle screenBounds = new Rectangle(eventSource.getLocationOnScreen().x, ! eventSource.getLocationOnScreen().y, ! eventSource.getWidth(), eventSource.getHeight()); ! if(insideTarget) { ! if(!screenBounds.contains(screenPoint)) { processExitMessage(event); - insideTarget = false; return; } } else { ! if(screenBounds.contains(screenPoint)) { processEnterMessage(event); - insideTarget = true; } else { return; } } super.processMotionMessage(event, operationChanged); } @Override protected void processDropMessage(SunDropTargetEvent event) { ! Component eventSource = (Component)event.getComponent(); Point screenPoint = event.getPoint(); SwingUtilities.convertPointToScreen(screenPoint, eventSource); Rectangle screenBounds = new Rectangle(eventSource.getLocationOnScreen().x, eventSource.getLocationOnScreen().y, eventSource.getWidth(), eventSource.getHeight()); ! if(screenBounds.contains(screenPoint)) { ! super.processDropMessage(event); ! } } @Override protected int postDropTargetEvent(Component component, int x, int y, int dropAction, int actions, long[] formats, long nativeCtxt, int eventID, --- 87,160 ---- } return fNativeData; } ! // We need to take care of dragEnter and dragExit messages because ! // native system generates them only for heavyweights @Override protected void processMotionMessage(SunDropTargetEvent event, boolean operationChanged) { ! boolean eventInsideTarget = isEventInsideTarget(event); ! if(event.getComponent().getDropTarget() == insideTarget) { ! if(!eventInsideTarget) { processExitMessage(event); return; } } else { ! if(eventInsideTarget) { processEnterMessage(event); } else { return; } } super.processMotionMessage(event, operationChanged); } + /** + * Could be called when DnD enters a heavyweight or synthesized in processMotionMessage + */ + @Override + protected void processEnterMessage(SunDropTargetEvent event) { + Component c = event.getComponent(); + DropTarget dt = event.getComponent().getDropTarget(); + if (isEventInsideTarget(event) + && dt != insideTarget + && c.isShowing() + && dt != null + && dt.isActive()) { + insideTarget = dt; + super.processEnterMessage(event); + } + } + + /** + * Could be called when DnD exits a heavyweight or synthesized in processMotionMessage + */ + @Override + protected void processExitMessage(SunDropTargetEvent event) { + if(event.getComponent().getDropTarget() == insideTarget) { + insideTarget = null; + super.processExitMessage(event); + } + } + @Override protected void processDropMessage(SunDropTargetEvent event) { ! if(isEventInsideTarget(event)) { ! super.processDropMessage(event); ! insideTarget = null; ! } ! } ! ! private boolean isEventInsideTarget(SunDropTargetEvent event) { ! Component eventSource = event.getComponent(); Point screenPoint = event.getPoint(); SwingUtilities.convertPointToScreen(screenPoint, eventSource); Rectangle screenBounds = new Rectangle(eventSource.getLocationOnScreen().x, eventSource.getLocationOnScreen().y, eventSource.getWidth(), eventSource.getHeight()); ! return screenBounds.contains(screenPoint); } @Override protected int postDropTargetEvent(Component component, int x, int y, int dropAction, int actions, long[] formats, long nativeCtxt, int eventID,