/**
 * 
 */
package plugins.tutorial.event;

import icy.gui.frame.IcyFrameAdapter;
import icy.gui.frame.IcyFrameEvent;
import icy.gui.frame.TitledFrame;
import icy.gui.main.ActiveSequenceListener;
import icy.gui.main.ActiveViewerListener;
import icy.gui.viewer.Viewer;
import icy.gui.viewer.ViewerEvent;
import icy.main.Icy;
import icy.plugin.abstract_.PluginActionable;
import icy.sequence.Sequence;
import icy.sequence.SequenceEvent;

import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;

/**
 * @author Stephane
 */
public class ActiveSequenceListenerTutorial extends PluginActionable
{
    @Override
    public void run()
    {
        // build a simple titled frame
        final TitledFrame frame = new TitledFrame("Active Sequence/Viewer Event logger", true, true);

        // we need a text area to put out event informations
        final JTextArea area = new JTextArea();
        area.setWrapStyleWord(true);
        area.setEditable(false);

        // better to have a scroll pane as many events can occurs
        final JScrollPane scrollPane = new JScrollPane(area);
        scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);

        // build the focused sequence event listener
        final ActiveSequenceListener focusedSequenceListener = new ActiveSequenceListener()
        {
            @Override
            public void sequenceActivated(Sequence sequence)
            {
                area.append("Sequence " + sequence + " activated\n");
                area.setCaretPosition(area.getDocument().getLength());
            }

            @Override
            public void sequenceDeactivated(Sequence sequence)
            {
                area.append("Sequence " + sequence + " deactivated\n");
                area.setCaretPosition(area.getDocument().getLength());
            }

            @Override
            public void activeSequenceChanged(SequenceEvent event)
            {
                area.append("Active sequence changed : [" + event.getType() + ", " + event.getSourceType() + "]\n");
                area.setCaretPosition(area.getDocument().getLength());
            };
        };

        // build the focused sequence event listener
        final ActiveViewerListener focusedViewerListener = new ActiveViewerListener()
        {
            @Override
            public void viewerActivated(Viewer viewer)
            {
                area.append("Viewer " + viewer + " activated\n");
                area.setCaretPosition(area.getDocument().getLength());
            }

            @Override
            public void viewerDeactivated(Viewer viewer)
            {
                area.append("Viewer " + viewer + " deactivated\n");
                area.setCaretPosition(area.getDocument().getLength());
            }

            @Override
            public void activeViewerChanged(ViewerEvent event)
            {
                area.append("Active viewer changed : [" + event.getType() + ", " + event.getDim() + "]\n");
                area.setCaretPosition(area.getDocument().getLength());
            }
        };

        // add the focused sequence event listener
        Icy.getMainInterface().addActiveSequenceListener(focusedSequenceListener);
        // add the focused viewer event listener
        Icy.getMainInterface().addActiveViewerListener(focusedViewerListener);

        frame.addFrameListener(new IcyFrameAdapter()
        {
            @Override
            public void icyFrameClosed(IcyFrameEvent e)
            {
                // remove the focused sequence listener to not maintain any reference on plugin
                // instance
                Icy.getMainInterface().removeActiveSequenceListener(focusedSequenceListener);
                // remove the focused viewer listener to not maintain any reference on plugin
                // instance
                Icy.getMainInterface().removeActiveViewerListener(focusedViewerListener);
            }
        });

        // add the scroll pane to the frame
        frame.getMainPanel().add(scrollPane);
        // set default size
        frame.setSize(700, 300);
        // add the frame to the interface
        addIcyFrame(frame);
        // center frame
        frame.center();
        // make it visible
        frame.setVisible(true);
        // get focus
        frame.requestFocus();
    }

}