mirror of
https://github.com/sparrowwallet/sparrow.git
synced 2024-12-24 12:46:45 +00:00
add pdf export of wallet output descriptor from qr display dialog
This commit is contained in:
parent
d9bba16eb6
commit
af9eb3cc64
5 changed files with 78 additions and 2 deletions
|
@ -97,6 +97,7 @@ dependencies {
|
||||||
implementation('io.reactivex.rxjava2:rxjavafx:2.2.2')
|
implementation('io.reactivex.rxjava2:rxjavafx:2.2.2')
|
||||||
implementation('org.apache.commons:commons-lang3:3.7')
|
implementation('org.apache.commons:commons-lang3:3.7')
|
||||||
implementation('net.sourceforge.streamsupport:streamsupport:1.7.0')
|
implementation('net.sourceforge.streamsupport:streamsupport:1.7.0')
|
||||||
|
implementation('com.github.librepdf:openpdf:1.3.27')
|
||||||
testImplementation('junit:junit:4.12')
|
testImplementation('junit:junit:4.12')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
package com.sparrowwallet.sparrow.control;
|
||||||
|
|
||||||
|
import com.lowagie.text.*;
|
||||||
|
import com.lowagie.text.Font;
|
||||||
|
import com.lowagie.text.Image;
|
||||||
|
import com.lowagie.text.pdf.PdfWriter;
|
||||||
|
import com.sparrowwallet.hummingbird.UR;
|
||||||
|
import com.sparrowwallet.hummingbird.UREncoder;
|
||||||
|
import com.sparrowwallet.sparrow.AppServices;
|
||||||
|
import javafx.embed.swing.SwingFXUtils;
|
||||||
|
import javafx.event.ActionEvent;
|
||||||
|
import javafx.scene.control.*;
|
||||||
|
import javafx.scene.control.Button;
|
||||||
|
import javafx.stage.FileChooser;
|
||||||
|
import javafx.stage.Stage;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
|
||||||
|
public class DescriptorQRDisplayDialog extends QRDisplayDialog {
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(DescriptorQRDisplayDialog.class);
|
||||||
|
|
||||||
|
public DescriptorQRDisplayDialog(String walletName, String outputDescriptor, UR ur) {
|
||||||
|
super(ur);
|
||||||
|
|
||||||
|
DialogPane dialogPane = getDialogPane();
|
||||||
|
final ButtonType pdfButtonType = new javafx.scene.control.ButtonType("Save PDF...", ButtonBar.ButtonData.HELP_2);
|
||||||
|
dialogPane.getButtonTypes().add(pdfButtonType);
|
||||||
|
|
||||||
|
Button pdfButton = (Button)dialogPane.lookupButton(pdfButtonType);
|
||||||
|
pdfButton.addEventFilter(ActionEvent.ACTION, event -> {
|
||||||
|
savePdf(walletName, outputDescriptor, ur);
|
||||||
|
event.consume();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void savePdf(String walletName, String outputDescriptor, UR ur) {
|
||||||
|
Stage window = new Stage();
|
||||||
|
FileChooser fileChooser = new FileChooser();
|
||||||
|
fileChooser.setTitle("Save PDF");
|
||||||
|
fileChooser.setInitialFileName(walletName + ".pdf");
|
||||||
|
AppServices.moveToActiveWindowScreen(window, 800, 450);
|
||||||
|
File file = fileChooser.showSaveDialog(window);
|
||||||
|
if(file != null) {
|
||||||
|
try(Document document = new Document()) {
|
||||||
|
document.setMargins(36, 36, 48, 36);
|
||||||
|
PdfWriter.getInstance(document, new FileOutputStream(file));
|
||||||
|
document.open();
|
||||||
|
|
||||||
|
Font titleFont = FontFactory.getFont(FontFactory.HELVETICA_BOLD, 16, Color.BLACK);
|
||||||
|
Chunk title = new Chunk("Output descriptor for " + walletName, titleFont);
|
||||||
|
document.add(title);
|
||||||
|
|
||||||
|
UREncoder urEncoder = new UREncoder(ur, 2000, 10, 0);
|
||||||
|
String fragment = urEncoder.nextPart();
|
||||||
|
if(urEncoder.isSinglePart()) {
|
||||||
|
Image image = Image.getInstance(SwingFXUtils.fromFXImage(getQrCode(fragment), null), Color.WHITE);
|
||||||
|
document.add(image);
|
||||||
|
}
|
||||||
|
|
||||||
|
Font descriptorFont = FontFactory.getFont(FontFactory.COURIER, 14, Color.BLACK);
|
||||||
|
Paragraph descriptor = new Paragraph(outputDescriptor, descriptorFont);
|
||||||
|
document.add(descriptor);
|
||||||
|
} catch(Exception e) {
|
||||||
|
log.error("Error creating descriptor PDF", e);
|
||||||
|
AppServices.showErrorDialog("Error creating PDF", e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -137,7 +137,7 @@ public class QRDisplayDialog extends Dialog<UR> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Image getQrCode(String fragment) {
|
protected Image getQrCode(String fragment) {
|
||||||
try {
|
try {
|
||||||
QRCodeWriter qrCodeWriter = new QRCodeWriter();
|
QRCodeWriter qrCodeWriter = new QRCodeWriter();
|
||||||
BitMatrix qrMatrix = qrCodeWriter.encode(fragment, BarcodeFormat.QR_CODE, QR_WIDTH, QR_HEIGHT);
|
BitMatrix qrMatrix = qrCodeWriter.encode(fragment, BarcodeFormat.QR_CODE, QR_WIDTH, QR_HEIGHT);
|
||||||
|
|
|
@ -324,6 +324,7 @@ public class SettingsController extends WalletFormController implements Initiali
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OutputDescriptor outputDescriptor = OutputDescriptor.getOutputDescriptor(walletForm.getWallet(), KeyPurpose.DEFAULT_PURPOSES, null);
|
||||||
List<ScriptExpression> scriptExpressions = getScriptExpressions(walletForm.getWallet().getScriptType());
|
List<ScriptExpression> scriptExpressions = getScriptExpressions(walletForm.getWallet().getScriptType());
|
||||||
|
|
||||||
CryptoOutput cryptoOutput;
|
CryptoOutput cryptoOutput;
|
||||||
|
@ -341,7 +342,7 @@ public class SettingsController extends WalletFormController implements Initiali
|
||||||
}
|
}
|
||||||
|
|
||||||
UR cryptoOutputUR = cryptoOutput.toUR();
|
UR cryptoOutputUR = cryptoOutput.toUR();
|
||||||
QRDisplayDialog qrDisplayDialog = new QRDisplayDialog(cryptoOutputUR);
|
QRDisplayDialog qrDisplayDialog = new DescriptorQRDisplayDialog(walletForm.getWallet().getFullDisplayName(), outputDescriptor.toString(true), cryptoOutputUR);
|
||||||
qrDisplayDialog.showAndWait();
|
qrDisplayDialog.showAndWait();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,4 +44,5 @@ open module com.sparrowwallet.sparrow {
|
||||||
requires org.apache.commons.lang3;
|
requires org.apache.commons.lang3;
|
||||||
requires net.sourceforge.streamsupport;
|
requires net.sourceforge.streamsupport;
|
||||||
requires co.nstant.in.cbor;
|
requires co.nstant.in.cbor;
|
||||||
|
requires com.github.librepdf.openpdf;
|
||||||
}
|
}
|
Loading…
Reference in a new issue