package org.obo.annotation.view; import java.awt.Color; import java.awt.Component; import javax.swing.JTable; import org.obo.annotation.base.OBOUtil; import org.obo.app.swing.PlaceholderRenderer; import org.obo.datamodel.DanglingObject; import org.obo.datamodel.Link; import org.obo.datamodel.LinkedObject; import org.obo.datamodel.Namespace; import org.obo.datamodel.OBOClass; import org.obo.datamodel.OBOObject; /** * A table cell renderer for displaying cell values which are ontology terms (OBOClass). * The term name is displayed, and the term ID is provided as a tooltip. * @author Jim Balhoff */ public class TermRenderer extends PlaceholderRenderer { private static final Color THE_COLOR_PURPLE = new Color(133, 0, 175); public TermRenderer(String placeholder) { super(placeholder); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (value instanceof OBOObject) { final OBOObject term = (OBOObject)value; this.setToolTipText(term.getID()); final Component component = super.getTableCellRendererComponent(table, (term.getName() != null ? term.getName() : term.getID()), isSelected, hasFocus, row, column); if (isDangling(term)) { component.setForeground(Color.BLUE); this.setToolTipText("Dangling Term: " + term.getID()); } if (isProvisional(term)) { component.setForeground(THE_COLOR_PURPLE); this.setToolTipText("Provisional Term: " + term.getID()); } if (term.isObsolete()) { component.setForeground(Color.RED); this.setToolTipText("Obsolete Term: " + term.getID()); } return component; } else { this.setToolTipText(null); return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); } } public static boolean isDangling(OBOObject term) { if (OBOUtil.isPostCompTerm(term)) { if (isDangling(OBOUtil.getGenusTerm((OBOClass)term))) { return true; } else { for (Link link : OBOUtil.getAllDifferentia((OBOClass)term)) { final LinkedObject parent = link.getParent(); if (!(parent instanceof OBOClass)) continue; final OBOClass differentium = (OBOClass)parent; if (isDangling(differentium)) { return true; } } } } else { return term instanceof DanglingObject; } return false; } public static boolean isProvisional(OBOObject term) { if (term.getNamespace() != null) { return term.getNamespace().equals(new Namespace("bioportal_provisional")); } else { return false; } } }