package com.vividsolutions.jump.workbench.ui; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dialog; import java.awt.Frame; import java.awt.HeadlessException; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JDialog; import javax.swing.JOptionPane; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; /** * Hosts a custom component in a dialog with OK and Cancel buttons. Also * validates the input if OK is pressed. */ public class OKCancelDialog extends JDialog { /** * * @param owner * @param title * @param modal * @param customComponent * @param validator the {@link Validator} to use, or <code>null</code> if none required * @throws HeadlessException */ public OKCancelDialog(Dialog owner, String title, boolean modal, Component customComponent, Validator validator) throws HeadlessException { super(owner, title, modal); initialize(customComponent, validator); } public OKCancelDialog(Frame owner, String title, boolean modal, Component customComponent, Validator validator) throws HeadlessException { super(owner, title, modal); initialize(customComponent, validator); } private OKCancelPanel okCancelPanel = new OKCancelPanel(); private Component customComponent; private void initialize(final Component customComponent, final Validator validator) { getRootPane().setDefaultButton(okCancelPanel.getButton("OK")); this.customComponent = customComponent; getContentPane().setLayout(new BorderLayout()); getContentPane().add(customComponent, BorderLayout.CENTER); okCancelPanel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (okCancelPanel.wasOKPressed() && validator != null) { String errorMessage = validator .validateInput(customComponent); if (errorMessage != null) { JOptionPane.showMessageDialog(OKCancelDialog.this, errorMessage, getTitle(), JOptionPane.ERROR_MESSAGE); return; } } setVisible(false); } }); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { okCancelPanel.setOKPressed(false); } } ); getContentPane().add(okCancelPanel, BorderLayout.SOUTH); pack(); // Don't centre dialog until its size has been determined // i.e. after calling #pack [Jon Aquino 2005-03-09] GUIUtil.centreOnWindow(this); } public static interface Validator { /** * @return an error message, or null if the input is valid */ public String validateInput(Component component); } public boolean wasOKPressed() { return okCancelPanel.wasOKPressed(); } public Component getCustomComponent() { return customComponent; } }