package ij.plugin.filter;
import java.awt.*;
import ij.*;
import ij.process.*;
import ij.gui.*;

/** This plugin implements ImageJ's Image/Duplicate command. */
public class Duplicater implements PlugInFilter {
    ImagePlus imp;
    static boolean duplicateStack;

    public int setup(String arg, ImagePlus imp) {
        this.imp = imp;
        IJ.register(Duplicater.class);
        return DOES_ALL+NO_CHANGES;
    }

    public void run(ImageProcessor ip) {
        duplicate(imp);
    }

    public void duplicate(ImagePlus imp) {
        int stackSize = imp.getStackSize();
        String title = imp.getTitle();
        String newTitle = WindowManager.getUniqueName(title);
        if (!IJ.altKeyDown()||stackSize>1)
            newTitle = getString("Duplicate...", "Title: ", newTitle);
        if (newTitle==null)
            return;
        ImagePlus imp2;
        if (duplicateStack)
            imp2 = duplicateStack(imp, newTitle);
        else {
            ImageProcessor ip2 = imp.getProcessor().crop();
            imp2 = imp.createImagePlus();
            imp2.setProcessor(newTitle, ip2);
            String info = (String)imp.getProperty("Info");
            if (info!=null)
                imp2.setProperty("Info", info);
            if (stackSize>1) {
                ImageStack stack = imp.getStack();
                String label = stack.getSliceLabel(imp.getCurrentSlice());
                if (label!=null && label.indexOf('\n')>0)
                    imp2.setProperty("Info", label);
            }
        }
        //imp.killRoi();
        imp2.show();
    }
                
    public ImagePlus duplicateStack(ImagePlus imp, String newTitle) {
        Rectangle rect = null;
        Roi roi = imp.getRoi();
        if (roi!=null && roi.isArea())
            rect = roi.getBounds();
        int width = rect!=null?rect.width:imp.getWidth();
        int height = rect!=null?rect.height:imp.getHeight();
        ImageStack stack = imp.getStack();
        ImageStack stack2 = new ImageStack(width, height, imp.getProcessor().getColorModel());
        for (int i=1; i<=stack.getSize(); i++) {
            ImageProcessor ip2 = stack.getProcessor(i);
            ip2.setRoi(rect);
            ip2 = ip2.crop();
            stack2.addSlice(stack.getSliceLabel(i), ip2);
        }
        ImagePlus imp2 = imp.createImagePlus();
        imp2.setStack(newTitle, stack2);
        int[] dim = imp.getDimensions();
        imp2.setDimensions(dim[2], dim[3], dim[4]);
        return imp2;
    }
    
    String getString(String title, String prompt, String defaultString) {
        Frame win = imp.getWindow();
        int stackSize = imp.getStackSize();
        if (win==null)
            win = IJ.getInstance();
        GenericDialog gd = new GenericDialog(title, win);
        gd.addStringField(prompt, defaultString, 20);
        if (stackSize>1)
            gd.addCheckbox("Duplicate Entire Stack", duplicateStack);
        else
            duplicateStack = false;
        gd.showDialog();
        if (gd.wasCanceled())
            return null;
        title = gd.getNextString();
        if (stackSize>1)
            duplicateStack = gd.getNextBoolean();
        return title;
    }
    
}