package org.seqcode.viz.eye;
import javax.swing.*;
import org.seqcode.gseutils.models.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.*;
import java.lang.reflect.*;
public class ModelPrefs<T extends Model> extends JFrame {
private PrefsPanel<T> panel;
private JButton ok, cancel;
private LinkedList<ModelListener<T>> listeners;
public ModelPrefs(T mdl) {
super("Model");
Container c = (Container)getContentPane();
c.setLayout(new BorderLayout());
listeners = new LinkedList<ModelListener<T>>();
panel = new PrefsPanel<T>(mdl);
c.add(panel, BorderLayout.CENTER);
panel.setPreferredSize(new Dimension(450, panel.numFields() * 50));
JPanel buttons = new JPanel();
buttons.setLayout(new FlowLayout());
buttons.add(ok = new JButton(createOkAction()));
buttons.add(cancel = new JButton(createCancelAction()));
c.add(buttons, BorderLayout.SOUTH);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
public void addModelListener(ModelListener<T> lst) {
listeners.add(lst);
}
public void removeModelListener(ModelListener<T> lst) {
listeners.remove(lst);
}
public Action createOkAction() {
return new AbstractAction("Ok") {
public void actionPerformed(ActionEvent e) {
ok();
}
};
}
public Action createCancelAction() {
return new AbstractAction("Cancel") {
public void actionPerformed(ActionEvent e) {
cancel();
}
};
}
public void ok() {
panel.saveToModel();
T value = panel.getModelValue();
dispose();
for(ModelListener<T> lst : listeners) {
lst.modelChanged(value);
}
wakeWaiters();
}
private synchronized void wakeWaiters() {
notifyAll();
}
public synchronized T displayAndWait() {
display();
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
return panel.getModelValue();
}
public void cancel() {
dispose();
wakeWaiters();
}
public void display() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
setLocation(100, 100);
setVisible(true);
pack();
}
});
}
}