public ProgramLocation getProgramLocation(int y, int height, AddressIndexMap map, int x) {

		assertSwing();
		// Many overview panels can be rendering this marker set, each having its own height.
		// If the height does not match that from the last-computed indices, we need to recompute.
		computeNavigationIndices(height, map);
		if (overview == null || lastHeight != height) {
			return null;
		}

		ProgramLocation loc = null;
		if (overviewContains(y)) {
			y -= MARKER_HEIGHT - 1;
			if (y < 0) {
				y = 0;
			}

			BigDecimal bigHeight = BigDecimal.valueOf(height);
			BigInteger bigStarty = BigInteger.valueOf(y);
			BigInteger bigEndy = BigInteger.valueOf(y + MARKER_HEIGHT);
			BigInteger numIndexes = map.getIndexCount();
			BigInteger numIndexesMinus1 = numIndexes.subtract(BigInteger.ONE);
			numIndexesMinus1 = numIndexesMinus1.max(BigInteger.ZERO);

			BigInteger start = getIndex(bigStarty, bigHeight, numIndexes, numIndexesMinus1);
			BigInteger end = getIndex(bigEndy, bigHeight, numIndexes, numIndexesMinus1);

			FieldSelection fs = new FieldSelection();
			fs.addRange(start, end.add(BigInteger.ONE));
			AddressSet set = map.getAddressSet(fs);

			if (set.isEmpty()) {
				return null;
			}

			Address addr = markers.findFirstAddressInCommon(set);
			if (addr == null) {
				addr = set.getMinAddress();
			}
			if (markerDescriptor != null) {
				MarkerLocation ml = new MarkerLocation(this, program, addr, x, y);
				loc = markerDescriptor.getProgramLocation(ml);
			}

			if (loc == null) {
				loc = new ProgramLocation(program, addr);
			}
		}
		return loc;

	}
Get the tooltip for the marker at the specified index and address

@param addr address of item to navigate to
@param x x location of cursor
@param y y location of cursor

@return tool tip string, null if no tool tip
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/marker/MarkerSetImpl.java