You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
248 lines
9.6 KiB
248 lines
9.6 KiB
package cmpt213.assignment4.packagedeliveries.client.view;
|
|
|
|
import cmpt213.assignment4.packagedeliveries.client.control.PackageDeliveriesTracker;
|
|
import cmpt213.assignment4.packagedeliveries.client.model.PackageInfo;
|
|
import com.privatejgoodies.common.base.SystemUtils;
|
|
|
|
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.io.BufferedReader;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.io.InputStreamReader;
|
|
import java.nio.charset.StandardCharsets;
|
|
import java.util.ArrayList;
|
|
import java.util.stream.Collectors;
|
|
|
|
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();
|
|
// curlGetCommand("/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) {
|
|
//trigger the save operation at the webserver
|
|
curlGetCommand("/exit");
|
|
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<PackageInfo> packages) {
|
|
ArrayList<String> packageString = new ArrayList<>();
|
|
if (packages != null) {
|
|
for (PackageInfo p : packages) {
|
|
// System.out.println(p.toString() + "----> p");
|
|
packageString.add(p.toString());
|
|
}
|
|
} else packageString.add("No packages to show");
|
|
uiPanel.removeAll();
|
|
uiPanel.setLayout(new BoxLayout(uiPanel, BoxLayout.Y_AXIS));
|
|
scrollView.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
|
|
uiPanel.add(Box.createVerticalGlue());
|
|
uiFrame.getContentPane().add(scrollView);
|
|
if (packageString.size() > 0 && packageString.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(packageString.get(i));
|
|
p.add(pkgPane);
|
|
if (option == PACKAGE_FILTER_OPTION.ALL) {
|
|
JButton remove = new JButton();
|
|
int finalI = i;
|
|
int finalI2 = i;
|
|
remove.addActionListener(new ActionListener() {
|
|
@Override
|
|
public void actionPerformed(ActionEvent e) {
|
|
//pTracker.removePcakage(finalI);
|
|
curlPostCommand("/removePackage", packages.get(finalI2));
|
|
refreshPackageList();
|
|
}
|
|
});
|
|
remove.setText("Remove");
|
|
p.add(remove);
|
|
|
|
JCheckBox delivered = new JCheckBox("Delivered?");
|
|
delivered.setBounds(100, 100, 50, 50);
|
|
Boolean deliveredStatus = packageString.get(i).contains("Delivered? yes");
|
|
delivered.setSelected(deliveredStatus);
|
|
int finalI1 = i;
|
|
delivered.addActionListener(new ActionListener() {
|
|
@Override
|
|
public void actionPerformed(ActionEvent e) {
|
|
delivered.setSelected(true);
|
|
curlPostCommand("/markPackageAsDelivered", packages.get(finalI2));
|
|
refreshPackageList();
|
|
}
|
|
});
|
|
p.add(delivered);
|
|
}
|
|
uiPanel.add(p);
|
|
}
|
|
} else {
|
|
JPanel p = new JPanel();
|
|
JTextPane pkgPane = new JTextPane();
|
|
pkgPane.setEditable(false);
|
|
pkgPane.setText("No packages to show");
|
|
p.add(pkgPane);
|
|
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<PackageInfo> allPackages = curlGetCommand("/listAll");
|
|
// System.out.println(allPackages + " allPackages -> refreshPackageList ALL");
|
|
displayPackages(allPackages);
|
|
break;
|
|
case OVERDUE:
|
|
ArrayList<PackageInfo> overDuePkg = curlGetCommand("/listOverduePackage");
|
|
// System.out.println(overDuePkg + " overDuePkg -> refreshPackageList OVERDUE");
|
|
displayPackages(overDuePkg);
|
|
break;
|
|
case UPCOMING:
|
|
ArrayList<PackageInfo> upcomingPkg = curlGetCommand("/listUpcomingPackage");
|
|
// System.out.println(upcomingPkg + " upcomingPkg -> refreshPackageList UPCOMING");
|
|
displayPackages(upcomingPkg);
|
|
break;
|
|
}
|
|
}
|
|
|
|
private ArrayList<PackageInfo> curlGetCommand(String operation) {
|
|
String command = "curl -X " + "GET" + " localhost:8080" + operation;
|
|
System.out.println(command + " ==> curlGetCommand");
|
|
try {
|
|
Process process = Runtime.getRuntime().exec(command);
|
|
InputStream stdOutput = process.getInputStream();
|
|
String allPkg = new BufferedReader(
|
|
new InputStreamReader(stdOutput, StandardCharsets.UTF_8))
|
|
.lines()
|
|
.collect(Collectors.joining("\n"));
|
|
return pTracker.deserializePackageString(allPkg);
|
|
} catch (IOException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
}
|
|
|
|
private void curlPostCommand(String operation, PackageInfo packageInfo) {
|
|
String packageString = pTracker.serializePackage(packageInfo);
|
|
String command = null;
|
|
if (SystemUtils.IS_OS_WINDOWS) {
|
|
System.out.println(System.getProperty("os.name").toLowerCase());
|
|
packageString=packageString.replace("\"","\\\"");
|
|
command = "curl -i -H \"Content-Type: application/json\" -X " + "POST -d " + packageString + " localhost:8080" + operation;
|
|
System.out.println(command + " ==> curlPostCommand");
|
|
}
|
|
else if(SystemUtils.IS_OS_MAC) {
|
|
System.out.println(System.getProperty("os.name").toLowerCase());
|
|
command = "curl -i -H Content-Type: application/json -X POST -d " + packageString + " localhost:8080" + operation;
|
|
}
|
|
try {
|
|
Process process = Runtime.getRuntime().exec(command);
|
|
InputStream stdOutput = process.getInputStream();
|
|
String allPkg = new BufferedReader(
|
|
new InputStreamReader(stdOutput, StandardCharsets.UTF_8))
|
|
.lines()
|
|
.collect(Collectors.joining("\n"));
|
|
return;
|
|
} catch (IOException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
}
|
|
|
|
enum PACKAGE_FILTER_OPTION {ALL, OVERDUE, UPCOMING}
|
|
}
|
|
|