/**
 * 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.auxiliary;

import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import org.inb.biomoby.MobyMessageContext;
import org.inb.biomoby.client.gui.AbstractMobyComponent;
import org.inb.biomoby.shared.message.AbstractMobyObject;

/**
 * @author Dmitry Repchevsky
 */

public class AssertedWrapperComponent extends AbstractMobyComponent
{
    private JLayeredPane layered;

    private JLabel label;
    private AbstractMobyComponent component;

    private final static String ICON_IMAGE =
"R0lGODlhIAAgAPcAAAQCBKSGHIyGnNzGJOzqXExCDOziLOzmRCwiFERCVPTyLBQKLGxiHKyqLOzW" +
"LMzKxOzqLOzyPHR6JBwSBHRiNAwORMS6dMTGzFxGPMS2NPTyROTKNCQWLIyOTGRWHOziPPT6LHRi" +
"LFw6NNzWPAwKJAwOPHRqHPTqPPTufEQ2DAwSLPz+zLy6PPT2VBQOBKSWHOziNPTyNPTqNBQSFFRG" +
"HCwiJGxyjGxiJPz2lPT6PPz6ROzSNAwGDKyqtOzKJExOVLSuPOTePPz+fCweHPz+tPTqVBQONPTe" +
"LPzqLPzyPHxqNMS+NOzyTGRWJPz+/JyWNAwSHFRSZAQGBIyOnOzmLDwqFPT2LLyyNNTW1NTOPKya" +
"PPTmPPT6NPTaRBQSNPz+3LzCPPTiNPT2NGxOHHxiJPz6rFROXBwSHKSSHNTGLPz6XFRKFPTuRAwO" +
"LHRmHMyqLPTuLPT2PBQOTGRWLBQWNOTmPNzWRHRqJPT2jOTmNPTuNFROHEQiLHRmJPz+lOTSPOTG" +
"LFQ+LDwyTKyiLLSiJIx2NNy+LKyaTJyOLPT2bPz6jBQOFPz+xNy6LNS2RGxeFLSyvNze1LSaNPz2" +
"fGxeJCwqHFRWNLSWRKymNHRmPPz6nLSyRPz6hPz2TOTKPMy+PCQiHExGJOzeNJSOpNzW3OzuTExC" +
"FPz+1Pz6TOTeRPz+5CQWBHxmLBQOJPz6VHxuNOTCLIyKnPT2RCQaLPTuPPTuVPzuLPz2PBwWHOTK" +
"LOTOPAwCBPTiLPzyLHRiHPTWLPTqLPTyPBQORPz6LBQSLPzyNPzqNDQiJHRiJPz6PBQGDFROVBwO" +
"NIRqNPTyTGxWJBQSHAwGBPTmLPz2LPz6NBwSNPz2NFxOXNzGLBQOLOzmPOTWRHxqJOzmNOzSPPTe" +
"NABM8ABk/wCD/wB8fwDMYADq7AASEgAAAAD/AABkAACDrAB8AAGgTABkZACDgwB8fBoAAAAAAAAA" +
"rAAAAAAw2gAAsgAAAAAAAAARAAAAAAAAAAAAABVxtgA56gDXRwBaACH5BAEAAE4ALAAAAAAgACAA" +
"Bwj/AJ0IHEiwoMGDCBMqXMiwocOHEA0KceUnUkSFp1AlU9PhwUWEnEAMSwbGEpaPBYnEsUKNWgQJ" +
"s1ASVCRmWMscLCpBkunkSwuWyXQkY3LDDM9EMcTYwbSpk44RZ0ahVKVBwa0C0aRcSSZrzjWUmvRY" +
"ibMLAAA3yW4BGXLhIiNncIZZm2AWza1keRhwuIhHzzSbHnjMSEPNGpcGCHY+/FIKwrRp1hDhOsZm" +
"GrVhdfZEgTipGxxrkDNUeZbk77QYSxbFcvilFhUFj61lSVHo1mNqCtiE+uGwzAFg03r1gqPt0SHb" +
"vR4HewKq7cIVBGDAES4czotPxWxpt6YgVZNqDHGc1wDWyxYw7cU+HMjeC0lyGVpq9FD4pYgB4eZt" +
"wSFkag157bYEtw0NyyiEgii89AIMMEgAQ4sLAEQTgHbGuNeLHoNAM0VC3zggDRIgImGLDKsog8Eb" +
"MiCRoi0KBnGMAAn94sMRNNLIiwySjHGJN2Hwwos0P/KyhQiCkIJQFxs0Akgu2DBpiCd/6JILIAMA" +
"YiUsOzjCBzPOHWSBEiH0YQIlmVDwCjLcsNKHL3f0wQoZzQSyAB1dHpRACSpAQUwJcrTSSjZGGEGC" +
"F21kA6gwFdjA06KMNuooQwEBADs=";

    public AssertedWrapperComponent(AbstractMobyComponent component)
    {
        this.component = component;

        setLayout(new BorderLayout());

        layered = new JLayeredPane();
        layered.add(component, JLayeredPane.DEFAULT_LAYER);

        add(layered, BorderLayout.CENTER);
    }

    public AssertedWrapperComponent(AbstractMobyComponent component, boolean isEqual)
    {
        this(component);

        if (!isEqual)
        {
            byte[] arr = Base64.decodeFast(ICON_IMAGE);

            ImageIcon icon;
            try
            {
                BufferedImage img = ImageIO.read(new ByteArrayInputStream(arr));

                BufferedImage image = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TRANSLUCENT);

                Graphics2D g = image.createGraphics();
                g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));

                g.drawImage(img, null, 0, 0);
                g.dispose();

                icon = new ImageIcon(image);
            }
            catch(Exception ex)
            {
                ex.printStackTrace();

                icon = new ImageIcon(arr);
            }

            label = new JLabel(icon);
            label.setBounds(3, 3, label.getPreferredSize().width, label.getPreferredSize().height);

            AbstractMobyObject object = component.getData();

            try
            {
                String type = MobyMessageContext.getMobyName(object);

                StringBuilder sb = new StringBuilder();
                sb.append("there was no component for '");
                sb.append(type);
                sb.append("' object found!");

                label.setToolTipText(sb.toString());
            }
            catch(Exception ex)
            {
                ex.printStackTrace();
            }

            layered.add(label, JLayeredPane.PALETTE_LAYER);
        }
    }

    @Override
    public AbstractMobyObject getData()
    {
        return component.getData();
    }

    @Override
    public void doLayout()
    {
        super.doLayout();

        component.setSize(getSize());
    }
}