Skip to content

Commit

Permalink
Add select-option in Example, #592
Browse files Browse the repository at this point in the history
  • Loading branch information
mattirn committed Oct 23, 2020
1 parent ea98b90 commit 299d0e9
Showing 1 changed file with 90 additions and 11 deletions.
101 changes: 90 additions & 11 deletions builtins/src/test/java/org/jline/example/Example.java
Expand Up @@ -19,11 +19,10 @@
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;

import org.jline.builtins.Commands;
import org.jline.builtins.Completers;
import org.jline.builtins.*;
import org.jline.builtins.Completers.TreeCompleter;
import org.jline.builtins.Options.HelpException;
import org.jline.builtins.TTop;
import org.jline.keymap.BindingReader;
import org.jline.keymap.KeyMap;
import org.jline.reader.*;
import org.jline.reader.LineReader.Option;
Expand All @@ -32,19 +31,15 @@
import org.jline.reader.impl.LineReaderImpl;
import org.jline.reader.impl.completer.ArgumentCompleter;
import org.jline.reader.impl.completer.StringsCompleter;
import org.jline.terminal.Cursor;
import org.jline.terminal.MouseEvent;
import org.jline.terminal.Terminal;
import org.jline.terminal.TerminalBuilder;
import org.jline.utils.AttributedString;
import org.jline.utils.AttributedStringBuilder;
import org.jline.utils.AttributedStyle;
import org.jline.terminal.*;
import org.jline.utils.*;
import org.jline.utils.InfoCmp.Capability;
import org.jline.utils.Status;

import static java.time.temporal.ChronoField.HOUR_OF_DAY;
import static java.time.temporal.ChronoField.MINUTE_OF_HOUR;
import static org.jline.builtins.Completers.TreeCompleter.node;
import static org.jline.keymap.KeyMap.ctrl;
import static org.jline.keymap.KeyMap.key;


public class Example
Expand Down Expand Up @@ -95,6 +90,7 @@ public static void help() {
, " cls clear screen"
, " help list available commands"
, " exit exit from example app"
, " select select option"
, " set set lineReader variable"
, " sleep sleep 3 seconds"
, " testkey display key events"
Expand All @@ -107,6 +103,83 @@ public static void help() {

}

private static class OptionSelector {
private enum Operation {FORWARD_ONE_LINE, BACKWARD_ONE_LINE, EXIT}
private final Terminal terminal;
private final List<String> lines = new ArrayList<>();
private final Size size = new Size();
private final BindingReader bindingReader;

public OptionSelector(Terminal terminal, String title, Collection<String> options) {
this.terminal = terminal;
this.bindingReader = new BindingReader(terminal.reader());
lines.add(title);
lines.addAll(options);
}

private List<AttributedString> displayLines(int cursorRow) {
List<AttributedString> out = new ArrayList<>();
int i = 0;
for (String s : lines) {
if (i == cursorRow) {
out.add(new AttributedStringBuilder().append(s, AttributedStyle.INVERSE).toAttributedString());
} else {
out.add(new AttributedString(s));
}
i++;
}
return out;
}

private void bindKeys(KeyMap<Operation> map) {
map.bind(Operation.FORWARD_ONE_LINE, "e", ctrl('E'), key(terminal, Capability.key_down));
map.bind(Operation.BACKWARD_ONE_LINE, "y", ctrl('Y'), key(terminal, Capability.key_up));
map.bind(Operation.EXIT,"\r");
}

public String select() {
Display display = new Display(terminal, true);
Attributes attr = terminal.enterRawMode();
try {
terminal.puts(Capability.enter_ca_mode);
terminal.puts(Capability.keypad_xmit);
terminal.writer().flush();
size.copy(terminal.getSize());
display.clear();
display.reset();
int selectRow = 1;
KeyMap<Operation> keyMap = new KeyMap<>();
bindKeys(keyMap);
while (true) {
display.resize(size.getRows(), size.getColumns());
display.update(displayLines(selectRow), size.cursorPos(0, lines.get(0).length()));
Operation op = bindingReader.readBinding(keyMap);
switch(op) {
case FORWARD_ONE_LINE:
selectRow++;
if (selectRow > lines.size() - 1) {
selectRow = 1;
}
break;
case BACKWARD_ONE_LINE:
selectRow--;
if (selectRow < 1) {
selectRow = lines.size() - 1;
}
break;
case EXIT:
return lines.get(selectRow);
}
}
} finally {
terminal.setAttributes(attr);
terminal.puts(Capability.exit_ca_mode);
terminal.puts(Capability.keypad_local);
terminal.writer().flush();
}
}
}

public static void main(String[] args) throws IOException {
try {
String prompt = "prompt> ";
Expand Down Expand Up @@ -431,6 +504,12 @@ else if ("ttop".equals(pl.word())) {
else if ("help".equals(pl.word()) || "?".equals(pl.word())) {
help();
}
else if ("select".equals(pl.word())) {
OptionSelector selector = new OptionSelector(terminal, "Select number>"
, Arrays.asList("one", "two", "three", "four"));
String selected = selector.select();
System.out.println("You selected number " + selected);
}
}
catch (HelpException e) {
HelpException.highlight(e.getMessage(), HelpException.defaultStyle()).print(terminal);
Expand Down

0 comments on commit 299d0e9

Please sign in to comment.