package statalign.postprocess;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import javax.swing.AbstractButton;
import javax.swing.ButtonGroup;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import statalign.base.InputData;
import statalign.postprocess.gui.treeviews.TreeView;
public abstract class TreeVisualizer extends Postprocess {
// Variables
private JPanel mainPanel;
private JPanel treePanel;
private String currentPanel;
private ButtonGroup group;
protected int noOfSamples = 0;
protected ArrayList<TreeView> treeViews;
private HashMap<String, TreeView> treeViewsMap;
protected ArrayList<JComponent> toolBar;
// Functions
protected TreeVisualizer() {
// TODO: Plugin configuration
screenable = true;
hasToolBar = true;
}
public void init(TreeView[] views) {
// Object initialization
//System.out.println("Initialising TreeView");
treeViews = new ArrayList<TreeView>();
treeViewsMap = new HashMap<String, TreeView>();
for (TreeView view : views) {
addTreeView(view);
}
// Initialize toolbar
toolBar = new ArrayList<JComponent>();
createToolBar();
}
@Override
public void beforeFirstSample(InputData input) {
super.beforeFirstSample(input);
if(show) {
Enumeration<AbstractButton> buttons = group.getElements();
while (buttons.hasMoreElements()) {
buttons.nextElement().setEnabled(true);
}
// Notifies each tree view of a MCMC run.
for (TreeView view : treeViews) {
view.beforeFirstSample(input.seqs.size());
view.revalidate();
}
}
}
@Override
public JPanel getJPanel() {
mainPanel = new JPanel(new BorderLayout());
treePanel = new JPanel(new CardLayout());
for (TreeView view : treeViews) {
// Constructs a JScrollPane for each of the tree views.
JScrollPane parent = new JScrollPane();
parent.setViewportView(view);
view.setParent(parent);
treePanel.add(parent, view.getIdentifier());
}
mainPanel.add(treePanel, BorderLayout.CENTER);
return mainPanel;
}
@Override
public void setSampling(boolean enabled) {
sampling = enabled;
}
@Override
public ArrayList<JComponent> getToolBarItems() {
return toolBar;
}
public void refreshGUI() {
// TODO: if (show) { ?
treeViewsMap.get(currentPanel).repaint();
}
private void createToolBar() {
toolBar.add(new JToolBar.Separator());
group = new ButtonGroup();
for (final TreeView view : treeViews) {
JToggleButton button = view.getToolBarButton();
button.setEnabled(false);
// Move?
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
CardLayout layout = (CardLayout) treePanel.getLayout();
String identifier = view.getIdentifier();
currentPanel = identifier;
layout.show(treePanel, identifier);
}
});
group.add(button);
toolBar.add(button);
}
// The first (non-separator) is selected by default.
if (toolBar.size() > 1) {
((JToggleButton) toolBar.get(1)).setSelected(true);
}
}
private void addTreeView(TreeView view) {
String identifier = view.getIdentifier();
if (treeViewsMap.containsKey(identifier)) {
throw new RuntimeException("Duplicate exception:" +
" You need to change the identifier.");
}
if (treeViews.size() == 0) { // Makes the first view the current view.
currentPanel = identifier;
}
treeViewsMap.put(identifier, view);
treeViews.add(view);
}
}