#52 include sixel in DA response
[fanfix.git] / src / jexer / TWidget.java
index bcf798ae36e9f40336d40fcd18d11e3a58b0de6c..034c1e9b26f0ae8fdb1a06550456db2d46bee606 100644 (file)
@@ -611,61 +611,6 @@ public abstract class TWidget implements Comparable<TWidget> {
      * @param menu menu event
      */
     public void onMenu(final TMenuEvent menu) {
-
-        // Special case: if a split command comes in, insert a TPanel and
-        // TSplitPane in the hierarchy here.
-        TPanel panel = null;
-        TSplitPane pane = null;
-        List<TWidget> widgets = null;
-        switch (menu.getId()) {
-        case TMenu.MID_SPLIT_VERTICAL:
-            panel = new TPanel(null, x, y, width, height);
-            pane = new TSplitPane(null, x, y, width, height, true);
-            widgets = new ArrayList<TWidget>(children);
-            for (TWidget w: widgets) {
-                w.setParent(panel, false);
-            }
-            children.clear();
-            pane.setParent(this, false);
-            pane.setLeft(panel);
-            activate(pane);
-            for (TWidget w: widgets) {
-                assert (w.window != null);
-                assert (w.parent != null);
-            }
-            assert (pane.getWindow() != null);
-            assert (pane.getParent() != null);
-            assert (panel.getWindow() != null);
-            assert (panel.getParent() != null);
-            assert (pane.isActive() == true);
-            assert (panel.isActive() == true);
-            return;
-        case TMenu.MID_SPLIT_HORIZONTAL:
-            panel = new TPanel(null, x, y, width, height);
-            pane = new TSplitPane(null, x, y, width, height, false);
-            widgets = new ArrayList<TWidget>(children);
-            for (TWidget w: widgets) {
-                w.setParent(panel, false);
-            }
-            children.clear();
-            pane.setParent(this, false);
-            pane.setTop(panel);
-            activate(pane);
-            for (TWidget w: widgets) {
-                assert (w.window != null);
-                assert (w.parent != null);
-            }
-            assert (pane.getWindow() != null);
-            assert (pane.getParent() != null);
-            assert (panel.getWindow() != null);
-            assert (panel.getParent() != null);
-            assert (pane.isActive() == true);
-            assert (panel.isActive() == true);
-            return;
-        default:
-            break;
-        }
-
         // Default: do nothing, pass to children instead
         for (TWidget widget: children) {
             widget.onMenu(menu);
@@ -1109,6 +1054,11 @@ public abstract class TWidget implements Comparable<TWidget> {
 
         assert (window != null);
 
+        if (window instanceof TDesktop) {
+            // Desktop doesn't have a window border.
+            return cursorVisible;
+        }
+
         // If cursor is out of my window's bounds, it is not visible.
         if ((getCursorAbsoluteX() >= window.getAbsoluteX()
                 + window.getWidth() - 1)
@@ -1161,19 +1111,25 @@ public abstract class TWidget implements Comparable<TWidget> {
     /**
      * Get this TWidget's parent TApplication.
      *
-     * @return the parent TApplication
+     * @return the parent TApplication, or null if not assigned
      */
     public TApplication getApplication() {
-        return window.getApplication();
+        if (window != null) {
+            return window.getApplication();
+        }
+        return null;
     }
 
     /**
      * Get the Screen.
      *
-     * @return the Screen
+     * @return the Screen, or null if not assigned
      */
     public Screen getScreen() {
-        return window.getScreen();
+        if (window != null) {
+            return window.getScreen();
+        }
+        return null;
     }
 
     /**
@@ -1299,6 +1255,10 @@ public abstract class TWidget implements Comparable<TWidget> {
      * Called by parent to render to TWindow.  Note package private access.
      */
     final void drawChildren() {
+        if (window == null) {
+            return;
+        }
+
         // Set my clipping rectangle
         assert (window != null);
         assert (getScreen() != null);
@@ -1315,10 +1275,16 @@ public abstract class TWidget implements Comparable<TWidget> {
 
         int absoluteRightEdge = window.getAbsoluteX() + window.getWidth();
         int absoluteBottomEdge = window.getAbsoluteY() + window.getHeight();
-        if (!(this instanceof TWindow) && !(this instanceof TVScroller)) {
+        if (!(this instanceof TWindow)
+            && !(this instanceof TVScroller)
+            && !(parent instanceof TDesktop)
+        ) {
             absoluteRightEdge -= 1;
         }
-        if (!(this instanceof TWindow) && !(this instanceof THScroller)) {
+        if (!(this instanceof TWindow)
+            && !(this instanceof THScroller)
+            && !(parent instanceof TDesktop)
+        ) {
             absoluteBottomEdge -= 1;
         }
         int myRightEdge = getAbsoluteX() + width;
@@ -1581,6 +1547,98 @@ public abstract class TWidget implements Comparable<TWidget> {
         return this;
     }
 
+    /**
+     * 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.
+     *
+     * @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
+     * @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;
+        if (newWidgetOnLeft) {
+            splitPane.setLeft(newWidget);
+            splitPane.setRight(panel);
+        } else {
+            splitPane.setRight(newWidget);
+            splitPane.setLeft(panel);
+        }
+        activate(splitPane);
+        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.
+     *
+     * @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
+     * bottom pane
+     * @param newWidget the new widget to add to the other pane, or null
+     * @return the new split pane widget
+     */
+    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;
+        if (newWidgetOnTop) {
+            splitPane.setTop(newWidget);
+            splitPane.setBottom(panel);
+        } else {
+            splitPane.setBottom(newWidget);
+            splitPane.setTop(panel);
+        }
+        activate(splitPane);
+        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;
+    }
+
     // ------------------------------------------------------------------------
     // Passthru for Screen functions ------------------------------------------
     // ------------------------------------------------------------------------