Advertisement
Guest User

Untitled

a guest
Apr 29th, 2016
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 15.41 KB | None | 0 0
  1. package cleanapp;
  2.  
  3. import java.awt.Component;
  4. import java.awt.datatransfer.DataFlavor;
  5. import java.io.BufferedReader;
  6. import java.io.File;
  7. import java.io.IOException;
  8. import java.io.PrintStream;
  9. import java.io.Reader;
  10.  
  11. public class FileDrop {
  12.  
  13.     private transient javax.swing.border.Border normalBorder;
  14.     private transient java.awt.dnd.DropTargetListener dropListener;
  15.     private static Boolean supportsDnD;
  16.     private static java.awt.Color defaultBorderColor = new java.awt.Color(0f, 0f, 1f, 0.25f);
  17.  
  18.     public FileDrop(
  19.             final java.awt.Component c,
  20.             final Listener listener) {
  21.         this(null, c,
  22.                 javax.swing.BorderFactory.createMatteBorder(2, 2, 2, 2, defaultBorderColor), //drag border
  23.                 true, listener);
  24.     }  
  25.    
  26.     public FileDrop(
  27.             final java.awt.Component c,
  28.             final boolean recursive,
  29.             final Listener listener) {
  30.         this(null, c,
  31.                 javax.swing.BorderFactory.createMatteBorder(2, 2, 2, 2, defaultBorderColor),
  32.                 recursive, listener);
  33.     }  
  34.  
  35.     public FileDrop(
  36.             final java.io.PrintStream out,
  37.             final java.awt.Component c,
  38.             final Listener listener) {
  39.         this(out, c,
  40.                 javax.swing.BorderFactory.createMatteBorder(2, 2, 2, 2, defaultBorderColor),
  41.                 false, listener);
  42.     }  
  43.  
  44.  
  45.     public FileDrop(
  46.             final java.io.PrintStream out,
  47.             final java.awt.Component c,
  48.             final boolean recursive,
  49.             final Listener listener) {
  50.         this(out, c,
  51.                 javax.swing.BorderFactory.createMatteBorder(2, 2, 2, 2, defaultBorderColor),
  52.                 recursive, listener);
  53.     }  
  54.  
  55.     public FileDrop(
  56.             final java.awt.Component c,
  57.             final javax.swing.border.Border dragBorder,
  58.             final Listener listener) {
  59.         this(null, c, dragBorder, false, listener);
  60.     }  
  61.    
  62.     public FileDrop(
  63.             final java.awt.Component c,
  64.             final javax.swing.border.Border dragBorder,
  65.             final boolean recursive,
  66.             final Listener listener) {
  67.         this(null, c, dragBorder, recursive,listener);
  68.     }  
  69.  
  70.  
  71.     public FileDrop(
  72.             final java.io.PrintStream out,
  73.             final java.awt.Component c,
  74.             final javax.swing.border.Border dragBorder,
  75.             final Listener listener) {
  76.         this(out, c, dragBorder, false, listener);
  77.     }  
  78.  
  79.  
  80.     public FileDrop(
  81.             final java.io.PrintStream out,
  82.             final java.awt.Component c,
  83.             final javax.swing.border.Border dragBorder,
  84.             final boolean recursive,
  85.             final Listener listener) {
  86.  
  87.         if (supportsDnD()) {  
  88.             dropListener = new java.awt.dnd.DropTargetListener() {
  89.                 @Override
  90.                 public void dragEnter(java.awt.dnd.DropTargetDragEvent evt) {
  91.                     if (isDragOk(out, evt)) {
  92.                         if (c instanceof javax.swing.JComponent) {
  93.                             javax.swing.JComponent jc = (javax.swing.JComponent) c;
  94.                             normalBorder = jc.getBorder();
  95.                             jc.setBorder(dragBorder);
  96.                         }  
  97.                         evt.acceptDrag(java.awt.dnd.DnDConstants.ACTION_COPY);
  98.                     } else {  
  99.                         evt.rejectDrag();
  100.                     }  
  101.                 }  
  102.                 @Override
  103.                 public void dragOver(java.awt.dnd.DropTargetDragEvent evt) {}  
  104.                 @Override
  105.                 public void drop(java.awt.dnd.DropTargetDropEvent evt) {
  106.                     try {  
  107.                         java.awt.datatransfer.Transferable tr = evt.getTransferable();
  108.                         if (tr.isDataFlavorSupported(java.awt.datatransfer.DataFlavor.javaFileListFlavor)) {
  109.                             evt.acceptDrop(java.awt.dnd.DnDConstants.ACTION_COPY);
  110.  
  111.                             java.util.List fileList = (java.util.List) tr.getTransferData(java.awt.datatransfer.DataFlavor.javaFileListFlavor);
  112.                             java.util.Iterator iterator = fileList.iterator();
  113.  
  114.                             java.io.File[] filesTemp = new java.io.File[fileList.size()];
  115.                             fileList.toArray(filesTemp);
  116.                             final java.io.File[] files = filesTemp;
  117.  
  118.                             if (listener != null) {
  119.                                 listener.filesDropped(files);
  120.                             }
  121.                             evt.getDropTargetContext().dropComplete(true);
  122.                            
  123.                         } else {
  124.                             DataFlavor[] flavors = tr.getTransferDataFlavors();
  125.                             boolean handled = false;
  126.                             for (DataFlavor flavor : flavors) {
  127.                                 if (flavor.isRepresentationClassReader()) {
  128.                                     evt.acceptDrop(java.awt.dnd.DnDConstants.ACTION_COPY);
  129.                                  
  130.                                     Reader reader = flavor.getReaderForText(tr);
  131.                                     BufferedReader br = new BufferedReader(reader);
  132.                                     if (listener != null) {
  133.                                         listener.filesDropped(createFileArray(br, out));
  134.                                     }
  135.                                     evt.getDropTargetContext().dropComplete(true);
  136.                                     handled = true;
  137.                                     break;
  138.                                 }
  139.                             }
  140.                             if (!handled) {
  141.                                 evt.rejectDrop();
  142.                             }
  143.                         }  
  144.                     } catch (java.io.IOException | java.awt.datatransfer.UnsupportedFlavorException io) {
  145.                         io.printStackTrace(out);
  146.                         evt.rejectDrop();
  147.                     } finally {
  148.                         if (c instanceof javax.swing.JComponent) {
  149.                             javax.swing.JComponent jc = (javax.swing.JComponent) c;
  150.                             jc.setBorder(normalBorder);
  151.                         }  
  152.                     }   // end finally
  153.                 }   // end drop
  154.  
  155.                 @Override
  156.                 public void dragExit(java.awt.dnd.DropTargetEvent evt) {
  157.                     if (c instanceof javax.swing.JComponent) {
  158.                         javax.swing.JComponent jc = (javax.swing.JComponent) c;
  159.                         jc.setBorder(normalBorder);
  160.                     }  
  161.                 }  
  162.  
  163.                 @Override
  164.                 public void dropActionChanged(java.awt.dnd.DropTargetDragEvent evt) {
  165.                     if (isDragOk(out, evt)) {  
  166.                         evt.acceptDrag(java.awt.dnd.DnDConstants.ACTION_COPY);
  167.                     } else {
  168.                         evt.rejectDrag();
  169.                     }  
  170.                 }  
  171.             }; // end DropTargetListener
  172.             makeDropTarget(out, c, recursive);
  173.         } else {
  174.             log(out, "FileDrop: Drag and drop is not supported with this JVM");
  175.         }  
  176.     } //end constructor
  177.  
  178.     private static boolean supportsDnD() {  
  179.         if (supportsDnD == null) {
  180.             boolean support = false;
  181.             try {
  182.                 Class arbitraryDndClass = Class.forName("java.awt.dnd.DnDConstants");
  183.                 support = true;
  184.             } catch (Exception e) {
  185.                 support = false;
  186.             }  
  187.             supportsDnD = support;
  188.         }  
  189.         return supportsDnD;
  190.     }
  191.  
  192.     private static String ZERO_CHAR_STRING = "" + (char) 0;
  193.  
  194.     private static File[] createFileArray(BufferedReader bReader, PrintStream out) {
  195.         try {
  196.             java.util.List list = new java.util.ArrayList();
  197.             java.lang.String line = null;
  198.             while ((line = bReader.readLine()) != null) {
  199.                 try {
  200.                     if (ZERO_CHAR_STRING.equals(line)) {
  201.                         continue;
  202.                     }
  203.                     java.io.File file = new java.io.File(new java.net.URI(line));
  204.                     list.add(file);
  205.                 } catch (Exception ex) {
  206.                     log(out, "Error with " + line + ": " + ex.getMessage());
  207.                 }
  208.             }
  209.  
  210.             return (java.io.File[]) list.toArray(new File[list.size()]);
  211.         } catch (IOException ex) {
  212.             log(out, "FileDrop: IOException");
  213.         }
  214.         return new File[0];
  215.     }
  216.  
  217.     private void makeDropTarget(final java.io.PrintStream out, final java.awt.Component c, boolean recursive) {
  218.         final java.awt.dnd.DropTarget dt = new java.awt.dnd.DropTarget();
  219.         try {
  220.             dt.addDropTargetListener(dropListener);
  221.         } catch (java.util.TooManyListenersException e) {
  222.             e.printStackTrace();
  223.         }  
  224.  
  225.         c.addHierarchyListener(new java.awt.event.HierarchyListener() {
  226.             @Override
  227.             public void hierarchyChanged(java.awt.event.HierarchyEvent evt) {
  228.                 java.awt.Component parent = c.getParent();
  229.                 if (parent == null) {
  230.                     c.setDropTarget(null);
  231.                 } else {
  232.                     new java.awt.dnd.DropTarget(c, dropListener);
  233.                 }  
  234.             }  
  235.         }); // end hierarchy listener
  236.         if (c.getParent() != null) {
  237.             new java.awt.dnd.DropTarget(c, dropListener);
  238.         }
  239.         if (recursive && (c instanceof java.awt.Container)) {
  240.             java.awt.Container cont = (java.awt.Container) c;
  241.             java.awt.Component[] comps = cont.getComponents();
  242.             for (Component comp : comps) {
  243.                 makeDropTarget(out, comp, recursive);
  244.             }
  245.         }  
  246.     }  
  247.  
  248.    
  249.     private boolean isDragOk(final java.io.PrintStream out, final java.awt.dnd.DropTargetDragEvent evt) {
  250.         boolean ok = false;
  251.         java.awt.datatransfer.DataFlavor[] flavors = evt.getCurrentDataFlavors();
  252.         int i = 0;
  253.         while (!ok && i < flavors.length) {
  254.             final DataFlavor curFlavor = flavors[i];
  255.             if (curFlavor.equals(java.awt.datatransfer.DataFlavor.javaFileListFlavor)
  256.                     || curFlavor.isRepresentationClassReader()) {
  257.                 ok = true;
  258.             }
  259.             i++;
  260.         }  
  261.         if (out != null) {
  262.             for (i = 0; i < flavors.length; i++) {
  263.             //    log(out, flavors[i].toString());
  264.             }
  265.         }
  266.         return ok;
  267.     }  
  268.  
  269.     private static void log(java.io.PrintStream out, String message) {   // Log message if requested
  270.         if (out != null) {
  271.             out.println(message);
  272.         }
  273.     }
  274.  
  275.     public static boolean remove(java.awt.Component c) {
  276.         return remove(null, c, true);
  277.     }
  278.  
  279.     public static boolean remove(java.io.PrintStream out, java.awt.Component c, boolean recursive) {   // Make sure we support dnd.
  280.         if (supportsDnD()) {
  281.             c.setDropTarget(null);
  282.             if (recursive && (c instanceof java.awt.Container)) {
  283.                 java.awt.Component[] comps = ((java.awt.Container) c).getComponents();
  284.                 for (Component comp : comps) {
  285.                     remove(out, comp, recursive);
  286.                 }
  287.                 return true;
  288.             } else {
  289.                 return false;
  290.             }
  291.         } else {
  292.             return false;
  293.         }
  294.     }  
  295.  
  296.     public static interface Listener {
  297.         public abstract void filesDropped(java.io.File[] files);
  298.     }  
  299.  
  300.     public static class Event extends java.util.EventObject {
  301.         private java.io.File[] files;
  302.         public Event(java.io.File[] files, Object source) {
  303.             super(source);
  304.             this.files = files;
  305.         }  
  306.         public java.io.File[] getFiles() {
  307.             return files;
  308.         }  
  309.     }
  310.  
  311.     public static class TransferableObject implements java.awt.datatransfer.Transferable {
  312.         public final static String MIME_TYPE = "application/x-net.iharder.dnd.TransferableObject";
  313.         public final static java.awt.datatransfer.DataFlavor DATA_FLAVOR
  314.                 = new java.awt.datatransfer.DataFlavor(FileDrop.TransferableObject.class, MIME_TYPE);
  315.  
  316.         private Fetcher fetcher;
  317.         private Object data;
  318.         private java.awt.datatransfer.DataFlavor customFlavor;
  319.  
  320.         public TransferableObject(Object data) {
  321.             this.data = data;
  322.             this.customFlavor = new java.awt.datatransfer.DataFlavor(data.getClass(), MIME_TYPE);
  323.         }
  324.  
  325.         public TransferableObject(Fetcher fetcher) {
  326.             this.fetcher = fetcher;
  327.         }  
  328.  
  329.         public TransferableObject(Class dataClass, Fetcher fetcher) {
  330.             this.fetcher = fetcher;
  331.             this.customFlavor = new java.awt.datatransfer.DataFlavor(dataClass, MIME_TYPE);
  332.         }
  333.  
  334.         public java.awt.datatransfer.DataFlavor getCustomDataFlavor() {
  335.             return customFlavor;
  336.         }  
  337.  
  338.         @Override
  339.         public java.awt.datatransfer.DataFlavor[] getTransferDataFlavors() {
  340.             if (customFlavor != null) {
  341.                 return new java.awt.datatransfer.DataFlavor[]{customFlavor,
  342.                     DATA_FLAVOR,
  343.                     java.awt.datatransfer.DataFlavor.stringFlavor
  344.                 };  
  345.             } else {
  346.                 return new java.awt.datatransfer.DataFlavor[]{DATA_FLAVOR,
  347.                     java.awt.datatransfer.DataFlavor.stringFlavor
  348.                 };  
  349.             }
  350.         }
  351.  
  352.         @Override
  353.         public Object getTransferData(java.awt.datatransfer.DataFlavor flavor)
  354.                 throws java.awt.datatransfer.UnsupportedFlavorException, java.io.IOException {
  355.             if (flavor.equals(DATA_FLAVOR)) {
  356.                 return fetcher == null ? data : fetcher.getObject();
  357.             }
  358.             if (flavor.equals(java.awt.datatransfer.DataFlavor.stringFlavor)) {
  359.                 return fetcher == null ? data.toString() : fetcher.getObject().toString();
  360.             }
  361.             throw new java.awt.datatransfer.UnsupportedFlavorException(flavor);
  362.         }  
  363.  
  364.         @Override
  365.         public boolean isDataFlavorSupported(java.awt.datatransfer.DataFlavor flavor) {
  366.             if (flavor.equals(DATA_FLAVOR)) {
  367.                 return true;
  368.             }
  369.             return flavor.equals(java.awt.datatransfer.DataFlavor.stringFlavor);
  370.         }  
  371.  
  372.         public static interface Fetcher {
  373.             public abstract Object getObject();
  374.         }
  375.     }
  376. }
  377.  
  378. //CleanApp instance
  379.         new FileDrop(mainPanel, new FileDrop.Listener() {  //25.4.16
  380.             @Override
  381.             public void filesDropped(java.io.File[] files) {
  382.                 for (File file : files) {
  383.                     try {
  384.                         newTestFile = new File(file.getCanonicalPath());
  385.                         loadFile(newTestFile);
  386.                         newTestFile = null;
  387.                         //File testFile = new File(file.getCanonicalPath());
  388.                         //loadFile(testFile);
  389.                     } catch (Exception e) {
  390.                         infoBox(e.toString(), "FileDrop Error");
  391.                         e.printStackTrace();
  392.                     }
  393.                 } // for
  394.             }   // filesDropped
  395.         });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement