// Instructions.java

import java.io.*;
import java.awt.*;
import java.awt.geom.GeneralPath;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.IOException;

public class Instructions extends Panel {
    
    //private static final Color bgcolor = new Color(236,236,236);
    private static final Color bgcolor = Color.white;
    
    public TextField epsilon;
    private Paint paint;
    
    private Image im;
    private Graphics buf;
    private BufferedImage figure;

    //Mod1State state;
    public Button bupdate;
    NewGuide_State state;
    
    private BufferedImage bullet, less_or_equal;
  
    public Instructions(NewGuide_State state){
	super();
        this.state = state;
	setLayout(null);

	getImages();
	setBackground(bgcolor);
	bupdate = new Button("CLOSE");
        bupdate.setBackground(new Color(240,240,255));
        bupdate.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
	add(bupdate);
        
        int buttonx = 65*state.s900/100;
        int buttony = 75*state.s300/100;
        int buttonwide = state.s70;
        int buttonheight = state.s27;
        
        bupdate.setBounds(buttonx,buttony,buttonwide,buttonheight);	
        Panel ps7 = new Panel();
	    ps7.setBackground(Color.lightGray);
	    add(ps7);
	    ps7.setBounds(buttonx-1,buttony-1,buttonwide+2,buttonheight+2);
	    
	Panel ps8 = new Panel();
	    ps8.setBackground(Color.black);
	    add(ps8);
	    ps8.setBounds(buttonx-2,buttony-2,buttonwide+4,buttonheight+4);	
    }


    private void getImages() {
        // read in the bullet image, because CHEERPJ does not render this
	//  symbol in any font!  (java to javascript converter)
        try {
            //bullet = ImageIO.read(getClass().getResource("bullet.png"));
	    BufferedImage img =
		ImageIO.read(getClass().getResource("bullet.png"));
	    int targetWidth = (int) (state.sfactor * img.getWidth());
	    int targetHeight = (int) (state.sfactor * img.getHeight());
	    bullet =
		new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
	    Graphics2D graphics2D = bullet.createGraphics();
	    graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
					RenderingHints.VALUE_INTERPOLATION_BILINEAR);
	    graphics2D.drawImage(img, 0, 0, targetWidth, targetHeight, 0, 0,
				 img.getWidth(), img.getHeight(), null);
	    graphics2D.dispose();

	    img = ImageIO.read(getClass().getResource("less_or_equal.png"));
	    targetWidth = (int) (state.sfactor * img.getWidth());
	    targetHeight = (int) (state.sfactor * img.getHeight());
	    less_or_equal =
		new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
	    graphics2D = less_or_equal.createGraphics();
	    graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
					RenderingHints.VALUE_INTERPOLATION_BILINEAR);
	    graphics2D.drawImage(img, 0, 0, targetWidth, targetHeight, 0, 0,
				 img.getWidth(), img.getHeight(), null);
	    graphics2D.dispose();	    

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public void paint(Graphics g){
            
	    if(im == null){
		im = createImage(getSize().width,getSize().height);
		buf = im.getGraphics();
		drawCanvas(buf);
	    }
	    else{
		drawCanvas(buf);
	    }
	    g.drawImage(im,0,0,null);
    }
	
	//Addition to reduce flicker new routine
    public void update(Graphics g){		// added to avoid clearing
            paint(g);
    }
    
    public void clear(){
	    this.getGraphics().clearRect(0,0,getSize().width,getSize().height);
	    repaint();
    }
    
    public void drawCanvas(Graphics g){
        FontMetrics fm;
        Graphics2D g2d = (Graphics2D)g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);        
        g.clearRect(0,0,getSize().width-1,getSize().height-1);

        g.setColor(Color.black);
        g.setFont(new Font("SanSerif",Font.BOLD,state.font14));
        
