private GraphViewer<V, E> buildPrimaryGraphViewer(VisualGraphLayout<V, E> layout,
			Dimension viewerSize) {

		GraphViewer<V, E> viewer = createPrimaryGraphViewer(layout, viewerSize);

		viewer.setViewerInitializedListener(v -> {
			viewerInitialized(v);
		});

		//
		// Listeners
		//
		primaryGraphMouse = viewer.getGraphMouse();

		viewer.setPickSupport(new VisualGraphShapePickSupport<>(viewer));

		// this is a listener that allows us to make edge picking easier as scaling occurs
		RenderContext<V, E> renderContext = viewer.getRenderContext();
		MultiLayerTransformer multiLayerTransformer = renderContext.getMultiLayerTransformer();
		multiLayerTransformer.addChangeListener(
			event -> GraphViewerUtils.adjustEdgePickSizeForZoom(viewer));

		gPickedState = viewer.getGPickedVertexState();
		vertexPickingListener = new VertexPickingListener(graph);
		gPickedState.addPickingListener(vertexPickingListener);

		viewer.addKeyListener(new KeyForwardingKeyAdapter(graph, viewer));

		adjustPickSupport(viewer);

		viewer.addPostRenderPaintable(messagePaintable);

		return viewer;
	}
A component that contains primary and satellite graph views.  This viewer provides
methods for manipulating the graph using the mouse.

<p>To gain the full functionality offered by this class, clients will need to subclass
this class and override {@link #createPrimaryGraphViewer(VisualGraphLayout, Dimension)}
and {@link #createSatelliteGraphViewer(GraphViewer, Dimension)} as needed.   This allows
them to customize renderers and other viewer attributes.  To use the subclass, see the
{@link VisualGraphView} and its <code>installGraphViewer()</code> method.

@param <V> the vertex type
@param <E> the edge type
@param <G> the graph type

@see GraphViewer
Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/GraphComponent.java