package beast.app.beauti; import java.awt.Dimension; import java.util.ArrayList; import java.util.List; import javax.swing.Box; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import beast.app.draw.InputEditor; import beast.app.draw.ListInputEditor; import beast.core.BEASTInterface; import beast.core.Input; import beast.core.Operator; import beast.core.StateNode; public class OperatorListInputEditor extends ListInputEditor { private static final long serialVersionUID = 1L; List<JTextField> textFields = new ArrayList<>(); List<Operator> operators = new ArrayList<>(); public OperatorListInputEditor(BeautiDoc doc) { super(doc); } @Override public Class<?> type() { return List.class; } @Override public Class<?> baseType() { return Operator.class; } @Override public void init(Input<?> input, BEASTInterface beastObject, int itemNr, ExpandOption isExpandOption, boolean addButtons) { Box box = Box.createHorizontalBox(); box.add(Box.createHorizontalStrut(25)); box.add(new JLabel("Operator")); box.add(Box.createGlue()); box.add(new JLabel("Weight")); box.add(Box.createHorizontalStrut(20)); add(box); m_buttonStatus = ButtonStatus.NONE; super.init(input, beastObject, itemNr, isExpandOption, addButtons); } @Override protected InputEditor addPluginItem(Box itemBox, BEASTInterface beastObject) { Operator operator = (Operator) beastObject; JTextField entry = new JTextField(" " + getLabel(operator)); entry.setMinimumSize(new Dimension(200, 16)); //entry.setMaximumSize(new Dimension(200, 20)); m_entries.add(entry); entry.setBackground(getBackground()); entry.setBorder(null); itemBox.add(Box.createRigidArea(new Dimension(5, 1))); itemBox.add(entry); entry.setEditable(false); // JLabel label = new JLabel(getLabel(operator)); // label.setBackground(Color.WHITE); // m_labels.add(label); // m_entries.add(null); // itemBox.add(label); itemBox.add(Box.createHorizontalGlue()); JTextField weightEntry = new JTextField(); weightEntry.setToolTipText(operator.m_pWeight.getHTMLTipText()); weightEntry.setText(operator.m_pWeight.get() + ""); weightEntry.getDocument().addDocumentListener(new OperatorDocumentListener(operator, weightEntry)); Dimension size = new Dimension(50, 25); weightEntry.setMinimumSize(size); weightEntry.setPreferredSize(size); int fontsize = weightEntry.getFont().getSize(); weightEntry.setMaximumSize(new Dimension(50 * fontsize/13, 50 * fontsize/13)); itemBox.add(weightEntry); return this; } /** * class to set weight-input on an operator when it changes in the list * */ class OperatorDocumentListener implements DocumentListener { Operator m_operator; JTextField m_weightEntry; OperatorDocumentListener(Operator operator, JTextField weightEntry) { m_operator = operator; m_weightEntry = weightEntry; textFields.add(weightEntry); operators.add(operator); } @Override public void removeUpdate(DocumentEvent e) { processEntry(); } @Override public void insertUpdate(DocumentEvent e) { processEntry(); } @Override public void changedUpdate(DocumentEvent e) { processEntry(); } void processEntry() { try { Double weight = Double.parseDouble(m_weightEntry.getText()); m_operator.m_pWeight.setValue(weight, m_operator); } catch (Exception e) { // ignore } validate(); } } ; @Override public void updateState() { super.updateState(); for (int i = 0; i < textFields.size(); i++) { textFields.get(i).setText(operators.get(i).m_pWeight.get() + ""); //m_labels.get(i).setText(getLabel(m_operators.get(i))); m_entries.get(i).setText(getLabel(operators.get(i))); } } String getLabel(Operator operator) { String name = operator.getClass().getName(); name = name.substring(name.lastIndexOf('.') + 1); name = name.replaceAll("Operator", ""); if (name.matches(".*[A-Z].*")) { name = name.replaceAll("(.)([A-Z])", "$1 $2"); } name += ": "; try { for (BEASTInterface beastObject2 : operator.listActiveBEASTObjects()) { if (beastObject2 instanceof StateNode && ((StateNode) beastObject2).isEstimatedInput.get()) { name += beastObject2.getID() + " "; } // issue https://github.com/CompEvol/beast2/issues/661 if (name.length() > 100) { name += "... "; break; } } } catch (Exception e) { // ignore } String tipText = getDoc().tipTextMap.get(operator.getID()); if (tipText != null) { name += " " + tipText; } return name; } } // OperatorListInputEditor