/*
 * Copyright 2010-2015 Institut Pasteur.
 * 
 * This file is part of Icy.
 * 
 * Icy is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * Icy is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with Icy. If not, see <http://www.gnu.org/licenses/>.
 */
package icy.gui.component;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Insets;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.SwingConstants;

import icy.gui.util.ComponentUtil;
import icy.image.ImageUtil;
import icy.resource.ResourceUtil;

public class ThumbnailComponent extends JToggleButton
{
    /**
     * 
     */
    private static final long serialVersionUID = 6742578649112198581L;

    // GUI
    private ImageComponent imageComp;
    private JLabel titleLabel;
    private JLabel infosLabel;
    private JLabel infos2Label;
    private boolean shortDisplay;

    /**
     * Create the thumbnail.
     * 
     * @param selectable
     *        If true then the thumbnail component can be selected as a toggle button.
     */
    public ThumbnailComponent(boolean selectable)
    {
        super();

        shortDisplay = false;

        setMinimumSize(new Dimension(120, 12));
        setPreferredSize(new Dimension(160, 160));

        initialize();

        setEnabled(selectable);
    }

    private void initialize()
    {
        setMargin(new Insets(2, 2, 2, 2));
        setLayout(new BorderLayout());

        imageComp = new ImageComponent();
        add(imageComp, BorderLayout.CENTER);

        final JPanel southPanel = new JPanel();
        southPanel.setOpaque(false);
        GridBagLayout gbl_southPanel = new GridBagLayout();
        gbl_southPanel.columnWidths = new int[] {0, 0};
        gbl_southPanel.rowHeights = new int[] {0, 0, 0, 0};
        gbl_southPanel.columnWeights = new double[] {1.0, Double.MIN_VALUE};
        gbl_southPanel.rowWeights = new double[] {0.0, 0.0, 0.0, Double.MIN_VALUE};
        southPanel.setLayout(gbl_southPanel);

        titleLabel = new JLabel();
        GridBagConstraints gbc_titleLabel = new GridBagConstraints();
        gbc_titleLabel.fill = GridBagConstraints.HORIZONTAL;
        gbc_titleLabel.insets = new Insets(0, 0, 0, 0);
        gbc_titleLabel.gridx = 0;
        gbc_titleLabel.gridy = 0;
        southPanel.add(titleLabel, gbc_titleLabel);
        titleLabel.setHorizontalAlignment(SwingConstants.CENTER);
        titleLabel.setText(" ");
        titleLabel.setHorizontalTextPosition(SwingConstants.LEADING);
        ComponentUtil.setFontBold(titleLabel);
        infosLabel = new JLabel();
        GridBagConstraints gbc_infosLabel = new GridBagConstraints();
        gbc_infosLabel.fill = GridBagConstraints.HORIZONTAL;
        gbc_infosLabel.insets = new Insets(0, 0, 0, 0);
        gbc_infosLabel.gridx = 0;
        gbc_infosLabel.gridy = 1;
        southPanel.add(infosLabel, gbc_infosLabel);
        infosLabel.setHorizontalAlignment(SwingConstants.CENTER);
        infosLabel.setText(" ");
        infosLabel.setHorizontalTextPosition(SwingConstants.LEADING);
        ComponentUtil.setFontSize(infosLabel, 11);
        infos2Label = new JLabel();
        GridBagConstraints gbc_infos2Label = new GridBagConstraints();
        gbc_infos2Label.fill = GridBagConstraints.HORIZONTAL;
        gbc_infos2Label.gridx = 0;
        gbc_infos2Label.gridy = 2;
        southPanel.add(infos2Label, gbc_infos2Label);
        infos2Label.setHorizontalAlignment(SwingConstants.CENTER);
        infos2Label.setText(" ");
        infos2Label.setHorizontalTextPosition(SwingConstants.LEADING);
        ComponentUtil.setFontSize(infos2Label, 11);

        add(southPanel, BorderLayout.SOUTH);
    }

    public void setImage(Image img)
    {
        if (img == null)
        {
            imageComp.setImage(null);
            return;
        }

        Image image = img;

        // be sure image data are ready
        ImageUtil.waitImageReady(image);

        float ix = image.getWidth(null);
        float iy = image.getHeight(null);

        if ((ix <= 0f) || (iy <= 0f))
        {
            image = ResourceUtil.ICON_DELETE;
            ix = image.getWidth(null);
            iy = image.getHeight(null);
        }

        if ((imageComp.getWidth() != 0) && (imageComp.getHeight() != 0))
        {
            final float sx = imageComp.getWidth() / ix;
            final float sy = imageComp.getHeight() / iy;
            final float s = Math.min(sx, sy);
            final int w = (int) (ix * s);
            final int h = (int) (iy * s);

            if ((w > 0) && (h > 0))
                image = ImageUtil.scaleQuality(img, w, h);
        }

        imageComp.setImage(image);
    }

    /**
     * @return the shortDisplay property
     * @see #setShortDisplay(boolean)
     */
    public boolean getShortDisplay()
    {
        return shortDisplay;
    }

    /**
     * When set to true, only 'infos' is visible otherwise title, infos and infos2 are all visible
     */
    public void setShortDisplay(boolean value)
    {
        if (shortDisplay != value)
        {
            shortDisplay = value;

            titleLabel.setVisible(!value);
            infos2Label.setVisible(!value);
        }
    }

    public String getTitle()
    {
        return titleLabel.getText();
    }

    public String getInfos()
    {
        return infosLabel.getText();
    }

    public String getInfos2()
    {
        return infos2Label.getText();
    }

    public void setTitle(String value)
    {
        titleLabel.setText(value);
    }

    public void setInfos(String value)
    {
        infosLabel.setText(value);
    }

    public void setInfos2(String value)
    {
        infos2Label.setText(value);
    }
}