/* * The MIT License * * Copyright 2014, 2015, 2016 Rui Martinho (rmartinho@gmail.com), António Braz (antoniocbraz@gmail.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package org.poreid.dialogs.pindialogs.modifypin; import java.awt.event.KeyEvent; import java.awt.event.WindowEvent; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.StandardCharsets; import java.text.MessageFormat; import java.util.Arrays; import java.util.Locale; import java.util.ResourceBundle; import javax.swing.JComponent; import javax.swing.KeyStroke; import org.poreid.config.POReIDConfig; import org.poreid.dialogs.DialogEventListener; import org.poreid.dialogs.pindialogs.ButtonAbstractAction; import org.poreid.dialogs.pindialogs.MyDocument; /** * * @author POReID */ public class ModifyPinDialog extends javax.swing.JDialog { private final String pinLabel; private final int pinMinLength; private final int pinMaxLength; private DialogEventListener<ByteBuffer> listener; private final ResourceBundle bundle; public ModifyPinDialog(String pinLabel, int pinMinLength, int pinMaxLength, Locale locale, DialogEventListener<ByteBuffer> listener) { super(); this.pinLabel = pinLabel; this.pinMinLength = pinMinLength; this.pinMaxLength = pinMaxLength; this.listener = listener; bundle = POReIDConfig.getBundle(ModifyPinDialog.class.getSimpleName(),locale); initComponents(); this.setTitle(MessageFormat.format(bundle.getString("dialog.title"),pinLabel)); this.getAccessibleContext().setAccessibleDescription(MessageFormat.format(bundle.getString("dialog.description"),pinLabel)); addWindowListener(new java.awt.event.WindowAdapter() { @Override public void windowClosing(WindowEvent e) { dispose(); ModifyPinDialog.this.listener.onDiagloclosed(); } @Override public void windowOpened(WindowEvent e) { currentPin.requestFocus(); } }); this.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "cancelar"); this.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "aceitar"); this.getRootPane().getActionMap().put("cancelar", new ButtonAbstractAction(cancelBtn)); this.getRootPane().getActionMap().put("aceitar", new ButtonAbstractAction(okBtn)); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { jPanel1 = new javax.swing.JPanel(); icon = new javax.swing.JLabel(); jPanel3 = new javax.swing.JPanel(); okBtn = new javax.swing.JButton(); cancelBtn = new javax.swing.JButton(); jPanel4 = new javax.swing.JPanel(); newPinLbl = new javax.swing.JLabel(); confirmNewPin = new javax.swing.JPasswordField(); confirmNewPin.setDocument(new MyDocument(pinMaxLength)); confirmNewPin.setToolTipText(MessageFormat.format(bundle.getString("confirm.pin.tooltip"),pinLabel)); confirmNewPin.getAccessibleContext().setAccessibleDescription(MessageFormat.format(bundle.getString("confirm.pin.description"), pinLabel)); confirmPinLbl = new javax.swing.JLabel(); newPin = new javax.swing.JPasswordField(); newPin.setDocument(new MyDocument(pinMaxLength)); newPin.setToolTipText(MessageFormat.format(bundle.getString("new.pin.tooltip"),pinLabel)); newPin.getAccessibleContext().setAccessibleDescription(MessageFormat.format(bundle.getString("new.pin.description"), pinLabel)); currentPinLbl = new javax.swing.JLabel(); currentPin = new javax.swing.JPasswordField(); currentPin.setDocument(new MyDocument(pinMaxLength)); currentPin.setToolTipText(MessageFormat.format(bundle.getString("current.pin.tooltip"),pinLabel)); currentPin.getAccessibleContext().setAccessibleDescription(MessageFormat.format(bundle.getString("current.pin.description"), pinLabel)); jPanel2 = new javax.swing.JPanel(); message = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setAlwaysOnTop(true); setModalityType(java.awt.Dialog.ModalityType.APPLICATION_MODAL); setResizable(false); jPanel1.setLayout(new javax.swing.BoxLayout(jPanel1, javax.swing.BoxLayout.LINE_AXIS)); icon.setIcon(new javax.swing.ImageIcon(getClass().getResource(POReIDConfig.IMAGE_WARNING_LOCATION))); icon.setMaximumSize(new java.awt.Dimension(64, 64)); icon.setMinimumSize(new java.awt.Dimension(64, 64)); icon.setPreferredSize(new java.awt.Dimension(64, 64)); jPanel1.add(icon); jPanel3.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 20, 0)); okBtn.setText(bundle.getString("ok.button")); okBtn.getAccessibleContext().setAccessibleDescription(MessageFormat.format(bundle.getString("ok.button.description"),pinLabel)); okBtn.setEnabled(false); okBtn.setMaximumSize(new java.awt.Dimension(114, 36)); okBtn.setMinimumSize(new java.awt.Dimension(114, 36)); okBtn.setPreferredSize(new java.awt.Dimension(114, 36)); okBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { okBtnActionPerformed(evt); } }); jPanel3.add(okBtn); cancelBtn.setText(bundle.getString("cancel.button")); cancelBtn.getAccessibleContext().setAccessibleDescription(MessageFormat.format(bundle.getString("cancel.button.description"),pinLabel)); cancelBtn.setMaximumSize(new java.awt.Dimension(114, 36)); cancelBtn.setMinimumSize(new java.awt.Dimension(114, 36)); cancelBtn.setPreferredSize(new java.awt.Dimension(114, 36)); cancelBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cancelBtnActionPerformed(evt); } }); jPanel3.add(cancelBtn); newPinLbl.setText(MessageFormat.format(bundle.getString("new.pin.label"), pinLabel)); newPinLbl.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT); confirmNewPin.setHorizontalAlignment(javax.swing.JTextField.CENTER); confirmNewPin.addCaretListener(new javax.swing.event.CaretListener() { public void caretUpdate(javax.swing.event.CaretEvent evt) { confirmNewPinCaretUpdate(evt); } }); confirmPinLbl.setText(MessageFormat.format(bundle.getString("confirm.pin.label"),pinLabel)); confirmPinLbl.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT); newPin.setHorizontalAlignment(javax.swing.JTextField.CENTER); newPin.addCaretListener(new javax.swing.event.CaretListener() { public void caretUpdate(javax.swing.event.CaretEvent evt) { newPinCaretUpdate(evt); } }); currentPinLbl.setText(MessageFormat.format(bundle.getString("current.pin.label"), pinLabel)); currentPinLbl.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT); currentPin.setHorizontalAlignment(javax.swing.JTextField.CENTER); currentPin.addCaretListener(new javax.swing.event.CaretListener() { public void caretUpdate(javax.swing.event.CaretEvent evt) { currentPinCaretUpdate(evt); } }); javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4); jPanel4.setLayout(jPanel4Layout); jPanel4Layout.setHorizontalGroup( jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel4Layout.createSequentialGroup() .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(newPinLbl, javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(confirmPinLbl, javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(currentPinLbl, javax.swing.GroupLayout.Alignment.TRAILING)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(currentPin, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(newPin, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(confirmNewPin, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); jPanel4Layout.setVerticalGroup( jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel4Layout.createSequentialGroup() .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(currentPinLbl) .addComponent(currentPin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(newPinLbl) .addComponent(newPin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(confirmPinLbl) .addComponent(confirmNewPin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) ); message.setFont(new java.awt.Font("Dialog", 0, 12)); // NOI18N message.setText(MessageFormat.format(bundle.getString("message"), pinLabel)); javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); jPanel2.setLayout(jPanel2Layout); jPanel2Layout.setHorizontalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addGap(0, 0, 0) .addComponent(message, javax.swing.GroupLayout.PREFERRED_SIZE, 400, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, 0)) ); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addGap(0, 0, 0) .addComponent(message) .addGap(0, 0, 0)) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, Short.MAX_VALUE)) .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 30, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, Short.MAX_VALUE))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) ); pack(); setLocationRelativeTo(null); }// </editor-fold>//GEN-END:initComponents private void cancelBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelBtnActionPerformed listener.onCancel(); this.dispose(); }//GEN-LAST:event_cancelBtnActionPerformed private void okBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okBtnActionPerformed listener.onContinue(StandardCharsets.UTF_8.encode(CharBuffer.wrap(currentPin.getPassword())), StandardCharsets.UTF_8.encode(CharBuffer.wrap(newPin.getPassword()))); this.dispose(); }//GEN-LAST:event_okBtnActionPerformed private void currentPinCaretUpdate(javax.swing.event.CaretEvent evt) {//GEN-FIRST:event_currentPinCaretUpdate if (currentPin.getPassword().length > pinMinLength - 1 && newPin.getPassword().length > pinMinLength - 1 && confirmNewPin.getPassword().length > pinMinLength - 1 && Arrays.equals(confirmNewPin.getPassword(), newPin.getPassword())){ okBtn.setEnabled(true); } else { okBtn.setEnabled(false); } }//GEN-LAST:event_currentPinCaretUpdate private void newPinCaretUpdate(javax.swing.event.CaretEvent evt) {//GEN-FIRST:event_newPinCaretUpdate if (currentPin.getPassword().length > pinMinLength - 1 && newPin.getPassword().length > pinMinLength - 1 && confirmNewPin.getPassword().length > pinMinLength - 1 && Arrays.equals(confirmNewPin.getPassword(), newPin.getPassword())){ okBtn.setEnabled(true); } else { okBtn.setEnabled(false); } }//GEN-LAST:event_newPinCaretUpdate private void confirmNewPinCaretUpdate(javax.swing.event.CaretEvent evt) {//GEN-FIRST:event_confirmNewPinCaretUpdate if (currentPin.getPassword().length > pinMinLength - 1 && newPin.getPassword().length > pinMinLength - 1 && confirmNewPin.getPassword().length > pinMinLength - 1 && Arrays.equals(confirmNewPin.getPassword(), newPin.getPassword())){ okBtn.setEnabled(true); } else { okBtn.setEnabled(false); } }//GEN-LAST:event_confirmNewPinCaretUpdate // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton cancelBtn; private javax.swing.JPasswordField confirmNewPin; private javax.swing.JLabel confirmPinLbl; private javax.swing.JPasswordField currentPin; private javax.swing.JLabel currentPinLbl; private javax.swing.JLabel icon; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JPanel jPanel4; private javax.swing.JLabel message; private javax.swing.JPasswordField newPin; private javax.swing.JLabel newPinLbl; private javax.swing.JButton okBtn; // End of variables declaration//GEN-END:variables }