package cmpt213.assignment4.packagedeliveries.client.view; import cmpt213.assignment4.packagedeliveries.client.control.PackageDeliveriesTracker; import cmpt213.assignment4.packagedeliveries.client.control.PackageFactory; import cmpt213.assignment4.packagedeliveries.client.model.PackageInfo; import com.github.lgooddatepicker.components.DateTimePicker; import com.github.lgooddatepicker.optionalusertools.DateTimeChangeListener; import com.github.lgooddatepicker.zinternaltools.DateTimeChangeEvent; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.time.LocalDateTime; public class Input extends JDialog implements ActionListener, DateTimeChangeListener { private final PackageDeliveriesTracker pInstance = PackageDeliveriesTracker.getInstance(); private final JLabel typeLabel; private final JPanel typePanel; private final JTextField typeTf; private final DateTimePicker dd; private final DateTimePicker ed; private LocalDateTime deliveryDate, expiryDate; private final JTextField nameField; private final JTextField noteField; private final JTextField priceField; private final JTextField weightField; private final JTextField dateField; private int pType; public Input(Frame main) { super(main, "add a package", true); JPanel p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS)); String[] type = {"book", "perishable", "electronic"}; JComboBox packageType = new JComboBox<>(type); packageType.setPreferredSize(new Dimension(300, 30)); packageType.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String p = (String) packageType.getSelectedItem(); switch (p) { case "book": typeTf.setVisible(true); ed.setVisible(false); typeLabel.setText("author name"); pType = 0; break; case "perishable": typeTf.setVisible(false); ed.setVisible(true); ed.addDateTimeChangeListener(new DateTimeChangeListener() { @Override public void dateOrTimeChanged(DateTimeChangeEvent dateTimeChangeEvent) { expiryDate = ed.getDateTimePermissive(); } }); typePanel.add(ed); typeLabel.setText("expiry date"); pType = 1; break; case "electronic": typeTf.setVisible(true); ed.setVisible(false); typeLabel.setText("handling fee"); pType = 2; } } }); // Panel for package name nameField = new JTextField(); JPanel name = new JPanel(); JLabel nameLabel = new JLabel(); name.setLayout(new BoxLayout(name, BoxLayout.X_AXIS)); nameLabel.setText("name:"); nameLabel.setPreferredSize(new Dimension(50, 25)); name.add(nameLabel); name.add(nameField); name.setPreferredSize(new Dimension(200, 50)); p.add(packageType); p.add(name); JPanel note = new JPanel(); JLabel noteLabel = new JLabel(); noteField = new JTextField(); note.setLayout(new BoxLayout(note, BoxLayout.X_AXIS)); noteLabel.setText("note:"); noteLabel.setPreferredSize(new Dimension(50, 25)); note.add(noteLabel); note.add(noteField); note.setPreferredSize(new Dimension(200, 50)); p.add(note); JPanel price = new JPanel(); JLabel priceLabel = new JLabel(); priceField = new JTextField(); price.setLayout(new BoxLayout(price, BoxLayout.X_AXIS)); priceLabel.setText("price:"); priceLabel.setPreferredSize(new Dimension(50, 25)); price.add(priceLabel); price.add(priceField); price.setPreferredSize(new Dimension(200, 50)); p.add(price); JPanel weight = new JPanel(); JLabel weightLabel = new JLabel(); weightField = new JTextField(); weight.setLayout(new BoxLayout(weight, BoxLayout.X_AXIS)); weightLabel.setText("weight:"); weightLabel.setPreferredSize(new Dimension(50, 25)); weight.add(weightLabel); weight.add(weightField); weight.setPreferredSize(new Dimension(200, 50)); p.add(weight); JPanel date = new JPanel(); JLabel dateLabel = new JLabel(); dateField = new JTextField(); date.setLayout(new BoxLayout(date, BoxLayout.X_AXIS)); dateLabel.setText("date:"); dateLabel.setPreferredSize(new Dimension(50, 25)); dd = new DateTimePicker(); dd.addDateTimeChangeListener(this); date.add(dateLabel); date.add(dd); date.setPreferredSize(new Dimension(200, 50)); p.add(date); typePanel = new JPanel(); typePanel.setLayout(new BoxLayout(typePanel, BoxLayout.X_AXIS)); typeLabel = new JLabel(); typeLabel.setText("author:"); typeLabel.setPreferredSize(new Dimension(50, 25)); typeTf = new JTextField(); typePanel.add(typeLabel); typePanel.add(typeTf); typePanel.setPreferredSize(new Dimension(200, 50)); ed = new DateTimePicker(); p.add(typePanel); JPanel actionButton = new JPanel(); actionButton.setLayout(new BoxLayout(actionButton, BoxLayout.X_AXIS)); JButton ok = new JButton("ok"); JButton cancel = new JButton("cancel"); ok.addActionListener(this); cancel.addActionListener(this); actionButton.add(ok); actionButton.add(cancel); p.add(actionButton); // Dialog box dimensions getContentPane().setSize(500, 500); getContentPane().add(p); pack(); this.setVisible(true); } @Override public void dateOrTimeChanged(DateTimeChangeEvent dateTimeChangeEvent) { deliveryDate = dd.getDateTimePermissive(); } @Override public void actionPerformed(ActionEvent e) { String actionString = e.getActionCommand(); switch (actionString) { case "ok": addPackage(); break; case "cancel": this.dispose(); break; } } private void addPackage() { try { PackageFactory.PackageType type = PackageFactory.PackageType.Book; String pName = nameField.getText(); String pNote = noteField.getText(); double pPrice = 0.0; pPrice = Double.parseDouble(priceField.getText()); if (pPrice < 0) { JOptionPane.showMessageDialog(this, "price cannot be less than 0", "error", JOptionPane.WARNING_MESSAGE); } double pWeight = 0.0; pWeight = Double.parseDouble(weightField.getText()); if (pWeight < 0) { JOptionPane.showMessageDialog(this, "weight cannot be less than 0", "error", JOptionPane.WARNING_MESSAGE); } String pAuthor = ""; double pHandlingFee = 0.0; if (pType == 0) { pAuthor = typeTf.getText(); if (pAuthor.equals("")) { JOptionPane.showMessageDialog(this, "author name can not be empty", "error", JOptionPane.WARNING_MESSAGE); return; } } else if (pType == 1) { type = PackageFactory.PackageType.Electronic; pHandlingFee = Double.parseDouble(typeTf.getText()); if (pHandlingFee < 0) { JOptionPane.showMessageDialog(this, "Handling fee cannot be less than 0", "error", JOptionPane.WARNING_MESSAGE); } } else { type = PackageFactory.PackageType.Perishable; } if (pName.equals("")) { JOptionPane.showMessageDialog(this, "name cannot be empty", "error", JOptionPane.WARNING_MESSAGE); return; } PackageInfo p = PackageFactory.create(type, pName, pNote, pPrice, pWeight, false, deliveryDate, pAuthor, expiryDate, pHandlingFee); pInstance.addPackage(p); dispose(); } catch (Exception e) { JOptionPane.showMessageDialog(this, "error in input, please check again", "error", JOptionPane.WARNING_MESSAGE); } } }