/**
   * Creates a small window for editing student information
   *
   * @param window Parent window
   * @param student Student to edit.
   */
  public StudentInfoEditor(StudentsListTab window, Student student) {
    this.window = window;
    this.student = student;
    this.setTitle(student.getFirstName() + " " + student.getLastName());

    this.tabs = new JTabbedPane();

    this.avoidingTable = makeTable(student);
    this.scrollbar = new JScrollPane(this.avoidingTable);

    /*
     * Separation Tab
     */
    JPanel buttonsPane = new JPanel(new FlowLayout(FlowLayout.RIGHT));
    JButton newStudentButton = new JButton("New");
    newStudentButton.setActionCommand("New Student");
    newStudentButton.addActionListener(this);
    buttonsPane.add(newStudentButton);

    JButton delStudentButton = new JButton("Delete");
    delStudentButton.setActionCommand("Delete Student");
    delStudentButton.addActionListener(this);
    buttonsPane.add(delStudentButton);

    JPanel separationPanel = new JPanel(new BorderLayout());
    separationPanel.add(scrollbar, BorderLayout.CENTER);
    separationPanel.add(buttonsPane, BorderLayout.PAGE_END);

    /*
     * Information Editing Tab contents
     */

    /*
     * Name and student ID text fields for setting those of a student.
     */
    JPanel studentIDSetter = new JPanel(new FlowLayout(FlowLayout.LEFT));
    JLabel studentIDLabel = new JLabel("Student ID: ");
    this.studentIDField = new JTextField(Integer.toString(student.getStudentID()));
    this.studentIDField.setColumns(5);
    studentIDSetter.add(studentIDLabel);
    studentIDSetter.add(studentIDField);

    JPanel firstNameSetter = new JPanel(new FlowLayout(FlowLayout.LEFT));
    JLabel firstNameLabel = new JLabel("First: ");
    this.firstNameField = new JTextField(student.getFirstName());
    this.firstNameField.setColumns(8);
    firstNameSetter.add(firstNameLabel);
    firstNameSetter.add(firstNameField);

    JPanel lastNameSetter = new JPanel(new FlowLayout(FlowLayout.LEFT));
    JLabel lastNameLabel = new JLabel("Last: ");
    this.lastNameField = new JTextField(student.getLastName());
    this.lastNameField.setColumns(8);
    lastNameSetter.add(lastNameLabel);
    lastNameSetter.add(lastNameField);

    /*
     * Box to force assigned seating
     */
    JPanel assignedSeatSetter = new JPanel(new FlowLayout(FlowLayout.LEFT));
    JLabel assignedSeatLabel = new JLabel("Assigned Seat");
    this.assignedSeatField = new JTextField();
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < this.window.currentClass.getQuadrants().get(i).getSize(); j++) {
        Desk desk = this.window.currentClass.getQuadrants().get(i).getDesk(j);
        if (desk.isEditable() == false && desk.getOccupyingStudent().equals(student)) {
          switch (i) {
            case 0:
              this.assignedSeatField = new JTextField(Integer.toString(j + 1));
              break;
            case 1:
              this.assignedSeatField = new JTextField(Integer.toString(j + 11));
              break;
            case 2:
              this.assignedSeatField = new JTextField(Integer.toString(j + 23));
              break;
          }
        }
      }
    }
    this.assignedSeatField.setColumns(2);
    assignedSeatSetter.add(assignedSeatLabel);
    assignedSeatSetter.add(assignedSeatField);

    /*
     * Box to set the race of a student.
     */
    JPanel raceSetter = new JPanel(new FlowLayout(FlowLayout.LEFT));
    JLabel raceNameLabel = new JLabel("Race: ");
    this.raceSelection =
        new JComboBox<String>(
            new String[] {
              "White", "Asian", "AfricanAmerican", "Latino", "PacificIslander", "Other"
            });
    this.raceSelection.setSelectedItem(student.getRace().toString());
    raceSetter.add(raceNameLabel);
    raceSetter.add(raceSelection);

    /*
     * Box to set the Gender of a student
     */
    JPanel genderSetter = new JPanel(new FlowLayout(FlowLayout.LEFT));
    JLabel genderLabel = new JLabel("Gender: ");
    this.genderSelection = new JComboBox<String>(new String[] {"Male", "Female", "Other"});
    this.genderSelection.setSelectedItem(student.getGender().toString());
    genderSetter.add(genderLabel);
    genderSetter.add(genderSelection);

    /*
     * Bottom button pane with save/cancel buttons
     */
    JPanel buttonPane = new JPanel(new FlowLayout(FlowLayout.LEFT));
    JButton saveChanges = new JButton("Save");
    saveChanges.addActionListener(this);
    saveChanges.setActionCommand("Save");

    JButton cancelChanges = new JButton("Cancel");
    cancelChanges.addActionListener(this);
    cancelChanges.setActionCommand("Cancel");

    buttonPane.add(saveChanges);
    buttonPane.add(cancelChanges);

    JPanel comboboxPane = new JPanel(new FlowLayout(FlowLayout.LEFT));
    comboboxPane.add(genderSetter);
    JPanel informationPanel = new JPanel();
    informationPanel.setLayout(new GridLayout(5, 2));
    informationPanel.add(studentIDSetter);
    informationPanel.add(assignedSeatSetter);
    informationPanel.add(firstNameSetter);
    informationPanel.add(lastNameSetter);
    informationPanel.add(genderSetter);
    informationPanel.add(raceSetter);
    informationPanel.add(new JPanel());
    informationPanel.add(buttonPane);

    tabs.addTab("Information", null, informationPanel);
    ;
    tabs.addTab("Separation", null, separationPanel);

    this.add(tabs, BorderLayout.CENTER);

    this.setResizable(false);
    this.setSize(400, 320);
    this.setLocationRelativeTo(null);
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  }
  /**
   * Handles buttons: - Adding/deleting students to be removed/added for the avoiding list -
   * Canceling/saving changes
   */
  @Override
  public void actionPerformed(ActionEvent e) {

    String actioncommand = e.getActionCommand();
    // TODO: New student button.
    if (actioncommand.equals("New Student")) {
      ArrayList<Student> options = new ArrayList<Student>();
      for (Student student : this.window.currentClass.getStudents()) {
        options.add(student);
      }
      options.remove(this.student);
      this.student.avoid(
          (Student)
              JOptionPane.showInputDialog(
                  this,
                  "Select the student to avoid",
                  "Student Avoiding",
                  JOptionPane.PLAIN_MESSAGE,
                  null,
                  options.toArray(),
                  null));
      refreshHack();

    } else if (actioncommand.equals("Delete Student")) {
      ArrayList<Student> toremove = new ArrayList<Student>();
      for (int selectedRow : avoidingTable.getSelectedRows()) {
        for (Student possibleStudents : this.student.getAvoiding()) {
          if (Integer.toString(possibleStudents.getStudentID())
              .equals(((String) avoidingTable.getModel().getValueAt(selectedRow, 0)))) {
            toremove.add(possibleStudents);
          }
        }
      }
      for (Student removedstudent : toremove) {
        this.student.getAvoiding().remove(removedstudent);
      }
      refreshHack();

    } else if (actioncommand.equals("Cancel")) {
      this.setVisible(false);
      this.dispose();
    } else if (actioncommand.equals("Save")) {
      this.student.setStudentID(Integer.parseInt(this.studentIDField.getText()));
      this.student.setFirstName(this.firstNameField.getText());
      this.student.setLastName(this.lastNameField.getText());
      this.student.setGender((String) this.genderSelection.getSelectedItem());
      this.student.setRace((String) this.raceSelection.getSelectedItem());

      /*
       * Handle assigned seating
       */
      if (this.assignedSeatField.getText().matches("-?\\d+")) {
        int assignedSeat = Integer.parseInt(this.assignedSeatField.getText()) - 1;
        ClassRoom classRoom = window.getCurrentClass();

        ArrayList<Section> sections = classRoom.getQuadrants();
        for (Section section : sections) {
          for (int i = 0; i < section.getSize(); i++) {
            Desk desk = section.getDesk(i);
            if (desk.getOccupyingStudent() != null && desk.getOccupyingStudent() == this.student) {
              desk.empty();
              desk.setEditable(true);
            }
          }
        }

        if (assignedSeat < 0 || assignedSeat >= 32) {
          JOptionPane.showMessageDialog(
              this,
              "Invalid Seat Number. \nLeave it blank if you don't want the student to be assigned a seat.");
        } else if (assignedSeat < 10) {
          Desk desk = sections.get(0).getDesk(assignedSeat);
          desk.setEditable(false);
          desk.occupy(this.student);
        } else if (assignedSeat < 22) {
          Desk desk = sections.get(1).getDesk(assignedSeat - 10);
          desk.setEditable(false);
          desk.occupy(this.student);
        } else if (assignedSeat < 32) {
          Desk desk = sections.get(2).getDesk(assignedSeat - 22);
          desk.setEditable(false);
          desk.occupy(this.student);
        }
      } else {
        ArrayList<Section> sections = this.window.getCurrentClass().getQuadrants();
        for (Section section : sections) {
          for (int i = 0; i < section.getSize(); i++) {
            Desk desk = section.getDesk(i);
            if (desk.getOccupyingStudent() != null
                && desk.getOccupyingStudent().equals(this.student)
                && desk.isEditable() == false) {
              desk.empty();
              desk.setEditable(true);
            }
          }
        }
      }
      for (Section section : window.currentClass.getQuadrants()) {
        for (int i = 0; i < section.getSize(); i++) {
          if (section.getDesk(i).isEditable() == true) {
            section.getDesk(i).empty();
          }
        }
      }
      this.setEnabled(false);
      this.dispose();
    }
    this.window.refresh();
  }