deep-c-rsc/JCGO/sunawt/fix_x11/sun/awt/motif/MDropTargetContextPeer.java
2021-07-16 17:12:20 -05:00

141 lines
3.3 KiB
Java

/*
* This file is modified by Ivan Maidanski <ivmai@ivmaisoft.com>
* Project name: JCGO-SUNAWT (http://www.ivmaisoft.com/jcgo/)
*/
/*
* @(#)MDropTargetContextPeer.java 1.43 03/01/23
*
* Copyright 2003 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package sun.awt.motif;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.InvalidDnDOperationException;
import java.io.InputStream;
import java.util.Map;
import java.io.IOException;
import sun.awt.dnd.SunDropTargetContextPeer;
/**
* <p>
* The MDropTargetContextPeer class is the class responsible for handling
* the interaction between the Motif DnD system and Java.
* </p>
*
* @version 1.43
* @since JDK1.2
*
*/
final class MDropTargetContextPeer extends SunDropTargetContextPeer {
private long nativeDropTransfer;
long nativeDataAvailable = 0;
Object nativeData = null;
/**
* create the peer
*/
static MDropTargetContextPeer createMDropTargetContextPeer() {
return new MDropTargetContextPeer();
}
/**
* create the peer
*/
private MDropTargetContextPeer() {
super();
}
protected Object getNativeData(long format) {
AWTLockAccess.awtLock();
try {
if (nativeDropTransfer == 0) {
nativeDropTransfer = startTransfer(getNativeDragContext(),
format);
} else {
addTransfer (nativeDropTransfer, format);
}
for (nativeDataAvailable = 0;
format != nativeDataAvailable;) {
try {
AWTLockAccess.awtWait();
} catch (ThreadDeath death) {
throw death;
} catch (Throwable e) {
e.printStackTrace();
}
}
}
finally {
AWTLockAccess.awtUnlock();
}
return nativeData;
}
/**
* signal drop complete
*/
protected void doDropDone(boolean success, int dropAction,
boolean isLocal) {
dropDone(getNativeDragContext(), nativeDropTransfer, isLocal,
success, dropAction);
}
/**
* notify transfer complete
*/
private void newData(long format, String type, byte[] data) {
nativeDataAvailable = format;
nativeData = data;
AWTLockAccess.awtNotifyAll();
}
/**
* notify transfer failed
*/
private void transferFailed(long format) {
nativeDataAvailable = format;
nativeData = null;
AWTLockAccess.awtNotifyAll();
}
/**
* schedule a native DnD transfer
*/
private native long startTransfer(long nativeDragContext, long format);
/**
* schedule a native DnD data transfer
*/
private native void addTransfer(long nativeDropTransfer, long format);
/**
* signal that drop is completed
*/
private native void dropDone(long nativeDragContext, long nativeDropTransfer,
boolean localTx, boolean success, int dropAction);
}