組件渲染
您可以使用兩種方式實作組件渲染:完全以程式方式或使用 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();
}
組件有自己的上下文,但通常從父組件類型共享某些功能。下表顯示了這些上下文變數
鍵 | 描述 |
---|---|
|
組件渲染其結果後的值。 |
|
組件的名稱 — 即其標題。 |
|
組件可能設定的消息。 |
|
消息的級別 — |
|
如果級別為 |
|
如果級別為 |
|
如果級別為 |
|
原始使用者輸入。 |
鍵 | 描述 |
---|---|
|
組件的名稱 — 即其標題。 |
|
原始使用者輸入 — 主要用於篩選。 |
|
項目狀態的完整列表。 |
|
項目狀態的可見列表。 |
|
如果上下文處於結果模式,則返回 |
|
選取器中目前的游標列。 |
鍵 | 描述 |
---|---|
|
終端機的寬度,類型為 Integer,如果未設定則預設為 NULL。 |