Guest User

Untitled

a guest
May 1st, 2023
8
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.66 KB | None | 0 0
  1. package ch.epfl.javions.gui;
  2.  
  3. import ch.epfl.javions.Units;
  4. import ch.epfl.javions.adsb.CallSign;
  5. import javafx.beans.property.ObjectProperty;
  6. import javafx.beans.property.ReadOnlyDoubleWrapper;
  7. import javafx.beans.property.ReadOnlyObjectWrapper;
  8. import javafx.collections.FXCollections;
  9. import javafx.collections.ObservableList;
  10. import javafx.collections.ObservableSet;
  11. import javafx.collections.SetChangeListener;
  12. import javafx.scene.Node;
  13. import javafx.scene.control.TableColumn;
  14. import javafx.scene.control.TableView;
  15.  
  16. import java.text.NumberFormat;
  17. import java.text.ParseException;
  18. import java.util.List;
  19. import java.util.function.Consumer;
  20.  
  21.  
  22. public final class AircraftTableController {
  23.     private final ObservableSet<ObservableAircraftState>  aircraftStates;
  24.     private final ObjectProperty<ObservableAircraftState> selectedAircraftState;
  25.  
  26.     private final TableView<ObservableAircraftState> tableView;
  27.  
  28.     public AircraftTableController(ObservableSet<ObservableAircraftState> aircraftStates,
  29.                                    ObjectProperty<ObservableAircraftState> selectedAircraftState) {
  30.         this.aircraftStates        = FXCollections.unmodifiableObservableSet(aircraftStates);
  31.         this.selectedAircraftState = selectedAircraftState;
  32.         ObservableList<ObservableAircraftState> list = FXCollections.observableArrayList(aircraftStates);
  33.         tableView = new TableView<>(list);
  34.         tableView.getStylesheets().add("table.css");
  35.         tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY_SUBSEQUENT_COLUMNS);
  36.         tableView.setTableMenuButtonVisible(true);
  37.         buildTable();
  38.         aircraftStates.addListener((SetChangeListener<ObservableAircraftState>) change -> {
  39.             if (change.wasAdded()) {
  40.                 // Add the value to each column cell of the tableView
  41.                 tableView.getItems().add(change.getElementAdded());
  42.             }
  43.             else if (change.wasRemoved()) {
  44.                 tableView.getItems().remove(change.getElementRemoved());
  45.  
  46.             }
  47.         });
  48.     }
  49.  
  50.     public Node pane() {
  51.         return tableView;
  52.     }
  53.  
  54.     public void setOnDoubleClick(Consumer<ObservableAircraftState> onDoubleClick) {
  55.         tableView.setOnMouseClicked(event -> {
  56.             if (event.getClickCount() == 2 && tableView.getSelectionModel().getSelectedItem() != null) {
  57.                 onDoubleClick.accept(tableView.getSelectionModel().getSelectedItem());
  58.             }
  59.         });
  60.     }
  61.  
  62.     private void buildTable() {
  63.         tableView.getColumns().setAll(List.of(
  64.                                       createOaciColumn(),
  65.                                       createCallSignColumn(),
  66.                                       createRegistrationColumn(),
  67.                                       createModelColumn(),
  68.                                       createTypeColumn(),
  69.                                       createDescriptionColumn(),
  70.                                       createLatitudeColumn(),
  71.                                       createLongitudeColumn(),
  72.                                       createAltitudeColumn(),
  73.                                       createSpeedColumn()));
  74.     }
  75.  
  76.     private TableColumn<ObservableAircraftState,?> createSpeedColumn() {
  77.         TableColumn<ObservableAircraftState, String> column = new TableColumn<>("Vitesse (km/h)");
  78.         column.getStyleClass().add("numeric");
  79.         column.setCellValueFactory(f -> {
  80.             NumberFormat format = NumberFormat.getInstance();
  81.             format.setMaximumFractionDigits(0);
  82.             if (f.getValue().getVelocity() <= 0) {
  83.                 ReadOnlyObjectWrapper<String> wrapper =  new ReadOnlyObjectWrapper<>("");
  84.             }
  85.             else {
  86.                 ReadOnlyDoubleWrapper wrapper =
  87.                         new ReadOnlyDoubleWrapper(Units.convertTo(f.getValue().getVelocity(),
  88.                                                                   Units.Speed.KILOMETER_PER_HOUR));
  89.                 return wrapper.map(format::format);
  90.             }
  91.             return null;
  92.         });
  93.         setComparator(column);
  94.         return column;
  95.     }
  96.  
  97.  
  98.     private TableColumn<ObservableAircraftState,?> createAltitudeColumn() {
  99.         TableColumn<ObservableAircraftState, String> column = new TableColumn<>("Altitude (m)");
  100.         column.getStyleClass().add("numeric");
  101.         column.setCellValueFactory(f -> {
  102.             NumberFormat format = NumberFormat.getInstance();
  103.             format.setMaximumFractionDigits(0);
  104.             ReadOnlyDoubleWrapper wrapper =
  105.                     new ReadOnlyDoubleWrapper(f.getValue().getAltitude());
  106.             return wrapper.map(format::format);
  107.         });
  108.         setComparator(column);
  109.         return column;
  110.     }
  111.  
  112.  
  113.     private TableColumn<ObservableAircraftState, String> createOaciColumn() {
  114.         TableColumn<ObservableAircraftState, String> column = new TableColumn<>("OACI");
  115.         column.setCellValueFactory(f ->
  116.                                            new ReadOnlyObjectWrapper<>(f.getValue().getIcaoAddress().string()));
  117.         column.setPrefWidth(60);
  118.         column.getStyleClass().add("numeric");
  119.         return column;
  120.     }
  121.  
  122.     private TableColumn<ObservableAircraftState, String> createCallSignColumn() {
  123.         TableColumn<ObservableAircraftState, String> column = new TableColumn<>("Indicatif");
  124.         column.setCellValueFactory(f ->
  125.                                            f.getValue().callSignProperty().map(CallSign::string));
  126.         column.setPrefWidth(70);
  127.         return column;
  128.     }
  129.  
  130.     private TableColumn<ObservableAircraftState, String> createRegistrationColumn() {
  131.         TableColumn<ObservableAircraftState, String> column = new TableColumn<>("Immatriculation");
  132.         column.setCellValueFactory(f ->
  133.                                            new ReadOnlyObjectWrapper<>(f.getValue().getData() != null ?
  134.                                                                                f.getValue().getData().registration().string() : ""));
  135.         column.setPrefWidth(90);
  136.         return column;
  137.     }
  138.  
  139.     private TableColumn<ObservableAircraftState, String> createModelColumn() {
  140.         TableColumn<ObservableAircraftState, String> column = new TableColumn<>("Modèle");
  141.         column.setCellValueFactory(f ->
  142.                                            new ReadOnlyObjectWrapper<>(f.getValue().getData() != null ?
  143.                                                                                f.getValue().getData().model() : ""));
  144.         column.setPrefWidth(230);
  145.         return column;
  146.     }
  147.  
  148.     private TableColumn<ObservableAircraftState, String> createTypeColumn() {
  149.         TableColumn<ObservableAircraftState, String> column = new TableColumn<>("Type");
  150.         column.setCellValueFactory(f ->
  151.                                            new ReadOnlyObjectWrapper<>(f.getValue().getData() != null ?
  152.                                                                                f.getValue().getData().typeDesignator().string() : ""));
  153.         column.setPrefWidth(50);
  154.         return column;
  155.     }
  156.  
  157.     private TableColumn<ObservableAircraftState, String> createDescriptionColumn() {
  158.         TableColumn<ObservableAircraftState, String> column = new TableColumn<>("Description");
  159.         column.setCellValueFactory(f ->
  160.                                            new ReadOnlyObjectWrapper<>(f.getValue().getData() != null ?
  161.                                                                                f.getValue().getData().description().string() : ""));
  162.         column.setPrefWidth(70);
  163.         return column;
  164.     }
  165.  
  166.     private TableColumn<ObservableAircraftState, String> createLatitudeColumn() {
  167.         TableColumn<ObservableAircraftState, String> column = new TableColumn<>("Latitude (°)");
  168.         column.getStyleClass().add("numeric");
  169.         column.setCellValueFactory(f -> {
  170.             NumberFormat format = NumberFormat.getInstance();
  171.             format.setMinimumFractionDigits(4);
  172.             format.setMaximumFractionDigits(4);
  173.             ReadOnlyDoubleWrapper wrapper =
  174.                     new ReadOnlyDoubleWrapper(Units.convertTo(f.getValue().positionProperty().get().latitude(),Units.Angle.DEGREE));
  175.             return wrapper.map(format::format);
  176.         });
  177.         setComparator(column);
  178.         return column;
  179.     }
  180.  
  181.     private TableColumn<ObservableAircraftState, String> createLongitudeColumn() {
  182.         TableColumn<ObservableAircraftState, String> column = new TableColumn<>("Longitude (°)");
  183.         column.getStyleClass().add("numeric");
  184.         column.setCellValueFactory(f -> {
  185.             NumberFormat format = NumberFormat.getInstance();
  186.             format.setMinimumFractionDigits(4);
  187.             format.setMaximumFractionDigits(4);
  188.             ReadOnlyDoubleWrapper wrapper =
  189.                     new ReadOnlyDoubleWrapper(Units.convertTo(f.getValue().positionProperty().get().latitude(),Units.Angle.DEGREE));
  190.             return wrapper.map(format::format);
  191.         });
  192.         setComparator(column);
  193.         return column;
  194.     }
  195.     private void setComparator(TableColumn<ObservableAircraftState, String> column) {
  196.         column.setComparator((s1, s2) -> {
  197.             try {
  198.                 NumberFormat format = NumberFormat.getInstance();
  199.                 if (s1.isEmpty() || s2.isEmpty()) {
  200.                     return s1.compareTo(s2);
  201.                 } else {
  202.                     return Double.compare(format.parse(s1).doubleValue(), format.parse(s2).doubleValue());
  203.                 }
  204.             } catch (ParseException e) {
  205.                 return s1.compareTo(s2);
  206.             }
  207.         });
  208.         tableView.getColumns().add(column);
  209.     }
  210.  
  211.  
  212. }
  213.  
Advertisement
Add Comment
Please, Sign In to add comment