package cmpt213.assignment4.packagedeliveries.client.view; import cmpt213.assignment4.packagedeliveries.client.control.PackageDeliveriesTracker; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; public class JavaSwingUI implements ActionListener { private final PackageDeliveriesTracker pTracker = PackageDeliveriesTracker.getInstance(); JFrame uiFrame; JPanel uiPanel; JScrollPane scrollView; PACKAGE_FILTER_OPTION option = PACKAGE_FILTER_OPTION.ALL; ; public void displayMainPage() { pTracker.load(); uiFrame = new JFrame("Package deliveries tracker"); uiFrame.setSize(500, 500); uiFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); uiFrame.setLayout(new BoxLayout(uiFrame.getContentPane(), BoxLayout.Y_AXIS)); uiFrame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { pTracker.save(); super.windowClosing(e); uiFrame.dispose(); } }); uiFrame.setVisible(true); dsplayOptionButtons(); addButtons(); setupScrollPane(); refreshPackageList(); } private void setupScrollPane() { uiPanel = new JPanel(); scrollView = new JScrollPane(uiPanel); uiPanel.setLayout(new BoxLayout(uiPanel, BoxLayout.Y_AXIS)); scrollView.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); uiPanel.add(Box.createVerticalGlue()); uiFrame.getContentPane().add(scrollView); uiFrame.pack(); } private void displayPackages(ArrayList packages) { uiPanel.removeAll(); uiPanel.setLayout(new BoxLayout(uiPanel, BoxLayout.Y_AXIS)); scrollView.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); uiPanel.add(Box.createVerticalGlue()); uiFrame.getContentPane().add(scrollView); System.out.println(packages); if (packages.get(0) != "No packages to show") { for (int i = 0; i < packages.size(); i++) { JPanel p = new JPanel(); JTextPane pkgPane = new JTextPane(); pkgPane.setEditable(false); pkgPane.setText(packages.get(i)); p.add(pkgPane); if (option == PACKAGE_FILTER_OPTION.ALL) { JButton remove = new JButton(); int finalI = i; remove.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { pTracker.removePcakage(finalI); refreshPackageList(); } }); remove.setText("Remove"); p.add(remove); JCheckBox delivered = new JCheckBox("Delivered?"); delivered.setBounds(100, 100, 50, 50); delivered.setSelected(pTracker.isDelivered(i)); int finalI1 = i; delivered.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { delivered.setSelected(true); pTracker.setDelivered(finalI1); refreshPackageList(); } }); p.add(delivered); } uiPanel.add(p); } } uiFrame.validate(); uiFrame.pack(); } private void addButtons() { JButton add = new JButton("Add a package"); JPanel addPanel = new JPanel(); addPanel.setLayout(new BoxLayout(addPanel, BoxLayout.X_AXIS)); addPanel.add(add); addPanel.setPreferredSize(new Dimension(500, 50)); uiFrame.add(addPanel); add.addActionListener(this); } private void dsplayOptionButtons() { JButton btnAll = new JButton("All"); JButton btnOverdue = new JButton("Overdue"); JButton btnUpcoming = new JButton("Upcoming"); btnAll.addActionListener(this); btnOverdue.addActionListener(this); btnUpcoming.addActionListener(this); JPanel btnPanel = new JPanel(); btnPanel.setLayout(new BoxLayout(btnPanel, BoxLayout.X_AXIS)); btnPanel.add(btnAll); btnPanel.add(btnOverdue); btnPanel.add(btnUpcoming); btnPanel.setPreferredSize(new Dimension(500, 50)); uiFrame.add(btnPanel); } @Override public void actionPerformed(ActionEvent e) { String actionString = e.getActionCommand(); switch (actionString) { case "Add a package": addPackage(); break; case "All": option = PACKAGE_FILTER_OPTION.ALL; refreshPackageList(); break; case "Overdue": option = PACKAGE_FILTER_OPTION.OVERDUE; refreshPackageList(); break; case "Upcoming": option = PACKAGE_FILTER_OPTION.UPCOMING; refreshPackageList(); break; } } private void addPackage() { new Input(uiFrame); refreshPackageList(); } private void refreshPackageList() { switch (option) { case ALL: ArrayList allPackages = pTracker.getAllPackages(); displayPackages(allPackages); break; case OVERDUE: ArrayList overDuePkg = pTracker.overDuePackages(); displayPackages(overDuePkg); break; case UPCOMING: ArrayList upcomingPkg = pTracker.upcomingPackages(); displayPackages(upcomingPkg); break; } } enum PACKAGE_FILTER_OPTION {ALL, OVERDUE, UPCOMING} }