All Downloads are FREE. Search and download functionalities are using the official Maven repository.

es.gob.jmulticard.ui.passwordcallback.gui.AccesibilityUtils Maven / Gradle / Ivy

The newest version!
/*
 * 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 .
 *
 * Deberia recibir una copia de la European Union Public License, si aplica, junto
 * con este programa. Si no, consultelo en .
 *
 * 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.
 */
/*
 * Este fichero forma parte del Cliente @firma.
 * El Cliente @firma es un applet de libre distribucion cuyo codigo fuente puede ser consultado
 * y descargado desde www.ctt.map.es.
 * Copyright 2009,2010 Ministerio de la Presidencia, Gobierno de Espana
 * Este fichero se distribuye bajo licencia GPL version 3 segun las
 * condiciones que figuran en el fichero 'licence' que se acompana.  Si se   distribuyera este
 * fichero individualmente, deben incluirse aqui las condiciones expresadas alli.
 */
package es.gob.jmulticard.ui.passwordcallback.gui;

import java.awt.Color;
import java.awt.Font;
import java.awt.IllegalComponentStateException;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.Locale;
import java.util.logging.Logger;

import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.JWindow;
import javax.swing.UIManager;
import javax.swing.border.TitledBorder;

/** Utilidades varias para la accesibilidad. */
final class AccesibilityUtils {

    /** Indica si el sistema operativo tiene activada una combinación
     * de colores de alto contraste. */
    private static final boolean HIGH_CONTRAST;

    static boolean isHighContrast() {
        return HIGH_CONTRAST;
    }

    static {
        final Object highContrast = Toolkit.getDefaultToolkit().getDesktopProperty("win.highContrast.on"); //$NON-NLS-1$
        if (highContrast instanceof Boolean) {
            HIGH_CONTRAST = ((Boolean) highContrast).booleanValue();
        }
        // En Linux usamos siempre una configuracion como si se usase combinacion de colores
        // de alto contraste
        else if (System.getProperty("os.name") != null && System.getProperty("os.name").contains("inux")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
            HIGH_CONTRAST = true;
        }
        else {
            HIGH_CONTRAST = false;
        }
    }

    private AccesibilityUtils() {
        // No permitimos la instanciacion
    }

    /** Configura el formato del remarcado del componente al ser seleccionado.
     * @param component Componente seleccionado. */
    static void remarcar(final JComponent component) {

        if (GeneralConfig.isRemarked()) {
            if (component instanceof JButton) {
                final JButton button = (JButton) component;
                button.addFocusListener(new FocusListener() {
                    @Override
                    public void focusLost(final FocusEvent e) {
                        if (button.getParent() instanceof JPanel) {
                            ((JPanel) button.getParent()).setBorder(BorderFactory.createEmptyBorder());
                        }
                    }

                    @Override
                    public void focusGained(final FocusEvent e) {
                        if (GeneralConfig.isHighContrast() || isHighContrast()) {
                            if (button.getParent() instanceof JPanel) {
                                ((JPanel) button.getParent()).setBorder(BorderFactory.createLineBorder(Color.WHITE, 2));
                            }
                        }
                        else if (button.getParent() instanceof JPanel) {
						    ((JPanel) button.getParent()).setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
						}
                    }
                });
            }
            if (component instanceof JTextField) {
                final JTextField textField = (JTextField) component;
                textField.addFocusListener(
            		new FocusListener() {
	                    @Override
	                    public void focusLost(final FocusEvent e) {
	                        textField.setBorder(BorderFactory.createLineBorder(Color.GRAY, 1));
	                    }

	                    @Override
	                    public void focusGained(final FocusEvent e) {
	                        if (GeneralConfig.isHighContrast() || isHighContrast()) {
	                            textField.setBorder(BorderFactory.createLineBorder(Color.WHITE, 2));
	                        }
	                        else {
	                            textField.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
	                        }
	                    }
	                }
        		);
            }
            if (component instanceof JComboBox) {
                final JComboBox comboBox = (JComboBox) component;
                comboBox.addFocusListener(
            		new FocusListener() {
	                    @Override
	                    public void focusLost(final FocusEvent e) {
	                        comboBox.setBorder(BorderFactory.createLineBorder(Color.GRAY, 1));
	                    }

	                    @Override
	                    public void focusGained(final FocusEvent e) {
	                        if (GeneralConfig.isHighContrast() || isHighContrast()) {
	                            comboBox.setBorder(BorderFactory.createLineBorder(Color.WHITE, 2));
	                        }
	                        else {
	                            comboBox.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
	                        }
	                    }
	                }
        		);
            }
            if (component instanceof JLabel) {
                final JLabel label = (JLabel) component;
                label.addFocusListener(
            		new FocusListener() {
	                    @Override
	                    public void focusLost(final FocusEvent e) {
	                        label.setBorder(BorderFactory.createEmptyBorder());
	                    }

	                    @Override
	                    public void focusGained(final FocusEvent e) {
	                        if (GeneralConfig.isHighContrast() || isHighContrast()) {
	                            label.setBorder(BorderFactory.createLineBorder(Color.WHITE, 2));
	                        }
	                        else {
	                            label.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
	                        }
	                    }
	                }
        		);
            }
            if (component instanceof JCheckBox) {
                final JCheckBox checkBox = (JCheckBox) component;
                checkBox.addFocusListener(
            		new FocusListener() {

	                    @Override
	                    public void focusLost(final FocusEvent e) {
	                        ((JPanel) checkBox.getParent()).setBorder(BorderFactory.createEmptyBorder());
	                    }

	                    @Override
	                    public void focusGained(final FocusEvent e) {
	                        if (GeneralConfig.isHighContrast() || isHighContrast()) {
	                            ((JPanel) checkBox.getParent()).setBorder(BorderFactory.createLineBorder(Color.WHITE, 2));
	                        }
	                        else {
	                            ((JPanel) checkBox.getParent()).setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
	                        }
	                    }
	                }
        		);
            }
        }
    }

