Commit 2bbe36a1be826b47c824114b471c6a1e5de02983

Authored by lsagona
1 parent 52321443a8
Exists in master and in 1 other branch dev

addd the possibility to select a ship

Showing 13 changed files with 112 additions and 68 deletions Side-by-side Diff

src/main/kotlin/application/controller/ControlPanelController.kt View file @ 2bbe36a
1   -package application.controller
2   -
3   -import application.model.MessageListener
4   -import application.model.Vessel
5   -import application.model.observableMessages
6   -import javafx.collections.FXCollections
7   -import javafx.collections.ObservableList
8   -import javafx.event.EventHandler
9   -import javafx.fxml.FXML
10   -import javafx.fxml.Initializable
11   -import javafx.scene.control.Button
12   -import javafx.scene.control.ListView
13   -import java.net.URL
14   -import java.util.*
15   -
16   -class ControlPanelController : Initializable, MessageListener {
17   - @FXML
18   - var shipListView: ListView<Int> = ListView()
19   -
20   -
21   - var shipList: ObservableList<Int> = FXCollections.observableArrayList()
22   -
23   - override fun initialize(location: URL?, resources: ResourceBundle?) {
24   - shipListView.items = shipList
25   - observableMessages.listeners.add(this)
26   - }
27   -
28   - override fun onValueChanged(newValue: MutableMap<Int?, Vessel>) {
29   - shipList.clear()
30   - shipList.addAll(newValue.keys)
31   - }
32   -
33   -}
src/main/kotlin/application/controller/MapPanelController.kt View file @ 2bbe36a
1 1 package application.controller
2 2  
3   -import application.model.MessageListener
4   -import application.model.Vessel
5   -import application.model.observableMessages
  3 +import application.model.*
6 4 import javafx.concurrent.Worker
7 5 import javafx.fxml.FXML
8 6 import javafx.fxml.Initializable
... ... @@ -14,7 +12,7 @@
14 12 import java.util.*
15 13 import java.util.concurrent.CompletableFuture
16 14  
17   -class MapPanelController : Initializable, MessageListener {
  15 +class MapPanelController : Initializable {
18 16  
19 17 @FXML
20 18 private lateinit var map: StackPane
21 19  
22 20  
... ... @@ -24,18 +22,24 @@
24 22  
25 23 override fun initialize(location: URL?, resources: ResourceBundle?) {
26 24 val completeFutureMap: CompletableFuture<Worker.State> = mapView.displayMap(MapConfig())
27   - observableMessages.listeners.add(this)
  25 + observableVessel.listeners.add(object : MessageListener {
  26 + override fun onValueChanged(newValue: MutableMap<Int?, Vessel>) {
  27 + displayMessageOnMap(mapView)
  28 + }
  29 + })
28 30  
  31 + observableSelectedVessel.listeners.add(object : SelectedVesselListener {
  32 + override fun onValueChanged(newValue: Vessel) {
  33 + displayMessageOnMap(mapView, newValue.mmsi!!)
  34 + }
  35 + })
  36 +
29 37 /*completeFutureMap.whenComplete{
30 38 workerState, _ ->
31 39 if (workerState == Worker.State.SUCCEEDED) {
32 40 }
33 41 }*/
34 42 map.children.add(mapView)
35   - }
36   -
37   - override fun onValueChanged(newValue: MutableMap<Int?, Vessel>) {
38   - displayMessageOnMap(mapView)
39 43 }
40 44  
41 45  
src/main/kotlin/application/controller/MenuBarController.kt View file @ 2bbe36a
1 1 package application.controller
2 2  
3 3 import application.model.createVesselCollection
4   -import application.model.observableMessages
  4 +import application.model.observableVessel
5 5 import javafx.event.EventHandler
6 6 import javafx.fxml.FXML
7 7 import javafx.fxml.Initializable
... ... @@ -27,8 +27,8 @@
27 27 val window = menuBar.scene.window
28 28 val file = fileChooser.showOpenDialog(window)
29 29 val vessels = createVesselCollection(file)
30   - observableMessages.vessels.clear()
31   - observableMessages.vessels = vessels
  30 + observableVessel.vessels.clear()
  31 + observableVessel.vessels = vessels
32 32 }
33 33 }
34 34 }
src/main/kotlin/application/controller/VesselListPanelController.kt View file @ 2bbe36a
  1 +package application.controller
  2 +
  3 +import application.model.MessageListener
  4 +import application.model.Vessel
  5 +import application.model.observableVessel
  6 +import application.model.observableSelectedVessel
  7 +import javafx.collections.FXCollections
  8 +import javafx.collections.ObservableList
  9 +import javafx.fxml.FXML
  10 +import javafx.fxml.Initializable
  11 +import javafx.scene.control.ListView
  12 +import java.net.URL
  13 +import java.util.*
  14 +
  15 +class VesselListPanelController : Initializable, MessageListener {
  16 + @FXML
  17 + var shipListView: ListView<Int> = ListView()
  18 +
  19 +
  20 + var shipList: ObservableList<Int> = FXCollections.observableArrayList()
  21 +
  22 + override fun initialize(location: URL?, resources: ResourceBundle?) {
  23 + shipListView.items = shipList
  24 + observableVessel.listeners.add(this)
  25 + shipListView.selectionModel.selectedItemProperty().addListener { _, _, newValue ->
  26 + observableSelectedVessel.vessel = observableVessel.vessels[newValue]!!
  27 + }
  28 + }
  29 +
  30 + override fun onValueChanged(newValue: MutableMap<Int?, Vessel>) {
  31 + shipList.clear()
  32 + shipList.addAll(newValue.keys)
  33 + }
  34 +
  35 +}
src/main/kotlin/application/model/Context.kt View file @ 2bbe36a
1 1 package application.model
2 2  
3   -val observableMessages : ObservableVessel = ObservableVessel()
  3 +val observableVessel: ObservableVessel = ObservableVessel()
  4 +
  5 +val observableSelectedVessel: ObservableSelectedVessel = ObservableSelectedVessel()
src/main/kotlin/application/model/ObservableSelectedVessel.kt View file @ 2bbe36a
  1 +package application.model
  2 +
  3 +import kotlin.properties.Delegates
  4 +
  5 +class ObservableSelectedVessel {
  6 + val listeners: MutableList<SelectedVesselListener> = mutableListOf()
  7 +
  8 + var vessel: Vessel by Delegates.observable(
  9 + initialValue = Vessel(null),
  10 + onChange = { _, _, new ->
  11 + run {
  12 + listeners.forEach {
  13 + it.onValueChanged(new)
  14 + }
  15 + }
  16 + }
  17 + )
  18 +}
src/main/kotlin/application/model/SelectedVesselListener.kt View file @ 2bbe36a
  1 +package application.model
  2 +
  3 +interface SelectedVesselListener {
  4 + fun onValueChanged(newValue: Vessel)
  5 +}
src/main/kotlin/application/model/Vessel.kt View file @ 2bbe36a
... ... @@ -4,7 +4,7 @@
4 4 import java.util.*
5 5  
6 6  
7   -class Vessel {
  7 +class Vessel(val mmsi : Int?) {
8 8 val messages: SortedMap<LocalDateTime, Message> = sortedMapOf()
9 9 }
src/main/kotlin/application/model/VesselGenerator.kt View file @ 2bbe36a
... ... @@ -14,7 +14,7 @@
14 14 val message = Message(arrayMessage)
15 15 messages.add(message)
16 16 if (!vessels.containsKey(message.mmsi)){
17   - vessels[message.mmsi] = Vessel()
  17 + vessels[message.mmsi] = Vessel(message.mmsi!!)
18 18 }
19 19 vessels[message.mmsi]?.messages?.set(message.time, message)
20 20 }
src/main/kotlin/map/CircleMarkerGenerator.kt View file @ 2bbe36a
1 1 package map
2 2  
3   -import application.model.observableMessages
  3 +import application.model.observableVessel
4 4  
5 5 fun clearMapCanvas(map: LeafletMapView) {
6 6 map.execScript("""
7 7  
... ... @@ -11,9 +11,22 @@
11 11  
12 12 fun displayMessageOnMap(map: LeafletMapView) {
13 13 clearMapCanvas(map)
14   - observableMessages.vessels.forEach { (_, value) ->
  14 + observableVessel.vessels.forEach { (_, value) ->
15 15 value.messages.forEach { (_, message) ->
16 16 map.execScript("L.circleMarker([${message.latitude}, ${message.longitude}], {renderer: myRenderer, radius: 0.01, color: '#${message.getHexColor()}'}).addTo(myMap)")
  17 + }
  18 + }
  19 +}
  20 +
  21 +fun displayMessageOnMap(map: LeafletMapView, selectedMMSI: Int) {
  22 + clearMapCanvas(map)
  23 + observableVessel.vessels.forEach { (_, value) ->
  24 + value.messages.forEach { (_, message) ->
  25 + if(selectedMMSI == message.mmsi){
  26 + map.execScript("L.circleMarker([${message.latitude}, ${message.longitude}], {renderer: myRenderer, radius: 4, color: '#ff001e'}).addTo(myMap)")
  27 + }else{
  28 + map.execScript("L.circleMarker([${message.latitude}, ${message.longitude}], {renderer: myRenderer, radius: 0.01, color: '#${message.getHexColor()}'}).addTo(myMap)")
  29 + }
17 30 }
18 31 }
19 32 }
src/main/resources/gui/controlPanel.fxml View file @ 2bbe36a
1   -<?xml version="1.0" encoding="UTF-8"?>
2   -
3   -<?import javafx.scene.control.*?>
4   -<?import javafx.scene.layout.*?>
5   -
6   -<BorderPane prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.controller.ControlPanelController">
7   -
8   - <top>
9   - <AnchorPane prefHeight="33.0" prefWidth="200.0" BorderPane.alignment="CENTER">
10   - <children>
11   - <Button layoutX="74.0" layoutY="2.0" mnemonicParsing="false" text="Button" fx:id="buton" />
12   - </children></AnchorPane>
13   - </top>
14   - <center>
15   - <ListView fx:id="shipListView" prefHeight="105.0" prefWidth="200.0" />
16   - </center>
17   -</BorderPane>
src/main/resources/gui/vesselListPanel.fxml View file @ 2bbe36a
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +
  3 +<?import javafx.scene.control.*?>
  4 +<?import javafx.scene.layout.*?>
  5 +
  6 +<BorderPane prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.controller.VesselListPanelController">
  7 +
  8 + <top>
  9 + <AnchorPane prefHeight="33.0" prefWidth="200.0" BorderPane.alignment="CENTER">
  10 + <children>
  11 + <Button layoutX="74.0" layoutY="2.0" mnemonicParsing="false" text="Button" fx:id="buton" />
  12 + </children></AnchorPane>
  13 + </top>
  14 + <center>
  15 + <ListView fx:id="shipListView" prefHeight="105.0" prefWidth="200.0" />
  16 + </center>
  17 +</BorderPane>
src/main/resources/gui/windows.fxml View file @ 2bbe36a
... ... @@ -11,7 +11,7 @@
11 11 <items>
12 12 <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
13 13 <children>
14   - <fx:include source="controlPanel.fxml" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
  14 + <fx:include source="vesselListPanel.fxml" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
15 15 </children>
16 16 </AnchorPane>
17 17 <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">