#51 wip
authorKevin Lamonte <kevin.lamonte@gmail.com>
Wed, 21 Aug 2019 01:00:12 +0000 (20:00 -0500)
committerKevin Lamonte <kevin.lamonte@gmail.com>
Wed, 21 Aug 2019 01:00:12 +0000 (20:00 -0500)
14 files changed:
examples/JexerTilingWindowManager2.java
src/jexer/TAction.java
src/jexer/TButton.java
src/jexer/TCalendar.java
src/jexer/TComboBox.java
src/jexer/TField.java
src/jexer/TImage.java
src/jexer/TLabel.java
src/jexer/TList.java
src/jexer/TSpinner.java
src/jexer/TSplitPane.java
src/jexer/TTerminalWidget.java
src/jexer/TWidget.java
src/jexer/ttree/TTreeView.java

index bef3637119b7d676ce2ecd27dbcc406979d3e074..cb7f0d0263659a4be295d7c0397f3836ce0d3098 100644 (file)
@@ -97,9 +97,16 @@ public class JexerTilingWindowManager2 extends TApplication {
                     active.getY(), active.getWidth(), active.getHeight(),
                     new TAction() {
                         public void DO() {
-                            // TODO
+                            if (source.getParent() instanceof TSplitPane) {
+                                ((TSplitPane) source.getParent()).removeSplit(source, true);
+                            } else if (source == root) {
+                                assert (root != null);
+                                root.remove();
+                                root = null;
+                            }
                         }
                     }));
+
             if (active == root) {
                 root = split;
             }
@@ -116,7 +123,13 @@ public class JexerTilingWindowManager2 extends TApplication {
                     active.getY(), active.getWidth(), active.getHeight(),
                     new TAction() {
                         public void DO() {
-                            // TODO
+                            if (source.getParent() instanceof TSplitPane) {
+                                ((TSplitPane) source.getParent()).removeSplit(source, true);
+                            } else if (source == root) {
+                                assert (root != null);
+                                root.remove();
+                                root = null;
+                            }
                         }
                     }));
             return true;
