OSDN Git Service

ID入力欄のDnD実装
authoryukihane <yukihane.feather@gmail.com>
Wed, 7 Sep 2011 12:34:49 +0000 (21:34 +0900)
committeryukihane <yukihane.feather@gmail.com>
Fri, 9 Sep 2011 11:45:13 +0000 (20:45 +0900)
frontend/src/yukihane/inqubus/gui/IdComboBox.java

index 36ed2b1..77e534c 100644 (file)
@@ -1,20 +1,32 @@
 package yukihane.inqubus.gui;
 
+import static yukihane.inqubus.InqubusConstants.*;
+
 import java.awt.EventQueue;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.awt.event.FocusAdapter;
 import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
 import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
 import java.nio.file.Path;
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import java.util.regex.Matcher;
 import javax.swing.DefaultComboBoxModel;
 import javax.swing.JComboBox;
 import javax.swing.JTextField;
+import javax.swing.TransferHandler;
+import javax.swing.text.JTextComponent;
+import org.apache.commons.io.FilenameUtils;
 import yukihane.inqubus.filewatch.FileWatch;
 import yukihane.inqubus.filewatch.FileWatchUtil;
 
@@ -29,19 +41,14 @@ final class IdComboBox extends JComboBox<String> {
         this.videoFileWatcher = videoFileWather;
         setEditable(true);
         setSelectedIndex(-1);
+        getEditorComponent().setTransferHandler(new IdTransferHander(getEditorComponent().getTransferHandler()));
         getEditorComponent().addKeyListener(new AutoCompleteAdapter());
-        getEditorComponent().addFocusListener(new FocusListener() {
+        getEditorComponent().addFocusListener(new FocusAdapter() {
 
             @Override
             public void focusGained(FocusEvent e) {
-                logger.log(Level.FINEST, "ID field focus gained");
                 setAlternates(videoFileWatcher.getFiles());
             }
-
-            @Override
-            public void focusLost(FocusEvent e) {
-                logger.log(Level.FINEST, "ID field focus lost");
-            }
         });
 
     }
@@ -67,7 +74,6 @@ final class IdComboBox extends JComboBox<String> {
 
         @Override
         public void keyTyped(final KeyEvent e) {
-            logger.log(Level.FINEST, "key typed");
             EventQueue.invokeLater(new Runnable() {
 
                 @Override
@@ -84,4 +90,75 @@ final class IdComboBox extends JComboBox<String> {
             });
         }
     }
-}
\ No newline at end of file
+}
+
+class IdTransferHander extends TransferHandler {
+
+    private static final Logger logger = Logger.getLogger(IdTransferHander.class.getName());
+    private static final DataFlavor URL_FLAVOR;
+
+    static {
+        try {
+            URL_FLAVOR = new DataFlavor("application/x-java-url; class=java.net.URL");
+        } catch (ClassNotFoundException ex) {
+            throw new IllegalStateException(ex);
+        }
+    }
+    private final TransferHandler defaultTransferHandler;
+
+    IdTransferHander(TransferHandler defaultTransferHandler) {
+        this.defaultTransferHandler = defaultTransferHandler;
+    }
+
+    @Override
+    public boolean canImport(TransferHandler.TransferSupport support) {
+        if (logger.isLoggable(Level.FINEST)) {
+            for (DataFlavor df : support.getDataFlavors()) {
+                logger.log(Level.FINEST, df.toString() + ", " + df.getClass().getName());
+            }
+        }
+
+        if (support.isDataFlavorSupported(DataFlavor.stringFlavor)
+                || support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
+            if (support.isDrop()) {
+                support.setDropAction(LINK);
+            }
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean importData(TransferHandler.TransferSupport support) {
+        try {
+            String targetText;
+            if (support.isDataFlavorSupported(URL_FLAVOR)) {
+                final URL url = (URL) support.getTransferable().getTransferData(URL_FLAVOR);
+                targetText = url.getPath();
+            } else if (support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
+                final List<File> files = (List<File>) support.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
+                if (!files.isEmpty()) {
+                    final File file = files.get(0);
+                    targetText = FilenameUtils.getBaseName(file.getPath());
+                } else {
+                    return false;
+                }
+            } else if (support.isDataFlavorSupported(DataFlavor.stringFlavor)) {
+                targetText = (String) support.getTransferable().getTransferData(DataFlavor.stringFlavor);
+            } else {
+                return false;
+            }
+
+            final Matcher matcher = PATTERN_VIDEO_ID.matcher(targetText);
+            if (matcher.find()) {
+                final String text = matcher.group(1);
+                final JTextComponent component = (JTextComponent) support.getComponent();
+                component.setText(text);
+                return true;
+            }
+        } catch (UnsupportedFlavorException | IOException ex) {
+            logger.log(Level.SEVERE, null, ex);
+        }
+        return false;
+    }
+}