Commit b350f9dfe4c8f6b30a7b4500ec7b3eeb86644afd
1 parent
2f45c53df1
Exists in
master
and in
1 other branch
import vessels and display it on a ListView
Showing 17 changed files with 211 additions and 78 deletions Side-by-side Diff
- build.gradle
- src/main/kotlin/application/App.kt
- src/main/kotlin/application/controller/ControlPanelController.kt
- src/main/kotlin/application/controller/MenuBarController.kt
- src/main/kotlin/application/model/Context.kt
- src/main/kotlin/application/model/Message.kt
- src/main/kotlin/application/model/MessageListener.kt
- src/main/kotlin/application/model/ObservableVessel.kt
- src/main/kotlin/application/model/Vessel.kt
- src/main/kotlin/application/model/VesselGenerator.kt
- src/main/kotlin/application/ui/MenuBar.kt
- src/main/kotlin/application/ui/ShipList.kt
- src/main/resources/gui/controlPanel.fxml
- src/main/resources/gui/mainApp.fxml
- src/main/resources/gui/menuBar.fxml
- src/main/resources/gui/shipList.fxml
- src/main/resources/gui/windows.fxml
build.gradle
View file @
b350f9d
src/main/kotlin/application/App.kt
View file @
b350f9d
... | ... | @@ -11,18 +11,14 @@ |
11 | 11 | |
12 | 12 | override fun start(primaryStage: Stage?) { |
13 | 13 | |
14 | - val fxmlLoader = FXMLLoader(App::class.java.getResource("/gui/mainApp.fxml")) | |
15 | 14 | |
16 | - val parent: Parent = fxmlLoader.load() | |
17 | 15 | |
18 | -// val controller: MainAppController = fxmlLoader.getController() | |
19 | - | |
16 | + val fxmlLoader = FXMLLoader(App::class.java.getResource("/gui/windows.fxml")) | |
17 | + val parent: Parent = fxmlLoader.load() | |
20 | 18 | val scene = Scene(parent) |
21 | 19 | |
22 | 20 | primaryStage!!.scene = scene |
23 | 21 | primaryStage.title = "Maritime Visualisation" |
24 | - primaryStage.width = 667.0 | |
25 | - primaryStage.height = 375.0 | |
26 | 22 | primaryStage.show() |
27 | 23 | } |
28 | 24 |
src/main/kotlin/application/controller/ControlPanelController.kt
View file @
b350f9d
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/MenuBarController.kt
View file @
b350f9d
1 | +package application.controller | |
2 | + | |
3 | +import application.App | |
4 | +import application.model.createVesselCollection | |
5 | +import application.model.observableMessages | |
6 | +import javafx.event.EventHandler | |
7 | +import javafx.fxml.FXML | |
8 | +import javafx.fxml.FXMLLoader | |
9 | +import javafx.fxml.Initializable | |
10 | +import javafx.scene.Parent | |
11 | +import javafx.scene.control.MenuBar | |
12 | +import javafx.scene.control.MenuItem | |
13 | +import javafx.stage.FileChooser | |
14 | +import java.net.URL | |
15 | +import java.util.* | |
16 | + | |
17 | +class MenuBarController : Initializable { | |
18 | + | |
19 | + @FXML | |
20 | + var menuBar: MenuBar = MenuBar() | |
21 | + | |
22 | + @FXML | |
23 | + var import: MenuItem = MenuItem() | |
24 | + | |
25 | + override fun initialize(location: URL?, resources: ResourceBundle?) { | |
26 | + | |
27 | + import.onAction = EventHandler { | |
28 | + val fileChooser = FileChooser() | |
29 | + fileChooser.title = "Choose a file to import" | |
30 | + val window = menuBar.scene.window | |
31 | + val file = fileChooser.showOpenDialog(window) | |
32 | + val vessels = createVesselCollection(file) | |
33 | + observableMessages.vessels.clear() | |
34 | + observableMessages.vessels = vessels | |
35 | + } | |
36 | + } | |
37 | +} |
src/main/kotlin/application/model/Context.kt
View file @
b350f9d
src/main/kotlin/application/model/Message.kt
View file @
b350f9d
1 | +package application.model | |
2 | + | |
3 | +import java.time.LocalDateTime | |
4 | + | |
5 | +class Message(split: List<String>) { | |
6 | + val mmsi: Int? = split[0].toIntOrNull() | |
7 | + val time: LocalDateTime = LocalDateTime.parse(split[1]) | |
8 | + val latitude: Double? = split[2].toDoubleOrNull() | |
9 | + val longitude: Double? = split[3].toDoubleOrNull() | |
10 | + val speedOverGround: Double? = split[4].toDoubleOrNull() | |
11 | + val courseOverGround: Double? = split[5].toDoubleOrNull() | |
12 | + val heading: Int? = split[6].toIntOrNull() | |
13 | + val vesselName: String? = split[7] | |
14 | + val imo: String? = split[8] | |
15 | + val callSign: String? = split[9] | |
16 | + val vesselType: Int? = split[10].toIntOrNull() | |
17 | + val status: String? = split[11] | |
18 | + val length: Double? = split[12].toDoubleOrNull() | |
19 | + val width: Double? = split[13].toDoubleOrNull() | |
20 | + val draft: Double? = split[14].toDoubleOrNull() | |
21 | + val cargo: Int? = split[15].toIntOrNull() | |
22 | + | |
23 | +} |
src/main/kotlin/application/model/MessageListener.kt
View file @
b350f9d
src/main/kotlin/application/model/ObservableVessel.kt
View file @
b350f9d
1 | +package application.model | |
2 | + | |
3 | +import kotlin.properties.Delegates | |
4 | + | |
5 | +class ObservableVessel { | |
6 | + val listeners: MutableList<MessageListener> = mutableListOf() | |
7 | + | |
8 | + var vessels: MutableMap<Int?, Vessel> by Delegates.observable( | |
9 | + initialValue = mutableMapOf(), | |
10 | + onChange = { | |
11 | + _, _, new -> | |
12 | + run { | |
13 | + listeners.forEach { | |
14 | + it.onValueChanged(new) | |
15 | + } | |
16 | + } | |
17 | + } | |
18 | + ) | |
19 | + | |
20 | +} |
src/main/kotlin/application/model/Vessel.kt
View file @
b350f9d
src/main/kotlin/application/model/VesselGenerator.kt
View file @
b350f9d
1 | +package application.model | |
2 | + | |
3 | +import java.io.File | |
4 | + | |
5 | +fun createVesselCollection(file: File) : MutableMap<Int?, Vessel> { | |
6 | + val messages : ArrayList<Message> = arrayListOf() | |
7 | + val vessels: MutableMap<Int?, Vessel> = mutableMapOf() | |
8 | + | |
9 | + file.forEachLine { | |
10 | + val arrayMessage = it.split(",") | |
11 | + if (arrayMessage[0].toIntOrNull() !== null) { | |
12 | + val message = Message(arrayMessage) | |
13 | + messages.add(message) | |
14 | + if (!vessels.containsKey(message.mmsi)){ | |
15 | + vessels[message.mmsi] = Vessel() | |
16 | + } | |
17 | + vessels[message.mmsi]?.messages?.set(message.time, message) | |
18 | + } | |
19 | + | |
20 | + } | |
21 | + | |
22 | + return vessels | |
23 | +} |
src/main/kotlin/application/ui/MenuBar.kt
View file @
b350f9d
src/main/kotlin/application/ui/ShipList.kt
View file @
b350f9d
src/main/resources/gui/controlPanel.fxml
View file @
b350f9d
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/mainApp.fxml
View file @
b350f9d
1 | -<?xml version="1.0" encoding="UTF-8"?> | |
2 | - | |
3 | - | |
4 | -<?import javafx.scene.control.ListView?> | |
5 | -<?import javafx.scene.control.SplitPane?> | |
6 | -<?import javafx.scene.layout.*?> | |
7 | -<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" | |
8 | - prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.241" xmlns:fx="http://javafx.com/fxml/1"> | |
9 | - <children> | |
10 | - <fx:include source="menuBar.fxml" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" | |
11 | - AnchorPane.topAnchor="0.0"/> | |
12 | - <SplitPane dividerPositions="0.29797979797979796" layoutY="25.0" prefHeight="379.0" prefWidth="594.0" | |
13 | - AnchorPane.bottomAnchor="-4.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="6.0" | |
14 | - AnchorPane.topAnchor="25.0"> | |
15 | - <items> | |
16 | - <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0"> | |
17 | - <children> | |
18 | - <fx:include source="shipList.fxml" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" | |
19 | - AnchorPane.topAnchor="0.0"/> | |
20 | - </children> | |
21 | - </AnchorPane> | |
22 | - <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0"> | |
23 | - <children> | |
24 | - <SplitPane dividerPositions="0.5" layoutX="127.0" layoutY="74.0" orientation="VERTICAL" | |
25 | - prefHeight="200.0" prefWidth="160.0" AnchorPane.bottomAnchor="0.0" | |
26 | - AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> | |
27 | - <items> | |
28 | - <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0"/> | |
29 | - <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0"/> | |
30 | - </items> | |
31 | - </SplitPane> | |
32 | - </children> | |
33 | - </AnchorPane> | |
34 | - </items> | |
35 | - </SplitPane> | |
36 | - </children> | |
37 | -</AnchorPane> |
src/main/resources/gui/menuBar.fxml
View file @
b350f9d
1 | 1 | <?xml version="1.0" encoding="UTF-8"?> |
2 | 2 | |
3 | -<?import javafx.scene.control.MenuBar?> | |
4 | -<?import javafx.scene.control.Menu?> | |
5 | -<?import javafx.scene.control.MenuItem?> | |
6 | -<MenuBar prefHeight="25.0" prefWidth="600.0" fx:controller="application.ui.MenuBar" xmlns="http://javafx.com/javafx/8.0.241" xmlns:fx="http://javafx.com/fxml/1"> | |
3 | +<?import javafx.scene.control.*?> | |
4 | +<MenuBar prefHeight="25.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/10.0.2-internal" | |
5 | + xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.controller.MenuBarController" fx:id="menuBar"> | |
7 | 6 | <menus> |
8 | 7 | <Menu mnemonicParsing="false" text="File"> |
9 | 8 | <items> |
10 | - <MenuItem mnemonicParsing="false" text="Close"/> | |
9 | + <MenuItem fx:id="import" mnemonicParsing="false" text="Import"/> | |
11 | 10 | </items> |
12 | 11 | </Menu> |
13 | 12 | <Menu mnemonicParsing="false" text="Edit"> |
src/main/resources/gui/shipList.fxml
View file @
b350f9d
1 | -<?xml version="1.0" encoding="UTF-8"?> | |
2 | - | |
3 | -<?import javafx.scene.control.ListView?> | |
4 | -<?import javafx.scene.layout.AnchorPane?> | |
5 | -<ListView prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" | |
6 | - AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" | |
7 | - fx:controller="application.ui.ShipList" xmlns="http://javafx.com/javafx/8.0.241" xmlns:fx="http://javafx.com/fxml/1"/> |
src/main/resources/gui/windows.fxml
View file @
b350f9d
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | + | |
3 | + | |
4 | +<?import javafx.scene.control.SplitPane?> | |
5 | +<?import javafx.scene.layout.*?> | |
6 | +<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="900.0" | |
7 | + prefWidth="1200.0" xmlns="http://javafx.com/javafx/8.0.241" xmlns:fx="http://javafx.com/fxml/1"> | |
8 | + <children> | |
9 | + <fx:include source="menuBar.fxml" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" | |
10 | + AnchorPane.topAnchor="0.0"/> | |
11 | + <SplitPane dividerPositions="0.29797979797979796" layoutY="25.0" prefHeight="379.0" prefWidth="594.0" | |
12 | + AnchorPane.bottomAnchor="-4.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="6.0" | |
13 | + AnchorPane.topAnchor="25.0"> | |
14 | + <items> | |
15 | + <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0"> | |
16 | + <children> | |
17 | + <fx:include source="controlPanel.fxml" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" | |
18 | + AnchorPane.topAnchor="0.0"/> | |
19 | + </children> | |
20 | + </AnchorPane> | |
21 | + <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0"> | |
22 | + <children> | |
23 | + <SplitPane dividerPositions="0.5" layoutX="127.0" layoutY="74.0" orientation="VERTICAL" | |
24 | + prefHeight="200.0" prefWidth="160.0" AnchorPane.bottomAnchor="0.0" | |
25 | + AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> | |
26 | + <items> | |
27 | + <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0"/> | |
28 | + <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0"/> | |
29 | + </items> | |
30 | + </SplitPane> | |
31 | + </children> | |
32 | + </AnchorPane> | |
33 | + </items> | |
34 | + </SplitPane> | |
35 | + </children> | |
36 | +</AnchorPane> |