package icy.gui.lut;

import icy.gui.component.NumberTextField;
import icy.gui.dialog.ActionDialog;
import icy.gui.dialog.MessageDialog;
import icy.image.lut.LUT.LUTChannel;
import icy.main.Icy;
import icy.sequence.Sequence;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JLabel;

public class ScalerBoundsSettingDialog extends ActionDialog
{
    final LUTChannel lutChannel;

    NumberTextField rangeMinField;
    NumberTextField rangeMaxField;
    NumberTextField lowBoundField;
    NumberTextField highBoundField;
    private JButton defaultBtn;
    private JLabel lblMinimum;
    private JLabel lblMaximum;

    public ScalerBoundsSettingDialog(LUTChannel lutChannel)
    {
        super("Histogram range");

        this.lutChannel = lutChannel;

        initialize();

        rangeMinField.setNumericValue(lutChannel.getMinBound());
        rangeMaxField.setNumericValue(lutChannel.getMaxBound());
        lowBoundField.setNumericValue(lutChannel.getMin());
        highBoundField.setNumericValue(lutChannel.getMax());

        defaultBtn.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                final LUTChannel lc = ScalerBoundsSettingDialog.this.lutChannel;

                // use active sequence
                final Sequence sequence = Icy.getMainInterface().getActiveSequence();
                if (sequence != null)
                {
                    final int ch = lc.getChannel();

                    if (ch < sequence.getSizeC())
                    {
                        rangeMinField.setNumericValue(sequence.getChannelTypeMin(ch));
                        rangeMaxField.setNumericValue(sequence.getChannelTypeMax(ch));
                        lowBoundField.setNumericValue(sequence.getChannelMin(ch));
                        highBoundField.setNumericValue(sequence.getChannelMax(ch));
                    }
                }
            }
        });

        setOkAction(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                final double rangeMin = rangeMinField.getNumericValue();
                final double rangeMax = rangeMaxField.getNumericValue();
                final double lowBound = lowBoundField.getNumericValue();
                final double highBound = highBoundField.getNumericValue();

                if ((rangeMin >= rangeMax) || (lowBound >= highBound))
                {
                    MessageDialog.showDialog("Invalids settings",
                            "The maximum range value should be above the minimum range value",
                            MessageDialog.ERROR_MESSAGE);
                    return;
                }
                if ((lowBound < rangeMin) || (highBound > rangeMax))
                {
                    MessageDialog.showDialog("Invalids settings", "The view range should be inside the full range",
                            MessageDialog.ERROR_MESSAGE);
                    return;
                }

                final LUTChannel lc = ScalerBoundsSettingDialog.this.lutChannel;

                lc.setMinBound(rangeMin);
                lc.setMaxBound(rangeMax);
                lc.setMin(lowBound);
                lc.setMax(highBound);

                dispose();
            }
        });

        setCloseAfterAction(false);
    }

    private void initialize()
    {
        GridBagLayout gridBagLayout = new GridBagLayout();
        gridBagLayout.columnWidths = new int[] {60, 0, 0, 10, 0};
        gridBagLayout.rowHeights = new int[] {0, 23, 0, 0};
        gridBagLayout.columnWeights = new double[] {0.0, 1.0, 1.0, 0.0, Double.MIN_VALUE};
        gridBagLayout.rowWeights = new double[] {0.0, 0.0, 0.0, Double.MIN_VALUE};
        mainPanel.setLayout(gridBagLayout);

        lblMinimum = new JLabel("Minimum");
        GridBagConstraints gbc_lblMinimum = new GridBagConstraints();
        gbc_lblMinimum.insets = new Insets(0, 0, 5, 5);
        gbc_lblMinimum.gridx = 1;
        gbc_lblMinimum.gridy = 0;
        mainPanel.add(lblMinimum, gbc_lblMinimum);

        lblMaximum = new JLabel("Maximum");
        GridBagConstraints gbc_lblMaximum = new GridBagConstraints();
        gbc_lblMaximum.insets = new Insets(0, 0, 5, 5);
        gbc_lblMaximum.gridx = 2;
        gbc_lblMaximum.gridy = 0;
        mainPanel.add(lblMaximum, gbc_lblMaximum);

        final JLabel lblRangeMin = new JLabel("Full range");
        GridBagConstraints gbc_lblRangeMin = new GridBagConstraints();
        gbc_lblRangeMin.anchor = GridBagConstraints.EAST;
        gbc_lblRangeMin.insets = new Insets(0, 0, 5, 5);
        gbc_lblRangeMin.gridx = 0;
        gbc_lblRangeMin.gridy = 1;
        mainPanel.add(lblRangeMin, gbc_lblRangeMin);

        rangeMinField = new NumberTextField();
        GridBagConstraints gbc_rangeMinField = new GridBagConstraints();
        gbc_rangeMinField.insets = new Insets(0, 0, 5, 5);
        gbc_rangeMinField.fill = GridBagConstraints.HORIZONTAL;
        gbc_rangeMinField.gridx = 1;
        gbc_rangeMinField.gridy = 1;
        mainPanel.add(rangeMinField, gbc_rangeMinField);
        rangeMinField.setColumns(10);

        rangeMaxField = new NumberTextField();
        GridBagConstraints gbc_rangeMaxField = new GridBagConstraints();
        gbc_rangeMaxField.insets = new Insets(0, 0, 5, 5);
        gbc_rangeMaxField.fill = GridBagConstraints.HORIZONTAL;
        gbc_rangeMaxField.gridx = 2;
        gbc_rangeMaxField.gridy = 1;
        mainPanel.add(rangeMaxField, gbc_rangeMaxField);
        rangeMaxField.setColumns(10);

        final JLabel lblBoundMin = new JLabel("View range");
        GridBagConstraints gbc_lblBoundMin = new GridBagConstraints();
        gbc_lblBoundMin.anchor = GridBagConstraints.EAST;
        gbc_lblBoundMin.insets = new Insets(0, 0, 0, 5);
        gbc_lblBoundMin.gridx = 0;
        gbc_lblBoundMin.gridy = 2;
        mainPanel.add(lblBoundMin, gbc_lblBoundMin);

        lowBoundField = new NumberTextField();
        GridBagConstraints gbc_lowBoundField = new GridBagConstraints();
        gbc_lowBoundField.insets = new Insets(0, 0, 0, 5);
        gbc_lowBoundField.fill = GridBagConstraints.HORIZONTAL;
        gbc_lowBoundField.gridx = 1;
        gbc_lowBoundField.gridy = 2;
        mainPanel.add(lowBoundField, gbc_lowBoundField);
        lowBoundField.setColumns(10);

        highBoundField = new NumberTextField();
        GridBagConstraints gbc_highBoundField = new GridBagConstraints();
        gbc_highBoundField.insets = new Insets(0, 0, 0, 5);
        gbc_highBoundField.fill = GridBagConstraints.HORIZONTAL;
        gbc_highBoundField.gridx = 2;
        gbc_highBoundField.gridy = 2;
        mainPanel.add(highBoundField, gbc_highBoundField);
        highBoundField.setColumns(10);

        defaultBtn = new JButton("Default");
        GridBagConstraints gbc_defaultBtn = new GridBagConstraints();
        gbc_defaultBtn.anchor = GridBagConstraints.EAST;
        gbc_defaultBtn.insets = new Insets(0, 0, 0, 5);
        gbc_defaultBtn.gridx = 1;
        gbc_defaultBtn.gridy = 0;
        buttonPanel.add(defaultBtn, gbc_defaultBtn);
    }

}