package jas.util.layout; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.LayoutManager2; import java.util.Enumeration; import java.util.Hashtable; /** * Lays out components within a Container such that each component takes a fixed percentage of the size. * * Each Component added to the Container must have a Constraint object that specifies what proportion * of the container it will fill. The Component will be stretched to fill exactly that percentage. * * @see Constraint */ public class PercentLayout implements LayoutManager2 { public void addLayoutComponent(Component component, Object constraint) { if (constraint instanceof Constraint) { hash.put(component,constraint); } else throw new IllegalArgumentException("Invalid constraint"); } public void addLayoutComponent(String constraint, Component comp) { throw new IllegalArgumentException("Invalid constraint"); } public void removeLayoutComponent(Component component) { hash.remove(component); } public Dimension preferredLayoutSize(Container p1) { int prefx=0; int prefy=0; Enumeration keys = hash.keys(); while (keys.hasMoreElements()) { Component comp = (Component) keys.nextElement(); Constraint constraint = (Constraint) hash.get(comp); Dimension pref = comp.getPreferredSize(); prefx += pref.width * 100/constraint.width; prefy += pref.height * 100/constraint.height; } int n = hash.size(); return new Dimension(prefx/n,prefy/n); } public Dimension minimumLayoutSize(Container p1) { int minx=0; int miny=0; Enumeration keys = hash.keys(); while (keys.hasMoreElements()) { Component comp = (Component) keys.nextElement(); Constraint constraint = (Constraint) hash.get(comp); Dimension min = comp.getMinimumSize(); int mx = (int) (min.width * 100/constraint.width); int my = (int) (min.height * 100/constraint.height); if (mx>minx) minx=mx; if (my>miny) miny=my; } return new Dimension(minx,miny); } public Dimension maximumLayoutSize(Container p1) { int maxx=Integer.MAX_VALUE; int maxy=Integer.MAX_VALUE; Enumeration keys = hash.keys(); while (keys.hasMoreElements()) { Component comp = (Component) keys.nextElement(); Constraint constraint = (Constraint) hash.get(comp); Dimension max = comp.getMaximumSize(); int mx = max.width==Integer.MAX_VALUE ? max.width : (int) (max.width * 100/constraint.width); int my = max.height==Integer.MAX_VALUE ? max.height : (int) (max.height * 100/constraint.height); if (mx<maxx) maxx=mx; if (my<maxy) maxy=my; } return new Dimension(maxx,maxy); } public void layoutContainer(Container p1) { Dimension size = p1.getSize(); Enumeration keys = hash.keys(); while (keys.hasMoreElements()) { Component comp = (Component) keys.nextElement(); Constraint constraint = (Constraint) hash.get(comp); int x = (int) (size.width*constraint.x/100); int y = (int) (size.height*constraint.y/100); int width = (int) (size.width*constraint.width/100); int height = (int) (size.height*constraint.height/100); comp.setBounds(x,y,width,height); } } public void invalidateLayout(Container p1) { } public float getLayoutAlignmentY(Container p1) { return 0.5f; } public float getLayoutAlignmentX(Container p1) { return 0.5f; } private Hashtable hash = new Hashtable(); public static class Constraint { /** * Creates a Constraint Object. * @param x The X position of the top left corner of the component (0-100) * @param y The Y position of the top left corner of the component (0-100) * @param width The percentage width of the component (0-100) * @param height The percentage height of the component (0-100) */ public Constraint(double x, double y, double width, double height) { this.x = x; this.y = y; this.width = width; this.height = height; } double x,y,width,height; } }