blob: 753b136fb96ec706a5b33fc3062ba68395d2953e [file] [log] [blame]
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* JFlex 1.4.3 *
* Copyright (C) 1998-2009 Gerwin Klein <lsf@jflex.de> *
* All rights reserved. *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License. See the file *
* COPYRIGHT for more information. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
package JFlex.gui;
import java.awt.*;
import java.util.*;
/**
* Grid layout manager like GridLayout but with predefinable
* grid size.
*
* @author Gerwin Klein
* @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $
*/
public class GridPanel extends Panel implements Handles {
private int cols;
private int rows;
private int hgap;
private int vgap;
private Vector constraints = new Vector();
private Insets insets = new Insets(0,0,0,0);
public GridPanel(int cols, int rows) {
this(cols, rows, 0, 0);
}
public GridPanel(int cols, int rows, int hgap, int vgap) {
this.cols = cols;
this.rows = rows;
this.hgap = hgap;
this.vgap = vgap;
}
public void doLayout() {
Dimension size = getSize();
size.height -= insets.top+insets.bottom;
size.width -= insets.left+insets.right;
float cellWidth = size.width/cols;
float cellHeight = size.height/rows;
for (int i = 0; i < constraints.size(); i++) {
GridPanelConstraint c = (GridPanelConstraint) constraints.elementAt(i);
float x = cellWidth * c.x + insets.left + hgap/2;
float y = cellHeight * c.y + insets.right + vgap/2;
float width, height;
if (c.handle == FILL) {
width = (cellWidth-hgap) * c.width;
height = (cellHeight-vgap) * c.height;
}
else {
Dimension d = c.component.getPreferredSize();
width = d.width;
height = d.height;
}
switch (c.handle) {
case TOP_CENTER:
x+= (cellWidth+width)/2;
break;
case TOP_RIGHT:
x+= cellWidth-width;
break;
case CENTER_LEFT:
y+= (cellHeight+height)/2;
break;
case CENTER:
x+= (cellWidth+width)/2;
y+= (cellHeight+height)/2;
break;
case CENTER_RIGHT:
y+= (cellHeight+height)/2;
x+= cellWidth-width;
break;
case BOTTOM:
y+= cellHeight-height;
break;
case BOTTOM_CENTER:
x+= (cellWidth+width)/2;
y+= cellHeight-height;
break;
case BOTTOM_RIGHT:
y+= cellHeight-height;
x+= cellWidth-width;
break;
}
c.component.setBounds(new Rectangle((int)x, (int)y, (int)width, (int)height));
}
}
public Dimension getPreferredSize() {
float dy = 0;
float dx = 0;
for (int i = 0; i < constraints.size(); i++) {
GridPanelConstraint c = (GridPanelConstraint) constraints.elementAt(i);
Dimension d = c.component.getPreferredSize();
dx = Math.max(dx, d.width/c.width);
dy = Math.max(dy, d.height/c.height);
}
dx+= hgap;
dy+= vgap;
dx*= cols;
dy*= rows;
dx+= insets.left+insets.right;
dy+= insets.top+insets.bottom;
return new Dimension((int)dx,(int)dy);
}
public void setInsets(Insets insets) {
this.insets = insets;
}
public void add(int x, int y, Component c) {
add(x,y,1,1,FILL,c);
}
public void add(int x, int y, int handle, Component c) {
add(x,y,1,1,handle,c);
}
public void add(int x, int y, int dx, int dy, Component c) {
add(x,y,dx,dy,FILL,c);
}
public void add(int x, int y, int dx, int dy, int handle, Component c) {
super.add(c);
constraints.addElement(new GridPanelConstraint(x,y,dx,dy,handle,c));
}
}