*
* The MIT License (MIT)
*
- * Copyright (C) 2016 Kevin Lamonte
+ * Copyright (C) 2017 Kevin Lamonte
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
import java.io.IOException;
import java.util.List;
-import java.util.LinkedList;
+import java.util.ArrayList;
import jexer.bits.ColorTheme;
import jexer.event.TCommandEvent;
*/
public abstract class TWidget implements Comparable<TWidget> {
+ // ------------------------------------------------------------------------
+ // Common widget attributes -----------------------------------------------
+ // ------------------------------------------------------------------------
+
/**
* Every widget has a parent widget that it may be "contained" in. For
* example, a TWindow might contain several TTextFields, or a TComboBox
return parent;
}
- /**
- * Backdoor access for TWindow's constructor. ONLY TWindow USES THIS.
- *
- * @param window the top-level window
- * @param x column relative to parent
- * @param y row relative to parent
- * @param width width of window
- * @param height height of window
- */
- protected final void setupForTWindow(final TWindow window,
- final int x, final int y, final int width, final int height) {
-
- this.parent = window;
- this.window = window;
- this.x = x;
- this.y = y;
- this.width = width;
- this.height = height;
- }
-
- /**
- * Get this TWidget's parent TApplication.
- *
- * @return the parent TApplication
- */
- public TApplication getApplication() {
- return window.getApplication();
- }
-
- /**
- * Get the Screen.
- *
- * @return the Screen
- */
- public Screen getScreen() {
- return window.getScreen();
- }
-
/**
* Child widgets that this widget contains.
*/
this.height = height;
}
+ /**
+ * Change the dimensions.
+ *
+ * @param x absolute X position of the top-left corner
+ * @param y absolute Y position of the top-left corner
+ * @param width new widget width
+ * @param height new widget height
+ */
+ public final void setDimensions(final int x, final int y, final int width,
+ final int height) {
+
+ setX(x);
+ setY(y);
+ setWidth(width);
+ setHeight(height);
+ }
+
/**
* My tab order inside a window or containing widget.
*/
this.cursorY = cursorY;
}
+ // ------------------------------------------------------------------------
+ // TApplication integration -----------------------------------------------
+ // ------------------------------------------------------------------------
+
+ /**
+ * Get this TWidget's parent TApplication.
+ *
+ * @return the parent TApplication
+ */
+ public TApplication getApplication() {
+ return window.getApplication();
+ }
+
+ /**
+ * Get the Screen.
+ *
+ * @return the Screen
+ */
+ public Screen getScreen() {
+ return window.getScreen();
+ }
+
/**
* Comparison operator. For various subclasses it sorts on:
* <ul>
if (parent == this) {
return x;
}
- if ((parent instanceof TWindow) && !(parent instanceof TMenu)) {
+ if ((parent instanceof TWindow)
+ && !(parent instanceof TMenu)
+ && !(parent instanceof TDesktop)
+ ) {
// Widgets on a TWindow have (0,0) as their top-left, but this is
// actually the TWindow's (1,1).
return parent.getAbsoluteX() + x + 1;
if (parent == this) {
return y;
}
- if ((parent instanceof TWindow) && !(parent instanceof TMenu)) {
+ if ((parent instanceof TWindow)
+ && !(parent instanceof TMenu)
+ && !(parent instanceof TDesktop)
+ ) {
// Widgets on a TWindow have (0,0) as their top-left, but this is
// actually the TWindow's (1,1).
return parent.getAbsoluteY() + y + 1;
assert (getScreen() != null);
Screen screen = getScreen();
+ // Special case: TStatusBar is drawn by TApplication, not anything
+ // else.
+ if (this instanceof TStatusBar) {
+ return;
+ }
+
screen.setClipRight(width);
screen.setClipBottom(height);
}
}
+ // ------------------------------------------------------------------------
+ // Constructors -----------------------------------------------------------
+ // ------------------------------------------------------------------------
+
/**
* Default constructor for subclasses.
*/
protected TWidget() {
- children = new LinkedList<TWidget>();
+ children = new ArrayList<TWidget>();
}
/**
this.enabled = enabled;
this.parent = parent;
this.window = parent.window;
- children = new LinkedList<TWidget>();
+ children = new ArrayList<TWidget>();
parent.addChild(this);
}
this.enabled = enabled;
this.parent = parent;
this.window = parent.window;
- children = new LinkedList<TWidget>();
+ children = new ArrayList<TWidget>();
parent.addChild(this);
this.x = x;
this.height = height;
}
+ /**
+ * Backdoor access for TWindow's constructor. ONLY TWindow USES THIS.
+ *
+ * @param window the top-level window
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param width width of window
+ * @param height height of window
+ */
+ protected final void setupForTWindow(final TWindow window,
+ final int x, final int y, final int width, final int height) {
+
+ this.parent = window;
+ this.window = window;
+ this.x = x;
+ this.y = y;
+ this.width = width;
+ this.height = height;
+ }
+
+ // ------------------------------------------------------------------------
+ // General behavior -------------------------------------------------------
+ // ------------------------------------------------------------------------
+
/**
* Add a child widget to my list of children. We set its tabOrder to 0
* and increment the tabOrder of all other children.
return this;
}
+ // ------------------------------------------------------------------------
+ // Event handlers ---------------------------------------------------------
+ // ------------------------------------------------------------------------
+
+ /**
+ * Check if a mouse press/release event coordinate is contained in this
+ * widget.
+ *
+ * @param mouse a mouse-based event
+ * @return whether or not a mouse click would be sent to this widget
+ */
+ public final boolean mouseWouldHit(final TMouseEvent mouse) {
+
+ if (!enabled) {
+ return false;
+ }
+
+ if ((mouse.getAbsoluteX() >= getAbsoluteX())
+ && (mouse.getAbsoluteX() < getAbsoluteX() + width)
+ && (mouse.getAbsoluteY() >= getAbsoluteY())
+ && (mouse.getAbsoluteY() < getAbsoluteY() + height)
+ ) {
+ return true;
+ }
+ return false;
+ }
+
/**
* Method that subclasses can override to handle keystrokes.
*
*/
public void onMouseDown(final TMouseEvent mouse) {
// Default: do nothing, pass to children instead
- for (TWidget widget: children) {
+ for (int i = children.size() - 1 ; i >= 0 ; i--) {
+ TWidget widget = children.get(i);
if (widget.mouseWouldHit(mouse)) {
// Dispatch to this child, also activate it
activate(widget);
*/
public void onMouseUp(final TMouseEvent mouse) {
// Default: do nothing, pass to children instead
- for (TWidget widget: children) {
+ for (int i = children.size() - 1 ; i >= 0 ; i--) {
+ TWidget widget = children.get(i);
if (widget.mouseWouldHit(mouse)) {
// Dispatch to this child, also activate it
activate(widget);
return;
}
- /**
- * Check if a mouse press/release event coordinate is contained in this
- * widget.
- *
- * @param mouse a mouse-based event
- * @return whether or not a mouse click would be sent to this widget
- */
- public final boolean mouseWouldHit(final TMouseEvent mouse) {
-
- if (!enabled) {
- return false;
- }
-
- if ((mouse.getAbsoluteX() >= getAbsoluteX())
- && (mouse.getAbsoluteX() < getAbsoluteX() + width)
- && (mouse.getAbsoluteY() >= getAbsoluteY())
- && (mouse.getAbsoluteY() < getAbsoluteY() + height)
- ) {
- return true;
- }
- return false;
- }
+ // ------------------------------------------------------------------------
+ // Other TWidget constructors ---------------------------------------------
+ // ------------------------------------------------------------------------
/**
* Convenience function to add a label to this container/window.