package sun.awt.motif;
import java.awt.Image;
import java.awt.datatransfer.DataFlavor;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
import java.io.InputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriter;
import javax.imageio.spi.ImageWriterSpi;
import sun.awt.datatransfer.DataTransferer;
import sun.awt.datatransfer.ToolkitThreadBlockedHandler;
public class MDataTransferer extends DataTransferer {
private static final long FILE_NAME_ATOM;
private static final long DT_NET_FILE_ATOM;
private static final long PNG_ATOM;
private static final long JFIF_ATOM;
static {
FILE_NAME_ATOM = getAtomForTarget("FILE_NAME");
DT_NET_FILE_ATOM = getAtomForTarget("_DT_NETFILE");
PNG_ATOM = getAtomForTarget("PNG");
JFIF_ATOM = getAtomForTarget("JFIF");
}
private MDataTransferer() {
}
private static MDataTransferer transferer;
static MDataTransferer getInstanceImpl() {
if (transferer == null) {
synchronized (MDataTransferer.class) {
if (transferer == null) {
transferer = new MDataTransferer();
}
}
}
return transferer;
}
public String getDefaultUnicodeEncoding() {
return "iso-10646-ucs-2";
}
public boolean isLocaleDependentTextFormat(long format) {
return false;
}
public boolean isTextFormat(long format) {
return super.isTextFormat(format)
|| isMimeFormat(format, "text");
}
protected String getCharsetForTextFormat(Long lFormat) {
long format = lFormat.longValue();
if (isMimeFormat(format, "text")) {
String nat = getNativeForFormat(format);
DataFlavor df = new DataFlavor(nat, null);
if (!DataTransferer.doesSubtypeSupportCharset(df)) {
return null;
}
String charset = df.getParameter("charset");
if (charset != null) {
return charset;
}
}
return super.getCharsetForTextFormat(lFormat);
}
public boolean isFileFormat(long format) {
return format == FILE_NAME_ATOM || format == DT_NET_FILE_ATOM;
}
public boolean isImageFormat(long format) {
return format == PNG_ATOM || format == JFIF_ATOM
|| isMimeFormat(format, "image");
}
protected Long getFormatForNativeAsLong(String str) {
long atom = getAtomForTarget(str);
if (atom <= 0) {
throw new InternalError("Cannot register a target");
}
return Long.valueOf(atom);
}
protected String getNativeForFormat(long format) {
return getTargetNameForAtom(format);
}
public ToolkitThreadBlockedHandler getToolkitThreadBlockedHandler() {
return MToolkitThreadBlockedHandler.getToolkitThreadBlockedHandler();
}
static native long getAtomForTarget(String name);
private static native String getTargetNameForAtom(long atom);
protected byte[] imageToPlatformBytes(Image image, long format)
throws IOException {
String mimeType = null;
if (format == PNG_ATOM) {
mimeType = "image/png";
} else if (format == JFIF_ATOM) {
mimeType = "image/jpeg";
} else {
try {
String nat = getNativeForFormat(format);
DataFlavor df = new DataFlavor(nat);
String primaryType = df.getPrimaryType();
if ("image".equals(primaryType)) {
mimeType = df.getPrimaryType() + "/" + df.getSubType();
}
} catch (Exception e) {
}
}
if (mimeType != null) {
return imageToStandardBytes(image, mimeType);
} else {
String nativeFormat = getNativeForFormat(format);
throw new IOException("Translation to " + nativeFormat +
" is not supported.");
}
}
protected Image platformImageBytesOrStreamToImage(InputStream inputStream,
byte[] bytes,
long format)
throws IOException {
String mimeType = null;
if (format == PNG_ATOM) {
mimeType = "image/png";
} else if (format == JFIF_ATOM) {
mimeType = "image/jpeg";
} else {
try {
String nat = getNativeForFormat(format);
DataFlavor df = new DataFlavor(nat);
String primaryType = df.getPrimaryType();
if ("image".equals(primaryType)) {
mimeType = df.getPrimaryType() + "/" + df.getSubType();
}
} catch (Exception e) {
}
}
if (mimeType != null) {
return standardImageBytesOrStreamToImage(inputStream, bytes, mimeType);
} else {
String nativeFormat = getNativeForFormat(format);
throw new IOException("Translation from " + nativeFormat +
" is not supported.");
}
}
private boolean isMimeFormat(long format, String primaryType) {
String nat = getNativeForFormat(format);
if (nat == null) {
return false;
}
try {
DataFlavor df = new DataFlavor(nat);
if (primaryType.equals(df.getPrimaryType())) {
return true;
}
} catch (Exception e) {
}
return false;
}
public List getPlatformMappingsForNative(String nat) {
List flavors = new ArrayList();
if (nat == null) {
return flavors;
}
DataFlavor df = null;
try {
df = new DataFlavor(nat);
} catch (Exception e) {
return flavors;
}
Object value = df;
final String primaryType = df.getPrimaryType();
final String baseType = primaryType + "/" + df.getSubType();
if ("text".equals(primaryType)) {
value = primaryType + "/" + df.getSubType();
} else if ("image".equals(primaryType)) {
Iterator readers = ImageIO.getImageReadersByMIMEType(baseType);
if (readers.hasNext()) {
flavors.add(DataFlavor.imageFlavor);
}
}
flavors.add(value);
return flavors;
}
private static ImageTypeSpecifier defaultSpecifier = null;
private ImageTypeSpecifier getDefaultImageTypeSpecifier() {
if (defaultSpecifier == null) {
ColorModel model = ColorModel.getRGBdefault();
WritableRaster raster =
model.createCompatibleWritableRaster(10, 10);
BufferedImage bufferedImage =
new BufferedImage(model, raster, model.isAlphaPremultiplied(),
null);
defaultSpecifier = new ImageTypeSpecifier(bufferedImage);
}
return defaultSpecifier;
}
public List getPlatformMappingsForFlavor(DataFlavor df) {
List natives = new ArrayList(1);
if (df == null) {
return natives;
}
String charset = df.getParameter("charset");
String baseType = df.getPrimaryType() + "/" + df.getSubType();
String mimeType = baseType;
if (charset != null && DataTransferer.isFlavorCharsetTextType(df)) {
mimeType += ";charset=" + charset;
}
if (df.getRepresentationClass() != null &&
(df.isRepresentationClassInputStream() ||
df.isRepresentationClassByteBuffer() ||
byteArrayClass.equals(df.getRepresentationClass()))) {
natives.add(mimeType);
}
if (DataFlavor.imageFlavor.equals(df)) {
String[] mimeTypes = ImageIO.getWriterMIMETypes();
if (mimeTypes != null) {
for (int i = 0; i < mimeTypes.length; i++) {
Iterator writers =
ImageIO.getImageWritersByMIMEType(mimeTypes[i]);
while (writers.hasNext()) {
ImageWriter imageWriter = (ImageWriter)writers.next();
ImageWriterSpi writerSpi =
imageWriter.getOriginatingProvider();
if (writerSpi != null &&
writerSpi.canEncodeImage(getDefaultImageTypeSpecifier())) {
natives.add(mimeTypes[i]);
break;
}
}
}
}
} else if (DataTransferer.isFlavorCharsetTextType(df)) {
final Iterator iter = DataTransferer.standardEncodings();
if (DataFlavor.stringFlavor.equals(df)) {
baseType = "text/plain";
}
while (iter.hasNext()) {
String encoding = (String)iter.next();
if (!encoding.equals(charset)) {
natives.add(baseType + ";charset=" + encoding);
}
}
if (!natives.contains(baseType)) {
natives.add(baseType);
}
}
return natives;
}
protected native String[] dragQueryFile(byte[] bytes);
}