*/
package jexer.layout;
+import java.awt.Rectangle;
+import java.util.HashMap;
+
import jexer.TWidget;
import jexer.event.TResizeEvent;
// Variables --------------------------------------------------------------
// ------------------------------------------------------------------------
+ /**
+ * Current width.
+ */
+ private int width = 0;
+
+ /**
+ * Current height.
+ */
+ private int height = 0;
+
+ /**
+ * Original width.
+ */
+ private int originalWidth = 0;
+
+ /**
+ * Original height.
+ */
+ private int originalHeight = 0;
+
+ /**
+ * Map of widget to original dimensions.
+ */
+ private HashMap<TWidget, Rectangle> children = new HashMap<TWidget, Rectangle>();
+
// ------------------------------------------------------------------------
// Constructors -----------------------------------------------------------
// ------------------------------------------------------------------------
+ /**
+ * Public constructor.
+ *
+ * @param width the width of the parent widget
+ * @param height the height of the parent widget
+ */
+ public StretchLayoutManager(final int width, final int height) {
+ originalWidth = width;
+ originalHeight = height;
+ this.width = width;
+ this.height = height;
+ }
// ------------------------------------------------------------------------
// LayoutManager ----------------------------------------------------------
* @param resize resize event
*/
public void onResize(final TResizeEvent resize) {
- // TODO
+ if (resize.getType() == TResizeEvent.Type.WIDGET) {
+ width = resize.getWidth();
+ height = resize.getHeight();
+ layoutChildren();
+ }
}
/**
* @param child the widget to manage
*/
public void add(final TWidget child) {
- // TODO
+ Rectangle rect = new Rectangle(child.getX(), child.getY(),
+ child.getWidth(), child.getHeight());
+ children.put(child, rect);
+ layoutChildren();
}
/**
* @param child the widget to remove
*/
public void remove(final TWidget child) {
- // TODO
+ children.remove(child);
+ layoutChildren();
+ }
+
+ /**
+ * Reset a child widget's original/preferred size.
+ *
+ * @param child the widget to manage
+ */
+ public void resetSize(final TWidget child) {
+ // For this layout, adding is the same as replacing.
+ add(child);
+ }
+
+ // ------------------------------------------------------------------------
+ // StretchLayoutManager ---------------------------------------------------
+ // ------------------------------------------------------------------------
+
+ /**
+ * Resize/reposition child widgets based on difference between current
+ * dimensions and the original dimensions.
+ */
+ private void layoutChildren() {
+ double widthRatio = (double) width / originalWidth;
+ if (Math.abs(widthRatio) > Double.MAX_VALUE) {
+ widthRatio = 1;
+ }
+ double heightRatio = (double) height / originalHeight;
+ if (Math.abs(heightRatio) > Double.MAX_VALUE) {
+ heightRatio = 1;
+ }
+ for (TWidget child: children.keySet()) {
+ Rectangle rect = children.get(child);
+ child.setDimensions((int) (rect.getX() * widthRatio),
+ (int) (rect.getY() * heightRatio),
+ (int) (rect.getWidth() * widthRatio),
+ (int) (rect.getHeight() * heightRatio));
+ }
}
}