📄 droptarget.java
字号:
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 + -