package beast.app.beauti; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.util.List; import javax.swing.Box; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.SwingUtilities; import beast.app.draw.InputEditor; import beast.app.draw.SmallLabel; import beast.core.BEASTInterface; import beast.core.Input; import beast.evolution.tree.Tree; import beast.evolution.tree.TreeDistribution; //import beast.evolution.speciation.BirthDeathGernhard08Model; //import beast.evolution.speciation.YuleModel; public class TreeDistributionInputEditor extends InputEditor.Base { private static final long serialVersionUID = 1L; public TreeDistributionInputEditor(BeautiDoc doc) { super(doc); } @Override public Class<?> type() { return TreeDistribution.class; } // @Override // public Class<?>[] types() { // ArrayList<Class> types = new ArrayList<>(); // types.add(TreeDistribution.class); // types.add(BirthDeathGernhard08Model.class); // types.add(YuleModel.class); // types.add(Coalescent.class); // types.add(BayesianSkyline.class); // return types.toArray(new Class[0]); // } ActionEvent m_e; @Override public void init(Input<?> input, BEASTInterface beastObject, int listItemNr, ExpandOption isExpandOption, boolean addButtons) { m_bAddButtons = addButtons; m_input = input; m_beastObject = beastObject; this.itemNr = listItemNr; Box itemBox = Box.createHorizontalBox(); TreeDistribution distr = (TreeDistribution) beastObject; String text = ""/* beastObject.getID() + ": " */; if (distr.treeInput.get() != null) { text += distr.treeInput.get().getID(); } else { text += distr.treeIntervalsInput.get().treeInput.get().getID(); } JLabel label = new JLabel(text); Font font = label.getFont(); Dimension size = new Dimension(font.getSize() * 200 / 12, font.getSize() * 2); label.setMinimumSize(size); label.setPreferredSize(size); itemBox.add(label); // List<String> availableBEASTObjects = // PluginPanel.getAvailablePlugins(m_input, m_beastObject, null); List<BeautiSubTemplate> availableBEASTObjects = doc.getInputEditorFactory().getAvailableTemplates(m_input, m_beastObject, null, doc); // make sure we are dealing with a TreeDistribution for (int i = availableBEASTObjects.size() - 1; i >= 0; i--) { BeautiSubTemplate t = availableBEASTObjects.get(i); Class<?> c = t._class; if (!(TreeDistribution.class.isAssignableFrom(c))) { availableBEASTObjects.remove(i); } } JComboBox<BeautiSubTemplate> comboBox = new JComboBox<>(availableBEASTObjects.toArray(new BeautiSubTemplate[]{})); comboBox.setName("TreeDistribution"); for (int i = availableBEASTObjects.size() - 1; i >= 0; i--) { if (!TreeDistribution.class.isAssignableFrom(availableBEASTObjects.get(i)._class)) { availableBEASTObjects.remove(i); } } String id = distr.getID(); try { // id = BeautiDoc.parsePartition(id); id = id.substring(0, id.indexOf('.')); } catch (Exception e) { throw new RuntimeException("Improperly formatted ID: " + distr.getID()); } for (BeautiSubTemplate template : availableBEASTObjects) { if (template.matchesName(id)) { // getMainID().replaceAll(".\\$\\(n\\)", // "").equals(id)) { comboBox.setSelectedItem(template); } } comboBox.addActionListener(e -> { m_e = e; SwingUtilities.invokeLater(new Runnable() { @Override public void run() { @SuppressWarnings("unchecked") JComboBox<BeautiSubTemplate> currentComboBox = (JComboBox<BeautiSubTemplate>) m_e.getSource(); @SuppressWarnings("unchecked") List<BEASTInterface> list = (List<BEASTInterface>) m_input.get(); BeautiSubTemplate template = (BeautiSubTemplate) currentComboBox.getSelectedItem(); PartitionContext partitionContext = doc.getContextFor(list.get(itemNr)); try { template.createSubNet(partitionContext, list, itemNr, true); } catch (Exception ex) { ex.printStackTrace(); } sync(); refreshPanel(); } }); }); itemBox.add(comboBox); itemBox.add(Box.createGlue()); m_validateLabel = new SmallLabel("x", new Color(200, 0, 0)); m_validateLabel.setVisible(false); validateInput(); itemBox.add(m_validateLabel); add(itemBox); } @Override public void validateInput() { TreeDistribution distr = (TreeDistribution) m_beastObject; // TODO: robustify for the case the tree is not a simple binary tree Tree tree = (Tree) distr.treeInput.get(); if (tree == null) { tree = distr.treeIntervalsInput.get().treeInput.get(); } if (tree.hasDateTrait()) { if (!distr.canHandleTipDates()) { m_validateLabel.setToolTipText("This tree prior cannot handle dated tips. Choose another tree prior."); m_validateLabel.m_circleColor = Color.red; m_validateLabel.setVisible(true); return; } } super.validateInput(); } }