Almost an MVP #6
			
				
			
		
		
		
	| 
						 | 
				
			
			@ -53,4 +53,16 @@ public class DbHelper {
 | 
			
		|||
        return studentTeams;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Executes some transaction content.
 | 
			
		||||
     * @param content The content to execute.
 | 
			
		||||
     */
 | 
			
		||||
    public static void executeTransactionContent(TransactionContent content) {
 | 
			
		||||
        Session session = DbUtil.getSessionFactory().openSession();
 | 
			
		||||
        Transaction tx = session.beginTransaction();
 | 
			
		||||
        content.doTransaction(session);
 | 
			
		||||
        tx.commit();
 | 
			
		||||
        session.close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
package nl.andrewlalis.model.database;
 | 
			
		||||
 | 
			
		||||
import org.hibernate.Session;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Defines a series of operations done within a transaction.
 | 
			
		||||
 */
 | 
			
		||||
public interface TransactionContent {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Performs a transaction. Implement this method by updating, inserting, or deleting entities.
 | 
			
		||||
     * @param session The session in which operations are being done.
 | 
			
		||||
     */
 | 
			
		||||
    void doTransaction(Session session);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -2,9 +2,12 @@ package nl.andrewlalis.ui.control.listeners.management_view.student_actions;
 | 
			
		|||
 | 
			
		||||
import nl.andrewlalis.model.Student;
 | 
			
		||||
import nl.andrewlalis.model.StudentTeam;
 | 
			
		||||
import nl.andrewlalis.model.database.DbHelper;
 | 
			
		||||
import nl.andrewlalis.ui.control.listeners.management_view.TableRowListener;
 | 
			
		||||
import nl.andrewlalis.ui.view.ManagementView;
 | 
			
		||||
import nl.andrewlalis.ui.view.dialogs.TeamChooserDialog;
 | 
			
		||||
import nl.andrewlalis.ui.view.table_models.StudentTableModel;
 | 
			
		||||
import nl.andrewlalis.ui.view.table_models.StudentTeamTableModel;
 | 
			
		||||
 | 
			
		||||
import javax.swing.*;
 | 
			
		||||
import java.awt.event.ActionEvent;
 | 
			
		||||
| 
						 | 
				
			
			@ -17,8 +20,20 @@ import java.awt.event.ActionEvent;
 | 
			
		|||
 */
 | 
			
		||||
public class SetTeamListener extends TableRowListener {
 | 
			
		||||
 | 
			
		||||
    public SetTeamListener(JTable table) {
 | 
			
		||||
    /**
 | 
			
		||||
     * The teamModel is a reference to the current team model for student teams.
 | 
			
		||||
     */
 | 
			
		||||
    private StudentTeamTableModel teamModel;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * A reference to the management view, which is used to tell the management view when to update the models.
 | 
			
		||||
     */
 | 
			
		||||
    private ManagementView managementView;
 | 
			
		||||
 | 
			
		||||
    public SetTeamListener(ManagementView managementView, JTable table, StudentTeamTableModel teamModel) {
 | 
			
		||||
        super(table);
 | 
			
		||||
        this.managementView = managementView;
 | 
			
		||||
        this.teamModel = teamModel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
| 
						 | 
				
			
			@ -26,6 +41,26 @@ public class SetTeamListener extends TableRowListener {
 | 
			
		|||
        StudentTableModel model = (StudentTableModel) this.getTable().getModel();
 | 
			
		||||
        Student student = model.getStudentAt(this.getSelectedRow());
 | 
			
		||||
 | 
			
		||||
        StudentTeam chosenTeam = (StudentTeam) new TeamChooserDialog(SwingUtilities.getWindowAncestor(this.getTable())).getSelectedTeam();
 | 
			
		||||
        StudentTeam[] teams = new StudentTeam[this.teamModel.getRowCount()];
 | 
			
		||||
        this.teamModel.getTeams().toArray(teams);
 | 
			
		||||
 | 
			
		||||
        StudentTeam chosenTeam = (StudentTeam) new TeamChooserDialog(
 | 
			
		||||
                SwingUtilities.getWindowAncestor(this.getTable()),
 | 
			
		||||
                teams
 | 
			
		||||
        ).getSelectedTeam();
 | 
			
		||||
 | 
			
		||||
        // Perform the updates to the database here.
 | 
			
		||||
        DbHelper.executeTransactionContent(session -> {
 | 
			
		||||
            student.getAssignedTeam().removeMember(student);
 | 
			
		||||
            session.update(student.getAssignedTeam());
 | 
			
		||||
 | 
			
		||||
            chosenTeam.addMember(student);
 | 
			
		||||
            session.update(chosenTeam);
 | 
			
		||||
 | 
			
		||||
            student.assignToTeam(chosenTeam);
 | 
			
		||||
            session.update(student);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this.managementView.updateModels();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,6 +5,7 @@ import nl.andrewlalis.model.database.DbHelper;
 | 
			
		|||
import nl.andrewlalis.model.database.DbUtil;
 | 
			
		||||
import nl.andrewlalis.ui.control.listeners.management_view.PopupSelector;
 | 
			
		||||
import nl.andrewlalis.ui.control.listeners.management_view.student_actions.RemoveFromCourseListener;
 | 
			
		||||
import nl.andrewlalis.ui.control.listeners.management_view.student_actions.SetTeamListener;
 | 
			
		||||
import nl.andrewlalis.ui.view.components.DetailPanel;
 | 
			
		||||
import nl.andrewlalis.ui.view.table_models.StudentTableModel;
 | 
			
		||||
import nl.andrewlalis.ui.view.table_models.StudentTeamTableModel;
 | 
			
		||||
| 
						 | 
				
			
			@ -63,6 +64,9 @@ public class ManagementView extends AbstractView {
 | 
			
		|||
 | 
			
		||||
        this.detailPanel = new DetailPanel();
 | 
			
		||||
 | 
			
		||||
        this.studentsModel = new StudentTableModel(DbHelper.getStudents());
 | 
			
		||||
        this.studentTeamModel = new StudentTeamTableModel();
 | 
			
		||||
 | 
			
		||||
        contentPane.add(this.buildCommandPanel(), BorderLayout.WEST);
 | 
			
		||||
        contentPane.add(this.detailPanel, BorderLayout.EAST);
 | 
			
		||||
        contentPane.add(this.buildOverviewPanel(), BorderLayout.CENTER);
 | 
			
		||||
| 
						 | 
				
			
			@ -140,17 +144,26 @@ public class ManagementView extends AbstractView {
 | 
			
		|||
     */
 | 
			
		||||
    private JPanel buildStudentsTablePanel() {
 | 
			
		||||
        // Initialize the model, table, and a surrounding scroll pane.
 | 
			
		||||
        this.studentsModel = new StudentTableModel(DbHelper.getStudents());
 | 
			
		||||
 | 
			
		||||
        JTable table = new JTable(this.studentsModel);
 | 
			
		||||
        table.setFillsViewportHeight(true);
 | 
			
		||||
        table.getSelectionModel().addListSelectionListener(listSelectionEvent -> {
 | 
			
		||||
            detailPanel.setDetailableEntity(studentsModel.getStudentAt(table.getSelectedRow()));
 | 
			
		||||
            int row = table.getSelectedRow();
 | 
			
		||||
            if (row >= 0 && row < studentsModel.getRowCount()) {
 | 
			
		||||
                detailPanel.setDetailableEntity(studentsModel.getStudentAt(row));
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // A context menu for the table.
 | 
			
		||||
        JPopupMenu menu = new JPopupMenu("Menu");
 | 
			
		||||
        // Item for setting a student's team.
 | 
			
		||||
        JMenuItem setTeamItem = new JMenuItem("Set team");
 | 
			
		||||
        setTeamItem.addActionListener(new SetTeamListener(this, table, this.studentTeamModel));
 | 
			
		||||
        menu.add(setTeamItem);
 | 
			
		||||
        // Item for removing a student from the course.
 | 
			
		||||
        JMenuItem removeItem = new JMenuItem("Remove from course");
 | 
			
		||||
        removeItem.addActionListener(new RemoveFromCourseListener(table));
 | 
			
		||||
        menu.add(removeItem);
 | 
			
		||||
 | 
			
		||||
        menu.addPopupMenuListener(new PopupSelector(table));
 | 
			
		||||
        table.setComponentPopupMenu(menu);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -161,7 +174,8 @@ public class ManagementView extends AbstractView {
 | 
			
		|||
     * @return A JPanel to be put into a tab for display of a list of student teams.
 | 
			
		||||
     */
 | 
			
		||||
    private JPanel buildStudentTeamsTablePanel() {
 | 
			
		||||
        this.studentTeamModel = new StudentTeamTableModel(DbHelper.getStudentTeams());
 | 
			
		||||
        // Make sure that the model has the latest student teams.
 | 
			
		||||
        this.studentTeamModel.setStudentTeamsList(DbHelper.getStudentTeams());
 | 
			
		||||
 | 
			
		||||
        JTable table = new JTable(this.studentTeamModel);
 | 
			
		||||
        table.setFillsViewportHeight(true);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,18 +1,84 @@
 | 
			
		|||
package nl.andrewlalis.ui.view.dialogs;
 | 
			
		||||
 | 
			
		||||
import nl.andrewlalis.model.StudentTeam;
 | 
			
		||||
import nl.andrewlalis.model.Team;
 | 
			
		||||
 | 
			
		||||
import javax.swing.*;
 | 
			
		||||
import java.awt.*;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * With this dialog, a user can choose from a list of teams. This works for any type of team.
 | 
			
		||||
 * The user should have the option to create a new team.
 | 
			
		||||
 */
 | 
			
		||||
public class TeamChooserDialog extends JDialog {
 | 
			
		||||
 | 
			
		||||
    public TeamChooserDialog(Window parent) {
 | 
			
		||||
        super(parent);
 | 
			
		||||
    /**
 | 
			
		||||
     * The combo box used in selecting a team. Will be populated by all team numbers.
 | 
			
		||||
     */
 | 
			
		||||
    private JComboBox<Integer> teamChooserBox;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The team which is selected.
 | 
			
		||||
     */
 | 
			
		||||
    private Team selectedTeam;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The model containing the list of teams.
 | 
			
		||||
     */
 | 
			
		||||
    private StudentTeam[] teams;
 | 
			
		||||
 | 
			
		||||
    public TeamChooserDialog(Window parent, StudentTeam[] teams) {
 | 
			
		||||
        super(parent, "Team Chooser", ModalityType.APPLICATION_MODAL);
 | 
			
		||||
        this.teams = teams;
 | 
			
		||||
        this.setContentPane(this.buildContentPane());
 | 
			
		||||
        this.pack();
 | 
			
		||||
        this.setLocationRelativeTo(null);
 | 
			
		||||
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
 | 
			
		||||
        this.setVisible(true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return The dialog's content pane, containing all user interface elements.
 | 
			
		||||
     */
 | 
			
		||||
    private JPanel buildContentPane() {
 | 
			
		||||
        JPanel contentPane = new JPanel(new BorderLayout());
 | 
			
		||||
 | 
			
		||||
        contentPane.add(new JLabel("Choose a team."), BorderLayout.NORTH);
 | 
			
		||||
 | 
			
		||||
        // Main selection panel.
 | 
			
		||||
        // Create a list of numbers to represent the teams.
 | 
			
		||||
        Integer[] teamNumbers = new Integer[this.teams.length];
 | 
			
		||||
        for (int row = 0; row < this.teams.length; row++) {
 | 
			
		||||
            teamNumbers[row] = this.teams[row].getNumber();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.teamChooserBox = new JComboBox<>(teamNumbers);
 | 
			
		||||
        contentPane.add(this.teamChooserBox, BorderLayout.CENTER);
 | 
			
		||||
 | 
			
		||||
        // Button panel for confirming or cancelling selection.
 | 
			
		||||
        JPanel confirmPanel = new JPanel();
 | 
			
		||||
        JButton doneButton = new JButton("Done");
 | 
			
		||||
        // Add a small action listener to set the selected team and dispose of the dialog.
 | 
			
		||||
        doneButton.addActionListener(actionEvent -> {
 | 
			
		||||
            selectedTeam = teams[teamChooserBox.getSelectedIndex()];
 | 
			
		||||
            dispose();
 | 
			
		||||
        });
 | 
			
		||||
        confirmPanel.add(doneButton);
 | 
			
		||||
 | 
			
		||||
        JButton cancelButton = new JButton("Cancel");
 | 
			
		||||
        // Add a small action listener to dispose of the dialog and return the null selected team.
 | 
			
		||||
        cancelButton.addActionListener(actionEvent -> dispose());
 | 
			
		||||
        confirmPanel.add(cancelButton);
 | 
			
		||||
        contentPane.add(confirmPanel, BorderLayout.SOUTH);
 | 
			
		||||
 | 
			
		||||
        return contentPane;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return The team which was selected by the user.
 | 
			
		||||
     */
 | 
			
		||||
    public Team getSelectedTeam() {
 | 
			
		||||
        return null;
 | 
			
		||||
        return this.selectedTeam;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -63,6 +63,13 @@ public class StudentTeamTableModel extends AbstractTableModel {
 | 
			
		|||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return A list of all teams in this model.
 | 
			
		||||
     */
 | 
			
		||||
    public List<StudentTeam> getTeams() {
 | 
			
		||||
        return this.studentTeamsList;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getRowCount() {
 | 
			
		||||
        return this.studentTeamsList.size();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue