元件渲染

您可以透過兩種方式實現元件渲染:完全程式設計式或使用 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