/*
* Controlador Java de la Secretaria de Estado de Administraciones Publicas
* para el DNI electronico.
*
* El Controlador Java para el DNI electronico es un proveedor de seguridad de JCA/JCE
* que permite el acceso y uso del DNI electronico en aplicaciones Java de terceros
* para la realizacion de procesos de autenticacion, firma electronica y validacion
* de firma. Para ello, se implementan las funcionalidades KeyStore y Signature para
* el acceso a los certificados y claves del DNI electronico, asi como la realizacion
* de operaciones criptograficas de firma con el DNI electronico. El Controlador ha
* sido disenado para su funcionamiento independiente del sistema operativo final.
*
* Copyright (C) 2012 Direccion General de Modernizacion Administrativa, Procedimientos
* e Impulso de la Administracion Electronica
*
* Este programa es software libre y utiliza un licenciamiento dual (LGPL 2.1+
* o EUPL 1.1+), lo cual significa que los usuarios podran elegir bajo cual de las
* licencias desean utilizar el codigo fuente. Su eleccion debera reflejarse
* en las aplicaciones que integren o distribuyan el Controlador, ya que determinara
* su compatibilidad con otros componentes.
*
* El Controlador puede ser redistribuido y/o modificado bajo los terminos de la
* Lesser GNU General Public License publicada por la Free Software Foundation,
* tanto en la version 2.1 de la Licencia, o en una version posterior.
*
* El Controlador puede ser redistribuido y/o modificado bajo los terminos de la
* European Union Public License publicada por la Comision Europea,
* tanto en la version 1.1 de la Licencia, o en una version posterior.
*
* Deberia recibir una copia de la GNU Lesser General Public License, si aplica, junto
* con este programa. Si no, consultelo en <http://www.gnu.org/licenses/>.
*
* Deberia recibir una copia de la European Union Public License, si aplica, junto
* con este programa. Si no, consultelo en <http://joinup.ec.europa.eu/software/page/eupl>.
*
* Este programa es distribuido con la esperanza de que sea util, pero
* SIN NINGUNA GARANTiA; incluso sin la garantia implicita de comercializacion
* o idoneidad para un proposito particular.
*/
package es.gob.jmulticard.ui.passwordcallback.gui;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JWindow;
import javax.swing.KeyStroke;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
import es.gob.jmulticard.ui.passwordcallback.CancelledOperationException;
import es.gob.jmulticard.ui.passwordcallback.Messages;
/** Componente dialogo que define los alerts de la aplicación.
* @author inteco */
public class CustomDialogDnie extends JAccessibilityCustomDialog implements ActionListener {
/** UID. */
private static final long serialVersionUID = 1L;
/** Etiqueta con la informaciñn de la alerta. */
private InfoLabel infoLabel = null;
/** Panel de botones. */
private JPanel buttonsPanel = null;
/** Panel de botones relacionados con la accesibilidad. */
private JPanel accessibilityButtonsPanel = null;
/** Panel principal. */
private JPanel mainPanel = null;
/** Campo de texto o campo de contraseña. */
private JSecurePasswordLabel component = null;
private static final int PIN_MIN_LENGTH = 4;
private static final int PIN_MAX_LENGTH = 16;
JSecurePasswordLabel getComponent() {
return this.component;
}
/** Etiqueta que contiene el icono de la alerta. */
protected final IconLabel iconLabel = new IconLabel();
/** Boton de OK. */
private static JButton okButton = null;
static JButton getOkButton() {
return okButton;
}
/** Boton de NO. */
private JButton noButton = null;
JButton getNoButton() {
return this.noButton;
}
/** Boton de Cancel. */
private static JButton cancelButton = null;
static JButton getCancelButton() {
return cancelButton;
}
/** Boton de restaurar. */
private JButton restoreButton = null;
JButton getRestoreButton() {
return this.restoreButton;
}
/** Boton de maximizar. */
private JButton maximizeButton = null;
JButton getMaximizeButton() {
return this.maximizeButton;
}
/** Respuesta al mensaje */
private int answer;
/** Texto para el botón */
private static String cancellText = Messages.getString("PrincipalGUI.cancelar"); //$NON-NLS-1$
/** Constructor.
* @param componentParent componente padre.
* @param modal <code>true</code> si se desea que el diálogo sea modal,
* <code>false</code> en caso contrario.
* @param message mensaje
* @param title Título
* @param isInputDialog indica sies una alerta de tipo input */
protected CustomDialogDnie(final JDialog componentParent,
final boolean modal,
final String message,
final String title,
final boolean isInputDialog) {
super(componentParent, modal, isInputDialog);
initComponents(message, title, isInputDialog);
setLocationRelativeTo(componentParent);
pack();
}
/** Constructor.
* @param componentParent componente padre.
* @param modal modal
* @param message mensaje
* @param title titulo
* @param isInputDialog indica sies una alerta de tipo input */
protected CustomDialogDnie(final Component componentParent,
final boolean modal,
final String message,
final String title,
final boolean isInputDialog) {
super(isInputDialog);
this.setModal(modal);
initComponents(message, title, isInputDialog);
setLocationRelativeTo(componentParent);
pack();
}
/** Constructor.
* @param componentParent Componente padre para la modalidad.
* @param modal modal
* @param message Mensaje del diálogo.
* @param title Título del diálogo.
* @param isInputDialog Indica si es un diálogo de entrada de datos. */
private CustomDialogDnie(final JFrame componentParent,
final boolean modal,
final String message,
final String title,
final boolean isInputDialog) {
super(componentParent, modal, isInputDialog);
initComponents(message, title, isInputDialog);
setLocationRelativeTo(componentParent);
pack();
}
/** Posición X inicial de la ventana dependiendo de la resolución de pantalla.
* @param width Ancho de la ventana.
* @return int Posición X */
private static int getInitialX(final int width) {
final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
return screenSize.width / 2 - width / 2;
}
/** Posición Y inicial de la ventana dependiendo del sistema operativo y de la
* resolución de pantalla.
* @param height Alto de la ventana.
* @return int Posición Y */
private static int getInitialY(final int height) {
final Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
return screenSize.height / 2 - height / 2;
}
/** Metodo que inicializa los componentes de la alerta.
* @param message mensaje que se mostrara en la alerta
* @param title Título de la alerta
* @param isInputDialog indica sies una alerta de tipo input */
protected void initComponents(
final String message,
final String title,
final boolean isInputDialog) {
// Se obtienen las dimensiones de maximizado
final int maxWidth = this.getMaxWidth();
final int maxHeight = this.getMaxHeight();
// Se establece el tamano minimo
setMinimumSize(new Dimension(this.getInitialWidth(), this.getInitialHeight()));
setPreferredSize(new Dimension(this.getInitialWidth(), this.getInitialHeight()));
// Se establece el tamano maximo
setMaximumSize(new Dimension(maxWidth, maxHeight));
// Dimensiones de la ventana en Windows y Linux
if (GeneralConfig.isMaximized()) {
// Se maximiza
this.setBounds(0, 0, maxWidth, maxHeight);
}
else {
// Se establece el tamano minimo en base a las opciones activas
if (GeneralConfig.isBigFontSize() || GeneralConfig.isFontBold()) {
setMinimumSize(new Dimension(Constants.CUSTOMDIALOG_FONT_INITIAL_WIDTH, Constants.CUSTOMDIALOG_FONT_INITIAL_HEIGHT));
}
}
this.setTitle(title);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
this.answer = JOptionPane.NO_OPTION;
// Contenedor del dialogo
final Container container = getContentPane();
// Layout del contenedor
container.setLayout(new GridBagLayout());
// Panel con los datos del dialogo
this.mainPanel = new JPanel(new GridBagLayout());
// Restricciones para el panel de datos
final GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.BOTH;
c.gridx = 0;
c.gridy = 0;
c.insets = new Insets(5, 10, 0, 10);
// Icono del dialogo
setIconLabel();
final JPanel iconPanel = new JPanel(new GridBagLayout());
final GridBagConstraints consIconPanel = new GridBagConstraints();
consIconPanel.fill = GridBagConstraints.BOTH;
iconPanel.add(this.iconLabel, consIconPanel);
c.insets = new Insets(10, 5, 0, 10); // right padding
c.gridx = 1;
c.weightx = 1.0;
c.weighty = 1.0;
// Etiqueta del dialogo
if (isInputDialog) {
// Se crea una etiqueta sencilla
this.infoLabel = new InfoLabel(message);
this.infoLabel.setHorizontalAlignment(SwingConstants.LEFT); // Se alinea a la izqda
this.infoLabel.setVerticalAlignment(SwingConstants.CENTER); // Se alinea al centro el texto
}
else {
// Se crea una etiqueta focusable
this.infoLabel = new InfoLabel(message, false);
this.infoLabel.setHorizontalAlignment(SwingConstants.CENTER); // Se centra el texto
// Foco a la etiqueta
this.infoLabel.addAncestorListener(new RequestFocusListener());
this.infoLabel.setVerticalAlignment(SwingConstants.CENTER); // Se alinea al centro el texto
}
// Se anade la etiqueta al panel de informacion general
this.mainPanel.add(this.infoLabel, c);
// Panel de botones
createMainButtonsPanel();
createAccessibilityButtonsPanel();
// Restricciones del contenedor general
final GridBagConstraints cons = new GridBagConstraints();
cons.fill = GridBagConstraints.BOTH;
//Se anade el panel de botones relacionados con la accesibilidad
cons.gridx = 0;
cons.gridy = 0;
cons.gridwidth = 2;
cons.gridheight = 1;
cons.weighty = 0.0;
cons.weightx = 0.10;
container.add(this.accessibilityButtonsPanel, cons);
//se anade el panel de informacion
cons.gridx = 2;
cons.gridy = 0;
cons.gridwidth = 6;
cons.gridheight = isInputDialog ? 2 : 3;
cons.weighty = isInputDialog ? 0.35 : 0.65;
cons.weightx = 0.90;
container.add(this.mainPanel, cons);
//Se anade el icono
cons.gridx = 0;
cons.gridy = 1;
cons.gridwidth = 2;
cons.gridheight = 3;
cons.weighty = 0.90;
cons.weightx = 0.0;
container.add(iconPanel, cons);
//Se anade el panel de botones
cons.gridx = 2;
cons.gridy = 3;
cons.gridwidth = 6;
cons.gridheight = 1;
cons.weighty = isInputDialog ? 0.65 : 0.35;
cons.weightx = 0.0;
container.add(this.buttonsPanel, cons);
pack();
}
/**
* Se asigna el icono a la etiqueta.
*/
protected void setIconLabel() {
// Segun el tipo de mensaje se selecciona el icono
ImageIcon icon = new ImageIcon(CustomDialogDnie.class.getResource("/images/dnie.png")); //$NON-NLS-1$
final Dimension dimensionInicial = new Dimension((int) 100f, (int)(100f / icon.getIconWidth() * icon.getIconHeight()));
this.iconLabel.setOriginalIcon(icon);
this.iconLabel.setOriginalDimension(dimensionInicial);
icon = new ImageIcon(icon.getImage().getScaledInstance(dimensionInicial.width, dimensionInicial.height, Image.SCALE_SMOOTH));
this.iconLabel.setIcon(icon);
}
/** Se crea el panel de botones de accesibilidad. */
private void createAccessibilityButtonsPanel() {
this.accessibilityButtonsPanel = new JPanel(new GridBagLayout());
// Para el tooltip
final JWindow tip = new JWindow();
final JLabel tipText = new JLabel();
// Panel que va a contener los botones de accesibilidad
final JPanel panel = new JPanel(new GridBagLayout());
// Restricciones para los botones
final GridBagConstraints consButtons = new GridBagConstraints();
consButtons.fill = GridBagConstraints.BOTH;
consButtons.gridx = 0;
consButtons.gridy = 0;
consButtons.weightx = 1.0;
consButtons.weighty = 1.0;
consButtons.insets = new Insets(0, 0, 0, 0); // right padding
// Restore button
final JPanel restorePanel = new JPanel();
final ImageIcon imageIconRestore = new ImageIcon(CustomDialogDnie.class.getResource("/images/restore.png")); //$NON-NLS-1$
this.restoreButton = new JButton(imageIconRestore);
this.restoreButton.setMnemonic(KeyEvent.VK_R);
this.restoreButton.setToolTipText(Messages.getString("Wizard.restaurar.description")); //$NON-NLS-1$
this.restoreButton.getAccessibleContext().setAccessibleName(this.restoreButton.getToolTipText());
this.restoreButton.addFocusListener(new FocusListener() {
/** Evento que se produce cuando el componente pierde el foco. */
@Override
public void focusLost(final FocusEvent e) {
Utils.showToolTip(false, tip, CustomDialogDnie.this.getRestoreButton(), tipText);
}
/** Evento que se produce cuando el componente tiene el foco. */
@Override
public void focusGained(final FocusEvent e) {
Utils.showToolTip(true, tip, CustomDialogDnie.this.getRestoreButton(), tipText);
}
});
final Dimension dimension = new Dimension(20, 20);
this.restoreButton.setPreferredSize(dimension);
this.restoreButton.addKeyListener(new KeyListener() {
@Override public void keyTyped(final KeyEvent arg0) { /* No necesario */ }
@Override public void keyReleased(final KeyEvent arg0) { /* No necesario */ }
@Override
public void keyPressed(final KeyEvent ke) {
if (10 == ke.getKeyCode()) {
getRestoreButton().doClick();
}
}
});
this.restoreButton.setName("restaurar"); //$NON-NLS-1$
restorePanel.add(this.restoreButton);
this.restoreButton.addActionListener(new ActionListener() {
/** Accion del boton. */
@Override
public void actionPerformed(final ActionEvent e) {
restaurarActionPerformed();
}
});
Utils.remarcar(this.restoreButton);
panel.add(restorePanel, consButtons);
consButtons.gridx = 1;
consButtons.insets = new Insets(0, 0, 0, 0); // right padding
// Maximize button
final JPanel maximizePanel = new JPanel();
final ImageIcon imageIconMaximize = new ImageIcon(CustomDialogDnie.class.getResource("/images/maximize.png")); //$NON-NLS-1$
this.maximizeButton = new JButton(imageIconMaximize);
this.maximizeButton.setMnemonic(KeyEvent.VK_M);
this.maximizeButton.setToolTipText(Messages.getString("Wizard.maximizar.description")); //$NON-NLS-1$
this.maximizeButton.getAccessibleContext().setAccessibleName(this.maximizeButton.getToolTipText());
this.maximizeButton.addKeyListener(new KeyListener() {
@Override public void keyTyped(final KeyEvent arg0) { /* No necesario */ }
@Override public void keyReleased(final KeyEvent arg0) { /* No necesario */ }
@Override
public void keyPressed(final KeyEvent ke) {
if (10 == ke.getKeyCode()) {
getMaximizeButton().doClick();
}
}
});
this.maximizeButton.setName("maximizar"); //$NON-NLS-1$
// Se asigna una dimension por defecto
this.maximizeButton.setPreferredSize(dimension);
Utils.remarcar(this.maximizeButton);
maximizePanel.add(this.maximizeButton);
this.maximizeButton.addFocusListener(new FocusListener() {
/** Evento que se produce cuando el componente pierde el foco. */
@Override
public void focusLost(final FocusEvent e) {
Utils.showToolTip(false, tip, CustomDialogDnie.this.getMaximizeButton(), tipText);
}
/** Evento que se produce cuando el componente tiene el foco. */
@Override
public void focusGained(final FocusEvent e) {
Utils.showToolTip(true, tip, CustomDialogDnie.this.getMaximizeButton(), tipText);
}
});
this.maximizeButton.addActionListener(new ActionListener() {
/** Accion del boton. */
@Override
public void actionPerformed(final ActionEvent e) {
maximizarActionPerformed();
}
});
panel.add(maximizePanel, consButtons);
// Se anade al panel general
// Restricciones para el panel de botones
final GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.NONE;
c.gridx = 0;
c.gridy = 0;
c.weightx = 1.0;
c.weighty = 1.0;
c.insets = new Insets(0, 0, 0, 0);
c.anchor = GridBagConstraints.SOUTH;
this.accessibilityButtonsPanel.add(panel, c);
// Habilitado/Deshabilitado de botones restaurar/maximizar
if (GeneralConfig.isMaximized()) {
// Se deshabilita el boton de maximizado
this.maximizeButton.setEnabled(false);
// Se habilita el boton de restaurar
this.restoreButton.setEnabled(true);
}
else {
// Se habilita el boton de maximizado
this.maximizeButton.setEnabled(true);
// Se deshabilita el boton de restaurar
this.restoreButton.setEnabled(false);
}
}
/** Panel que contiene los botones principales de las alerta. */
void createMainButtonsPanel() {
this.buttonsPanel = new JPanel(new GridBagLayout());
// Restricciones para el panel de botones
final GridBagConstraints consButtons = new GridBagConstraints();
consButtons.fill = GridBagConstraints.NONE;
consButtons.gridx = 0;
consButtons.gridy = 0;
consButtons.insets = new Insets(0, 10, 0, 10); // right padding
consButtons.anchor = GridBagConstraints.CENTER;
// OK button
final JPanel okPanel = new JPanel();
CustomDialogDnie.okButton = getButton(Messages.getString("PrincipalGUI.aceptar"), KeyEvent.VK_A); //$NON-NLS-1$
okButton.addKeyListener(new KeyListener() {
@Override public void keyTyped(final KeyEvent arg0) { /* No necesario */ }
@Override public void keyReleased(final KeyEvent arg0) { /* No necesario */ }
@Override
public void keyPressed(final KeyEvent ke) {
if (10 == ke.getKeyCode()) {
getOkButton().doClick();
}
}
});
okPanel.add(CustomDialogDnie.okButton);
this.buttonsPanel.add(okPanel, consButtons);
CustomDialogDnie.okButton.addActionListener(this);
}
/** Muestra un dialogo con un mensaje que pide la interacion del usuario.
* @param componentParent componente padre
* @param modal modal
* @param message mensaje a mostrar
* @param title titulo del dialogo
* @param typeOption opciones de interacion
* @return respuesta del usuario. */
public static int showConfirmDialog(final Component componentParent,
final boolean modal,
final String message,
final String title,
final int typeOption) {
final CustomDialogDnie customDialog = CustomDialogDnie.getInstanceCustomDialog(componentParent, modal, message, title, false);
CustomDialogDnie.okButton.setEnabled(true);
customDialog.getRootPane().setDefaultButton(null);
// Restricciones
final GridBagConstraints cons = new GridBagConstraints();
cons.fill = GridBagConstraints.HORIZONTAL;
cons.gridy = 0;
cons.insets = new Insets(0, 0, 0, 10); // right padding
// Se comprueba el tipo de dialogo
if (typeOption == JOptionPane.YES_NO_OPTION) {
// Boton Si
CustomDialogDnie.okButton.setText(Messages.getString("CustomDialog.confirmDialog.yes")); //$NON-NLS-1$
CustomDialogDnie.okButton.setMnemonic(KeyEvent.VK_S);
// Boton no
customDialog.noButton = customDialog.getButton(Messages.getString("CustomDialog.confirmDialog.no"), KeyEvent.VK_N); //$NON-NLS-1$
customDialog.noButton.addKeyListener(new KeyListener() {
@Override public void keyTyped(final KeyEvent arg0) { /* No necesario */ }
@Override public void keyReleased(final KeyEvent arg0) { /* No necesario */ }
@Override
public void keyPressed(final KeyEvent ke) {
if (10 == ke.getKeyCode()) {
customDialog.getNoButton().doClick();
}
}
});
final JPanel noPanel = new JPanel();
noPanel.add(customDialog.noButton);
customDialog.buttonsPanel.add(noPanel, cons);
customDialog.noButton.addActionListener(customDialog);
}
else {
throw new UnsupportedOperationException("Solo se soportan dialogos de tipo Si/No"); //$NON-NLS-1$
}
customDialog.infoLabel.setHorizontalAlignment(SwingConstants.CENTER); // Se centra el texto
customDialog.pack();
customDialog.setSize(customDialog.getInitialWidth() + 1, customDialog.getInitialHeight() + 1); // Hacemos un resize para forzar un repintado
customDialog.setVisible(true);
return customDialog.getAnswer();
}
/** Muestra un diálogo de solicitud de contraseña.
* @param componentParent Componente padre para la modalidad
* @param modal <code>true</code> si se desea que el diálogo sea modal,
* <code>false</code> en caso contrario.
* @param message Mensaje a mostrar.
* @param mnemonic Atajo de teclado.
* @param title Título del diálogo.
* @return Contraseña introducida por el usuario */
public static char[] showInputPasswordDialog(final Component componentParent,
final boolean modal,
final String message,
final int mnemonic,
final String title) {
final CustomDialogDnie customDialog = CustomDialogDnie.getInstanceCustomDialog(
componentParent,
modal,
message,
title,
true
);
CustomDialogDnie.okButton.setEnabled(false);
customDialog.getRootPane().setDefaultButton(null);
// Restricciones para el panel de datos
final GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.BOTH;
c.gridx = 1;
c.gridy = 1;
c.weightx = 0.0;
c.weighty = 0.5;
c.gridwidth = 2;
c.insets = new Insets(2, 5, 2, 10); // right padding
// campo de password del dialogo
customDialog.component = new JSecurePasswordLabel(16);
customDialog.component.addKeyListener(
new KeyListener() {
@Override
public void keyTyped(final KeyEvent arg0) { /* Vacio */}
@Override
public void keyReleased(final KeyEvent ke) {
final int length = customDialog.getComponent().getPasswordLength();
//Control de los botones aceptar/cancelar
if (length >= PIN_MIN_LENGTH && length <= PIN_MAX_LENGTH) {
getOkButton().setEnabled(true);
if (10 == ke.getKeyCode()) {
getOkButton().doClick();
}
}
else {
getOkButton().setEnabled(false);
}
}
@Override
public void keyPressed(final KeyEvent arg0) { /* Vacio */}
}
);
customDialog.component.addAncestorListener(new RequestFocusListener());
Utils.remarcar(customDialog.component);
Utils.setContrastColor(customDialog.component);
Utils.setFontBold(customDialog.component);
customDialog.component.getAccessibleContext()
.setAccessibleName(message.replaceAll(Constants.HTML_SALTO_LINEA, "") + " ALT + " + mnemonic + ". "); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
// Se anade el campo de texto al panel de informacion general
customDialog.mainPanel.add(customDialog.component, c);
// Etiqueta principal
// Se relaciona la etiqueta con el componente
customDialog.infoLabel.setLabelFor(customDialog.component);
// Se asigna un atajo
customDialog.infoLabel.setDisplayedMnemonic(mnemonic);
// Se muestra el atajo
final String text = Utils.remarkMnemonic(customDialog.infoLabel.getText(), mnemonic);
customDialog.infoLabel.setText(text);
// Restricciones para el check
c.insets = new Insets(0, 0, 0, 10); // right padding
c.gridy = 2;
// Se anade el check al panel de informacion general
//customDialog.mainPanel.add(panelCheckShowPass, c);
// Restricciones del panel de botones
final GridBagConstraints cons = new GridBagConstraints();
cons.insets = new Insets(0, 0, 0, 10); // right padding
// Cancel button
cancelButton = customDialog.getButton(cancellText, KeyEvent.VK_C);
final JPanel cancelPanel = new JPanel();
cancelPanel.add(cancelButton);
customDialog.buttonsPanel.add(cancelPanel, cons);
cancelButton.addActionListener(customDialog);
cancelButton.addKeyListener(new KeyListener() {
@Override public void keyTyped(final KeyEvent arg0) { /* No necesario */ }
@Override public void keyReleased(final KeyEvent arg0) { /* No necesario */ }
@Override
public void keyPressed(final KeyEvent ke) {
if (10 == ke.getKeyCode()) {
getCancelButton().doClick();
}
}
});
customDialog.infoLabel.setHorizontalAlignment(SwingConstants.LEFT); // Se centra el texto
customDialog.component.setVisible(true); // Se hace visible el campo de texto
cancelButton.addActionListener(customDialog);
customDialog.pack();
customDialog.setSize(customDialog.getInitialWidth() + 1, customDialog.getInitialHeight() + 1); // Hacemos un resize para forzar un repintado
customDialog.setVisible(true);
// Control para saber si se ha pulsado el boton cancelar
if (customDialog.getAnswer() == JOptionPane.YES_OPTION) {
final char[] finalPin = customDialog.getComponent().getPassword();
// Por precaucion borramos el PIN y dejamos sus componentes relacionados
// listos para ser descartados
customDialog.getComponent().setText(""); //$NON-NLS-1$
customDialog.getComponent().setText(null);
//customDialog.getComponent().setDocument(new PlainDocument());
customDialog.component = null;
customDialog.dispose();
System.runFinalization();
System.gc();
return finalPin;
}
throw new CancelledOperationException("La insercion de contrasena ha sido cancelada por el usuario"); //$NON-NLS-1$
}
/** Metodo que crea un boton.
* Si el boton corresponde al de cancelar, se le asigna la tecla esc.
* @param text texto del boton
* @param mnemonic atajo
* @return boton */
private JButton getButton(final String text, final int mnemonic) {
final JButton button = new JButton(text);
button.setMnemonic(mnemonic);
Utils.remarcar(button);
Utils.setContrastColor(button);
Utils.setFontBold(button);
// Se comprueba si el boton es el de cancelar
if (text.equalsIgnoreCase(cancellText)) {
// Se asigna la tecla escape a dicho boton
final String cancelKey = "cancel"; //$NON-NLS-1$
this.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), cancelKey);
this.getRootPane().getActionMap().put(cancelKey, new ButtonAbstractAction());
}
return button;
}
@Override
public int getMinimumRelation() {
return 7;
}
/** @return the answer */
private int getAnswer() {
return this.answer;
}
/** Cambia el tamaño de la ventana al tamaño máximo de pantalla menos el tamaño de la barra de tareas de windows */
void maximizarActionPerformed() {
setActualPositionX(this.getX());
setActualPositionY(this.getY());
setActualWidth(this.getWidth());
setActualHeight(this.getHeight());
// Se obtienen las dimensiones de maximizado
final int maxWidth = this.getMaxWidth();
final int maxHeight = this.getMaxHeight();
// Se hace el resize
this.setBounds(getInitialX(maxWidth), getInitialY(maxHeight), maxWidth, maxHeight);
// Habilitado/Deshabilitado de botones restaurar/maximizar
this.maximizeButton.setEnabled(false);
this.restoreButton.setEnabled(true);
}
/** Restaura el tamaño de la ventana a la posicion anterior al maximizado */
void restaurarActionPerformed() {
// Dimensiones de restaurado
int minWidth = this.getInitialWidth();
int minHeight = this.getInitialHeight();
// Se comprueba las opciones de accesibilidad activas
if (GeneralConfig.isBigFontSize() || GeneralConfig.isFontBold() || isBigSizeDefault()) {
minWidth = Constants.CUSTOMDIALOG_FONT_INITIAL_WIDTH;
minHeight = Constants.CUSTOMDIALOG_FONT_INITIAL_HEIGHT;
}
// Se establece el tamano minimo
setMinimumSize(new Dimension(minWidth, minHeight));
// Se situa el dialogo
if (getActualPositionX() != -1 && getActualPositionY() != -1 && getActualWidth() != -1 && getActualHeight() != -1) {
this.setBounds(getActualPositionX(), getActualPositionY(), getActualWidth(), getActualHeight());
}
else {
setBounds(getInitialX(minWidth), getInitialY(minHeight), minWidth, minHeight);
}
// Habilitado/Deshabilitado de botones restaurar/maximizar
this.maximizeButton.setEnabled(true);
this.restoreButton.setEnabled(false);
}
/** Metodo que devuelve una instancia de CustomDialog.
* @param componentParent Componente padre
* @param modal modal
* @param message mensaje
* @param title titulo del dialogo
* @param isInputDialog indica sies una alerta de tipo input
* @return instancia de CustomDialog. */
static CustomDialogDnie getInstanceCustomDialog(final Component componentParent,
final boolean modal,
final String message,
final String title,
final boolean isInputDialog) {
CustomDialogDnie customDialog = null;
// Se chequea cual sera el componente padre.
if (componentParent instanceof JDialog) {
customDialog = new CustomDialogDnie((JDialog) componentParent, modal, message, title, isInputDialog);
}
else if (componentParent instanceof JFrame) {
customDialog = new CustomDialogDnie((JFrame) componentParent, modal, message, title, isInputDialog);
}
else {
customDialog = new CustomDialogDnie(componentParent, modal, message, title, isInputDialog);
}
return customDialog;
}
/** Accion correspondiente a los botones de las alertas. */
@Override
public void actionPerformed(final ActionEvent e) {
if (e.getSource().equals(CustomDialogDnie.okButton)) {
this.answer = JOptionPane.YES_OPTION;
}
else if (e.getSource().equals(this.noButton)) {
this.answer = JOptionPane.NO_OPTION;
}
else {
this.answer = JOptionPane.CANCEL_OPTION;
}
setVisible(false);
}
private static final class ButtonAbstractAction extends AbstractAction {
/** UID. */
private static final long serialVersionUID = 1L;
ButtonAbstractAction() {
super();
}
/** Indica que la accion es la de pulsar el boton cancelar. */
@Override
public void actionPerformed(final ActionEvent event) {
CustomDialogDnie.getCancelButton().doClick();
}
}
}