/**
 * 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.client.gui.ontology;

import java.awt.AWTEvent;
import java.awt.Color;
import java.awt.event.MouseEvent;
import javax.swing.JComponent;
import javax.swing.OverlayLayout;
import javax.swing.SwingUtilities;
import org.inb.biomoby.client.gui.auxiliary.AbstractDescriptionMobyComponent;
import org.inb.biomoby.client.gui.AbstractMobyComponent;
import org.inb.biomoby.client.gui.IDynamicComponent;
import org.inb.biomoby.client.gui.IDynamicComponent.MobyComponentListener;
import org.inb.biomoby.client.gui.ITransformable;
import org.inb.biomoby.client.gui.ISequenceCoordinateTransformer;
import org.inb.biomoby.client.gui.ISequenceDependent;
import org.inb.biomoby.client.gui.ontology.CommentedAASubsequenceComponent.CommentedAASubsequenceListener;
import org.inb.biomoby.client.gui.ontology.GenericSequenceComponent.GenericSequenceListener;
import org.inb.biomoby.client.gui.ontology.GenericSubsequenceComponent.GenericSubsequence;
import org.inb.biomoby.shared.message.AbstractMobyObject;
import org.inb.biomoby.shared.ontology.CommentedAASubsequence;
import org.inb.biomoby.client.gui.swing.RoundedMultilineLabel;

/**
 * @author Dmitry Repchevsky
 */

public class CommentedAASubsequenceComponent extends AbstractMobyComponent
        implements IDynamicComponent<CommentedAASubsequenceListener>,
                   ISequenceDependent,
                   ITransformable
{
    private AbstractDescriptionMobyComponent description;
    private GenericSubsequenceComponent genericSubequencePanel;
    
    private RoundedMultilineLabel label;
    
    private CommentedAASubsequenceComponent(GenericSubsequenceComponent genericSubequencePanel)
    {
        this.genericSubequencePanel = genericSubequencePanel;
        
        setLayout(new OverlayLayout(this));
//        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        
        description = new AbstractDescriptionMobyComponent()
        {
            @Override
            protected JComponent getPopup()
            {
                return label;
            }

            @Override
            public AbstractMobyObject getData()
            {
                return null;
            }
        };
        
        description.setOpaque(false);
        
        add(description);
        add(genericSubequencePanel);
        
        this.enableEvents(AWTEvent. MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK);
    }

    public CommentedAASubsequenceComponent()
    {
        this(new GenericSubsequenceComponent());
    }
    
    public CommentedAASubsequenceComponent(CommentedAASubsequence sequence)
    {
        this(new GenericSubsequenceComponent(sequence));

        GenericSubsequence subsequence = genericSubequencePanel.getCharSequence();
        
        StringBuilder sb = new StringBuilder();
        sb.append("start: ").append(subsequence.start).append(", end: ").append(subsequence.end);
        
        label = new RoundedMultilineLabel(sb.toString());
    }    

    public CommentedAASubsequence getData()
    {
        return (CommentedAASubsequence)genericSubequencePanel.getData();
    }

    @Override
    protected void processMouseEvent(MouseEvent e)
    {
        genericSubequencePanel.dispatchEvent(SwingUtilities.convertMouseEvent(this, e, genericSubequencePanel));
    }

    @Override
    protected void processMouseMotionEvent(MouseEvent e)
    {
        genericSubequencePanel.dispatchEvent(SwingUtilities.convertMouseEvent(this, e, genericSubequencePanel));
    }

    public static interface CommentedAASubsequenceListener extends GenericSequenceListener {}
    
    @Override
    public void setPosition(int position)
    {
        genericSubequencePanel.setPosition(position);
    }

    @Override
    public void setSequenceVisible(boolean isVisible)
    {
        genericSubequencePanel.setVisible(isVisible);
    }
    
    @Override
    public ISequenceCoordinateTransformer getTransformer()
    {
        return genericSubequencePanel.getTransformer();
    }

    @Override
    public void setTransformer(ISequenceCoordinateTransformer transformer)
    {
        genericSubequencePanel.setTransformer(transformer);
    }
    
    @Override
    public void addListener(MobyComponentListener listener)
    {
        genericSubequencePanel.addListener(listener);
    }

    @Override
    public void removeListener(MobyComponentListener listener)
    {
        genericSubequencePanel.removeListener(listener);
    }

    public void setFontStyle(int style)
    {
    }
    
    @Override
    public void setOpaque(boolean isOpaque)
    {
        super.setOpaque(isOpaque);
        
        if (genericSubequencePanel != null)
        {
            genericSubequencePanel.setOpaque(isOpaque);
        }
        
        if (label != null)
        {
            label.setOpaque(isOpaque);
        }
    }

    @Override
    public void setBackground(Color bg)
    {
        super.setBackground(bg);
        
        if (genericSubequencePanel != null)
        {
            genericSubequencePanel.setBackground(bg);
        }
        
        if (label != null)
        {
            label.setBackground(bg);
        }
    }
}
