X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2FTWidget.java;h=b17b73f67b1c49f92c831591a62e5ef8452bd05d;hb=8ab60a33f89f656b71751a45967c79179415f652;hp=8a49c816ac1ceb8ab847cadeef41f25b3cc30d9f;hpb=5d26b50423486b1e680e3adfc0054f6fd0bbcefe;p=fanfix.git diff --git a/src/jexer/TWidget.java b/src/jexer/TWidget.java index 8a49c81..b17b73f 100644 --- a/src/jexer/TWidget.java +++ b/src/jexer/TWidget.java @@ -180,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); } } @@ -213,13 +210,10 @@ public abstract class TWidget implements Comparable { 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); } @@ -306,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) @@ -700,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. * @@ -896,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) @@ -1000,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())); } /** @@ -1251,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. * @@ -1264,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) { @@ -1399,7 +1501,7 @@ public abstract class TWidget implements Comparable { * @param ch character to draw * @param attr attributes to use (bold, foreColor, backColor) */ - protected final void putAll(final char ch, final CellAttributes attr) { + protected final void putAll(final int ch, final CellAttributes attr) { getScreen().putAll(ch, attr); } @@ -1422,7 +1524,7 @@ public abstract class TWidget implements Comparable { * @param ch character to draw * @param attr attributes to use (bold, foreColor, backColor) */ - protected final void putCharXY(final int x, final int y, final char ch, + protected final void putCharXY(final int x, final int y, final int ch, final CellAttributes attr) { getScreen().putCharXY(x, y, ch, attr); @@ -1435,7 +1537,7 @@ public abstract class TWidget implements Comparable { * @param y row coordinate. 0 is the top-most row. * @param ch character to draw */ - protected final void putCharXY(final int x, final int y, final char ch) { + protected final void putCharXY(final int x, final int y, final int ch) { getScreen().putCharXY(x, y, ch); } @@ -1475,7 +1577,7 @@ public abstract class TWidget implements Comparable { * @param attr attributes to use (bold, foreColor, backColor) */ protected final void vLineXY(final int x, final int y, final int n, - final char ch, final CellAttributes attr) { + final int ch, final CellAttributes attr) { getScreen().vLineXY(x, y, n, ch, attr); } @@ -1490,7 +1592,7 @@ public abstract class TWidget implements Comparable { * @param attr attributes to use (bold, foreColor, backColor) */ protected final void hLineXY(final int x, final int y, final int n, - final char ch, final CellAttributes attr) { + final int ch, final CellAttributes attr) { getScreen().hLineXY(x, y, n, ch, attr); } @@ -1689,18 +1791,18 @@ public abstract class TWidget implements Comparable { * @param values the possible values for the box, shown in the drop-down * @param valuesIndex the initial index in values, or -1 for no default * value - * @param valuesHeight the height of the values drop-down when it is - * visible + * @param maxValuesHeight the maximum height of the values drop-down when + * it is visible * @param updateAction action to call when a new value is selected from * the list or enter is pressed in the edit field * @return the new combobox */ public final TComboBox addComboBox(final int x, final int y, final int width, final List values, final int valuesIndex, - final int valuesHeight, final TAction updateAction) { + final int maxValuesHeight, final TAction updateAction) { return new TComboBox(this, x, y, width, values, valuesIndex, - valuesHeight, updateAction); + maxValuesHeight, updateAction); } /** @@ -2232,6 +2334,31 @@ 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. *