1 /* 2 * Copyright (c) 2014, 2018, 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 java.awt.Component; 29 import java.awt.dnd.DragGestureEvent; 30 import java.awt.dnd.DragGestureListener; 31 import java.awt.dnd.DragGestureRecognizer; 32 import java.awt.dnd.DragSource; 33 import java.awt.dnd.DropTarget; 34 import java.awt.dnd.InvalidDnDOperationException; 35 import java.security.AccessController; 36 import java.security.PrivilegedAction; 37 38 import javafx.embed.swing.SwingNode; 39 40 /** 41 * A utility class to connect DnD mechanism of Swing and FX. 42 * It allows Swing content to use the FX machinery for performing DnD. 43 */ 44 final public class FXDnD { 45 private static SwingNode node; 46 public static boolean fxAppThreadIsDispatchThread; 47 private SwingNode getNode() { return node; } 48 private static FXDnDInterop fxdndiop; 49 50 static { 51 AccessController.doPrivileged(new PrivilegedAction<Object>() { 52 public Object run() { 53 fxAppThreadIsDispatchThread = 54 "true".equals(System.getProperty("javafx.embed.singleThread")); 55 return null; 56 } 57 }); 58 59 InteropFactory instance = null; 60 try { 61 instance = InteropFactory.getInstance(); 62 } catch (Exception e) { 63 throw new ExceptionInInitializerError(e); 64 } 65 fxdndiop = instance.createFXDnDImpl(); 66 } 67 68 public FXDnD(SwingNode node) { 69 this.node = node; 70 fxdndiop.setNode(node); 71 } 72 73 public Object createDragSourceContext(DragGestureEvent dge) 74 throws InvalidDnDOperationException { 75 return fxdndiop.createDragSourceContext(dge); 76 } 77 78 public <T extends DragGestureRecognizer> T createDragGestureRecognizer( 79 Class<T> abstractRecognizerClass, 80 DragSource ds, Component c, int srcActions, 81 DragGestureListener dgl) 82 { 83 return fxdndiop.createDragGestureRecognizer(ds, c, srcActions, dgl); 84 } 85 86 public void addDropTarget(DropTarget dt) { 87 fxdndiop.addDropTarget(dt, node); 88 } 89 90 public void removeDropTarget(DropTarget dt) { 91 fxdndiop.removeDropTarget(dt, node); 92 } 93 }