diff --git a/EpcQrCodeJavaFxApp/src/main/kotlin/net/codinux/banking/epcqrcode/windows/main/MainWindow.kt b/EpcQrCodeJavaFxApp/src/main/kotlin/net/codinux/banking/epcqrcode/windows/main/MainWindow.kt index 3c9168c..ffad1b9 100644 --- a/EpcQrCodeJavaFxApp/src/main/kotlin/net/codinux/banking/epcqrcode/windows/main/MainWindow.kt +++ b/EpcQrCodeJavaFxApp/src/main/kotlin/net/codinux/banking/epcqrcode/windows/main/MainWindow.kt @@ -1,16 +1,21 @@ package net.codinux.banking.epcqrcode.windows.main +import javafx.beans.property.SimpleBooleanProperty import javafx.beans.property.SimpleObjectProperty import javafx.beans.property.SimpleStringProperty import javafx.geometry.Pos +import javafx.scene.control.Alert import javafx.scene.control.TextFormatter import javafx.scene.image.Image -import net.codinux.banking.epcqrcode.* +import javafx.scene.layout.Priority +import javafx.stage.FileChooser import org.slf4j.LoggerFactory import tornadofx.* import java.io.ByteArrayInputStream +import java.io.File import java.text.DecimalFormat import java.text.ParsePosition +import net.codinux.banking.epcqrcode.* class MainWindow : View(FX.messages["application.title"]) { @@ -35,9 +40,23 @@ class MainWindow : View(FX.messages["application.title"]) { private val reference = SimpleStringProperty("") + private val selectedDestinationFile = SimpleStringProperty("") + + private val isDestinationFileSelected = SimpleBooleanProperty(false) + + private val qrCodeGenerator = QrCodeGenerator() - private val generatedQrCode = SimpleObjectProperty() + private val generatedQrCodeImage = SimpleObjectProperty() + + private var generatedQrCodeBytes: ByteArray? = null // couldn't find no working way to get image bytes from image -> also saving pure bytes in memory (what a waste) + + + init { + selectedDestinationFile.addListener { _, _, newValue -> + isDestinationFileSelected.value = newValue.isNotBlank() + } + } override val root = vbox { @@ -80,18 +99,69 @@ class MainWindow : View(FX.messages["application.title"]) { } } - hbox(alignment = Pos.CENTER_RIGHT) { - button(messages["Generate"]) { - prefWidth = 200.0 + hbox { + textfield(selectedDestinationFile) { + prefHeight = FieldHeight + + hboxConstraints { + hGrow = Priority.ALWAYS + + marginRight = 8.0 + } + } + + button("...") { + prefWidth = 50.0 + prefHeight = FieldHeight + + action { selectDestinationFileAndSaveTo() } + } + + vboxConstraints { + marginBottom = 6.0 + } + } + + hbox { + useMaxWidth = true + isFillWidth = true + + button(messages["generate"]) { + useMaxWidth = true minHeight = 36.0 action { generateQrCode() } + + hboxConstraints { + hGrow = Priority.ALWAYS + + marginRight = 8.0 + } + } + + button(messages["generate.and.save"]) { + useMaxWidth = true + minHeight = 36.0 + + enableWhen(isDestinationFileSelected) + + action { generateAndSaveQrCode() } + + hboxConstraints { + hGrow = Priority.ALWAYS + } } } } hbox(alignment = Pos.CENTER) { - imageview(generatedQrCode) { + imageview(generatedQrCodeImage) { + contextmenu { + item(messages["save.to"]) { + action { selectDestinationFileAndSaveTo() } + } + } + hboxConstraints { marginTop = 4.0 } @@ -119,11 +189,50 @@ class MainWindow : View(FX.messages["application.title"]) { } + private fun selectDestinationFileAndSaveTo() { + val fileChooser = FileChooser() + + if (isDestinationFileSelected.value) { + val file = File(selectedDestinationFile.value) + fileChooser.initialDirectory = file.parentFile + fileChooser.initialFileName = file.name + } + + fileChooser.showSaveDialog(currentStage)?.let { selectedFile -> + selectedDestinationFile.value = selectedFile.absolutePath + + saveGeneratedQrCodeTo(selectedFile) + } + } + + private fun saveGeneratedQrCodeTo(selectedFile: File) { + generatedQrCodeBytes?.let { generatedQrCodeBytes -> + try { + selectedFile.writeBytes(generatedQrCodeBytes) + } catch (e: Exception) { + val alert = Alert(Alert.AlertType.ERROR) + alert.title = messages["Could not save QR code"] + alert.headerText = "" + alert.contentText = e.toString() + alert.show() + } + } + } + + + private fun generateAndSaveQrCode() { + generateQrCode() + + if (isDestinationFileSelected.value) { + saveGeneratedQrCodeTo(File(selectedDestinationFile.value)) + } + } + private fun generateQrCode() { val param = CreatorParam(receiver.value, iban.value, bic.value, map(amount.value), reference.value) val qrCodeContent = EpcQrCodeCreator().generateAsString(param) - generatedQrCode.value = generateQrCode(qrCodeContent) + generatedQrCodeImage.value = generateQrCode(qrCodeContent) currentStage?.sizeToScene() } @@ -134,9 +243,9 @@ class MainWindow : View(FX.messages["application.title"]) { private fun generateQrCode(informationToEncode: String): Image? { try { - val qrCodeBytes = qrCodeGenerator.generateQrCode(informationToEncode) + generatedQrCodeBytes = qrCodeGenerator.generateQrCode(informationToEncode) - return Image(ByteArrayInputStream(qrCodeBytes)) + return Image(ByteArrayInputStream(generatedQrCodeBytes)) } catch (e: Exception) { logger.error("Could not generate QR code for $informationToEncode", e) } diff --git a/EpcQrCodeJavaFxApp/src/main/resources/Messages.properties b/EpcQrCodeJavaFxApp/src/main/resources/Messages.properties index 86e5366..ead9c04 100755 --- a/EpcQrCodeJavaFxApp/src/main/resources/Messages.properties +++ b/EpcQrCodeJavaFxApp/src/main/resources/Messages.properties @@ -14,4 +14,8 @@ BIC=BIC Amount=Amount Reference=Reference -Generate=Generate \ No newline at end of file +generate=Generate +generate.and.save=Generate and save +save.to=Save to ... + +alert.header.could.not.save.qr.code=Could not save QR code \ No newline at end of file diff --git a/EpcQrCodeJavaFxApp/src/main/resources/Messages_de.properties b/EpcQrCodeJavaFxApp/src/main/resources/Messages_de.properties index 1e358be..a92c72c 100755 --- a/EpcQrCodeJavaFxApp/src/main/resources/Messages_de.properties +++ b/EpcQrCodeJavaFxApp/src/main/resources/Messages_de.properties @@ -14,4 +14,8 @@ BIC=BIC Amount=Betrag Reference=Verwendungszweck -Generate=Erstellen \ No newline at end of file +generate=Erstellen +generate.and.save=Erstellen und speichern +save.to=Speichern unter... + +alert.header.could.not.save.qr.code=QR Code konnte nicht gespeichert werden \ No newline at end of file