/**
* This file is part of VisiCut.
* Copyright (C) 2011 - 2013 Thomas Oster <thomas.oster@rwth-aachen.de>
* RWTH Aachen University - 52062 Aachen, Germany
*
* VisiCut is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* VisiCut is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with VisiCut. If not, see <http://www.gnu.org/licenses/>.
**/
package com.t_oster.uicomponents;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;
import javax.swing.JComponent;
/**
* This class is a helper to create platform independant file
* drop support.
*
* @author Thomas Oster <thomas.oster@rwth-aachen.de>
*/
public class FilesDropSupport implements DropTargetListener
{
private DropTarget dropTarget;
private JComponent component;
public FilesDropSupport()
{
}
public void setComponent(JComponent c)
{
if (this.dropTarget != null)
{
dropTarget.removeDropTargetListener(this);
}
this.component = c;
this.dropTarget = new DropTarget(this.component, this);
}
public JComponent getComponent()
{
return this.component;
}
protected List<File> droppedFiles = null;
public static final String PROP_DROPPEDFILES = "droppedFiles";
/**
* Get the value of droppedFiles
*
* @return the value of droppedFiles
*/
public List<File> getDroppedFiles()
{
return droppedFiles;
}
/**
* Set the value of droppedFiles
*
* @param droppedFiles new value of droppedFiles
*/
public void setDroppedFiles(List<File> droppedFiles)
{
List<File> oldDroppedFiles = this.droppedFiles;
this.droppedFiles = droppedFiles;
propertyChangeSupport.firePropertyChange(PROP_DROPPEDFILES, oldDroppedFiles, droppedFiles);
}
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
/**
* Add PropertyChangeListener.
*
* @param listener
*/
public void addPropertyChangeListener(PropertyChangeListener listener)
{
propertyChangeSupport.addPropertyChangeListener(listener);
}
/**
* Remove PropertyChangeListener.
*
* @param listener
*/
public void removePropertyChangeListener(PropertyChangeListener listener)
{
propertyChangeSupport.removePropertyChangeListener(listener);
}
public void dragEnter(DropTargetDragEvent dtde)
{
}
public void dragOver(DropTargetDragEvent dtde)
{
}
public void dropActionChanged(DropTargetDragEvent dtde)
{
}
public void dragExit(DropTargetEvent dte)
{
}
public void drop(DropTargetDropEvent event)
{
Transferable transferable = event.getTransferable();
event.acceptDrop(DnDConstants.ACTION_MOVE);
DataFlavor uriListFlavor = null;
try
{
uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
}
catch (ClassNotFoundException e)
{
}
try
{
if (transferable.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
{
List data = (List) transferable.getTransferData(DataFlavor.javaFileListFlavor);
this.filesDropped(data);
}
else
{
if (transferable.isDataFlavorSupported(uriListFlavor))
{
String data = (String) transferable.getTransferData(uriListFlavor);
List files = textURIListToFileList(data);
this.filesDropped(files);
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
private void filesDropped(List files)
{
List<File> result = new LinkedList<File>();
for (Object o : files)
{
if (o instanceof File && ((File) o).exists())
{
result.add((File) o);
}
else
{
if (o instanceof String)
{
File f = new File((String) o);
if (f.exists())
{
result.add(f);
}
}
}
}
this.setDroppedFiles(files);
}
private List textURIListToFileList(String data)
{
List list = new ArrayList(1);
for (StringTokenizer st = new StringTokenizer(data, "\r\n"); st.hasMoreTokens();)
{
String s = st.nextToken();
if (s.startsWith("#"))
{
// the line is a comment (as per the RFC 2483)
continue;
}
try
{
URI uri = new URI(s);
File file = new File(uri);
list.add(file);
}
catch (URISyntaxException e)
{
e.printStackTrace();
}
catch (IllegalArgumentException e)
{
e.printStackTrace();
}
}
return list;
}
}