package com.scrivenvar.definition;
import static com.scrivenvar.Messages.get;
import javafx.event.ActionEvent;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextField;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import static javafx.scene.input.KeyCode.ENTER;
import static javafx.scene.input.KeyCode.ESCAPE;
import javafx.scene.input.KeyEvent;
public class TextFieldTreeCell extends TreeCell<String> {
private TextField textField;
private final ContextMenu editMenu = new ContextMenu();
public TextFieldTreeCell() {
initEditMenu();
}
private void initEditMenu() {
final MenuItem addItem = createMenuItem( "Definition.menu.add" );
final MenuItem removeItem = createMenuItem( "Definition.menu.remove" );
addItem.setOnAction( (ActionEvent e) -> {
final VariableTreeItem<String> treeItem = new VariableTreeItem<>( "Undefined" );
getTreeItem().getChildren().add( treeItem );
} );
removeItem.setOnAction( (ActionEvent e) -> {
final TreeItem c = getTreeItem();
c.getParent().getChildren().remove( c );
} );
getEditMenu().getItems().add( addItem );
getEditMenu().getItems().add( removeItem );
}
private ContextMenu getEditMenu() {
return this.editMenu;
}
private MenuItem createMenuItem( String label ) {
return new MenuItem( get( label ) );
}
@Override
public void startEdit() {
if( getTreeItem().isLeaf() ) {
super.startEdit();
final TextField inputField = getTextField();
setText( null );
setGraphic( inputField );
inputField.selectAll();
inputField.requestFocus();
}
}
@Override
public void cancelEdit() {
super.cancelEdit();
setText( (String)getItem() );
setGraphic( getTreeItem().getGraphic() );
}
@Override
public void updateItem( String item, boolean empty ) {
super.updateItem( item, empty );
if( empty ) {
setText( null );
setGraphic( null );
}
else if( isEditing() ) {
TextField tf = getTextField();
tf.setText( getItemValue() );
setText( null );
setGraphic( tf );
}
else {
setText( getItemValue() );
setGraphic( getTreeItem().getGraphic() );
if( !getTreeItem().isLeaf() && getTreeItem().getParent() != null ) {
setContextMenu( getEditMenu() );
}
}
}
private TextField createTextField() {
final TextField tf = new TextField( getItemValue() );
tf.setOnKeyReleased( (KeyEvent t) -> {
switch( t.getCode() ) {
case ENTER:
commitEdit( tf.getText() );
break;
case ESCAPE:
cancelEdit();
break;
}
} );
return tf;
}
private String getItemValue() {
return getItem() == null ? "" : getItem();
}
private TextField getTextField() {
if( this.textField == null ) {
this.textField = createTextField();
}
return this.textField;
}
}