@Override
	public void add(Object data, DropTargetDropEvent e, DataFlavor chosen) {

		synchronized (root) {

			draggedNodes = null;

			if (destinationNode == null) {
				return;
			}
			try {
				int dropAction = DnDConstants.ACTION_COPY;
				if (e != null) {
					dropAction = e.getDropAction();
				}

				// Note: must use destinationNode because when the user releases the mouse, the 
				// point could have moved, so the node obtained at the point is not necessarily the
				// expected destinationNode.
				processDropRequest(destinationNode, data, chosen, dropAction);
			}
			catch (Exception ex) {
				if (!(ex instanceof UsrException)) {
					Msg.error(this, "Unexpected Exception: " + ex.getMessage(), ex);
				}

				//let the drop() method handle the error reporting
				String msg = ex.getMessage();
				if (msg == null) {
					msg = ex.toString();
				}
				if (ex instanceof UsrException) {
					Msg.showError(this, this, "Error in Drop Operation", msg);
				}
				else {
					Msg.showError(this, this, "Error in Drop Operation", msg, ex);
				}
			}
		}
	}
Droppable interface method called to know when the drop site is
valid.
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/programtree/ProgramDnDTree.java