diff --git a/app/src/main/java/com/annimon/hotarufx/ui/FontAwesome.java b/app/src/main/java/com/annimon/hotarufx/ui/FontAwesome.java index 3693263..9ef8293 100644 --- a/app/src/main/java/com/annimon/hotarufx/ui/FontAwesome.java +++ b/app/src/main/java/com/annimon/hotarufx/ui/FontAwesome.java @@ -11,7 +11,9 @@ import javafx.util.Pair; public enum FontAwesome { - CLIPBOARD("\uf0ea", "clipboard"), + CLIPBOARD("\uf0ea", "clipboard", "paste"), + CLONE("\uf24d", "clone"), + COPY("\uf0c5", "copy"), COPYRIGHT("\uf1f9", "copyright"), FONT_AWESOME("\uf2b4", "font-awesome"), GITHUB("\uf09b", "github"), @@ -19,6 +21,7 @@ public enum FontAwesome { PENCIL("\uf040", "pencil"), PLAY("\uf04b", "play"), REDO("\uf01e", "redo"), + SCISSORS("\uf0c4", "scissors", "cut"), UNDO("\uf0e2", "undo"); private final String symbol; diff --git a/app/src/main/java/com/annimon/hotarufx/ui/control/ColorPickerBox.java b/app/src/main/java/com/annimon/hotarufx/ui/control/ColorPickerBox.java index 24d76d0..0cdcd6e 100644 --- a/app/src/main/java/com/annimon/hotarufx/ui/control/ColorPickerBox.java +++ b/app/src/main/java/com/annimon/hotarufx/ui/control/ColorPickerBox.java @@ -155,7 +155,7 @@ public class ColorPickerBox extends VBox { } }); final Button copyButton = new Button("Copy"); - copyButton.setGraphic(new FontAwesomeIcon("clipboard")); + copyButton.setGraphic(new FontAwesomeIcon("copy")); copyButton.setOnAction(e -> { final Clipboard clipboard = Clipboard.getSystemClipboard(); final ClipboardContent content = new ClipboardContent(); diff --git a/app/src/main/java/com/annimon/hotarufx/ui/controller/EditorController.java b/app/src/main/java/com/annimon/hotarufx/ui/controller/EditorController.java index 74f85ed..2876c7d 100644 --- a/app/src/main/java/com/annimon/hotarufx/ui/controller/EditorController.java +++ b/app/src/main/java/com/annimon/hotarufx/ui/controller/EditorController.java @@ -12,8 +12,8 @@ import com.annimon.hotarufx.lexer.HotaruLexer; import com.annimon.hotarufx.lib.Context; import com.annimon.hotarufx.parser.HotaruParser; import com.annimon.hotarufx.parser.visitors.InterpreterVisitor; -import com.annimon.hotarufx.ui.control.LibraryItem; import com.annimon.hotarufx.ui.SyntaxHighlighter; +import com.annimon.hotarufx.ui.control.LibraryItem; import java.io.IOException; import java.io.InputStream; import java.net.URL; @@ -22,7 +22,9 @@ import java.util.ResourceBundle; import java.util.concurrent.Executors; import javafx.application.Platform; import javafx.beans.binding.Bindings; +import javafx.beans.binding.BooleanBinding; import javafx.event.ActionEvent; +import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; @@ -44,7 +46,7 @@ public class EditorController implements Initializable, DocumentListener { private CheckMenuItem syntaxHighlightingItem; @FXML - private Button undoButton, redoButton; + private Button undoButton, redoButton, cutButton, copyButton, pasteButton; @FXML private CodeArea editor; @@ -164,6 +166,7 @@ public class EditorController implements Initializable, DocumentListener { documentManager = new FileManager(); initSyntaxHighlighter(); initUndoRedo(); + initCopyCutPaste(); openSample(); editor.getUndoManager().forgetHistory(); initializeLibrary(); @@ -191,8 +194,31 @@ public class EditorController implements Initializable, DocumentListener { Bindings.not(editor.undoAvailableProperty())); redoButton.disableProperty().bind( Bindings.not(editor.redoAvailableProperty())); - undoButton.setOnAction(a -> editor.undo()); - redoButton.setOnAction(a -> editor.redo()); + undoButton.setOnAction(editorAction(editor::undo)); + redoButton.setOnAction(editorAction(editor::redo)); + } + + private void initCopyCutPaste() { + val selectionEmpty = new BooleanBinding() { + { bind(editor.selectionProperty()); } + @Override + protected boolean computeValue() { + return editor.getSelection().getLength() == 0; + } + }; + cutButton.disableProperty().bind(selectionEmpty); + copyButton.disableProperty().bind(selectionEmpty); + + cutButton.setOnAction(editorAction(editor::cut)); + copyButton.setOnAction(editorAction(editor::copy)); + pasteButton.setOnAction(editorAction(editor::paste)); + } + + private EventHandler editorAction(Runnable r) { + return event -> { + r.run(); + editor.requestFocus(); + }; } private void initializeLibrary() { diff --git a/app/src/main/resources/fxml/Editor.fxml b/app/src/main/resources/fxml/Editor.fxml index 44fddc1..a52eba6 100644 --- a/app/src/main/resources/fxml/Editor.fxml +++ b/app/src/main/resources/fxml/Editor.fxml @@ -49,7 +49,7 @@ - + + + + +