diff --git a/.gitignore b/.gitignore index 2dd483e..e57e8a2 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ SENG202.iml .settings/ doc/ res/session.ser +res/userdb.db \ No newline at end of file diff --git a/src/main/java/seng202/group9/Controller/Dataset.java b/src/main/java/seng202/group9/Controller/Dataset.java index 2aff0d5..71560f1 100644 --- a/src/main/java/seng202/group9/Controller/Dataset.java +++ b/src/main/java/seng202/group9/Controller/Dataset.java @@ -1287,6 +1287,7 @@ public class Dataset { totalDistVal,latitudeVal, longitudeVal); updateFlightPointInfo(flightPathDictionary.get(Integer.valueOf(id))); flightPathDictionary.get(Integer.valueOf(id)).addFlightPoint(pointToAdd, index); + flightPointDictionary.put(pointID + 1, pointToAdd); } /*** diff --git a/src/main/java/seng202/group9/Controller/EntryParser.java b/src/main/java/seng202/group9/Controller/EntryParser.java index 18c62cb..b7e2e18 100644 --- a/src/main/java/seng202/group9/Controller/EntryParser.java +++ b/src/main/java/seng202/group9/Controller/EntryParser.java @@ -135,7 +135,7 @@ public class EntryParser { //name name = name.toUpperCase(); if (!isLetter(name)) { - throw new DataException("ICAO code must contain only letters"); + throw new DataException("ICAO code (name field) must contain only letters"); } //type type = type.toUpperCase(); diff --git a/src/main/java/seng202/group9/Controller/SceneCode.java b/src/main/java/seng202/group9/Controller/SceneCode.java index cdbd254..7dae90a 100644 --- a/src/main/java/seng202/group9/Controller/SceneCode.java +++ b/src/main/java/seng202/group9/Controller/SceneCode.java @@ -12,7 +12,8 @@ public enum SceneCode { AIRPORT_DIST_CALC("airport_dist_calc.fxml"), AIRLINE_ADD("airline_add_form.fxml"), AIRLINE_FILTER("airline_filter_form.fxml"), AIRPORT_ADD("airport_add_form.fxml"), AIRPORT_FILTER("airport_filter_form.fxml"), ROUTE_ADD("route_add_form.fxml"), ROUTE_FILTER("route_filter_form.fxml"), AIRLINE_EDIT("airline_edit_form.fxml"), AIRPORT_EDIT("airport_edit_form.fxml"), - ROUTE_EDIT("route_edit_form.fxml"), FLIGHT_EDITOR("flight_editor_form.fxml"), DATASET_CONTROLLER("dataset_editor.fxml"), HELP("help.fxml"); + ROUTE_EDIT("route_edit_form.fxml"), FLIGHT_EDITOR("flight_editor_form.fxml"), DATASET_CONTROLLER("dataset_editor.fxml"), HELP("help.fxml"), + FLIGHT_ADD("flight_add_form.fxml"); private String filePath; diff --git a/src/main/java/seng202/group9/GUI/FlightAddController.java b/src/main/java/seng202/group9/GUI/FlightAddController.java new file mode 100644 index 0000000..d33f44a --- /dev/null +++ b/src/main/java/seng202/group9/GUI/FlightAddController.java @@ -0,0 +1,75 @@ +package seng202.group9.GUI; + +import javafx.fxml.FXML; +import javafx.scene.control.Alert; +import javafx.scene.control.Button; +import javafx.scene.control.TextField; +import javafx.stage.Stage; +import seng202.group9.Controller.Dataset; +import seng202.group9.Controller.Session; + +/** + * Created by Sunguin on 2016/10/01. + */ +public class FlightAddController extends Controller { + //Set up text fields for adding data + @FXML + private TextField fNameAdd; + @FXML + private TextField fTypeAdd; + @FXML + private TextField fViaAdd; + @FXML + private TextField fAltitudeAdd; + @FXML + private TextField fLatitudeAdd; + @FXML + private TextField fLongitudeAdd; + @FXML + private TextField fHeadingAdd; + @FXML + private TextField fLegDistAdd; + @FXML + private TextField fTotDistAdd; + @FXML + private Button flightAddButton; + + //Set an empty Dataset to be assigned later + private Dataset theDataSet = null; + + private Session currentSession = null; + + public void load() { + theDataSet = getParent().getCurrentDataset(); + currentSession = getParent().getSession(); + } + + public void addFlight() { + try { + theDataSet.addFlightPointToPath(currentSession.getCurrentFlightPathID(), + fNameAdd.getText(), + fTypeAdd.getText(), + fViaAdd.getText(), + fAltitudeAdd.getText(), + fLatitudeAdd.getText(), + fLongitudeAdd.getText(), + fHeadingAdd.getText(), + fLegDistAdd.getText(), + fTotDistAdd.getText()); + Alert alert = new Alert(Alert.AlertType.INFORMATION); + alert.setTitle("Flight Point Add Successful"); + alert.setHeaderText("New Flight Point added!"); + alert.setContentText("Your new flight point has been successfully added into the database."); + alert.showAndWait(); + + Stage stage = (Stage) flightAddButton.getScene().getWindow(); + stage.close(); + } catch ( Exception e ) { + Alert alert = new Alert(Alert.AlertType.ERROR); + alert.setTitle("Flight Point Data Error"); + alert.setHeaderText("Error adding a custom flight point entry."); + alert.setContentText(e.getMessage()); + alert.showAndWait(); + } + } +} diff --git a/src/main/java/seng202/group9/GUI/FlightRDController.java b/src/main/java/seng202/group9/GUI/FlightRDController.java index a55939a..74594a2 100644 --- a/src/main/java/seng202/group9/GUI/FlightRDController.java +++ b/src/main/java/seng202/group9/GUI/FlightRDController.java @@ -53,22 +53,24 @@ public class FlightRDController extends Controller { ListView flightPathListView; private ObservableList flightList = FXCollections.observableArrayList(); - @FXML - private TextField flightNameBox; - @FXML - private TextField flightTypeBox; - @FXML - private TextField flightAltitudeBox; - @FXML - private TextField flightLatitudeBox; - @FXML - private TextField flightLongitudeBox; - @FXML - private TextField flightHeadingBox; - @FXML - private TextField flightLegDistBox; - @FXML - private TextField flightTotDistBox; +// @FXML +// private TextField flightNameBox; +// @FXML +// private TextField flightTypeBox; +// @FXML +// private TextField flightViaBox; +// @FXML +// private TextField flightAltitudeBox; +// @FXML +// private TextField flightLatitudeBox; +// @FXML +// private TextField flightLongitudeBox; +// @FXML +// private TextField flightHeadingBox; +// @FXML +// private TextField flightLegDistBox; +// @FXML +// private TextField flightTotDistBox; /** * Loads the Flight paths into the List View and waits for a mouse clicked event for which it will update the table @@ -142,35 +144,12 @@ public class FlightRDController extends Controller { /** * Will take the inputs from the text fields and adds the point to the current flight path. */ - public void addFlightPoint() { - - try { - theDataSet.addFlightPointToPath(currentPathId, - flightNameBox.getText(), - flightTypeBox.getText(), - "", - flightAltitudeBox.getText(), - flightLatitudeBox.getText(), - flightLongitudeBox.getText(), - flightHeadingBox.getText(), - flightLegDistBox.getText(), - flightTotDistBox.getText()); - flightNameBox.clear(); - flightTypeBox.clear(); - flightAltitudeBox.clear(); - flightLatitudeBox.clear(); - flightLongitudeBox.clear(); - flightHeadingBox.clear(); - flightLegDistBox.clear(); - flightTotDistBox.clear(); - - updateTable(currentPathIndex); - } catch ( Exception e ) { - Alert alert = new Alert(Alert.AlertType.ERROR); - alert.setTitle("Flight Point Data Error"); - alert.setHeaderText("Error adding a custom flight point entry."); - alert.setContentText(e.getMessage()); - } + public void openAdd() { + Session session = getParent().getSession(); + session.setCurrentFlightPathtID(currentPathId); + createPopUpStage(SceneCode.FLIGHT_ADD, 600, 400); + //flightTableView.setItems(FXCollections.observableArrayList(theDataSet.getAirports())); + updateTable(currentPathIndex); } /** @@ -325,4 +304,8 @@ public class FlightRDController extends Controller { } } + public void flightSummaryButton() { + replaceSceneContent(SceneCode.FLIGHT_SUMMARY); + } + } \ No newline at end of file diff --git a/src/main/java/seng202/group9/GUI/FlightSummaryController.java b/src/main/java/seng202/group9/GUI/FlightSummaryController.java index f683c61..62c4281 100644 --- a/src/main/java/seng202/group9/GUI/FlightSummaryController.java +++ b/src/main/java/seng202/group9/GUI/FlightSummaryController.java @@ -37,8 +37,6 @@ public class FlightSummaryController extends Controller { private int currentPathId = 0; private int currentPathIndex = 0; - @FXML - private Button flightRawData; private Map map; @FXML private WebView mapView; @@ -133,7 +131,6 @@ public class FlightSummaryController extends Controller { infoList.add("ICAO codes not being present in the Airline"); infoList.add("Database!"); } - flightSummaryListView.setItems(infoList); } catch(Exception e) { e.printStackTrace(); @@ -173,6 +170,7 @@ public class FlightSummaryController extends Controller { e.printStackTrace(); } } + /** * Used to load the page from the MenuController. */ @@ -209,6 +207,7 @@ public class FlightSummaryController extends Controller { }); } } + /** * Removes the selected path from the list view of paths and from the database. */ diff --git a/src/main/java/seng202/group9/GUI/HelpController.java b/src/main/java/seng202/group9/GUI/HelpController.java index 226eff6..ee6dd23 100644 --- a/src/main/java/seng202/group9/GUI/HelpController.java +++ b/src/main/java/seng202/group9/GUI/HelpController.java @@ -1,78 +1,174 @@ package seng202.group9.GUI; -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; import javafx.fxml.FXML; -import javafx.scene.control.ListView; -import javafx.scene.control.TextArea; -import javafx.scene.layout.Pane; +import javafx.scene.control.TreeItem; +import javafx.scene.control.TreeView; import javafx.scene.text.Text; import javafx.scene.text.TextFlow; /** - * Created by spe76 on 30/09/16. + * The GUI controller class for help.fxml. + * Extends from the abstract class {@link Controller}. + * Created by Sunguin. */ public class HelpController extends Controller { @FXML - private ListView listView; + private TreeView treeView; @FXML private TextFlow textArea; - public static final ObservableList menu = FXCollections.observableArrayList(); Text text = new Text(); + //The TreeItems for the TreeView. + TreeItem main_root = new TreeItem("Main Root"); + + TreeItem importing = new TreeItem("Importing Data"); + TreeItem importing_start = new TreeItem("Importing on Startup"); + TreeItem importing_after = new TreeItem("Importing after Startup"); + + TreeItem viewing = new TreeItem("Viewing Data"); + TreeItem summary_viewing = new TreeItem("Viewing Summary Data"); + TreeItem raw_viewing = new TreeItem("Viewing Raw Data"); + + TreeItem manipulating = new TreeItem("Manipulating Data"); + TreeItem adding = new TreeItem("Adding Data"); + TreeItem filter = new TreeItem("Filtering Data"); + TreeItem edit = new TreeItem("Editing Data"); + TreeItem delete = new TreeItem("Deleting Data"); + + TreeItem analysing = new TreeItem("Analysing Data"); + TreeItem graphing = new TreeItem("Graphs"); + TreeItem distance = new TreeItem("Distance Calculator"); + + /** + * Loads the TreeView and sets up the TreeView. + */ public void load() { - menu.addAll("Importing Data", "Viewing Data", "Manipulating Data", "Analysis"); + treeView.setRoot(main_root); + treeView.setShowRoot(false); + + main_root.getChildren().add(importing); + importing.getChildren().add(importing_start); + importing.getChildren().add(importing_after); + + main_root.getChildren().add(viewing); + viewing.getChildren().add(summary_viewing); + viewing.getChildren().add(raw_viewing); + + main_root.getChildren().add(manipulating); + manipulating.getChildren().add(adding); + manipulating.getChildren().add(filter); + manipulating.getChildren().add(edit); + manipulating.getChildren().add(delete); + + main_root.getChildren().add(analysing); + analysing.getChildren().add(graphing); + analysing.getChildren().add(distance); text = new Text("Please select an option on the left side menu to display its contents."); textArea.getChildren().add(text); - - listView.setItems(menu); } - public void sss() { - String menuValue = listView.getSelectionModel().getSelectedItem().toString(); - textArea.getChildren().clear(); - if (menuValue == "Importing Data") { - text = new Text("You can import data from the first start up of the application and " + - "from the 'File' menu on the top of the screen.\nTo import data, select the type " + - "of data you wish to import. Then select the file (.csv and .txt file) from the " + - "file selector. The data will be loaded into the program and taken to the " + - "corresponding summary page."); - textArea.getChildren().add(text); - } else if (menuValue == "Viewing Data") { - text = new Text("There are two types of views available: Summary view and Raw Data view. " + - "These are accessable from the menu on the top of the screen under the " + - "'View' tab. You first choose which set of data you want to view and then you can select" + - " either 'Summary' or 'Raw Data'.\n" + - "The summary view does not have every column but provides a map of where the " + - "place is.\nThe raw data view allows the user to view the full data table."); - textArea.getChildren().add(text); - } else if (menuValue == "Manipulating Data") { - text = new Text("Data manipulation is all available in the Raw Data views. There are four " + - "ways to manipulate data: 'Add', 'Filter', 'Edit' and 'Delete'.\n" + - "Add: To add a new entry, first go to the raw data view for that data type. Then click " + - "on the add button located on the bottom of the page. Then fill out the entries in the " + - "pop-up box and click add at the bottom of the screen. If there is an error with your entry, " + - "a message will pop up to help you.\n" + - "Filter: To filter all current entries, click on the filter option and a pop " + - "up will appear. Then type in the fields you wish to filter by and press the filter button. " + - "The table should update with the fields specified.\n" + - "Edit: The edit function can be accessed by right clicking on the entry you wish to edit and" + - " clicking the edit option. This will lead to a pop up where you can edit the current entry. " + - " When the edit has been completed, you can press the apply button on the bottom of the pop up. " + - "Again, when the program detects an invalid field, a message will pop up.\n" + - "Delete: The delete function is also accessed by right clicking an entry and pressing the delete field. " + - "This will come up with a pop up to confirm your delete. When you press ok, the entry will be deleted " + - "from the program. The program also allows multiple deletes."); - textArea.getChildren().add(text); - } else if (menuValue == "Analysis") { - text = new Text("There are two ways to do analysis.\nThe first method is to go to the raw data page and " + - "press analyse. This will come up with specific graphs that are related to the set of data." + - "\nThe second method is by accessing the 'Analysis' button on the menu on the top of the page. " + - "You can select which type of analysis you want from here."); - textArea.getChildren().add(text); - } + /** + * Changes the text in the TextFlow depending on which option has been selected in the TreeView. + */ + public void changeView() { + treeView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() { + + public void changed(ObservableValue observable, Object oldValue, + Object newValue) { + TreeItem selectedItem = (TreeItem) newValue; + String menuValue = selectedItem.getValue(); + + if ( menuValue != null ){ + textArea.getChildren().clear(); + if (menuValue.equals("Importing on Startup")) { + text = new Text("Importing on Startup\n" + "You can import data from the first start up of the application." + + "\nTo import data, select the type of data you wish to import along the bottom of the screen." + + " Then select the file (.csv and .txt file) from the " + + "file selector. The data will be loaded into the program and taken to the " + + "corresponding summary page."); + textArea.getChildren().add(text); + + } else if (menuValue.equals("Importing after Startup")) { + text = new Text("Importing after Startup\n" + + "You can import data from the 'File' menu on the top of the screen.\n" + + "To import data, select the type of data you wish to import. " + + "Then select the file (.csv and .txt file) from the file selector. " + + "The data will be loaded into the program and taken to the corresponding summary page."); + textArea.getChildren().add(text); + + } else if (menuValue.equals("Viewing Summary Data")) { + text = new Text("Viewing Summary Data\n" + + "The summary data view consists of a reduced version of the data and a map of the currently selected value. " + + "The flight summary data also has a flight path selector to select which flight points you want to view.\n" + + "The summary views are accessible from the menu on the top of the screen under the " + + "'View' tab. You first choose which set of data you want to view and then you can select 'Summary'." + + "\nEach summary page also has buttons that lead to their corresponding raw data view and the other summary views."); + textArea.getChildren().add(text); + + } else if (menuValue.equals("Viewing Raw Data")) { + text = new Text("Viewing Raw Data\n" + + "The raw data view allows the user to view the full data table." + + "The user can also add, filter, edit and delete data values as well.\n" + + "These are accessible from the menu on the top of the screen under the " + + "'View' tab. You first choose which set of data you want to view and then you can select 'Raw Data'.\n" + + "The summary view does not have every column but provides a map of where the " + + "The raw data page also has buttons that lead to the analysis of that type of data and to go back to the" + + " corresponding summary page."); + textArea.getChildren().add(text); + + } else if (menuValue.equals("Adding Data")) { + text = new Text("Adding Data\n" + + "To add a new entry, first go to the raw data view for that data type. Then click " + + "on the add button located on the bottom of the page. Then fill out the entries in the " + + "pop-up box and click add at the bottom of the screen. " + + "When the program detects an invalid field, a message will pop up and state where the error is."); + textArea.getChildren().add(text); + + } else if (menuValue.equals("Filtering Data")) { + text = new Text("Filtering Data\n" + + "To filter all current entries, click on the filter option and a pop " + + "up will appear. Then type in the fields the values you wish to filter by and press the filter button. " + + "The table should update with the fields specified."); + textArea.getChildren().add(text); + + } else if (menuValue.equals("Editing Data")) { + text = new Text("Editing Data\n" + + "The edit function can be accessed by right clicking on the entry you wish to edit and" + + " clicking the edit option. This will lead to a pop up where you can edit the current entry." + + " When the edit has been completed, you can press the apply button on the bottom of the pop up. " + + "When the program detects an invalid field, a message will pop up and state where the error is."); + textArea.getChildren().add(text); + + } else if (menuValue.equals("Deleting Data")) { + text = new Text("Deleting Data\n" + + "The delete function is accessed by right clicking an entry and pressing the delete option. " + + "This will come up with a pop up to confirm your delete. When you press OK, the entry will be deleted " + + "from the program. The program also allows multiple deletes."); + textArea.getChildren().add(text); + + } else if (menuValue.equals("Graphs")) { + text = new Text("Graphs\n" + "The program has the ability to produce graphs according to the type of data.\n" + + "This is done by going to the raw data page for the data you wish to graph. Then press the analyse data button" + + " on the bottom of the screen. This will produce a graph specific for that type of data."); + textArea.getChildren().add(text); + + } else if (menuValue.equals("Distance Calculator")) { + text = new Text("Distance Calculator\n" + "You can calculate the distance between two airports.\n" + + "First, go to the 'Analysis' tab on the top of the menu bar. You will be taken to a page that " + + "allows them to select two airports, one from each column and press 'Calculate' to get the distance between" + + " the two airports."); + textArea.getChildren().add(text); + } else { + text = new Text("Please select an option on the left side menu to display its contents."); + textArea.getChildren().add(text); + } + } + } + }); } } \ No newline at end of file diff --git a/src/main/resources/airline_summary.fxml b/src/main/resources/airline_summary.fxml index 59bd2a1..6e8598c 100644 --- a/src/main/resources/airline_summary.fxml +++ b/src/main/resources/airline_summary.fxml @@ -2,95 +2,70 @@ - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + diff --git a/src/main/resources/airport_summary.fxml b/src/main/resources/airport_summary.fxml index baf4ad2..bd89bf6 100644 --- a/src/main/resources/airport_summary.fxml +++ b/src/main/resources/airport_summary.fxml @@ -2,98 +2,70 @@ - - - - - + + + - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - + diff --git a/src/main/resources/flight_add_form.fxml b/src/main/resources/flight_add_form.fxml new file mode 100644 index 0000000..896e86f --- /dev/null +++ b/src/main/resources/flight_add_form.fxml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/src/main/resources/flight_raw_data.fxml b/src/main/resources/flight_raw_data.fxml index 06111a4..b0bfb26 100644 --- a/src/main/resources/flight_raw_data.fxml +++ b/src/main/resources/flight_raw_data.fxml @@ -6,173 +6,102 @@ - - - - + - - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/src/main/resources/getting_started.fxml b/src/main/resources/getting_started.fxml index f8510bc..932647e 100644 --- a/src/main/resources/getting_started.fxml +++ b/src/main/resources/getting_started.fxml @@ -1,12 +1,15 @@ - - - - - + + + + + + + + - + @@ -40,37 +43,23 @@ - diff --git a/src/main/resources/help.fxml b/src/main/resources/help.fxml index 6f1d0bd..ff98d86 100644 --- a/src/main/resources/help.fxml +++ b/src/main/resources/help.fxml @@ -1,13 +1,16 @@ - - - - - - + + + + + + + + + - + @@ -23,11 +26,6 @@ - - - - - @@ -36,6 +34,11 @@ + + + + + diff --git a/src/main/resources/routes_summary.fxml b/src/main/resources/routes_summary.fxml index 70f78b3..404697f 100644 --- a/src/main/resources/routes_summary.fxml +++ b/src/main/resources/routes_summary.fxml @@ -2,98 +2,70 @@ - - - - - + + + - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - +