menu system compiles
[fanfix.git] / src / jexer / TWidget.java
index 4d9e22ced4e628770657303343284d77c0566cac..d0c6b8177dac3a818ea8a0554f86d813fb356d3b 100644 (file)
@@ -33,6 +33,7 @@ package jexer;
 import java.util.List;
 import java.util.LinkedList;
 
+import jexer.bits.ColorTheme;
 import jexer.event.TCommandEvent;
 import jexer.event.TInputEvent;
 import jexer.event.TKeypressEvent;
@@ -40,6 +41,7 @@ import jexer.event.TMenuEvent;
 import jexer.event.TMouseEvent;
 import jexer.event.TResizeEvent;
 import jexer.io.Screen;
+import jexer.menu.TMenu;
 import static jexer.TKeypress.*;
 
 /**
@@ -53,13 +55,76 @@ public abstract class TWidget {
      * example, a TWindow might contain several TTextFields, or a TComboBox
      * may contain a TScrollBar.
      */
-    protected TWidget parent = null;
+    private TWidget parent = null;
+
+    /**
+     * Get parent widget.
+     *
+     * @return parent widget
+     */
+    public final TWidget getParent() {
+        return parent;
+    }
+
+    /**
+     * Backdoor access for TWindow's constructor.  ONLY TWindow USES THIS.
+     *
+     * @param window the top-level window
+     * @param x column relative to parent
+     * @param y row relative to parent
+     * @param width width of window
+     * @param height height of window
+     */
+    protected final void setupForTWindow(final TWindow window,
+        final int x, final int y, final int width, final int height) {
+
+        this.parent = window;
+        this.window = window;
+        this.x      = x;
+        this.y      = y;
+        this.width  = width;
+        this.height = height;
+    }
+
+    /**
+     * Request full repaint on next screen refresh.
+     */
+    protected final void setRepaint() {
+        window.getApplication().setRepaint();
+    }
+
+    /**
+     * Get this TWidget's parent TApplication.
+     *
+     * @return the parent TApplication
+     */
+    public TApplication getApplication() {
+        return window.getApplication();
+    }
+
+    /**
+     * Get the Screen.
+     *
+     * @return the Screen
+     */
+    public Screen getScreen() {
+        return window.getScreen();
+    }
 
     /**
      * Child widgets that this widget contains.
      */
     private List<TWidget> children;
 
+    /**
+     * Get the list of child widgets that this widget contains.
+     *
+     * @return the list of child widgets
+     */
+    public List<TWidget> getChildren() {
+        return children;
+    }
+
     /**
      * The currently active child widget that will receive keypress events.
      */
@@ -68,32 +133,122 @@ public abstract class TWidget {
     /**
      * If true, this widget will receive events.
      */
-    protected boolean active = false;
+    private boolean active = false;
+
+    /**
+     * Get active flag.
+     *
+     * @return if true, this widget will receive events
+     */
+    public final boolean getActive() {
+        return active;
+    }
+
+    /**
+     * Set active flag.
+     *
+     * @param active if true, this widget will receive events
+     */
+    public final void setActive(final boolean active) {
+        this.active = active;
+    }
 
     /**
      * The window that this widget draws to.
      */
-    protected TWindow window = null;
+    private TWindow window = null;
 
     /**
      * Absolute X position of the top-left corner.
      */
-    protected int x = 0;
+    private int x = 0;
+
+    /**
+     * Get X position.
+     *
+     * @return absolute X position of the top-left corner
+     */
+    public final int getX() {
+        return x;
+    }
+
+    /**
+     * Set X position.
+     *
+     * @param x absolute X position of the top-left corner
+     */
+    public final void setX(final int x) {
+        this.x = x;
+    }
 
     /**
      * Absolute Y position of the top-left corner.
      */
-    protected int y = 0;
+    private int y = 0;
+
+    /**
+     * Get Y position.
+     *
+     * @return absolute Y position of the top-left corner
+     */
+    public final int getY() {
+        return y;
+    }
+
+    /**
+     * Set Y position.
+     *
+     * @param y absolute Y position of the top-left corner
+     */
+    public final void setY(final int y) {
+        this.y = y;
+    }
 
     /**
      * Width.
      */
-    protected int width = 0;
+    private int width = 0;
+
+    /**
+     * Get the width.
+     *
+     * @return widget width
+     */
+    public final int getWidth() {
+        return this.width;
+    }
+
+    /**
+     * Change the width.
+     *
+     * @param width new widget width
+     */
+    public final void setWidth(final int width) {
+        this.width = width;
+    }
 
     /**
      * Height.
      */
-    protected int height = 0;
+    private int height = 0;
+
+    /**
+     * Get the height.
+     *
+     * @return widget height
+     */
+    public final int getHeight() {
+        return this.height;
+    }
+
+    /**
+     * Change the height.
+     *
+     * @param height new widget height
+     */
+    public final void setHeight(final int height) {
+        this.height = height;
+    }
 
     /**
      * My tab order inside a window or containing widget.
@@ -121,19 +276,15 @@ public abstract class TWidget {
      */
     public final void setEnabled(final boolean enabled) {
         this.enabled = enabled;
-        /*
-
-        // TODO: get this working after scrollers are going again
-
-        if (enabled == false) {
+        if (!enabled) {
             active = false;
             // See if there are any active siblings to switch to
             boolean foundSibling = false;
-            if (parent !is null) {
-                foreach (w; parent.children) {
-                    if ((w.enabled) &&
-                        (!cast(THScroller)this) &&
-                        (!cast(TVScroller)this)
+            if (parent != null) {
+                for (TWidget w: parent.children) {
+                    if ((w.enabled)
+                        && !(this instanceof THScroller)
+                        && !(this instanceof TVScroller)
                     ) {
                         parent.activate(w);
                         foundSibling = true;
@@ -145,7 +296,6 @@ public abstract class TWidget {
                 }
             }
         }
-         */
     }
 
     /**
@@ -253,6 +403,15 @@ public abstract class TWidget {
         return parent.getAbsoluteY() + y;
     }
 
+    /**
+     * Get the global color theme.
+     *
+     * @return the ColorTheme
+     */
+    public final ColorTheme getTheme() {
+        return window.getApplication().getTheme();
+    }
+
     /**
      * Draw my specific widget.  When called, the screen rectangle I draw
      * into is already setup (offset and clipping).
@@ -312,7 +471,7 @@ public abstract class TWidget {
     }
 
     /**
-     * Subclasses need this constructor to setup children.
+     * Default constructor for subclasses.
      */
     protected TWidget() {
         children = new LinkedList<TWidget>();
@@ -326,7 +485,7 @@ public abstract class TWidget {
     protected TWidget(final TWidget parent) {
         this.parent = parent;
         this.window = parent.window;
-
+        children = new LinkedList<TWidget>();
         parent.addChild(this);
     }
 
@@ -466,7 +625,7 @@ public abstract class TWidget {
      *
      * @return widget that is active, or this if no children
      */
-    public final TWidget getActiveChild() {
+    public TWidget getActiveChild() {
         if ((this instanceof THScroller)
             || (this instanceof TVScroller)
         ) {
@@ -490,6 +649,7 @@ public abstract class TWidget {
     public void onKeypress(final TKeypressEvent keypress) {
 
         if ((children.size() == 0)
+            // TODO
             // || (cast(TTreeView)this)
             // || (cast(TText)this)
         ) {