package edu.harvard.wcfia.yoshikoder.ui.dialog; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import edu.harvard.wcfia.yoshikoder.Yoshikoder; import edu.harvard.wcfia.yoshikoder.ui.CommitException; import edu.harvard.wcfia.yoshikoder.ui.CommitableJPanel; import edu.harvard.wcfia.yoshikoder.util.DialogUtil; import edu.harvard.wcfia.yoshikoder.util.FileUtil; import edu.harvard.wcfia.yoshikoder.util.Messages; /** * @author will */ public abstract class AbstractOkCancelDialog extends JDialog { protected JFrame parentFrame; protected CommitableJPanel panel; protected Icon icon; protected PropertyChangeListener listener = new PropertyChangeListener(){ public void propertyChange(PropertyChangeEvent evt) { if (evt.getPropertyName().equals("commit")){ try { handleOk(); } catch (CommitException ce){ handleError(ce); } } } }; protected JButton okButton; protected JButton cancelButton; public AbstractOkCancelDialog(Yoshikoder parent, CommitableJPanel p){ this(parent, p, null); } public AbstractOkCancelDialog(Yoshikoder parent, CommitableJPanel cpanel, String iconName){ super(parent, true); parentFrame = parent; panel = cpanel; panel.addPropertyChangeListener(listener); // listens for commits JPanel all = new JPanel(new BorderLayout()); JPanel buttons = createButtonPanel(); all.add(buttons, BorderLayout.SOUTH); panel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); //panel.setBorder(BorderFactory.createLineBorder(Color.blue)); all.add(panel, BorderLayout.CENTER); if (iconName != null){ icon = DialogUtil.getDialogIcon(iconName); JLabel iconSide = new JLabel(icon); iconSide.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 10)); all.add(iconSide, BorderLayout.WEST); } getContentPane().add(all); pack(); setLocationRelativeTo(parent); } protected JPanel createButtonPanel() { JPanel buttonPanel = new JPanel(new BorderLayout()); Box bbox = Box.createHorizontalBox(); cancelButton = new JButton(Messages.getString("cancel")); //$NON-NLS-1$ cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { dispose(); } }); okButton = new JButton(Messages.getString("ok")); //$NON-NLS-1$ okButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { try { handleOk(); } catch (CommitException e) { handleError(e); } } }); // balance button widths int width = Math.max(okButton.getPreferredSize().width, cancelButton.getPreferredSize().width); okButton.setPreferredSize(new Dimension(width, okButton.getPreferredSize().height)); cancelButton.setPreferredSize(new Dimension(width, cancelButton.getPreferredSize().height)); setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); addWindowListener( new WindowAdapter(){ public void windowClosing(WindowEvent we){ dispose(); } }); if (FileUtil.isMac()){ bbox.add(Box.createHorizontalGlue()); bbox.add(cancelButton); bbox.add(Box.createHorizontalStrut(5)); bbox.add(okButton); bbox.add(Box.createHorizontalGlue()); bbox.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); } else { bbox.add(Box.createHorizontalGlue()); bbox.add(okButton); bbox.add(Box.createHorizontalStrut(5)); bbox.add(cancelButton); bbox.add(Box.createHorizontalGlue()); bbox.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); } buttonPanel.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, Color.GRAY)); buttonPanel.add(bbox, BorderLayout.EAST); return buttonPanel; } protected void handleOk() throws CommitException { panel.commit(); dispose(); } protected void handleError(CommitException e) { System.err.println("commit exception message: " + e.getMessage()); DialogUtil.yelp(this, e.getMessage(), e); } }