void add(ProgramNode destNode, ProgramNode[] dropNodes, int dropAction, int relativeMousePos) 
            throws NotFoundException, CircularDependencyException, DuplicateGroupException {
	
		if (relativeMousePos != 0) {
			reorderDDMgr.add(destNode, dropNodes, dropAction, relativeMousePos);
			return;
		}

		String operation = (dropAction == DnDConstants.ACTION_MOVE)? "Move" : "Copy";
		int transactionID = tree.startTransaction(operation);
		if (transactionID < 0) {
			return;
		}
		
		try {
		    
            for ( int i = 0; i < dropNodes.length; i++ ) {            
                boolean ok = true;
                
                // this is a normal drag/drop on the node
                if (destNode.isFragment()) {
                    ok = addToFragment(destNode, dropNodes[i]);
                }
                else {
                    addToModule(destNode, dropNodes[i], dropAction);
                }
                if (ok) {
                    tree.addSelectionPath(destNode.getTreePath());
                }
            }
		} finally {
			tree.endTransaction(transactionID, true);
		}
    }
Add the given data to the destination node.
@param destNode destination node for the data.
@param dropNode data to add
@param dropAction move or copy
@param relativeMousePos mouse position within the node:
 			-1 --> above node,
				 0 --> at the node
				 1 --> below the node
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/programtree/DnDMoveManager.java