/*
 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Oracle nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * This source code is provided to illustrate the usage of a given feature
 * or technique and has been deliberately simplified. Additional steps
 * required for a production-quality application, such as security checks,
 * input validation and proper error handling, might not be present in
 * this sample code.
 */



import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Choice;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.LayoutManager;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;


@SuppressWarnings("serial")
final class CardPanel extends Panel {

    ActionListener listener;

    Panel create(LayoutManager layout) {
        Button b = null;
        Panel p = new Panel();

        p.setLayout(layout);

        b = new Button("one");
        b.addActionListener(listener);
        p.add("North", b);

        b = new Button("two");
        b.addActionListener(listener);
        p.add("West", b);

        b = new Button("three");
        b.addActionListener(listener);
        p.add("South", b);

        b = new Button("four");
        b.addActionListener(listener);
        p.add("East", b);

        b = new Button("five");
        b.addActionListener(listener);
        p.add("Center", b);

        b = new Button("six");
        b.addActionListener(listener);
        p.add("Center", b);

        return p;
    }

    CardPanel(ActionListener actionListener) {
        listener = actionListener;
        setLayout(new CardLayout());
        add("one", create(new FlowLayout()));
        add("two", create(new BorderLayout()));
        add("three", create(new GridLayout(2, 2)));
        add("four", create(new BorderLayout(10, 10)));
        add("five", create(new FlowLayout(FlowLayout.LEFT, 10, 10)));
        add("six", create(new GridLayout(2, 2, 10, 10)));
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200, 100);
    }
}


@SuppressWarnings("serial")
public class CardTest extends Applet
        implements ActionListener,
        ItemListener {

    CardPanel cards;

    @SuppressWarnings("LeakingThisInConstructor")
    public CardTest() {
        setLayout(new BorderLayout());
        add("Center", cards = new CardPanel(this));
        Panel p = new Panel();
        p.setLayout(new FlowLayout());
        add("South", p);

        Button b = new Button("first");
        b.addActionListener(this);
        p.add(b);

        b = new Button("next");
        b.addActionListener(this);
        p.add(b);

        b = new Button("previous");
        b.addActionListener(this);
        p.add(b);

        b = new Button("last");
        b.addActionListener(this);
        p.add(b);

        Choice c = new Choice();
        c.addItem("one");
        c.addItem("two");
        c.addItem("three");
        c.addItem("four");
        c.addItem("five");
        c.addItem("six");
        c.addItemListener(this);
        p.add(c);
    }

    @Override
    public void itemStateChanged(ItemEvent e) {
        ((CardLayout) cards.getLayout()).show(cards,
                (String) (e.getItem()));
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String arg = e.getActionCommand();

        if ("first".equals(arg)) {
            ((CardLayout) cards.getLayout()).first(cards);
        } else if ("next".equals(arg)) {
            ((CardLayout) cards.getLayout()).next(cards);
        } else if ("previous".equals(arg)) {
            ((CardLayout) cards.getLayout()).previous(cards);
        } else if ("last".equals(arg)) {
            ((CardLayout) cards.getLayout()).last(cards);
        } else {
            ((CardLayout) cards.getLayout()).show(cards, arg);
        }
    }

    public static void main(String args[]) {
        Frame f = new Frame("CardTest");
        CardTest cardTest = new CardTest();
        cardTest.init();
        cardTest.start();

        f.add("Center", cardTest);
        f.setSize(300, 300);
        f.setVisible(true);
    }

    @Override
    public String getAppletInfo() {
        return "Demonstrates the different types of layout managers.";
    }
}