package org.expeditee.gio.javafx; import java.io.File; import java.io.IOException; import java.util.List; import org.expeditee.core.Point; import org.expeditee.gio.DragAndDropManager; import org.expeditee.gui.MessageBay; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.input.DataFormat; import javafx.scene.input.DragEvent; import javafx.scene.input.Dragboard; import javafx.scene.input.TransferMode; public class JavaFXDragAndDropManager extends DragAndDropManager { /** Singleton instance. */ private static JavaFXDragAndDropManager _instance; /** Singleton instantiator. */ public static JavaFXDragAndDropManager getInstance() { if (_instance == null) _instance = new JavaFXDragAndDropManager(); return _instance; } // GNOME and KDE desktops have a specialized way of DNDing files private DataFormat _URIListDataflavorString = new DataFormat("text/uri-list;class=java.lang.String"); private DataFormat _URIListDataflavorCharArray = new DataFormat("text/uri-list;class=\"[C\""); private JavaFXDragAndDropManager() { Scene scene = JavaFXGraphicsManager.ExpediteeApplication.theScene; scene.setOnDragOver(new EventHandler() { @Override public void handle(DragEvent event) { Dragboard dragboard = event.getDragboard(); if ( dragboard.hasString() || dragboard.hasFiles() || dragboard.hasContent(_URIListDataflavorString) || dragboard.hasContent(_URIListDataflavorCharArray)) { event.acceptTransferModes(TransferMode.COPY); } event.consume(); } }); scene.setOnDragDropped(new EventHandler() { @Override public void handle(DragEvent event) { Dragboard dragboard = event.getDragboard(); Point dropPoint = new Point((int) event.getX(), (int) event.getY()); boolean success = false; try { if (dragboard.hasFiles()) { List files = dragboard.getFiles(); if (files != null && files.size() > 0) { importFileList(files, dropPoint, false); } } else if (dragboard.hasContent(_URIListDataflavorString)) { String data = (String) dragboard.getContent(_URIListDataflavorString); List files = textURIListToFileList(data); importFileList(files, dropPoint, false); success = true; } else if (dragboard.hasContent(_URIListDataflavorCharArray)) { char[] data = (char[]) dragboard.getContent(_URIListDataflavorCharArray); String uriString = new String(data); List files = textURIListToFileList(uriString); importFileList(files, dropPoint, false); success = true; } else if (dragboard.hasString()) { String str = dragboard.getString(); if (str != null && str.length() > 0) { importString(str, dropPoint, false); success = true; } } } catch (IOException e) { e.printStackTrace(); MessageBay.displayMessage("Failed to import data in Expeditee"); } event.setDropCompleted(success); event.consume(); } }); } }