package envoy.client.ui; import javafx.beans.property.BooleanProperty; import javafx.beans.property.ObjectProperty; import javafx.beans.property.StringProperty; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.control.*; import javafx.scene.image.ImageView; import javafx.scene.layout.Background; import javafx.scene.layout.ColumnConstraints; import javafx.scene.layout.GridPane; /** * This class offers a text field that is automatically equipped with a clear * button. *

* Project: envoy-client
* File: ClearableTextField.java
* Created: 25.06.2020
* * @author Leon Hofmeister * @since Envoy Client v0.1-beta */ public final class ClearableTextField extends GridPane { private final TextField textField; private final Button clearButton; /** * Constructs a new {@code ClearableTextField} with no initial text and icon * size 16. * * @since Envoy Client v0.1-beta */ public ClearableTextField() { this("", 16); } /** * Constructs a new {@code ClearableTextField} with initial text and a * predetermined icon size. * * @param text the text that should be displayed by default * @param size the size of the icon * @since Envoy Client v0.1-beta */ public ClearableTextField(String text, int size) { // initializing the textField and the button textField = new TextField(text); clearButton = new Button("", new ImageView(IconUtil.loadIconThemeSensitive("clear_button", size))); clearButton.setOnAction(e -> textField.clear()); clearButton.setFocusTraversable(false); clearButton.getStyleClass().clear(); clearButton.setBackground(Background.EMPTY); // Adding the two elements to the GridPane add(textField, 0, 0, 2, 1); add(clearButton, 1, 0, 1, 1); // Setting the percent - widths of the two columns. // Used to locate the button on the right. final var columnConstraints = new ColumnConstraints(); columnConstraints.setPercentWidth(90); getColumnConstraints().add(columnConstraints); final var columnConstraints2 = new ColumnConstraints(); columnConstraints2.setPercentWidth(10); getColumnConstraints().add(columnConstraints2); } /** * @return the underlying {@code textField} * @since Envoy Client v0.1-beta */ public TextField getTextField() { return textField; } /** * This method offers the freedom to perform custom actions when the * {@code clearButton} has been pressed. *

* The default is * e -> {clearableTextField.getTextField().clear();} * * @param onClearButtonAction the action that should be performed * @since Envoy Client v0.1-beta */ public void setClearButtonListener(EventHandler onClearButtonAction) { clearButton.setOnAction(onClearButtonAction); } /** * @return the current property of the prompt text * @see javafx.scene.control.TextInputControl#promptTextProperty() * @since Envoy Client v0.1-beta */ public StringProperty promptTextProperty() { return textField.promptTextProperty(); } /** * @return the current prompt text * @see javafx.scene.control.TextInputControl#getPromptText() * @since Envoy Client v0.1-beta */ public String getPromptText() { return textField.getPromptText(); } /** * @param value the prompt text to display * @see javafx.scene.control.TextInputControl#setPromptText(java.lang.String) * @since Envoy Client v0.1-beta */ public void setPromptText(String value) { textField.setPromptText(value); } /** * @return the current property of the tooltip * @see javafx.scene.control.Control#tooltipProperty() * @since Envoy Client v0.1-beta */ public ObjectProperty tooltipProperty() { return textField.tooltipProperty(); } /** * @param value the new tooltip * @see javafx.scene.control.Control#setTooltip(javafx.scene.control.Tooltip) * @since Envoy Client v0.1-beta */ public void setTooltip(Tooltip value) { textField.setTooltip(value); } /** * @return the current tooltip * @see javafx.scene.control.Control#getTooltip() * @since Envoy Client v0.1-beta */ public Tooltip getTooltip() { return textField.getTooltip(); } /** * @return the current property of the context menu * @see javafx.scene.control.Control#contextMenuProperty() * @since Envoy Client v0.1-beta */ public ObjectProperty contextMenuProperty() { return textField.contextMenuProperty(); } /** * @param value the new context menu * @see javafx.scene.control.Control#setContextMenu(javafx.scene.control.ContextMenu) * @since Envoy Client v0.1-beta */ public void setContextMenu(ContextMenu value) { textField.setContextMenu(value); } /** * @return the current context menu * @see javafx.scene.control.Control#getContextMenu() * @since Envoy Client v0.1-beta */ public ContextMenu getContextMenu() { return textField.getContextMenu(); } /** * @param value whether this ClearableTextField should be editable * @see javafx.scene.control.TextInputControl#setEditable(boolean) * @since Envoy Client v0.1-beta */ public void setEditable(boolean value) { textField.setEditable(value); } /** * @return the current property whether this ClearableTextField is editable * @see javafx.scene.control.TextInputControl#editableProperty() * @since Envoy Client v0.1-beta */ public BooleanProperty editableProperty() { return textField.editableProperty(); } /** * @return whether this {@code ClearableTextField} is editable * @see javafx.scene.control.TextInputControl#isEditable() * @since Envoy Client v0.1-beta */ public boolean isEditable() { return textField.isEditable(); } }