+ /**
+ * 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
+ */
+ public final void remove(final TWidget child) {
+ remove(child, true);
+ }
+
+ /**
+ * 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;
+ child.window = null;
+ if (layout != null) {
+ layout.remove(this);
+ }
+ }
+
+ /**
+ * 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);
+ window = null;
+ }
+ assert (parent == null);
+ assert (window == null);
+ parent = newParent;
+ setWindow(parent.window);
+ parent.addChild(this);
+ }
+
+ /**
+ * Set this widget's window to a specific window.
+ *
+ * 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) {
+ this.window = window;
+ for (TWidget child: getChildren()) {
+ child.setWindow(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);
+ }
+ }
+