X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2FTWidget.java;h=633b149575f24c74728ba740cb30fe7362e3e7fd;hb=9577a9d02a8b04eaf70c26fa33ec721f6e46e9fb;hp=9af0bb83ba122eba0ca3e4480c09d167e3254918;hpb=11cedc9ab61111659c8d2cca5ff85303ec18e53b;p=fanfix.git diff --git a/src/jexer/TWidget.java b/src/jexer/TWidget.java index 9af0bb8..633b149 100644 --- a/src/jexer/TWidget.java +++ b/src/jexer/TWidget.java @@ -28,6 +28,7 @@ */ package jexer; +import java.awt.image.BufferedImage; import java.io.IOException; import java.util.List; import java.util.ArrayList; @@ -179,13 +180,10 @@ public abstract class TWidget implements Comparable { protected TWidget(final TWidget parent, final boolean enabled) { this.enabled = enabled; this.parent = parent; - this.window = parent.window; children = new ArrayList(); - // Do not add TStatusBars, they are drawn by TApplication. - if (this instanceof TStatusBar) { - // NOP - } else { + if (parent != null) { + this.window = parent.window; parent.addChild(this); } } @@ -203,15 +201,19 @@ public abstract class TWidget implements Comparable { protected TWidget(final TWidget parent, final boolean enabled, final int x, final int y, final int width, final int height) { + if (width < 0) { + throw new IllegalArgumentException("width cannot be negative"); + } + if (height < 0) { + throw new IllegalArgumentException("height cannot be negative"); + } + this.enabled = enabled; this.parent = parent; - this.window = parent.window; children = new ArrayList(); - // Do not add TStatusBars, they are drawn by TApplication. - if (this instanceof TStatusBar) { - // NOP - } else { + if (parent != null) { + this.window = parent.window; parent.addChild(this); } @@ -233,6 +235,13 @@ public abstract class TWidget implements Comparable { protected final void setupForTWindow(final TWindow window, final int x, final int y, final int width, final int height) { + if (width < 0) { + throw new IllegalArgumentException("width cannot be negative"); + } + if (height < 0) { + throw new IllegalArgumentException("height cannot be negative"); + } + this.parent = window; this.window = window; this.x = x; @@ -291,6 +300,7 @@ public abstract class TWidget implements Comparable { * @param keypress keystroke event */ public void onKeypress(final TKeypressEvent keypress) { + assert (parent != null); if ((children.size() == 0) || (this instanceof TTreeView) @@ -685,6 +695,97 @@ public abstract class TWidget implements Comparable { return children; } + /** + * Remove this widget from its parent container. close() will be called + * before it is removed. + */ + public final void remove() { + remove(true); + } + + /** + * Remove this widget from its parent container. + * + * @param doClose if true, call the close() method before removing the + * child + */ + public final void remove(final boolean doClose) { + if (parent != null) { + parent.remove(this, doClose); + } + } + + /** + * Remove a child widget from this container. + * + * @param child the child widget to remove + * @param doClose if true, call the close() method before removing the + * child + */ + public final void remove(final TWidget child, final boolean doClose) { + if (!children.contains(child)) { + throw new IndexOutOfBoundsException("child widget is not in " + + "list of children of this parent"); + } + if (doClose) { + child.close(); + } + children.remove(child); + child.parent = null; + } + + /** + * Set this widget's parent to a different widget. + * + * @param newParent new parent widget + * @param doClose if true, call the close() method before removing the + * child from its existing parent widget + */ + public final void setParent(final TWidget newParent, + final boolean doClose) { + + if (parent != null) { + parent.remove(this, doClose); + } + assert (parent == null); + window = newParent.window; + newParent.addChild(this); + } + + /** + * Set this widget's window to a specific window. Parent must already be + * null. Having a null parent with a specified window is only used + * within Jexer by TStatusBar because TApplication routes events directly + * to it and calls its draw() method. Any other non-parented widgets + * will require similar special case functionality to receive events or + * be drawn to screen. + * + * @param window the window to use + */ + public final void setWindow(final TWindow window) { + + if (parent != null) { + throw new IllegalArgumentException("Cannot have different " + + "windows for parent and child"); + } + this.window = window; + } + + /** + * Remove a child widget from this container, and all of its children + * recursively from their parent containers. + * + * @param child the child widget to remove + * @param doClose if true, call the close() method before removing each + * child + */ + public final void removeAll(final TWidget child, final boolean doClose) { + remove(child, doClose); + for (TWidget w: child.children) { + child.removeAll(w, doClose); + } + } + /** * Get active flag. * @@ -881,6 +982,8 @@ public abstract class TWidget implements Comparable { return false; } + assert (window != null); + // If cursor is out of my window's bounds, it is not visible. if ((getCursorAbsoluteX() >= window.getAbsoluteX() + window.getWidth() - 1) @@ -985,7 +1088,7 @@ public abstract class TWidget implements Comparable { if (parent == this) { return active; } - return (active && parent.isAbsoluteActive()); + return (active && (parent == null ? true : parent.isAbsoluteActive())); } /** @@ -1236,6 +1339,18 @@ public abstract class TWidget implements Comparable { } } + /** + * Make this widget the active child of its parent. Note that this is + * not final since TWindow overrides activate(). + */ + public void activate() { + if (enabled) { + if (parent != null) { + parent.activate(this); + } + } + } + /** * Switch the active widget with the next in the tab order. * @@ -1249,6 +1364,8 @@ public abstract class TWidget implements Comparable { return; } + assert (parent != null); + // If there is only one child, make it active if it is enabled. if (children.size() == 1) { if (children.get(0).enabled == true) { @@ -1910,6 +2027,22 @@ public abstract class TWidget implements Comparable { return getApplication().inputBox(title, caption, text); } + /** + * Convenience function to spawn an input box. + * + * @param title window title, will be centered along the top border + * @param caption message to display. Use embedded newlines to get a + * multi-line box. + * @param text initial text to seed the field with + * @param type one of the Type constants. Default is Type.OK. + * @return the new input box + */ + public final TInputBox inputBox(final String title, final String caption, + final String text, final TInputBox.Type type) { + + return getApplication().inputBox(title, caption, text, type); + } + /** * Convenience function to add a password text field to this * container/window. @@ -2201,4 +2334,101 @@ public abstract class TWidget implements Comparable { moveAction); } + /** + * Convenience function to add a list to this container/window. + * + * @param strings list of strings to show. This is allowed to be null + * and set later with setList() or by subclasses. + * @param x column relative to parent + * @param y row relative to parent + * @param width width of text area + * @param height height of text area + * @param enterAction action to perform when an item is selected + * @param moveAction action to perform when the user navigates to a new + * item with arrow/page keys + * @param singleClickAction action to perform when the user clicks on an + * item + */ + public TList addList(final List strings, final int x, + final int y, final int width, final int height, + final TAction enterAction, final TAction moveAction, + final TAction singleClickAction) { + + return new TList(this, strings, x, y, width, height, enterAction, + moveAction, singleClickAction); + } + + + /** + * Convenience function to add an image to this container/window. + * + * @param x column relative to parent + * @param y row relative to parent + * @param width number of text cells for width of the image + * @param height number of text cells for height of the image + * @param image the image to display + * @param left left column of the image. 0 is the left-most column. + * @param top top row of the image. 0 is the top-most row. + */ + public final TImage addImage(final int x, final int y, + final int width, final int height, + final BufferedImage image, final int left, final int top) { + + return new TImage(this, x, y, width, height, image, left, top); + } + + /** + * Convenience function to add an image to this container/window. + * + * @param x column relative to parent + * @param y row relative to parent + * @param width number of text cells for width of the image + * @param height number of text cells for height of the image + * @param image the image to display + * @param left left column of the image. 0 is the left-most column. + * @param top top row of the image. 0 is the top-most row. + * @param clickAction function to call when mouse is pressed + */ + public final TImage addImage(final int x, final int y, + final int width, final int height, + final BufferedImage image, final int left, final int top, + final TAction clickAction) { + + return new TImage(this, x, y, width, height, image, left, top, + clickAction); + } + + /** + * Convenience function to add an editable 2D data table to this + * container/window. + * + * @param x column relative to parent + * @param y row relative to parent + * @param width width of widget + * @param height height of widget + */ + public TTableWidget addTable(final int x, final int y, final int width, + final int height) { + + return new TTableWidget(this, x, y, width, height); + } + + /** + * Convenience function to add an editable 2D data table to this + * container/window. + * + * @param x column relative to parent + * @param y row relative to parent + * @param width width of widget + * @param height height of widget + * @param gridColumns number of columns in grid + * @param gridRows number of rows in grid + */ + public TTableWidget addTable(final int x, final int y, final int width, + final int height, final int gridColumns, final int gridRows) { + + return new TTableWidget(this, x, y, width, height, gridColumns, + gridRows); + } + }