diff --git a/src/main/java/GUI/Agenda.java b/src/main/java/GUI/Agenda.java new file mode 100644 index 0000000..31091e6 --- /dev/null +++ b/src/main/java/GUI/Agenda.java @@ -0,0 +1,110 @@ +package GUI; + +import javax.swing.*; +import javax.swing.event.MouseInputAdapter; +import javax.swing.table.TableColumnModel; +import java.awt.*; +import java.awt.event.MouseEvent; +import java.util.Arrays; + +public class Agenda extends JPanel { + private JPanel agendaPanel; + private String headers[]; + private int totalDay; + private int currentPage; + public Agenda(JPanel agendaPanel, String headers[], int totalDay, int currentPage) { + this.agendaPanel = agendaPanel; + this.headers = headers; + this.totalDay = totalDay; + this.currentPage = currentPage; + this.agendaPanel.removeAll(); + int totalPages[] = dayToPage(9); + if (this.currentPage >= totalPages.length) { + this.currentPage = totalPages.length - 1; + } else if (this.currentPage < 0) { + this.currentPage = 0; + } + JScrollPane scroll = constructAgenda(totalPages[this.currentPage]); + agendaPanel.add(scroll); + } + private int[] dayToPage(int totalDay) { + int day = totalDay; + int count = 0; + while (day >= 5) { + day = day-5; + count++; + } + int rest = totalDay - 5*count; + int totalPages = rest < 5 ? count+1:count; + int pages[] = new int[totalPages]; + Arrays.fill(pages, 5); + if (rest < 5) pages[totalPages-1] = rest; + return pages; + } + private JScrollPane constructAgenda(int day) { + ListModel lm = new AbstractListModel() { + public int getSize() { + return headers.length; + } + + public Object getElementAt(int index) { + return headers[index]; + } + }; + TableModel dm = new TableModel(day, currentPage, headers.length); + JTable table = new JTable(dm) { + @Override + public boolean getScrollableTracksViewportHeight() { + return true; + } + }; + table.setCellSelectionEnabled(true); + table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); + table.setRowHeight(100); + table.addMouseListener(new MouseInputAdapter() { + @Override + public void mousePressed(MouseEvent mouseEvent) { + JTable table = (JTable) mouseEvent.getSource(); + Point point = mouseEvent.getPoint(); + int row = table.getSelectedRow(); + int column = table.getSelectedColumn(); + if (mouseEvent.getClickCount() == 2 && table.getSelectedRow() != -1) { + ProjectionHandler dialog; + if (table.getValueAt(row, column) == "") { + dialog = new ProjectionHandler(ProjectionType.ADD); + } else { + dialog = new ProjectionHandler(ProjectionType.EDIT); + } + dialog.pack(); + dialog.setVisible(true); + } + } + }); + + TableColumnModel columnModel = table.getColumnModel(); + int columnCount = columnModel.getColumnCount(); + for (int i = 0; i < columnCount; i++) { + table.getColumnModel().getColumn(i).setPreferredWidth(200); + } + + + JList rowHeader = new JList(lm); + rowHeader.setFixedCellWidth(100); + rowHeader.setFixedCellHeight(100); + + rowHeader.setCellRenderer(new RowHeaderRenderer(table)); + + JScrollPane scroll = new JScrollPane(table); + scroll.setRowHeaderView(rowHeader); + scroll.setBorder(BorderFactory.createEmptyBorder()); + scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER); + this.agendaPanel.setPreferredSize(new Dimension(this.agendaPanel.getWidth(), headers.length * 100 + 20)); + + return scroll; + } + + public int getCurrentPage() { + return this.currentPage; + } +} diff --git a/src/main/java/GUI/CompetType.java b/src/main/java/GUI/CompetType.java new file mode 100644 index 0000000..9b0e1a5 --- /dev/null +++ b/src/main/java/GUI/CompetType.java @@ -0,0 +1,5 @@ +package GUI; + +public enum CompetType { + LM, UCR, HC +} \ No newline at end of file diff --git a/src/main/java/GUI/GUI.form b/src/main/java/GUI/GUI.form index 819c572..0ddae9d 100644 --- a/src/main/java/GUI/GUI.form +++ b/src/main/java/GUI/GUI.form @@ -1,45 +1,150 @@
- + - + - + - - - + - + + + - - + + + + + + + - + - + - - - - - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/GUI/GUI.java b/src/main/java/GUI/GUI.java index e3fca02..b8b0877 100644 --- a/src/main/java/GUI/GUI.java +++ b/src/main/java/GUI/GUI.java @@ -1,22 +1,109 @@ package GUI; import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; -public class GUI extends JFrame { +public class GUI extends JFrame implements ActionListener { private JPanel mainPanel; + private JPanel agendaPanel; + private JPanel arrowPanel; + private JButton previousButton; + private JButton nextButton; + private JButton LMButton; + private JButton HCButton; + private JButton UCRButton; + private JMenuBar menuBar = new JMenuBar(); + private JMenu menuFichier = new JMenu("File"); + private JMenuItem menuItemAddProj = new JMenuItem("Add projection"); + private JMenuItem menuItemEditProj = new JMenuItem("Edit projection"); + private JMenuItem menuItemRemoveProj = new JMenuItem("Remove projection"); + private int currentPage; + String headers[] = {"Matin", "Midi", "Milieu
Après-midi", "Fin
Après-midi", "Soirée"}; + private CompetType currentCompetition = CompetType.LM; public GUI() { super(); construct(); } + private void renderMenu() { + menuBar.add(menuFichier); + menuFichier.add(menuItemAddProj); + menuFichier.add(menuItemEditProj); + menuFichier.add(menuItemRemoveProj); + setJMenuBar(menuBar); + } + private void construct() { + this.currentPage = 1; setTitle("Projection Planning"); setContentPane(mainPanel); - setSize(200,200); + setSize(1280, 800); setLocationRelativeTo(null); setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + this.renderMenu(); + + new Agenda(agendaPanel, headers, 8, this.currentPage); + previousButton.addActionListener(this); + nextButton.addActionListener(this); + HCButton.addActionListener(this); + LMButton.addActionListener(this); + UCRButton.addActionListener(this); + menuItemAddProj.addActionListener(this); + menuItemEditProj.addActionListener(this); + menuItemRemoveProj.addActionListener(this); setVisible(true); } + + @Override + public void actionPerformed(ActionEvent e) { + Object source = e.getSource(); + if (source == previousButton) { + this.currentPage--; + Agenda agenda = new Agenda(agendaPanel, headers, 8, this.currentPage); + this.currentPage = agenda.getCurrentPage(); + this.repaint(); + this.revalidate(); + } + else if (source == nextButton) { + this.currentPage++; + Agenda agenda = new Agenda(agendaPanel, headers, 8, this.currentPage); + this.currentPage = agenda.getCurrentPage(); + + this.repaint(); + this.revalidate(); + } else if (source == LMButton) { + this.headers = new String[]{"Matin", "Midi", "Milieu
Après-midi", "Fin
Après-midi", "Soirée"}; + Agenda agenda = new Agenda(agendaPanel, headers, 8, 0); + currentCompetition = CompetType.LM; + this.repaint(); + this.revalidate(); + } else if (source == HCButton) { + this.headers = new String[]{"Fin
Matinée", "Fin
Après-midi", "Soirée"}; + Agenda agenda = new Agenda(agendaPanel, headers, 8, 0); + currentCompetition = CompetType.HC; + this.repaint(); + this.revalidate(); + } else if (source == UCRButton) { + this.headers = new String[]{"Matin", "Midi", "Milieu
Après-midi", "Fin
Après-midi", "Soirée"}; + Agenda agenda = new Agenda(agendaPanel, headers, 8, 0); + currentCompetition = CompetType.UCR; + this.repaint(); + this.revalidate(); + } else if (source == this.menuItemAddProj) { + ProjectionHandler dialog = new ProjectionHandler(ProjectionType.ADD); + dialog.pack(); + dialog.setVisible(true); + } else if (source == this.menuItemEditProj) { + ProjectionHandler dialog = new ProjectionHandler(ProjectionType.EDIT); + dialog.pack(); + dialog.setVisible(true); + } else if (source == this.menuItemRemoveProj) { + ProjectionHandler dialog = new ProjectionHandler(ProjectionType.REMOVE); + dialog.pack(); + dialog.setVisible(true); + } + } } diff --git a/src/main/java/GUI/ProjectionHandler.form b/src/main/java/GUI/ProjectionHandler.form new file mode 100644 index 0000000..8f19d6a --- /dev/null +++ b/src/main/java/GUI/ProjectionHandler.form @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/GUI/ProjectionHandler.java b/src/main/java/GUI/ProjectionHandler.java new file mode 100644 index 0000000..3d23f5a --- /dev/null +++ b/src/main/java/GUI/ProjectionHandler.java @@ -0,0 +1,62 @@ +package GUI; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +public class ProjectionHandler extends JDialog { + private JPanel contentPane; + private JButton cancelButton; + private JButton confirmButton; + private JComboBox competitionComboBox; + private JComboBox dayComboBox; + private JComboBox slotComboBox; + private JPanel competitionPanel; + private JPanel slotPanel; + private JPanel dayPanel; + private JLabel competitionLabel; + private JLabel slotLabel; + private JLabel dayLabel; + private JPanel filmPanel; + private JLabel filmLabel; + private JComboBox filmComboBox; + private ProjectionType projectionType; + + public ProjectionHandler(ProjectionType projectionType) { + this.projectionType = projectionType; + setContentPane(contentPane); + setModal(true); + setPreferredSize(new Dimension(500, 300)); + handleDialogName(); + setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); + addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + dispose(); + } + }); + setLocationRelativeTo(null); + } + + 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; + } + } +} diff --git a/src/main/java/GUI/ProjectionType.java b/src/main/java/GUI/ProjectionType.java new file mode 100644 index 0000000..ceccf0f --- /dev/null +++ b/src/main/java/GUI/ProjectionType.java @@ -0,0 +1,5 @@ +package GUI; + +public enum ProjectionType { + ADD, EDIT, REMOVE +} \ No newline at end of file diff --git a/src/main/java/GUI/RowHeaderRenderer.java b/src/main/java/GUI/RowHeaderRenderer.java new file mode 100644 index 0000000..dd7a2c3 --- /dev/null +++ b/src/main/java/GUI/RowHeaderRenderer.java @@ -0,0 +1,24 @@ +package GUI; + +import javax.swing.*; +import javax.swing.table.JTableHeader; +import java.awt.*; + +class RowHeaderRenderer extends JLabel implements ListCellRenderer { + + RowHeaderRenderer(JTable table) { + JTableHeader header = table.getTableHeader(); + setOpaque(true); + setBorder(UIManager.getBorder("TableHeader.cellBorder")); + setHorizontalAlignment(CENTER); + setForeground(header.getForeground()); + setBackground(header.getBackground()); + setFont(header.getFont()); + } + + public Component getListCellRendererComponent(JList list, Object value, + int index, boolean isSelected, boolean cellHasFocus) { + setText((value == null) ? "" : value.toString()); + return this; + } +} \ No newline at end of file diff --git a/src/main/java/GUI/TableModel.java b/src/main/java/GUI/TableModel.java new file mode 100644 index 0000000..eda7239 --- /dev/null +++ b/src/main/java/GUI/TableModel.java @@ -0,0 +1,47 @@ +package GUI; + +import javax.swing.table.AbstractTableModel; +import java.util.Arrays; + +public class TableModel extends AbstractTableModel { + private String[] columnNames; + private Object[][] data; + private int headerSize; + private int day; + + public TableModel(int day, int currentPage, int headerSize) { + this.day = day; + columnNames = new String[this.day]; + data = new Object[5][this.day]; + for (int i = 0; i < this.day; i++) { + this.columnNames[i] = "Jour " + ((i + 1) + (5 * (currentPage))); + } + for (int i = 0; i < 5; i++) { + Arrays.fill(data[i], ""); + } + } + @Override + public int getRowCount() { + return data.length; + } + + @Override + public int getColumnCount() { + return columnNames.length; + } + + @Override + public String getColumnName(int column) { + return columnNames[column]; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + return data[rowIndex][columnIndex]; + } + + @Override + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + data[rowIndex][columnIndex] = aValue; + } +}