組件渲染

您可以使用兩種方式實作組件渲染:完全以程式方式或使用 ANTLR Stringtemplate。嚴格來說,有一個簡單的 Function 渲染器介面,它接受 Context 作為輸入並輸出 AttributedString 的列表。這讓您可以在範本和程式碼之間做出選擇。

如果您不需要執行任何複雜的操作,或者只是想稍微修改現有的組件佈局,那麼範本是一個不錯的選擇。然後通過程式碼渲染可以讓您靈活地執行任何您需要的操作。

程式化渲染的方式是建立一個 Function

class StringInputCustomRenderer implements Function<StringInputContext, List<AttributedString>> {
	@Override
	public List<AttributedString> apply(StringInputContext context) {
		AttributedStringBuilder builder = new AttributedStringBuilder();
		builder.append(context.getName());
		builder.append(" ");
		if (context.getResultValue() != null) {
			builder.append(context.getResultValue());
		}
		else  {
			String input = context.getInput();
			if (StringUtils.hasText(input)) {
				builder.append(input);
			}
			else {
				builder.append("[Default " + context.getDefaultValue() + "]");
			}
		}
		return Arrays.asList(builder.toAttributedString());
	}
}

然後您可以將其掛鉤到組件

@ShellMethod(key = "component stringcustom", value = "String input", group = "Components")
public String stringInputCustom(boolean mask) {
	StringInput component = new StringInput(getTerminal(), "Enter value", "myvalue",
			new StringInputCustomRenderer());
	component.setResourceLoader(getResourceLoader());
	component.setTemplateExecutor(getTemplateExecutor());
	if (mask) {
		component.setMaskCharacter('*');
	}
	StringInputContext context = component.run(StringInputContext.empty());
	return "Got value " + context.getResultValue();
}

組件有自己的上下文,但通常從父組件類型共享某些功能。下表顯示了這些上下文變數

表 1. TextComponentContext 範本變數
描述

resultValue

組件渲染其結果後的值。

name

組件的名稱 — 即其標題。

message

組件可能設定的消息。

messageLevel

消息的級別 — INFOWARNERROR 之一。

hasMessageLevelInfo

如果級別為 INFO,則返回 true。否則,返回 false。

hasMessageLevelWarn

如果級別為 WARN,則返回 true。否則,返回 false。

hasMessageLevelError

如果級別為 ERROR,則返回 true。否則,返回 false。

input

原始使用者輸入。

表 2. SelectorComponentContext 範本變數
描述

name

組件的名稱 — 即其標題。

input

原始使用者輸入 — 主要用於篩選。

itemStates

項目狀態的完整列表。

itemStateView

項目狀態的可見列表。

isResult

如果上下文處於結果模式,則返回 true

cursorRow

選取器中目前的游標列。

表 3. ComponentContext 範本變數
描述

terminalWidth

終端機的寬度,類型為 Integer,如果未設定則預設為 NULL