private Address copyDataForAddress(Address address, AddressRange currentRange,
			TextLayoutGraphics g, Rectangle rectangle) {

		FGData functionGraphData = controller.getFunctionGraphData();
		FunctionGraph functionGraph = functionGraphData.getFunctionGraph();
		FGVertex vertex = functionGraph.getVertexForAddress(address);
		if (vertex == null) {
			return null; // shouldn't happen
		}

		ListingModel listingModel = vertex.getListingModel(address);

		// Add the layout for the present address
		Layout layout = listingModel.getLayout(address, false);
		if (layout != null) {
			LayoutBackgroundColorManager layoutColorMap =
				new EmptyLayoutBackgroundColorManager(PAINT_CONTEXT.getBackground());
			layout.paint(null, g, PAINT_CONTEXT, rectangle, layoutColorMap, null);
			g.flush();
		}

		// Get the next Address and update the page index
		if (address.equals(currentRange.getMaxAddress())) {
			return null;
		}

		Address addressAfter = listingModel.getAddressAfter(address);
		if (addressAfter != null) {
			return addressAfter;
		}

		// A null address could mean that we have reached the end of the listing for the given
		// vertex.  If that is the case, we should look the next address by adding to the current
		// address.  This will allow a future call to this method to get the vertex that contains
		// that address.
		Address nextAddress = null;
		try {
			nextAddress = address.add(layout.getIndexSize());
		}
		catch (AddressOutOfBoundsException oobe) {
			// ignore and give up!
		}

		return nextAddress;
	}
Overridden because we don't have a single listing model from which to copy, but rather 
many different ones, depending upon the which vertex contains the selection.
Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/FGClipboardProvider.java