[DnD] TransferableObject class
28/01/2009
package com.pingus.dnd.transferables; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; public class TransferableObject implements Transferable { private Object obj; private DataFlavor thisFlavor; private ArrayList acceptedFlavors; private Transferable defaultTransferableObject; /** * Creates a new instance of TransferableObject */ public TransferableObject(Object obj, DataFlavor[] acceptedFlavors, Transferable defaultTransferableObject) { super(); this.obj = obj; this.acceptedFlavors = toArrayList(acceptedFlavors); this.thisFlavor = new DataFlavor(obj.getClass(), obj.getClass().getName()); if(!this.acceptedFlavors.contains(thisFlavor)) this.acceptedFlavors.add(thisFlavor); this.defaultTransferableObject = defaultTransferableObject; } /** * Creates a new instance of TransferableObject */ public TransferableObject(Object obj, ArrayList acceptedFlavors, Transferable defaultTransferableObject) { super(); this.obj = obj; this.acceptedFlavors = acceptedFlavors; this.thisFlavor = new DataFlavor(obj.getClass(), obj.getClass().getName()); if(!this.acceptedFlavors.contains(thisFlavor)) this.acceptedFlavors.add(thisFlavor); this.defaultTransferableObject = defaultTransferableObject; } public static ArrayList toArrayList(Object[] objects) { ArrayList list = new ArrayList(objects.length); for(int i=0; i<objects.length; ++i) { list.add(objects[i]); } return list; } public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { System.out.println("[TransferableObject] <getTransferData> flavor: "+flavor); System.out.println("[TransferableObject] <getTransferData> thisFlavor: "+thisFlavor); if (flavor.equals(thisFlavor)) { return obj; } return this.defaultTransferableObject.getTransferData(flavor); } /** * @return Returns the object. */ public Object getObject() { return this.obj; } public DataFlavor[] getTransferDataFlavors() { DataFlavor[] fl = new DataFlavor[acceptedFlavors.size()]; for(int i=0; i<fl.length; ++i) { fl[i] = (DataFlavor)acceptedFlavors.get(i); } return fl; } public boolean isDataFlavorSupported(DataFlavor flavor) { return acceptedFlavors.contains(flavor); } /** * @return Returns the defaultTransferableObject. */ public Transferable getDefaultTransferableObject() { return this.defaultTransferableObject; } /** * @return Returns the best Flavor of the transferable object. */ public DataFlavor getPreferredFlavor() { return this.thisFlavor; } /** * Util method that transform text into InputStream using a given DataFlavor. * @param text The String to be exported * @param flavor The DataFlavor that request the export. * @return An InputStream containing the <code>text</code> * @throws UnsupportedEncodingException ... */ public static InputStream exportAsInputStream(String text, DataFlavor flavor) throws UnsupportedEncodingException { String charset = flavor.getMimeType().replaceFirst(".*charset=", ""); System.out.println("[TransferableObject] <exportAsInputStream> Charset: "+charset); return new ByteArrayInputStream(text.getBytes(charset)); } /** * Util method that transform the transferable object from TextPlainUnicode to String. * @param transferable The transferable object to be imported. * @return The String representation of the transferable as TextPlainUnicode. * @throws UnsupportedFlavorException ... * @throws IOException ... */ public static String importAsInputStream(Transferable transferable) throws UnsupportedFlavorException, IOException { BufferedReader sr = new BufferedReader(DataFlavor.getTextPlainUnicodeFlavor().getReaderForText(transferable)); String line = null; String plainText = ""; while((line = sr.readLine()) != null) { plainText += line; } return plainText; } }