@Override
	public boolean isDropOk(DropTargetDragEvent e) {
		synchronized (root) {
			Point p = e.getLocation();
			ProgramNode targetNode = getTreeNode(p);
			if (isEditing()) {
				stopEditing();
			}

			if (targetNode == null) {
				return false;
			}

			if (dragSelectionContainsTarget(targetNode)) {
				return false;
			}

			if (draggedNodes == null) {
				// could be another kind of transferable
				return isDropSiteOk(targetNode, e);
			}

			// This is tree node transferable... 
			if (draggedNodes.length > 0 && draggedNodes[0].equals(root)) {
				return false;
			}

			return !dragSelectionContainsDescendant(targetNode);
		}
	}
Class to support Drag and Drop; it is also responsible for
rendering the icons, and  for editing a node name.
<p>The nodes that are used in this class are ProgramNode objects.</p>
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/programtree/DragNDropTree.java