private void initialize() {
		setLayout(new GridLayout(0, 1));

		LibraryRecord libraryRecord = fidQueryService.getLibraryForFunction(functionRecord);
		LanguageID languageID = libraryRecord.getGhidraLanguageID();

		addLabel(String.format("%s %s %s (%s)", libraryRecord.getLibraryFamilyName(),
			libraryRecord.getLibraryVersion(), libraryRecord.getLibraryVariant(),
			languageID.getIdAsString()));

		addButton(String.format("0x%016x", functionRecord.getID()), e -> FidDebugUtils
				.searchByFunctionID(functionRecord.getID(), service, fidQueryService));

		addButton(functionRecord.getName(),
			e -> FidDebugUtils.searchByName(functionRecord.getName(), service, fidQueryService));

		addButton(shorten(functionRecord.getDomainPath()), e -> FidDebugUtils
				.searchByDomainPath(functionRecord.getDomainPath(), service, fidQueryService));

		addLabel(String.format("Entry Point: 0x%x", functionRecord.getEntryPoint()));

		addButton(
			String.format("FH: 0x%016x (%d)", functionRecord.getFullHash(),
				functionRecord.getCodeUnitSize()),
			e -> FidDebugUtils.searchByFullHash(functionRecord.getFullHash(), service,
				fidQueryService)

		);

		addButton(
			String.format("XH: 0x%016x (+%d)", functionRecord.getSpecificHash(),
				functionRecord.getSpecificHashAdditionalSize()),
			e -> FidDebugUtils.searchBySpecificHash(functionRecord.getSpecificHash(), service,
				fidQueryService));

		addLabel(String.format("%s %s %s %s %s",
			functionRecord.hasTerminator() ? "" : "(unterminated function)",
			functionRecord.autoFail() ? "(auto-fail)" : "",
			functionRecord.autoPass() ? "(auto-pass)" : "",
			functionRecord.isForceSpecific() ? "(force-specific)" : "",
			functionRecord.isForceRelation() ? "(force-relation)" : ""));
	}
Layout the panel, add the components and listeners.
Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/debug/FidFunctionDebugPanel.java