X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2Flayout%2FStretchLayoutManager.java;h=ee2bf5aba5e5f70d4da15e6376bcd36164b26f7e;hb=12b90437b5f22c2ae6e9b9b14c3b62b60f6143e5;hp=548c04a713cb7b496e708b8550363787265d2825;hpb=6cdd4553f20b84586df10e5f8319b6462bf3bd41;p=nikiroo-utils.git diff --git a/src/jexer/layout/StretchLayoutManager.java b/src/jexer/layout/StretchLayoutManager.java index 548c04a..ee2bf5a 100644 --- a/src/jexer/layout/StretchLayoutManager.java +++ b/src/jexer/layout/StretchLayoutManager.java @@ -28,6 +28,9 @@ */ package jexer.layout; +import java.awt.Rectangle; +import java.util.HashMap; + import jexer.TWidget; import jexer.event.TResizeEvent; @@ -41,10 +44,47 @@ public class StretchLayoutManager implements LayoutManager { // 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 children = new HashMap(); + // ------------------------------------------------------------------------ // 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 ---------------------------------------------------------- @@ -57,7 +97,11 @@ public class StretchLayoutManager implements 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(); + } } /** @@ -66,7 +110,10 @@ public class StretchLayoutManager implements LayoutManager { * @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(); } /** @@ -75,7 +122,44 @@ public class StretchLayoutManager implements LayoutManager { * @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 (!Double.isFinite(widthRatio)) { + widthRatio = 1; + } + double heightRatio = (double) height / originalHeight; + if (!Double.isFinite(heightRatio)) { + 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)); + } } }