コンポーネントのレンダリング
コンポーネントのレンダリングは、完全にプログラムで行う方法と 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();
}
コンポーネントには独自のコンテキストがありますが、通常は親コンポーネント型の一部の機能を共有します。次の表に、これらのコンテキスト変数を示します。
キー | 説明 |
---|---|
| コンポーネントが結果をレンダリングした後の値。 |
| コンポーネントの名前、つまりそのタイトル。 |
| コンポーネントに設定できるメッセージ。 |
| メッセージのレベル— |
| レベルが |
| レベルが |
| レベルが |
| 生のユーザー入力。 |
キー | 説明 |
---|---|
| コンポーネントの名前、つまりそのタイトル。 |
| 生のユーザー入力 — 主にフィルタリングに使用されます。 |
| 項目状態の完全なリスト。 |
| アイテムの状態の表示リスト。 |
| コンテキストが結果モードの場合、 |
| セレクターの現在のカーソル行。 |
キー | 説明 |
---|---|
| ターミナルの幅、型は整数で、設定されていない場合はデフォルトで NULL になります。 |