/* * Copyright 2010-2015 Institut Pasteur. * * This file is part of Icy. * * Icy 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 3 of the License, or * (at your option) any later version. * * Icy 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Icy. If not, see <http://www.gnu.org/licenses/>. */ package icy.gui.dialog; import icy.gui.util.ComponentUtil; import icy.main.Icy; import icy.resource.ResourceUtil; import java.awt.BorderLayout; import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JPanel; /** * @author Stephane */ public class ActionDialog extends JDialog implements ActionListener { /** * */ private static final long serialVersionUID = -8071873763517931268L; protected static final String OK_CMD = "ok"; protected static final String CANCEL_CMD = "cancel"; protected JPanel mainPanel; protected JPanel buttonPanel; JButton okBtn; JButton cancelBtn; private ActionListener okAction; private boolean closeAfterAction; boolean opened; boolean canceled; boolean closed; public ActionDialog(String title, JComponent component, Frame owner) { super(owner, title, true); // init GUI initialize(component); // set action okBtn.setActionCommand(OK_CMD); cancelBtn.setActionCommand(CANCEL_CMD); okBtn.addActionListener(this); cancelBtn.addActionListener(this); addWindowListener(new WindowAdapter() { @Override public void windowOpened(WindowEvent e) { opened = true; } @Override public void windowClosed(WindowEvent e) { closed = true; onClosed(); } }); okAction = null; closeAfterAction = true; opened = false; canceled = true; closed = false; } public ActionDialog(String title, JComponent component) { this(title, component, Icy.getMainInterface().getMainFrame()); } /** * @wbp.parser.constructor */ public ActionDialog(String title) { this(title, null, Icy.getMainInterface().getMainFrame()); } /** * @deprecated Use {@link #ActionDialog(String, JComponent, Frame)} instead */ @Deprecated public ActionDialog(Frame owner, String title) { this(title, null, owner); } private void initialize(JComponent component) { setIconImages(ResourceUtil.getIcyIconImages()); // so we always pass in the closed event setDefaultCloseOperation(DISPOSE_ON_CLOSE); // GUI if (component instanceof JPanel) mainPanel = (JPanel) component; else { mainPanel = new JPanel(); mainPanel.setLayout(new BorderLayout()); if (component != null) mainPanel.add(component, BorderLayout.CENTER); } buttonPanel = new JPanel(); buttonPanel.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8)); GridBagLayout gbl_buttonPanel = new GridBagLayout(); gbl_buttonPanel.columnWidths = new int[] {0, 0, 45, 65, 0, 0, 0}; gbl_buttonPanel.rowHeights = new int[] {23, 0}; gbl_buttonPanel.columnWeights = new double[] {0.0, 0.0, 1.0, 1.0, 0.0, 0.0, Double.MIN_VALUE}; gbl_buttonPanel.rowWeights = new double[] {0.0, Double.MIN_VALUE}; buttonPanel.setLayout(gbl_buttonPanel); okBtn = new JButton("Ok"); GridBagConstraints gbc_okBtn = new GridBagConstraints(); gbc_okBtn.anchor = GridBagConstraints.EAST; gbc_okBtn.insets = new Insets(0, 0, 0, 5); gbc_okBtn.gridx = 2; gbc_okBtn.gridy = 0; buttonPanel.add(okBtn, gbc_okBtn); cancelBtn = new JButton("Cancel"); GridBagConstraints gbc_cancelBtn = new GridBagConstraints(); gbc_cancelBtn.insets = new Insets(0, 0, 0, 5); gbc_cancelBtn.anchor = GridBagConstraints.WEST; gbc_cancelBtn.gridx = 3; gbc_cancelBtn.gridy = 0; buttonPanel.add(cancelBtn, gbc_cancelBtn); getContentPane().add(mainPanel, BorderLayout.CENTER); getContentPane().add(buttonPanel, BorderLayout.SOUTH); } /** * Easy "onclose" process */ protected void onClosed() { // } public boolean isClosed() { return closed; } public boolean isCanceled() { return opened && canceled; } /** * @return the closeAfterAction */ public boolean isCloseAfterAction() { return closeAfterAction; } /** * @param closeAfterAction * the closeAfterAction to set */ public void setCloseAfterAction(boolean closeAfterAction) { this.closeAfterAction = closeAfterAction; } /** * @return the okAction */ public ActionListener getOkAction() { return okAction; } /** * @param okAction * the okAction to set */ public void setOkAction(ActionListener okAction) { this.okAction = okAction; } /** * @return the mainPanel */ public JPanel getMainPanel() { return mainPanel; } /** * @return the buttonPanel */ public JPanel getButtonPanel() { return buttonPanel; } /** * @return the okBtn */ public JButton getOkBtn() { return okBtn; } /** * @return the cancelBtn */ public JButton getCancelBtn() { return cancelBtn; } @Override public void actionPerformed(ActionEvent e) { final String cmd = e.getActionCommand(); if (CANCEL_CMD.equals(cmd)) dispose(); else if (OK_CMD.equals(cmd)) { canceled = false; // do action here if (okAction != null) okAction.actionPerformed(e); // close if wanted if (closeAfterAction) dispose(); } } @Override public void reshape(int x, int y, int width, int height) { final Rectangle r = new Rectangle(x, y, width, height); // prevent to go completely off screen ComponentUtil.fixPosition(this, r); super.reshape(r.x, r.y, r.width, r.height); } }