@Override
	public ProgramLocation getProgramLocation(int row, int col, ListingField lf) {
		Object obj = lf.getProxy().getObject();

		if (lf instanceof ImageFactoryField) {
			Data data = (Data) obj;
			if (data.getValue() instanceof DataImage) {
				return new ResourceFieldLocation(data.getProgram(), data.getMinAddress(),
					data.getComponentPath(), codeUnitFormat.getDataValueRepresentationString(data),
					0, col, data);
			}
			// else might be a Playable
		}

		if (!(lf instanceof ListingTextField)) {
			return null;
		}

		ListingTextField btf = (ListingTextField) lf;
		FieldElement fieldElement = btf.getFieldElement(row, col);
		if (!(fieldElement instanceof OperandFieldElement)) {
			return null;
		}

		OperandFieldElement element = (OperandFieldElement) fieldElement;
		int opIndex = element.getOperandIndex();
		int subOpIndex = element.getOperandSubIndex();
		RowColLocation translatedLocation = btf.screenToDataLocation(row, col);

		if (obj instanceof Instruction) {
			Instruction inst = (Instruction) obj;
			OperandRepresentationList operandRepresentationList =
				codeUnitFormat.getOperandRepresentationList(inst, opIndex);
			String repStr = "<UNSUPPORTED>";
			Address refAddr = null;
			VariableOffset variableOffset = null;
			Program program = inst.getProgram();
			if (operandRepresentationList == null) {
				return new OperandFieldLocation(program, inst.getMinAddress(), variableOffset,
					refAddr, repStr, opIndex, subOpIndex, translatedLocation.col());
			}

			repStr = operandRepresentationList.toString();
			if (subOpIndex >= 0 && operandRepresentationList.size() > subOpIndex) {
				Object rep = operandRepresentationList.get(subOpIndex);
				if (rep instanceof Address) {
					refAddr = (Address) rep;
				}
				else {
					int extendedRefIndex = repStr.indexOf("=>");
					if (extendedRefIndex < 0 || translatedLocation.col() <= extendedRefIndex) {
						// only get variable offset if extended reference was not clicked on
						variableOffset = getVariableOffset(rep);
					}
					refAddr = inst.getAddress(opIndex);
					if (refAddr == null) {
						// Check for inferred variable reference
						refAddr = getVariableStorageAddress(inst, operandRepresentationList,
							element.getText());
					}

					if (rep instanceof Equate) {
						Equate equate = (Equate) rep;
						return new EquateOperandFieldLocation(program, inst.getMinAddress(),
							refAddr, repStr, equate, opIndex, subOpIndex, translatedLocation.col());
					}
				}
			}
			return new OperandFieldLocation(program, inst.getMinAddress(), variableOffset, refAddr,
				repStr, opIndex, subOpIndex, translatedLocation.col());
		}
		else if (obj instanceof Data) {
			Data data = (Data) obj;
			Address refAddr = null;
			Program program = data.getProgram();
			ReferenceManager referenceManager = program.getReferenceManager();
			Address minAddress = data.getMinAddress();
			Reference primaryReference = referenceManager.getPrimaryReferenceFrom(minAddress, 0);
			Object value = data.getValue();
			if (primaryReference != null) {
				refAddr = primaryReference.getToAddress();
			}
			else {
				if (value instanceof Address) {
					refAddr = (Address) value;
				}
			}

			if (value instanceof Scalar) {
				Scalar scalar = (Scalar) value;
				EquateTable equateTable = program.getEquateTable();
				Equate equate = equateTable.getEquate(minAddress, opIndex, scalar.getValue());
				if (equate != null) {
					return new EquateOperandFieldLocation(program, minAddress, refAddr,
						equate.getDisplayName(), equate, opIndex, subOpIndex,
						translatedLocation.col());
				}
			}
			return new OperandFieldLocation(program, minAddress, data.getComponentPath(), refAddr,
				codeUnitFormat.getDataValueRepresentationString(data), 0, col);
		}
		return null;
	}
Constructor
@param name the name of the field.
@param model the model that the field belongs to.
@param hlProvider the HightlightProvider.
@param displayOptions the Options for display properties.
@param fieldOptions the Options for field specific properties.
Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/field/OperandFieldHelper.java