Java tutorial
/****************************************************************************** * Copyright (c) 1998, 2004 Jackwind Li Guojie * All right reserved. * * Created on Jan 30, 2004 11:52:21 PM by JACK * $Id$ * * visit: http://www.asprise.com/swt *****************************************************************************/ 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; import org.eclipse.swt.widgets.Layout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; /** * Lays out a composite, arranging and resizing its components to fit in five * regions: north, south, east, west, and center. */ class BorderLayout extends Layout { // Region constants. public static final int NORTH = 0; public static final int SOUTH = 1; public static final int CENTER = 2; public static final int EAST = 3; public static final int WEST = 4; /** * Indicates the region that a control belongs to. * */ public static class BorderData { public int region = CENTER; // default. public BorderData() { } public BorderData(int region) { this.region = region; } } // Controls in all the regions. public Control[] controls = new Control[5]; // Cached sizes. Point[] sizes; // Preferred width and height int width; int height; /* * (non-Javadoc) * * @see org.eclipse.swt.widgets.Layout#computeSize(org.eclipse.swt.widgets.Composite, * int, int, boolean) */ protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) { if (sizes == null || flushCache == true) refreshSizes(composite.getChildren()); int w = wHint; int h = hHint; if (w == SWT.DEFAULT) w = width; if (h == SWT.DEFAULT) h = height; return new Point(w, h); } /* * (non-Javadoc) * * @see org.eclipse.swt.widgets.Layout#layout(org.eclipse.swt.widgets.Composite, * boolean) */ protected void layout(Composite composite, boolean flushCache) { if (flushCache || sizes == null) refreshSizes(composite.getChildren()); Rectangle clientArea = composite.getClientArea(); // Enough space for all. if (controls[NORTH] != null) { controls[NORTH].setBounds(clientArea.x, clientArea.y, clientArea.width, sizes[NORTH].y); } if (controls[SOUTH] != null) { controls[SOUTH].setBounds(clientArea.x, clientArea.y + clientArea.height - sizes[SOUTH].y, clientArea.width, sizes[SOUTH].y); } if (controls[WEST] != null) { controls[WEST].setBounds(clientArea.x, clientArea.y + sizes[NORTH].y, sizes[WEST].x, clientArea.height - sizes[NORTH].y - sizes[SOUTH].y); } if (controls[EAST] != null) { controls[EAST].setBounds(clientArea.x + clientArea.width - sizes[EAST].x, clientArea.y + sizes[NORTH].y, sizes[EAST].x, clientArea.height - sizes[NORTH].y - sizes[SOUTH].y); } if (controls[CENTER] != null) { controls[CENTER].setBounds(clientArea.x + sizes[WEST].x, clientArea.y + sizes[NORTH].y, clientArea.width - sizes[WEST].x - sizes[EAST].x, clientArea.height - sizes[NORTH].y - sizes[SOUTH].y); } } private void refreshSizes(Control[] children) { for (int i = 0; i < children.length; i++) { Object layoutData = children[i].getLayoutData(); if (layoutData == null || (!(layoutData instanceof BorderData))) continue; BorderData borderData = (BorderData) layoutData; if (borderData.region < 0 || borderData.region > 4) // Invalid. continue; controls[borderData.region] = children[i]; } width = 0; height = 0; if (sizes == null) sizes = new Point[5]; for (int i = 0; i < controls.length; i++) { Control control = controls[i]; if (control == null) { sizes[i] = new Point(0, 0); } else { sizes[i] = control.computeSize(SWT.DEFAULT, SWT.DEFAULT, true); } } width = Math.max(width, sizes[NORTH].x); width = Math.max(width, sizes[WEST].x + sizes[CENTER].x + sizes[EAST].x); width = Math.max(width, sizes[SOUTH].x); height = Math.max(Math.max(sizes[WEST].y, sizes[EAST].y), sizes[CENTER].y) + sizes[NORTH].y + sizes[SOUTH].y; } } /****************************************************************************** * Copyright (c) 1998, 2004 Jackwind Li Guojie * All right reserved. * * Created on Jan 31, 2004 1:05:58 AM by JACK * $Id$ * * visit: http://www.asprise.com/swt *****************************************************************************/ public class BorderLayoutSample { Display display = new Display(); Shell shell = new Shell(display); public BorderLayoutSample() { shell.setLayout(new BorderLayout()); Button buttonWest = new Button(shell, SWT.PUSH); buttonWest.setText("West"); buttonWest.setLayoutData(new BorderLayout.BorderData(BorderLayout.WEST)); Button buttonEast = new Button(shell, SWT.PUSH); buttonEast.setText("East"); buttonEast.setLayoutData(new BorderLayout.BorderData(BorderLayout.EAST)); Button buttonNorth = new Button(shell, SWT.PUSH); buttonNorth.setText("North"); buttonNorth.setLayoutData(new BorderLayout.BorderData(BorderLayout.NORTH)); Button buttonSouth = new Button(shell, SWT.PUSH); buttonSouth.setText("South"); buttonSouth.setLayoutData(new BorderLayout.BorderData(BorderLayout.SOUTH)); Text text = new Text(shell, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); text.setText("Center"); text.setLayoutData(new BorderLayout.BorderData(BorderLayout.CENTER)); shell.pack(); shell.open(); //textUser.forceFocus(); // Set up the event loop. while (!shell.isDisposed()) { if (!display.readAndDispatch()) { // If no more entries in event queue display.sleep(); } } display.dispose(); } private void init() { } public static void main(String[] args) { new BorderLayoutSample(); } }