/* * * Paros and its related class files. * * Paros is an HTTP/HTTPS proxy for assessing web application security. * Copyright (C) 2003-2004 Chinotec Technologies Company * * This program is free software; you can redistribute it and/or * modify it under the terms of the Clarified Artistic License * as published by the Free Software Foundation. * * This program 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 * Clarified Artistic License for more details. * * You should have received a copy of the Clarified Artistic License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // ZAP: 2012/04/23 Added @Override annotation to the appropriate method. // ZAP: 2013/05/02 Re-arranged all modifiers into Java coding standard order // ZAP: 2014/01/22 Issue 996: Ensure all dialogs close when the escape key is pressed // ZAP: 2014/10/31 Issue 1176: Changed owner to Window as part of spider advanced dialog changes // ZAP: 2014/11/06 Set ZAP icons // ZAP: 2015/02/10 Issue 1528: Support user defined font size // ZAP: 2015/09/07 Move icon loading to a utility class package org.parosproxy.paros.extension; import java.awt.Dialog; import java.awt.Dimension; import java.awt.Frame; import java.awt.HeadlessException; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.WindowEvent; import javax.swing.AbstractAction; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.KeyStroke; import org.parosproxy.paros.Constant; import org.parosproxy.paros.model.Model; import org.parosproxy.paros.view.View; import org.zaproxy.zap.utils.DisplayUtils; /** * Abstract base class for all dialog box. */ public abstract class AbstractDialog extends JDialog { private static final long serialVersionUID = -3951504408180103696L; protected AbstractDialog thisDialog = null; /** * Constructs an {@code AbstractDialog} with no owner and not modal. * * @throws HeadlessException when {@code GraphicsEnvironment.isHeadless()} returns {@code true} */ public AbstractDialog() throws HeadlessException { super(); initialize(); } /** * Constructs an {@code AbstractDialog} with the given owner and whether or not it's modal. * * @param owner the {@code Frame} from which the dialog is displayed * @param modal {@code true} if the dialogue should be modal, {@code false} otherwise * @throws HeadlessException when {@code GraphicsEnvironment.isHeadless()} returns {@code true} */ public AbstractDialog(Frame owner, boolean modal) { super(owner, modal); initialize(); } /** * Constructs an {@code AbstractDialog} with the given owner and whether or not it's modal. * * @param owner the {@code Window} from which the dialog is displayed or {@code null} if this dialog has no owner * @param modal {@code true} if the dialogue should be modal, {@code false} otherwise * @throws HeadlessException when {@code GraphicsEnvironment.isHeadless()} returns {@code true} */ public AbstractDialog(Window owner, boolean modal) { super(owner, Dialog.ModalityType.APPLICATION_MODAL); this.setModal(modal); initialize(); } /** * This method initializes this */ private void initialize() { this.setVisible(false); this.setIconImages(DisplayUtils.getZapIconImages()); this.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); if (Model.getSingleton().getOptionsParam().getViewParam().getWmUiHandlingOption() == 0) { this.setSize(300,200); } this.setTitle(Constant.PROGRAM_NAME); // Handle escape key to close the dialog KeyStroke escape = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false); AbstractAction escapeAction = new AbstractAction() { private static final long serialVersionUID = 3516424501887406165L; @Override public void actionPerformed(ActionEvent e) { dispatchEvent(new WindowEvent(AbstractDialog.this, WindowEvent.WINDOW_CLOSING)); } }; getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(escape, "ESCAPE"); getRootPane().getActionMap().put("ESCAPE",escapeAction); } /** * Centres this dialog on the main fame. * This is needed, because when using multiple monitors. * Additionally, it will shrink the size of the dialog to fit the screen. */ public void centreDialog() { Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = this.getSize(); // shrink dialog to fit screen if necessary frameSize.height = Math.min(frameSize.height,screenSize.height); frameSize.width = Math.min(frameSize.width, screenSize.width); // centres the dialog on main frame final Rectangle mainrect = View.getSingleton().getMainFrame().getBounds(); int x = mainrect.x + (mainrect.width - frameSize.width) / 2; int y = mainrect.y + (mainrect.height - frameSize.height) / 2; // finally set the new location this.setLocation(x, y); } @Override public void setVisible(boolean show) { if (show) { if (Model.getSingleton().getOptionsParam().getViewParam().getWmUiHandlingOption() == 0) { centreDialog(); } } super.setVisible(show); } }