*/
package jexer;
+import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.List;
import java.util.ArrayList;
}
// If I have any buttons on me AND this is an Alt-key that matches
- // its mnemonic, send it an Enter keystroke
+ // its mnemonic, send it an Enter keystroke.
for (TWidget widget: children) {
if (widget instanceof TButton) {
TButton button = (TButton) widget;
}
}
+ // If I have any labels on me AND this is an Alt-key that matches
+ // its mnemonic, call its action.
+ for (TWidget widget: children) {
+ if (widget instanceof TLabel) {
+ TLabel label = (TLabel) widget;
+ if (!keypress.getKey().isFnKey()
+ && keypress.getKey().isAlt()
+ && !keypress.getKey().isCtrl()
+ && (Character.toLowerCase(label.getMnemonic().getShortcut())
+ == Character.toLowerCase(keypress.getKey().getChar()))
+ ) {
+
+ label.dispatch();
+ return;
+ }
+ }
+ }
+
+ // If I have any radiobuttons on me AND this is an Alt-key that
+ // matches its mnemonic, select it and send a Space to it.
+ for (TWidget widget: children) {
+ if (widget instanceof TRadioButton) {
+ TRadioButton button = (TRadioButton) widget;
+ if (button.isEnabled()
+ && !keypress.getKey().isFnKey()
+ && keypress.getKey().isAlt()
+ && !keypress.getKey().isCtrl()
+ && (Character.toLowerCase(button.getMnemonic().getShortcut())
+ == Character.toLowerCase(keypress.getKey().getChar()))
+ ) {
+ activate(widget);
+ widget.onKeypress(new TKeypressEvent(kbSpace));
+ return;
+ }
+ }
+ if (widget instanceof TRadioGroup) {
+ for (TWidget child: widget.getChildren()) {
+ if (child instanceof TRadioButton) {
+ TRadioButton button = (TRadioButton) child;
+ if (button.isEnabled()
+ && !keypress.getKey().isFnKey()
+ && keypress.getKey().isAlt()
+ && !keypress.getKey().isCtrl()
+ && (Character.toLowerCase(button.getMnemonic().getShortcut())
+ == Character.toLowerCase(keypress.getKey().getChar()))
+ ) {
+ activate(widget);
+ widget.activate(child);
+ child.onKeypress(new TKeypressEvent(kbSpace));
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ // If I have any checkboxes on me AND this is an Alt-key that matches
+ // its mnemonic, select it and set it to checked.
+ for (TWidget widget: children) {
+ if (widget instanceof TCheckBox) {
+ TCheckBox checkBox = (TCheckBox) widget;
+ if (checkBox.isEnabled()
+ && !keypress.getKey().isFnKey()
+ && keypress.getKey().isAlt()
+ && !keypress.getKey().isCtrl()
+ && (Character.toLowerCase(checkBox.getMnemonic().getShortcut())
+ == Character.toLowerCase(keypress.getKey().getChar()))
+ ) {
+ activate(checkBox);
+ checkBox.setChecked(true);
+ return;
+ }
+ }
+ }
+
// Dispatch the keypress to an active widget
for (TWidget widget: children) {
if (widget.active) {
// Draw me
draw();
+ assert (visible == true);
// Continue down the chain. Draw the active child last so that it
// is on top.
}
}
+ /**
+ * Reset the tab order of children to match their position in the list.
+ * Available so that subclasses can re-order their widgets if needed.
+ */
+ protected void resetTabOrder() {
+ for (int i = 0; i < children.size(); i++) {
+ children.get(i).tabOrder = i;
+ }
+ }
+
/**
* Switch the active child.
*
return;
}
- if (child != activeChild) {
- if (activeChild != null) {
- activeChild.active = false;
+ if (children.size() == 1) {
+ if (children.get(0).enabled == true) {
+ child.active = true;
+ activeChild = child;
+ }
+ } else {
+ if (child != activeChild) {
+ if (activeChild != null) {
+ activeChild.active = false;
+ }
+ child.active = true;
+ activeChild = child;
}
- child.active = true;
- activeChild = child;
}
}
* isn't enabled, then the next enabled child will be activated.
*/
public final void activate(final int tabOrder) {
- if (activeChild == null) {
+ if (children.size() == 1) {
+ if (children.get(0).enabled == true) {
+ children.get(0).active = true;
+ activeChild = children.get(0);
+ }
return;
}
+
TWidget child = null;
for (TWidget widget: children) {
if ((widget.enabled)
}
}
if ((child != null) && (child != activeChild)) {
- activeChild.active = false;
+ if (activeChild != null) {
+ activeChild.active = false;
+ }
assert (child.enabled);
child.active = true;
activeChild = child;
*/
public final void switchWidget(final boolean forward) {
- // Only switch if there are multiple enabled widgets
- if ((children.size() < 2) || (activeChild == null)) {
+ // No children: do nothing.
+ if (children.size() == 0) {
+ return;
+ }
+
+ // If there is only one child, make it active if it is enabled.
+ if (children.size() == 1) {
+ if (children.get(0).enabled == true) {
+ activeChild = children.get(0);
+ activeChild.active = true;
+ } else {
+ children.get(0).active = false;
+ activeChild = null;
+ }
return;
}
- int tabOrder = activeChild.tabOrder;
+ // Two or more children: go forward or backward to the next enabled
+ // child.
+ int tabOrder = 0;
+ if (activeChild != null) {
+ tabOrder = activeChild.tabOrder;
+ }
do {
if (forward) {
tabOrder++;
tabOrder = 0;
}
- if (activeChild.tabOrder == tabOrder) {
+ if (activeChild == null) {
+ if (tabOrder == 0) {
+ // We wrapped around
+ break;
+ }
+ } else if (activeChild.tabOrder == tabOrder) {
// We wrapped around
break;
}
&& !(children.get(tabOrder) instanceof THScroller)
&& !(children.get(tabOrder) instanceof TVScroller));
- assert (children.get(tabOrder).enabled);
+ if (activeChild != null) {
+ assert (children.get(tabOrder).enabled);
- activeChild.active = false;
- children.get(tabOrder).active = true;
- activeChild = children.get(tabOrder);
+ activeChild.active = false;
+ }
+ if (children.get(tabOrder).enabled == true) {
+ children.get(tabOrder).active = true;
+ activeChild = children.get(tabOrder);
+ }
}
/**
return addLabel(text, x, y, "tlabel");
}
+ /**
+ * Convenience function to add a label to this container/window.
+ *
+ * @param text label
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param action to call when shortcut is pressed
+ * @return the new label
+ */
+ public final TLabel addLabel(final String text, final int x, final int y,
+ final TAction action) {
+
+ return addLabel(text, x, y, "tlabel", action);
+ }
+
/**
* Convenience function to add a label to this container/window.
*
return new TLabel(this, text, x, y, colorKey);
}
+ /**
+ * Convenience function to add a label to this container/window.
+ *
+ * @param text label
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param colorKey ColorTheme key color to use for foreground text.
+ * Default is "tlabel"
+ * @param action to call when shortcut is pressed
+ * @return the new label
+ */
+ public final TLabel addLabel(final String text, final int x, final int y,
+ final String colorKey, final TAction action) {
+
+ return new TLabel(this, text, x, y, colorKey, action);
+ }
+
/**
* Convenience function to add a label to this container/window.
*
return new TLabel(this, text, x, y, colorKey, useWindowBackground);
}
+ /**
+ * Convenience function to add a label to this container/window.
+ *
+ * @param text label
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param colorKey ColorTheme key color to use for foreground text.
+ * Default is "tlabel"
+ * @param useWindowBackground if true, use the window's background color
+ * @param action to call when shortcut is pressed
+ * @return the new label
+ */
+ public final TLabel addLabel(final String text, final int x, final int y,
+ final String colorKey, final boolean useWindowBackground,
+ final TAction action) {
+
+ return new TLabel(this, text, x, y, colorKey, useWindowBackground,
+ action);
+ }
+
/**
* Convenience function to add a button to this container/window.
*
moveAction);
}
+ /**
+ * 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);
+ }
+
}