All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ru.sbtqa.monte.media.gui.datatransfer.DropFileTransferHandler Maven / Gradle / Ivy

There is a newer version: 1.1.0-JAVA7
Show newest version
/* @(#)DropFileTransferHandler.java
 * Copyright © 2011 Werner Randelshofer, Switzerland. 
 * You may only use this software in accordance with the license terms.
 */
package ru.sbtqa.monte.media.gui.datatransfer;

import java.awt.datatransfer.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.im.InputContext;
import java.io.*;
import java.util.*;
import javax.swing.*;

/**
 * The DropFileTransferHandler can be used to add drag and drop support. When a
 * file is dropped, the supplied ActionListner is invoked. The filename is
 * passed in the action command.
 *
 * @author Werner Randelshofer
 * @version 1.2 2010-10-03 Adds support for file filter.
 * 
1.1 2008-12-03 Added file selection mode. *
1.0 September 8, 2007 Created. */ public class DropFileTransferHandler extends TransferHandler { private final static long serialVersionUID = 1L; private boolean shouldRemove; private int p0; private int p1; private int fileSelectionMode; private FileFilter fileFilter; private ActionListener actionListener; /** * Creates a new instance. */ public DropFileTransferHandler() { this(JFileChooser.FILES_ONLY); } /** * Creates a new instance. * * @param fileSelectionMode JFileChooser file selection mode. */ public DropFileTransferHandler(int fileSelectionMode) { this(fileSelectionMode, null); } /** * Creates a new instance. * * @param fileSelectionMode JFileChooser file selection mode. * @param filter TODO */ public DropFileTransferHandler(int fileSelectionMode, FileFilter filter) { this(fileSelectionMode, filter, null); } /** * Creates a new instance. * * @param fileSelectionMode JFileChooser file selection mode. * @param filter TODO * @param l TODO */ public DropFileTransferHandler(int fileSelectionMode, FileFilter filter, ActionListener l) { this.fileFilter = filter; if (fileSelectionMode != JFileChooser.FILES_AND_DIRECTORIES && fileSelectionMode != JFileChooser.FILES_ONLY && fileSelectionMode != JFileChooser.DIRECTORIES_ONLY) { throw new IllegalArgumentException("illegal file selection mode:" + fileSelectionMode); } this.fileSelectionMode = fileSelectionMode; setActionListener(l); } public void setActionListener(ActionListener l) { this.actionListener = l; } @Override public boolean importData(JComponent c, Transferable t) { boolean imported = false; if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { InputContext ic = c.getInputContext(); if (ic != null) { ic.endComposition(); } try { @SuppressWarnings("unchecked") List list = (List) t.getTransferData(DataFlavor.javaFileListFlavor); if (!list.isEmpty()) { File file = list.get(0); switch (fileSelectionMode) { case JFileChooser.FILES_AND_DIRECTORIES: break; case JFileChooser.FILES_ONLY: if (file.isDirectory()) { return false; } break; case JFileChooser.DIRECTORIES_ONLY: if (!file.isDirectory()) { return false; } break; } if (fileFilter != null && !fileFilter.accept(file)) { return false; } actionListener.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, file.getPath())); } imported = true; } catch (UnsupportedFlavorException ex) { // ex.printStackTrace(); } catch (IOException ex) { // ex.printStackTrace(); } } return imported; } @Override protected Transferable createTransferable(JComponent comp) { return null; } @Override public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) { if (!(comp.isEnabled())) { return false; } for (DataFlavor flavor : transferFlavors) { if (flavor.isFlavorJavaFileListType() || flavor.isFlavorTextType()) { return true; } } return false; } /** * Try to find a flavor that can be used to import a Transferable. The set * of usable flavors are tried in the following order: * * First, an attempt to find a text/plain flavor is made. * Second, an attempt to find a flavor representing a String reference * in the same VM is made. * Lastly, DataFlavor.stringFlavor is searched for. * * * @param flavors TODO * @param c TODO * @return TODO */ protected DataFlavor getImportFlavor(DataFlavor[] flavors, JComponent c) { DataFlavor plainFlavor = null; DataFlavor refFlavor = null; DataFlavor stringFlavor = null; for (int i = 0; i < flavors.length; i++) { String mime = flavors[i].getMimeType(); if (mime.startsWith("text/plain")) { return flavors[i]; } else if (refFlavor == null && mime.startsWith("application/x-java-jvm-local-objectref") && flavors[i].getRepresentationClass() == java.lang.String.class) { refFlavor = flavors[i]; } else if (stringFlavor == null && flavors[i].equals(DataFlavor.stringFlavor)) { stringFlavor = flavors[i]; } } if (refFlavor != null) { return refFlavor; } else if (stringFlavor != null) { return stringFlavor; } return null; } // --- TransferHandler methods ------------------------------------ /** * This is the type of transfer actions supported by the source. Some models * are not mutable, so a transfer operation of COPY only should be * advertised in that case. * * @param comp The component holding the data to be transfered. This * argument is provided to enable sharing of TransferHandlers by multiple * components. * @return This is implemented to return NONE if the component is a * JPasswordField since exporting data via user gestures is not allowed. If * the text component is editable, COPY_OR_MOVE is returned, otherwise just * COPY is allowed. */ @Override public int getSourceActions(JComponent comp) { return NONE; } /** * This method is called after data has been exported. This method should * remove the data that was transfered if the action was MOVE. * * @param comp The component that was the source of the data. * @param data The data that was transferred or possibly null if the action * is NONE. * @param action The actual action that was performed. */ @Override protected void exportDone(JComponent comp, Transferable data, int action) { // } /** * @return the fileFilter */ public FileFilter getFileFilter() { return fileFilter; } /** * @param fileFilter the fileFilter to set */ public void setFileFilter(FileFilter fileFilter) { this.fileFilter = fileFilter; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy