/*
 * @(#)GridBagLayout.java	1.18 96/12/23
 * 
 * Copyright (c) 1995, 1996 Sun Microsystems, Inc. All Rights Reserved.
 * 
 * This software is the confidential and proprietary information of Sun
 * Microsystems, Inc. ("Confidential Information").  You shall not
 * disclose such Confidential Information and shall use it only in
 * accordance with the terms of the license agreement you entered into
 * with Sun.
 * 
 * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
 * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
 * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
 * THIS SOFTWARE OR ITS DERIVATIVES.
 * 
 * CopyrightVersion 1.1_beta
 * 
 */

/* This example was taken from the Sun Microsystems, Inc. java.awt.* package
 * and is used solely for educational purposes.  See above copyright.
 * B. F. Caviness 97.07.08
 */

/**
    GridBagLayout is a flexible layout manager
    that aligns components vertically and horizontally,
    without requiring that the components be the same size.
    Each GridBagLayout uses a dynamic rectangular grid of cells,
    with each component occupying one or more cells
    (called its <em>display area</em>).
    Each component managed by a GridBagLayout 
    is associated with a
    <a href=java.awt.GridBagConstraints.html>GridBagConstraints</a> instance
    that specifies how the component is laid out
    within its display area.
    How a GridBagLayout places a set of components
    depends on each component's GridBagConstraints and minimum size,
    as well as the preferred size of the components' container.
    <p>

    To use a GridBagLayout effectively,
    you must customize one or more of its components' GridBagConstraints.
    You customize a GridBagConstraints object by setting one or more
    of its instance variables:
    <dl>
    <dt> <a href=java.awt.GridBagConstraints.html#gridx>gridx</a>,
         <a href=java.awt.GridBagConstraints.html#gridy>gridy</a>
    <dd> Specifies the cell at the upper left of the component's display area,
	 where the upper-left-most cell has address gridx=0, gridy=0.
	 Use GridBagConstraints.RELATIVE (the default value)
	 to specify that the component be just placed
	 just to the right of (for gridx)
	 or just below (for gridy)
	 the component that was added to the container
	 just before this component was added.
    <dt> <a href=java.awt.GridBagConstraints.html#gridwidth>gridwidth</a>,
         <a href=java.awt.GridBagConstraints.html#gridheight>gridheight</a>
    <dd> Specifies the number of cells in a row (for gridwidth)
	 or column (for gridheight)
	 in the component's display area.
	 The default value is 1.
	 Use GridBagConstraints.REMAINDER to specify 
	 that the component be the last one in its row (for gridwidth)
	 or column (for gridheight).
	 Use GridBagConstraints.RELATIVE to specify 
	 that the component be the next to last one
	 in its row (for gridwidth) or column (for gridheight).
    <dt> <a href=java.awt.GridBagConstraints.html#fill>fill</a>
    <dd> Used when the component's display area
   	 is larger than the component's requested size
	 to determine whether (and how) to resize the component.
	 Valid values are
	      GridBagConstraints.NONE
	      (the default),
	      GridBagConstraints.HORIZONTAL
	      (make the component wide enough to fill its display area
	      horizontally, but don't change its height),
	      GridBagConstraints.VERTICAL
	      (make the component tall enough to fill its display area
	      vertically, but don't change its width),
	      and 
	      GridBagConstraints.BOTH
	      (make the component fill its display area entirely).
    <dt> <a href=java.awt.GridBagConstraints.html#ipadx>ipadx</a>,
         <a href=java.awt.GridBagConstraints.html#ipady>ipady</a>
    <dd> Specifies the internal padding: 
	 how much to add to the minimum size of the component.
	 The width of the component will be at least
	 its minimum width plus ipadx*2 pixels
	 (since the padding applies to both sides of the component).
	 Similarly, the height of the component will be at least
	 the minimum height plus ipady*2 pixels.
    <dt> <a href=java.awt.GridBagConstraints.html#insets>insets</a>
    <dd> Specifies the external padding of the component --
	 the minimum amount of space between the component 
	 and the edges of its display area.
    <dt> <a href=java.awt.GridBagConstraints.html#anchor>anchor</a>
    <dd> Used when the component is smaller than its display area
	 to determine where (within the area) to place the component.
	 Valid values are
	 GridBagConstraints.CENTER (the default),
	 GridBagConstraints.NORTH,
	 GridBagConstraints.NORTHEAST,
	 GridBagConstraints.EAST,
	 GridBagConstraints.SOUTHEAST,
	 GridBagConstraints.SOUTH,
	 GridBagConstraints.SOUTHWEST,
	 GridBagConstraints.WEST, and
	 GridBagConstraints.NORTHWEST.
    <dt> <a href=java.awt.GridBagConstraints.html#weightx>weightx</a>,
         <a href=java.awt.GridBagConstraints.html#weighty>weighty</a>
    <dd> Used to determine how to distribute space;
	 this is important for specifying resizing behavior.
	 Unless you specify a weight
	 for at least one component in a row (weightx)
	 and column (weighty),
	 all the components clump together in the center of
	 their container.
	 This is because when the weight is zero (the default),
	 the GridBagLayout puts any extra space 
	 between its grid of cells and the edges of the container.
    </dl>

    The following figure shows ten components (all buttons)
    managed by a GridBagLayout:
    <blockquote>
    <img src=images/java.awt/GridBagEx.gif width=262 height=155>
    </blockquote>

    All the components have fill=GridBagConstraints.BOTH.
    In addition, the components have the following non-default constraints:
    <ul>
    <li>Button1, Button2, Button3:
        weightx=1.0
    <li>Button4:
        weightx=1.0,
        gridwidth=GridBagConstraints.REMAINDER
    <li>Button5:
        gridwidth=GridBagConstraints.REMAINDER
    <li>Button6:
        gridwidth=GridBagConstraints.RELATIVE
    <li>Button7:
        gridwidth=GridBagConstraints.REMAINDER
    <li>Button8:
        gridheight=2, weighty=1.0,
    <li>Button9, Button 10:
        gridwidth=GridBagConstraints.REMAINDER
    </ul>

    Here is the code that implements the example shown above:
 */

import java.awt.*;
import java.util.*;
import java.applet.Applet;

public class GridBagEx1 extends Applet {

    // Construct button and add to container w constraints
    protected void makebutton(String name,
                              GridBagLayout gridbag,
                              GridBagConstraints c) {
        Button button = new Button(name);
        gridbag.setConstraints(button, c);
        add(button);
    }

    // Similar to a constructor for an applet
    public void init() {
        GridBagLayout gridbag = new GridBagLayout();
        GridBagConstraints c = new GridBagConstraints();
 
        setFont(new Font("Helvetica", Font.PLAIN, 14));
        setLayout(gridbag);
 
        c.fill = GridBagConstraints.BOTH;
        c.weightx = 1.0;
        makebutton("Button1", gridbag, c);
        makebutton("Button2", gridbag, c);
        makebutton("Button3", gridbag, c);
 
        c.gridwidth = GridBagConstraints.REMAINDER; //end row
        makebutton("Button4", gridbag, c);
 
        c.weightx = 0.0;                   //reset to the default
        makebutton("Button5", gridbag, c); //another row
 
        c.gridwidth = GridBagConstraints.RELATIVE; //next-to-last in row
        makebutton("Button6", gridbag, c);
 
        c.gridwidth = GridBagConstraints.REMAINDER; //end row
        makebutton("Button7", gridbag, c);
 
        c.gridwidth = 1;                   //reset to the default
        c.gridheight = 2;
        c.weighty = 1.0;
        makebutton("Button8", gridbag, c);
 
        c.weighty = 0.0;                   //reset to the default
        c.gridwidth = GridBagConstraints.REMAINDER; //end row
        c.gridheight = 1;                  //reset to the default
        makebutton("Button9", gridbag, c);
        makebutton("Button10", gridbag, c);

        setSize(300, 100);
    }

    public static void main(String args[]) {
        Frame f = new Frame("GridBag Layout Example");
        GridBagEx1 ex1 = new GridBagEx1();

        ex1.init();

        f.add("Center", ex1);
        f.pack();		// Initialize layout mgt & initialize size
        f.setSize(f.getPreferredSize());
        f.show();
    }
}
