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

es.gob.afirma.standalone.ui.pdf.SignPdfDialog Maven / Gradle / Ivy

There is a newer version: 1.8.2
Show newest version
/* Copyright (C) 2011 [Gobierno de Espana]
 * This file is part of "Cliente @Firma".
 * "Cliente @Firma" 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 2 of the License, or (at your option) any later version.
 *   - or The European Software License; either version 1.1 or (at your option) any later version.
 * You may contact the copyright holder at: [email protected]
 */

package es.gob.afirma.standalone.ui.pdf;

import java.awt.Dimension;
import java.awt.Frame;
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.util.List;
import java.util.Properties;
import java.util.logging.Logger;

import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import es.gob.afirma.core.ui.AOUIFactory;
import es.gob.afirma.standalone.AutoFirmaUtil;
import es.gob.afirma.standalone.ui.pdf.PdfLoader.PdfLoaderListener;
import es.gob.afirma.standalone.ui.pdf.SignPdfUiPanel.SignPdfUiPanelListener;

/** Diálogo para la obtención de los datos de firma PDF Visible.
 * @author Tomás García-Merás. */
public final class SignPdfDialog extends JDialog implements PdfLoaderListener, SignPdfUiPanelListener {

	private static final long serialVersionUID = -7987676963743094243L;

	private static final int PREFERRED_WIDTH = 500;
	private static final int PREFERRED_HEIGHT = 615;

	private static final Logger LOGGER = Logger.getLogger("es.gob.afirma"); //$NON-NLS-1$

	private final Frame parent;
	private final SignPdfDialogListener listener;

	private SignPdfUiPanel areaPanel;
	SignPdfDialogListener getListener() {
		return this.listener;
	}

	/** Construye un diálogo para la obtención de los datos de firma PDF Visible.
	 * @param parentFrame Marco padre para la modalidad.
	 * @param spdl Clase a la que notificar la obtencion de propiedades de la firma visible. */
	private SignPdfDialog(final Frame parentFrame, final SignPdfDialogListener spdl) {
		super(parentFrame);
		this.parent = parentFrame;
		this.listener = spdl;
		createUI();
	}

	private void createUI() {
		setTitle(SignPdfUiMessages.getString("SignPdfDialog.3")); //$NON-NLS-1$
		setIconImage(
			AutoFirmaUtil.getDefaultDialogsIcon()
		);
		getAccessibleContext().setAccessibleDescription(
			SignPdfUiMessages.getString("SignPdfDialog.2") //$NON-NLS-1$
		);
		setModalityType(ModalityType.TOOLKIT_MODAL);
		setLocationRelativeTo(this.parent);

		addWindowListener(new java.awt.event.WindowAdapter() {
		    @Override
		    public void windowClosing(final java.awt.event.WindowEvent windowEvent) {
		    	positionCancelled();
		    }
		});
	}

	/** Obtiene los parámetros adicionales de una firma visible PDF mediante
	 * un diálogo gráfico.
	 * @param isSign true si el PDF de entrada ya contiene firmas electrónicas previas,
	 *               false en caso contrario.
	 * @param pdf PDF al que aplicar la firma visible.
	 * @param parentFrame Marco padre para la modalidad.
	 * @param spdl Clase a la que notificar la obtencion de propiedades de la firma visible. */
	public static void getVisibleSignatureExtraParams(final boolean isSign,
													  final byte[] pdf,
			                                          final Frame parentFrame,
			                                          final SignPdfDialogListener spdl) {
		if (pdf == null || pdf.length < 3) {
			throw new IllegalArgumentException(
				"El PDF a aplicarle la firma visible no puede ser nulo ni vacio" //$NON-NLS-1$
			);
		}
		if (spdl == null) {
			throw new IllegalArgumentException(
				"La clase a la que notificar la obtencion de propiedades no puede ser nula" //$NON-NLS-1$
			);
		}

		final JDialog dialog = new SignPdfDialog(parentFrame, spdl);
		dialog.setPreferredSize(new Dimension(PREFERRED_WIDTH, PREFERRED_HEIGHT));
		final Point cp = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();
		dialog.setLocation(cp.x - PREFERRED_WIDTH/2, cp.y - PREFERRED_HEIGHT/2);
		dialog.setResizable(false);

		PdfLoader.loadPdf(
			isSign,
			pdf,
			(PdfLoaderListener) dialog
		);
	}

	@Override
	public void pdfLoaded(final boolean isSign, final List pages, final List pageSizes) {
		this.areaPanel = new SignPdfUiPanel(
			isSign,
			pages,
			pageSizes,
			this,
			SignPdfDialog.this
		);
		add(this.areaPanel);
		pack();
		setVisible(true);
	}

	void nextPanel(final Properties p, final BufferedImage im) {
		remove(this.areaPanel);
		final JPanel preview = new SignPdfUiPanelPreview(this, p, im);
		add(preview);
		pack();
	}

	@Override
	public void pdfLoadedFailed(final Throwable cause) {
		LOGGER.severe("Error creando la previsualizacion del PDF: " + cause); //$NON-NLS-1$
		if (cause instanceof OutOfMemoryError) {
			AOUIFactory.showErrorMessage(
				this.parent,
				SignPdfUiMessages.getString("SignPdfDialog.4"), //$NON-NLS-1$
				SignPdfUiMessages.getString("SignPdfDialog.1"), //$NON-NLS-1$
				JOptionPane.ERROR_MESSAGE
			);
		}
		else {
			AOUIFactory.showErrorMessage(
				this.parent,
				SignPdfUiMessages.getString("SignPdfDialog.0"), //$NON-NLS-1$
				SignPdfUiMessages.getString("SignPdfDialog.1"), //$NON-NLS-1$
				JOptionPane.ERROR_MESSAGE
			);
		}
		setVisible(false);
		this.listener.propertiesCreated(new Properties());
		dispose();
	}

	@Override
	public void positionSelected(final Properties extraParams) {
		setVisible(false);
		LOGGER.info("Propiedades establecidas mediante GUI: " + extraParams); //$NON-NLS-1$
		this.listener.propertiesCreated(extraParams);
		dispose();
	}

	@Override
	public void positionCancelled() {
		setVisible(false);
		this.listener.propertiesCreated(new Properties());
		dispose();
	}

	/** Define los requerimientos de las clases a las que se informa de que ya se cuenta
	 * con las propiedades de la firma visible PDF. */
	public static interface SignPdfDialogListener {

		/** Establece los parámetros adicionales de la firma visible PDF indicados por
		 * el usuario mediante el diálogo.
		 * @param extraParams Parámetros adicionales de la firma visible PDF, o un fichero
		 *                    de propiedades vacío si al usuario canceló la operación
		 *                    o hubo un error por el que no pudieron recogerse. */
		void propertiesCreated(final Properties extraParams);
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy