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

import icy.gui.component.IcySlider;
import icy.gui.util.ComponentUtil;
import icy.gui.util.GuiUtil;
import icy.system.thread.ThreadUtil;

import java.awt.BorderLayout;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/**
 * @author Stephane
 */
public class ZNavigationPanel extends JPanel
{
    /**
     * 
     */
    private static final long serialVersionUID = -1839748578015800706L;

    final IcySlider slider;
    final JLabel topLabel;
    final JLabel bottomLabel;

    public ZNavigationPanel()
    {
        super();

        slider = new IcySlider(SwingConstants.VERTICAL);
        slider.setFocusable(false);
        slider.setMaximum(0);
        slider.setMinimum(0);
        slider.setToolTipText("Move cursor to navigate in Z dimension");
        slider.addChangeListener(new ChangeListener()
        {
            @Override
            public void stateChanged(ChangeEvent e)
            {
                ThreadUtil.invokeLater(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        topLabel.setText(Integer.toString(slider.getMaximum()));
                        bottomLabel.setText(Integer.toString(slider.getValue()));

                        validate();
                    }
                });
            }
        });
        ComponentUtil.setFixedWidth(slider, 22);

        topLabel = new JLabel("000");
        topLabel.setToolTipText("Z sequence size");
        bottomLabel = new JLabel("000");
        bottomLabel.setToolTipText("Z position");

        final JLabel zLabel = GuiUtil.createBoldLabel("Z");

        setBorder(BorderFactory.createTitledBorder("").getBorder());
        setLayout(new BorderLayout());

        add(GuiUtil.createCenteredLabel(topLabel), BorderLayout.NORTH);
        add(slider, BorderLayout.CENTER);
        add(GuiUtil.createPageBoxPanel(GuiUtil.createCenteredLabel(bottomLabel), Box.createVerticalStrut(8),
                GuiUtil.createCenteredLabel(zLabel)), BorderLayout.SOUTH);

        validate();
    }

    /**
     * @see icy.gui.component.IcySlider#setPaintLabels(boolean)
     */
    public void setPaintLabels(boolean b)
    {
        slider.setPaintLabels(b);
    }

    /**
     * @see icy.gui.component.IcySlider#setPaintTicks(boolean)
     */
    public void setPaintTicks(boolean b)
    {
        slider.setPaintTicks(b);
    }

    /**
     * @see javax.swing.JSlider#addChangeListener(javax.swing.event.ChangeListener)
     */
    public void addChangeListener(ChangeListener l)
    {
        slider.addChangeListener(l);
    }

    /**
     * @see javax.swing.JSlider#removeChangeListener(javax.swing.event.ChangeListener)
     */
    public void removeChangeListener(ChangeListener l)
    {
        slider.removeChangeListener(l);
    }

    /**
     * Remove all change listener
     */
    public void removeAllChangeListener()
    {
        for (ChangeListener l : slider.getListeners(ChangeListener.class))
            slider.removeChangeListener(l);
    }

    /**
     * @see javax.swing.JSlider#getValue()
     */
    public int getValue()
    {
        return slider.getValue();
    }

    /**
     * @param n
     * @see javax.swing.JSlider#setValue(int)
     */
    public void setValue(int n)
    {
        slider.setValue(n);
    }

    /**
     * @see javax.swing.JSlider#getMinimum()
     */
    public int getMinimum()
    {
        return slider.getMinimum();
    }

    /**
     * @see javax.swing.JSlider#setMinimum(int)
     */
    public void setMinimum(int minimum)
    {
        slider.setMinimum(minimum);
    }

    /**
     * @see javax.swing.JSlider#getMaximum()
     */
    public int getMaximum()
    {
        return slider.getMaximum();
    }

    /**
     * @see javax.swing.JSlider#setMaximum(int)
     */
    public void setMaximum(int maximum)
    {
        slider.setMaximum(maximum);
    }

    /**
     * @see javax.swing.JSlider#getPaintTicks()
     */
    public boolean getPaintTicks()
    {
        return slider.getPaintTicks();
    }

    /**
     * @see javax.swing.JSlider#getPaintTrack()
     */
    public boolean getPaintTrack()
    {
        return slider.getPaintTrack();
    }

    /**
     * @see javax.swing.JSlider#setPaintTrack(boolean)
     */
    public void setPaintTrack(boolean b)
    {
        slider.setPaintTrack(b);
    }

    /**
     * @see javax.swing.JSlider#getPaintLabels()
     */
    public boolean getPaintLabels()
    {
        return slider.getPaintLabels();
    }

}