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;
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");
- }
});
}
@Override
public void keyTyped(final KeyEvent e) {
- logger.log(Level.FINEST, "key typed");
EventQueue.invokeLater(new Runnable() {
@Override
});
}
}
-}
\ 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;
+ }
+}