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

Print this page

        

*** 36,47 **** --- 36,51 ---- import javax.swing.*; import javax.swing.text.*; import javax.accessibility.*; import java.util.Map; + import java.util.concurrent.Callable; + import sun.awt.dnd.*; import sun.lwawt.LWComponentPeer; + import sun.lwawt.LWWindowPeer; + import sun.lwawt.PlatformWindow; public final class CDragSourceContextPeer extends SunDragSourceContextPeer { private static final CDragSourceContextPeer fInstance = new CDragSourceContextPeer(null);
*** 102,118 **** rootComponent = rootComponent.getParent(); loc = rootComponent.getLocation(); } //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: ! Cursor cursor = this.getCursor(); // If there isn't any drag image make one of default appearance: if (fDragImage == null) this.setDefaultDragImage(component); --- 106,124 ---- rootComponent = rootComponent.getParent(); loc = rootComponent.getLocation(); } //It sure will be LWComponentPeer instance as rootComponent is a Window ! PlatformWindow platformWindow = ((LWComponentPeer)rootComponent.getPeer()).getPlatformWindow(); ! long nativeViewPtr; ! if (platformWindow instanceof CPlatformWindow) { ! nativeViewPtr = ((CPlatformWindow) platformWindow).getContentView().getAWTView(); ! } else if (platformWindow instanceof CViewPlatformEmbeddedFrame) { ! nativeViewPtr = ((CViewPlatformEmbeddedFrame) platformWindow).getNSViewPtr(); ! } else { ! throw new InvalidDnDOperationException("Unsupported PlatformWindow implementation"); ! } // If there isn't any drag image make one of default appearance: if (fDragImage == null) this.setDefaultDragImage(component);
*** 137,167 **** dragImageOffset = new Point(0, 0); } try { // Create native dragging source: ! final long nativeDragSource = createNativeDragSource(component, peer, nativeWindowPtr, transferable, triggerEvent, (int) (dragOrigin.getX()), (int) (dragOrigin.getY()), extModifiers, ! clickCount, timestamp, cursor, fDragCImage, dragImageOffset.x, dragImageOffset.y, getDragSourceContext().getSourceActions(), formats, formatMap); if (nativeDragSource == 0) throw new InvalidDnDOperationException(""); setNativeContext(nativeDragSource); - - CCursorManager.getInstance().startDrag( - (int) (dragOrigin.getX()), - (int) (dragOrigin.getY())); } catch (Exception e) { throw new InvalidDnDOperationException("failed to create native peer: " + e); } SunDropTargetContextPeer.setCurrentJVMLocalSourceTransferable(transferable); // Create a new thread to run the dragging operation since it's synchronous, only coming back // after dragging is finished. This leaves the AWT event thread free to handle AWT events which // are posted during dragging by native event handlers. try { --- 143,171 ---- dragImageOffset = new Point(0, 0); } try { // Create native dragging source: ! final long nativeDragSource = createNativeDragSource(component, nativeViewPtr, transferable, triggerEvent, (int) (dragOrigin.getX()), (int) (dragOrigin.getY()), extModifiers, ! clickCount, timestamp, fDragCImage, dragImageOffset.x, dragImageOffset.y, getDragSourceContext().getSourceActions(), formats, formatMap); if (nativeDragSource == 0) throw new InvalidDnDOperationException(""); setNativeContext(nativeDragSource); } catch (Exception e) { throw new InvalidDnDOperationException("failed to create native peer: " + e); } SunDropTargetContextPeer.setCurrentJVMLocalSourceTransferable(transferable); + CCursorManager.getInstance().setCursor(getCursor()); + // Create a new thread to run the dragging operation since it's synchronous, only coming back // after dragging is finished. This leaves the AWT event thread free to handle AWT events which // are posted during dragging by native event handlers. try {
*** 171,182 **** try { doDragging(nativeDragSource); } catch (Exception e) { e.printStackTrace(); } finally { - CCursorManager.getInstance().stopDrag(); - releaseNativeDragSource(nativeDragSource); fDragImage = null; if (fDragCImage != null) { fDragCImage.dispose(); fDragCImage = null; --- 175,184 ----
*** 187,198 **** dragThread.start(); } catch (Exception e) { - CCursorManager.getInstance().stopDrag(); - final long nativeDragSource = getNativeContext(); setNativeContext(0); releaseNativeDragSource(nativeDragSource); SunDropTargetContextPeer.setCurrentJVMLocalSourceTransferable(null); throw new InvalidDnDOperationException("failed to start dragging thread: " + e); --- 189,198 ----
*** 414,475 **** */ private void dragMouseMoved(final int targetActions, final int modifiers, final int x, final int y) { ! CCursorManager.getInstance().updateDragPosition(x, y); - Component rootComponent = SwingUtilities.getRoot(getComponent()); - if(rootComponent != null) { - Point componentPoint = new Point(x, y); - SwingUtilities.convertPointFromScreen(componentPoint, rootComponent); - Component componentAt = SwingUtilities.getDeepestComponentAt(rootComponent, componentPoint.x, componentPoint.y); if(componentAt != hoveringComponent) { if(hoveringComponent != null) { dragExit(x, y); } if(componentAt != null) { dragEnter(targetActions, modifiers, x, y); } hoveringComponent = componentAt; } ! } postDragSourceDragEvent(targetActions, modifiers, x, y, DISPATCH_MOUSE_MOVED); } ! /** ! * upcall from native code ! */ ! private void dragEnter(final int targetActions, ! final int modifiers, ! final int x, final int y) { ! CCursorManager.getInstance().updateDragPosition(x, y); ! postDragSourceDragEvent(targetActions, modifiers, x, y, DISPATCH_ENTER); } /** * upcall from native code - reset hovering component */ private void resetHovering() { hoveringComponent = null; } ! public void setCursor(Cursor c) throws InvalidDnDOperationException { ! // TODO : BG ! //AWTLockAccess.awtLock(); ! super.setCursor(c); ! //AWTLockAccess.awtUnlock(); } - protected native void setNativeCursor(long nativeCtxt, Cursor c, int cType); - // Native support: ! private native long createNativeDragSource(Component component, ComponentPeer peer, long nativePeer, Transferable transferable, InputEvent triggerEvent, int dragPosX, int dragPosY, int extModifiers, int clickCount, long timestamp, ! Cursor cursor, CImage nsDragImage, int dragImageOffsetX, int dragImageOffsetY, int sourceActions, long[] formats, Map formatMap); private native void doDragging(long nativeDragSource); private native void releaseNativeDragSource(long nativeDragSource); --- 414,498 ---- */ private void dragMouseMoved(final int targetActions, final int modifiers, final int x, final int y) { ! try { ! Component componentAt = LWCToolkit.invokeAndWait( ! new Callable<Component>() { ! @Override ! public Component call() { ! LWWindowPeer mouseEventComponent = LWWindowPeer.getWindowUnderCursor(); ! if (mouseEventComponent == null) { ! return null; ! } ! Component root = SwingUtilities.getRoot(mouseEventComponent.getTarget()); ! if (root == null) { ! return null; ! } ! Point rootLocation = root.getLocationOnScreen(); ! return getDropTargetAt(root, x - rootLocation.x, y - rootLocation.y); ! } ! }, getComponent()); if(componentAt != hoveringComponent) { if(hoveringComponent != null) { dragExit(x, y); } if(componentAt != null) { dragEnter(targetActions, modifiers, x, y); } hoveringComponent = componentAt; } ! postDragSourceDragEvent(targetActions, modifiers, x, y, DISPATCH_MOUSE_MOVED); + } catch (Exception e) { + throw new InvalidDnDOperationException("Failed to handle DragMouseMoved event"); + } } ! //Returns the first lightweight or heavyweight Component which has a dropTarget ready to accept the drag ! //Should be called from the EventDispatchThread ! private static Component getDropTargetAt(Component root, int x, int y) { ! if (!root.contains(x, y) || !root.isEnabled() || !root.isVisible()) { ! return null; ! } ! if (root.getDropTarget() != null && root.getDropTarget().isActive()) { ! return root; ! } ! ! if (root instanceof Container) { ! for (Component comp : ((Container) root).getComponents()) { ! Point loc = comp.getLocation(); ! Component dropTarget = getDropTargetAt(comp, x - loc.x, y - loc.y); ! if (dropTarget != null) { ! return dropTarget; ! } ! } ! } ! ! return null; } /** * upcall from native code - reset hovering component */ private void resetHovering() { hoveringComponent = null; } ! @Override ! protected void setNativeCursor(long nativeCtxt, Cursor c, int cType) { ! CCursorManager.getInstance().setCursor(c); } // Native support: ! private native long createNativeDragSource(Component component, long nativePeer, Transferable transferable, InputEvent triggerEvent, int dragPosX, int dragPosY, int extModifiers, int clickCount, long timestamp, ! CImage nsDragImage, int dragImageOffsetX, int dragImageOffsetY, int sourceActions, long[] formats, Map formatMap); private native void doDragging(long nativeDragSource); private native void releaseNativeDragSource(long nativeDragSource);