private void nextAreaDiff(boolean forward) {
		NavigateType type = nextPreviousAreaTypeAction.getCurrentState().getUserData();
		ListingPanel activeListingPanel = getActiveListingPanel();
		ProgramLocation activePanelLocation = activeListingPanel.getProgramLocation();
		if (activePanelLocation == null) {
			tool.setStatusInfo(
				"The " + (activeSide == LEFT ? "first" : "second") + " listing is empty.");
			return;
		}
		Address activeAddress = activePanelLocation.getAddress();

		ArrayList<AddressRangeIterator> iteratorList = new ArrayList<>();

		if (type == NavigateType.ALL || type == NavigateType.DIFF) {
			AddressSetView activeDiffs = listingDiff.getDiffs(activeSide);
			iteratorList.add(activeDiffs.getAddressRanges(activeAddress, forward));
		}
		if (type == NavigateType.ALL || type == NavigateType.UNMATCHED) {
			AddressSetView unmatchedCode = listingDiff.getUnmatchedCode(activeSide);
			iteratorList.add(unmatchedCode.getAddressRanges(activeAddress, forward));
		}

		MultiAddressRangeIterator multiIterator = new MultiAddressRangeIterator(
			iteratorList.toArray(new AddressRangeIterator[iteratorList.size()]), forward);

		if (multiIterator.hasNext()) {
			AddressRange nextRange = multiIterator.next();
			Address minAddress = nextRange.getMinAddress();
			if ((forward ? nextRange.contains(activeAddress) : minAddress.equals(activeAddress)) &&
				multiIterator.hasNext()) {
				nextRange = multiIterator.next();
				minAddress = nextRange.getMinAddress();
			}
			if (minAddress.equals(activeAddress)) {
				outputNoNextPreviousMessage(forward, activeSide);
				return;
			}
			tool.clearStatusInfo();
			activeListingPanel.goTo(minAddress);
		}
		else {
			outputNoNextPreviousMessage(forward, activeSide);
		}
	}
Establishes the location and display of the arrow cursor. This method should be called after
the function comparison window is loaded with functions, data, etc.
Ghidra/Features/Base/src/main/java/ghidra/features/base/codecompare/listing/ListingCodeComparisonPanel.java