/* * ----------------------------------------------------------------------------- * (c) Copyright IBM Corp. 2003 All rights reserved. The sample program(s) * is/are owned by International Business Machines Corporation or one of its * subsidiaries ("IBM") and is/are copyrighted and licensed, not sold. You may * copy, modify, and distribute this/these sample program(s) in any form without * payment to IBM, for any purpose including developing, using, marketing or * distributing programs that include or are derivative works of the sample * program(s). The sample program(s) is/are provided to you on an "AS IS" basis, * without warranty of any kind. IBM HEREBY EXPRESSLY DISCLAIMS ALL WARRANTIES, * EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Some * jurisdictions do not allow for the exclusion or limitation of implied * warranties, so the above limitations or exclusions may not apply to you. IBM * shall not be liable for any damages you suffer as a result of using, * modifying or distributing the sample program(s) or its/their derivatives. * Each copy of any portion of this/these sample program(s) or any derivative * work, must include the above copyright notice and disclaimer of warranty. * ----------------------------------------------------------------------------- */ package swing2swt.layout; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; /** * Port of AWT GridLayout to SWT. * * @author Yannick Saillet */ public class GridLayout extends AWTLayout { private int rows, columns, hgap, vgap; public GridLayout() { this(1, 0); } public GridLayout(int rows, int columns) { this(rows, columns, 0, 0); } public GridLayout(int rows, int columns, int hgap, int vgap) { if (rows == 0 && columns == 0) throw new IllegalArgumentException("rows and cols cannot both be zero"); if (rows > 0 && columns > 0) columns = 0; this.rows = rows; this.columns = columns; this.hgap = hgap; this.vgap = vgap; } public int getColumns() { return columns; } public int getHgap() { return hgap; } public int getRows() { return rows; } public int getVgap() { return vgap; } public void setColumns(int cols) { if (rows == 0 && columns == 0) throw new IllegalArgumentException("rows and cols cannot both be zero"); this.columns = cols; } public void setHgap(int hgap) { this.hgap = hgap; } public void setRows(int rows) { if (rows == 0 && columns == 0) throw new IllegalArgumentException("rows and cols cannot both be zero"); this.rows = rows; } public void setVgap(int vgap) { this.vgap = vgap; } // ---------- protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) { Control[] children = composite.getChildren(); int nbOfVisibleChildren = 0; for (int i = 0; i < children.length; i++) { // if (children[i].isVisible()) nbOfVisibleChildren++; } if (nbOfVisibleChildren == 0) return new Point(0, 0); int r = rows; int c = columns; if (r == 0) r = nbOfVisibleChildren / c + ((nbOfVisibleChildren % c) == 0 ? 0 : 1); else if (c == 0) c = nbOfVisibleChildren / r + ((nbOfVisibleChildren % r) == 0 ? 0 : 1); int width = 0; int height = 0; for (int i = 0; i < children.length; i++) { // if (!children[i].isVisible()) // continue; Point size = getPreferredSize(children[i], SWT.DEFAULT, SWT.DEFAULT, flushCache); if (size.x > width) width = size.x; if (size.y > height) height = size.y; } return new Point(c * width + (c - 1) * hgap, r * height + (r - 1) * vgap); } protected void layout(Composite composite, boolean flushCache) { Rectangle clientArea = composite.getClientArea(); Control[] children = composite.getChildren(); int nbOfVisibleChildren = 0; for (int i = 0; i < children.length; i++) { // if (children[i].isVisible()) nbOfVisibleChildren++; } if (nbOfVisibleChildren == 0) return; int r = rows; int c = columns; if (r == 0) r = nbOfVisibleChildren / c + ((nbOfVisibleChildren % c) == 0 ? 0 : 1); else if (c == 0) c = nbOfVisibleChildren / r + ((nbOfVisibleChildren % r) == 0 ? 0 : 1); int width = (clientArea.width - (c - 1) * hgap) / c; int height = (clientArea.height - (r - 1) * vgap) / r; int x = clientArea.x; int y = clientArea.y; for (int i = 0; i < children.length; i++) { // if (!children[i].isVisible()) // continue; children[i].setBounds(x, y, width, height); if (((i + 1) % c) == 0) // if new line { x = clientArea.x; y += height + vgap; } else x += width + hgap; } } }