diff --git a/src/main/java/com/sparrowwallet/sparrow/control/CoinCell.java b/src/main/java/com/sparrowwallet/sparrow/control/CoinCell.java index 1d681a53..c04ff972 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/CoinCell.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/CoinCell.java @@ -4,15 +4,16 @@ import com.sparrowwallet.drongo.BitcoinUnit; import com.sparrowwallet.drongo.protocol.Transaction; import com.sparrowwallet.drongo.wallet.BlockTransactionHash; import com.sparrowwallet.sparrow.UnitFormat; +import com.sparrowwallet.sparrow.io.Config; import com.sparrowwallet.sparrow.wallet.Entry; import com.sparrowwallet.sparrow.wallet.HashIndexEntry; import com.sparrowwallet.sparrow.wallet.TransactionEntry; import com.sparrowwallet.sparrow.wallet.UtxoEntry; import javafx.beans.property.IntegerProperty; import javafx.beans.property.SimpleIntegerProperty; -import javafx.scene.control.ContentDisplay; -import javafx.scene.control.Tooltip; -import javafx.scene.control.TreeTableCell; +import javafx.scene.control.*; +import javafx.scene.input.Clipboard; +import javafx.scene.input.ClipboardContent; import javafx.scene.layout.Region; import javafx.util.Duration; import org.controlsfx.tools.Platform; @@ -21,6 +22,7 @@ import java.text.DecimalFormat; class CoinCell extends TreeTableCell implements ConfirmationsListener { private final CoinTooltip tooltip; + private final CoinContextMenu contextMenu; private IntegerProperty confirmationsProperty; @@ -28,6 +30,8 @@ class CoinCell extends TreeTableCell implements ConfirmationsList super(); tooltip = new CoinTooltip(); tooltip.setShowDelay(Duration.millis(500)); + contextMenu = new CoinContextMenu(); + setContextMenu(contextMenu); getStyleClass().add("coin-cell"); if(Platform.getCurrent() == Platform.OSX) { getStyleClass().add("number-field"); @@ -42,6 +46,7 @@ class CoinCell extends TreeTableCell implements ConfirmationsList setText(null); setGraphic(null); setTooltip(null); + setContextMenu(null); } else { Entry entry = getTreeTableView().getTreeItem(getIndex()).getValue(); EntryCell.applyRowStyles(this, entry); @@ -62,6 +67,8 @@ class CoinCell extends TreeTableCell implements ConfirmationsList setText(satsValue); } setTooltip(tooltip); + contextMenu.updateAmount(amount); + setContextMenu(contextMenu); if(entry instanceof TransactionEntry transactionEntry) { tooltip.showConfirmations(transactionEntry.confirmationsProperty()); @@ -155,4 +162,37 @@ class CoinCell extends TreeTableCell implements ConfirmationsList } } } + + private static class CoinContextMenu extends ContextMenu { + private Number amount; + public CoinContextMenu() { + } + + public void updateAmount(Number amount) { + if (amount.equals(this.amount)) { + return; + } + this.amount = amount; + getItems().clear(); + + MenuItem copySatsValue = new MenuItem("Copy Value in sats"); + copySatsValue.setOnAction(AE -> { + hide(); + ClipboardContent content = new ClipboardContent(); + content.putString(amount.toString()); + Clipboard.getSystemClipboard().setContent(content); + }); + + MenuItem copyBtcValue = new MenuItem("Copy Value in BTC"); + copyBtcValue.setOnAction(AE -> { + hide(); + ClipboardContent content = new ClipboardContent(); + UnitFormat format = Config.get().getUnitFormat() == null ? UnitFormat.DOT : Config.get().getUnitFormat(); + content.putString(format.formatBtcValue(amount.longValue())); + Clipboard.getSystemClipboard().setContent(content); + }); + + getItems().addAll(copySatsValue, copyBtcValue); + } + } }