From 23b84f45cf8146befa70ac4b6095093287695648 Mon Sep 17 00:00:00 2001 From: andrewlalis Date: Tue, 23 Oct 2018 16:52:46 +0200 Subject: [PATCH] Setting a new team for a user works, although have not used live github code. --- .../andrewlalis/model/database/DbHelper.java | 12 ++++ .../model/database/TransactionContent.java | 16 +++++ .../student_actions/SetTeamListener.java | 39 +++++++++- .../andrewlalis/ui/view/ManagementView.java | 22 ++++-- .../ui/view/dialogs/TeamChooserDialog.java | 72 ++++++++++++++++++- .../table_models/StudentTeamTableModel.java | 7 ++ 6 files changed, 159 insertions(+), 9 deletions(-) create mode 100644 src/main/java/nl/andrewlalis/model/database/TransactionContent.java diff --git a/src/main/java/nl/andrewlalis/model/database/DbHelper.java b/src/main/java/nl/andrewlalis/model/database/DbHelper.java index f8f007c..716f21d 100644 --- a/src/main/java/nl/andrewlalis/model/database/DbHelper.java +++ b/src/main/java/nl/andrewlalis/model/database/DbHelper.java @@ -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(); + } + } diff --git a/src/main/java/nl/andrewlalis/model/database/TransactionContent.java b/src/main/java/nl/andrewlalis/model/database/TransactionContent.java new file mode 100644 index 0000000..c4dd1f0 --- /dev/null +++ b/src/main/java/nl/andrewlalis/model/database/TransactionContent.java @@ -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); + +} diff --git a/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/SetTeamListener.java b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/SetTeamListener.java index 0456f61..cb5233e 100644 --- a/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/SetTeamListener.java +++ b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/SetTeamListener.java @@ -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(); } } diff --git a/src/main/java/nl/andrewlalis/ui/view/ManagementView.java b/src/main/java/nl/andrewlalis/ui/view/ManagementView.java index 5e890f1..723121b 100644 --- a/src/main/java/nl/andrewlalis/ui/view/ManagementView.java +++ b/src/main/java/nl/andrewlalis/ui/view/ManagementView.java @@ -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); diff --git a/src/main/java/nl/andrewlalis/ui/view/dialogs/TeamChooserDialog.java b/src/main/java/nl/andrewlalis/ui/view/dialogs/TeamChooserDialog.java index 3431df4..c62b2f1 100644 --- a/src/main/java/nl/andrewlalis/ui/view/dialogs/TeamChooserDialog.java +++ b/src/main/java/nl/andrewlalis/ui/view/dialogs/TeamChooserDialog.java @@ -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 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; } } diff --git a/src/main/java/nl/andrewlalis/ui/view/table_models/StudentTeamTableModel.java b/src/main/java/nl/andrewlalis/ui/view/table_models/StudentTeamTableModel.java index a6300af..0810ba6 100644 --- a/src/main/java/nl/andrewlalis/ui/view/table_models/StudentTeamTableModel.java +++ b/src/main/java/nl/andrewlalis/ui/view/table_models/StudentTeamTableModel.java @@ -63,6 +63,13 @@ public class StudentTeamTableModel extends AbstractTableModel { return null; } + /** + * @return A list of all teams in this model. + */ + public List getTeams() { + return this.studentTeamsList; + } + @Override public int getRowCount() { return this.studentTeamsList.size();