package org.phenoscape.view; import java.awt.BorderLayout; import java.awt.Font; import java.awt.event.ActionEvent; import java.util.Comparator; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JToolBar; import org.obo.app.swing.BugWorkaroundTable; import org.phenoscape.controller.PhenexController; import org.phenoscape.model.Character; import org.phenoscape.util.AnnotationConsistencyChecker; import org.phenoscape.util.ConsistencyIssue; import ca.odell.glazedlists.BasicEventList; import ca.odell.glazedlists.EventList; import ca.odell.glazedlists.GlazedLists; import ca.odell.glazedlists.gui.AdvancedTableFormat; import ca.odell.glazedlists.swing.EventTableModel; import com.eekboom.utils.Strings; public class ConsistencyReviewComponent extends PhenoscapeGUIComponent { private ConsistencyTableFormat tableFormat; private JTable table; private JButton refreshButton; private EventList<ConsistencyIssue> issues = new BasicEventList<ConsistencyIssue>(); private AnnotationConsistencyChecker checker; private static final String REFRESH_SYMBOL = "\u27f3"; public ConsistencyReviewComponent(String id, PhenexController controller) { super(id, controller); this.initializeInterface(); } private void initializeInterface() { this.checker = new AnnotationConsistencyChecker(this.getController().getOntologyCoordinator().getOBOSession()); this.setLayout(new BorderLayout()); this.tableFormat = new ConsistencyTableFormat(); final EventTableModel<ConsistencyIssue> phenotypesTableModel = new EventTableModel<ConsistencyIssue>(this.issues, this.tableFormat); this.table = new BugWorkaroundTable(phenotypesTableModel); this.add(new JScrollPane(this.table), BorderLayout.CENTER); this.add(this.createToolBar(), BorderLayout.NORTH); this.refresh(); } private JToolBar createToolBar() { final JToolBar toolBar = new JToolBar(); this.refreshButton = new JButton(new AbstractAction(REFRESH_SYMBOL) { @Override public void actionPerformed(ActionEvent e) { refresh(); } }); this.refreshButton.setToolTipText("Refresh consistency report"); final Font font = this.refreshButton.getFont(); final Float size = font.getSize2D(); this.refreshButton.setFont(font.deriveFont(size + 20.0f)); toolBar.add(this.refreshButton); toolBar.setFloatable(false); return toolBar; } private void refresh() { this.issues.clear(); for (Character character : this.getController().getDataSet().getCharacters()) { this.issues.addAll(checker.checkCharacter(character)); } } private class ConsistencyTableFormat implements AdvancedTableFormat<ConsistencyIssue> { @Override public int getColumnCount() { return 4; } @Override public String getColumnName(int column) { switch (column) { case 0: return ""; case 1: return "Character"; case 2: return "State"; case 3: return "Issue"; default: return null; } } @Override public Object getColumnValue(ConsistencyIssue issue, int column) { switch (column) { case 0: return getController().getDataSet().getCharacters().indexOf(issue.getCharacter()) + 1; case 1: return issue.getCharacter().getLabel(); case 2: return issue.getState() == null ? "" : issue.getState().getLabel(); case 3: return issue.getIssue(); default: return null; } } @Override public Class<?> getColumnClass(int column) { if (column == 0) { return Integer.class; } else { return String.class; } } @Override public Comparator<?> getColumnComparator(int column) { if (column == 0) { return GlazedLists.comparableComparator(); } else { return Strings.getNaturalComparator(); } } } }