Simple Drop File Support for JVx applications
Our next update release of VisionX will support Dropping files. It's a very useful feature and was easy to implement. Sure, it's a Swing specific feature, but our VisionX is more or less JVx Swing UI based.
Get a first impression
We drop an exported application archive into VisionX and the import wizard is starting. It's also possible to Drop a file directly into the import wizard.
VisionX is a JVx application and it's super easy to implement such feature for your own JVx application. Here's a code snippet how it'll work:
String... pExtension)
{
Object oResource = pTarget.getResource();
if (!(oResource instanceof JComponent) && !(oResource instanceof JFrame))
{
throw new IllegalArgumentException("Given object can't be a drop target!");
}
SimpleFileDropHandler handler = new SimpleFileDropHandler(pListener, pExtension);
if (oResource instanceof JFrame)
{
((JFrame)oResource).setTransferHandler(handler);
}
else
{
JComponent jcomp = getComponent((JComponent)oResource);
if (jcomp != null)
{
jcomp.setTransferHandler(handler);
}
}
}
private JComponent getComponent(JComponent pComponent)
{
if (pComponent instanceof JVxEditor)
{
JComponent comp = ((JVxEditor)pComponent).
getCellEditorHandler().getCellEditorComponent();
if (comp instanceof JScrollPane)
{
Component cView = ((JScrollPane)comp).getViewport().getView();
if (cView instanceof JComponent)
{
return ((JComponent)cView);
}
else
{
return null;
}
}
else
{
return comp;
}
}
else
{
return pComponent;
}
}
In principle, we set the TransferHandler for a JComponent. Above code detects the right JComponent because there's a difference if you use an IEditor.
The TransferHandler could be implemented like our SimpleFileDropHandler
{
private IFileHandleReceiver listener;
private String[] extensions;
public SimpleFileDropHandler(IFileHandleReceiver pListener, String... pExtension)
{
listener = pListener;
extensions = pExtension;
}
@Override
public boolean canImport(TransferHandler.TransferSupport pSupport)
{
if (!pSupport.isDrop())
{
return false;
}
if (!pSupport.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
{
return false;
}
boolean copySupported = (COPY & pSupport.getSourceDropActions()) == COPY;
if (copySupported)
{
pSupport.setDropAction(TransferHandler.COPY);
return true;
}
return false;
}
@Override
public boolean importData(TransferHandler.TransferSupport support)
{
if (!support.isDrop())
{
return false;
}
List<File> files;
try
{
files = (List<File>)support.getTransferable().
getTransferData(DataFlavor.javaFileListFlavor);
}
catch (UnsupportedFlavorException ex)
{
// should never happen (or JDK is buggy)
return false;
}
catch (IOException ex)
{
// should never happen (or JDK is buggy)
return false;
}
if (listener != null)
{
for (File file : files)
{
try
{
listener.receiveFileHandle(new FileHandle(file));
}
catch (Exception e)
{
ExceptionHandler.raise(e);
}
}
}
return true;
}
}
Have fun