import static jexer.TKeypress.*;
/**
- * TTerminalWindow exposes a ECMA-48 / ANSI X3.64 style terminal in a widget.
+ * TTerminalWidget exposes a ECMA-48 / ANSI X3.64 style terminal in a widget.
*/
public class TTerminalWidget extends TScrollableWidget
implements DisplayListener {
*/
private String title = "";
+ /**
+ * Action to perform when the terminal exits.
+ */
+ private TAction closeAction = null;
+
// ------------------------------------------------------------------------
// Constructors -----------------------------------------------------------
// ------------------------------------------------------------------------
* @param y row relative to parent
* @param commandLine the command line to execute
*/
- public TTerminalWidget(final TWidget parent, final int x,
- final int y, final String commandLine) {
+ public TTerminalWidget(final TWidget parent, final int x, final int y,
+ final String commandLine) {
this(parent, x, y, commandLine.split("\\s+"));
}
* @param y row relative to parent
* @param command the command line to execute
*/
- public TTerminalWidget(final TWidget parent, final int x,
- final int y, final String [] command) {
+ public TTerminalWidget(final TWidget parent, final int x, final int y,
+ final String [] command) {
+
+ this(parent, x, y, command, null);
+ }
+
+ /**
+ * Public constructor spawns a custom command line.
+ *
+ * @param parent parent widget
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param command the command line to execute
+ * @param closeAction action to perform when the shell sxits
+ */
+ public TTerminalWidget(final TWidget parent, final int x, final int y,
+ final String [] command, final TAction closeAction) {
+
+ this(parent, x, y, 80, 24, command, closeAction);
+ }
+
+ /**
+ * Public constructor spawns a custom command line.
+ *
+ * @param parent parent widget
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param width width of widget
+ * @param height height of widget
+ * @param command the command line to execute
+ * @param closeAction action to perform when the shell sxits
+ */
+ public TTerminalWidget(final TWidget parent, final int x, final int y,
+ final int width, final int height, final String [] command,
+ final TAction closeAction) {
+
+ super(parent, x, y, width, height);
- super(parent, x, y, 80, 24);
+ this.closeAction = closeAction;
String [] fullCommand;
* @param y row relative to parent
*/
public TTerminalWidget(final TWidget parent, final int x, final int y) {
+ this(parent, x, y, (TAction) null);
+ }
+
+ /**
+ * Public constructor spawns a shell.
+ *
+ * @param parent parent widget
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param closeAction action to perform when the shell sxits
+ */
+ public TTerminalWidget(final TWidget parent, final int x, final int y,
+ final TAction closeAction) {
+
+ this(parent, x, y, 80, 24, closeAction);
+ }
+
+ /**
+ * Public constructor spawns a shell.
+ *
+ * @param parent parent widget
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param width width of widget
+ * @param height height of widget
+ * @param closeAction action to perform when the shell sxits
+ */
+ public TTerminalWidget(final TWidget parent, final int x, final int y,
+ final int width, final int height, final TAction closeAction) {
+
+ super(parent, x, y, width, height);
- super(parent, x, y, 80, 24);
+ this.closeAction = closeAction;
if (System.getProperty("jexer.TTerminal.shell") != null) {
String shell = System.getProperty("jexer.TTerminal.shell");
@Override
public void draw() {
int width = getDisplayWidth();
+
boolean syncEmulator = false;
if ((System.currentTimeMillis() - lastUpdateTime >= 25)
&& (dirty == true)
dirty = false;
}
- // Draw the box using my superclass
- super.draw();
-
// Put together the visible rows
int visibleHeight = getHeight();
int visibleBottom = scrollback.size() + display.size()
}
/**
- * Handle window close.
+ * Handle widget close.
*/
@Override
public void close() {
*/
@Override
public void onResize(final TResizeEvent resize) {
+ // Let TWidget set my size.
+ super.onResize(resize);
// Synchronize against the emulator so we don't stomp on its reader
// thread.
}
/**
- * Returns true if this window does not want the application-wide mouse
+ * Returns true if this widget does not want the application-wide mouse
* cursor drawn over it.
*
- * @return true if this window does not want the application-wide mouse
+ * @return true if this widget does not want the application-wide mouse
* cursor drawn over it
*/
public boolean hasHiddenMouse() {
* Hook for subclasses to be notified of the shell termination.
*/
public void onShellExit() {
- if (getParent() instanceof TTerminalWindow) {
- ((TTerminalWindow) getParent()).onShellExit();
+ TApplication app = getApplication();
+ if (app != null) {
+ app.invokeLater(new Runnable() {
+ public void run() {
+ if (closeAction != null) {
+ closeAction.DO(TTerminalWidget.this);
+ }
+ if (getApplication() != null) {
+ getApplication().postEvent(new TMenuEvent(
+ TMenu.MID_REPAINT));
+ }
+ }
+ });
}
- getApplication().postEvent(new TMenuEvent(TMenu.MID_REPAINT));
}
/**