package regexgolf2.ui.subcomponents.requirementlisting.requirementcell; import javafx.beans.property.BooleanProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.scene.Node; import javafx.scene.control.ContentDisplay; import javafx.scene.control.ListCell; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.AnchorPane; import regexgolf2.ui.subcomponents.editablelabel.EditableLabel; public class RequirementCellUI extends ListCell<RequirementItem> { /** * ImageView that displays the check-image that indicates, * if the requirement is complied or not. */ private final ImageView _imageView = new ImageView(); private final EditableLabel _editLabel = new EditableLabel(); private final AnchorPane _rootNode = new AnchorPane(); private Image _notCompliedImage; private Image _compliedImage; private final BooleanProperty _complied = new SimpleBooleanProperty(); public RequirementCellUI() { initCommitEditCall(); initLayout(); initImages(); initCompliedChangedReaction(); _editLabel.editableProperty().bind(this.editableProperty()); setComplied(false); } //TODO move all the images into a different directory private void initLayout() { _editLabel.editIconAppearsProperty().bind(this.hoverProperty()); Node editLabelNode = _editLabel.getUINode(); AnchorPane.setLeftAnchor(editLabelNode, 0.0); AnchorPane.setTopAnchor(editLabelNode, 0.0); AnchorPane.setBottomAnchor(editLabelNode, 0.0); _imageView.setFitHeight(25); _imageView.setFitWidth(25); AnchorPane.setTopAnchor(_imageView, 0.0); AnchorPane.setRightAnchor(_imageView, 0.0); _rootNode.getChildren().add(editLabelNode); _rootNode.getChildren().add(_imageView); //Setup correct scaling this.setPrefWidth(0); _rootNode.prefWidthProperty().bind(this.widthProperty()); setContentDisplay(ContentDisplay.GRAPHIC_ONLY); } private void initCommitEditCall() { _editLabel.editModeProperty().addListener(new ChangeListener<Boolean>() { @Override public void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2) { if (!arg2) RequirementCellUI.this.commitEdit(getItem()); } }); } private void initImages() { _compliedImage = new Image(getClass().getResourceAsStream("complied.png")); _notCompliedImage = new Image(getClass().getResourceAsStream("notComplied.png")); } private void initCompliedChangedReaction() { _complied.addListener(new ChangeListener<Boolean>() { @Override public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { setComplied(newValue); } }); } private void setComplied(boolean complied) { if (complied) _imageView.setImage(_compliedImage); else _imageView.setImage(_notCompliedImage); } @Override public void startEdit() { super.startEdit(); _editLabel.tryEnterEditMode(); } /** * Called on various events to update the UI accordingly */ @Override protected void updateItem(RequirementItem requirement, boolean empty) { //Get current item and unsubscribe if item is set if (getItem() != null) { _editLabel.textProperty().unbindBidirectional(getItem().wordProperty()); _complied.unbindBidirectional(getItem().compliedProperty()); } super.updateItem(requirement, empty); if (getItem() == null) { setGraphic(null); } else { setGraphic(_rootNode); _editLabel.textProperty().bindBidirectional(requirement.wordProperty()); _complied.bind(requirement.compliedProperty()); } } }