/**
 * 
 */
package icy.action;

import icy.canvas.IcyCanvas;
import icy.gui.viewer.Viewer;
import icy.image.lut.LUT;
import icy.main.Icy;
import icy.resource.ResourceUtil;
import icy.resource.icon.IcyIcon;
import icy.sequence.Sequence;
import icy.system.thread.ThreadUtil;
import icy.util.ClassUtil;

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import plugins.kernel.canvas.VtkCanvas;

/**
 * Viewer associated actions (Duplicate, externalize...)
 * 
 * @author Stephane
 */
public class ViewerActions
{
    public static IcyAbstractAction duplicateAction = new IcyAbstractAction("Duplicate view", new IcyIcon(
            ResourceUtil.ICON_PICTURE_COPY), "Duplicate view (no data duplication)", KeyEvent.VK_F2)
    {
        /**
         * 
         */
        private static final long serialVersionUID = -8660425976560135450L;

        @Override
        public boolean doAction(ActionEvent e)
        {
            ThreadUtil.invokeLater(new Runnable()
            {
                @Override
                public void run()
                {
                    // so it won't change during process
                    final Viewer viewer = Icy.getMainInterface().getActiveViewer();
                    final IcyCanvas canvas = (viewer != null) ? viewer.getCanvas() : null;
                    final Sequence sequence = (viewer != null) ? viewer.getSequence() : null;

                    if ((sequence != null) && (canvas != null))
                    {
                        final Viewer v = new Viewer(sequence);
                        final LUT oldLut = viewer.getLut();
                        final LUT newLut = v.getLut();

                        // copy LUT
                        if (canvas instanceof VtkCanvas)
                        {
                            // don't copy alpha colormap
                            newLut.setColorMaps(oldLut, false);
                            newLut.setScalers(oldLut);
                        }
                        else
                            newLut.copyFrom(oldLut);
                    }
                }
            });

            return true;
        }

        @Override
        public boolean isEnabled()
        {
            return super.isEnabled() && (Icy.getMainInterface().getActiveViewer() != null);
        }
    };

    /**
     * Return all actions of this class
     */
    public static List<IcyAbstractAction> getAllActions()
    {
        final List<IcyAbstractAction> result = new ArrayList<IcyAbstractAction>();

        for (Field field : ViewerActions.class.getFields())
        {
            final Class<?> type = field.getType();

            try
            {
                if (ClassUtil.isSubClass(type, IcyAbstractAction[].class))
                    result.addAll(Arrays.asList(((IcyAbstractAction[]) field.get(null))));
                else if (ClassUtil.isSubClass(type, IcyAbstractAction.class))
                    result.add((IcyAbstractAction) field.get(null));
            }
            catch (Exception e)
            {
                // ignore
            }
        }

        return result;
    }
}