// StackPanel.java

package lab07;

import java.awt.*;
import javax.swing.*;

/**
 * This panel corresponds to the Stack tab in the tabbed pane.
 *
 * @author jdaugher
 */
public class StackPanel extends JPanel {
    private JFrame frame;               // Toplevel window

    private Stack stack = new Stack();
    private DisplayPanel display = new DisplayPanel (stack);

    private JPanel controlPanel;
    private JPanel statusPanel;

    private JButton btnExit;
    private JButton btnPop;
    private JButton btnPush;
    private JButton btnClear;
    private JTextField fldSize;
    private JTextField fldPop;
    private JTextField fldPush;
    private JLabel lblSize;

    public StackPanel(JFrame frame) {
        this.frame = frame;
        initComponents();
    }

    private void initComponents() {
        controlPanel = new JPanel();
        fldPush = new JTextField();
        btnPush = new JButton();
        fldPop = new JTextField();
        btnPop = new JButton();
        btnClear = new JButton();
        btnExit = new JButton();
        statusPanel = new JPanel();
        lblSize = new JLabel();
        fldSize = new JTextField();

        controlPanel.setBackground(new java.awt.Color(255, 255, 255));
        fldPush.setColumns(5);
        fldPush.setToolTipText(
                "Enter a String to push onto the stack");
        fldPush.setPreferredSize(new java.awt.Dimension(66, 28));
        fldPush.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                fldPushActionPerformed(evt);
            }
        });

        controlPanel.add(fldPush);

        btnPush.setText("Push");
        btnPush.setToolTipText("Push the String onto the stack");
        btnPush.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnPushActionPerformed(evt);
            }
        });
        controlPanel.add(btnPush);

        fldPop.setColumns(5);
        fldPop.setEditable(false);
        fldPop.setToolTipText("Value most recently popped from the stack");
        fldPop.setPreferredSize(new java.awt.Dimension(66, 28));
        controlPanel.add(fldPop);

        btnPop.setText("Pop");
        btnPop.setToolTipText("Pop the topmost value from the stack");
        btnPop.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnPopActionPerformed(evt);
            }
        });
        controlPanel.add(btnPop);

        btnClear.setText("Clear");
        btnClear.setToolTipText("Removes all values from the stack");
        btnClear.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnClearActionPerformed(evt);
            }
        });
        controlPanel.add(btnClear);

        btnExit.setText("Exit");
        btnExit.setToolTipText("Exits this application");
        btnExit.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnExitActionPerformed(evt);
            }
        });
        controlPanel.add(btnExit);

        statusPanel.setBackground(new java.awt.Color(255, 255, 255));
        lblSize.setText("Current size:");
        statusPanel.add(lblSize);

        fldSize.setColumns(2);
        fldSize.setEditable(false);
        fldSize.setFont(
                new java.awt.Font("Microsoft Sans Serif", 1, 13));
        fldSize.setHorizontalAlignment(JTextField.RIGHT);
        fldSize.setText("0");
        fldSize.setPreferredSize(new java.awt.Dimension(35, 20));
        statusPanel.add(fldSize);

        setLayout (new BorderLayout());
        add (statusPanel, BorderLayout.NORTH);
        add (display, BorderLayout.CENTER);
        add (controlPanel, BorderLayout.SOUTH);
    }

    private void fldPushActionPerformed(java.awt.event.ActionEvent evt) {
        pushValue();
    }

    private void btnExitActionPerformed(java.awt.event.ActionEvent evt) {
 //       setVisible (false);
        frame.dispose();
    }

    private void btnClearActionPerformed(java.awt.event.ActionEvent evt) {
        stack.removeAll();
        fldSize.setText ("" + stack.size());
        fldPop.setText ("");
        display.repaint();
    }

    private void btnPopActionPerformed(java.awt.event.ActionEvent evt) {
        try {
            String temp = (String) stack.pop();
            fldPop.setText (temp);
            fldSize.setText ("" + stack.size());
            display.repaint();
        }
        catch (IllegalStateException e) {
            fldPop.setText ("");
             JOptionPane.showMessageDialog (this, e.getMessage());
        }
    }

    private void btnPushActionPerformed(java.awt.event.ActionEvent evt) {
        pushValue();
    }
    
    private void pushValue() {
        stack.push (fldPush.getText());
        display.repaint();
        fldPush.setText("");
        fldSize.setText ("" + stack.size());        
    }
}
