コンポーネントのレンダリング

コンポーネントのレンダリングは、完全にプログラムで行う方法と ANTLR Stringtemplate を使用する方法のいずれかで実装できます。厳密に言えば、入力として Context を受け取り、AttributedString のリストを出力する単純な Function レンダラーインターフェースがあります。これにより、テンプレートとコードのどちらかを選択できます。

複雑なことをする必要がない場合や、既存のコンポーネントのレイアウトを少しだけ変更したい場合は、テンプレートを使用することをお勧めします。コードを介してレンダリングすると、必要なことを柔軟に行うことができます。

プログラムでレンダリングする方法は、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

メッセージのレベル— INFOWARN、または ERROR のいずれか。

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

ターミナルの幅、型は整数で、設定されていない場合はデフォルトで NULL になります。