/* PhoneBookGUI.java        Authors: Koffman & Wolz
 * GUI for Using the PhoneBook class.
 * Uses Swing, AWT, and PhoneBook.
 */
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class PhoneBookGUI extends JApplet
                          implements ActionListener, ItemListener {
  private JTextField nameText = new JTextField(10);
  private JTextField numberText = new JTextField(10);
  private JRadioButton addRB = new JRadioButton("add entry");
  private JRadioButton getRB = new JRadioButton("get number");
  private JRadioButton changeRB = new JRadioButton("change number");
  private JTextArea instruct = new JTextArea(2, 20);
  private JComboBox nameList = new JComboBox();
  private JButton submit = new JButton("Submit");
  private PhoneBook myPhoneBook = new PhoneBook();

  public void init() {
    // Define the layout manager for the applet.
    getContentPane().setLayout(new FlowLayout());

    // Define operations panel and button group for radio buttons.
    JPanel radButPanel = new JPanel();
    radButPanel.add(addRB);
    radButPanel.add(getRB);
    radButPanel.add(changeRB);
    getContentPane().add(radButPanel);
    ButtonGroup operations = new ButtonGroup();
    operations.add(addRB);
    operations.add(getRB);
    operations.add(changeRB);

    // Add instructions text area to applet.
    instruct.setText("Choose an operation above");
    getContentPane().add(instruct);

    // Define panel for entering name and number.
    JPanel dataPanel = new JPanel();
    JLabel nameLabel = new JLabel("name >> ");
    dataPanel.add(nameLabel);
    dataPanel.add(nameText);
    JLabel numberLabel = new JLabel("number >> ");
    dataPanel.add(numberLabel);
    dataPanel.add(numberText);
    getContentPane().add(dataPanel);

    // Define panel for combo box and submit button.
    JPanel controlPanel = new JPanel();
    nameList.addItem("Select a name >>"); // first selection
    controlPanel.add(nameList);
    controlPanel.add(submit);
    getContentPane().add(controlPanel);

    // Register event listeners.
    addRB.addActionListener(this);
    getRB.addActionListener(this);
    changeRB.addActionListener(this);
    submit.addActionListener(this);
    nameList.addItemListener(this);
  } // end init


  // postcondition: Displays instructions for performing
  //   an operation when a radio button is pressed.
  //   Performs the selected operation when the submit button
  //   is pressed.
  public void actionPerformed(ActionEvent e) {
    String name;
    String number;
    Friend aFriend;
    Object but = e.getSource();
    if (but == addRB)
       instruct.setText("Enter name and number and " +
                        "\nPress submit");
    else if (but == getRB)
       instruct.setText("Select name or enter name." +
                        "\nPress submit");
    else if (but == changeRB)
       instruct.setText("Select name or enter name." +
                        "\nEnter new number and press submit");
    else if (but == submit && addRB.isSelected()) {
       // add new friend
       name = nameText.getText();
       number = numberText.getText();
       if (name.equals("") || number.equals("")) {
          instruct.setText("Missing name or number - " +
                           "\nTry again");
          return;
       }
       aFriend = new Friend(name, number);
       myPhoneBook.addFriend(aFriend);
       nameList.addItem(name);  // add name to combo box list
       instruct.setText("Added: " + aFriend +
                        "\nChoose another operation above" );
       nameText.setText("");
       numberText.setText("");
    }
    else if (but == submit && getRB.isSelected()) {
       // get a number
       name = nameText.getText();
       if (name.equals("")) {
          instruct.setText("Missing name - " +
                           "\nTry again");
          return;
       }
       number = myPhoneBook.getNumber(name);
       instruct.setText("Number is " + number +
                        "\nChoose another operation above");
       nameText.setText("");
    }
    else if (but == submit && changeRB.isSelected()) {
       // change an entry
       name = nameText.getText();
       number = numberText.getText();
       if (name.equals("") || number.equals("")) {
          instruct.setText("Missing name or number - " +
                           "\nTry again");
          return;
       }
       aFriend = new Friend(name, number);
       int index = myPhoneBook.findFriend(name);
       if (index > -1) {
          myPhoneBook.setFriend(index, aFriend);
          instruct.setText("Entry changed to: " + aFriend +
                           "\nChoose another operation above" );
       }
       else {
          instruct.setText(name + " not found - " +
                           "\nTry again");
       }
       nameText.setText("");
       numberText.setText("");
    }

    nameText.requestFocus();
    nameList.setSelectedIndex(0); // Reset combo box message
  } // end actionPerformed()


  // postcondition: Stores the name selected from the combo box
  //   in nameText.
  public void itemStateChanged(ItemEvent e) {
    if (e.getSource() == nameList &&
        nameList.getSelectedIndex() != 0) {
      String name = (String) nameList.getSelectedItem();
      nameText.setText(name);
    }
  }

}


