package ij.plugin.filter;

import java.awt.*;
import java.awt.image.*;
import java.util.Vector;
import java.io.*;
import ij.*;
import ij.process.*;
import ij.io.*;
import ij.gui.*;
import ij.measure.*;

/** Saves the XY coordinates of the current ROI boundary. */
public class XYWriter implements PlugInFilter {
    ImagePlus imp;

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

    public void run(ImageProcessor ip) {
        try {
            saveXYCoordinates(imp);
        } catch (IllegalArgumentException e) {
            IJ.error("XYWriter", e.getMessage());
        }
    }

    public void saveXYCoordinates(ImagePlus imp) {
        Roi roi = imp.getRoi();
        if (roi==null)
            throw new IllegalArgumentException("ROI required");
        if (!(roi instanceof PolygonRoi))
            throw new IllegalArgumentException("Irregular area or line selection required");
        
        SaveDialog sd = new SaveDialog("Save Coordinates as Text...", imp.getTitle(), ".txt");
        String name = sd.getFileName();
        if (name == null)
            return;
        String directory = sd.getDirectory();
        PrintWriter pw = null;
        try {
            FileOutputStream fos = new FileOutputStream(directory+name);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            pw = new PrintWriter(bos);
        }
        catch (IOException e) {
            IJ.error("XYWriter", ""+e);
            return;
        }
        
        Rectangle r = roi.getBounds();
        PolygonRoi p = (PolygonRoi)roi;
        int n = p.getNCoordinates();
        int[] x = p.getXCoordinates();
        int[] y = p.getYCoordinates();
        
        Calibration cal = imp.getCalibration();
        String ls = System.getProperty("line.separator");
        boolean scaled = cal.scaled();
        for (int i=0; i<n; i++) {
            if (scaled)
                pw.print(IJ.d2s((r.x+x[i])*cal.pixelWidth) + "\t" + IJ.d2s((r.y+y[i])*cal.pixelHeight) + ls);
            else
                pw.print((r.x+x[i]) + "\t" + (r.y+y[i]) + ls);
        }
        pw.close();
    }

}