diff --git a/src/main/java/seng202/group9/GUI/BarChooserController.java b/src/main/java/seng202/group9/GUI/BarChooserController.java index 3dfd0ef..3cbed70 100644 --- a/src/main/java/seng202/group9/GUI/BarChooserController.java +++ b/src/main/java/seng202/group9/GUI/BarChooserController.java @@ -32,17 +32,18 @@ public class BarChooserController extends Controller{ ObservableList airportOptions = FXCollections.observableArrayList("Name", "ICAO", "IATA FFA", "Altitude", "City", "Country"); - ObservableList airlineOptions = FXCollections.observableArrayList("ID", "Name", "ICAO", "IATA", "Alias", + ObservableList airlineOptions = FXCollections.observableArrayList("Name", "ICAO", "IATA", "Alias", "Call Sign", "Active", "Country"); - ObservableList routeOptions = FXCollections.observableArrayList("ID", "Stops", "Codeshare", "Equipment", "Airline", - "Departure Airport", "Arival airport"); + ObservableList routeOptions = FXCollections.observableArrayList("Stops", "Codeshare", "Equipment", "Airline", + "Departure Airport", "Arrival airport"); ArrayList allOptions = new ArrayList(); public void buildGraph() { Session currentsession = this.getParent().getSession(); - currentsession.setSelectedgraphagainst(graph_options.getSelectionModel().getSelectedItem().toString()); + ArrayList temp = new ArrayList<>(graph_options.getSelectionModel().getSelectedItems()); + currentsession.setSelectedgraphoptions(temp); currentsession.setUsefilter(usefilter.isSelected()); currentsession.setForceGraph(Boolean.FALSE); replaceSceneContent(SceneCode.ROUTE_ANALYSER); diff --git a/src/main/java/seng202/group9/GUI/BarGraphController.java b/src/main/java/seng202/group9/GUI/BarGraphController.java index b96c1e4..0bc08ac 100644 --- a/src/main/java/seng202/group9/GUI/BarGraphController.java +++ b/src/main/java/seng202/group9/GUI/BarGraphController.java @@ -4,13 +4,18 @@ package seng202.group9.GUI; import javafx.fxml.FXML; import javafx.scene.chart.BarChart; import javafx.scene.chart.XYChart; +import javafx.scene.control.Alert; +import javafx.scene.control.ButtonBar; +import javafx.scene.control.ButtonType; import seng202.group9.Controller.Dataset; +import seng202.group9.Controller.SceneCode; import seng202.group9.Controller.Session; import seng202.group9.Core.Airline; import seng202.group9.Core.Airport; import seng202.group9.Core.Route; import java.util.ArrayList; import java.util.HashMap; +import java.util.Optional; /** @@ -34,6 +39,18 @@ public class BarGraphController extends Controller { private HashMap departureAirportData = new HashMap(); private HashMap arrivalAirportData = new HashMap(); + private HashMap nameData = new HashMap(); + private HashMap ICAOData = new HashMap(); + private HashMap IATAData = new HashMap(); + private HashMap altitudeData = new HashMap(); + private HashMap cityData = new HashMap(); + private HashMap countryData = new HashMap(); + + private HashMap aliasData = new HashMap(); + private HashMap callSignData = new HashMap(); + private HashMap activeData = new HashMap(); + + private void datasetupCustomRoute(ArrayList current_routes){ //Takes out the specified field then adds to the used data dict. for (Route entry : current_routes){ @@ -88,9 +105,287 @@ public class BarGraphController extends Controller { seriesArivals.setName("Arrivals"); seriesDeparts.setName("Departures"); //Gives the formatted data to the graph. - analyserGraph.getData().add(seriesDeparts); + for (String entry : stopsData.keySet()){ + seriesStops.getData().add(new XYChart.Data(entry,stopsData.get(entry))); + } + for (String entry : codeShareData.keySet()){ + seriesCode.getData().add(new XYChart.Data(entry,codeShareData.get(entry))); + } + for (String entry : equipmentData.keySet()){ + seriesEquipment.getData().add(new XYChart.Data(entry,equipmentData.get(entry))); + } + for (String entry : airlineData.keySet()){ + seriesAirline.getData().add(new XYChart.Data(entry,airlineData.get(entry))); + } + for (String entry : arrivalAirportData.keySet()){ + seriesArivals.getData().add(new XYChart.Data(entry,arrivalAirportData.get(entry))); + } + for (String entry : departureAirportData.keySet()){ + seriesDeparts.getData().add(new XYChart.Data(entry,departureAirportData.get(entry))); + } + if (stopsData.keySet().size() > 125 && !currentsession.getForceGraph()){ + ButtonType yes = new ButtonType("Yes", ButtonBar.ButtonData.YES); + ButtonType no = new ButtonType("No", ButtonBar.ButtonData.NO); + Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "", yes, no); + alert.setTitle("Too many fields selected"); + alert.setHeaderText("You have selected too many fields to graph."); + alert.setContentText("This could potentially cause errors in the program.\nDo you want to proceed?"); + //alert.showAndWait(); + Optional result = alert.showAndWait(); + if (result.isPresent() && result.get() == no) { + replaceSceneContent(SceneCode.PIE_GRAPH_CHOOSER); + } + } + else { + if (currentsession.getSelectedgraphoptions().contains("Stops")) { + analyserGraph.getData().add(seriesStops); + } + if (currentsession.getSelectedgraphoptions().contains("Codeshare")) { + analyserGraph.getData().add(seriesCode); + } + if (currentsession.getSelectedgraphoptions().contains("Equipment")) { + analyserGraph.getData().add(seriesEquipment); + } + if (currentsession.getSelectedgraphoptions().contains("Airline")) { + analyserGraph.getData().add(seriesAirline); + } + if (currentsession.getSelectedgraphoptions().contains("Arrival airport")) { + analyserGraph.getData().add(seriesArivals); + } + if (currentsession.getSelectedgraphoptions().contains("Departure Airport")) { + analyserGraph.getData().add(seriesDeparts); + } + } + } + + private void datasetupCustomAirport(ArrayList current_airports){ + //Takes out the specified field then adds to the used data dict. + for (Airport entry : current_airports){ + if (nameData.containsKey(entry.getName())){ + nameData.replace(String.valueOf(entry.getName()),nameData.get(entry.getName())+1); + }else { + nameData.put(String.valueOf(entry.getName()),1); + } + if (ICAOData.containsKey(entry.getICAO())){ + ICAOData.replace(String.valueOf(entry.getICAO()),ICAOData.get(entry.getICAO())+1); + }else { + ICAOData.put(String.valueOf(entry.getICAO()),1); + } + if (IATAData.containsKey(entry.getIATA_FFA())){ + IATAData.replace(String.valueOf(entry.getIATA_FFA()),IATAData.get(entry.getIATA_FFA())+1); + }else { + IATAData.put(String.valueOf(entry.getIATA_FFA()),1); + } + if (altitudeData.containsKey(entry.getAltitude())){ + altitudeData.replace(String.valueOf(entry.getAltitude()), altitudeData.get(entry.getAltitude())+1); + }else { + altitudeData.put(String.valueOf(entry.getAltitude()),1); + } + if (cityData.containsKey(entry.getCityName())){ + cityData.replace(String.valueOf(entry.getCityName()),cityData.get(entry.getCityName())+1); + }else { + departureAirportData.put(String.valueOf(entry.getCityName()),1); + } + if (countryData.containsKey(entry.getCountryName())){ + countryData.replace(String.valueOf(entry.getCountryName()),countryData.get(entry.getCountryName())+1); + }else { + countryData.put(String.valueOf(entry.getCountryName()),1); + } + } } + /** + * Takes data from the current dataset and places it into the displayed bar graph. + */ + public void buildAirportGraph(){ + XYChart.Series seriesName = new XYChart.Series(); + XYChart.Series seriesICAO = new XYChart.Series(); + XYChart.Series seriesIATA = new XYChart.Series(); + XYChart.Series seriesAltitude = new XYChart.Series(); + XYChart.Series seriesCity = new XYChart.Series(); + XYChart.Series seriesCountry = new XYChart.Series(); + + seriesName.setName("Name"); + seriesICAO.setName("ICAO"); + seriesIATA.setName("IATA FFA"); + seriesAltitude.setName("Altitude"); + seriesCity.setName("City"); + seriesCountry.setName("Country"); + //Gives the formatted data to the graph. + for (String entry : nameData.keySet()){ + seriesName.getData().add(new XYChart.Data(entry,nameData.get(entry))); + } + for (String entry : ICAOData.keySet()){ + seriesICAO.getData().add(new XYChart.Data(entry,ICAOData.get(entry))); + } + for (String entry : IATAData.keySet()){ + seriesIATA.getData().add(new XYChart.Data(entry,IATAData.get(entry))); + } + for (String entry : altitudeData.keySet()){ + seriesAltitude.getData().add(new XYChart.Data(entry,altitudeData.get(entry))); + } + for (String entry : cityData.keySet()){ + seriesCity.getData().add(new XYChart.Data(entry,cityData.get(entry))); + } + for (String entry : countryData.keySet()){ + seriesCountry.getData().add(new XYChart.Data(entry,countryData.get(entry))); + } + if (nameData.keySet().size() > 125 && !currentsession.getForceGraph()){ + ButtonType yes = new ButtonType("Yes", ButtonBar.ButtonData.YES); + ButtonType no = new ButtonType("No", ButtonBar.ButtonData.NO); + Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "", yes, no); + alert.setTitle("Too many fields selected"); + alert.setHeaderText("You have selected too many fields to graph."); + alert.setContentText("This could potentially cause errors in the program.\nDo you want to proceed?"); + //alert.showAndWait(); + Optional result = alert.showAndWait(); + if (result.isPresent() && result.get() == no) { + replaceSceneContent(SceneCode.PIE_GRAPH_CHOOSER); + } + } + else { + if (currentsession.getSelectedgraphoptions().contains("Name")) { + analyserGraph.getData().add(seriesName); + } + if (currentsession.getSelectedgraphoptions().contains("ICAO")) { + analyserGraph.getData().add(seriesIATA); + } + if (currentsession.getSelectedgraphoptions().contains("IATA FFA")) { + analyserGraph.getData().add(seriesIATA); + } + if (currentsession.getSelectedgraphoptions().contains("Altitude")) { + analyserGraph.getData().add(seriesAltitude); + } + if (currentsession.getSelectedgraphoptions().contains("City")) { + analyserGraph.getData().add(seriesCity); + } + if (currentsession.getSelectedgraphoptions().contains("Country")) { + analyserGraph.getData().add(seriesCountry); + } + } + } + + private void datasetupCustomAirline(ArrayList current_airlines){ + //Takes out the specified field then adds to the used data dict. + for (Airline entry : current_airlines){ + if (nameData.containsKey(entry.getName())){ + nameData.replace(String.valueOf(entry.getName()),nameData.get(entry.getName())+1); + }else { + nameData.put(String.valueOf(entry.getName()),1); + } + if (ICAOData.containsKey(entry.getICAO())){ + ICAOData.replace(String.valueOf(entry.getICAO()),ICAOData.get(entry.getICAO())+1); + }else { + ICAOData.put(String.valueOf(entry.getICAO()),1); + } + if (IATAData.containsKey(entry.getIATA())){ + IATAData.replace(String.valueOf(entry.getIATA()),IATAData.get(entry.getIATA())+1); + }else { + IATAData.put(String.valueOf(entry.getIATA()),1); + } + if (altitudeData.containsKey(entry.getAlias())){ + aliasData.replace(String.valueOf(entry.getAlias()), aliasData.get(entry.getAlias())+1); + }else { + aliasData.put(String.valueOf(entry.getAlias()),1); + } + if (cityData.containsKey(entry.getCallSign())){ + callSignData.replace(String.valueOf(entry.getCallSign()),cityData.get(entry.getCallSign())+1); + }else { + departureAirportData.put(String.valueOf(entry.getCallSign()),1); + } + if (activeData.containsKey(entry.getCallSign())){ + activeData.replace(String.valueOf(entry.getActive()),activeData.get(entry.getActive())+1); + }else { + activeData.put(String.valueOf(entry.getActive()),1); + } + if (countryData.containsKey(entry.getCountryName())){ + countryData.replace(String.valueOf(entry.getCountryName()),countryData.get(entry.getCountryName())+1); + }else { + countryData.put(String.valueOf(entry.getCountryName()),1); + } + } + } + + /** + * Takes data from the current dataset and places it into the displayed bar graph. + */ + public void buildAirlineGraph(){ + XYChart.Series seriesName = new XYChart.Series(); + XYChart.Series seriesICAO = new XYChart.Series(); + XYChart.Series seriesIATA = new XYChart.Series(); + XYChart.Series seriesAlias = new XYChart.Series(); + XYChart.Series seriesCallsign = new XYChart.Series(); + XYChart.Series seriesActive = new XYChart.Series(); + XYChart.Series seriesCountry = new XYChart.Series(); + + seriesName.setName("Name"); + seriesICAO.setName("ICAO"); + seriesIATA.setName("IATA"); + seriesAlias.setName("Alias"); + seriesCallsign.setName("Call sign"); + seriesActive.setName("Active"); + seriesCountry.setName("Country"); + //Gives the formatted data to the graph. + for (String entry : nameData.keySet()){ + seriesName.getData().add(new XYChart.Data(entry,nameData.get(entry))); + } + for (String entry : ICAOData.keySet()){ + seriesICAO.getData().add(new XYChart.Data(entry,ICAOData.get(entry))); + } + for (String entry : IATAData.keySet()){ + seriesIATA.getData().add(new XYChart.Data(entry,IATAData.get(entry))); + } + for (String entry : aliasData.keySet()){ + seriesAlias.getData().add(new XYChart.Data(entry,aliasData.get(entry))); + } + for (String entry : callSignData.keySet()){ + seriesCallsign.getData().add(new XYChart.Data(entry,callSignData.get(entry))); + } + for (String entry : activeData.keySet()){ + seriesActive.getData().add(new XYChart.Data(entry,activeData.get(entry))); + } + for (String entry : countryData.keySet()){ + seriesCountry.getData().add(new XYChart.Data(entry,countryData.get(entry))); + } + if (nameData.keySet().size() > 125 && !currentsession.getForceGraph()){ + ButtonType yes = new ButtonType("Yes", ButtonBar.ButtonData.YES); + ButtonType no = new ButtonType("No", ButtonBar.ButtonData.NO); + Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "", yes, no); + alert.setTitle("Too many fields selected"); + alert.setHeaderText("You have selected too many fields to graph."); + alert.setContentText("This could potentially cause errors in the program.\nDo you want to proceed?"); + //alert.showAndWait(); + Optional result = alert.showAndWait(); + if (result.isPresent() && result.get() == no) { + replaceSceneContent(SceneCode.PIE_GRAPH_CHOOSER); + } + } + else { + if (currentsession.getSelectedgraphoptions().contains("Name")) { + analyserGraph.getData().add(seriesName); + } + if (currentsession.getSelectedgraphoptions().contains("ICAO")) { + analyserGraph.getData().add(seriesIATA); + } + if (currentsession.getSelectedgraphoptions().contains("IATA FFA")) { + analyserGraph.getData().add(seriesIATA); + } + if (currentsession.getSelectedgraphoptions().contains("Altitude")) { + analyserGraph.getData().add(seriesAlias); + } + if (currentsession.getSelectedgraphoptions().contains("Call Sign")) { + analyserGraph.getData().add(seriesCallsign); + } + if (currentsession.getSelectedgraphoptions().contains("Active")) { + analyserGraph.getData().add(seriesActive); + } + if (currentsession.getSelectedgraphoptions().contains("Country")) { + analyserGraph.getData().add(seriesCountry); + } + } + } + + /** * Takes the current dataset then loads the data to the graph using build graph. @@ -112,7 +407,8 @@ public class BarGraphController extends Controller { else{ d = currentdata.getAirports(); } - //datasetupCustomarAirport(d); + datasetupCustomAirport(d); + buildAirportGraph(); } else if (temp == "Airlines"){ ArrayList d = new ArrayList();