From d1a92335577b1a3879f19d952d8a99aa223caa23 Mon Sep 17 00:00:00 2001 From: Tobias Hagemann Date: Mon, 7 Aug 2017 11:04:44 +0200 Subject: [PATCH] fixed #567: added drag & drop support for password fields --- .../ui/controls/SecPasswordField.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/main/ui/src/main/java/org/cryptomator/ui/controls/SecPasswordField.java b/main/ui/src/main/java/org/cryptomator/ui/controls/SecPasswordField.java index a6339ed24..19d01cfbd 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/controls/SecPasswordField.java +++ b/main/ui/src/main/java/org/cryptomator/ui/controls/SecPasswordField.java @@ -11,6 +11,9 @@ package org.cryptomator.ui.controls; import java.util.Arrays; import javafx.scene.control.PasswordField; +import javafx.scene.input.DragEvent; +import javafx.scene.input.Dragboard; +import javafx.scene.input.TransferMode; /** * Compromise in security. While the text can be swiped, any access to the {@link #getText()} method will create a copy of the String in the heap. @@ -19,6 +22,27 @@ public class SecPasswordField extends PasswordField { private static final char SWIPE_CHAR = ' '; + public SecPasswordField() { + this.onDragOverProperty().set(this::handleDragOver); + this.onDragDroppedProperty().set(this::handleDragDropped); + } + + private void handleDragOver(DragEvent event) { + Dragboard dragboard = event.getDragboard(); + if (dragboard.hasString() && dragboard.getString() != null) { + event.acceptTransferModes(TransferMode.COPY); + } + event.consume(); + } + + private void handleDragDropped(DragEvent event) { + Dragboard dragboard = event.getDragboard(); + if (dragboard.hasString() && dragboard.getString() != null) { + insertText(getCaretPosition(), dragboard.getString()); + } + event.consume(); + } + /** * {@link #getContent()} uses a StringBuilder, which in turn is backed by a char[]. * The delete operation of AbstractStringBuilder closes the gap, that forms by deleting chars, by moving up the following chars.