package application.controller import application.model.MessageListener import application.model.Vessel import application.model.observableSelectedVessel import application.model.observableVessel import javafx.collections.FXCollections import javafx.collections.ObservableList import javafx.fxml.FXML import javafx.fxml.Initializable import javafx.scene.control.ListCell import javafx.scene.control.ListView import javafx.scene.control.MultipleSelectionModel import javafx.scene.control.SelectionMode import javafx.scene.input.MouseEvent import java.net.URL import java.util.* class VesselListPanelController : Initializable, MessageListener { @FXML var shipListView: ListView = ListView() private var shipList: ObservableList = FXCollections.observableArrayList() override fun initialize(location: URL?, resources: ResourceBundle?) { shipListView.items = shipList observableVessel.listeners.add(this) shipListView.selectionModel.selectedItemProperty().addListener { _, _, newValue -> if (newValue == null) { observableSelectedVessel.value = Vessel(null) } else { observableSelectedVessel.value = observableVessel.vessels[newValue]!! } } setCellFactory() } override fun onValueChanged(newValue: MutableMap) { shipList.clear() shipList.addAll(newValue.keys) } private fun setCellFactory() { val selectionModel: MultipleSelectionModel? = shipListView.selectionModel selectionModel?.selectionMode = SelectionMode.SINGLE shipListView.setCellFactory { val cell = ListCell() cell.textProperty().bind(cell.itemProperty()) cell.addEventFilter(MouseEvent.MOUSE_PRESSED) { event: MouseEvent -> shipListView.requestFocus() if (!cell.isEmpty) { val index = cell.index if (selectionModel!!.selectedIndices.contains(index)) { selectionModel.clearSelection() } else { selectionModel.select(index) } event.consume() } } cell } } }