package com.digiarea.closure.model.providers;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TableCell;
import com.digiarea.closure.model.JsDefine;
import com.digiarea.closure.model.JsDefineType;
public class ComboboxTableCell extends TableCell<JsDefine, JsDefineType> {
private final ObservableList<JsDefineType> items;
private ComboBox<JsDefineType> box;
public ComboboxTableCell() {
this(FXCollections.<JsDefineType>observableArrayList());
}
public ComboboxTableCell(JsDefineType... items) {
this(FXCollections.observableArrayList(items));
}
public ComboboxTableCell(ObservableList<JsDefineType> items) {
this.getStyleClass().add("combo-box-table-cell");
this.items = items;
}
public ObservableList<JsDefineType> getItems() {
return items;
}
/** {@inheritDoc} */
@Override
public void updateItem(JsDefineType item, boolean empty) {
super.updateItem(item, empty);
if (isEmpty()) {
setText(null);
setGraphic(null);
} else {
if (box == null) {
box = createComboBox(items);
}
setText(null);
setGraphic(box);
box.getSelectionModel().select(getItem());
}
}
private ComboBox<JsDefineType> createComboBox(ObservableList<JsDefineType> items) {
ComboBox<JsDefineType> box = new ComboBox<JsDefineType>(items);
box.setMaxWidth(Double.MAX_VALUE);
box.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<JsDefineType>() {
@Override
public void changed(ObservableValue<? extends JsDefineType> ov, JsDefineType oldValue, JsDefineType newValue) {
if (newValue != getItem()) {
((JsDefine) getTableRow().getItem()).setType(newValue);
}
}
});
return box;
}
}