Add remove support and contextual right click menu
This commit is contained in:
parent
ca7d3f1136
commit
336288b71a
7 changed files with 209 additions and 48 deletions
|
@ -92,8 +92,29 @@ public class Projection extends Table {
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static public Projection find(Date date, Competition competition, Room room, Movie movie, Slot slot) {
|
||||||
|
Projection projection = null;
|
||||||
|
try {
|
||||||
|
PreparedStatement ps = DB.getConnection().prepareStatement("SELECT id FROM Projection WHERE startDate = ? AND CompetitionName = ? AND RoomName = ? AND MovieName = ? AND SlotId = ?");
|
||||||
|
ps.setDate(1, date);
|
||||||
|
ps.setString(2, competition.getName());
|
||||||
|
ps.setString(3, room.getName());
|
||||||
|
ps.setString(4, movie.getName());
|
||||||
|
ps.setInt(5, slot.getId());
|
||||||
|
if (ps.execute()) {
|
||||||
|
ResultSet rs = ps.getResultSet();
|
||||||
|
rs.next();
|
||||||
|
projection = new Projection(rs.getInt("id"));
|
||||||
|
}
|
||||||
|
ps.close();
|
||||||
|
} catch (SQLException | NullPointerException | NotFoundInTable e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return projection;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean delete() {
|
public String toString() {
|
||||||
return false;
|
return getMovie().getName();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,10 +48,26 @@ public class Room extends Table {
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static public ArrayList<Room> getAll(Movie movie, Slot slot, Date date) {
|
||||||
|
ArrayList<Room> list = new ArrayList<>();
|
||||||
|
try {
|
||||||
|
PreparedStatement ps = DB.getConnection().prepareStatement("SELECT R.name FROM Room R INNER JOIN CompetitionRoom CR on R.name = CR.RoomName INNER JOIN Projection P on R.name = P.RoomName WHERE CR.CompetitionName = ? AND P.SlotId = ? AND P.startDate = ? GROUP BY R.name");
|
||||||
|
ps.setString(1, movie.getCompetition().getName());
|
||||||
|
ps.setInt(2, slot.getId());
|
||||||
|
ps.setDate(3, date);
|
||||||
|
for (ResultSet rs = ps.executeQuery(); rs.next();)
|
||||||
|
list.add(new Room(rs.getString("name")));
|
||||||
|
ps.close();
|
||||||
|
} catch (SQLException | NullPointerException | NotFoundInTable e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
static public ArrayList<Room> getAvailable(Movie movie, Slot slot, Date date) {
|
static public ArrayList<Room> getAvailable(Movie movie, Slot slot, Date date) {
|
||||||
ArrayList<Room> list = new ArrayList<>();
|
ArrayList<Room> list = new ArrayList<>();
|
||||||
try {
|
try {
|
||||||
PreparedStatement ps = DB.getConnection().prepareStatement("SELECT R.name FROM Room R INNER JOIN CompetitionRoom CR on R.name = CR.RoomName LEFT JOIN Projection P on R.name = P.RoomName LEFT JOIN Slot S on S.id = P.SlotId WHERE CR.CompetitionName = ? AND NOT (S.id = ? AND P.startDate = ?) OR P.id IS NULL GROUP BY R.name");
|
PreparedStatement ps = DB.getConnection().prepareStatement("SELECT R.name FROM Room R INNER JOIN CompetitionRoom CR on R.name = CR.RoomName LEFT JOIN Projection P on R.name = P.RoomName LEFT JOIN Slot S on S.id = P.SlotId WHERE CR.CompetitionName = ? AND (NOT (S.id = ? AND P.startDate = ?) OR P.id IS NULL) GROUP BY R.name");
|
||||||
ps.setString(1, movie.getCompetition().getName());
|
ps.setString(1, movie.getCompetition().getName());
|
||||||
ps.setInt(2, slot.getId());
|
ps.setInt(2, slot.getId());
|
||||||
ps.setDate(3, date);
|
ps.setDate(3, date);
|
||||||
|
|
|
@ -66,6 +66,21 @@ public class Slot extends Table {
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static public ArrayList<Slot> getAll(Competition competition, Date date) {
|
||||||
|
ArrayList<Slot> list = new ArrayList<>();
|
||||||
|
try {
|
||||||
|
PreparedStatement ps = DB.getConnection().prepareStatement("SELECT S.id FROM Slot S INNER JOIN Projection P on S.id = P.SlotId WHERE S.CompetitionName = ? AND P.startDate = ? GROUP BY S.id");
|
||||||
|
ps.setString(1, competition.getName());
|
||||||
|
ps.setDate(2, date);
|
||||||
|
for (ResultSet rs = ps.executeQuery(); rs.next();)
|
||||||
|
list.add(new Slot(rs.getInt("id")));
|
||||||
|
ps.close();
|
||||||
|
} catch (SQLException | NullPointerException | NotFoundInTable e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
static public ArrayList<Slot> getAvailable(Competition competition, Date date) {
|
static public ArrayList<Slot> getAvailable(Competition competition, Date date) {
|
||||||
ArrayList<Slot> list = new ArrayList<>();
|
ArrayList<Slot> list = new ArrayList<>();
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package GUI.Agenda;
|
package GUI.Agenda;
|
||||||
|
|
||||||
import DB.Competition;
|
import DB.*;
|
||||||
import DB.Projection;
|
|
||||||
import GUI.ProjectionHandler;
|
import GUI.ProjectionHandler;
|
||||||
import GUI.Types.CompetType;
|
import GUI.Types.CompetType;
|
||||||
import GUI.Types.ProjectionType;
|
import GUI.Types.ProjectionType;
|
||||||
|
@ -91,21 +90,25 @@ public class Agenda extends JPanel {
|
||||||
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||||
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
|
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
|
||||||
table.setRowHeight(100);
|
table.setRowHeight(100);
|
||||||
|
Agenda tmp = this;
|
||||||
table.addMouseListener(new MouseInputAdapter() {
|
table.addMouseListener(new MouseInputAdapter() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void mousePressed(MouseEvent mouseEvent) {
|
public void mousePressed(MouseEvent mouseEvent) {
|
||||||
JTable table = (JTable) mouseEvent.getSource();
|
Object currentCellValue = table.getValueAt(table.rowAtPoint(mouseEvent.getPoint()), table.getTableHeader().columnAtPoint(mouseEvent.getPoint()));
|
||||||
Point point = mouseEvent.getPoint();
|
Projection projection = null;
|
||||||
int row = table.getSelectedRow();
|
if (currentCellValue.getClass() == Projection.class)
|
||||||
int column = table.getSelectedColumn();
|
projection = (Projection) currentCellValue;
|
||||||
if (mouseEvent.getClickCount() == 2 && table.getSelectedRow() != -1) {
|
if (mouseEvent.getClickCount() == 2 && table.getSelectedRow() != -1) {
|
||||||
if (table.getValueAt(row, column) == "") {
|
if (projection == null) {
|
||||||
openDialog(ProjectionType.ADD);
|
openDialog(ProjectionType.ADD);
|
||||||
} else {
|
} else {
|
||||||
openDialog(ProjectionType.EDIT);
|
openDialog(ProjectionType.EDIT, projection);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else if (mouseEvent.isPopupTrigger()) {
|
||||||
|
PopUpProjection popUpProjection = new PopUpProjection(projection, tmp);
|
||||||
|
popUpProjection.show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -136,20 +139,28 @@ public class Agenda extends JPanel {
|
||||||
try {
|
try {
|
||||||
ArrayList<Projection> projections = Projection.getAvailable(new Competition(this.competionType.getCompetition()));
|
ArrayList<Projection> projections = Projection.getAvailable(new Competition(this.competionType.getCompetition()));
|
||||||
for (Projection projection : projections) {
|
for (Projection projection : projections) {
|
||||||
addMovie(projection.getStartDate(), projection.getSlot().getStartTime(), projection.getMovie().getName());
|
addMovie(projection);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void openDialog(ProjectionType projectionType) {
|
protected void openDialog(ProjectionType projectionType) {
|
||||||
ProjectionHandler dialog = new ProjectionHandler(ProjectionType.ADD, this);
|
ProjectionHandler dialog = new ProjectionHandler(projectionType, this);
|
||||||
;
|
|
||||||
dialog.pack();
|
dialog.pack();
|
||||||
dialog.setVisible(true);
|
dialog.setVisible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addMovie(Date startDate, Time time, String movieName) {
|
protected void openDialog(ProjectionType projectionType, Projection projection) {
|
||||||
|
ProjectionHandler dialog = new ProjectionHandler(projectionType, this, projection);
|
||||||
|
dialog.pack();
|
||||||
|
dialog.setVisible(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addMovie(Projection projection) {
|
||||||
|
Date startDate = projection.getStartDate();
|
||||||
|
Time time = projection.getSlot().getStartTime();
|
||||||
|
String movieName = projection.getMovie().getName();
|
||||||
int column = this.table.getColumn(startDate.toString()).getModelIndex();
|
int column = this.table.getColumn(startDate.toString()).getModelIndex();
|
||||||
int row = 0;
|
int row = 0;
|
||||||
String times[] = {"08:30:00", "11:30:00", "15:00:00", "18:00:00", "21:00:00"};
|
String times[] = {"08:30:00", "11:30:00", "15:00:00", "18:00:00", "21:00:00"};
|
||||||
|
@ -159,7 +170,7 @@ public class Agenda extends JPanel {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
table.setValueAt(movieName, row, column);
|
table.setValueAt(projection, row, column);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getCurrentPage() {
|
public int getCurrentPage() {
|
||||||
|
|
50
src/main/java/GUI/Agenda/PopUpProjection.java
Normal file
50
src/main/java/GUI/Agenda/PopUpProjection.java
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
package GUI.Agenda;
|
||||||
|
|
||||||
|
import DB.Projection;
|
||||||
|
import GUI.Types.ProjectionType;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
|
||||||
|
public class PopUpProjection extends JPopupMenu implements ActionListener {
|
||||||
|
JMenuItem itemAdd;
|
||||||
|
JMenuItem itemEdit;
|
||||||
|
JMenuItem itemRemove;
|
||||||
|
Projection projection;
|
||||||
|
Agenda agenda;
|
||||||
|
public PopUpProjection(Projection projection, Agenda agenda) {
|
||||||
|
this.agenda = agenda;
|
||||||
|
itemAdd = new JMenuItem("Add");
|
||||||
|
itemEdit = new JMenuItem("Edit");
|
||||||
|
itemRemove = new JMenuItem("Remove");
|
||||||
|
itemAdd.addActionListener(this);
|
||||||
|
itemEdit.addActionListener(this);
|
||||||
|
itemRemove.addActionListener(this);
|
||||||
|
if (projection != null) {
|
||||||
|
this.projection = projection;
|
||||||
|
add(itemEdit);
|
||||||
|
add(itemRemove);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.projection = null;
|
||||||
|
add(itemAdd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent actionEvent) {
|
||||||
|
Object source = actionEvent.getSource();
|
||||||
|
if (source == itemAdd) {
|
||||||
|
agenda.openDialog(ProjectionType.ADD);
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (source == itemEdit) {
|
||||||
|
agenda.openDialog(ProjectionType.EDIT, projection);
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (source == itemRemove) {
|
||||||
|
agenda.openDialog(ProjectionType.REMOVE, projection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -36,16 +36,37 @@ public class ProjectionHandler extends JDialog {
|
||||||
private JComboBox roomComboBox;
|
private JComboBox roomComboBox;
|
||||||
private ProjectionType projectionType;
|
private ProjectionType projectionType;
|
||||||
private Agenda agenda;
|
private Agenda agenda;
|
||||||
|
private Projection projection = null;
|
||||||
|
|
||||||
public ProjectionHandler(ProjectionType projectionType, Agenda agenda) {
|
public ProjectionHandler(ProjectionType projectionType, Agenda agenda) {
|
||||||
this.projectionType = projectionType;
|
this.projectionType = projectionType;
|
||||||
this.agenda = agenda;
|
this.agenda = agenda;
|
||||||
|
createUIComponents();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProjectionHandler(ProjectionType projectionType, Agenda agenda, Projection projection) {
|
||||||
|
this.projectionType = projectionType;
|
||||||
|
this.agenda = agenda;
|
||||||
|
this.projection = projection;
|
||||||
|
createUIComponents();
|
||||||
|
competitionComboBox.getModel().setSelectedItem(projection.getCompetition());
|
||||||
|
filmComboBox.getModel().setSelectedItem(projection.getMovie());
|
||||||
|
dayComboBox.getModel().setSelectedItem(projection.getStartDate().toLocalDate());
|
||||||
|
slotComboBox.getModel().setSelectedItem(projection.getSlot());
|
||||||
|
roomComboBox.getModel().setSelectedItem(projection.getRoom());
|
||||||
|
if (projectionType == ProjectionType.REMOVE)
|
||||||
|
for (JComboBox comboBox : Arrays.asList(competitionComboBox, filmComboBox, dayComboBox, slotComboBox, roomComboBox))
|
||||||
|
comboBox.setEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createUIComponents() {
|
||||||
setContentPane(contentPane);
|
setContentPane(contentPane);
|
||||||
setModal(true);
|
setModal(true);
|
||||||
setPreferredSize(new Dimension(500, 300));
|
setPreferredSize(new Dimension(500, 300));
|
||||||
ImageIcon img = new ImageIcon("src/main/java/GUI/Assets/Logo/logo_cannes.jpg");
|
ImageIcon img = new ImageIcon("src/main/java/GUI/Assets/Logo/logo_cannes.jpg");
|
||||||
setIconImage(img.getImage());
|
setIconImage(img.getImage());
|
||||||
handleDialogName();
|
setTitle(projectionType.getTitle());
|
||||||
|
confirmButton.setText(projectionType.getText());
|
||||||
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
|
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
|
||||||
addWindowListener(new WindowAdapter() {
|
addWindowListener(new WindowAdapter() {
|
||||||
public void windowClosing(WindowEvent e) {
|
public void windowClosing(WindowEvent e) {
|
||||||
|
@ -62,28 +83,6 @@ public class ProjectionHandler extends JDialog {
|
||||||
confirmButton.addActionListener(actionEvent -> confirm());
|
confirmButton.addActionListener(actionEvent -> confirm());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleDialogName() {
|
|
||||||
switch (this.projectionType) {
|
|
||||||
case ADD: {
|
|
||||||
setTitle("Add projection");
|
|
||||||
confirmButton.setText("Add");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case EDIT: {
|
|
||||||
setTitle("Edit projection");
|
|
||||||
confirmButton.setText("Edit");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case REMOVE: {
|
|
||||||
setTitle("Remove projection");
|
|
||||||
confirmButton.setText("remove");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateCompetitions() {
|
private void updateCompetitions() {
|
||||||
ArrayList<Competition> competitions = Competition.getAll();
|
ArrayList<Competition> competitions = Competition.getAll();
|
||||||
if (competitions != null)
|
if (competitions != null)
|
||||||
|
@ -120,7 +119,18 @@ public class ProjectionHandler extends JDialog {
|
||||||
slotComboBox.removeAllItems();
|
slotComboBox.removeAllItems();
|
||||||
roomComboBox.removeAllItems();
|
roomComboBox.removeAllItems();
|
||||||
if (dayComboBox.getSelectedItem() != null) {
|
if (dayComboBox.getSelectedItem() != null) {
|
||||||
ArrayList<Slot> slots = Slot.getAvailable((Competition) competitionComboBox.getSelectedItem(), Date.valueOf((LocalDate) dayComboBox.getSelectedItem()));
|
ArrayList<Slot> slots = null;
|
||||||
|
Competition competition = (Competition) competitionComboBox.getSelectedItem();
|
||||||
|
Date date = Date.valueOf((LocalDate) dayComboBox.getSelectedItem());
|
||||||
|
switch (projectionType) {
|
||||||
|
case ADD:
|
||||||
|
slots = Slot.getAvailable(competition, date);
|
||||||
|
break;
|
||||||
|
case EDIT:
|
||||||
|
break;
|
||||||
|
case REMOVE:
|
||||||
|
slots = Slot.getAll(competition, date);
|
||||||
|
}
|
||||||
if (slots != null)
|
if (slots != null)
|
||||||
for (Slot s : slots)
|
for (Slot s : slots)
|
||||||
slotComboBox.addItem(s);
|
slotComboBox.addItem(s);
|
||||||
|
@ -130,7 +140,19 @@ public class ProjectionHandler extends JDialog {
|
||||||
private void updateRooms() {
|
private void updateRooms() {
|
||||||
roomComboBox.removeAllItems();
|
roomComboBox.removeAllItems();
|
||||||
if (dayComboBox.getSelectedItem() != null) {
|
if (dayComboBox.getSelectedItem() != null) {
|
||||||
ArrayList<Room> rooms = Room.getAvailable((Movie) filmComboBox.getSelectedItem(), (Slot) slotComboBox.getSelectedItem(), Date.valueOf((LocalDate) dayComboBox.getSelectedItem()));
|
ArrayList<Room> rooms = null;
|
||||||
|
Movie movie = (Movie) filmComboBox.getSelectedItem();
|
||||||
|
Slot slot = (Slot) slotComboBox.getSelectedItem();
|
||||||
|
Date date = Date.valueOf((LocalDate) dayComboBox.getSelectedItem());
|
||||||
|
switch (projectionType) {
|
||||||
|
case ADD:
|
||||||
|
rooms = Room.getAvailable(movie, slot, date);
|
||||||
|
break;
|
||||||
|
case EDIT:
|
||||||
|
break;
|
||||||
|
case REMOVE:
|
||||||
|
rooms = Room.getAll(movie, slot, date);
|
||||||
|
}
|
||||||
if (rooms != null)
|
if (rooms != null)
|
||||||
for (Room r : rooms)
|
for (Room r : rooms)
|
||||||
roomComboBox.addItem(r);
|
roomComboBox.addItem(r);
|
||||||
|
@ -141,10 +163,25 @@ public class ProjectionHandler extends JDialog {
|
||||||
for (JComboBox comboBox : Arrays.asList(competitionComboBox, filmComboBox, dayComboBox, slotComboBox, roomComboBox))
|
for (JComboBox comboBox : Arrays.asList(competitionComboBox, filmComboBox, dayComboBox, slotComboBox, roomComboBox))
|
||||||
if (comboBox.getSelectedItem() == null)
|
if (comboBox.getSelectedItem() == null)
|
||||||
return;
|
return;
|
||||||
if (projectionType == ProjectionType.ADD)
|
Date date = Date.valueOf((LocalDate) dayComboBox.getSelectedItem());
|
||||||
new Projection(Date.valueOf((LocalDate) dayComboBox.getSelectedItem()), (Competition) competitionComboBox.getSelectedItem(), (Room) roomComboBox.getSelectedItem(), (Movie) filmComboBox.getSelectedItem(), (Slot) slotComboBox.getSelectedItem());
|
Competition competition = (Competition) competitionComboBox.getSelectedItem();
|
||||||
|
Room room = (Room) roomComboBox.getSelectedItem();
|
||||||
|
Movie movie = (Movie) filmComboBox.getSelectedItem();
|
||||||
|
Slot slot = (Slot) slotComboBox.getSelectedItem();
|
||||||
|
switch (projectionType) {
|
||||||
|
case ADD:
|
||||||
|
new Projection(date, competition, room, movie, slot);
|
||||||
|
break;
|
||||||
|
case EDIT:
|
||||||
|
break;
|
||||||
|
case REMOVE:
|
||||||
|
if (projection != null)
|
||||||
|
projection.delete();
|
||||||
|
else
|
||||||
|
(Projection.find(date, competition, room, movie, slot)).delete();
|
||||||
|
break;
|
||||||
|
}
|
||||||
this.agenda.refresh();
|
this.agenda.refresh();
|
||||||
|
|
||||||
dispose();
|
dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,16 @@
|
||||||
package GUI.Types;
|
package GUI.Types;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
public enum ProjectionType {
|
public enum ProjectionType {
|
||||||
ADD, EDIT, REMOVE
|
ADD("Add projection", "Add"),
|
||||||
|
EDIT("Edit projection", "Edit"),
|
||||||
|
REMOVE("Remove projection", "Remove");
|
||||||
|
@Getter final private String title;
|
||||||
|
@Getter final private String text;
|
||||||
|
|
||||||
|
ProjectionType(String title, String text) {
|
||||||
|
this.title = title;
|
||||||
|
this.text = text;
|
||||||
|
}
|
||||||
}
|
}
|
Reference in a new issue