experimental 24-bit image protocol
[nikiroo-utils.git] / examples / JexerTilingWindowManager2.java
index cc23aa76f0840309361e879fa40d7916eecb5f69..2a1512d6ec7af63edb12d10c9fed309d093eef32 100644 (file)
@@ -2,11 +2,9 @@ import jexer.TAction;
 import jexer.TApplication;
 import jexer.TDesktop;
 import jexer.TTerminalWidget;
+import jexer.TSplitPane;
 import jexer.TWidget;
-import jexer.event.TKeypressEvent;
 import jexer.event.TMenuEvent;
-import jexer.event.TMouseEvent;
-import jexer.event.TResizeEvent;
 import jexer.menu.TMenu;
 
 /**
@@ -29,12 +27,16 @@ public class JexerTilingWindowManager2 extends TApplication {
      * Menu item: split the terminal horizontally.
      */
     private static final int MENU_SPLIT_HORIZONTAL = 2001;
+    /**
+     * Menu item: recreate the root terminal.
+     */
+    private static final int MENU_RESPAWN_ROOT = 2002;
 
     /**
      * Handle to the root widget.
      */
     private TWidget root = null;
-    
+
     /**
      * Main entry point.
      */
@@ -54,7 +56,7 @@ public class JexerTilingWindowManager2 extends TApplication {
      * Public constructor chooses the ECMA-48 / Xterm backend.
      */
     public JexerTilingWindowManager2() throws Exception {
-        super(BackendType.SWING);
+        super(BackendType.XTERM);
 
         // The stock tool menu has items for redrawing the screen, opening
         // images, and (when using the Swing backend) setting the font.
@@ -66,29 +68,32 @@ public class JexerTilingWindowManager2 extends TApplication {
         // New commands for this example: split vertical and horizontal.
         tileMenu.addItem(MENU_SPLIT_VERTICAL, "&Vertical Split");
         tileMenu.addItem(MENU_SPLIT_HORIZONTAL, "&Horizontal Split");
+        tileMenu.addItem(MENU_RESPAWN_ROOT, "&Respawn Root Terminal");
 
-        // Stock commands: a new shell with resizable window, previous, next,
-        // close, and exit program.
-        tileMenu.addItem(TMenu.MID_SHELL, "&Floating");
+        // Stock commands: a new shell with resizable window, and exit
+        // program.
         tileMenu.addSeparator();
-        tileMenu.addDefaultItem(TMenu.MID_WINDOW_PREVIOUS);
-        tileMenu.addDefaultItem(TMenu.MID_WINDOW_NEXT);
-        tileMenu.addDefaultItem(TMenu.MID_WINDOW_CLOSE);
+        tileMenu.addItem(TMenu.MID_SHELL, "&New Windowed Terminal");
         tileMenu.addSeparator();
         tileMenu.addDefaultItem(TMenu.MID_EXIT);
 
-        // Spin up the root terminal
-        root = new TTerminalWidget(getDesktop(), 0, 0,
-            getDesktop().getWidth(), getDesktop().getHeight(),
-            new TAction() {
-                public void DO() {
-                    // TODO: if root's parent is TSplitPane, call
-                    // TSplitPane.removeSplit(TWidget).
-                    if (root != null) {
-                        root.remove();
-                    }
+        // TTerminalWidget can request the text-block mouse pointer be
+        // suppressed, but the default TDesktop will ignore it.  Let's set a
+        // new TDesktop to pass that mouse pointer visibility option to
+        // TApplication.
+        setDesktop(new TDesktop(this) {
+            @Override
+            public boolean hasHiddenMouse() {
+                TWidget active = getActiveChild();
+                if (active instanceof TTerminalWidget) {
+                    return ((TTerminalWidget) active).hasHiddenMouse();
                 }
-            });
+                return false;
+            }
+        });
+
+        // Spin up the root terminal
+        createRootTerminal();
     }
 
     /**
@@ -96,30 +101,75 @@ public class JexerTilingWindowManager2 extends TApplication {
      */
     @Override
     protected boolean onMenu(TMenuEvent event) {
-        if (event.getId() == MENU_SPLIT_VERTICAL) {
-            splitVertical();
+        TWidget active = getDesktop().getActiveChild();
+        TSplitPane split = null;
+
+        switch (event.getId()) {
+        case MENU_RESPAWN_ROOT:
+            assert (root == null);
+            createRootTerminal();
             return true;
-        }
-        if (event.getId() == MENU_SPLIT_HORIZONTAL) {
-            splitHorizontal();
+
+        case MENU_SPLIT_VERTICAL:
+            if (root == null) {
+                assert (getDesktop().getActiveChild() == null);
+                createRootTerminal();
+                return true;
+            }
+            split = active.splitVertical(false, createTerminal());
+            if (active == root) {
+                root = split;
+            }
+            return true;
+
+        case MENU_SPLIT_HORIZONTAL:
+            if (root == null) {
+                assert (getDesktop().getActiveChild() == null);
+                createRootTerminal();
+                return true;
+            }
+            split = active.splitHorizontal(false, createTerminal());
+            if (active == root) {
+                root = split;
+            }
             return true;
+
+        default:
+            return super.onMenu(event);
         }
 
-        return super.onMenu(event);
     }
 
     /**
-     * Perform the vertical split.
+     * Create the root terminal.
      */
-    private void splitVertical() {
-        // TODO
+    private void createRootTerminal() {
+        assert (root == null);
+        disableMenuItem(MENU_RESPAWN_ROOT);
+        root = createTerminal();
     }
 
     /**
-     * Perform the horizontal split.
+     * Create a new terminal.
+     *
+     * @return the new terminal
      */
-    private void splitHorizontal() {
-        // TODO
+    private TWidget createTerminal() {
+        return new TTerminalWidget(getDesktop(), 0, 0,
+            getDesktop().getWidth(), getDesktop().getHeight(),
+            new TAction() {
+                public void DO() {
+                    if (source.getParent() instanceof TSplitPane) {
+                        ((TSplitPane) source.getParent()).removeSplit(source,
+                            true);
+                    } else {
+                        source.getApplication().enableMenuItem(
+                                MENU_RESPAWN_ROOT);
+                        source.remove();
+                        root = null;
+                    }
+                }
+            });
     }
 
 }