package com.noticeditorteam.noticeditor.view; import com.noticeditorteam.noticeditor.model.NoticeItem; import com.noticeditorteam.noticeditor.model.NoticeTreeItem; import javafx.event.EventHandler; import javafx.scene.Node; import javafx.scene.control.TextField; import javafx.scene.control.TreeCell; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; public class EditNoticeTreeCell extends TreeCell<NoticeItem> { private final Circle CIRCLE_AQUAMARINE = new Circle(5, Color.AQUAMARINE); private final Circle CIRCLE_YELLOW = new Circle(5, Color.YELLOW); private TextField noticeNameField; @Override public void startEdit() { super.startEdit(); if (noticeNameField == null) { createTextField(); } setText(null); setGraphic(noticeNameField); noticeNameField.requestFocus(); noticeNameField.selectAll(); } @Override public void cancelEdit() { super.cancelEdit(); setText(getItem().getTitle()); setGraphic(getIcon()); } @Override public void commitEdit(NoticeItem item) { super.commitEdit(item); getNoticeTreeItem().setTitle(item.getTitle()); } @Override public void updateItem(NoticeItem item, boolean empty) { super.updateItem(item, empty); if (empty) { setText(null); setGraphic(null); } else if (isEditing()) { if (noticeNameField != null) { noticeNameField.setText(getTitle()); } setText(null); setGraphic(noticeNameField); } else { setText(getTitle()); setGraphic(getIcon()); } } private NoticeTreeItem getNoticeTreeItem() { return (NoticeTreeItem) getTreeItem(); } private void createTextField() { noticeNameField = new TextField(getTitle()); noticeNameField.setOnKeyReleased(new EventHandler<KeyEvent>() { @Override public void handle(KeyEvent t) { if (t.getCode() == KeyCode.ENTER) { getItem().setTitle(noticeNameField.getText()); commitEdit(getItem()); } else if (t.getCode() == KeyCode.ESCAPE) { cancelEdit(); } } }); } private Node getIcon() { if (getNoticeTreeItem().isBranch()) { return null; } switch (getNoticeTreeItem().getStatus()) { case NoticeItem.STATUS_IMPORTANT: return CIRCLE_YELLOW; default: return CIRCLE_AQUAMARINE; } } /** * @return selected item's title or empty string */ private String getTitle() { return ((getItem() == null) ? "" : getItem().getTitle()); } }