package ij.plugin.frame;
import java.awt.*;
import java.awt.event.*;
import ij.*;
import ij.plugin.*;
import ij.gui.*;
import ij.process.*;

/** Implements ImageJ's Paste Control window. */
public class PasteController extends PlugInFrame implements PlugIn, ItemListener {

    private Panel panel;
    private Choice pasteMode;
    private static Frame instance;
    
    public PasteController() {
        super("Paste Control");
        if (instance!=null) {
            WindowManager.toFront(instance);
            return;
        }
        WindowManager.addWindow(this);
        instance = this;
        IJ.register(PasteController.class);
        setLayout(new FlowLayout(FlowLayout.CENTER, 2, 5));
        
        add(new Label(" Transfer Mode:"));
        pasteMode = new Choice();
        pasteMode.addItem("Copy");
        pasteMode.addItem("Blend");
        pasteMode.addItem("Difference");
        pasteMode.addItem("Transparent-white");
        pasteMode.addItem("Transparent-zero");
        pasteMode.addItem("AND");
        pasteMode.addItem("OR");
        pasteMode.addItem("XOR");
        pasteMode.addItem("Add");
        pasteMode.addItem("Subtract");
        pasteMode.addItem("Multiply");
        pasteMode.addItem("Divide");
        pasteMode.addItem("Min");
        pasteMode.addItem("Max");
        pasteMode.select("Copy");
        pasteMode.addItemListener(this);
        add(pasteMode);
        Roi.setPasteMode(Blitter.COPY);

        GUI.scale(this);
        pack();
        GUI.centerOnImageJScreen(this);
        setResizable(false);
        show();
    }
    
    public void itemStateChanged(ItemEvent e) {
        int index = pasteMode.getSelectedIndex();
        int mode = Blitter.COPY;
        switch (index) {
            case 0: mode = Blitter.COPY; break;
            case 1: mode = Blitter.AVERAGE; break;
            case 2: mode = Blitter.DIFFERENCE; break;
            case 3: mode = Blitter.COPY_TRANSPARENT; break;
            case 4: mode = Blitter.COPY_ZERO_TRANSPARENT; break;
            case 5: mode = Blitter.AND; break;
            case 6: mode = Blitter.OR; break;
            case 7: mode = Blitter.XOR; break;
            case 8: mode = Blitter.ADD; break;
            case 9: mode = Blitter.SUBTRACT; break;
            case 10: mode = Blitter.MULTIPLY; break;
            case 11: mode = Blitter.DIVIDE; break;
            case 12: mode = Blitter.MIN; break;
            case 13: mode = Blitter.MAX; break;
        }
        Roi.setPasteMode(mode);
        if (Recorder.record)
            Recorder.record("setPasteMode", pasteMode.getSelectedItem());
        ImagePlus imp = WindowManager.getCurrentImage();
    }
    
    public void close() {
        super.close();
        instance = null;
    }
    
}