Commit 867a0df4617a6c1355868b60f50a41b9e74d0140

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

populate plot when the property is selected

Showing 1 changed file with 63 additions and 44 deletions Inline Diff

src/main/kotlin/application/controller/DataPanelController.kt View file @ 867a0df
package application.controller 1 1 package application.controller
2 2
import application.model.* 3 3 import application.model.*
import javafx.collections.FXCollections 4 4 import javafx.collections.FXCollections
import javafx.collections.ObservableList 5 5 import javafx.collections.ObservableList
import javafx.fxml.FXML 6 6 import javafx.fxml.FXML
import javafx.fxml.Initializable 7 7 import javafx.fxml.Initializable
import javafx.scene.control.ListCell 8 8 import javafx.scene.control.ListCell
import javafx.scene.control.ListView 9 9 import javafx.scene.control.ListView
import kotlinx.coroutines.GlobalScope 10 10 import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch 11 11 import kotlinx.coroutines.launch
import org.charts.dataviewer.api.config.DataViewerConfiguration 12 12 import org.charts.dataviewer.api.config.DataViewerConfiguration
import org.charts.dataviewer.api.data.PlotData 13 13 import org.charts.dataviewer.api.data.PlotData
import org.charts.dataviewer.api.trace.ScatterTrace 14 14 import org.charts.dataviewer.api.trace.ScatterTrace
import org.charts.dataviewer.javafx.JavaFxDataViewer 15 15 import org.charts.dataviewer.javafx.JavaFxDataViewer
import org.charts.dataviewer.utils.TraceColour 16 16 import org.charts.dataviewer.utils.TraceColour
import org.charts.dataviewer.utils.TraceVisibility 17 17 import org.charts.dataviewer.utils.TraceVisibility
import java.net.URL 18 18 import java.net.URL
import java.util.* 19 19 import java.util.*
20 20
21 21
class DataPanelController : Initializable, SelectedVesselListener { 22 22 class DataPanelController : Initializable, SelectedVesselListener {
private var dataList: ObservableList<Pair<String, ArrayList<MessageData?>>> = FXCollections.observableArrayList() 23 23 private var dataList: ObservableList<Pair<String, ArrayList<MessageData?>>> = FXCollections.observableArrayList()
private lateinit var timeData: ArrayList<MessageData?> 24 24 private lateinit var timeData: ArrayList<MessageData?>
25 25
private val latitude: ArrayList<MessageData?> = arrayListOf() 26 26 private val latitude: ArrayList<MessageData?> = arrayListOf()
private val longitude: ArrayList<MessageData?> = arrayListOf() 27 27 private val longitude: ArrayList<MessageData?> = arrayListOf()
private val speedOverGround: ArrayList<MessageData?> = arrayListOf() 28 28 private val speedOverGround: ArrayList<MessageData?> = arrayListOf()
private val courseOverGround: ArrayList<MessageData?> = arrayListOf() 29 29 private val courseOverGround: ArrayList<MessageData?> = arrayListOf()
private val heading: ArrayList<MessageData?> = arrayListOf() 30 30 private val heading: ArrayList<MessageData?> = arrayListOf()
private val vesselName: ArrayList<MessageData?> = arrayListOf() 31 31 private val vesselName: ArrayList<MessageData?> = arrayListOf()
private val imo: ArrayList<MessageData?> = arrayListOf() 32 32 private val imo: ArrayList<MessageData?> = arrayListOf()
private val callSign: ArrayList<MessageData?> = arrayListOf() 33 33 private val callSign: ArrayList<MessageData?> = arrayListOf()
private val vesselType: ArrayList<MessageData?> = arrayListOf() 34 34 private val vesselType: ArrayList<MessageData?> = arrayListOf()
private val status: ArrayList<MessageData?> = arrayListOf() 35 35 private val status: ArrayList<MessageData?> = arrayListOf()
private val length: ArrayList<MessageData?> = arrayListOf() 36 36 private val length: ArrayList<MessageData?> = arrayListOf()
private val width: ArrayList<MessageData?> = arrayListOf() 37 37 private val width: ArrayList<MessageData?> = arrayListOf()
private val draft: ArrayList<MessageData?> = arrayListOf() 38 38 private val draft: ArrayList<MessageData?> = arrayListOf()
private val cargo: ArrayList<MessageData?> = arrayListOf() 39 39 private val cargo: ArrayList<MessageData?> = arrayListOf()
40 40
private var selectedItem: Pair<String, ArrayList<MessageData?>>? = null 41 41 private var selectedItem: Pair<String, ArrayList<MessageData?>>? = null
42 42
@FXML 43 43 @FXML
var dataListView = ListView<Pair<String, ArrayList<MessageData?>>>() 44 44 var dataListView = ListView<Pair<String, ArrayList<MessageData?>>>()
45 45
@FXML 46 46 @FXML
var dataViewer = JavaFxDataViewer() 47 47 var dataViewer = JavaFxDataViewer()
48 48
private val plotData = PlotData() 49 49 private val plotData = PlotData()
private val config = DataViewerConfiguration() 50 50 private val config = DataViewerConfiguration()
51 51
override fun initialize(location: URL?, resources: ResourceBundle?) { 52 52 override fun initialize(location: URL?, resources: ResourceBundle?) {
setObservableSelectedVesselListener() 53 53 setObservableSelectedVesselListener()
dataListView.items = dataList 54 54 dataListView.items = dataList
55 55
56 56
57 57
config.showLegend(true) 58 58 config.showLegend(false)
config.setLegendInsidePlot(false) 59 59 config.setLegendInsidePlot(false)
60 60
setObservableCurrentTimeListener() 61 61 setObservableCurrentTimeListener()
62 62
dataListView.setCellFactory { 63 63 dataListView.setCellFactory {
object : ListCell<Pair<String, ArrayList<MessageData?>>?>() { 64 64 object : ListCell<Pair<String, ArrayList<MessageData?>>?>() {
override fun updateItem(item: Pair<String, ArrayList<MessageData?>>?, empty: Boolean) { 65 65 override fun updateItem(item: Pair<String, ArrayList<MessageData?>>?, empty: Boolean) {
super.updateItem(item, empty) 66 66 super.updateItem(item, empty)
text = if (empty) { 67 67 text = if (empty) {
null 68 68 null
} else { 69 69 } else {
item?.first 70 70 item?.first
} 71 71 }
} 72 72 }
} 73 73 }
} 74 74 }
75 75
dataListView.selectionModel.selectedItemProperty().addListener { _, _, newValue -> 76 76 dataListView.selectionModel.selectedItemProperty().addListener { _, _, newValue ->
selectedItem = newValue 77 77 selectedItem = newValue
78 updateDataList(observableSelectedVessel.value)
plot(newValue) 78 79 plot(newValue)
} 79 80 }
80 81
plotData.allTraces.clear() 81 82 plotData.allTraces.clear()
config.setxAxisTitle("") 82 83 config.setxAxisTitle("")
config.setyAxisTitle("") 83 84 config.setyAxisTitle("")
config.plotTitle = "" 84 85 config.plotTitle = ""
dataViewer.updateConfiguration(config) 85 86 dataViewer.updateConfiguration(config)
dataViewer.updatePlot(plotData) 86 87 dataViewer.updatePlot(plotData)
initDataList() 87 88 initDataList()
88 89
89 90
} 90 91 }
91 92
private fun plot() { 92 93 private fun plot() {
if (selectedItem != null) { 93 94 if (selectedItem != null || observableSelectedVessel.value == Vessel(null)) {
GlobalScope.launch { 94 95 GlobalScope.launch {
plot(selectedItem) 95 96 plot(selectedItem)
} 96 97 }
} 97 98 }
} 98 99 }
99 100
private fun plot(data: Pair<String, ArrayList<MessageData?>>?) { 100 101 private fun plot(data: Pair<String, ArrayList<MessageData?>>?) {
if (data == null) { 101 102 if (data == null) {
plotData.allTraces.clear() 102 103 plotData.allTraces.clear()
config.setxAxisTitle("") 103 104 config.setxAxisTitle("")
config.setyAxisTitle("") 104 105 config.setyAxisTitle("")
dataViewer.updateConfiguration(config) 105 106 dataViewer.updateConfiguration(config)
106 107
dataViewer.resetPlot() 107 108 dataViewer.resetPlot()
108 109
return 109 110 return
} 110 111 }else if (data.second.size < timeData.size) return
111 112
val getValueVisitorX = GetValueVisitor() 112 113 val getValueVisitorX = GetValueVisitor()
val getValueVisitorY = GetValueVisitor() 113 114 val getValueVisitorY = GetValueVisitor()
114 115
val arrayListStringX = arrayListOf<String>() 115 116 val arrayListStringX = arrayListOf<String>()
// val arrayListDoubleX = arrayListOf<Double>() 116 117 // val arrayListDoubleX = arrayListOf<Double>()
val arrayListStringY = arrayListOf<String>() 117 118 val arrayListStringY = arrayListOf<String>()
val arrayListDoubleY = arrayListOf<Double>() 118 119 val arrayListDoubleY = arrayListOf<Double>()
119 120
for (x in 0 until timeData.size) { 120 121 for (x in 0 until timeData.size) {
timeData[x]?.accept(getValueVisitorX) 121 122 timeData[x]?.accept(getValueVisitorX)
data.second[x]?.accept(getValueVisitorY) 122 123 data.second[x]?.accept(getValueVisitorY)
123 124
if (getValueVisitorY.value.toDoubleOrNull() == null) { 124 125 if (getValueVisitorY.value.toDoubleOrNull() == null) {
arrayListStringX.add(getValueVisitorX.value) 125 126 arrayListStringX.add(getValueVisitorX.value)
arrayListStringY.add(getValueVisitorY.value) 126 127 arrayListStringY.add(getValueVisitorY.value)
} else { 127 128 } else {
arrayListStringX.add(getValueVisitorX.value) 128 129 arrayListStringX.add(getValueVisitorX.value)
arrayListDoubleY.add(getValueVisitorY.value.toDouble()) 129 130 arrayListDoubleY.add(getValueVisitorY.value.toDouble())
} 130 131 }
} 131 132 }
132 133
val scatterTrace = ScatterTrace<Any>() 133 134 val scatterTrace = ScatterTrace<Any>()
scatterTrace.traceColour = TraceColour.RED 134 135 scatterTrace.traceColour = TraceColour.RED
scatterTrace.traceVisibility = TraceVisibility.TRUE 135 136 scatterTrace.traceVisibility = TraceVisibility.TRUE
136 137
val serieStringX: Array<String> = arrayListStringX.toTypedArray() 137 138 val serieStringX: Array<String> = arrayListStringX.toTypedArray()
// val serieDoubleX: Array<Double> = arrayListDoubleX.toTypedArray() 138 139 // val serieDoubleX: Array<Double> = arrayListDoubleX.toTypedArray()
val serieStringY: Array<String> = arrayListStringY.toTypedArray() 139 140 val serieStringY: Array<String> = arrayListStringY.toTypedArray()
val serieDoubleY: Array<Double> = arrayListDoubleY.toTypedArray() 140 141 val serieDoubleY: Array<Double> = arrayListDoubleY.toTypedArray()
141 142
if (getValueVisitorY.value.toDoubleOrNull() == null) { 142 143 if (getValueVisitorY.value.toDoubleOrNull() == null) {
scatterTrace.setxArray(serieStringX) 143 144 scatterTrace.setxArray(serieStringX)
scatterTrace.setyArray(serieStringY) 144 145 scatterTrace.setyArray(serieStringY)
} else { 145 146 } else {
scatterTrace.setxArray(serieStringX) 146 147 scatterTrace.setxArray(serieStringX)
scatterTrace.setyArray(serieDoubleY) 147 148 scatterTrace.setyArray(serieDoubleY)
} 148 149 }
149 150
config.plotTitle = "" 150 151 config.plotTitle = ""
config.setxAxisTitle("Time (s)") 151 152 config.setxAxisTitle("Time (s)")
config.setyAxisTitle(data.first) 152 153 config.setyAxisTitle(data.first)
dataViewer.resetPlot() 153 154 dataViewer.resetPlot()
plotData.allTraces.clear() 154 155 plotData.allTraces.clear()
plotData.addTrace(scatterTrace) 155 156 plotData.addTrace(scatterTrace)
dataViewer.updateConfiguration(config) 156 157 dataViewer.updateConfiguration(config)
dataViewer.updatePlot(plotData) 157 158 dataViewer.updatePlot(plotData)
158 159
} 159 160 }
160 161
161 162
private fun setObservableSelectedVesselListener() { 162 163 private fun setObservableSelectedVesselListener() {
observableSelectedVessel.listeners.add(this) 163 164 observableSelectedVessel.listeners.add(this)
} 164 165 }
165 166
private fun populateTime(vessel: Vessel): ArrayList<MessageData?> { 166 167 private fun populateTime(vessel: Vessel): ArrayList<MessageData?> {
return if (observableIsReplayState.value) { 167 168 return if (observableIsReplayState.value) {
vessel.getAllTimeBeforeSelectedTime() 168 169 vessel.getAllTimeBeforeSelectedTime()
} else { 169 170 } else {
vessel.getAllTime() 170 171 vessel.getAllTime()
} 171 172 }
} 172 173 }
173 174
174 175
private fun populateLatitude(vessel: Vessel): ArrayList<MessageData?> { 175 176 private fun populateLatitude(vessel: Vessel): ArrayList<MessageData?> {
return if (observableIsReplayState.value) { 176 177 return if (observableIsReplayState.value) {
vessel.getAllLatitudeBeforeSelectedTime() 177 178 vessel.getAllLatitudeBeforeSelectedTime()
} else { 178 179 } else {
vessel.getAllLatitude() 179 180 vessel.getAllLatitude()
} 180 181 }
} 181 182 }
182 183
private fun populateLongitude(vessel: Vessel): ArrayList<MessageData?> { 183 184 private fun populateLongitude(vessel: Vessel): ArrayList<MessageData?> {
return if (observableIsReplayState.value) { 184 185 return if (observableIsReplayState.value) {
vessel.getAllLongitudeBeforeSelectedTime() 185 186 vessel.getAllLongitudeBeforeSelectedTime()
} else { 186 187 } else {
vessel.getAllLongitude() 187 188 vessel.getAllLongitude()
} 188 189 }
} 189 190 }
190 191
private fun populateSpeedOverGround(vessel: Vessel): ArrayList<MessageData?> { 191 192 private fun populateSpeedOverGround(vessel: Vessel): ArrayList<MessageData?> {
return if (observableIsReplayState.value) { 192 193 return if (observableIsReplayState.value) {
vessel.getAllSpeedOverGroundBeforeSelectedTime() 193 194 vessel.getAllSpeedOverGroundBeforeSelectedTime()
} else { 194 195 } else {
vessel.getAllSpeedOverGround() 195 196 vessel.getAllSpeedOverGround()
} 196 197 }
} 197 198 }
198 199
private fun populateCourseOverGround(vessel: Vessel): ArrayList<MessageData?> { 199 200 private fun populateCourseOverGround(vessel: Vessel): ArrayList<MessageData?> {
return if (observableIsReplayState.value) { 200 201 return if (observableIsReplayState.value) {
vessel.getAllCourseOverGroundBeforeSelectedTime() 201 202 vessel.getAllCourseOverGroundBeforeSelectedTime()
} else { 202 203 } else {
vessel.getAllCourseOverGround() 203 204 vessel.getAllCourseOverGround()
} 204 205 }
} 205 206 }
206 207
private fun populateHeading(vessel: Vessel): ArrayList<MessageData?> { 207 208 private fun populateHeading(vessel: Vessel): ArrayList<MessageData?> {
return if (observableIsReplayState.value) { 208 209 return if (observableIsReplayState.value) {
vessel.getAllHeadingBeforeSelectedTime() 209 210 vessel.getAllHeadingBeforeSelectedTime()
} else { 210 211 } else {
vessel.getAllHeading() 211 212 vessel.getAllHeading()
} 212 213 }
} 213 214 }
214 215
private fun populateVesselName(vessel: Vessel): ArrayList<MessageData?> { 215 216 private fun populateVesselName(vessel: Vessel): ArrayList<MessageData?> {
return if (observableIsReplayState.value) { 216 217 return if (observableIsReplayState.value) {
vessel.getAllVesselNameBeforeSelectedTime() 217 218 vessel.getAllVesselNameBeforeSelectedTime()
} else { 218 219 } else {
vessel.getAllVesselName() 219 220 vessel.getAllVesselName()
} 220 221 }
} 221 222 }
222 223
private fun populateIMO(vessel: Vessel): ArrayList<MessageData?> { 223 224 private fun populateIMO(vessel: Vessel): ArrayList<MessageData?> {
return if (observableIsReplayState.value) { 224 225 return if (observableIsReplayState.value) {
vessel.getAllIMOBeforeSelectedTime() 225 226 vessel.getAllIMOBeforeSelectedTime()
} else { 226 227 } else {
vessel.getAllIMO() 227 228 vessel.getAllIMO()
} 228 229 }
} 229 230 }
230 231
private fun populateCallSign(vessel: Vessel): ArrayList<MessageData?> { 231 232 private fun populateCallSign(vessel: Vessel): ArrayList<MessageData?> {
return if (observableIsReplayState.value) { 232 233 return if (observableIsReplayState.value) {
vessel.getAllCallSignBeforeSelectedTime() 233 234 vessel.getAllCallSignBeforeSelectedTime()
} else { 234 235 } else {
vessel.getAllCallSign() 235 236 vessel.getAllCallSign()
} 236 237 }
} 237 238 }
238 239
private fun populateVesselType(vessel: Vessel): ArrayList<MessageData?> { 239 240 private fun populateVesselType(vessel: Vessel): ArrayList<MessageData?> {
return if (observableIsReplayState.value) { 240 241 return if (observableIsReplayState.value) {
vessel.getAllVesselTypeBeforeSelectedTime() 241 242 vessel.getAllVesselTypeBeforeSelectedTime()
} else { 242 243 } else {
vessel.getAllVesselType() 243 244 vessel.getAllVesselType()
} 244 245 }
} 245 246 }
246 247
private fun populateStatus(vessel: Vessel): ArrayList<MessageData?> { 247 248 private fun populateStatus(vessel: Vessel): ArrayList<MessageData?> {
return if (observableIsReplayState.value) { 248 249 return if (observableIsReplayState.value) {
vessel.getAllStatusBeforeSelectedTime() 249 250 vessel.getAllStatusBeforeSelectedTime()
} else { 250 251 } else {
vessel.getAllStatus() 251 252 vessel.getAllStatus()
} 252 253 }
} 253 254 }
254 255
private fun populateLength(vessel: Vessel): ArrayList<MessageData?> { 255 256 private fun populateLength(vessel: Vessel): ArrayList<MessageData?> {
return if (observableIsReplayState.value) { 256 257 return if (observableIsReplayState.value) {
vessel.getAllLengthBeforeSelectedTime() 257 258 vessel.getAllLengthBeforeSelectedTime()
} else { 258 259 } else {
vessel.getAllLength() 259 260 vessel.getAllLength()
} 260 261 }
} 261 262 }
262 263
private fun populateWidth(vessel: Vessel): ArrayList<MessageData?> { 263 264 private fun populateWidth(vessel: Vessel): ArrayList<MessageData?> {
return if (observableIsReplayState.value) { 264 265 return if (observableIsReplayState.value) {
vessel.getAllWidthBeforeSelectedTime() 265 266 vessel.getAllWidthBeforeSelectedTime()
} else { 266 267 } else {
vessel.getAllWidth() 267 268 vessel.getAllWidth()
} 268 269 }
} 269 270 }
270 271
private fun populateDraft(vessel: Vessel): ArrayList<MessageData?> { 271 272 private fun populateDraft(vessel: Vessel): ArrayList<MessageData?> {
return if (observableIsReplayState.value) { 272 273 return if (observableIsReplayState.value) {
vessel.getAllDraftBeforeSelectedTime() 273 274 vessel.getAllDraftBeforeSelectedTime()
} else { 274 275 } else {
vessel.getAllDraft() 275 276 vessel.getAllDraft()
} 276 277 }
} 277 278 }
278 279
private fun populateCargo(vessel: Vessel): ArrayList<MessageData?> { 279 280 private fun populateCargo(vessel: Vessel): ArrayList<MessageData?> {
return if (observableIsReplayState.value) { 280 281 return if (observableIsReplayState.value) {
vessel.getAllCargoBeforeSelectedTime() 281 282 vessel.getAllCargoBeforeSelectedTime()
} else { 282 283 } else {
vessel.getAllCargo() 283 284 vessel.getAllCargo()
} 284 285 }
} 285 286 }
286 287
private fun initDataList() { 287 288 private fun initDataList() {
val data = arrayListOf<Pair<String, ArrayList<MessageData?>>>() 288 289 val data = arrayListOf<Pair<String, ArrayList<MessageData?>>>()
289 290
data.add(Pair("Latitude", latitude)) 290 291 data.add(Pair("Latitude", latitude))
data.add(Pair("Longitude", longitude)) 291 292 data.add(Pair("Longitude", longitude))
data.add(Pair("Speed Over Ground", speedOverGround)) 292 293 data.add(Pair("Speed Over Ground", speedOverGround))
data.add(Pair("Course Over Ground", courseOverGround)) 293 294 data.add(Pair("Course Over Ground", courseOverGround))
data.add(Pair("Heading", heading)) 294 295 data.add(Pair("Heading", heading))
data.add(Pair("Vessel Name", vesselName)) 295 296 data.add(Pair("Vessel Name", vesselName))
data.add(Pair("IMO", imo)) 296 297 data.add(Pair("IMO", imo))
data.add(Pair("Call Sign", callSign)) 297 298 data.add(Pair("Call Sign", callSign))
data.add(Pair("Vessel Type", vesselType)) 298 299 data.add(Pair("Vessel Type", vesselType))
data.add(Pair("Status", status)) 299 300 data.add(Pair("Status", status))
data.add(Pair("Length", length)) 300 301 data.add(Pair("Length", length))
data.add(Pair("Width", width)) 301 302 data.add(Pair("Width", width))
data.add(Pair("Draft", draft)) 302 303 data.add(Pair("Draft", draft))
data.add(Pair("Cargo", cargo)) 303 304 data.add(Pair("Cargo", cargo))
304 305
dataList.addAll(data) 305 306 dataList.addAll(data)
} 306 307 }
307 308
private fun updateDataList(vessel: Vessel) { 308 309 private fun updateDataList(vessel: Vessel) {
timeData = populateTime(vessel) 309 310 timeData = populateTime(vessel)
310 311
latitude.clear() 311 312 if(dataListView.selectionModel.selectedItem == null) return
latitude.addAll(populateLatitude(vessel)) 312
313 313
longitude.clear() 314 314 when (dataListView.selectionModel.selectedItem.first) {
longitude.addAll(populateLongitude(vessel)) 315 315 "Latitude" -> {
316 316 latitude.clear()
speedOverGround.clear() 317 317 latitude.addAll(populateLatitude(vessel))
speedOverGround.addAll(populateSpeedOverGround(vessel)) 318 318 }
319 319 "Longitude" -> {
courseOverGround.clear() 320 320 longitude.clear()
courseOverGround.addAll(populateCourseOverGround(vessel)) 321 321 longitude.addAll(populateLongitude(vessel))
322 322 }
heading.clear() 323 323 "Speed Over Ground" -> {
heading.addAll(populateHeading(vessel)) 324 324 speedOverGround.clear()
325 325 speedOverGround.addAll(populateSpeedOverGround(vessel))
vesselName.clear() 326 326 }
vesselName.addAll(populateVesselName(vessel)) 327 327 "Course Over Ground" -> {
328 328 courseOverGround.clear()
imo.clear() 329 329 courseOverGround.addAll(populateCourseOverGround(vessel))
imo.addAll(populateIMO(vessel)) 330 330 }
331 331 "Heading" -> {
callSign.clear() 332 332 heading.clear()
callSign.addAll(populateCallSign(vessel)) 333 333 heading.addAll(populateHeading(vessel))
334 334 }
vesselType.clear() 335 335 "Vessel Name" -> {
vesselType.addAll(populateVesselType(vessel)) 336 336 vesselName.clear()
337 337 vesselName.addAll(populateVesselName(vessel))
status.clear() 338 338 }
status.addAll(populateStatus(vessel)) 339 339 "IMO" -> {
340 340 imo.clear()
length.clear() 341 341 imo.addAll(populateIMO(vessel))
length.addAll(populateLength(vessel)) 342 342 }
343 343 "Call Sign" -> {
width.clear() 344 344 callSign.clear()
width.addAll(populateWidth(vessel)) 345 345 callSign.addAll(populateCallSign(vessel))
346 346 }
draft.clear() 347 347 "Vessel Type" -> {
draft.addAll(populateDraft(vessel)) 348 348 vesselType.clear()
349 349 vesselType.addAll(populateVesselType(vessel))
cargo.clear() 350 350 }
cargo.addAll(populateCargo(vessel)) 351 351 "Status" -> {
352 352 status.clear()
353 status.addAll(populateStatus(vessel))
354 }
355 "Length" -> {
356 length.clear()
357 length.addAll(populateLength(vessel))
358 }
359 "Width" -> {
360 width.clear()