private static String generateParameterDetailRow(Parameter param) {

		String type = param.getDataType().getName();
		String name = param.getName();
		int length = type.length() + 1 + name.length();

		//
		// Bound the max width of the tooltip
		//
		if (length > PARAM_MAX_CHAR_LENGTH) {
			int half = PARAM_MAX_CHAR_LENGTH / 2;
			int available = half;
			if (type.length() > half) {
				type = type.substring(0, half - 3) + ELLIPSES;
			}
			else {
				available = PARAM_MAX_CHAR_LENGTH - type.length();
			}

			if (name.length() > available) {
				name = name.substring(0, available - 3) + ELLIPSES;
			}
		}

		StringBuilder buf = new StringBuilder();
		buf.append("<tr><td width=10>&nbsp;</td>"); // indent
		buf.append("<td width=\"1%\">");
		buf.append(colorString(Colors.FOREGROUND, friendlyEncodeHTML(type)));
		buf.append("</td><td width=\"1%\">");

		boolean usesCustomStorage = false;
		Function function = param.getFunction();
		if (function != null) {
			usesCustomStorage = function.hasCustomVariableStorage();
		}

		Color paramColor =
			usesCustomStorage ? FunctionColors.PARAM_CUSTOM : FunctionColors.PARAM_DYNAMIC;
		buf.append(
			colorString(paramColor, friendlyEncodeHTML(param.getVariableStorage().toString())));
		buf.append("</td><td width=\"1%\">");
		buf.append(colorString(FunctionColors.PARAM, friendlyEncodeHTML(name)));

		// consume remaining space and compact other columns
		buf.append("</td><td width=\"100%\">&nbsp;</td></tr>");
		return buf.toString();
	}
Return an HTML formatted rendering of a function

@param function the function
@param includeSymbolDetails true to include details of the symbol
@return tool tip text for the given function
Ghidra/Features/Base/src/main/java/ghidra/app/util/ToolTipUtils.java