package org.seqcode.viz.preferences;
import java.util.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.File;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import org.seqcode.genome.Genome;
import org.seqcode.gseutils.NotFoundException;
import org.seqcode.viz.utils.GenomeSelectPanel;
public class PreferencesDialog extends JDialog {
private PreferencesModel.Default model;
private Map<String,JComponent> components;
private PreferencesComponentTranslator translator;
public PreferencesDialog(PreferencesModel.Default mod) {
model = mod;
translator = new DefaultComponentTranslator();
components = new HashMap<String,JComponent>();
config();
}
public PreferencesDialog(Frame p, PreferencesModel.Default mod) {
super(p);
model = mod;
translator = new DefaultComponentTranslator();
components = new HashMap<String,JComponent>();
config();
}
private void config() {
Runnable r = new Runnable() {
public void run() {
Set<String> keys = model.getKeys();
int numKeys = keys.size();
Container cnt = (Container)getContentPane();
cnt.setLayout(new BorderLayout());
JPanel c = new JPanel();
c.setLayout(new BorderLayout());
JPanel center = new JPanel();
//center.setLayout(new GridLayout(numKeys, 1));
center.setLayout(new BoxLayout(center, BoxLayout.Y_AXIS));
center.setBorder(new TitledBorder("Preferences"));
for(String key : keys) {
Object val = model.getValue(key);
JComponent comp = translator.getComponent(key, val);
components.put(key, comp);
center.add(comp);
}
c.add(center, BorderLayout.CENTER);
JPanel buttons = new JPanel();
buttons.setLayout(new FlowLayout());
JButton ok = new JButton("Ok");
JButton cancel = new JButton("Cancel");
ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
doOK();
}
});
cancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
doCancel();
}
});
buttons.add(ok);
buttons.add(cancel);
c.add(buttons, BorderLayout.SOUTH);
PreferencesDialog.this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent arg0) {
System.out.println("Closing.");
doCancel();
}
});
cnt.add(new JScrollPane(c), BorderLayout.CENTER);
setVisible(true);
pack();
}
};
EventQueue.invokeLater(r);
}
private void doOK() {
Runnable r = new Runnable() {
public void run() {
System.out.println("Performing OK.");
setVisible(false);
for(String k : components.keySet()) {
JComponent comp = components.get(k);
Object val = translator.getValue(model.getValue(k), comp);
model.setValue(k, val);
}
model.fireUpdatedEvent(PreferencesDialog.this);
dispose();
}
};
EventQueue.invokeLater(r);
}
private void doCancel() {
Runnable r = new Runnable() {
public void run() {
System.out.println("Performing CANCEL.");
setVisible(false);
model.fireCanceledEvent(PreferencesDialog.this);
dispose();
}
};
EventQueue.invokeLater(r);
}
}
interface PreferencesComponentTranslator {
public JComponent getComponent(String key, Object val);
public Object getValue(Object oldValue, JComponent comp);
}
class LabeledComponent extends JPanel {
private String label;
private JComponent body;
public LabeledComponent(String v, JComponent c) {
super();
setLayout(new GridLayout(1, 2));
label = v;
body = c;
JLabel lbl = new JLabel(label);
lbl.setHorizontalAlignment(JLabel.RIGHT);
add(lbl);
add(body);
}
public JComponent getBody() { return body; }
}
class DefaultComponentTranslator implements PreferencesComponentTranslator {
public DefaultComponentTranslator() {}
public Object getValue(Object val, JComponent comp) {
if(val instanceof String) {
LabeledComponent lc = (LabeledComponent)comp;
JTextField tf = (JTextField)lc.getBody();
//JTextField tf = (JTextField)comp;
return tf.getText();
}
if(val instanceof Integer) {
LabeledComponent lc = (LabeledComponent)comp;
JTextField tf = (JTextField)lc.getBody();
//JTextField tf = (JTextField)comp;
return Integer.parseInt(tf.getText());
}
if(val instanceof Genome) {
GenomeSelectPanel gsp = (GenomeSelectPanel)comp;
try {
return Genome.findGenome(gsp.getGenome());
} catch (NotFoundException e) {
e.printStackTrace();
return val;
}
}
if(val instanceof Boolean) {
JCheckBox cb = (JCheckBox)comp;
return cb.isSelected();
}
if(val instanceof File) {
FileSelectPanel fsp = (FileSelectPanel)comp;
return fsp.getFile();
}
return val;
}
public JComponent getComponent(String key, Object val) {
if(val instanceof String) {
return new LabeledComponent(key, new JTextField(val.toString()));
//JComponent c = new JTextField(val.toString());
//c.setBorder(new TitledBorder(key));
//return c;
}
if(val instanceof Integer) {
return new LabeledComponent(key, new JTextField(val.toString()));
//JComponent c = new JTextField(val.toString());
//c.setBorder(new TitledBorder(key));
//return c;
}
if(val instanceof Genome) {
GenomeSelectPanel gsp = new GenomeSelectPanel((Genome)val);
gsp.setBorder(new TitledBorder(key));
return gsp;
}
if(val instanceof Boolean) {
JCheckBox cb = new JCheckBox(key, (Boolean)val);
cb.setHorizontalTextPosition(JCheckBox.LEFT);
return cb;
}
if(val instanceof File) {
FileSelectPanel fsp = new FileSelectPanel((File)val);
fsp.setBorder(new TitledBorder(key));
return fsp;
}
return new LabeledComponent(key, new JTextField(val.toString()));
}
}