package android.app;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.ContainerAdapter;
import java.awt.event.ContainerEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import com.applang.SwingUtil.Behavior;
import static com.applang.Util.*;
import static com.applang.SwingUtil.*;
public abstract class Dialog extends JDialog
{
protected static final String TAG = Dialog.class.getSimpleName();
public Dialog(Frame owner, int behavior) {
super(owner, Behavior.hasFlags(behavior, Behavior.MODAL));
setAlwaysOnTop(Behavior.hasFlags(behavior, Behavior.ALWAYS_ON_TOP));
mBehavior = behavior;
_init();
}
protected int mBehavior;
public Dialog open(Object...params) {
Object param0 = param(null, 0, params);
if (param0 instanceof Dimension)
setSize((Dimension)param0);
else if (param0 instanceof Double) {
scaleSize(this, arraycast(params, new Double[0]));
}
if (Behavior.hasFlags(mBehavior, Behavior.TIMEOUT))
deadline = Deadline.start(this);
setVisible(true);
toFront();
return this;
}
private Deadline deadline = null;
public void dismiss() {
setVisible(false);
}
public Object result = null;
public int getResult() {
return (Integer)result;
}
public abstract void ok();
public abstract void cancel();
private void _init()
{
((Container)getLayeredPane()).addContainerListener(new ContainerHandler());
getContentPane().addContainerListener(new ContainerHandler());
keyHandler = new KeyHandler();
addKeyListener(keyHandler);
addWindowListener(new WindowHandler());
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
enterEnabled = true;
}
public boolean getEnterEnabled()
{
return enterEnabled;
}
public void setEnterEnabled(boolean enterEnabled)
{
this.enterEnabled = enterEnabled;
}
protected boolean enterEnabled;
protected KeyHandler keyHandler;
class ContainerHandler extends ContainerAdapter
{
public void componentAdded(ContainerEvent evt)
{
componentAdded(evt.getChild());
}
public void componentRemoved(ContainerEvent evt)
{
componentRemoved(evt.getChild());
}
private void componentAdded(Component comp)
{
comp.addKeyListener(keyHandler);
if(comp instanceof Container)
{
Container cont = (Container)comp;
cont.addContainerListener(this);
Component[] comps = cont.getComponents();
for(int i = 0; i < comps.length; i++)
{
componentAdded(comps[i]);
}
}
}
private void componentRemoved(Component comp)
{
comp.removeKeyListener(keyHandler);
if(comp instanceof Container)
{
Container cont = (Container)comp;
cont.removeContainerListener(this);
Component[] comps = cont.getComponents();
for(int i = 0; i < comps.length; i++)
{
componentRemoved(comps[i]);
}
}
}
}
class KeyHandler extends KeyAdapter
{
public void keyPressed(KeyEvent evt)
{
if(evt.isConsumed()) return;
Component comp = getFocusOwner();
if(evt.getKeyCode() == KeyEvent.VK_ENTER && enterEnabled)
{
if (deadline != null) {
deadline.cancel();
deadline = null;
}
while(comp != null)
{
if(comp instanceof JComboBox)
{
@SuppressWarnings("rawtypes")
JComboBox combo = (JComboBox)comp;
if(combo.isEditable())
{
Object selected = combo.getEditor().getItem();
if(selected != null)
combo.setSelectedItem(selected);
}
if(combo.isPopupVisible())
{
evt.consume();
combo.setPopupVisible(false);
}
return;
}
// TODO: add other classes that need custom key handling here.
comp = comp.getParent();
}
evt.consume();
ok();
}
else if(evt.getKeyCode() == KeyEvent.VK_ESCAPE)
{
evt.consume();
if(comp instanceof JComboBox)
{
@SuppressWarnings("rawtypes")
JComboBox combo = (JComboBox)comp;
if (combo.isPopupVisible())
{
combo.setPopupVisible(false);
}
else cancel();
}
else cancel();
}
}
}
class WindowHandler extends WindowAdapter
{
public void windowClosing(WindowEvent evt)
{
cancel();
if (Behavior.hasFlags(mBehavior, Behavior.EXIT_ON_CLOSE))
System.exit(0);
}
}
}