import java.applet.*;
import java.awt.*;
import java.awt.image.*;

public class IMPFF extends Canvas
{
    IMPFrame    frame;
    public  int width   =   320, 
                height  =   320;

    private String ampLabel = "0.1";
    private double[]    ffr;
    private double[]    ffi;
    private int fwidth;
    private double u=5.0;
    public final static int SHOW_REAL = 0;
    public final static int SHOW_IMAG = 1;
    private int show;
    private int ftype;
    
    public IMPFF(IMPFrame frame) {
        this.frame = frame;
        show = 0;
        fwidth=50;
    }
  
    public void paint(Graphics g) {
        g.clipRect(1, 1, width, height);
        g.setColor(Color.white);
        g.fillRect(1, 1, width, height);
        g.setColor(Color.black);
        g.drawRect(1, 1, width, height);

        int i;
        g.setColor(Color.black);
            g.drawLine(1, 160, 320, 160);
            g.drawLine(160, 1, 160, 320);

            g.drawLine(155, 5, 160, 1);
            g.drawLine(165, 5, 160, 1);

            g.drawLine(315, 155, 320, 160);
            g.drawLine(315, 165, 320, 160);
            
        for (i=-6; i<7; i+=2) {
            g.drawLine(160+25*i, 155, 160+25*i, 165);
            g.drawString(String.valueOf(12.5*i), 155+25*i, 175);
        }
        g.drawLine(150, 20, 170, 20);

        if (ftype==1)
            g.drawString(ampLabel, 110, 25);
        else
            g.drawString("1", 130, 25);

        g.drawString("u", 310, 140);

        g.setColor(Color.red);

        switch(show)
        {
        case SHOW_REAL:
            for (i=0; i<159; i++) 
                g.drawLine(2*i+1, 160-(int)(ffr[i]*140), 2*i+2, 160-(int)(ffr[i+1]*140));
            g.setColor(Color.black);
            g.drawString("Real part", 175, 15);
            break;
        case SHOW_IMAG:
            for (i=0; i<159; i++) 
                g.drawLine(2*i+1, 160-(int)(ffi[i]*140), 2*i+2, 160-(int)(ffi[i+1]*140));
            g.setColor(Color.black);
            g.drawString("Imaginary part", 175, 15);
            break;
        }
             
        g.setColor(Color.gray);
        if (u>80)
            g.drawString("freq = " + String.valueOf(u/2.0) + " kHz", 220, 100);
        else
            g.drawString("freq = " + String.valueOf(u/2.0) + " kHz", 160+(int)u, 100);
        
        g.drawLine(160+(int)u, 1, 160+(int)u, 320);
    }
    
    // The function
    
    public void setFF(int nb) {
        ftype = nb;
        ffr = new double[160];  //antagligen reala delen 
        ffi = new double[160];	//antagligen imaginara delen
        switch(nb)
        {
        case 1:
            for (int i=0; i<160; i++) {
                ffr[i] = (i==80 ? 1.0 : Math.sin(2*Math.PI/1000.0*fwidth*(i-80))/(2*Math.PI/1000.0*fwidth*(i-80)));
                ffi[i] = 0.0;
            }
            break;
        case 2:
            for (int i=0; i<160; i++) {
                ffr[i] = 0.0;
                double x = 2*Math.PI/1000.0*fwidth*(i-80);
                ffi[i] = -(i==80 ? 0.0 : 2*(Math.sin(x)-x*Math.cos(x))/(x*x));
            }
            break;
        case 3:
            for (int i=0; i<160; i++) {
                double x = 2*Math.PI/1000.0*fwidth*(i-80);
                ffr[i] =  Math.cos(x);
                ffi[i] =  -Math.sin(x);  //ändrat har, tagit bort minustecken
            }
            break;
        }
        repaint();
    }

    public void setWidth(int w) {
        fwidth = w;
        setFF(ftype);
    }
    
    public void setShow(int nb) {
        show = nb;
        repaint();
    }

    public boolean mouseDown(Event e, int x, int y) {
        return mouseDrag(e, x, y);
    }

    public boolean mouseDrag(Event e, int x, int y) {
        u = Math.max(-161, Math.min(160, x-161));
        frame.canvas2.setU(getU());
        frame.canvas3.setU(getU());
        repaint();
        return true;
    }

    public double getU() {
        return u/2.0;
    }
    
    public Dimension minimumSize()      { return new Dimension(width, height); }
    public Dimension preferredSize()    { return minimumSize(); }

    public void setLabel (double y){
		ampLabel = Double.toString(y);
    repaint();
    }

}
