package gitj.ui.components;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import git.Branch;
import git.Repository;
import gitj.Main;
import gitj.ui.CommitListPanel;
@SuppressWarnings("serial")
public class BranchComboBox extends JComboBox<Branch> {
private CommitListPanel parent;
private Repository repository;
private DefaultComboBoxModel<Branch> model;
public BranchComboBox(Repository repo) throws Exception {
this(null, repo);
}
public BranchComboBox(CommitListPanel p, Repository repo) throws Exception {
this.parent = p;
this.repository = repo;
model = new DefaultComboBoxModel<Branch>();
super.setRenderer(new Renderer());
super.setModel(model);
super.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent event) {
if (event.getStateChange() == ItemEvent.SELECTED) {
if (parent == null) {
Object o = event.getItem();
if (o instanceof Branch) {
Branch branch = (Branch) o;
try {
repository.checkout(branch);
} catch (Exception e1) {
e1.printStackTrace();
Main.displayError(e1);
}
}
} else {
try {
parent.reload();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
});
}
public Branch getSelectedBranch() {
return (Branch) model.getSelectedItem();
}
public void reload() throws Exception {
reload(repository.getBranches());
}
public void reload(List<Branch> list) {
model.removeAllElements();
this.addItem(null); // add "show all" item
for (Branch branch : list) {
this.addItem(branch);
}
}
public class Renderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (value instanceof Branch) {
Branch branch = (Branch) value;
label.setText(branch.getName());
if (branch.isSelected()) {
label.setFont(new Font(label.getFont().getName(), Font.BOLD, label.getFont().getSize()));
}
} else if (value == null) {
label.setText("Show all");
}
return label;
}
}
}