/**
 * 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.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import javax.swing.JToolTip;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.tree.DefaultMutableTreeNode;
import org.inb.biomoby.shared.registry.AbstractEntity;

/**
 * BioMoby entity (DataType, Service, Namespace...) tree renderer class.
 *
 * @author Dmitry Repchevsky
 */

public class EntityTreeCellRenderer extends AbstractTreeCellRenderer
{
    private final static int MAX_WIDTH = 300;

    @Override
    public AbstractTreeCellRenderer getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)
    {
        AbstractTreeCellRenderer renderer = super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);

        if (value instanceof DefaultMutableTreeNode)
        {
            DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;

            Object object = node.getUserObject();

            if (object == null)
            {
                setText("");
            }
            else if (object instanceof AbstractEntity)
            {
                AbstractEntity entity = (AbstractEntity)object;
                
                setText(entity.getName());
                setToolTipText(tree, entity.getDescription());
            }
            else
            {
                setText(object.toString());
            }
        }

        return renderer;
    }

    private void setToolTipText(JTree tree, String s)
    {
        if (s != null && s.length() > 0)
        {
            JToolTip toolTip = tree.createToolTip();
            toolTip.setTipText(s);

            if (toolTip.getMinimumSize().width < MAX_WIDTH)
            {
                setToolTipText(s);
            }
            else
            {
                Color background = toolTip.getBackground();
                if (background == null)
                {
                    background = UIManager.getLookAndFeel().getDefaults().getColor("ToolTip.background");

                    if (background == null)
                    {
                        background = Color.WHITE;
                    }
                }

                Color foreground = toolTip.getForeground();
                if (foreground == null)
                {
                    foreground = UIManager.getLookAndFeel().getDefaults().getColor("ToolTip.foreground");

                    if (foreground == null)
                    {
                        foreground = Color.BLACK;
                    }
                }

                StringBuilder sb = new StringBuilder();
                sb.append("<html>");
                sb.append("<div style='width: ").append(MAX_WIDTH).append("px;'>");
                sb.append("<font style='font-weight: normal;");
                sb.append("background-color: rgb(");
                sb.append(background.getRed()).append(",").append(background.getGreen()).append(",").append(background.getBlue()).append(");");
                sb.append("color: rgb(");
                sb.append(foreground.getRed()).append(",").append(foreground.getGreen()).append(",").append(foreground.getBlue()).append(");");
                sb.append("'>");

                BufferedReader reader = new BufferedReader(new StringReader(s));

                try
                {
                    String line;
                    while((line = reader.readLine()) != null)
                    {
                        sb.append(line);
                        sb.append("<br/>");
                    }
                }
                catch(IOException ex) {}

                sb.append("</font>");
                sb.append("</div>");
                sb.append("</html>");

                setToolTipText(sb.toString());
            }
        }
    }
}
