元件渲染

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

© . This site is unofficial and not affiliated with VMware.