Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package cleanapp;
- import java.awt.Component;
- import java.awt.datatransfer.DataFlavor;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.IOException;
- import java.io.PrintStream;
- import java.io.Reader;
- public class FileDrop {
- private transient javax.swing.border.Border normalBorder;
- private transient java.awt.dnd.DropTargetListener dropListener;
- private static Boolean supportsDnD;
- private static java.awt.Color defaultBorderColor = new java.awt.Color(0f, 0f, 1f, 0.25f);
- public FileDrop(
- final java.awt.Component c,
- final Listener listener) {
- this(null, c,
- javax.swing.BorderFactory.createMatteBorder(2, 2, 2, 2, defaultBorderColor), //drag border
- true, listener);
- }
- public FileDrop(
- final java.awt.Component c,
- final boolean recursive,
- final Listener listener) {
- this(null, c,
- javax.swing.BorderFactory.createMatteBorder(2, 2, 2, 2, defaultBorderColor),
- recursive, listener);
- }
- public FileDrop(
- final java.io.PrintStream out,
- final java.awt.Component c,
- final Listener listener) {
- this(out, c,
- javax.swing.BorderFactory.createMatteBorder(2, 2, 2, 2, defaultBorderColor),
- false, listener);
- }
- public FileDrop(
- final java.io.PrintStream out,
- final java.awt.Component c,
- final boolean recursive,
- final Listener listener) {
- this(out, c,
- javax.swing.BorderFactory.createMatteBorder(2, 2, 2, 2, defaultBorderColor),
- recursive, listener);
- }
- public FileDrop(
- final java.awt.Component c,
- final javax.swing.border.Border dragBorder,
- final Listener listener) {
- this(null, c, dragBorder, false, listener);
- }
- public FileDrop(
- final java.awt.Component c,
- final javax.swing.border.Border dragBorder,
- final boolean recursive,
- final Listener listener) {
- this(null, c, dragBorder, recursive,listener);
- }
- public FileDrop(
- final java.io.PrintStream out,
- final java.awt.Component c,
- final javax.swing.border.Border dragBorder,
- final Listener listener) {
- this(out, c, dragBorder, false, listener);
- }
- public FileDrop(
- final java.io.PrintStream out,
- final java.awt.Component c,
- final javax.swing.border.Border dragBorder,
- final boolean recursive,
- final Listener listener) {
- if (supportsDnD()) {
- dropListener = new java.awt.dnd.DropTargetListener() {
- @Override
- public void dragEnter(java.awt.dnd.DropTargetDragEvent evt) {
- if (isDragOk(out, evt)) {
- if (c instanceof javax.swing.JComponent) {
- javax.swing.JComponent jc = (javax.swing.JComponent) c;
- normalBorder = jc.getBorder();
- jc.setBorder(dragBorder);
- }
- evt.acceptDrag(java.awt.dnd.DnDConstants.ACTION_COPY);
- } else {
- evt.rejectDrag();
- }
- }
- @Override
- public void dragOver(java.awt.dnd.DropTargetDragEvent evt) {}
- @Override
- public void drop(java.awt.dnd.DropTargetDropEvent evt) {
- try {
- java.awt.datatransfer.Transferable tr = evt.getTransferable();
- if (tr.isDataFlavorSupported(java.awt.datatransfer.DataFlavor.javaFileListFlavor)) {
- evt.acceptDrop(java.awt.dnd.DnDConstants.ACTION_COPY);
- java.util.List fileList = (java.util.List) tr.getTransferData(java.awt.datatransfer.DataFlavor.javaFileListFlavor);
- java.util.Iterator iterator = fileList.iterator();
- java.io.File[] filesTemp = new java.io.File[fileList.size()];
- fileList.toArray(filesTemp);
- final java.io.File[] files = filesTemp;
- if (listener != null) {
- listener.filesDropped(files);
- }
- evt.getDropTargetContext().dropComplete(true);
- } else {
- DataFlavor[] flavors = tr.getTransferDataFlavors();
- boolean handled = false;
- for (DataFlavor flavor : flavors) {
- if (flavor.isRepresentationClassReader()) {
- evt.acceptDrop(java.awt.dnd.DnDConstants.ACTION_COPY);
- Reader reader = flavor.getReaderForText(tr);
- BufferedReader br = new BufferedReader(reader);
- if (listener != null) {
- listener.filesDropped(createFileArray(br, out));
- }
- evt.getDropTargetContext().dropComplete(true);
- handled = true;
- break;
- }
- }
- if (!handled) {
- evt.rejectDrop();
- }
- }
- } catch (java.io.IOException | java.awt.datatransfer.UnsupportedFlavorException io) {
- io.printStackTrace(out);
- evt.rejectDrop();
- } finally {
- if (c instanceof javax.swing.JComponent) {
- javax.swing.JComponent jc = (javax.swing.JComponent) c;
- jc.setBorder(normalBorder);
- }
- } // end finally
- } // end drop
- @Override
- public void dragExit(java.awt.dnd.DropTargetEvent evt) {
- if (c instanceof javax.swing.JComponent) {
- javax.swing.JComponent jc = (javax.swing.JComponent) c;
- jc.setBorder(normalBorder);
- }
- }
- @Override
- public void dropActionChanged(java.awt.dnd.DropTargetDragEvent evt) {
- if (isDragOk(out, evt)) {
- evt.acceptDrag(java.awt.dnd.DnDConstants.ACTION_COPY);
- } else {
- evt.rejectDrag();
- }
- }
- }; // end DropTargetListener
- makeDropTarget(out, c, recursive);
- } else {
- log(out, "FileDrop: Drag and drop is not supported with this JVM");
- }
- } //end constructor
- private static boolean supportsDnD() {
- if (supportsDnD == null) {
- boolean support = false;
- try {
- Class arbitraryDndClass = Class.forName("java.awt.dnd.DnDConstants");
- support = true;
- } catch (Exception e) {
- support = false;
- }
- supportsDnD = support;
- }
- return supportsDnD;
- }
- private static String ZERO_CHAR_STRING = "" + (char) 0;
- private static File[] createFileArray(BufferedReader bReader, PrintStream out) {
- try {
- java.util.List list = new java.util.ArrayList();
- java.lang.String line = null;
- while ((line = bReader.readLine()) != null) {
- try {
- if (ZERO_CHAR_STRING.equals(line)) {
- continue;
- }
- java.io.File file = new java.io.File(new java.net.URI(line));
- list.add(file);
- } catch (Exception ex) {
- log(out, "Error with " + line + ": " + ex.getMessage());
- }
- }
- return (java.io.File[]) list.toArray(new File[list.size()]);
- } catch (IOException ex) {
- log(out, "FileDrop: IOException");
- }
- return new File[0];
- }
- private void makeDropTarget(final java.io.PrintStream out, final java.awt.Component c, boolean recursive) {
- final java.awt.dnd.DropTarget dt = new java.awt.dnd.DropTarget();
- try {
- dt.addDropTargetListener(dropListener);
- } catch (java.util.TooManyListenersException e) {
- e.printStackTrace();
- }
- c.addHierarchyListener(new java.awt.event.HierarchyListener() {
- @Override
- public void hierarchyChanged(java.awt.event.HierarchyEvent evt) {
- java.awt.Component parent = c.getParent();
- if (parent == null) {
- c.setDropTarget(null);
- } else {
- new java.awt.dnd.DropTarget(c, dropListener);
- }
- }
- }); // end hierarchy listener
- if (c.getParent() != null) {
- new java.awt.dnd.DropTarget(c, dropListener);
- }
- if (recursive && (c instanceof java.awt.Container)) {
- java.awt.Container cont = (java.awt.Container) c;
- java.awt.Component[] comps = cont.getComponents();
- for (Component comp : comps) {
- makeDropTarget(out, comp, recursive);
- }
- }
- }
- private boolean isDragOk(final java.io.PrintStream out, final java.awt.dnd.DropTargetDragEvent evt) {
- boolean ok = false;
- java.awt.datatransfer.DataFlavor[] flavors = evt.getCurrentDataFlavors();
- int i = 0;
- while (!ok && i < flavors.length) {
- final DataFlavor curFlavor = flavors[i];
- if (curFlavor.equals(java.awt.datatransfer.DataFlavor.javaFileListFlavor)
- || curFlavor.isRepresentationClassReader()) {
- ok = true;
- }
- i++;
- }
- if (out != null) {
- for (i = 0; i < flavors.length; i++) {
- // log(out, flavors[i].toString());
- }
- }
- return ok;
- }
- private static void log(java.io.PrintStream out, String message) { // Log message if requested
- if (out != null) {
- out.println(message);
- }
- }
- public static boolean remove(java.awt.Component c) {
- return remove(null, c, true);
- }
- public static boolean remove(java.io.PrintStream out, java.awt.Component c, boolean recursive) { // Make sure we support dnd.
- if (supportsDnD()) {
- c.setDropTarget(null);
- if (recursive && (c instanceof java.awt.Container)) {
- java.awt.Component[] comps = ((java.awt.Container) c).getComponents();
- for (Component comp : comps) {
- remove(out, comp, recursive);
- }
- return true;
- } else {
- return false;
- }
- } else {
- return false;
- }
- }
- public static interface Listener {
- public abstract void filesDropped(java.io.File[] files);
- }
- public static class Event extends java.util.EventObject {
- private java.io.File[] files;
- public Event(java.io.File[] files, Object source) {
- super(source);
- this.files = files;
- }
- public java.io.File[] getFiles() {
- return files;
- }
- }
- public static class TransferableObject implements java.awt.datatransfer.Transferable {
- public final static String MIME_TYPE = "application/x-net.iharder.dnd.TransferableObject";
- public final static java.awt.datatransfer.DataFlavor DATA_FLAVOR
- = new java.awt.datatransfer.DataFlavor(FileDrop.TransferableObject.class, MIME_TYPE);
- private Fetcher fetcher;
- private Object data;
- private java.awt.datatransfer.DataFlavor customFlavor;
- public TransferableObject(Object data) {
- this.data = data;
- this.customFlavor = new java.awt.datatransfer.DataFlavor(data.getClass(), MIME_TYPE);
- }
- public TransferableObject(Fetcher fetcher) {
- this.fetcher = fetcher;
- }
- public TransferableObject(Class dataClass, Fetcher fetcher) {
- this.fetcher = fetcher;
- this.customFlavor = new java.awt.datatransfer.DataFlavor(dataClass, MIME_TYPE);
- }
- public java.awt.datatransfer.DataFlavor getCustomDataFlavor() {
- return customFlavor;
- }
- @Override
- public java.awt.datatransfer.DataFlavor[] getTransferDataFlavors() {
- if (customFlavor != null) {
- return new java.awt.datatransfer.DataFlavor[]{customFlavor,
- DATA_FLAVOR,
- java.awt.datatransfer.DataFlavor.stringFlavor
- };
- } else {
- return new java.awt.datatransfer.DataFlavor[]{DATA_FLAVOR,
- java.awt.datatransfer.DataFlavor.stringFlavor
- };
- }
- }
- @Override
- public Object getTransferData(java.awt.datatransfer.DataFlavor flavor)
- throws java.awt.datatransfer.UnsupportedFlavorException, java.io.IOException {
- if (flavor.equals(DATA_FLAVOR)) {
- return fetcher == null ? data : fetcher.getObject();
- }
- if (flavor.equals(java.awt.datatransfer.DataFlavor.stringFlavor)) {
- return fetcher == null ? data.toString() : fetcher.getObject().toString();
- }
- throw new java.awt.datatransfer.UnsupportedFlavorException(flavor);
- }
- @Override
- public boolean isDataFlavorSupported(java.awt.datatransfer.DataFlavor flavor) {
- if (flavor.equals(DATA_FLAVOR)) {
- return true;
- }
- return flavor.equals(java.awt.datatransfer.DataFlavor.stringFlavor);
- }
- public static interface Fetcher {
- public abstract Object getObject();
- }
- }
- }
- //CleanApp instance
- new FileDrop(mainPanel, new FileDrop.Listener() { //25.4.16
- @Override
- public void filesDropped(java.io.File[] files) {
- for (File file : files) {
- try {
- newTestFile = new File(file.getCanonicalPath());
- loadFile(newTestFile);
- newTestFile = null;
- //File testFile = new File(file.getCanonicalPath());
- //loadFile(testFile);
- } catch (Exception e) {
- infoBox(e.toString(), "FileDrop Error");
- e.printStackTrace();
- }
- } // for
- } // filesDropped
- });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement