package io.andrewohara.tinkertime.views.modSelector; import java.awt.Component; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; import java.awt.dnd.DropTargetListener; import java.io.File; import java.io.IOException; import java.net.URL; import java.nio.file.Files; import java.sql.SQLException; import java.util.Collection; import io.andrewohara.common.views.Dialogs; import io.andrewohara.tinkertime.controllers.ModManager; import io.andrewohara.tinkertime.controllers.ModManager.ModUpdateFailedException; class DragDropHandler implements DropTargetListener { private final Component listenTo; private final ModManager mm; private Dialogs dialogs; DragDropHandler(Component listenTo, ModManager mm, Dialogs dialogs){ this.listenTo = listenTo; this.mm = mm; this.dialogs = dialogs; } @Override public void dragEnter(DropTargetDragEvent dtde) { try { File file = getFile(dtde.getTransferable()); if (isZip(file) || isUrl(file)){ dtde.acceptDrag(DnDConstants.ACTION_LINK); } else { dtde.rejectDrag(); } } catch (UnsupportedFlavorException | IOException e) { e.printStackTrace(); dtde.rejectDrag(); } listenTo.repaint(); } private File getFile(Transferable t) throws UnsupportedFlavorException, IOException{ Object td = t.getTransferData(DataFlavor.javaFileListFlavor); if (td instanceof Collection){ for (Object value : (Collection<?>) td){ if (value instanceof File){ return (File) value; } } } return null; } private boolean isZip(File file){ return file != null && file.getName().endsWith(".zip"); } private boolean isUrl(File file){ return file != null && file.getName().endsWith(".url"); } private void handleUrlFile(File file){ try { String contents = new String(Files.readAllBytes(file.toPath())); String url = contents.split("URL=")[1].split("]")[0]; mm.downloadNewMod(new URL(url)); } catch (IOException | SQLException | ModUpdateFailedException e) { dialogs.errorDialog(listenTo, e); } } private void handleZipFile(File file) throws SQLException{ mm.addModZip(file.toPath()); } @Override public void dragOver(DropTargetDragEvent dtde) { // No Action } @Override public void dropActionChanged(DropTargetDragEvent dtde) { // No Action } @Override public void dragExit(DropTargetEvent dte) { // No Action } @Override public void drop(DropTargetDropEvent dtde) { dtde.acceptDrop(DnDConstants.ACTION_COPY); try { File file = getFile(dtde.getTransferable()); if (isZip(file)){ handleZipFile(file); } else if (isUrl(file)){ handleUrlFile(file); } } catch (UnsupportedFlavorException | IOException | SQLException e) { dialogs.errorDialog(listenTo, e); } } }