        try {
            figure = ImageIO.read(getClass().getResource("mod9.7.gif"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        g.drawString("Instructions", state.s20,state.s25);
        
        String s;
        int nextX;
        int xstart = state.s20;

        //g.drawImage(figure,state.s700+state.s50,state.s50,this);

        g.setColor(Color.red);
        g.setFont(new Font("SanSerif",Font.BOLD,state.font15));

        g.drawString("Assumptions", state.s20,state.s50);
        g.setColor(Color.black);
        g.setFont(new Font("SanSerif",Font.PLAIN,state.font14));
        int deltaY = state.s17;
        //ASSUMPTIONS
        //s = "\u2022 array elements are identical";
        //nextX = STR.displayString(s,g,state.s20,state.s70);
	g.drawImage(bullet,state.s20,state.s70-bullet.getHeight(),this);
        s = " array elements are identical";
        nextX = STR.displayString(s,g,state.s20+bullet.getWidth(),state.s70);
	
        //s = "\u2022 array elements fed with equal amplitudes and phases";
        //nextX = STR.displayString(s,g,state.s20,state.s70+deltaY);
	g.drawImage(bullet,state.s20,state.s70+deltaY-bullet.getHeight(),this);
        s = " array elements fed with equal amplitudes and phases";
        nextX = STR.displayString(s,g,state.s20+bullet.getWidth(),state.s70+deltaY);
	
        //s = "\u2022 array elements equally spaced";
        //nextX = STR.displayString(s,g,state.s20,state.s70+2*deltaY);
	g.drawImage(bullet,state.s20,state.s70+2*deltaY-bullet.getHeight(),this);
        s = " array elements equally spaced";
        nextX = STR.displayString(s,g,state.s20+bullet.getWidth(),state.s70+2*deltaY);

        g.setColor(Color.red);
        g.setFont(new Font("SanSerif",Font.BOLD,state.font15));

        int newY = state.s70+3*deltaY+state.s5;
        g.drawString("Input",state.s20,newY);
        g.setColor(Color.black);
        g.setFont(new Font("SanSerif",Font.PLAIN,state.font14));
        
        //INPUT
        newY += state.s23;
        //s = "\u2022 Number of array elements "+STR.ITAL+"N"+STR.ENDITAL+
        //    " (1 \u2264 "+STR.ITAL+"N"+STR.ENDITAL+" \u2264 6)";
        //nextX = STR.displayString(s,g,state.s20,newY);
	g.drawImage(bullet,state.s20,newY-bullet.getHeight(),this);
	s = " Number of array elements "+STR.ITAL+"N"+STR.ENDITAL+" (1";
	nextX = STR.displayString(s,g,state.s20+bullet.getWidth(),newY);		     
	MaestroG.ImgTxtImgTxt(less_or_equal,"N",less_or_equal,
			 " 6)",g,state.font14,nextX,newY,this);
        
        //s = "\u2022 Type of element";
        //nextX = STR.displayString(s,g,state.s20,newY+deltaY);
	g.drawImage(bullet,state.s20,newY+deltaY-bullet.getHeight(),this);
        s = " Type of element";
        nextX = STR.displayString(s,g,state.s20+bullet.getWidth(),newY+deltaY);
        
        s = "      - Dipole with length \u03bb/2, or";
        nextX = STR.displayString(s,g,state.s20,newY+2*deltaY);
        
        s = "      - Dish with diameter = 2\u03bb.";
        nextX = STR.displayString(s,g,state.s20,newY+3*deltaY);
        
        //s = "\u2022 Interelement spacing (0.25\u03bb \u2264 "+
        //    STR.ITAL+"d"+STR.ENDITAL+" \u2264 \u03bb)";
        //nextX  = STR.displayString(s,g,state.s20,newY+4*deltaY);
	g.drawImage(bullet,state.s20,newY+4*deltaY-bullet.getHeight(),this);
	s = " Interelement spacing (0.25\u03bb";
	nextX = STR.displayString(s,g,state.s20+bullet.getWidth(),newY+4*deltaY);
	MaestroG.ImgTxtImgTxt(less_or_equal,"d",less_or_equal,
			 "\u03bb)",g,state.font14,nextX,newY+4*deltaY,this);

       //OUTPUT
        g.setColor(Color.red);
        g.setFont(new Font("SanSerif",Font.BOLD,state.font15));
        //newY = newY+6*deltaY+state.s40;
        
        newY = state.s50;
        deltaY = state.s22;
        
        g.drawString("Displayed Information", state.s400+state.s25,newY);
        
        g.setColor(Color.black);
        g.setFont(new Font("SanSerif",Font.PLAIN,state.font14));
        
        newY += state.s20;
        //s = "\u2022 Element radiation pattern F"+STR.SUB+"e"+STR.ENDSUB+
        //    "(\u03b8)";
        //nextX = STR.displayString(s,g,state.s400+state.s25,newY);
	g.drawImage(bullet,state.s400+state.s25,newY-bullet.getHeight(),this);
        s = " Element radiation pattern F"+STR.SUB+"e"+STR.ENDSUB+
            "(\u03b8)";
        nextX = STR.displayString(s,g,state.s400+state.s25+bullet.getWidth(),newY);	
        
        //s = "\u2022 Array Pattern F"+STR.SUB+"a"+STR.ENDSUB+"(\u03b8)";
        //nextX = STR.displayString(s,g,state.s400+state.s25,newY+deltaY);
	g.drawImage(bullet,state.s400+state.s25,newY+deltaY-bullet.getHeight(),this);
        s = " Array Pattern F"+STR.SUB+"a"+STR.ENDSUB+"(\u03b8)";
        nextX = STR.displayString(s,g,state.s400+state.s25+bullet.getWidth(),newY+deltaY);
        
        //s = "\u2022 Antenna array pattern F(\u03b8) = F"+
        //    STR.SUB+"e"+STR.ENDSUB+"(\u03b8)F"+
        //    STR.SUB+"a"+STR.ENDSUB+"(\u03b8)";
        //nextX = STR.displayString(s,g,state.s400+state.s25,newY+2*deltaY);
	g.drawImage(bullet,state.s400+state.s25,newY+2*deltaY-bullet.getHeight(),this);
        s = " Antenna array pattern F(\u03b8) = F"+
            STR.SUB+"e"+STR.ENDSUB+"(\u03b8)F"+
            STR.SUB+"a"+STR.ENDSUB+"(\u03b8)";
        nextX = STR.displayString(s,g,state.s400+state.s25+bullet.getWidth(),newY+2*deltaY);
        
        //s = "\u2022 Associated directivities and beamwidths";
        //nextX = STR.displayString(s,g,state.s400+state.s25,newY+3*deltaY);
	g.drawImage(bullet,state.s400+state.s25,newY+3*deltaY-bullet.getHeight(),this);
        s = " Associated directivities and beamwidths";
        nextX = STR.displayString(s,g,state.s400+state.s25+bullet.getWidth(),newY+3*deltaY);
        
        //======================================================================
        int thick = state.s1;
        int thickA = state.s1;
        int x1 = state.s800+state.s70; int y1 = state.s50;
        int x2 = x1 - state.s10; int y2 = y1 + state.s10;
        int x3 = x2 - state.s15; int y3 = y2;
        int x4 = x3; int y4 = y3 +state.s5;
        int x5 = x4 + state.s15; int y5 = y4;
        int x6 = x5 + state.s10; int y6 = y5 + state.s10;
        
        g2d.setStroke(new BasicStroke(thick,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
        g2d.setPaint(Color.black);
        GeneralPath s1 = new GeneralPath();
        s1.moveTo((float)(x1),(float)y1);
        s1.lineTo((float)(x2),(float)(y2));
        s1.lineTo((float)(x3),(float)(y3));
        s1.lineTo((float)(x4),(float)(y4));
        s1.lineTo((float)(x5),(float)(y5));
        s1.lineTo((float)(x6),(float)(y6));
        
        //s1.closePath();
        //g2d.fill(s1);
        g2d.draw(s1);
        
        int moveY2 = state.s30;
        GeneralPath s2 = new GeneralPath();
        s2.moveTo((float)(x1),(float)y1+moveY2);
        s2.lineTo((float)(x2),(float)(y2+moveY2));
        s2.lineTo((float)(x3),(float)(y3+moveY2));
        s2.lineTo((float)(x4),(float)(y4+moveY2));
        s2.lineTo((float)(x5),(float)(y5+moveY2));
        s2.lineTo((float)(x6),(float)(y6+moveY2));
        
        //s1.closePath();
        //g2d.fill(s2);
        g2d.draw(s2);
        
        int moveY3 = state.s60;
        GeneralPath s3 = new GeneralPath();
        s3.moveTo((float)(x1),(float)y1+moveY3);
        s3.lineTo((float)(x2),(float)(y2+moveY3));
        s3.lineTo((float)(x3),(float)(y3+moveY3));
        s3.lineTo((float)(x4),(float)(y4+moveY3));
        s3.lineTo((float)(x5),(float)(y5+moveY3));
        s3.lineTo((float)(x6),(float)(y6+moveY3));
        
        //s1.closePath();
        //g2d.fill(s3);
        g2d.draw(s3);
        
        int moveY4 = state.s90;
        GeneralPath s4 = new GeneralPath();
        s4.moveTo((float)(x1),(float)y1+moveY4);
        s4.lineTo((float)(x2),(float)(y2+moveY4));
        s4.lineTo((float)(x3),(float)(y3+moveY4));
        s4.lineTo((float)(x4),(float)(y4+moveY4));
        s4.lineTo((float)(x5),(float)(y5+moveY4));
        s4.lineTo((float)(x6),(float)(y6+moveY4));
        
        //s1.closePath();
        //g2d.fill(s4);
        g2d.draw(s4);
        
        int moveY5 = state.s120;
        GeneralPath s5 = new GeneralPath();
        s5.moveTo((float)(x1),(float)y1+moveY5);
        s5.lineTo((float)(x2),(float)(y2+moveY5));
        s5.lineTo((float)(x3),(float)(y3+moveY5));
        s5.lineTo((float)(x4),(float)(y4+moveY5));
        s5.lineTo((float)(x5),(float)(y5+moveY5));
        s5.lineTo((float)(x6),(float)(y6+moveY5));
        
        //s1.closePath();
        //g2d.fill(s5);
        g2d.draw(s5);
        
        thickA = state.s1-1;
        MaestroG.drawLineThick(g, x2-state.s50, (y3+y4)/2, x2-state.s50, (y3+y4)/2+moveY5, thickA, Color.black);
        
        MaestroG.drawLineThick(g, x3, (y3+y4)/2, x2-state.s50, (y3+y4)/2, thickA, Color.black);
        MaestroG.drawLineThick(g, x3, (y3+y4)/2+moveY5, x2-state.s50, (y3+y4)/2+moveY5, thickA, Color.black);
        MaestroG.drawLineThick(g, x3, (y3+y4)/2+moveY3, x2-state.s100, (y3+y4)/2+moveY3, thickA, Color.black);
        
        MaestroG.drawLineThick(g, x2-state.s90, (y3+y4)/2, x2-state.s100, (y3+y4)/2, thickA, Color.black);
        MaestroG.drawLineThick(g, x2-state.s90, (y3+y4)/2+moveY2, x2-state.s100, (y3+y4)/2+moveY2, thickA, Color.black);
        MaestroG.drawLineThick(g, x2-state.s90, (y3+y4)/2+moveY4, x2-state.s100, (y3+y4)/2+moveY4, thickA, Color.black);
        MaestroG.drawLineThick(g, x2-state.s90, (y3+y4)/2+moveY5, x2-state.s100, (y3+y4)/2+moveY5, thickA, Color.black);
        
        thick = state.s1;
        thickA = state.s1;
        
        g.setFont(new Font("Serif",Font.ITALIC,state.font14));
        g.drawString("d", x2-state.s100,y1+moveY2);
        g.drawString("d", x2-state.s100,y1+moveY3);
        g.drawString("d", x2-state.s100,y1+moveY4);
        g.drawString("d", x2-state.s100,y1+moveY5);
        //======================================================================

        drawCopyRight(g);
    }

    public void drawCopyRight(Graphics g) {
        int deltaY = state.s20;
        int startingY = getSize().height - state.s70;
        int startingX = 0;
        
        FontMetrics fm;
        
        g.setColor(Color.black);
        g.setColor(Color.black);
        g.setFont(new Font("SanSerif",Font.PLAIN,state.font14));
        fm = g.getFontMetrics();
        
        g.drawString("Application Design: Umberto Ravaioli",startingX+state.s20,startingY+deltaY);
        
        String s = "Interactive Java"+STR.SUP+"TM"+STR.ENDSUP+" platform:  www.amanogawa.com";
        int nextX = STR.displayString(s,g,startingX+state.s20,startingY+2*deltaY);
        int lineLength = fm.stringWidth("Interactive JavaTM platform:  www.amanogawa.com");
        lineLength+= state.s10;

        g.drawString("All Rights Reserved",startingX+state.s20,startingY+3*deltaY);
        g.drawLine(startingX,startingY+state.s5,
                   startingX+state.s20+lineLength+state.s10,startingY+state.s5);
        g.drawLine(startingX+state.s20+lineLength+state.s10,startingY+state.s5,
                   startingX+state.s20+lineLength+state.s10,startingY+4*deltaY);
    }
//----------------------------------------------------------------------------------------    
}//End
    

