/* Copyright (C) 2013 Tobias Baum <tbaum at tntinteractive.de> This file is a part of Portalsammler. Portalsammler is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Portalsammler is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Portalsammler. If not, see <http://www.gnu.org/licenses/>. */ package de.tntinteractive.portalsammler.gui; import java.awt.Color; import java.awt.Container; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.awt.print.PageFormat; import java.awt.print.Printable; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import com.google.zxing.BarcodeFormat; import com.google.zxing.WriterException; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; import com.jgoodies.forms.builder.PanelBuilder; import com.jgoodies.forms.factories.CC; import com.jgoodies.forms.layout.FormLayout; import de.tntinteractive.portalsammler.engine.UserInteraction; public final class GeneratedPasswordDialog extends JDialog { private static final long serialVersionUID = -1276429595586985556L; public GeneratedPasswordDialog(final UserInteraction gui, final String key) { this.setTitle("Neues Passwort generiert"); this.setModal(true); final JLabel text = new JLabel( "<html><body>" + "Es wurde ein neues Passwort generiert:<br/>" + "<br/>" + "<b><center>" + key.replace("<", "<") + "</center></b>" + "<br/>" + "Mit diesem Passwort sind alle gespeicherten Daten geschützt. Wenn es verloren<br/>" + " geht, ist kein Zugriff auf die gespeicherten Daten mehr möglich.</br>" + "<br/>" + "Der unten sichtbare QR-Code enthält das Passwort in codierter Form. Sie können ihn<br/>" + " ausdrucken und über eine Webcam o.ä. einlesen, damit sie sich das Passwort nicht<br/>" + " merken und wiederholt eintippen müssen. Stellen Sie aber sicher, dass der QR-Code<br/>" + " getrennt von Ihrem Computer gelagert wird, um einen gleichzeitigen Zugriff z.B. durch<br/>" + " Einbrecher auszuschließen.<br/>" + "</body></html>"); final Image qrImage = this.createQrImage(gui, key); final JLabel qrCode; if (qrImage != null) { qrCode = new JLabel(new ImageIcon(qrImage)); } else { qrCode = new JLabel("Erstellung des QR-Codes nicht möglich!!"); } final JButton printButton = new JButton("Passwort und QR-Code drucken"); printButton.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { GeneratedPasswordDialog.this.print(gui); } }); final JButton closeButton = new JButton("Schließen"); closeButton.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { GeneratedPasswordDialog.this.setVisible(false); } }); final PanelBuilder panelBuilder = new PanelBuilder(new FormLayout( "4dlu, fill:p:grow, 4dlu", "4dlu, p, 4dlu, p, 4dlu, p, 4dlu, p, 4dlu")); panelBuilder.add(text, CC.xy(2, 2)); panelBuilder.add(qrCode, CC.xy(2, 4)); panelBuilder.add(printButton, CC.xy(2, 6)); panelBuilder.add(closeButton, CC.xy(2, 8)); this.setContentPane(panelBuilder.getPanel()); this.setBackground(Color.WHITE); this.pack(); this.setLocationRelativeTo(this.getOwner()); } protected void print(final UserInteraction gui) { final PrinterJob job = PrinterJob.getPrinterJob(); job.setPrintable(new Printable() { @Override public int print(final Graphics graphics, final PageFormat page, final int pageIndex) throws PrinterException { if (pageIndex > 0) { return NO_SUCH_PAGE; } final Graphics2D g2d = (Graphics2D) graphics; final Container pane = GeneratedPasswordDialog.this.getContentPane(); g2d.translate( page.getImageableX() + (page.getImageableWidth() - pane.getWidth()) / 2, page.getImageableY() + (page.getImageableHeight() - pane.getHeight()) / 2); pane.paint(g2d); return PAGE_EXISTS; } }); if (job.printDialog()) { try { job.print(); } catch (final PrinterException e) { gui.showError(e); } } } private BufferedImage createQrImage(final UserInteraction gui, final String key) { try { final QRCodeWriter w = new QRCodeWriter(); final BitMatrix m = w.encode(key, BarcodeFormat.QR_CODE, 200, 200); return MatrixToImageWriter.toBufferedImage(m); } catch (final WriterException e) { gui.showError(e); return null; } } }