@@ -134,10 +147,9 @@ public class JexerTilingWindowManager2 extends TApplication {
             getDesktop().getWidth(), getDesktop().getHeight(),
             new TAction() {
                 public void DO() {
-                    TWidget target = (TWidget) data;
-                    if (target.getParent() instanceof TPanel) {
-                        ((TSplitPane) target.getParent().getParent()).removeSplit(target, true);
-                    } else {
+                    if (source.getParent() instanceof TSplitPane) {
+                        ((TSplitPane) source.getParent()).removeSplit(source, true);
+                    } else if (source == root) {
                         assert (root != null);
                         root.remove();
                         root = null;
index bce00646d54f31324db4eb34c4f48c3f5261386e..5343143cc223ebfd3fa8702c7ddb3959d1c7b362 100644 (file)
@@ -36,11 +36,38 @@ package jexer;
 public abstract class TAction {
 
     /**
-     * An optional bit of data associated with this action.  Widgets that use
-     * this field are responsible for setting it.
+     * The widget that called this action's DO() method.  Note that this
+     * field could be null, for example if executed as a timer action.
+     */
+    public TWidget source;
+
+    /**
+     * An optional bit of data associated with this action.
      */
     public Object data;
 
+    /**
+     * Call DO() with source widget set.
+     *
+     * @param source the source widget
+     */
+    public final void DO(final TWidget source) {
+        this.source = source;
+        DO();
+    }
+
+    /**
+     * Call DO() with source widget and data set.
+     *
+     * @param source the source widget
+     * @param data the data
+     */
+    public final void DO(final TWidget source, final Object data) {
+        this.source = source;
+        this.data = data;
+        DO();
+    }
+
     /**
      * Various classes will call DO() when they are clicked/selected.
      */
index 3938c737aff1f18036e17fd7ad93e307c9984a3f..d86fa4400d16b51dc3be15dbaa38f5421ffdc7b5 100644 (file)
@@ -308,7 +308,7 @@ public class TButton extends TWidget {
      */
     public void dispatch() {
         if (action != null) {
-            action.DO();
+            action.DO(this);
             inButtonPress = false;
         }
     }
index 580fb9f1c841d41189801e4b0dd71aa2ee78f624..c2005ccb60634279c8a3e5eb064cb59dc083ea04 100644 (file)
@@ -161,7 +161,7 @@ public class TCalendar extends TWidget {
     @Override
     public void onMouseDoubleClick(final TMouseEvent mouse) {
         if (updateAction != null) {
-            updateAction.DO();
+            updateAction.DO(this);
         }
     }
 
@@ -184,7 +184,7 @@ public class TCalendar extends TWidget {
             increment = 1;
         } else if (keypress.equals(kbEnter)) {
             if (updateAction != null) {
-                updateAction.DO();
+                updateAction.DO(this);
             }
             return;
         } else {
index 2d1b2c07539f1755c88429b4764391a1ee3bde21..b64dbde058ad006d4a5d80fd83e9ddd4303e8ba2 100644 (file)
@@ -119,7 +119,7 @@ public class TComboBox extends TWidget {
                         TComboBox.this.activate(field);
                     }
                     if (updateAction != null) {
-                        updateAction.DO();
+                        updateAction.DO(TComboBox.this);
                     }
                 }
             }
index 1a706b16db6c2a33a928cc4d543497ac09764cec..7c8b5bc415e62882a24941734da6ac213c706b75 100644 (file)
@@ -479,11 +479,11 @@ public class TField extends TWidget {
     protected void dispatch(final boolean enter) {
         if (enter) {
             if (enterAction != null) {
-                enterAction.DO();
+                enterAction.DO(this);
             }
         } else {
             if (updateAction != null) {
-                updateAction.DO();
+                updateAction.DO(this);
             }
         }
     }
index 3aaca2f832cf41b74a8a9c60600c7cdad4f96a45..cd0ce96e0baf4523c64cb45527c01cbc4d1e1443 100644 (file)
@@ -216,7 +216,7 @@ public class TImage extends TWidget {
     @Override
     public void onMouseDown(final TMouseEvent mouse) {
         if (clickAction != null) {
-            clickAction.DO();
+            clickAction.DO(this);
             return;
         }
     }
index 0c62250ec79b3cd3cfa6af0307c34f7caeac8b86..f34a533eb8ffb44c1d2aa9ebefc2a2e925a89a66 100644 (file)
@@ -257,7 +257,7 @@ public class TLabel extends TWidget {
      */
     public void dispatch() {
         if (action != null) {
-            action.DO();
+            action.DO(this);
         }
     }
 
index 253e40972a49ab133211bdff156708163b08eec8..38a994c8215bbba2a53e3c85d0b15bd46c099146 100644 (file)
@@ -507,7 +507,7 @@ public class TList extends TScrollableWidget {
         assert (selectedString >= 0);
         assert (selectedString < strings.size());
         if (enterAction != null) {
-            enterAction.DO();
+            enterAction.DO(this);
         }
     }
 
@@ -518,7 +518,7 @@ public class TList extends TScrollableWidget {
         assert (selectedString >= 0);
         assert (selectedString < strings.size());
         if (moveAction != null) {
-            moveAction.DO();
+            moveAction.DO(this);
         }
     }
 
@@ -529,7 +529,7 @@ public class TList extends TScrollableWidget {
         assert (selectedString >= 0);
         assert (selectedString < strings.size());
         if (singleClickAction != null) {
-            singleClickAction.DO();
+            singleClickAction.DO(this);
         }
     }
 
index 474848698ee7be4c6f08911ef69561dc3793964e..61fac65983ab4ddb9b106f14710747c00795ec62 100644 (file)
@@ -175,7 +175,7 @@ public class TSpinner extends TWidget {
      */
     private void up() {
         if (upAction != null) {
-            upAction.DO();
+            upAction.DO(this);
         }
     }
 
@@ -184,7 +184,7 @@ public class TSpinner extends TWidget {
      */
     private void down() {
         if (downAction != null) {
-            downAction.DO();
+            downAction.DO(this);
         }
     }
 
index 277f080e22af099cf0bb576eb09dd4637027e4c2..b63ea1fbd06fd8805b3c7e3e27d654f59a3dfaf3 100644 (file)
@@ -275,7 +275,9 @@ public class TSplitPane extends TWidget {
                 "horizontal split pane");
         }
         if (left == null) {
-            remove(this.left);
+            if (this.left != null) {
+                remove(this.left);
+            }
             this.left = null;
             return;
         }
@@ -305,7 +307,9 @@ public class TSplitPane extends TWidget {
                 "horizontal split pane");
         }
         if (right == null) {
-            remove(this.right);
+            if (this.right != null) {
+                remove(this.right);
+            }
             this.right = null;
             return;
         }
@@ -335,7 +339,9 @@ public class TSplitPane extends TWidget {
                 "split pane");
         }
         if (top == null) {
-            remove(this.top);
+            if (this.top != null) {
+                remove(this.top);
+            }
             this.top = null;
             return;
         }
@@ -365,7 +371,9 @@ public class TSplitPane extends TWidget {
                 "vertical split pane");
         }
         if (bottom == null) {
-            remove(this.bottom);
+            if (this.bottom != null) {
+                remove(this.bottom);
+            }
             this.bottom = null;
             return;
         }
@@ -455,7 +463,7 @@ public class TSplitPane extends TWidget {
 
         // Remove me from my parent widget.
         TWidget newParent = getParent();
-        setParent(null, false);
+        remove(false);
 
         if (keep == null) {
             // Nothing is left of either pane.  Remove me and bail out.
index db405cfd72e0b13640f1b9bcded25ae03adf1c5d..7a93f4e7b32320c69ade2090049146e9200fdef0 100644 (file)
@@ -229,9 +229,6 @@ public class TTerminalWidget extends TScrollableWidget
         super(parent, x, y, width, height);
 
         this.closeAction = closeAction;
-        if (closeAction != null) {
-            this.closeAction.data = this;
-        }
 
         String [] fullCommand;
 
@@ -310,9 +307,6 @@ public class TTerminalWidget extends TScrollableWidget
         super(parent, x, y, width, height);
 
         this.closeAction = closeAction;
-        if (closeAction != null) {
-            this.closeAction.data = this;
-        }
 
         if (System.getProperty("jexer.TTerminal.shell") != null) {
             String shell = System.getProperty("jexer.TTerminal.shell");
@@ -829,7 +823,7 @@ public class TTerminalWidget extends TScrollableWidget
             app.invokeLater(new Runnable() {
                 public void run() {
                     if (closeAction != null) {
-                        closeAction.DO();
+                        closeAction.DO(TTerminalWidget.this);
                     }
                     if (getApplication() != null) {
                         getApplication().postEvent(new TMenuEvent(
index 034c1e9b26f0ae8fdb1a06550456db2d46bee606..6994e6fd3d0f61ae618df0f4730ceb836bbcd4c7 100644 (file)
@@ -1277,13 +1277,13 @@ public abstract class TWidget implements Comparable<TWidget> {
         int absoluteBottomEdge = window.getAbsoluteY() + window.getHeight();
         if (!(this instanceof TWindow)
             && !(this instanceof TVScroller)
-            && !(parent instanceof TDesktop)
+            && !(window instanceof TDesktop)
         ) {
             absoluteRightEdge -= 1;
         }
         if (!(this instanceof TWindow)
             && !(this instanceof THScroller)
-            && !(parent instanceof TDesktop)
+            && !(window instanceof TDesktop)
         ) {
             absoluteBottomEdge -= 1;
         }
@@ -1548,54 +1548,50 @@ public abstract class TWidget implements Comparable<TWidget> {
     }
 
     /**
-     * Split this widget into two, putting all of this widget's children into
-     * a new TPanel, and returning a new TSplitPane with that panel on the
-     * left or right pane.
+     * Insert a vertical split between this widget and parent, and optionally
+     * put another widget in the other side of the split.
      *
      * @param newWidgetOnLeft if true, the new widget (if specified) will be
-     * on the left pane, and this widget's children will be placed on the
-     * right pane
+     * on the left pane, and this widget will be placed on the right pane
      * @param newWidget the new widget to add to the other pane, or null
      * @return the new split pane widget
      */
     public TSplitPane splitVertical(final boolean newWidgetOnLeft,
         final TWidget newWidget) {
 
-        TPanel panel = new TPanel(null, x, y, width, height);
         TSplitPane splitPane = new TSplitPane(null, x, y, width, height, true);
         List<TWidget> widgets = new ArrayList<TWidget>(children);
-        for (TWidget w: widgets) {
-            w.setParent(panel, false);
-        }
-        children.clear();
-        splitPane.setParent(parent, false);
-        parent = null;
-        window = null;
+        TWidget myParent = parent;
+        remove(false);
+        splitPane.setParent(myParent, false);
         if (newWidgetOnLeft) {
             splitPane.setLeft(newWidget);
-            splitPane.setRight(panel);
+            splitPane.setRight(this);
         } else {
             splitPane.setRight(newWidget);
-            splitPane.setLeft(panel);
+            splitPane.setLeft(this);
         }
-        activate(splitPane);
+        splitPane.activate();
+        if (newWidget != null) {
+            newWidget.activate();
+        } else {
+            activate();
+        }
+        assert (parent != null);
+        assert (window != null);
         for (TWidget w: widgets) {
             assert (w.window != null);
             assert (w.parent != null);
         }
         assert (splitPane.getWindow() != null);
         assert (splitPane.getParent() != null);
-        assert (panel.getWindow() != null);
-        assert (panel.getParent() != null);
         assert (splitPane.isActive() == true);
-        assert (panel.isActive() == true);
         return splitPane;
     }
 
     /**
-     * Split this widget into two, putting all of this widget's children into
-     * a new TPanel, and returning a new TSplitPane with that panel on the
-     * top or bottom pane.
+     * Insert a horizontal split between this widget and parent, and
+     * optionally put another widget in the other side of the split.
      *
      * @param newWidgetOnTop if true, the new widget (if specified) will be
      * on the top pane, and this widget's children will be placed on the
@@ -1606,36 +1602,33 @@ public abstract class TWidget implements Comparable<TWidget> {
     public TSplitPane splitHorizontal(final boolean newWidgetOnTop,
         final TWidget newWidget) {
 
-        TPanel panel = new TPanel(null, x, y, width, height);
         TSplitPane splitPane = new TSplitPane(null, x, y, width, height, false);
         List<TWidget> widgets = new ArrayList<TWidget>(children);
-        for (TWidget w: widgets) {
-            w.setParent(panel, false);
-        }
-        children.clear();
-        splitPane.setParent(parent, false);
-        parent = null;
-        splitPane.setTop(panel);
-        parent = null;
-        window = null;
+        TWidget myParent = parent;
+        remove(false);
+        splitPane.setParent(myParent, false);
         if (newWidgetOnTop) {
             splitPane.setTop(newWidget);
-            splitPane.setBottom(panel);
+            splitPane.setBottom(this);
         } else {
             splitPane.setBottom(newWidget);
-            splitPane.setTop(panel);
+            splitPane.setTop(this);
+        }
+        splitPane.activate();
+        if (newWidget != null) {
+            newWidget.activate();
+        } else {
+            activate();
         }
-        activate(splitPane);
+        assert (parent != null);
+        assert (window != null);
         for (TWidget w: widgets) {
             assert (w.window != null);
             assert (w.parent != null);
         }
         assert (splitPane.getWindow() != null);
         assert (splitPane.getParent() != null);
-        assert (panel.getWindow() != null);
-        assert (panel.getParent() != null);
         assert (splitPane.isActive() == true);
-        assert (panel.isActive() == true);
         return splitPane;
     }
 
index 88abd7037b93f5c39f0f8f247363f8176e75c206..22f72ca850527b35932c8d4e3798c826f65f7686 100644 (file)
@@ -233,7 +233,7 @@ public class TTreeView extends TWidget {
      */
     public void dispatch() {
         if (action != null) {
-            action.DO();
+            action.DO(this);
         }
     }