⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 droptarget.java

📁 源码为Eclipse开源开发平台桌面开发工具SWT的源代码,
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
		selectedOperation = event.detail;	}		effect.show(event.feedback, event.x, event.y);		OS.MoveMemory(pdwEffect, new int[] {opToOs(selectedOperation)}, 4);	return COM.S_OK;}private int Drop(int pDataObject, int grfKeyState, int pt_x, int pt_y, int pdwEffect) {	effect.show(DND.FEEDBACK_NONE, 0, 0);	DNDEvent event = new DNDEvent();	event.widget = this;	event.time = OS.GetMessageTime();	event.detail = DND.DROP_NONE;	try {		notifyListeners(DND.DragLeave, event);	} catch (Throwable e) {}		event = new DNDEvent();	if (!setEventData(event, pDataObject, grfKeyState, pt_x, pt_y, pdwEffect)) {		keyOperation = -1;		OS.MoveMemory(pdwEffect, new int[] {COM.DROPEFFECT_NONE}, 4);		return COM.S_OK;	}	keyOperation = -1;		int allowedOperations = event.operations;	TransferData[] allowedDataTypes = new TransferData[event.dataTypes.length];	System.arraycopy(event.dataTypes, 0, allowedDataTypes, 0, allowedDataTypes.length);		event.dataType = selectedDataType;			event.detail = selectedOperation;	try {		notifyListeners(DND.DropAccept,event);	} catch (Throwable e) {		event.detail = DND.DROP_NONE;		event.dataType = null;	}	selectedDataType = null;	for (int i = 0; i < allowedDataTypes.length; i++) {		if (TransferData.sameType(allowedDataTypes[i], event.dataType)){			selectedDataType = allowedDataTypes[i];			break;		}	}	selectedOperation = DND.DROP_NONE;	if (selectedDataType != null && (allowedOperations & event.detail) == event.detail) {		selectedOperation = event.detail;	}	if (selectedOperation == DND.DROP_NONE){		OS.MoveMemory(pdwEffect, new int[] {COM.DROPEFFECT_NONE}, 4);			return COM.S_OK;	}		// Get Data in a Java format	Object object = null;	for (int i = 0; i < transferAgents.length; i++){		if (transferAgents[i].isSupportedType(selectedDataType)){			object = transferAgents[i].nativeToJava(selectedDataType);			break;		}	}	if (object == null){		selectedOperation = DND.DROP_NONE;	}		event.detail = selectedOperation;	event.dataType = selectedDataType;	event.data = object;	try {		notifyListeners(DND.Drop,event);		selectedOperation = DND.DROP_NONE;		if ((allowedOperations & event.detail) == event.detail) {			selectedOperation = event.detail;		}	} catch (Throwable e) {		selectedOperation = DND.DROP_NONE;	}		//notify source of action taken			OS.MoveMemory(pdwEffect, new int[] {opToOs(selectedOperation)}, 4);		return COM.S_OK;}/** * Returns the Control which is registered for this DropTarget.  This is the control over which the  * user positions the cursor to drop the data. * * @return the Control which is registered for this DropTarget */public Control getControl () {	return control;}private int getOperationFromKeyState(int grfKeyState) {	boolean ctrl = (grfKeyState & OS.MK_CONTROL) != 0;	boolean shift = (grfKeyState & OS.MK_SHIFT) != 0;	if (ctrl && shift) return DND.DROP_LINK;	if (ctrl)return DND.DROP_COPY;	if (shift)return DND.DROP_MOVE;	return DND.DROP_DEFAULT;}/** * Returns a list of the data types that can be transferred to this DropTarget. * * @return a list of the data types that can be transferred to this DropTarget */public Transfer[] getTransfer() {	return transferAgents;}public void notifyListeners (int eventType, Event event) {	Point coordinates = new Point(event.x, event.y);	coordinates = control.toControl(coordinates);	if (this.control instanceof Tree) {		Tree tree = (Tree)control;		event.item = tree.getItem(coordinates);		if (event.item == null) {			Rectangle area = tree.getClientArea();			if (area.contains(coordinates)) {				// Scan across the width of the tree.				for (int x1 = area.x; x1 < area.x + area.width; x1++) {					Point pt = new Point(x1, coordinates.y);					event.item = tree.getItem(pt);					if (event.item != null) {						break;					}				}			}		}	}	if (this.control instanceof Table) {		Table table = (Table)control;		event.item = table.getItem(coordinates);		if (event.item == null) {			Rectangle area = table.getClientArea();			if (area.contains(coordinates)) {				// Scan across the width of the tree.				for (int x1 = area.x; x1 < area.x + area.width; x1++) {					Point pt = new Point(x1, coordinates.y);					event.item = table.getItem(pt);					if (event.item != null) {						break;					}				}			}		}	}	super.notifyListeners(eventType, event);}private void onDispose () {		if (control == null) return;	COM.RevokeDragDrop(control.handle);		if (controlListener != null)		control.removeListener(SWT.Dispose, controlListener);	controlListener = null;	control.setData(DROPTARGETID, null);	transferAgents = null;	control = null;		COM.CoLockObjectExternal(iDropTarget.getAddress(), false, true);		this.Release();		COM.CoFreeUnusedLibraries();}private int opToOs(int operation) {	int osOperation = 0;	if ((operation & DND.DROP_COPY) != 0){		osOperation |= COM.DROPEFFECT_COPY;	}	if ((operation & DND.DROP_LINK) != 0) {		osOperation |= COM.DROPEFFECT_LINK;	}	if ((operation & DND.DROP_MOVE) != 0) {		osOperation |= COM.DROPEFFECT_MOVE;	}	return osOperation;}private int osToOp(int osOperation){	int operation = 0;	if ((osOperation & COM.DROPEFFECT_COPY) != 0){		operation |= DND.DROP_COPY;	}	if ((osOperation & COM.DROPEFFECT_LINK) != 0) {		operation |= DND.DROP_LINK;	}	if ((osOperation & COM.DROPEFFECT_MOVE) != 0) {		operation |= DND.DROP_MOVE;	}	return operation;}private int QueryInterface(int riid, int ppvObject) {		if (riid == 0 || ppvObject == 0)		return COM.E_INVALIDARG;	GUID guid = new GUID();	COM.MoveMemory(guid, riid, GUID.sizeof);	if (COM.IsEqualGUID(guid, COM.IIDIUnknown) || COM.IsEqualGUID(guid, COM.IIDIDropTarget)) {		COM.MoveMemory(ppvObject, new int[] {iDropTarget.getAddress()}, 4);		AddRef();		return COM.S_OK;	}	COM.MoveMemory(ppvObject, new int[] {0}, 4);	return COM.E_NOINTERFACE;}private int Release() {	refCount--;		if (refCount == 0) {		disposeCOMInterfaces();		COM.CoFreeUnusedLibraries();	}		return refCount;}/** * Removes the listener from the collection of listeners who will * be notified when a drag and drop operation is in progress. * * @param listener the listener which should be notified * * @exception IllegalArgumentException <ul> *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li> * </ul> * @exception SWTException <ul> *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> * </ul> * * @see DropTargetListener * @see #addDropListener */public void removeDropListener(DropTargetListener listener) {		if (listener == null) DND.error (SWT.ERROR_NULL_ARGUMENT);	removeListener (DND.DragEnter, listener);	removeListener (DND.DragLeave, listener);	removeListener (DND.DragOver, listener);	removeListener (DND.DragOperationChanged, listener);	removeListener (DND.Drop, listener);	removeListener (DND.DropAccept, listener);}private boolean setEventData(DNDEvent event, int pDataObject, int grfKeyState, int pt_x, int pt_y, int pdwEffect) {		if (pDataObject == 0 || pdwEffect == 0) return false;		// get allowed operations	int style = getStyle();	int[] operations = new int[1];	OS.MoveMemory(operations, pdwEffect, 4);	operations[0] = osToOp(operations[0]) & style;	if (operations[0] == DND.DROP_NONE) return false;		// get current operation	int operation = getOperationFromKeyState(grfKeyState);	keyOperation = operation;	if (operation == DND.DROP_DEFAULT) {		if ((style & DND.DROP_DEFAULT) == 0) {			operation = (operations[0] & DND.DROP_MOVE) != 0 ? DND.DROP_MOVE : DND.DROP_NONE;		}	} else {		if ((operation & operations[0]) == 0) operation = DND.DROP_NONE;	}		// Get allowed transfer types	TransferData[] dataTypes = new TransferData[0];	IDataObject dataObject = new IDataObject(pDataObject);	dataObject.AddRef();	try {		int[] address = new int[1];		if (dataObject.EnumFormatEtc(COM.DATADIR_GET, address) != COM.S_OK) {			return false;		}		IEnumFORMATETC enum = new IEnumFORMATETC(address[0]);		try {			// Loop over enumerator and save any types that match what we are looking for			int rgelt = OS.GlobalAlloc(OS.GMEM_FIXED | OS.GMEM_ZEROINIT, FORMATETC.sizeof);			try {				int[] pceltFetched = new int[1];				enum.Reset();				while (enum.Next(1, rgelt, pceltFetched) == COM.S_OK && pceltFetched[0] == 1) {					TransferData transferData = new TransferData();					transferData.formatetc = new FORMATETC();					COM.MoveMemory(transferData.formatetc, rgelt, FORMATETC.sizeof);					transferData.type = transferData.formatetc.cfFormat;					transferData.pIDataObject = pDataObject;					for (int i = 0; i < transferAgents.length; i++){						if (transferAgents[i].isSupportedType(transferData)){							TransferData[] newDataTypes = new TransferData[dataTypes.length + 1];							System.arraycopy(dataTypes, 0, newDataTypes, 0, dataTypes.length);							newDataTypes[dataTypes.length] = transferData;							dataTypes = newDataTypes;							break;						}					}				}			} finally {				OS.GlobalFree(rgelt);			}		} finally {			enum.Release();		}	} finally {		dataObject.Release();	}	if (dataTypes.length == 0) return false;		event.widget = this;	event.x = pt_x;	event.y = pt_y;	event.time = OS.GetMessageTime();	event.feedback = DND.FEEDBACK_SELECT;	event.dataTypes = dataTypes;	event.dataType = dataTypes[0];	event.operations = operations[0];	event.detail = operation;	return true;}/** * Specifies the data types that can be transferred to this DropTarget.  If data is  * being dragged that does not match one of these types, the drop target will be notified of  * the drag and drop operation but the currentDataType will be null and the operation  * will be DND.NONE. * * @param transferAgents a list of Transfer objects which define the types of data that can be *						 dropped on this target *  * @exception IllegalArgumentException <ul> *    <li>ERROR_NULL_ARGUMENT - if transferAgents is null</li> * </ul> */public void setTransfer(Transfer[] transferAgents){	if (transferAgents == null) DND.error(SWT.ERROR_NULL_ARGUMENT);	this.transferAgents = transferAgents;}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -