public void ungroupVertex(FGController controller, GroupedFunctionGraphVertex groupedVertex,
			boolean isUngroupAll) {

		stopAllNonMutativeAnimation();

		//
		// Get the original vertices and add them back to the graph.
		//
		FGData functionGraphData = controller.getFunctionGraphData();
		FunctionGraph functionGraph = functionGraphData.getFunctionGraph();
		Graph<FGVertex, FGEdge> graph = functionGraph;

		if (!graph.containsVertex(groupedVertex)) {
			throw new IllegalArgumentException(
				"Cannot ungroup a vertex that is not in the graph!: " +
					groupedVertex.getUserText());
		}

		Set<FGVertex> vertices = groupedVertex.getVertices();
		for (FGVertex newVertex : vertices) {
			graph.addVertex(newVertex);
		}

		//
		// Add the edges back to the graph
		//
		Set<FGEdge> ungroupedIncomingEdges = groupedVertex.getUngroupedEdges();
		for (FGEdge edge : ungroupedIncomingEdges) {
			validateAndAddEdge(controller, functionGraph, groupedVertex, edge);
		}

		//
		// Create the animator to smooth the process.  The animator will not
		// animate if animation is disabled.
		//
		UngroupVertexFunctionGraphJob job = new UngroupVertexFunctionGraphJob(controller,
			groupedVertex, isAnimationEnabled(), isUngroupAll);
		scheduleViewChangeJob(job);
	}
Performs a relayout of the graph currently used by the given controller.
@param controller The controller whose graph should have relayout called
Ghidra/Features/FunctionGraph/src/main/java/ghidra/graph/viewer/FGViewUpdater.java