/**
 * Distributable under LGPL license.
 * See terms of license at gnu.org.
 *
 * Copyright (C)
 * <a href="http://www.inab.org">Spanish National Institute of Bioinformatics (INB)</a>
 * <a href="http://www.bsc.es">Barcelona Supercomputing Center (BSC)</a>
 * <a href="http://inb.bsc.es">Computational Node 6</a>
 */

package org.inb.biomoby.central.gui.renderer;

import java.awt.Color;
import java.util.List;
import javax.swing.JTable;
import org.inb.biomoby.shared.registry.ObjectType;
import org.inb.biomoby.shared.registry.Relationship;

/**
 * Table cell renderer that changes a foreground brigthness if rendered property
 * doesn't belong to an object provided in its constructor.
 *
 * @author Dmitry Repchevsky
 */

public class PropertyTableCellRenderer extends AbstractTableCellRenderer
{
    private ObjectType objectType;
    private float[] hsb;

    public PropertyTableCellRenderer()
    {
        hsb = new float[3];
    }

    public ObjectType getClazz()
    {
        return objectType;
    }

    public void setClazz(ObjectType objectType)
    {
        this.objectType = objectType;// != null ? objectType.clone() : null;
    }

    @Override
    public AbstractTableCellRenderer getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        AbstractTableCellRenderer renderer = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        if (objectType != null && value instanceof ObjectType)
        {
            String articleName = ((ObjectType)value).getArticleName();
            List<Relationship<ObjectType>> relationships = objectType.getRelationships();

            for (Relationship<ObjectType> relationship : relationships)
            {
                if (relationship.getRelationshipType() == Relationship.RELATIONSHIP_TYPE.HAS ||
                    relationship.getRelationshipType() == Relationship.RELATIONSHIP_TYPE.HASA)
                {
                    for (ObjectType property : relationship.getEntityTypeList())
                    {
                        // check both, property name and its type
                        if (property.equals(value) && property.getArticleName().equals(articleName))
                        {
                            return renderer;
                        }
                    }
                }
            }

            Color foreground = renderer.getForeground();
            hsb = Color.RGBtoHSB(foreground.getRed(), foreground.getGreen(), foreground.getBlue(), hsb);
            hsb[2] = hsb[2] + ((255f - hsb[2])/2);
            renderer.setForeground(Color.getHSBColor(hsb[0], hsb[1], hsb[2]));
        }

        return renderer;
    }
}
