try {
setTerminalToRaw();
- int selected = 0;
- String filter = "";
+ int selectedIndex = 0;
+ String filterString = "";
int lastTotalLines = 0;
- selected = updateDisplay(prompt, options, selected, filter, lastTotalLines);
- lastTotalLines = getCurrentTotalLines(options, filter);
-
while (true) {
+ selectedIndex = updateDisplay(prompt, options, selectedIndex, filterString, lastTotalLines);
+ lastTotalLines = getCurrentTotalLines(options, filterString);
+
int c = System.in.read();
// Handle Escape key or arrow keys
int c2 = System.in.read();
if (c1 == 91) { // [
if (c2 == 65) { // Up arrow (ESC [ A)
- selected = selected - 1;
+ selectedIndex = selectedIndex - 1;
} else if (c2 == 66) { // Down arrow (ESC [ B)
- selected = selected + 1;
+ selectedIndex = selectedIndex + 1;
}
- selected = updateDisplay(prompt, options, selected, filter, lastTotalLines);
- lastTotalLines = getCurrentTotalLines(options, filter);
}
} else {
// Esc key alone
return null;
}
}
+
// Handle Enter key
else if (c == 13 || c == 10) {
- List<String> filtered = filterOptions(options, filter.toString());
+ List<String> filtered = filterOptions(options, filterString.toString());
if (filtered.isEmpty()) {
return null;
}
- return filtered.get(selected);
+ return filtered.get(selectedIndex);
}
+
// Handle Backspace (8 or 127)
else if (c == 8 || c == 127) {
- if (filter.length() > 0) {
- filter = filter.substring(0, filter.length() - 1);
- selected = 0;
- selected = updateDisplay(prompt, options, selected, filter, lastTotalLines);
- lastTotalLines = getCurrentTotalLines(options, filter);
+ if (filterString.length() > 0) {
+ filterString = filterString.substring(0, filterString.length() - 1);
+ selectedIndex = 0;
}
}
+
// Handle printable ASCII characters
else if (c >= 32 && c <= 126) {
- filter = filter + Character.toString((char)c);
- selected = 0;
- selected = updateDisplay(prompt, options, selected, filter, lastTotalLines);
- lastTotalLines = getCurrentTotalLines(options, filter);
+ filterString = filterString + (char) c;
+ selectedIndex = 0;
}
}
} finally {