// ListPanel.java

package lab07;

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

/**
 * This panel corresponds to the List tab in the tabbed pane.
 *
 * @author J.K. Daugherty
 */
public class ListPanel extends JPanel {
    private JFrame frame;               // Toplevel window

    private List list = new List();
    private DisplayPanel display = new DisplayPanel (list);
    
    private JButton btnAdd;
    private JButton btnAppend;
    private JButton btnSet;
    private JButton btnExit;
    private JButton btnRemove;
    private JButton btnGet;
    private JButton btnClear;
    private JTextField fldAddValue;
    private JTextField fldAddIndex;
    private JTextField fldReplacedValue;
    private JTextField fldSize;
    private JTextField fldRemoveValue;
    private JTextField fldRemoveIndex;
    private JPanel controlPanel;
    private JPanel topControlPanel;
    private JPanel bottomControlPanel;
    private JPanel statusPanel;
    private JLabel lblSize;

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

    private void initComponents() {
        controlPanel = new JPanel();
        topControlPanel = new JPanel();
        bottomControlPanel = new JPanel();
        fldAddValue = new JTextField();
        fldAddIndex = new JTextField();
        btnAdd = new JButton();
        btnSet = new JButton();
        fldReplacedValue = new JTextField();
        btnAppend = new JButton();
        fldRemoveValue = new JTextField();
        fldRemoveIndex = new JTextField();
        btnRemove = new JButton();
        btnGet = new JButton();
        btnClear = new JButton();
        btnExit = new JButton();
        statusPanel = new JPanel();
        lblSize = new JLabel();
        fldSize = new JTextField();
        fldSize.setText("" + list.size());

        topControlPanel.setBackground(Color.WHITE);
        bottomControlPanel.setBackground(Color.WHITE);

        topControlPanel.add (new JLabel("Value:"));

        fldAddValue.setColumns(5);
        fldAddValue.setToolTipText("Value to add");
        fldAddValue.setPreferredSize(new java.awt.Dimension(66, 28));
        fldAddValue.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                fldAddValueActionPerformed(evt);
            }
        });
        topControlPanel.add(fldAddValue);

        btnAppend.setText("Add To Rear");
        btnAppend.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAppendActionPerformed(evt);
            }
        });
        topControlPanel.add(btnAppend);

        topControlPanel.add (new JLabel("Index:"));

        fldAddIndex.setColumns(3);
        fldAddIndex.setText("0");
        fldAddIndex.setHorizontalAlignment(JTextField.RIGHT);
        fldAddIndex.setToolTipText("Index of value to add/set");
        fldAddIndex.setPreferredSize(new java.awt.Dimension(66, 28));
        fldAddIndex.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                fldAddIndexActionPerformed(evt);
            }
        });
        topControlPanel.add(fldAddIndex);

        btnAdd.setText("Add");
        btnAdd.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAddActionPerformed(evt);
            }
        });
        topControlPanel.add(btnAdd);

        btnSet.setText("Set");
        btnSet.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnSetActionPerformed(evt);
            }
        });
        topControlPanel.add(btnSet);

        fldReplacedValue.setColumns(5);
        fldReplacedValue.setToolTipText("Value replaced by Set action");
        fldReplacedValue.setEditable(false);
        fldReplacedValue.setPreferredSize(new java.awt.Dimension(66, 28));
        topControlPanel.add(fldReplacedValue);
        
        topControlPanel.add (new JLabel("        "));
        topControlPanel.add (new JLabel("Index:"));

        fldRemoveIndex.setColumns(3);
        fldRemoveIndex.setText("0");
        fldRemoveIndex.setHorizontalAlignment(JTextField.RIGHT);
        fldRemoveIndex.setToolTipText("Index of value to remove/get");
        fldRemoveIndex.setEditable(true);
        fldRemoveIndex.setPreferredSize(new java.awt.Dimension(66, 28));
        topControlPanel.add(fldRemoveIndex);

        btnRemove.setText("Remove");
        btnRemove.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnRemoveActionPerformed(evt);
            }
        });
        topControlPanel.add(btnRemove);

        btnGet.setText("Get");
        btnGet.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnGetActionPerformed(evt);
            }
        });
        topControlPanel.add(btnGet);

        fldRemoveValue.setColumns(5);
        fldRemoveValue.setEditable(false);
        fldRemoveValue.setPreferredSize(new java.awt.Dimension(66, 28));
        topControlPanel.add(fldRemoveValue);

        btnClear.setText("Clear");
        btnClear.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnClearActionPerformed(evt);
            }
        });
        bottomControlPanel.add(btnClear);

        bottomControlPanel.setBackground(Color.WHITE);
        btnExit.setText("Exit");
        btnExit.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnExitActionPerformed(evt);
            }
        });
        bottomControlPanel.add(btnExit);
        
        controlPanel.setLayout (new GridLayout(2,1));
        controlPanel.add(topControlPanel);
        controlPanel.add(bottomControlPanel);


        statusPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 10, 5));

        statusPanel.setBackground(new java.awt.Color(255, 255, 255));
        lblSize.setHorizontalAlignment(SwingConstants.RIGHT);
        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 fldAddValueActionPerformed(java.awt.event.ActionEvent evt) {
        appendItem();
    }

    private void fldAddIndexActionPerformed(java.awt.event.ActionEvent evt) {
        addItem();
    }

    private void btnClearActionPerformed(java.awt.event.ActionEvent evt) {
        list.removeAll();
        fldSize.setText("" + list.size());
        fldAddValue.setText("");
        fldAddIndex.setText("0");
        fldRemoveValue.setText("");
        fldRemoveIndex.setText("0");
        display.repaint();
    }

    private void btnExitActionPerformed(java.awt.event.ActionEvent evt) {
        frame.dispose();
        //System.exit(0);
    }

    private void btnRemoveActionPerformed(java.awt.event.ActionEvent evt) {
        try {
            int index = Integer.parseInt (fldRemoveIndex.getText());
            fldRemoveValue.setText ((String) list.remove(index));
            fldSize.setText("" + list.size());
            display.repaint();
        }
        catch (NumberFormatException e) {
            JOptionPane.showMessageDialog (this,
                e.getMessage(), "Invalid Integer Format",
                JOptionPane.ERROR_MESSAGE);
            fldRemoveValue.setText("");            
        }
        catch (IndexOutOfBoundsException e) {
            JOptionPane.showMessageDialog (this,
                e.getMessage(), "Remove Error",
                JOptionPane.ERROR_MESSAGE);
            fldRemoveValue.setText("");
        }
    }

    private void btnGetActionPerformed(java.awt.event.ActionEvent evt) {
        try {
            int index = Integer.parseInt (fldRemoveIndex.getText());
            Object temp = list.get(index);
            fldRemoveValue.setText (temp.toString());
        }
        catch (NumberFormatException e) {
            JOptionPane.showMessageDialog (this,
                e.getMessage(), "Invalid Integer Format",
                JOptionPane.ERROR_MESSAGE);
            fldRemoveValue.setText("");            
        }
        catch (IndexOutOfBoundsException e) {
            JOptionPane.showMessageDialog (this,
                e.getMessage(), "Get Error",
                JOptionPane.ERROR_MESSAGE);
            fldRemoveValue.setText("");
        }
    }
    
    private void btnAddActionPerformed(java.awt.event.ActionEvent evt) {
        addItem();
    }
    
    private void btnAppendActionPerformed(java.awt.event.ActionEvent evt) {
        appendItem();
    }
    
    private void btnSetActionPerformed(java.awt.event.ActionEvent evt) {
        setItem();
    }
    
    private void setItem () {
        try {
            int index = Integer.parseInt (fldAddIndex.getText());
            String value = fldAddValue.getText();

            fldReplacedValue.setText (list.set(index, value).toString());

            fldAddValue.grabFocus();
            fldAddValue.setSelectionStart(0);
            fldAddValue.setSelectionEnd (fldAddValue.getText().length());
            display.repaint();
        }
        catch (NumberFormatException e) {
            JOptionPane.showMessageDialog (this,
                e.getMessage(), "Invalid Integer Format",
                JOptionPane.ERROR_MESSAGE);
            fldRemoveValue.setText("");            
        }
        catch (IndexOutOfBoundsException e) {
            JOptionPane.showMessageDialog (this,
                e.getMessage(), "Set Error",
                JOptionPane.ERROR_MESSAGE);
            fldRemoveValue.setText("");
        }
    }
    
    private void addItem () {
        try {
            int index = Integer.parseInt (fldAddIndex.getText());
            String value = fldAddValue.getText();

            list.add (index, value);

            fldAddValue.grabFocus();
            fldAddValue.setSelectionStart(0);
            fldAddValue.setSelectionEnd (fldAddValue.getText().length());
            fldSize.setText("" + list.size());
            display.repaint();
        }
        catch (NumberFormatException e) {
            JOptionPane.showMessageDialog (this,
                e.getMessage(), "Invalid Integer Format",
                JOptionPane.ERROR_MESSAGE);
            fldRemoveValue.setText("");            
        }
        catch (IndexOutOfBoundsException e) {
            JOptionPane.showMessageDialog (this,
                e.getMessage(), "Add Error",
                JOptionPane.ERROR_MESSAGE);
            fldRemoveValue.setText("");
        }
    }

    private void appendItem () {
        try {
            list.add (fldAddValue.getText());

            fldAddValue.grabFocus();
            fldAddValue.setSelectionStart(0);
            fldAddValue.setSelectionEnd (fldAddValue.getText().length());
            fldAddIndex.setText("" + list.size());
            fldSize.setText("" + list.size());
            display.repaint();
        }
        catch (IllegalStateException e) {
            JOptionPane.showMessageDialog (this,
                e.getMessage(), "Append Error",
                JOptionPane.ERROR_MESSAGE);
        }
    }
}
