package viz.panel;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.GridBagLayout;
import javax.swing.JCheckBox;
import java.awt.GridBagConstraints;
import javax.swing.JLabel;
import java.awt.Insets;
import javax.swing.JColorChooser;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingConstants;
import javax.swing.JButton;
import viz.DensiTree;
import viz.graphics.JFontChooser;
import viz.util.Util;
import javax.swing.JSpinner;
import javax.swing.JSeparator;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.JTextField;
public class CladePanel extends JPanel implements ChangeListener {
public final static String HELP_SHOW_CLADES = "Show information for individual clades. This is only " +
"activated when the drawing style is not default. The default style is not clade based, so " +
"there is no information to position clade information.";
public final static String HELP_SELECTED_ONLY = "Show information only for selected clades. Clades can " +
"be selected by clicking them in the DensiTree, or selecting them from the clade-bar (at botom " +
"of the screen).";
public final static String HELP_MEAN = "Show mean height of clades as line or and/as text.";
public final static String HELP_95HPD = "Show 95% highest probability density interval of the height of clades as bar and/or as text.";
public final static String HELP_SUPPORT = "Show support of clade as cricle and/or as text. The support is the fraction of " +
"trees in the tree set that contain the clade.";
public final static String HELP_DIGITS = "Number of significant digits to show clade information as text.";
public final static String HELP_FONT = "Font used to show clade information as text.";
public final static String HELP_COLOR = "Color used to show clade information as text.";
private static final long serialVersionUID = 1L;
DensiTree m_dt;
SpinnerNumberModel significantDigitsModel;
JCheckBox chckbxSelectionOnly = new JCheckBox("Selected only");
JCheckBox chckbxShowClades = new JCheckBox("Show clades");
JCheckBox chckbxMean = new JCheckBox("");
JCheckBox checkBox = new JCheckBox("");
JCheckBox chckbxhpd = new JCheckBox("");
JCheckBox checkBox_1 = new JCheckBox("");
JCheckBox chckbxSupport = new JCheckBox("");
JCheckBox checkBox_2 = new JCheckBox("");
JButton btnFont;
JSpinner spinner;
JButton btnColor;
private final JLabel lblNewLabel = new JLabel("Smallest");
private final JTextField textFieldSmallestClade = new JTextField();
public CladePanel(DensiTree dt) {
m_dt = dt;
m_dt.addChangeListener(this);
GridBagLayout gridBagLayout = new GridBagLayout();
gridBagLayout.columnWidths = new int[]{0, 0, 0, 0, 0};
gridBagLayout.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
gridBagLayout.columnWeights = new double[]{0.0, 1.0, 0.0, 0.0, Double.MIN_VALUE};
gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
setLayout(gridBagLayout);
chckbxSelectionOnly.setSelected(m_dt.m_cladeDrawer.m_bSelectedOnly);
chckbxSelectionOnly.addActionListener(e-> {
boolean bPrev = m_dt.m_cladeDrawer.m_bSelectedOnly;
m_dt.m_cladeDrawer.m_bSelectedOnly = ((JCheckBox) e.getSource()).isSelected();
if (bPrev != m_dt.m_cladeDrawer.m_bSelectedOnly) {
m_dt.makeDirty();
}
});
chckbxShowClades.addActionListener(e-> {
boolean bPrev = m_dt.m_bViewClades;
m_dt.m_bViewClades = ((JCheckBox) e.getSource()).isSelected();
if (bPrev != m_dt.m_bViewClades) {
m_dt.makeDirty();
}
});
GridBagConstraints gbc_chckbxShowClades = new GridBagConstraints();
gbc_chckbxShowClades.anchor = GridBagConstraints.WEST;
gbc_chckbxShowClades.gridwidth = 3;
gbc_chckbxShowClades.insets = new Insets(0, 0, 5, 5);
gbc_chckbxShowClades.gridx = 0;
gbc_chckbxShowClades.gridy = 0;
add(chckbxShowClades, gbc_chckbxShowClades);
chckbxSelectionOnly.setHorizontalAlignment(SwingConstants.LEFT);
GridBagConstraints gbc_chckbxSelectionOnly = new GridBagConstraints();
gbc_chckbxSelectionOnly.gridwidth = 3;
gbc_chckbxSelectionOnly.anchor = GridBagConstraints.WEST;
gbc_chckbxSelectionOnly.insets = new Insets(0, 0, 5, 5);
gbc_chckbxSelectionOnly.gridx = 0;
gbc_chckbxSelectionOnly.gridy = 1;
add(chckbxSelectionOnly, gbc_chckbxSelectionOnly);
JLabel btnDraw = new JLabel("draw");
GridBagConstraints gbc_btnDraw = new GridBagConstraints();
gbc_btnDraw.anchor = GridBagConstraints.EAST;
gbc_btnDraw.gridwidth = 2;
gbc_btnDraw.insets = new Insets(0, 0, 5, 5);
//gbc_btnDraw.insets = new Insets(0, 0, 5, 0);
gbc_btnDraw.gridx = 0;
gbc_btnDraw.gridy = 2;
add(btnDraw, gbc_btnDraw);
JLabel btnText = new JLabel("text");
GridBagConstraints gbc_btnText = new GridBagConstraints();
gbc_btnText.insets = new Insets(0, 0, 5, 5);
gbc_btnText.gridx = 2;
gbc_btnText.gridy = 2;
add(btnText, gbc_btnText);
JLabel lblMean = new JLabel("Mean");
lblMean.setHorizontalAlignment(SwingConstants.LEFT);
GridBagConstraints gbc_lblMean = new GridBagConstraints();
gbc_lblMean.anchor = GridBagConstraints.EAST;
gbc_lblMean.insets = new Insets(0, 0, 5, 5);
gbc_lblMean.gridx = 0;
gbc_lblMean.gridy = 3;
add(lblMean, gbc_lblMean);
chckbxMean.addActionListener(e-> {
boolean bPrev = m_dt.m_cladeDrawer.m_bDrawMean;
m_dt.m_cladeDrawer.m_bDrawMean = ((JCheckBox) e.getSource()).isSelected();
if (bPrev != m_dt.m_cladeDrawer.m_bDrawMean) {
m_dt.makeDirty();
}
});
chckbxMean.setSelected(m_dt.m_cladeDrawer.m_bDrawMean);
GridBagConstraints gbc_chckbxMean = new GridBagConstraints();
gbc_chckbxMean.insets = new Insets(0, 0, 5, 5);
gbc_chckbxMean.gridx = 1;
gbc_chckbxMean.gridy = 3;
add(chckbxMean, gbc_chckbxMean);
checkBox.setSelected(m_dt.m_cladeDrawer.m_bTextMean);
checkBox.addActionListener(e-> {
boolean bPrev = m_dt.m_cladeDrawer.m_bTextMean;
m_dt.m_cladeDrawer.m_bTextMean = ((JCheckBox) e.getSource()).isSelected();
if (bPrev != m_dt.m_cladeDrawer.m_bTextMean) {
m_dt.makeDirty();
}
});
checkBox.setHorizontalAlignment(SwingConstants.RIGHT);
GridBagConstraints gbc_checkBox = new GridBagConstraints();
gbc_checkBox.insets = new Insets(0, 0, 5, 5);
gbc_checkBox.gridx = 2;
gbc_checkBox.gridy = 3;
add(checkBox, gbc_checkBox);
JLabel lblhpd = new JLabel("95%HPD");
GridBagConstraints gbc_lblhpd = new GridBagConstraints();
gbc_lblhpd.anchor = GridBagConstraints.EAST;
gbc_lblhpd.insets = new Insets(0, 0, 5, 5);
gbc_lblhpd.gridx = 0;
gbc_lblhpd.gridy = 4;
add(lblhpd, gbc_lblhpd);
chckbxhpd.setSelected(m_dt.m_cladeDrawer.m_bDraw95HPD);
chckbxhpd.addActionListener(e-> {
boolean bPrev = m_dt.m_cladeDrawer.m_bDraw95HPD;
m_dt.m_cladeDrawer.m_bDraw95HPD = ((JCheckBox) e.getSource()).isSelected();
if (bPrev != m_dt.m_cladeDrawer.m_bDraw95HPD) {
m_dt.makeDirty();
}
});
GridBagConstraints gbc_chckbxhpd = new GridBagConstraints();
gbc_chckbxhpd.anchor = GridBagConstraints.NORTH;
gbc_chckbxhpd.insets = new Insets(0, 0, 5, 5);
gbc_chckbxhpd.gridx = 1;
gbc_chckbxhpd.gridy = 4;
add(chckbxhpd, gbc_chckbxhpd);
checkBox_1.setSelected(m_dt.m_cladeDrawer.m_bText95HPD);
checkBox_1.addActionListener(e-> {
boolean bPrev = m_dt.m_cladeDrawer.m_bText95HPD;
m_dt.m_cladeDrawer.m_bText95HPD = ((JCheckBox) e.getSource()).isSelected();
if (bPrev != m_dt.m_cladeDrawer.m_bText95HPD) {
m_dt.makeDirty();
}
});
checkBox_1.setHorizontalAlignment(SwingConstants.RIGHT);
GridBagConstraints gbc_checkBox_1 = new GridBagConstraints();
gbc_checkBox_1.insets = new Insets(0, 0, 5, 5);
gbc_checkBox_1.gridx = 2;
gbc_checkBox_1.gridy = 4;
add(checkBox_1, gbc_checkBox_1);
JLabel lblSupport = new JLabel("Support");
GridBagConstraints gbc_lblSupport = new GridBagConstraints();
gbc_lblSupport.anchor = GridBagConstraints.EAST;
gbc_lblSupport.insets = new Insets(0, 0, 5, 5);
gbc_lblSupport.gridx = 0;
gbc_lblSupport.gridy = 5;
add(lblSupport, gbc_lblSupport);
chckbxSupport.setSelected(m_dt.m_cladeDrawer.m_bDrawSupport);
chckbxSupport.addActionListener(e-> {
boolean bPrev = m_dt.m_cladeDrawer.m_bDrawSupport;
m_dt.m_cladeDrawer.m_bDrawSupport = ((JCheckBox) e.getSource()).isSelected();
if (bPrev != m_dt.m_cladeDrawer.m_bDrawSupport) {
m_dt.makeDirty();
}
});
GridBagConstraints gbc_chckbxSupport = new GridBagConstraints();
gbc_chckbxSupport.insets = new Insets(0, 0, 5, 5);
gbc_chckbxSupport.gridx = 1;
gbc_chckbxSupport.gridy = 5;
add(chckbxSupport, gbc_chckbxSupport);
checkBox_2.setSelected(m_dt.m_cladeDrawer.m_bTextSupport);
checkBox_2.addActionListener(e-> {
boolean bPrev = m_dt.m_cladeDrawer.m_bTextSupport;
m_dt.m_cladeDrawer.m_bTextSupport = ((JCheckBox) e.getSource()).isSelected();
if (bPrev != m_dt.m_cladeDrawer.m_bTextSupport) {
m_dt.makeDirty();
}
});
checkBox_2.setHorizontalAlignment(SwingConstants.RIGHT);
GridBagConstraints gbc_checkBox_2 = new GridBagConstraints();
gbc_checkBox_2.insets = new Insets(0, 0, 5, 5);
gbc_checkBox_2.gridx = 2;
gbc_checkBox_2.gridy = 5;
add(checkBox_2, gbc_checkBox_2);
JSeparator separator = new JSeparator();
GridBagConstraints gbc_separator = new GridBagConstraints();
gbc_separator.gridwidth = 4;
gbc_separator.fill = GridBagConstraints.HORIZONTAL;
gbc_separator.insets = new Insets(0, 0, 5, 0);
gbc_separator.gridx = 0;
gbc_separator.gridy = 6;
add(separator, gbc_separator);
JLabel lblDigits = new JLabel("Sign. Digits");
GridBagConstraints gbc_lblDigits = new GridBagConstraints();
gbc_lblDigits.gridwidth = 2;
gbc_lblDigits.anchor = GridBagConstraints.EAST;
gbc_lblDigits.insets = new Insets(0, 0, 5, 5);
gbc_lblDigits.gridx = 0;
gbc_lblDigits.gridy = 7;
add(lblDigits, gbc_lblDigits);
significantDigitsModel = new SpinnerNumberModel(m_dt.m_cladeDrawer.m_nSignificantDigits, 0, 100, 1);
significantDigitsModel.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
m_dt.m_cladeDrawer.m_nSignificantDigits = (Integer) significantDigitsModel.getValue();
m_dt.makeDirty();
}
});
btnFont = new RoundedButton("Font");
btnFont.addActionListener(e-> {
JFontChooser fontChooser = new JFontChooser();
if (m_dt.m_cladeDrawer.m_font != null) {
fontChooser.setSelectedFont(m_dt.m_cladeDrawer.m_font);
}
int result = fontChooser.showDialog(null);
if (result == JFontChooser.OK_OPTION) {
m_dt.m_cladeDrawer.m_font = fontChooser.getSelectedFont();
m_dt.makeDirty();
m_dt.repaint();
}
});
spinner = new JSpinner(significantDigitsModel);
GridBagConstraints gbc_spinner = new GridBagConstraints();
gbc_spinner.anchor = GridBagConstraints.WEST;
gbc_spinner.insets = new Insets(0, 0, 5, 5);
gbc_spinner.gridx = 2;
gbc_spinner.gridy = 7;
add(spinner, gbc_spinner);
GridBagConstraints gbc_btnFont = new GridBagConstraints();
gbc_btnFont.insets = new Insets(0, 0, 5, 5);
gbc_btnFont.gridx = 0;
gbc_btnFont.gridy = 8;
add(btnFont, gbc_btnFont);
btnColor = new RoundedButton("Color");
btnColor.addActionListener(e-> {
Color newColor = JColorChooser.showDialog(m_dt.m_Panel, getName(), m_dt.m_cladeDrawer.m_color);
if (newColor != null) {
m_dt.m_cladeDrawer.m_color = newColor;
m_dt.makeDirty();
}
m_dt.repaint();
});
GridBagConstraints gbc_btnColor = new GridBagConstraints();
gbc_btnColor.gridwidth = 2;
gbc_btnColor.insets = new Insets(0, 0, 5, 5);
gbc_btnColor.gridx = 1;
gbc_btnColor.gridy = 8;
add(btnColor, gbc_btnColor);
stateChanged(null);
setToolTipText(Util.formatToolTipAsHtml(HELP_SELECTED_ONLY));
chckbxSelectionOnly.setToolTipText(Util.formatToolTipAsHtml(HELP_SELECTED_ONLY));
chckbxShowClades.setToolTipText(Util.formatToolTipAsHtml(HELP_SHOW_CLADES));
chckbxMean.setToolTipText(Util.formatToolTipAsHtml(HELP_MEAN));
chckbxhpd.setToolTipText(Util.formatToolTipAsHtml(HELP_95HPD));
chckbxSupport.setToolTipText(Util.formatToolTipAsHtml(HELP_SUPPORT));
checkBox.setToolTipText(Util.formatToolTipAsHtml(HELP_MEAN));
checkBox_1.setToolTipText(Util.formatToolTipAsHtml(HELP_95HPD));
checkBox_2.setToolTipText(Util.formatToolTipAsHtml(HELP_SUPPORT));
btnFont.setToolTipText(Util.formatToolTipAsHtml(HELP_FONT));
spinner.setToolTipText(Util.formatToolTipAsHtml(HELP_DIGITS));
btnColor.setToolTipText(Util.formatToolTipAsHtml(HELP_COLOR));
GridBagConstraints gbc_lblNewLabel = new GridBagConstraints();
gbc_lblNewLabel.insets = new Insets(0, 0, 5, 5);
gbc_lblNewLabel.gridx = 0;
gbc_lblNewLabel.gridy = 9;
lblNewLabel.setToolTipText("Smallest clade support to be considered a clade");
add(lblNewLabel, gbc_lblNewLabel);
textFieldSmallestClade.setText(m_dt.m_smallestCladeSupport + "");
textFieldSmallestClade.setColumns(3);
textFieldSmallestClade.addActionListener(e-> {
try {
m_dt.m_smallestCladeSupport = Double.parseDouble(textFieldSmallestClade.getText());
m_dt.updateCladeModel();
} catch (Exception e2) {}
});
GridBagConstraints gbc_textFieldSmallestClade = new GridBagConstraints();
gbc_textFieldSmallestClade.gridwidth = 2;
gbc_textFieldSmallestClade.insets = new Insets(0, 0, 5, 5);
gbc_textFieldSmallestClade.fill = GridBagConstraints.HORIZONTAL;
gbc_textFieldSmallestClade.gridx = 1;
gbc_textFieldSmallestClade.gridy = 9;
add(textFieldSmallestClade, gbc_textFieldSmallestClade);
}
@Override
public void stateChanged(ChangeEvent e) {
this.setEnabled(m_dt.m_Xmode != 0);
chckbxSelectionOnly.setEnabled(m_dt.m_Xmode != 0);
chckbxShowClades.setEnabled(m_dt.m_Xmode != 0);
chckbxMean.setEnabled(m_dt.m_Xmode != 0);
checkBox.setEnabled(m_dt.m_Xmode != 0);
chckbxhpd.setEnabled(m_dt.m_Xmode != 0);
checkBox_1.setEnabled(m_dt.m_Xmode != 0);
chckbxSupport.setEnabled(m_dt.m_Xmode != 0);
checkBox_2.setEnabled(m_dt.m_Xmode != 0);
btnFont.setEnabled(m_dt.m_Xmode != 0);;
spinner.setEnabled(m_dt.m_Xmode != 0);;
btnColor.setEnabled(m_dt.m_Xmode != 0);;
}
}