Merge branch 'subtree'
[fanfix.git] / src / jexer / TTerminalWindow.java
index 0b653554e0bf8aaee31932f2f6ff84645664e39f..754b7a512d6f7581216a78b76c2a8a7be3838dcb 100644 (file)
  */
 package jexer;
 
-import java.awt.Font;
-import java.awt.FontMetrics;
-import java.awt.Graphics2D;
-import java.awt.image.BufferedImage;
-
-import java.io.InputStream;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 import java.util.ResourceBundle;
 
-import jexer.backend.ECMA48Terminal;
-import jexer.backend.GlyphMaker;
-import jexer.backend.MultiScreen;
-import jexer.backend.SwingTerminal;
-import jexer.bits.Cell;
-import jexer.bits.CellAttributes;
+import jexer.menu.TMenu;
 import jexer.event.TKeypressEvent;
 import jexer.event.TMenuEvent;
 import jexer.event.TMouseEvent;
 import jexer.event.TResizeEvent;
-import jexer.menu.TMenu;
-import jexer.tterminal.DisplayLine;
-import jexer.tterminal.DisplayListener;
-import jexer.tterminal.ECMA48;
+import static jexer.TCommand.*;
 import static jexer.TKeypress.*;
 
 /**
@@ -163,10 +142,14 @@ public class TTerminalWindow extends TScrollableWindow {
         addShortcutKeys();
 
         // Add shortcut text
-        newStatusBar(i18n.getString("statusBarRunning"));
+        TStatusBar statusBar = newStatusBar(i18n.getString("statusBarRunning"));
+        statusBar.addShortcutKeypress(kbF1, cmHelp,
+            i18n.getString("statusBarHelp"));
+        statusBar.addShortcutKeypress(kbF10, cmMenu,
+            i18n.getString("statusBarMenu"));
 
         // Spin it up
-        terminal = new TTerminalWidget(this, 0, 0, new TAction() {
+        terminal = new TTerminalWidget(this, 0, 0, command, new TAction() {
             public void DO() {
                 onShellExit();
             }
@@ -215,7 +198,11 @@ public class TTerminalWindow extends TScrollableWindow {
         addShortcutKeys();
 
         // Add shortcut text
-        newStatusBar(i18n.getString("statusBarRunning"));
+        TStatusBar statusBar = newStatusBar(i18n.getString("statusBarRunning"));
+        statusBar.addShortcutKeypress(kbF1, cmHelp,
+            i18n.getString("statusBarHelp"));
+        statusBar.addShortcutKeypress(kbF10, cmMenu,
+            i18n.getString("statusBarMenu"));
 
         // Spin it up
         terminal = new TTerminalWidget(this, 0, 0, new TAction() {
@@ -234,7 +221,9 @@ public class TTerminalWindow extends TScrollableWindow {
      */
     @Override
     public void draw() {
-        setTitle(terminal.getTitle());
+        if (terminal != null) {
+            setTitle(terminal.getTitle());
+        }
         reflowData();
         super.draw();
     }
@@ -247,8 +236,10 @@ public class TTerminalWindow extends TScrollableWindow {
     @Override
     public void onResize(final TResizeEvent resize) {
         if (resize.getType() == TResizeEvent.Type.WIDGET) {
-            terminal.onResize(new TResizeEvent(TResizeEvent.Type.WIDGET,
-                    getWidth() - 2, getHeight() - 2));
+            if (terminal != null) {
+                terminal.onResize(new TResizeEvent(TResizeEvent.Type.WIDGET,
+                        getWidth() - 2, getHeight() - 2));
+            }
 
             // Resize the scroll bars
             reflowData();
@@ -263,11 +254,13 @@ public class TTerminalWindow extends TScrollableWindow {
     @Override
     public void reflowData() {
         // Vertical scrollbar
-        terminal.reflowData();
-        setTopValue(terminal.getTopValue());
-        setBottomValue(terminal.getBottomValue());
-        setVerticalBigChange(terminal.getVerticalBigChange());
-        setVerticalValue(terminal.getVerticalValue());
+        if (terminal != null) {
+            terminal.reflowData();
+            setTopValue(terminal.getTopValue());
+            setBottomValue(terminal.getBottomValue());
+            setVerticalBigChange(terminal.getVerticalBigChange());
+            setVerticalValue(terminal.getVerticalValue());
+        }
     }
 
     /**
@@ -277,7 +270,10 @@ public class TTerminalWindow extends TScrollableWindow {
      */
     @Override
     public void onKeypress(final TKeypressEvent keypress) {
-        if (terminal.isReading()) {
+        if ((terminal != null)
+            && (terminal.isReading())
+            && (!inKeyboardResize)
+        ) {
             terminal.onKeypress(keypress);
         } else {
             super.onKeypress(keypress);
@@ -317,7 +313,9 @@ public class TTerminalWindow extends TScrollableWindow {
 
         if (mouse.isMouse1() && mouseOnVerticalScroller(mouse)) {
             // Clicked on vertical scrollbar
-            terminal.setVerticalValue(getVerticalValue());
+            if (terminal != null) {
+                terminal.setVerticalValue(getVerticalValue());
+            }
         }
     }
 
@@ -338,10 +336,22 @@ public class TTerminalWindow extends TScrollableWindow {
 
         if (mouse.isMouse1() && mouseOnVerticalScroller(mouse)) {
             // Clicked/dragged on vertical scrollbar
-            terminal.setVerticalValue(getVerticalValue());
+            if (terminal != null) {
+                terminal.setVerticalValue(getVerticalValue());
+            }
         }
     }
 
+    /**
+     * Get this window's help topic to load.
+     *
+     * @return the topic name
+     */
+    @Override
+    public String getHelpTopic() {
+        return "Terminal Window";
+    }
+
     // ------------------------------------------------------------------------
     // TTerminalWindow --------------------------------------------------------
     // ------------------------------------------------------------------------
@@ -355,7 +365,10 @@ public class TTerminalWindow extends TScrollableWindow {
      */
     @Override
     public boolean hasHiddenMouse() {
-        return terminal.hasHiddenMouse();
+        if (terminal != null) {
+            return terminal.hasHiddenMouse();
+        }
+        return false;
     }
 
     /**
@@ -439,4 +452,29 @@ public class TTerminalWindow extends TScrollableWindow {
         getApplication().postEvent(new TMenuEvent(TMenu.MID_REPAINT));
     }
 
+    /**
+     * Wait for a period of time to get output from the launched process.
+     *
+     * @param millis millis to wait for, or 0 to wait forever
+     * @return true if the launched process has emitted something
+     */
+    public boolean waitForOutput(final int millis) {
+        if (terminal == null) {
+            return false;
+        }
+        return terminal.waitForOutput(millis);
+    }
+
+    /**
+     * Get the exit value for the emulator.
+     *
+     * @return exit value
+     */
+    public int getExitValue() {
+        if (terminal == null) {
+            return -1;
+        }
+        return terminal.getExitValue();
+    }
+
 }