/*
* VectorGraphicsTransferable.java
*
* Created on March 29, 2002, 2:53 PM
*/
package jas.hist;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.swing.RepaintManager;
/**
*
* @author tonyj
*/
public class VectorGraphicsTransferable implements ClipboardOwner, Transferable
{
private Component component;
private static DataFlavor imageFlavor = new DataFlavor("image/x-java-image; class=java.awt.Image", "Image");
private static Map types = new HashMap();
/** Creates a new instance of VectorGraphicsTransferable */
public VectorGraphicsTransferable(Component c)
{
this.component = c;
}
public Object getTransferData(DataFlavor dataFlavor) throws UnsupportedFlavorException, IOException
{
if (dataFlavor.match(imageFlavor))
{
Image img = component.createImage(component.getWidth(),component.getHeight());
Graphics g = img.getGraphics();
// TODO: It would be better to use the PrintHelper to do this??
// TODO: Make sure we get high quality printing for GIF.
RepaintManager pm = RepaintManager.currentManager(component);
boolean save = pm.isDoubleBufferingEnabled();
pm.setDoubleBufferingEnabled(false);
component.print(g);
g.dispose();
pm.setDoubleBufferingEnabled(save);
return img;
}
else
{
SaveAsPlugin type = (SaveAsPlugin) types.get(dataFlavor);
if (type != null)
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
type.saveAs(component,out,null,component);
out.close();
return new ByteArrayInputStream(out.toByteArray());
}
}
throw new UnsupportedFlavorException(dataFlavor);
}
public DataFlavor[] getTransferDataFlavors()
{
DataFlavor[] result = new DataFlavor[types.size() + 1];
types.keySet().toArray(result);
result[types.size()] = imageFlavor;
return result;
}
public boolean isDataFlavorSupported(DataFlavor dataFlavor)
{
if (dataFlavor.match(imageFlavor)) return true;
if (types.containsKey(dataFlavor)) return true;
return false;
}
public void lostOwnership(Clipboard clipboard, Transferable transferable)
{
}
public static void register(DataFlavor flavor, SaveAsPlugin type)
{
types.put(flavor,type);
}
}