8005405: [macosx] Drag and Drop: wrong animation when dropped outside any drop target

Changed the calculation of the drag image offset

Reviewed-by: serb, kizune
This commit is contained in:
Petr Pchelko 2013-02-04 13:54:53 +00:00
parent 018fbffe54
commit ab34438938
2 changed files with 20 additions and 39 deletions

View File

@ -88,40 +88,25 @@ public final class CDragSourceContextPeer extends SunDragSourceContextPeer {
DragGestureEvent trigger = getTrigger();
InputEvent triggerEvent = trigger.getTriggerEvent();
Point dragOrigin = trigger.getDragOrigin();
Point dragOrigin = new Point(trigger.getDragOrigin());
int extModifiers = (triggerEvent.getModifiers() | triggerEvent.getModifiersEx());
long timestamp = triggerEvent.getWhen();
int clickCount = ((triggerEvent instanceof MouseEvent) ? (((MouseEvent) triggerEvent).getClickCount()) : 1);
// Get drag source component and its peer:
Component component = trigger.getComponent();
Point componentOffset = new Point();
ComponentPeer peer = component.getPeer();
// For a lightweight component traverse up the hierarchy to the first heavyweight
// which will be used as the ComponentModel for the native drag source.
if (component.isLightweight()) {
Point loc = component.getLocation();
componentOffset.translate(loc.x, loc.y);
for (Component parent = component.getParent(); parent != null; parent = parent.getParent()) {
if (parent.isLightweight() == false) {
peer = parent.getPeer();
break;
}
loc = parent.getLocation();
componentOffset.translate(loc.x, loc.y);
}
// For a lightweight component traverse up the hierarchy to the root
Point loc = component.getLocation();
Component rootComponent = component;
while (!(rootComponent instanceof Window)) {
dragOrigin.translate(loc.x, loc.y);
rootComponent = rootComponent.getParent();
loc = rootComponent.getLocation();
}
// Make sure the drop target is a ComponentModel:
if (!(peer instanceof LWComponentPeer))
throw new IllegalArgumentException("DragSource's peer must be a ComponentModel.");
// Get model pointer (CButton.m and such) and its native peer:
LWComponentPeer model = (LWComponentPeer) peer;
CPlatformWindow platformWindow = (CPlatformWindow) model.getPlatformWindow();
//It sure will be LWComponentPeer instance as rootComponent is a Window
LWComponentPeer peer = (LWComponentPeer)rootComponent.getPeer();
//Get a pointer to a native window
CPlatformWindow platformWindow = (CPlatformWindow) peer.getPlatformWindow();
long nativeWindowPtr = platformWindow.getNSWindowPtr();
// Get drag cursor:
@ -155,7 +140,7 @@ public final class CDragSourceContextPeer extends SunDragSourceContextPeer {
try {
// Create native dragging source:
final long nativeDragSource = createNativeDragSource(component, peer, nativeWindowPtr, transferable, triggerEvent,
(int) (dragOrigin.getX() + componentOffset.x), (int) (dragOrigin.getY() + componentOffset.y), extModifiers,
(int) (dragOrigin.getX()), (int) (dragOrigin.getY()), extModifiers,
clickCount, timestamp, cursor, fDragCImage, dragImageOffset.x, dragImageOffset.y,
getDragSourceContext().getSourceActions(), formats, formatMap);
@ -165,8 +150,8 @@ public final class CDragSourceContextPeer extends SunDragSourceContextPeer {
setNativeContext(nativeDragSource);
CCursorManager.getInstance().startDrag(
(int) (dragOrigin.getX() + componentOffset.x),
(int) (dragOrigin.getY() + componentOffset.y));
(int) (dragOrigin.getX()),
(int) (dragOrigin.getY()));
}
catch (Exception e) {

View File

@ -443,9 +443,9 @@ static BOOL sNeedsEnter;
NSGraphicsContext* graphicsContext = [NSGraphicsContext graphicsContextWithWindow:window];
// Convert mouse coordinates to NS:
NSPoint location = NSMakePoint(fDragPos.x, fDragPos.y);
NSPoint eventLocation = [fView convertPoint:location toView:nil];
NSPoint eventLocation = [fView convertPoint:NSMakePoint(fDragPos.x, fDragPos.y) toView:nil];
eventLocation.y = [[fView window] frame].size.height - eventLocation.y;
// Convert fTriggerEventTimeStamp to NS - AWTEvent.h defines UTC(nsEvent) as ((jlong)[event timestamp] * 1000):
NSTimeInterval timeStamp = fTriggerEventTimeStamp / 1000;
@ -497,12 +497,9 @@ static BOOL sNeedsEnter;
NSImage* dragImage = fDragImage;
// Get drag origin and offset:
NSPoint dragOrigin;
dragOrigin.x = fDragPos.x;
dragOrigin.y = fDragPos.y;
dragOrigin = [view convertPoint:[dragEvent locationInWindow] fromView:nil];
NSPoint dragOrigin = [dragEvent locationInWindow];
dragOrigin.x += fDragImageOffset.x;
dragOrigin.y += [dragImage size].height + fDragImageOffset.y;
dragOrigin.y -= fDragImageOffset.y + [dragImage size].height;
// Drag offset values don't seem to matter:
NSSize dragOffset = NSMakeSize(0, 0);
@ -516,7 +513,6 @@ static BOOL sNeedsEnter;
DLog5(@" - drag image: %f, %f (%f x %f)", fDragImageOffset.x, fDragImageOffset.y, [dragImage size].width, [dragImage size].height);
DLog3(@" - event point (window) %f, %f", [dragEvent locationInWindow].x, [dragEvent locationInWindow].y);
DLog3(@" - drag point (view) %f, %f", dragOrigin.x, dragOrigin.y);
// Set up the fDragKeyModifier, so we know if the operation has changed
// Set up the fDragMouseModifier, so we can |= it later (since CoreDrag doesn't tell us mouse states during a drag)
fDragKeyModifiers = [DnDUtilities extractJavaExtKeyModifiersFromJavaExtModifiers:fModifiers];