/* File: InternalModalDialog.java
 * Author: Jason Gookins
 * Description: This class is for instantiating dialogs inside an applet that mimick modality by
 *		capturing events at the GlassPane level.
 */

import java.awt.Dimension;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.JRootPane;

public abstract class InternalModalDialog extends JInternalFrame implements PropertyChangeListener
{
	/************************
	 ** Instance Variables **
	 ************************/

	private Belief belief;



	/**********************
	 ** Main Constructor **
	 **********************/

	public InternalModalDialog(String title, Belief belief, JOptionPane pane)
	{
		super(title, false, false, false, false);

		this.belief = belief;

		getContentPane().add(pane);

		pane.addPropertyChangeListener(this);

		putClientProperty("JInternalFrame.frameType", "optionDialog");

		Dimension size = getPreferredSize();
		Dimension rootSize = belief.getRootPane().getSize();

		setBounds((rootSize.width - size.width) / 2, (rootSize.height - size.height) / 2, size.width, size.height); 
		belief.getRootPane().validate();

		belief.getSecondEventPane().setVisible(true);
		setVisible(true);
		belief.getLayeredPane().add(this, new Integer(3));

		try
		{
			setSelected(true);
		}
		catch (PropertyVetoException ignored) { }
	}



	/****************************
	 ** Property Change Events **
	 ****************************/

	public void propertyChange(PropertyChangeEvent event)
	{
		if (isVisible() && (event.getPropertyName().equals(JOptionPane.VALUE_PROPERTY) ||
				    event.getPropertyName().equals(JOptionPane.INPUT_VALUE_PROPERTY)))
		{
			try
			{
				setClosed(true);
			}
			catch (PropertyVetoException ignored) { }

			InternalModalDialog.this.setVisible(false);
			belief.getSecondEventPane().setVisible(false);

			cleanUpAfterClosing();
		}
	}



	/**********************
	 ** Abstract Methods **
	 **********************/

	public abstract void cleanUpAfterClosing();
}