this.height = height;
}
- /**
- * Request full repaint on next screen refresh.
- */
- protected final void setRepaint() {
- window.getApplication().setRepaint();
- }
-
/**
* Get this TWidget's parent TApplication.
*
*
* @return if true, this widget will receive events
*/
- public final boolean getActive() {
+ public final boolean isActive() {
return active;
}
*
* @return if true, this widget can be tabbed to or receive events
*/
- public final boolean getEnabled() {
+ public final boolean isEnabled() {
return enabled;
}
/**
* If true, this widget has a cursor.
*/
- private boolean hasCursor = false;
+ private boolean cursorVisible = false;
/**
* Set visible cursor flag.
*
- * @param hasCursor if true, this widget has a cursor
+ * @param cursorVisible if true, this widget has a cursor
*/
- public final void setHasCursor(final boolean hasCursor) {
- this.hasCursor = hasCursor;
+ public final void setCursorVisible(final boolean cursorVisible) {
+ this.cursorVisible = cursorVisible;
}
/**
*
* @return if true, this widget has a visible cursor
*/
- public final boolean visibleCursor() {
- return hasCursor;
+ public final boolean isCursorVisible() {
+ return cursorVisible;
}
/**
* @return true if this widget is active and all of its parents are
* active.
*/
- public final boolean getAbsoluteActive() {
+ public final boolean isAbsoluteActive() {
if (parent == this) {
return active;
}
- return (active && parent.getAbsoluteActive());
+ return (active && parent.isAbsoluteActive());
}
/**
* @return absolute screen column number for the cursor's X position
*/
public final int getCursorAbsoluteX() {
- assert (hasCursor);
+ assert (cursorVisible);
return getAbsoluteX() + cursorX;
}
* @return absolute screen row number for the cursor's Y position
*/
public final int getCursorAbsoluteY() {
- assert (hasCursor);
+ assert (cursorVisible);
return getAbsoluteY() + cursorY;
}
public final void drawChildren() {
// Set my clipping rectangle
assert (window != null);
- assert (window.getScreen() != null);
- Screen screen = window.getScreen();
+ assert (getScreen() != null);
+ Screen screen = getScreen();
screen.setClipRight(width);
screen.setClipBottom(height);
- int absoluteRightEdge = window.getAbsoluteX() + screen.getWidth();
- int absoluteBottomEdge = window.getAbsoluteY() + screen.getHeight();
+ int absoluteRightEdge = window.getAbsoluteX() + window.getWidth();
+ int absoluteBottomEdge = window.getAbsoluteY() + window.getHeight();
if (!(this instanceof TWindow) && !(this instanceof TVScroller)) {
absoluteRightEdge -= 1;
}
screen.setClipRight(0);
} else if (myRightEdge > absoluteRightEdge) {
screen.setClipRight(screen.getClipRight()
- - myRightEdge - absoluteRightEdge);
+ - (myRightEdge - absoluteRightEdge));
}
if (getAbsoluteY() > absoluteBottomEdge) {
// I am offscreen
screen.setClipBottom(0);
} else if (myBottomEdge > absoluteBottomEdge) {
screen.setClipBottom(screen.getClipBottom()
- - myBottomEdge - absoluteBottomEdge);
+ - (myBottomEdge - absoluteBottomEdge));
}
// Set my offset
this(parent, true);
}
+ /**
+ * Protected constructor.
+ *
+ * @param parent parent widget
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param width width of widget
+ * @param height height of widget
+ */
+ protected TWidget(final TWidget parent, final int x, final int y,
+ final int width, final int height) {
+
+ this(parent, true, x, y, width, height);
+ }
+
/**
* Protected constructor used by subclasses that are disabled by default.
*
parent.addChild(this);
}
+ /**
+ * Protected constructor used by subclasses that are disabled by default.
+ *
+ * @param parent parent widget
+ * @param enabled if true assume enabled
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param width width of widget
+ * @param height height of widget
+ */
+ protected TWidget(final TWidget parent, final boolean enabled,
+ final int x, final int y, final int width, final int height) {
+
+ this.enabled = enabled;
+ this.parent = parent;
+ this.window = parent.window;
+ children = new LinkedList<TWidget>();
+ parent.addChild(this);
+
+ this.x = x;
+ this.y = y;
+ this.width = width;
+ this.height = height;
+ }
+
/**
* Add a child widget to my list of children. We set its tabOrder to 0
* and increment the tabOrder of all other children.
activeChild.active = false;
children.get(tabOrder).active = true;
activeChild = children.get(tabOrder);
-
- // Refresh
- window.getApplication().setRepaint();
}
/**
if ((children.size() == 0)
// TODO
// || (cast(TTreeView)this)
- // || (cast(TText)this)
+ || (this instanceof TText)
) {
// Defaults:
// If I have any buttons on me AND this is an Alt-key that matches
// its mnemonic, send it an Enter keystroke
for (TWidget widget: children) {
- /*
- TODO
-
- if (TButton button = cast(TButton)w) {
- if (button.enabled &&
- !keypress.key.isKey &&
- keypress.key.alt &&
- !keypress.key.ctrl &&
- (toLowercase(button.mnemonic.shortcut) == toLowercase(keypress.key.ch))) {
-
- w.handleEvent(new TKeypressEvent(kbEnter));
+ if (widget instanceof TButton) {
+ TButton button = (TButton) widget;
+ if (button.isEnabled()
+ && !keypress.getKey().isFnKey()
+ && keypress.getKey().isAlt()
+ && !keypress.getKey().isCtrl()
+ && (Character.toLowerCase(button.getMnemonic().getShortcut())
+ == Character.toLowerCase(keypress.getKey().getChar()))
+ ) {
+
+ widget.handleEvent(new TKeypressEvent(kbEnter));
return;
}
}
- */
}
// Dispatch the keypress to an active widget
for (TWidget widget: children) {
if (widget.active) {
- window.getApplication().setRepaint();
widget.handleEvent(keypress);
return;
}
return new TCheckbox(this, x, y, label, checked);
}
+ /**
+ * Convenience function to add a progress bar to this container/window.
+ *
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param width width of progress bar
+ * @param value initial value of percent complete
+ * @return the new progress bar
+ */
+ public final TProgressBar addProgressBar(final int x, final int y,
+ final int width, final int value) {
+
+ return new TProgressBar(this, x, y, width, value);
+ }
+
+ /**
+ * Convenience function to add a radio button group to this
+ * container/window.
+ *
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param label label to display on the group box
+ * @return the new radio button group
+ */
+ public final TRadioGroup addRadioGroup(final int x, final int y,
+ final String label) {
+
+ return new TRadioGroup(this, x, y, label);
+ }
+
+ /**
+ * Convenience function to add a text field to this container/window.
+ *
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param width visible text width
+ * @param fixed if true, the text cannot exceed the display width
+ * @return the new text field
+ */
+ public final TField addField(final int x, final int y,
+ final int width, final boolean fixed) {
+
+ return new TField(this, x, y, width, fixed);
+ }
+
+ /**
+ * Convenience function to add a text field to this container/window.
+ *
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param width visible text width
+ * @param fixed if true, the text cannot exceed the display width
+ * @param text initial text, default is empty string
+ * @return the new text field
+ */
+ public final TField addField(final int x, final int y,
+ final int width, final boolean fixed, final String text) {
+
+ return new TField(this, x, y, width, fixed, text);
+ }
+
+ /**
+ * Convenience function to add a text field to this container/window.
+ *
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param width visible text width
+ * @param fixed if true, the text cannot exceed the display width
+ * @param text initial text, default is empty string
+ * @param enterAction function to call when enter key is pressed
+ * @param updateAction function to call when the text is updated
+ * @return the new text field
+ */
+ public final TField addField(final int x, final int y,
+ final int width, final boolean fixed, final String text,
+ final TAction enterAction, final TAction updateAction) {
+
+ return new TField(this, x, y, width, fixed, text, enterAction,
+ updateAction);
+ }
+
+ /**
+ * Convenience function to add a scrollable text box to this
+ * container/window.
+ *
+ * @param text text on the screen
+ * @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 colorKey ColorTheme key color to use for foreground text
+ * @return the new text box
+ */
+ public final TText addText(final String text, final int x,
+ final int y, final int width, final int height, final String colorKey) {
+
+ return new TText(this, text, x, y, width, height, colorKey);
+ }
+
+ /**
+ * Convenience function to add a scrollable text box to this
+ * container/window.
+ *
+ * @param text text on the screen
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param width width of text area
+ * @param height height of text area
+ * @return the new text box
+ */
+ public final TText addText(final String text, final int x, final int y,
+ final int width, final int height) {
+
+ return new TText(this, text, x, y, width, height, "ttext");
+ }
+
+ /**
+ * Convenience function to spawn a message 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.
+ * @return the new message box
+ */
+ public final TMessageBox messageBox(final String title,
+ final String caption) {
+
+ return getApplication().messageBox(title, caption, TMessageBox.Type.OK);
+ }
+
+ /**
+ * Convenience function to spawn a message 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 type one of the TMessageBox.Type constants. Default is
+ * Type.OK.
+ * @return the new message box
+ */
+ public final TMessageBox messageBox(final String title,
+ final String caption, final TMessageBox.Type type) {
+
+ return getApplication().messageBox(title, caption, type);
+ }
+
+ /**
+ * 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.
+ * @return the new input box
+ */
+ public final TInputBox inputBox(final String title, final String caption) {
+
+ return getApplication().inputBox(title, caption);
+ }
+
+ /**
+ * 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
+ * @return the new input box
+ */
+ public final TInputBox inputBox(final String title, final String caption,
+ final String text) {
+
+ return getApplication().inputBox(title, caption, text);
+ }
+
+ /**
+ * Convenience function to add a password text field to this
+ * container/window.
+ *
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param width visible text width
+ * @param fixed if true, the text cannot exceed the display width
+ * @return the new text field
+ */
+ public final TPasswordField addPasswordField(final int x, final int y,
+ final int width, final boolean fixed) {
+
+ return new TPasswordField(this, x, y, width, fixed);
+ }
+
+ /**
+ * Convenience function to add a password text field to this
+ * container/window.
+ *
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param width visible text width
+ * @param fixed if true, the text cannot exceed the display width
+ * @param text initial text, default is empty string
+ * @return the new text field
+ */
+ public final TPasswordField addPasswordField(final int x, final int y,
+ final int width, final boolean fixed, final String text) {
+
+ return new TPasswordField(this, x, y, width, fixed, text);
+ }
+
+ /**
+ * Convenience function to add a password text field to this
+ * container/window.
+ *
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param width visible text width
+ * @param fixed if true, the text cannot exceed the display width
+ * @param text initial text, default is empty string
+ * @param enterAction function to call when enter key is pressed
+ * @param updateAction function to call when the text is updated
+ * @return the new text field
+ */
+ public final TPasswordField addPasswordField(final int x, final int y,
+ final int width, final boolean fixed, final String text,
+ final TAction enterAction, final TAction updateAction) {
+
+ return new TPasswordField(this, x, y, width, fixed, text, enterAction,
+ updateAction);
+ }
+
}