1 /* 2 * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package com.sun.javafx.embed.swing; 27 28 import com.sun.javafx.tk.Toolkit; 29 import java.awt.Component; 30 import java.awt.Cursor; 31 import java.awt.Point; 32 import java.awt.SecondaryLoop; 33 import java.awt.datatransfer.DataFlavor; 34 import java.awt.datatransfer.Transferable; 35 import java.awt.dnd.DnDConstants; 36 import java.awt.dnd.DragGestureEvent; 37 import java.awt.dnd.DragGestureListener; 38 import java.awt.dnd.DragGestureRecognizer; 39 import java.awt.dnd.DragSource; 40 import java.awt.dnd.DropTarget; 41 import java.awt.dnd.DropTargetContext; 42 import java.awt.dnd.DropTargetDragEvent; 43 import java.awt.dnd.DropTargetDropEvent; 44 import java.awt.dnd.DropTargetListener; 45 import java.awt.dnd.InvalidDnDOperationException; 46 import java.awt.dnd.MouseDragGestureRecognizer; 47 import java.security.AccessController; 48 import java.security.PrivilegedAction; 49 import java.util.HashMap; 50 import java.util.Map; 51 import javafx.application.Platform; 52 import javafx.event.EventHandler; 53 import javafx.event.EventType; 54 import javafx.scene.input.DataFormat; 55 import javafx.scene.input.DragEvent; 56 import javafx.scene.input.Dragboard; 57 import javafx.scene.input.MouseEvent; 58 import javafx.scene.input.TransferMode; 59 60 import javafx.embed.swing.SwingNode; 61 62 /** 63 * A utility class to connect DnD mechanism of Swing and FX. 64 * It allows Swing content to use the FX machinery for performing DnD. 65 */ 66 final public class FXDnD { 67 private static SwingNode node; 68 public static boolean fxAppThreadIsDispatchThread; 69 private SwingNode getNode() { return node; } 70 private static FXDnDInterop fxdndiop; 71 72 static { 73 AccessController.doPrivileged(new PrivilegedAction<Object>() { 74 public Object run() { 75 fxAppThreadIsDispatchThread = 76 "true".equals(System.getProperty("javafx.embed.singleThread")); 77 return null; 78 } 79 }); 80 81 InteropFactory instance = null; 82 try { 83 instance = InteropFactory.getInstance(); 84 } catch (Exception e) { 85 throw new ExceptionInInitializerError(e); 86 } 87 fxdndiop = instance.createFXDnDImpl(); 88 } 89 90 public FXDnD(SwingNode node) { 91 this.node = node; 92 fxdndiop.setNode(node); 93 } 94 95 public Object createDragSourceContext(DragGestureEvent dge) 96 throws InvalidDnDOperationException { 97 return fxdndiop.createDragSourceContext(dge); 98 } 99 100 public <T extends DragGestureRecognizer> T createDragGestureRecognizer( 101 Class<T> abstractRecognizerClass, 102 DragSource ds, Component c, int srcActions, 103 DragGestureListener dgl) 104 { 105 return fxdndiop.createDragGestureRecognizer(ds, c, srcActions, dgl); 106 } 107 108 public void addDropTarget(DropTarget dt) { 109 fxdndiop.addDropTarget(dt, node); 110 } 111 112 public void removeDropTarget(DropTarget dt) { 113 fxdndiop.removeDropTarget(dt, node); 114 } 115 }