import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

/**
 * Constraints:
 * <ul>
 * <li>Event 2 cannot be performed immediately after Event 1.</li>
 * <li>Event 4 cannot be performed immediately after (Event 2, Event 3).</li>
 * <li>Event 3 should be performed before Event 5, otherwise, Event 5 cannot be
 * performed.</li>
 * <li>Any other combinations are all allowed.</li>
 * </ul>
 * 
 * Implementation for the constraints:
 * <ul>
 * <li>Clicking button "Event 1" disables button "Event 2" at any time.</li>
 * <li>A click on button "Event 2" followed by a click on "Event 3" disables
 * button "Event 4" at any time.</li>
 * <li>Button "Event 5" is disabled at startup, and a click on button "Event 3"
 * enables button "Event 5". After that, button "Event 5" is enabled all the time.
 * </ul>
 * 
 * @author Si Huang
 */
public class SimpleFrameCompound extends JFrame {
    private static final long serialVersionUID = 1L;

    private JButton event1;
    private JButton event2;
    private JButton event3;
    private JButton event4;
    private JButton event5;
    // private JButton exitButton;
    private JButton lastClicked;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new SimpleFrameCompound().setVisible(true);
            }
        });
    }

    public SimpleFrameCompound() {
        event1 = new JButton("Event 1");
        event1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                event2.setEnabled(false);
                event4.setEnabled(true);
                lastClicked = event1;
            }
        });
        event2 = new JButton("Event 2");
        event2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                event4.setEnabled(true);
                lastClicked = event2;
            }
        });
        event3 = new JButton("Event 3");
        event3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                event2.setEnabled(true);
                if (lastClicked == event2) {
                    event4.setEnabled(false);
                } else {
                    event4.setEnabled(true);
                }
                event5.setEnabled(true);
                lastClicked = event3;
            }
        });
        event4 = new JButton("Event 4");
        event4.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                event2.setEnabled(true);
                lastClicked = event4;
            }
        });
        event5 = new JButton("Event 5");
        event5.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                event2.setEnabled(true);
            }
        });
        event5.setEnabled(false);
        /*
         * exitButton = new JButton("Exit"); exitButton.addActionListener(new
         * ActionListener() { public void actionPerformed(ActionEvent e) {
         * System.exit(0); } });
         */

        setLayout(new FlowLayout());
        add(event1);
        add(event2);
        add(event3);
        add(event4);
        add(event5);
        // add(exitButton);

        setTitle("SimpleFrame");
        setResizable(false);
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        pack();

        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        setLocation((screenSize.width - getWidth()) / 2, (screenSize.height - getHeight()) / 2);
    }
}
