/* * This library is part of OpenCms - * the Open Source Content Management System * * Copyright (c) Alkacon Software GmbH (http://www.alkacon.com) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 GNU * Lesser General Public License for more details. * * For further information about Alkacon Software GmbH, please see the * company website: http://www.alkacon.com * * For further information about OpenCms, please see the * project website: http://www.opencms.org * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.opencms.applet.upload; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.HeadlessException; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JOptionPane; import javax.swing.JPanel; /** * Base class for dialogs with ok and cancel buttons, * support for modality and custom UI components. <p> * * This is a try for a better design approach to modal dialogs than offered in * the java development kit: <br> * The service of a modal dialog that offers cancel and ok is separated from the * retrieval of data of such a dialog. The component that queries the data from * this service is freely choosable. It may be passed to the contstructor and * will be returned from <code>{@link #showDialog()}</code>. The client code then is sure * that the modal dialog has been confirmed by the human interactor and may * query this component for input: it knows about the component that was used to * query inputs. * <p> * */ public class ModalDialog extends JDialog { // ******************************** // ***** Dialog Return Values ***** // ******************************** /** * Return value if approve (yes, ok) is chosen. */ public static final int APPROVE_OPTION = 0; /** * Return value if cancel is chosen. */ public static final int CANCEL_OPTION = 1; /** * Return value if an error occurred. */ public static final int ERROR_OPTION = -1; /** Generated <code>serialVersionUID</code>. */ private static final long serialVersionUID = 6915311633181971117L; /** The text of the cancel button. */ private String m_cancelText = "Cancel"; /** The ui controls and model to interact with. */ private JComponent m_controlPanel; /** The text of the ok button. */ private String m_okText = "OK"; /** One of the option constants. */ protected int m_returnValue; /** * Creates a modal dialog. * <p> * * @param component the parent <code>Component</code> for the dialog * @param title the String containing the dialog's title * @param okText the text for the OK button * @param cancelText the text for the Cancel button * @param controlComponent the UI component that is additionally shown and returned from {@link #showDialog()} */ public ModalDialog( final Component component, final String title, String okText, String cancelText, final JComponent controlComponent) { super(JOptionPane.getFrameForComponent(component), title, true); m_controlPanel = controlComponent; m_cancelText = cancelText; m_okText = okText; Container contentPane = getContentPane(); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); contentPane.add(m_controlPanel); // Window listeners: addWindowListener(new WindowAdapter() { public void windowClosing(final WindowEvent e) { Window w = e.getWindow(); w.setVisible(false); } }); addComponentListener(new ComponentAdapter() { public void componentHidden(final ComponentEvent e) { Window w = (Window)e.getComponent(); w.dispose(); } }); // Cancel / OK Buttons. JPanel okCancelPanel = new JPanel(); okCancelPanel.setLayout(new BoxLayout(okCancelPanel, BoxLayout.X_AXIS)); okCancelPanel.add(Box.createHorizontalGlue()); JButton ok = new JButton(m_okText); ok.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { m_returnValue = APPROVE_OPTION; setVisible(false); } }); okCancelPanel.add(ok); okCancelPanel.add(Box.createHorizontalGlue()); JButton cancel = new JButton(m_cancelText); cancel.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { m_returnValue = CANCEL_OPTION; setVisible(false); } }); okCancelPanel.add(cancel); okCancelPanel.add(Box.createHorizontalGlue()); // add ok / cancel to ui: contentPane.add(okCancelPanel); setSize(new Dimension(300, 200)); } /** * Returns the controlPanel.<p> * * @return the controlPanel */ public JComponent getControlPanel() { return m_controlPanel; } /** * Returns the returnValue.<p> * * @return the returnValue */ public int getReturnValue() { return m_returnValue; } /** * Shows a modal dialog and blocks until the dialog is hidden. * <p> * If the user presses the "OK" button, then this method hides/disposes the * dialog and returns the custom component that queries for user input. If the * user presses the "Cancel" button or closes the dialog without pressing * "OK", then this method hides/disposes the dialog and returns * <code>null</code>. * <p> * * * @return the custom component given to the constructor with it's new * settings or <code>null</code> if the user opted out. * * @exception HeadlessException if GraphicsEnvironment.isHeadless() returns true. * * @see java.awt.GraphicsEnvironment#isHeadless */ public JComponent showDialog() throws HeadlessException { // blocks until user brings dialog down... setVisible(true); return m_controlPanel; } }