Unix drag and drop implemented
authoramwaterhouse <Andrew Waterhouse>
Mon, 30 Jan 2006 14:55:40 +0000 (14:55 +0000)
committeramwaterhouse <Andrew Waterhouse>
Mon, 30 Jan 2006 14:55:40 +0000 (14:55 +0000)
src/jalview/gui/Desktop.java

index 8a96033..6295801 100755 (executable)
@@ -235,42 +235,17 @@ public class Desktop extends jalview.jbgui.GDesktop
         {}
     }
 
-
-    /**
-     * DOCUMENT ME!
-     *
-     * @param evt DOCUMENT ME!
-     */
     public void dragEnter(DropTargetDragEvent evt)
-    {
-    }
+    {}
 
-    /**
-     * DOCUMENT ME!
-     *
-     * @param evt DOCUMENT ME!
-     */
     public void dragExit(DropTargetEvent evt)
-    {
-    }
+    {}
 
-    /**
-     * DOCUMENT ME!
-     *
-     * @param evt DOCUMENT ME!
-     */
     public void dragOver(DropTargetDragEvent evt)
-    {
-    }
+    {}
 
-    /**
-     * DOCUMENT ME!
-     *
-     * @param evt DOCUMENT ME!
-     */
     public void dropActionChanged(DropTargetDragEvent evt)
-    {
-    }
+    {}
 
     /**
      * DOCUMENT ME!
@@ -280,40 +255,73 @@ public class Desktop extends jalview.jbgui.GDesktop
     public void drop(DropTargetDropEvent evt)
     {
         Transferable t = evt.getTransferable();
+        java.util.List files = null;
+
+        try
+        {
+          DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
+          if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
+          {
+            //Works on Windows and MacOSX
+            evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
+            files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
+          }
+          else if (t.isDataFlavorSupported(uriListFlavor))
+          {
+            // This is used by Unix drag system
+            evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
+            String data = (String) t.getTransferData(uriListFlavor);
+            files = new java.util.ArrayList(1);
+            for (java.util.StringTokenizer st = new java.util.StringTokenizer(
+                data,
+                "\r\n");
+                 st.hasMoreTokens(); )
+            {
+              String s = st.nextToken();
+              if (s.startsWith("#"))
+              {
+                // the line is a comment (as per the RFC 2483)
+                continue;
+              }
 
-        if (!t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
+              java.net.URI uri = new java.net.URI(s);
+              java.io.File file = new java.io.File(uri);
+              files.add(file);
+            }
+          }
+        }
+        catch (Exception e)
         {
-            return;
+          e.printStackTrace();
         }
 
-        evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
-
-        try
+        if (files != null)
         {
-            java.util.List files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
-
+          try
+          {
             for (int i = 0; i < files.size(); i++)
             {
-                String file = files.get(i).toString();
-                String protocol = "File";
-                String format = null;
+              String file = files.get(i).toString();
+              String protocol = "File";
+              String format = null;
 
-                if (file.endsWith(".jar"))
-                {
-                  format = "Jalview";
+              if (file.endsWith(".jar"))
+              {
+                format = "Jalview";
 
-                }
-                else
-                {
-                    format = jalview.io.IdentifyFile.Identify(file,
-                            protocol);
-                }
-                LoadFile(file, protocol, format);
+              }
+              else
+              {
+                format = jalview.io.IdentifyFile.Identify(file,
+                                                          protocol);
+              }
+              LoadFile(file, protocol, format);
             }
-        }
-        catch (Exception ex)
-        {
+          }
+          catch (Exception ex)
+          {
             ex.printStackTrace();
+          }
         }
     }