com.mxgraph.swing.util.mxGraphTransferable Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jgraphx Show documentation
Show all versions of jgraphx Show documentation
JGraphX Swing Component - Java Graph Visualization Library
This is a binary & source redistribution of the original, unmodified JGraphX library originating from:
"https://github.com/jgraph/jgraphx/archive/v3.4.1.3.zip".
The purpose of this redistribution is to make the library available to other Maven projects.
/**
* $Id: mxGraphTransferable.java,v 1.10 2010/01/21 14:24:00 gaudenz Exp $
* Copyright (c) 2008, Gaudenz Alder
*/
package com.mxgraph.swing.util;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.image.RenderedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.io.Serializable;
import java.io.StringReader;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.plaf.UIResource;
import com.mxgraph.util.mxRectangle;
/**
*
*/
public class mxGraphTransferable implements Transferable, UIResource,
Serializable
{
/**
*
*/
private static final long serialVersionUID = 5123819419918087664L;
/**
* Serialized Data Flavor. Use the following code to switch to local
* reference flavor:
*
* try
* {
* mxGraphTransferable.dataFlavor = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType
* + "; class=com.mxgraph.swing.util.mxGraphTransferable");
* }
* catch (ClassNotFoundException cnfe)
* {
* // do nothing
* }
*
*
* If you get a class not found exception, try the following instead:
*
* mxGraphTransferable.dataFlavor = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType
* + "; class=com.mxgraph.swing.util.mxGraphTransferable", null,
* new com.mxgraph.swing.util.mxGraphTransferable(null, null).getClass().getClassLoader());
*
*/
public static DataFlavor dataFlavor;
/**
*
*/
private static DataFlavor[] htmlFlavors;
/**
*
*/
private static DataFlavor[] stringFlavors;
/**
*
*/
private static DataFlavor[] plainFlavors;
/**
*
*/
private static DataFlavor[] imageFlavors;
/**
*
*/
protected Object[] cells;
/**
*
*/
protected mxRectangle bounds;
/**
*
*/
protected ImageIcon image;
/**
*
*/
public mxGraphTransferable(Object[] cells, mxRectangle bounds)
{
this(cells, bounds, null);
}
/**
*
*/
public mxGraphTransferable(Object[] cells, mxRectangle bounds,
ImageIcon image)
{
this.cells = cells;
this.bounds = bounds;
this.image = image;
}
/**
* @return Returns the cells.
*/
public Object[] getCells()
{
return cells;
}
/**
* Returns the unscaled, untranslated bounding box of the cells.
*/
public mxRectangle getBounds()
{
return bounds;
}
/**
*
*/
public ImageIcon getImage()
{
return image;
}
/**
*
*/
public DataFlavor[] getTransferDataFlavors()
{
DataFlavor[] richerFlavors = getRicherFlavors();
int nRicher = (richerFlavors != null) ? richerFlavors.length : 0;
int nHtml = (isHtmlSupported()) ? htmlFlavors.length : 0;
int nPlain = (isPlainSupported()) ? plainFlavors.length : 0;
int nString = (isPlainSupported()) ? stringFlavors.length : 0;
int nImage = (isImageSupported()) ? stringFlavors.length : 0;
int nFlavors = nRicher + nHtml + nPlain + nString + nImage;
DataFlavor[] flavors = new DataFlavor[nFlavors];
// fill in the array
int nDone = 0;
if (nRicher > 0)
{
System.arraycopy(richerFlavors, 0, flavors, nDone, nRicher);
nDone += nRicher;
}
if (nHtml > 0)
{
System.arraycopy(htmlFlavors, 0, flavors, nDone, nHtml);
nDone += nHtml;
}
if (nPlain > 0)
{
System.arraycopy(plainFlavors, 0, flavors, nDone, nPlain);
nDone += nPlain;
}
if (nString > 0)
{
System.arraycopy(stringFlavors, 0, flavors, nDone, nString);
nDone += nString;
}
if (nImage > 0)
{
System.arraycopy(imageFlavors, 0, flavors, nDone, nImage);
nDone += nImage;
}
return flavors;
}
/**
* Some subclasses will have flavors that are more descriptive than HTML or
* plain text. If this method returns a non-null value, it will be placed at
* the start of the array of supported flavors.
*/
protected DataFlavor[] getRicherFlavors()
{
return new DataFlavor[] { dataFlavor };
}
/**
* Returns whether or not the specified data flavor is supported for this
* object.
*
* @param flavor
* the requested flavor for the data
* @return boolean indicating whether or not the data flavor is supported
*/
public boolean isDataFlavorSupported(DataFlavor flavor)
{
DataFlavor[] flavors = getTransferDataFlavors();
for (int i = 0; i < flavors.length; i++)
{
if (flavors[i] != null && flavors[i].equals(flavor))
{
return true;
}
}
return false;
}
/**
* Returns an object which represents the data to be transferred. The class
* of the object returned is defined by the representation class of the
* flavor.
*
* @param flavor
* the requested flavor for the data
* @see DataFlavor#getRepresentationClass
* @exception IOException
* if the data is no longer available in the requested
* flavor.
* @exception UnsupportedFlavorException
* if the requested data flavor is not supported.
*/
public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException
{
if (isRicherFlavor(flavor))
{
return getRicherData(flavor);
}
else if (isImageFlavor(flavor))
{
if (image != null && image.getImage() instanceof RenderedImage)
{
if (flavor.equals(DataFlavor.imageFlavor))
{
return image.getImage();
}
else
{
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ImageIO.write((RenderedImage) image.getImage(), "bmp",
stream);
return new ByteArrayInputStream(stream.toByteArray());
}
}
}
else if (isHtmlFlavor(flavor))
{
String data = getHtmlData();
data = (data == null) ? "" : data;
if (String.class.equals(flavor.getRepresentationClass()))
{
return data;
}
else if (Reader.class.equals(flavor.getRepresentationClass()))
{
return new StringReader(data);
}
else if (InputStream.class.equals(flavor.getRepresentationClass()))
{
return new ByteArrayInputStream(data.getBytes());
}
// fall through to unsupported
}
else if (isPlainFlavor(flavor))
{
String data = getPlainData();
data = (data == null) ? "" : data;
if (String.class.equals(flavor.getRepresentationClass()))
{
return data;
}
else if (Reader.class.equals(flavor.getRepresentationClass()))
{
return new StringReader(data);
}
else if (InputStream.class.equals(flavor.getRepresentationClass()))
{
return new ByteArrayInputStream(data.getBytes());
}
// fall through to unsupported
}
else if (isStringFlavor(flavor))
{
String data = getPlainData();
data = (data == null) ? "" : data;
return data;
}
throw new UnsupportedFlavorException(flavor);
}
/**
*
* @param flavor
* @return Returns true if the given flavor is a richer flavor of this
* transferable.
*/
protected boolean isRicherFlavor(DataFlavor flavor)
{
DataFlavor[] richerFlavors = getRicherFlavors();
int nFlavors = (richerFlavors != null) ? richerFlavors.length : 0;
for (int i = 0; i < nFlavors; i++)
{
if (richerFlavors[i].equals(flavor))
{
return true;
}
}
return false;
}
/**
*
* @param flavor
* @return the richer data flavor of this and the specified
* @throws UnsupportedFlavorException
*/
public Object getRicherData(DataFlavor flavor)
throws UnsupportedFlavorException
{
if (flavor.equals(dataFlavor))
{
return this;
}
else
{
throw new UnsupportedFlavorException(flavor);
}
}
/**
* Returns whether or not the specified data flavor is an HTML flavor that
* is supported.
*
* @param flavor
* the requested flavor for the data
* @return boolean indicating whether or not the data flavor is supported
*/
protected boolean isHtmlFlavor(DataFlavor flavor)
{
DataFlavor[] flavors = htmlFlavors;
for (int i = 0; i < flavors.length; i++)
{
if (flavors[i].equals(flavor))
{
return true;
}
}
return false;
}
/**
* Whether the HTML flavors are offered. If so, the method getHTMLData
* should be implemented to provide something reasonable.
*/
protected boolean isHtmlSupported()
{
return false;
}
/**
* Fetch the data in a text/html format
*/
protected String getHtmlData()
{
return null;
}
/**
*
* @param flavor
* @return Returns true if the given flavor is an image flavor of this
* transferable.
*/
protected boolean isImageFlavor(DataFlavor flavor)
{
int nFlavors = (imageFlavors != null) ? imageFlavors.length : 0;
for (int i = 0; i < nFlavors; i++)
{
if (imageFlavors[i].equals(flavor))
{
return true;
}
}
return false;
}
/**
*
*/
public boolean isImageSupported()
{
return image != null;
}
/**
* Returns whether or not the specified data flavor is an plain flavor that
* is supported.
*
* @param flavor
* the requested flavor for the data
* @return boolean indicating whether or not the data flavor is supported
*/
protected boolean isPlainFlavor(DataFlavor flavor)
{
DataFlavor[] flavors = plainFlavors;
for (int i = 0; i < flavors.length; i++)
{
if (flavors[i].equals(flavor))
{
return true;
}
}
return false;
}
/**
* Whether the plain text flavors are offered. If so, the method
* getPlainData should be implemented to provide something reasonable.
*/
protected boolean isPlainSupported()
{
return false;
}
/**
* Fetch the data in a text/plain format.
*/
protected String getPlainData()
{
return null;
}
/**
* Returns whether or not the specified data flavor is a String flavor that
* is supported.
*
* @param flavor
* the requested flavor for the data
* @return boolean indicating whether or not the data flavor is supported
*/
protected boolean isStringFlavor(DataFlavor flavor)
{
DataFlavor[] flavors = stringFlavors;
for (int i = 0; i < flavors.length; i++)
{
if (flavors[i].equals(flavor))
{
return true;
}
}
return false;
}
/**
* Local Machine Reference Data Flavor.
*/
static
{
try
{
htmlFlavors = new DataFlavor[3];
htmlFlavors[0] = new DataFlavor("text/html;class=java.lang.String");
htmlFlavors[1] = new DataFlavor("text/html;class=java.io.Reader");
htmlFlavors[2] = new DataFlavor(
"text/html;charset=unicode;class=java.io.InputStream");
plainFlavors = new DataFlavor[3];
plainFlavors[0] = new DataFlavor(
"text/plain;class=java.lang.String");
plainFlavors[1] = new DataFlavor("text/plain;class=java.io.Reader");
plainFlavors[2] = new DataFlavor(
"text/plain;charset=unicode;class=java.io.InputStream");
stringFlavors = new DataFlavor[2];
stringFlavors[0] = new DataFlavor(
DataFlavor.javaJVMLocalObjectMimeType
+ ";class=java.lang.String");
stringFlavors[1] = DataFlavor.stringFlavor;
imageFlavors = new DataFlavor[2];
imageFlavors[0] = DataFlavor.imageFlavor;
imageFlavors[1] = new DataFlavor("image/bmp");
}
catch (ClassNotFoundException cle)
{
System.err
.println("error initializing javax.swing.plaf.basic.BasicTranserable");
}
try
{
dataFlavor = new DataFlavor(DataFlavor.javaSerializedObjectMimeType
+ "; class=com.mxgraph.swing.util.mxGraphTransferable");
}
catch (ClassNotFoundException cnfe)
{
// do nothing
}
}
}