Expose width/height in TApplication constructor, attempt on ECMA48
[fanfix.git] / src / jexer / TWidget.java
index 08c0a45ca9c68c28c8345b14faa5f1344d852daf..169e5576be85d09a4aedd865ecc680a84d45e2f9 100644 (file)
@@ -302,6 +302,25 @@ public abstract class TWidget implements Comparable<TWidget> {
      * @return if true, this widget has a visible cursor
      */
     public final boolean isCursorVisible() {
+        // If cursor is out of my bounds, it is not visible.
+        if ((cursorX >= width)
+            || (cursorX < 0)
+            || (cursorY >= height)
+            || (cursorY < 0)
+        ) {
+            return false;
+        }
+
+        // If cursor is out of my window's bounds, it is not visible.
+        if ((getCursorAbsoluteX() >= window.getAbsoluteX()
+                + window.getWidth() - 1)
+            || (getCursorAbsoluteX() < 0)
+            || (getCursorAbsoluteY() >= window.getAbsoluteY()
+                + window.getHeight() - 1)
+            || (getCursorAbsoluteY() < 0)
+        ) {
+            return false;
+        }
         return cursorVisible;
     }
 
@@ -419,7 +438,6 @@ public abstract class TWidget implements Comparable<TWidget> {
      * @return absolute screen column number for the cursor's X position
      */
     public final int getCursorAbsoluteX() {
-        assert (cursorVisible);
         return getAbsoluteX() + cursorX;
     }
 
@@ -429,7 +447,6 @@ public abstract class TWidget implements Comparable<TWidget> {
      * @return absolute screen row number for the cursor's Y position
      */
     public final int getCursorAbsoluteY() {
-        assert (cursorVisible);
         return getAbsoluteY() + cursorY;
     }
 
@@ -550,6 +567,13 @@ public abstract class TWidget implements Comparable<TWidget> {
         }
     }
 
+    /**
+     * Repaint the screen on the next update.
+     */
+    public void doRepaint() {
+        window.getApplication().doRepaint();
+    }
+
     // ------------------------------------------------------------------------
     // Constructors -----------------------------------------------------------
     // ------------------------------------------------------------------------
@@ -596,7 +620,12 @@ public abstract class TWidget implements Comparable<TWidget> {
         this.parent = parent;
         this.window = parent.window;
         children = new ArrayList<TWidget>();
-        parent.addChild(this);
+
+        // Do not add TStatusBars, they are drawn by TApplication
+        if (this instanceof TStatusBar) {
+        } else {
+            parent.addChild(this);
+        }
     }
 
     /**
@@ -616,7 +645,12 @@ public abstract class TWidget implements Comparable<TWidget> {
         this.parent = parent;
         this.window = parent.window;
         children = new ArrayList<TWidget>();
-        parent.addChild(this);
+
+        // Do not add TStatusBars, they are drawn by TApplication
+        if (this instanceof TStatusBar) {
+        } else {
+            parent.addChild(this);
+        }
 
         this.x = x;
         this.y = y;
@@ -944,6 +978,29 @@ public abstract class TWidget implements Comparable<TWidget> {
         }
     }
 
+    /**
+     * Method that subclasses can override to handle mouse button
+     * double-clicks.
+     *
+     * @param mouse mouse button event
+     */
+    public void onMouseDoubleClick(final TMouseEvent mouse) {
+        // Default: do nothing, pass to children instead
+        for (int i = children.size() - 1 ; i >= 0 ; i--) {
+            TWidget widget = children.get(i);
+            if (widget.mouseWouldHit(mouse)) {
+                // Dispatch to this child, also activate it
+                activate(widget);
+
+                // Set x and y relative to the child's coordinates
+                mouse.setX(mouse.getAbsoluteX() - widget.getAbsoluteX());
+                mouse.setY(mouse.getAbsoluteY() - widget.getAbsoluteY());
+                widget.handleEvent(mouse);
+                return;
+            }
+        }
+    }
+
     /**
      * Method that subclasses can override to handle window/screen resize
      * events.
@@ -990,7 +1047,8 @@ public abstract class TWidget implements Comparable<TWidget> {
 
     /**
      * Method that subclasses can override to do processing when the UI is
-     * idle.
+     * idle.  Note that repainting is NOT assumed.  To get a refresh after
+     * onIdle, call doRepaint().
      */
     public void onIdle() {
         // Default: do nothing, pass to children instead
@@ -1035,6 +1093,10 @@ public abstract class TWidget implements Comparable<TWidget> {
                 onMouseMotion(mouse);
                 break;
 
+            case MOUSE_DOUBLE_CLICK:
+                onMouseDoubleClick(mouse);
+                break;
+
             default:
                 throw new IllegalArgumentException("Invalid mouse event type: "
                     + mouse.getType());