SWT Jface Eclipse Java

/******************************************************************************
 * 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();
  }
}