/*
* JModalDialog.java
*
* Created on 06.11.2008 17:02:12
*
* Copyright (C) <reiner>
* This program 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 2 of the License, or
* (at your option) any later version.
*
* 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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
* @author reiner
*/
package shared.dialog;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Desktop.Action;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
/**
*
*/
public abstract class JModalDialog extends JDialog
{
private boolean m_bOk = false;
private JPanel m_okCancelPanel;
private JFrame m_frame;
private AbstractAction m_cancelAction;
private AbstractAction m_applyAction;
public JModalDialog(JFrame frame, String caption, String okStr, String cancelStr, String applyStr, int topSpace)
{
super(frame, caption, true);
doInit(frame, caption, okStr, cancelStr, applyStr, topSpace);
}
public JModalDialog(JFrame frame, String caption, String okStr, String cancelStr, int topSpace)
{
super(frame, caption, true);
doInit(frame, caption, okStr, cancelStr, null, topSpace);
}
public JModalDialog(JFrame frame, String caption, String okStr, String cancelStr, String applyStr)
{
super(frame, caption, true);
doInit(frame, caption, okStr, cancelStr, applyStr, 10);
}
public JModalDialog(JFrame frame, String caption, String okStr, String cancelStr)
{
super(frame, caption, true);
doInit(frame, caption, okStr, cancelStr, null, 10);
}
protected void doApply()
{}
protected void doInit(JFrame frame, String caption, String okStr, String cancelStr, String applyStr, int topSpace)
{
m_frame = frame;
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
m_okCancelPanel = new JPanel();
m_okCancelPanel.setLayout(new BoxLayout(m_okCancelPanel, BoxLayout.X_AXIS));
m_okCancelPanel.setBorder(BorderFactory.createEmptyBorder(topSpace, 0, 10, 10));
m_okCancelPanel.add(Box.createHorizontalGlue());
if (applyStr != null)
{
JButton apply = new JButton(applyStr);
m_applyAction = new AbstractAction()
{
public void actionPerformed(ActionEvent ev)
{
doApply();
}
};
apply.addActionListener(m_applyAction);
Dimension dim = apply.getPreferredSize();
apply.setPreferredSize(new Dimension(100, (int)dim.getHeight()));
m_okCancelPanel.add(apply);
m_okCancelPanel.add(Box.createRigidArea(new Dimension(5, 0)));
}
if (okStr != null && cancelStr != null)
{
JButton ok = new JButton(okStr);
ok.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ev)
{
if (doGetData())
{
m_bOk = true;
dispose();
}
}
});
getRootPane().setDefaultButton(ok);
Dimension dim = ok.getPreferredSize();
ok.setPreferredSize(new Dimension(100, (int)dim.getHeight()));
m_okCancelPanel.add(ok);
m_okCancelPanel.add(Box.createRigidArea(new Dimension(5, 0)));
JButton cancel = new JButton(cancelStr);
m_cancelAction = new AbstractAction()
{
public void actionPerformed(ActionEvent ev)
{
dispose();
}
};
cancel.addActionListener(m_cancelAction);
cancel.setPreferredSize(ok.getPreferredSize());
m_okCancelPanel.add(cancel);
InputMap inputMap = getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "ESCAPE");
getRootPane().getActionMap().put("ESCAPE", m_cancelAction);
}
else if (okStr != null)
{
JButton ok = new JButton(okStr);
ok.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ev)
{
if (doGetData())
{
m_bOk = true;
dispose();
}
}
});
getRootPane().setDefaultButton(ok);
Dimension dim = ok.getPreferredSize();
ok.setPreferredSize(new Dimension(100, (int)dim.getHeight()));
m_okCancelPanel.add(ok);
}
else if (cancelStr != null)
{
JButton cancel = new JButton(cancelStr);
m_cancelAction = new AbstractAction()
{
public void actionPerformed(ActionEvent ev)
{
dispose();
}
};
cancel.addActionListener(m_cancelAction);
Dimension dim = cancel.getPreferredSize();
cancel.setPreferredSize(new Dimension(100, (int)dim.getHeight()));
m_okCancelPanel.add(cancel);
InputMap inputMap = getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "ESCAPE");
getRootPane().getActionMap().put("ESCAPE", m_cancelAction);
}
contentPane.add(m_okCancelPanel, BorderLayout.SOUTH);
pack();
}
public void addCtrlPanel(JPanel panel)
{
Container contentPane = getContentPane();
contentPane.add(panel, BorderLayout.CENTER);
if (m_frame != null)
setLocationRelativeTo(m_frame);
pack();
}
public boolean doModal()
{
doInit();
setVisible(true);
return m_bOk;
}
/**
* @return true if data are valid, else false
*/
protected abstract boolean doGetData();
protected abstract void doInit();
}