    /** Configura el comportamiento de ciertos componentes en Alto Contraste
     * @param component Componente al que aplicar el alto contraste */
    static void setContrastColor(final JComponent component) {
        if (GeneralConfig.isHighContrast()) {
            if (
        		component instanceof JComboBox      ||
        		component instanceof JPasswordField ||
        		component instanceof JTextField
    		) {
                component.setBackground(Color.WHITE);
            }
            else if (component instanceof JCheckBox) {
                component.setForeground(Color.WHITE);
            }
            else {
				if (component instanceof JPanel && component.getBorder() instanceof TitledBorder) {
				    ((TitledBorder) component.getBorder()).setTitleColor(Color.WHITE);
				}
				component.setForeground(Color.WHITE);
				component.setBackground(Color.BLACK);
			}
        }
    }

    /** Aplica el estilo de tipo de letra en negrita.
     * @param component Componente al que aplicar el estilo de tipo de letra en negrita. */
    static void setFontBold(final JComponent component) {
        // Se comprueba si el componente es de tipo panel con borde
        if (component instanceof JPanel) {
            if (component.getBorder() instanceof TitledBorder) {
                final TitledBorder titledBorder = (TitledBorder) component.getBorder(); // Se obtiene el borde
                // Se comprueba que no sea nulo
                if (titledBorder != null) {
                    // Se comprueba si la configuracion pide que la fuente este en negrita
                    if (GeneralConfig.isFontBold()) {
                        // Se indica que la fuente es negrita
                        titledBorder.setTitleFont(new Font(component.getFont().getName(), Font.BOLD, component.getFont().getSize()));
                    }
                    else {
                        // Se indica que la fuente es texto plano
                        titledBorder.setTitleFont(new Font(component.getFont().getName(), Font.PLAIN, component.getFont().getSize()));
                    }
                }
            } // Comprobacion del tipo de borde
        } else // Se comprueba si la configuracion pide que la fuente este en negrita
		if (GeneralConfig.isFontBold()) {
	        // Se indica que la fuente es negrita
	        component.setFont(new Font(component.getFont().getName(), Font.BOLD, component.getFont().getSize()));
		}
		else {
	        // Se indica que la fuente es texto plano
	        component.setFont(new Font(component.getFont().getName(), Font.PLAIN, component.getFont().getSize()));
		}
    }

    /** Subraya el mnemónico correspondiente para texto HTML.
     * @param text Texto en el que hay que subrayar el caracter.
     * @param key Caracter a subrayar.
     * @return Cadena con el texto subrayado. */
    static String remarkMnemonic(final String text, final int key) {
        String newText = text;
        int pos = text.indexOf(key); // Se obtiene el indice del caracter
        if (pos == -1) { // Se busca en minuscula
            final char keyChar = (char) key;
            pos = text.indexOf(String.valueOf(keyChar).toLowerCase(Locale.getDefault()));
        }
        if (pos != -1) {
            // Se subraya
            newText = text.substring(0, pos) + "" + text.charAt(pos) + "" + text.substring(pos + 1); //$NON-NLS-1$ //$NON-NLS-2$
        }
        return newText;
    }

    /** Subraya el mnemónico correspondiente en un botón.
     * El carácter debería indicarse en minúsculas.
     * @param button Botón en el que subrayar el mnemónico.
     * @param key Caracter a subrayar. */
    static void remarkMnemonic(final AbstractButton button, final int key) {
        final String text = button.getText();
        final int pos = text.toLowerCase(Locale.getDefault()).indexOf(key); // Se obtiene el indice del caracter
        if (pos != -1) {
            // Se subraya
            button.setDisplayedMnemonicIndex(pos);
        }
    }

    /** Muestra u oculta un tooltip relacionado con un botón.
     * @param show true para mostrar el tooltip, false para ocultarlo.
     * @param tip JWindow que muestra el contenido del tooltip.
     * @param boton Botón al que se relaciona el tooltip.
     * @param tipText Etiqueta que muestra el contenido del tooltip. */
    static void showToolTip(final boolean show, final JWindow tip, final JButton boton, final JLabel tipText) {
        tipText.setText(boton.getToolTipText());
        tip.setBackground((Color) UIManager.get("ToolTip.background")); //$NON-NLS-1$
        tipText.setBackground((Color) UIManager.get("ToolTip.background")); //$NON-NLS-1$
        tipText.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.BLACK), BorderFactory.createEmptyBorder(0, 3, 0, 3)));
        tipText.setFont((Font) UIManager.get("ToolTip.font")); //$NON-NLS-1$
        tipText.setOpaque(true);
        tip.add(tipText);
        Point point = new Point();
        try {
            point = boton.getLocationOnScreen();
        }
        catch (final IllegalComponentStateException e) {
            Logger.getLogger("es.gob.jmulticard").warning("Error mostrando el tooltip: " + e); //$NON-NLS-1$ //$NON-NLS-2$
        }
        int factor = 0;
        if (boton.getSize().getHeight() > 34) {
            factor = (int) (boton.getSize().getHeight() * 0.5);
        }
        tip.setLocation((int) point.getX(), (int) point.getY() + 30 + factor);
        tip.pack();
        tip.setVisible(show);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy