diff --git a/src/main/java/com/sparrowwallet/sparrow/wallet/KeystoreController.java b/src/main/java/com/sparrowwallet/sparrow/wallet/KeystoreController.java index 53881d59..f8faec83 100644 --- a/src/main/java/com/sparrowwallet/sparrow/wallet/KeystoreController.java +++ b/src/main/java/com/sparrowwallet/sparrow/wallet/KeystoreController.java @@ -24,7 +24,8 @@ import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.*; -import javafx.scene.input.MouseEvent; +import javafx.scene.input.Clipboard; +import javafx.scene.input.ClipboardContent; import javafx.scene.layout.StackPane; import org.controlsfx.glyphfont.Glyph; import org.controlsfx.validation.ValidationResult; @@ -98,7 +99,7 @@ public class KeystoreController extends WalletFormController implements Initiali if(keystore.getExtendedPublicKey() != null) { xpub.setText(keystore.getExtendedPublicKey().toString()); - setXpubTooltip(keystore.getExtendedPublicKey()); + setXpubContext(keystore.getExtendedPublicKey()); } if(keystore.getKeyDerivation() != null) { @@ -125,23 +126,47 @@ public class KeystoreController extends WalletFormController implements Initiali xpub.textProperty().addListener((observable, oldValue, newValue) -> { if(ExtendedKey.isValid(newValue)) { ExtendedKey extendedKey = ExtendedKey.fromDescriptor(newValue); - setXpubTooltip(extendedKey); + setXpubContext(extendedKey); keystore.setExtendedPublicKey(extendedKey); EventManager.get().post(new SettingsChangedEvent(walletForm.getWallet(), SettingsChangedEvent.Type.KEYSTORE_XPUB)); } else { xpub.setTooltip(null); + xpub.setContextMenu(null); } }); } - private void setXpubTooltip(ExtendedKey extendedKey) { + private void setXpubContext(ExtendedKey extendedKey) { + ContextMenu contextMenu = new ContextMenu(); + MenuItem copyXPub = new MenuItem("Copy xPub"); + copyXPub.setOnAction(AE -> { + contextMenu.hide(); + ClipboardContent content = new ClipboardContent(); + content.putString(extendedKey.toString()); + Clipboard.getSystemClipboard().setContent(content); + }); + contextMenu.getItems().add(copyXPub); + ExtendedKey.Header header = ExtendedKey.Header.fromScriptType(walletForm.getWallet().getScriptType(), false); if(header != ExtendedKey.Header.xpub) { - Tooltip tooltip = new Tooltip(extendedKey.getExtendedKey(header)); + String otherPub = extendedKey.getExtendedKey(header); + + MenuItem copyOtherPub = new MenuItem("Copy " + header.getName().replace('p', 'P')); + copyOtherPub.setOnAction(AE -> { + contextMenu.hide(); + ClipboardContent content = new ClipboardContent(); + content.putString(otherPub); + Clipboard.getSystemClipboard().setContent(content); + }); + contextMenu.getItems().add(copyOtherPub); + + Tooltip tooltip = new Tooltip(otherPub); xpub.setTooltip(tooltip); } else { xpub.setTooltip(null); } + + xpub.setContextMenu(contextMenu); } public void selectSource(ActionEvent event) { @@ -309,7 +334,7 @@ public class KeystoreController extends WalletFormController implements Initiali derivation.setText(derivationPath); } if(keystore.getExtendedPublicKey() != null) { - setXpubTooltip(keystore.getExtendedPublicKey()); + setXpubContext(keystore.getExtendedPublicKey()); } } }