/** * File for the TextFieldWithContextMenu. */ package de.fhswf.in.inf.java2.aufgabe04; import java.util.HashMap; import java.util.Map; import java.util.Stack; import javafx.scene.control.ContextMenu; import javafx.scene.control.MenuItem; import javafx.scene.control.TextField; import javafx.scene.input.Clipboard; import javafx.scene.input.DataFormat; /** * A TextField with a ContextMenu. * * @author $Author: $ * @version $Revision: $, $Date: $ UTC */ public class TextFieldWithContextMenu extends TextField { Stack undoStack = new Stack<>(); private MenuItem undo = new MenuItem("Rückgängig"); private MenuItem cut = new MenuItem("Ausschneiden"); private MenuItem copy = new MenuItem("Kopieren"); private MenuItem paste = new MenuItem("Einfügen"); private MenuItem delete = new MenuItem("Löschen"); private MenuItem selectAll = new MenuItem("Alles Markieren"); private ContextMenu contextMenu; /** * Build the ContextMenu for the TextField. * */ public TextFieldWithContextMenu() { //So empty is a valid pop and we never pop an empty stack undoStack.push(""); undo.setOnAction(e -> { //The first time properties are strange. //The multiple pops are needed as the TextChangeListener //adds the actual text before and after the setText //Debugger is unusable while ContextMenu is open. //contextMenu.hide(); undoStack.pop(); setText(undoStack.pop()); undoStack.pop(); }); cut.setOnAction(e -> { Map content = new HashMap<>(); content.put(DataFormat.PLAIN_TEXT, getSelectedText()); Clipboard.getSystemClipboard().setContent(content); deleteText(getSelection()); }); copy.setOnAction(e -> { Map content = new HashMap<>(); content.put(DataFormat.PLAIN_TEXT, getSelectedText()); Clipboard.getSystemClipboard().setContent(content); }); paste.setOnAction(e -> { replaceSelection(Clipboard.getSystemClipboard().getString()); }); delete.setOnAction(e -> { replaceSelection(""); }); selectAll.setOnAction(e -> { selectRange(0, getText().length()); }); contextMenu = new ContextMenu(undo, cut, copy, paste, delete, selectAll); setContextMenu(contextMenu); contextMenu.setOnShowing(e -> { getContextMenu().getItems().forEach(f -> { f.setDisable(true); }); if (undoStack.size() > 1) { undo.setDisable(false); } if (getSelection().getLength() > 0) { copy.setDisable(false); cut.setDisable(false); delete.setDisable(false); } if (Clipboard.getSystemClipboard().getString() != null) { paste.setDisable(false); } if (getLength() > 0 && getSelection().getLength() < getLength()) { selectAll.setDisable(false); } }); textProperty().addListener(e -> { undoStack.push(getText()); }); } }