package javaforce;
/** Clipboard
*
* NOTE : in readFiles() and writeFiles() the Action is ignored (Java does not support it)
* The Action is only valid in DND unfortunately.
*
* @author pquiring
*
* Created : Oct 9, 2013
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.datatransfer.*;
import java.io.*;
import javax.swing.*;
public class JFClipboard {
public static class ImageTransferable implements Transferable
{
private Image image;
public ImageTransferable (Image image)
{
this.image = image;
}
public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException
{
if (isDataFlavorSupported(flavor))
{
return image;
}
else
{
throw new UnsupportedFlavorException(flavor);
}
}
public boolean isDataFlavorSupported (DataFlavor flavor)
{
return flavor == DataFlavor.imageFlavor;
}
public DataFlavor[] getTransferDataFlavors ()
{
return new DataFlavor[] { DataFlavor.imageFlavor };
}
}
public static DataFlavor[] getDataFlavors() {
return Toolkit.getDefaultToolkit().getSystemClipboard().getAvailableDataFlavors();
}
public static Image readImage()
{
Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
try
{
if (t != null && t.isDataFlavorSupported(DataFlavor.imageFlavor))
{
Image image = (Image)t.getTransferData(DataFlavor.imageFlavor);
return image;
}
}
catch (Exception e) {
JFLog.log(e);
}
return null;
}
/** Converts unknown Image format to JFImage. */
public static JFImage convertImage(Image image) {
int x = image.getWidth(null);
int y = image.getHeight(null);
JFImage jfimg = new JFImage(x,y);
jfimg.getGraphics().drawImage(image, 0, 0, null);
return jfimg;
}
public static void writeImage(Image image)
{
ImageTransferable transferable = new ImageTransferable(image);
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(transferable, null);
}
public static String readString() {
Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
try
{
if (t != null && t.isDataFlavorSupported(DataFlavor.stringFlavor))
{
String str = (String)t.getTransferData(DataFlavor.stringFlavor);
return str;
}
}
catch (Exception e) {
JFLog.log(e);
}
return null;
}
public static void writeString(String str) {
StringSelection ss = new StringSelection(str);
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);
}
public static class FileList {
public java.util.List<File> files;
public int action;
}
public static final int NONE = 0;
public static final int COPY = 1;
public static final int MOVE = 2; //cut
public static final int COPY_OR_MOVE = 3;
public static boolean useAWT = false; //does not support action types
public static class JComp extends JComponent {}
public static class MyTransferHandler extends TransferHandler {
public java.util.List<File> files;
public int action;
public boolean canImport(TransferHandler.TransferSupport info) {
JFLog.log("canImport");
if (!info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
return false;
}
TransferHandler.DropLocation dl = (TransferHandler.DropLocation) info.getDropLocation();
Point pt = dl.getDropPoint();
return true;
}
@SuppressWarnings("unchecked")
public boolean importData(TransferHandler.TransferSupport info) {
JFLog.log("importData");
// Check for file flavor
if (!info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
return false;
}
// Get the file(s) that are being dropped.
Transferable t = info.getTransferable();
try {
files = (java.util.List<File>) t.getTransferData(DataFlavor.javaFileListFlavor);
} catch (Exception e) {
return false;
}
action = NONE;
return true;
}
public int getSourceActions(JComponent c) {
JFLog.log("getSourceActions:" + action);
return action;
}
protected Transferable createTransferable(JComponent c) {
JFLog.log("createTransferable");
return new Transferable() {
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] {DataFlavor.javaFileListFlavor};
}
public boolean isDataFlavorSupported(DataFlavor df) {
return (df == DataFlavor.javaFileListFlavor);
}
public Object getTransferData(DataFlavor df) throws UnsupportedFlavorException, IOException {
return files;
}
};
}
protected void exportDone(JComponent source, Transferable data, int action) {
JFLog.log("exportDone:action=" + action);
}
}
@SuppressWarnings("unchecked")
public static FileList readFiles() {
FileList fl = new FileList();
if (useAWT) {
Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
try
{
if (t != null && t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
{
java.util.List<File> files = (java.util.List<File>)t.getTransferData(DataFlavor.javaFileListFlavor);
fl.files.addAll(files);
fl.action = NONE;
return fl;
}
}
catch (Exception e) {
JFLog.log(e);
}
} else {
JComp c = new JComp();
MyTransferHandler th = new MyTransferHandler();
c.setTransferHandler(th);
Action a = TransferHandler.getPasteAction();
a.actionPerformed(new ActionEvent(c,0,"paste"));
fl.files = th.files;
fl.action = th.action;
return fl;
}
return null;
}
public static void writeFiles(final FileList fl) {
if (useAWT) {
Transferable t = new Transferable() {
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] {DataFlavor.javaFileListFlavor};
}
public boolean isDataFlavorSupported(DataFlavor df) {
return (df == DataFlavor.javaFileListFlavor);
}
public Object getTransferData(DataFlavor df) throws UnsupportedFlavorException, IOException {
return fl.files;
}
};
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(t, null);
} else {
//use swing
if (fl.action != COPY && fl.action != MOVE) return;
JComp c = new JComp();
MyTransferHandler th = new MyTransferHandler();
th.files = fl.files;
th.action = fl.action;
c.setTransferHandler(th);
Action a;
if (fl.action == COPY)
a = TransferHandler.getCopyAction();
else
a = TransferHandler.getCutAction();
a.actionPerformed(new ActionEvent(c,0,fl.action == COPY ? "copy" : "cut"));
}
}
public static void clearClipboard() {
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(null, null);
}
};