return openTerminal(x, y, TWindow.RESIZABLE, commandLine);
}
+ /**
+ * Convenience function to open a terminal window and execute a custom
+ * command line inside it.
+ *
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param flags mask of CENTERED, MODAL, or RESIZABLE
+ * @param command the command line to execute
+ * @return the terminal new window
+ */
+ public final TTerminalWindow openTerminal(final int x, final int y,
+ final int flags, final String [] command) {
+
+ return new TTerminalWindow(this, x, y, flags, command);
+ }
+
/**
* Convenience function to open a terminal window and execute a custom
* command line inside it.
public final TTerminalWindow openTerminal(final int x, final int y,
final int flags, final String commandLine) {
- return new TTerminalWindow(this, x, y, flags, commandLine);
+ return new TTerminalWindow(this, x, y, flags, commandLine.split("\\s"));
}
/**
addShortcutKeypress(kbAltZ);
}
+ /**
+ * Convert a string array to a whitespace-separated string.
+ *
+ * @param array the string array
+ * @return a single string
+ */
+ private String stringArrayToString(final String [] array) {
+ StringBuilder sb = new StringBuilder(array[0].length());
+ for (int i = 0; i < array.length; i++) {
+ sb.append(array[i]);
+ if (i < array.length - 1) {
+ sb.append(' ');
+ }
+ }
+ return sb.toString();
+ }
+
/**
* Spawn the shell.
*
- * @param commandLine the command line to execute
+ * @param command the command line to execute
*/
- private void spawnShell(final String commandLine) {
+ private void spawnShell(final String [] command) {
+
+ /*
+ System.err.printf("spawnShell(): '%s'\n",
+ stringArrayToString(command));
+ */
vScroller = new TVScroller(this, getWidth() - 2, 0, getHeight() - 2);
setBottomValue(0);
ECMA48.DeviceType deviceType = ECMA48.DeviceType.XTERM;
try {
- String [] command = commandLine.split("\\s");
ProcessBuilder pb = new ProcessBuilder(command);
Map<String, String> env = pb.environment();
env.put("TERM", ECMA48.deviceTypeTerm(deviceType));
public TTerminalWindow(final TApplication application, final int x,
final int y, final String commandLine) {
- this(application, x, y, RESIZABLE, commandLine);
+ this(application, x, y, RESIZABLE, commandLine.split("\\s"));
}
/**
* @param x column relative to parent
* @param y row relative to parent
* @param flags mask of CENTERED, MODAL, or RESIZABLE
- * @param commandLine the command line to execute
+ * @param command the command line to execute
*/
public TTerminalWindow(final TApplication application, final int x,
- final int y, final int flags, final String commandLine) {
+ final int y, final int flags, final String [] command) {
super(application, i18n.getString("windowTitle"), x, y,
80 + 2, 24 + 2, flags);
- String cmdShellWindows = "cmd.exe /c" + commandLine;
- String cmdShellGNU = "script -fqe /dev/null -c " + commandLine;
- String cmdShellBSD = "script -q -F /dev/null -c " + commandLine;
- String cmdShellPtypipe = "ptypipe " + commandLine;
+ String [] fullCommand;
// Spawn a shell and pass its I/O to the other constructor.
if ((System.getProperty("jexer.TTerminal.ptypipe") != null)
equals("true"))
) {
ptypipe = true;
- spawnShell(cmdShellPtypipe);
+ fullCommand = new String[command.length + 1];
+ fullCommand[0] = "ptypipe";
+ System.arraycopy(command, 0, fullCommand, 1, command.length);
} else if (System.getProperty("os.name").startsWith("Windows")) {
- spawnShell(cmdShellWindows);
+ fullCommand = new String[3];
+ fullCommand[0] = "cmd";
+ fullCommand[1] = "/c";
+ fullCommand[2] = stringArrayToString(command);
} else if (System.getProperty("os.name").startsWith("Mac")) {
- spawnShell(cmdShellBSD);
- } else if (System.getProperty("os.name").startsWith("Linux")) {
- spawnShell(cmdShellGNU);
+ fullCommand = new String[6];
+ fullCommand[0] = "script";
+ fullCommand[1] = "-q";
+ fullCommand[2] = "-F";
+ fullCommand[3] = "/dev/null";
+ fullCommand[4] = "-c";
+ fullCommand[5] = stringArrayToString(command);
} else {
- // When all else fails, assume GNU.
- spawnShell(cmdShellGNU);
+ // Default: behave like Linux
+ fullCommand = new String[5];
+ fullCommand[0] = "script";
+ fullCommand[1] = "-fqe";
+ fullCommand[2] = "/dev/null";
+ fullCommand[3] = "-c";
+ fullCommand[4] = stringArrayToString(command);
}
+ spawnShell(fullCommand);
}
/**
equals("true"))
) {
ptypipe = true;
- spawnShell(cmdShellPtypipe);
+ spawnShell(cmdShellPtypipe.split("\\s"));
} else if (System.getProperty("os.name").startsWith("Windows")) {
- spawnShell(cmdShellWindows);
+ spawnShell(cmdShellWindows.split("\\s"));
} else if (System.getProperty("os.name").startsWith("Mac")) {
- spawnShell(cmdShellBSD);
+ spawnShell(cmdShellBSD.split("\\s"));
} else if (System.getProperty("os.name").startsWith("Linux")) {
- spawnShell(cmdShellGNU);
+ spawnShell(cmdShellGNU.split("\\s"));
} else {
// When all else fails, assume GNU.
- spawnShell(cmdShellGNU);
+ spawnShell(cmdShellGNU.split("\\s"));
}
}
load(new FileReader(filename));
}
+ /**
+ * Set a color based on a text string. Color text string is of the form:
+ * <code>[ bold ] [ blink ] { foreground on background }</code>
+ *
+ * @param key the color key string
+ * @param text the text string
+ */
+ public void setColorFromString(final String key, final String text) {
+ boolean bold = false;
+ boolean blink = false;
+ String foreColor;
+ String backColor;
+ String token;
+
+ StringTokenizer tokenizer = new StringTokenizer(text);
+ token = tokenizer.nextToken();
+ while (token.equals("bold") || token.equals("blink")) {
+ if (token.equals("bold")) {
+ bold = true;
+ token = tokenizer.nextToken();
+ }
+ if (token.equals("blink")) {
+ blink = true;
+ token = tokenizer.nextToken();
+ }
+ }
+
+ // What's left is "blah on blah"
+ foreColor = token.toLowerCase();
+
+ if (!tokenizer.nextToken().toLowerCase().equals("on")) {
+ // Invalid line.
+ return;
+ }
+ backColor = tokenizer.nextToken().toLowerCase();
+
+ CellAttributes color = new CellAttributes();
+ if (bold) {
+ color.setBold(true);
+ }
+ if (blink) {
+ color.setBlink(true);
+ }
+ color.setForeColor(Color.getColor(foreColor));
+ color.setBackColor(Color.getColor(backColor));
+ colors.put(key, color);
+ }
+
/**
* Read color theme mappings from a Reader. The reader is closed at the
* end.
BufferedReader bufferedReader = new BufferedReader(reader);
String line = bufferedReader.readLine();
for (; line != null; line = bufferedReader.readLine()) {
- String key;
- boolean bold = false;
- boolean blink = false;
- String foreColor;
- String backColor;
- String token;
-
// Look for lines that resemble:
// "key = blah on blah"
// "key = bold blah on blah"
// "key = blink bold blah on blah"
// "key = bold blink blah on blah"
// "key = blink blah on blah"
- StringTokenizer tokenizer = new StringTokenizer(line);
- key = tokenizer.nextToken();
- if (!tokenizer.nextToken().equals("=")) {
- // Skip this line
+ if (line.indexOf('=') == -1) {
+ // Invalid line.
continue;
}
- token = tokenizer.nextToken();
- while (token.equals("bold") || token.equals("blink")) {
- if (token.equals("bold")) {
- bold = true;
- token = tokenizer.nextToken();
- }
- if (token.equals("blink")) {
- blink = true;
- token = tokenizer.nextToken();
- }
- }
-
- // What's left is "blah on blah" or "blah"
- foreColor = token.toLowerCase();
-
- if (!tokenizer.nextToken().toLowerCase().equals("on")) {
- // Skip this line
- continue;
- }
- backColor = tokenizer.nextToken().toLowerCase();
-
- CellAttributes color = new CellAttributes();
- if (bold) {
- color.setBold(true);
- }
- if (blink) {
- color.setBlink(true);
- }
- color.setForeColor(Color.getColor(foreColor));
- color.setBackColor(Color.getColor(backColor));
- colors.put(key, color);
+ String key = line.substring(0, line.indexOf(':')).trim();
+ String text = line.substring(line.indexOf(':') + 1);
+ setColorFromString(key, text);
}
// All done.
bufferedReader.close();
}
+ /**
+ * Make human-readable description of this Cell.
+ *
+ * @return displayable String
+ */
+ @Override
+ public String toString() {
+ return colors.toString();
+ }
+
}