package beast.app.draw;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.io.File;
import java.net.URL;
import java.util.List;
import java.util.Scanner;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.border.EmptyBorder;
import beast.app.beauti.BeautiDoc;
import beast.core.BEASTInterface;
import beast.core.Input;
import beast.core.MCMC;
import beast.util.XMLProducer;
/**
* Dialog for editing BEASTObjects.
* <p/>
* This dynamically creates a dialog consisting of
* InputEditors associated with the inputs of a BEASTObject.
* *
*/
public class BEASTObjectDialog extends JDialog {
private static final long serialVersionUID = 1L;
/**
* plug in to be edited *
*/
private boolean m_bOK = false;
public BEASTObjectPanel m_panel;
/**
* map that identifies the InputEditor to use for a particular type of Input *
*/
BeautiDoc doc;
public BEASTObjectDialog(BEASTObjectPanel panel, BeautiDoc doc) {
init(panel);
this.doc = doc;
}
public BEASTObjectDialog(BEASTInterface beastObject, Class<? extends BEASTInterface> aClass, List<BEASTInterface> beastObjects, BeautiDoc doc) {
this(new BEASTObjectPanel(beastObject, aClass, beastObjects, doc), doc);
}
public BEASTObjectDialog(BEASTInterface beastObject, Class<?> type, BeautiDoc doc) {
this(new BEASTObjectPanel(beastObject, type, doc), doc);
}
public boolean showDialog() {
URL url = ClassLoader.getSystemResource(ModelBuilder.ICONPATH + "beast.png");
Icon icon = new ImageIcon(url);
JOptionPane optionPane = new JOptionPane(m_panel,
JOptionPane.QUESTION_MESSAGE,
JOptionPane.OK_CANCEL_OPTION,
icon,
null,
null);
optionPane.setBorder(new EmptyBorder(12, 12, 12, 12));
Frame frame = (doc != null ? doc.getFrame(): Frame.getFrames()[0]);
final JDialog dialog = optionPane.createDialog(frame, this.getTitle());
dialog.pack();
dialog.setVisible(true);
int result = JOptionPane.CANCEL_OPTION;
Integer value = (Integer) optionPane.getValue();
if (value != null && value != -1) {
result = value;
}
m_bOK = (result != JOptionPane.CANCEL_OPTION);
return m_bOK;
}
/* to be called when OK is pressed **/
public void accept(BEASTInterface beastObject, BeautiDoc doc) {
try {
for (Input<?> input : m_panel.m_beastObject.listInputs()) {
if (input.get() != null && (input.get() instanceof List)) {
// setInpuValue (below) on lists does not lead to expected result
// it appends values to the list instead, so we have to clear it first
List<?> list = (List<?>)beastObject.getInput(input.getName()).get();
list.clear();
}
beastObject.setInputValue(input.getName(), input.get());
}
beastObject.setID(m_panel.m_beastObject.getID());
if (doc != null) {
doc.addPlugin(beastObject);
}
} catch (Exception e) {
e.printStackTrace();
}
}
void init(BEASTObjectPanel panel) {
this.m_panel = panel;
setModal(true);
add(BorderLayout.CENTER, panel);
setTitle(panel.m_beastObject.getID() + " Editor");
// /* add cancel and ok buttons at the bottom */
// Box cancelOkBox = Box.createHorizontalBox();
// cancelOkBox.setBorder(new EtchedBorder());
// JButton okButton = new JButton("Ok");
// okButton.addActionListener(new ActionListener() {
//
// // implementation ActionListener
// public void actionPerformed(ActionEvent e) {
// m_bOK = true;
// dispose();
// }
// });
// JButton cancelButton = new JButton("Cancel");
// cancelButton.addActionListener(new ActionListener() {
//
// // implementation ActionListener
// public void actionPerformed(ActionEvent e) {
// m_bOK = false;
// dispose();
// }
// });
// cancelOkBox.add(Box.createHorizontalGlue());
// cancelOkBox.add(okButton);
// cancelOkBox.add(Box.createHorizontalGlue());
// cancelOkBox.add(cancelButton);
// cancelOkBox.add(Box.createHorizontalGlue());
//
// add(BorderLayout.SOUTH, cancelOkBox);
//
// Dimension dim = panel.getPreferredSize();
// Dimension dim2 = cancelOkBox.getPreferredSize();
// setSize(dim.width + 10, dim.height + dim2.height + 30);
} // c'tor
public boolean getOK(BeautiDoc doc) {
//PluginDialog.m_position.x -= 30;
//PluginDialog.m_position.y -= 30;
if (m_bOK) {
String oldID = m_panel.m_beastObject.getID();
BEASTObjectPanel.g_plugins.remove(oldID);
m_panel.m_beastObject.setID(m_panel.m_identry.getText());
BEASTObjectPanel.registerPlugin(m_panel.m_beastObject.getID(), m_panel.m_beastObject, doc);
}
return m_bOK;
}
/**
* rudimentary test *
*/
public static void main(String[] args) {
BEASTObjectDialog dlg = null;
try {
if (args.length == 0) {
dlg = new BEASTObjectDialog(new BEASTObjectPanel(new MCMC(), Runnable.class, null), null);
} else if (args[0].equals("-x")) {
StringBuilder text = new StringBuilder();
String NL = System.getProperty("line.separator");
Scanner scanner = new Scanner(new File(args[1]));
try {
while (scanner.hasNextLine()) {
text.append(scanner.nextLine() + NL);
}
} finally {
scanner.close();
}
BEASTInterface beastObject = new beast.util.XMLParser().parseBareFragment(text.toString(), false);
dlg = new BEASTObjectDialog(new BEASTObjectPanel(beastObject, beastObject.getClass(), null), null);
} else if (args.length == 1) {
dlg = new BEASTObjectDialog(new BEASTObjectPanel((BEASTInterface) Class.forName(args[0]).newInstance(), Class.forName(args[0]), null), null);
} else if (args.length == 2) {
dlg = new BEASTObjectDialog(new BEASTObjectPanel((BEASTInterface) Class.forName(args[0]).newInstance(), Class.forName(args[1]), null), null);
} else {
throw new IllegalArgumentException("Incorrect number of arguments");
}
} catch (Exception e) {
e.printStackTrace();
System.err.println("Usage: " + BEASTObjectDialog.class.getName() + " [-x file ] [class [type]]\n" +
"where [class] (optional, default MCMC) is a BEASTObject to edit\n" +
"and [type] (optional only if class is specified, default Runnable) the type of the BEASTObject.\n" +
"for example\n" +
"");
System.exit(1);
}
dlg.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
if (dlg.showDialog()) {
BEASTInterface beastObject = dlg.m_panel.m_beastObject;
String xml = new XMLProducer().modelToXML(beastObject);
System.out.println(xml);
}
} // main
} // class PluginDialog