// About.java
/* A Java class for
 * LineImpedance.java
 * Electromagnetic Transmission Line Applet
 * Applet without Smith Chart - Prepared by Umberto Ravaioli 
 * for 6th edition of Fundamentals of Applied Electromagnetics Book
 * May 2009 - All Rights Reserved
 */   


import java.io.*;
import java.awt.*;
import java.awt.geom.Arc2D;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;

public class Instructions extends Panel {
    
    private static final Color bgcolor = new Color(255,255,245);
    public TextField epsilon;
    private Paint paint;
    
    private Image im;
    private Graphics buf;
    private BufferedImage figurec, figured;
    public Button bupdate;
    public int ydown;

    StateVars state;
  
    public Instructions (StateVars state){
	super();
        this.state = state;
	setLayout(null);
	setBackground(bgcolor);
        
	bupdate = new Button("CLOSE");
        bupdate.setBackground(new Color(240,240,255));
	add(bupdate);
        
        ydown = state.s50;
        int buttonx = state.s490;
        int buttony = state.s390+ydown;
        int buttonwide = state.s70;
        int buttonheight = state.s27;
        
        bupdate.setBounds(buttonx,buttony,buttonwide,buttonheight);
        bupdate.setFont(state.ttfFont.deriveFont(Font.BOLD,(float)state.font12));
        
        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);
    }
    
    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.setFont(font_one);
        //fm = g.getFontMetrics();

        boolean saveOldFlag = MaestroG.useBiggerFont;
        MaestroG.useBiggerFont = false;
        
        g.setColor(Color.black);
        g.setFont(state.ttfFont.deriveFont(Font.BOLD,(float)state.font16));

        try {
            figurec = ImageIO.read(getClass().getResource("figurec.gif"));
            figured = ImageIO.read(getClass().getResource("figured.gif"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        g.drawString("Instructions", state.s20,state.s25+ydown);
        g.setColor(Color.red);
        
        g.setFont(state.ttfFont.deriveFont(Font.BOLD,(float)state.s15));
        g.drawString("Input", state.s25,state.s60+ydown);
        g.drawString("Design Procedure", state.s391,state.s30);
        
        g.setColor(Color.black);
        g.setFont(state.ttfFont.deriveFont((float)state.font14));
        int deltaY = state.s20;
        //INPUT

        FontMetrics fmNormal, fmSmall;
        g.setFont(state.ttfFont.deriveFont((float)state.font12));
        fmSmall = g.getFontMetrics();
        g.setFont(state.ttfFont.deriveFont((float)state.font14));
        fmNormal = g.getFontMetrics();
        
        int lineLength = fmNormal.stringWidth("Line Parameters (Z and ");
        lineLength += fmSmall.stringWidth("0");
        
        MaestroG.subscripter("Line Parameters (Z","0"," and ",g,state.font14,state.s25,state.s90+ydown);
        MaestroG.subscripter("\u03b5","r",")",g,state.font14,state.s25+lineLength,state.s90+ydown);
        MaestroG.subscripter("Load Impedance Z","L","",g,state.font14,state.s25,state.s100+ydown+deltaY);
        
        //DESIGN PROCEDURE
        int ystart = state.s20+ydown;
        deltaY = state.s25;
        g.drawString("The goal is to match the feedline to the load by", state.s391,ystart);
        g.drawString("inserting a shunt reactive element at an appropriate",
                     state.s391,ystart+deltaY);
        g.drawString("location.  Two solutions exist:", state.s391,ystart+2*deltaY);

        lineLength = fmNormal.stringWidth("    (a) d is selected such that  y(");
        lineLength += fmSmall.stringWidth("1");
        
        MaestroG.subscripter("    (a) d","1"," is selected such that  y(",
                             g,state.font14,state.s391,ystart+4*deltaY);
        MaestroG.subscripter(" d","1",") = 1 + j x,", 
                             g,state.font14,state.s391+lineLength,ystart+4*deltaY);

        lineLength = fmNormal.stringWidth("        and then C is selected such that  W C Z = x");
        lineLength += fmSmall.stringWidth("D");
        
        MaestroG.subscripter("        and then C is selected such that  "+
                             "\u03c9 C Z","0"," = x.",
                             g,state.font14,state.s391,ystart+5*deltaY);
        
        lineLength = fmNormal.stringWidth("    (b) d is selected such that y(");
        lineLength += fmSmall.stringWidth("2");
        
        MaestroG.subscripter("    (b) d","2"," is selected such that y(",
                             g,state.font14,state.s391,ystart+7*deltaY);
        MaestroG.subscripter(" d","2",") = 1 - j x,",
                             g,state.font14,state.s391+lineLength,ystart+7*deltaY);
        MaestroG.subscripter("         and then L is selected such that Z","0",
                             "/\u03c9L = x.",g,state.font14,state.s391,ystart+8*deltaY);
        g.drawString("The final output is a plot of | \u0393 |, as seen by",
                     state.s391,ystart+10*deltaY);
        g.drawString("the feedline, as a function of frequency.",
                     state.s391,ystart+11*deltaY);

        ////g.drawImage(figured,state.s20,state.s50,this);
        
        //g.drawImage(figurec,state.s20,state.s150,this);
        //g.drawImage(figured,state.s20,state.s300,this);
        
        // DRAW SCALABLE IMAGE OF THE CIRCUIT
        int y_fig = state.s190 + ydown;
        int x_left = state.s30;
        int Length_A = state.s120;
        int Length_B = 0;
        int Length_C = state.s120;
        int Length_D = state.s20;
        int height_A = state.s60;
        int height_B = state.s12;
        int height_C = state.s50;
        int load_wx = state.s12;
        int load_wy = state.s20;
        int loadx = x_left + Length_A + Length_C + Length_D;
        int loady = y_fig + height_A/2;
        int stem = state.s15;
        int stub_down = state.s50;
        int cap_term = height_A/2 - state.s4;
        int cap_plate = state.s20;
        int ind_term = 24*height_A/100;
        
        
        int Radius = state.s8;
        int Radius1 = state.s8;
        int Radius2 = state.s4;
        
        // Input section Line
        drawLineThick(g,(double)x_left,(double)y_fig,
                (double)(x_left + Length_A),(double)y_fig,state.s2,Color.cyan.darker());
        drawLineThick(g,(double)x_left,(double)(y_fig+height_A),
                (double)(x_left + Length_A),(double)(y_fig+height_A),state.s2,Color.cyan.darker());
        
        // Output section Line
        drawLineThick(g,(double)(x_left + Length_A + Length_B),(double)y_fig,
                (double)(x_left + Length_A + Length_B + Length_C),(double)y_fig,state.s2,Color.cyan.darker());
        drawLineThick(g,(double)(x_left + Length_A + Length_B),(double)(y_fig+height_A),
                (double)(x_left + Length_A + Length_B + Length_C),(double)(y_fig+height_A),state.s2,Color.cyan.darker());
        
        // Load
        drawLineThick(g,(double)(x_left + Length_A + Length_B + Length_C),(double)y_fig,
                (double)(x_left + Length_A + Length_B + Length_C + Length_D),(double)y_fig,state.s2,Color.black);
        drawLineThick(g,(double)(x_left + Length_A + Length_B + Length_C),(double)(y_fig+height_A),
                (double)(x_left + Length_A + Length_B + Length_C + Length_D),(double)(y_fig+height_A),state.s2,Color.black);
        drawLineThick(g,(double)(x_left + Length_A + Length_B + Length_C + Length_D),(double)(y_fig),
                (double)(x_left + Length_A + Length_B + Length_C + Length_D),(double)(y_fig+height_A),state.s2,Color.black);
        
        // Capacitor Leads
        drawLineThick(g,(double)(x_left + Length_A),(double)y_fig,
                (double)(x_left + Length_A),(double)(y_fig + cap_term),state.s2,Color.black);
        drawLineThick(g,(double)(x_left + Length_A),(double)(y_fig + height_A),
                (double)(x_left + Length_A),(double)(y_fig + height_A - cap_term),state.s2,Color.black);
        
        // Capacitor Plates
        drawLineThick(g,(double)(x_left + Length_A - cap_plate/2),(double)(y_fig + cap_term),
                (double)(x_left + Length_A + cap_plate/2),(double)(y_fig + cap_term),state.s2,Color.cyan.darker());
        drawLineThick(g,(double)(x_left + Length_A - cap_plate/2),(double)(y_fig + height_A - cap_term),
                (double)(x_left + Length_A + cap_plate/2),(double)(y_fig + height_A - cap_term),state.s2,Color.cyan.darker());
        
        // Wire connections
        drawConnect(x_left + Length_A, y_fig, g);
        drawConnect(x_left + Length_A, y_fig + height_A, g);
        drawConnect(x_left + Length_A + Length_B + Length_C, y_fig, g);
        drawConnect(x_left + Length_A + Length_B + Length_C, y_fig + height_A, g);
        //======================================================================
        fillRectangleThick(g2d,(double)(loadx-load_wx), (double)(loady - load_wy),
                (double)(2.0 * load_wx),(double)(2.0 * load_wy), 2, Color.white);
        drawRectangleThick(g2d,(double)(loadx-load_wx), (double)(loady - load_wy),
                (double)(2.0 * load_wx),(double)(2.0 * load_wy), 1, Color.black);
        
        MaestroG.subscripter2("Z","0","",g,state.font12,x_left + 3*Length_A/35,loady+load_wy/4);
        MaestroG.subscripter2("Z","in","",g,state.font11,x_left + 16*Length_A/35,loady+load_wy/4);
        MaestroG.subscripter2("Z","0","",g,state.font12,x_left + Length_A + Length_B + 45*Length_C/100,loady+load_wy/4);
        //MaestroG.subscripter2("Z","0","",g,state.font12,x_left + Length_A + Length_B + 45*Length_C/100,loady+load_wy/4 + 9*height_A/10);
        MaestroG.subscripter2("Z","L","",g,state.font11,loadx-55*load_wx/100,loady+load_wy/4);
        MaestroG.subsubSerifBoldItalic("y","","(","","d","1",")",g, state.font12, (x_left + 101*Length_A/100),(y_fig + 155*height_A/100));
        
        MaestroG.SerifItalic("M",g,state.font12,x_left+Length_A-4*fmNormal.stringWidth("M")/10,y_fig-38*Radius/10);
        MaestroG.SerifItalic("M'",g,state.font12,x_left+Length_A-fmNormal.stringWidth("M")/2,y_fig+height_A+25*Radius/10);
        MaestroG.SerifItalic("A",g,state.font12,x_left+Length_A+Length_B+Length_C-4*fmNormal.stringWidth("A")/10,y_fig-38*Radius/10);
        MaestroG.SerifItalic("A'",g,state.font12,x_left+Length_A+Length_B+Length_C-fmNormal.stringWidth("A")/2,y_fig+height_A+25*Radius/10);
        
        g.setColor(Color.red);
        MaestroG.subSerifBoldItalic("d","1","",g,state.font12,x_left+Length_A+Length_B+Length_C/2,y_fig-31*Radius/10);
        MaestroG.subscripter4("Feedline","","",g,state.font10,x_left,y_fig-Radius);
        
        g.setColor(Color.red);
        drawArrowScaled(x_left+22*Length_A/35 + stem, loady, 7, state.sfactor, g);
        drawLineThick(g,(double)(x_left+22*Length_A/35),(double)loady,
                (double)(x_left + 22*Length_A/35 + stem + state.s1),(double)loady,state.s1,Color.red);
        
        g.setColor(Color.green.darker());
        drawArrowScaled(x_left+110*Length_A/100 + stem, y_fig + 80*height_A/100, 7, state.sfactor, g);
        drawLineThick(g,(double)(x_left+ 110*Length_A/100),(double)(y_fig + 80*height_A/100),
                (double)(x_left + 110*Length_A/100 + stem + state.s1),(double)(y_fig + 80*height_A/100),state.s1,Color.green.darker());
        drawLineThick(g,(double)(x_left+ 110*Length_A/100),(double)(y_fig + 80*height_A/100),
                (double)(x_left + 110*Length_A/100),(double)(y_fig + 135*height_A/100),state.s1,Color.green.darker());
        
        g.setColor(Color.black);
        g.drawLine(x_left+Length_A,y_fig-Radius,x_left+Length_A,y_fig-3*Radius);
        g.drawLine(x_left+Length_A+Length_B+Length_C,y_fig-Radius,x_left+Length_A+Length_B+Length_C,y_fig-3*Radius);
        g.drawLine(x_left+Length_A+Length_B,y_fig-2*Radius,x_left+Length_A+Length_B+Length_C,y_fig-2*Radius);
        
        drawArrowScaled(x_left+Length_A+Length_B+state.s8, y_fig-2*Radius, 4, state.sfactor, g);
        drawArrowScaled(x_left+Length_A+Length_B+Length_C-state.s8, y_fig-2*Radius, 3, state.sfactor, g);
        
        //======================================================================
        // CIRCUIT DIAGRAM FOR SECOND SOLUTION
        //======================================================================
        y_fig = state.s350 + ydown;
        
        loady = y_fig + height_A/2;
        
        // Input section Line
        drawLineThick(g,(double)x_left,(double)y_fig,
                (double)(x_left + Length_A),(double)y_fig,state.s2,Color.cyan.darker());
        drawLineThick(g,(double)x_left,(double)(y_fig+height_A),
                (double)(x_left + Length_A),(double)(y_fig+height_A),state.s2,Color.cyan.darker());
        
        // Output section Line
        drawLineThick(g,(double)(x_left + Length_A + Length_B),(double)y_fig,
                (double)(x_left + Length_A + Length_B + Length_C),(double)y_fig,state.s2,Color.cyan.darker());
        drawLineThick(g,(double)(x_left + Length_A + Length_B),(double)(y_fig+height_A),
                (double)(x_left + Length_A + Length_B + Length_C),(double)(y_fig+height_A),state.s2,Color.cyan.darker());
        
        // Load
        drawLineThick(g,(double)(x_left + Length_A + Length_B + Length_C),(double)y_fig,
                (double)(x_left + Length_A + Length_B + Length_C + Length_D),(double)y_fig,state.s2,Color.black);
        drawLineThick(g,(double)(x_left + Length_A + Length_B + Length_C),(double)(y_fig+height_A),
                (double)(x_left + Length_A + Length_B + Length_C + Length_D),(double)(y_fig+height_A),state.s2,Color.black);
        drawLineThick(g,(double)(x_left + Length_A + Length_B + Length_C + Length_D),(double)(y_fig),
                (double)(x_left + Length_A + Length_B + Length_C + Length_D),(double)(y_fig+height_A),state.s2,Color.black);
        
        // Inductor Leads
        drawLineThick(g,(double)(x_left + Length_A),(double)y_fig,
                (double)(x_left + Length_A),(double)(y_fig + ind_term),state.s2,Color.black);
        //drawLineThick(g,(double)(x_left + Length_A),(double)y_fig + ind_term,
                //(double)(x_left + Length_A + state.s2),(double)(y_fig + ind_term),state.s2,Color.cyan.darker());
        
        drawLineThick(g,(double)(x_left + Length_A),(double)(y_fig + height_A),
                (double)(x_left + Length_A),(double)(y_fig + height_A - ind_term),state.s2,Color.black);
        //drawLineThick(g,(double)(x_left + Length_A),(double)(y_fig + height_A - ind_term),
                //(double)(x_left + Length_A + state.s2),(double)(y_fig + height_A - ind_term),state.s2,Color.cyan.darker());
        
        // Inductor Coil
            int stroke = state.s2;
            g2d.setPaint(Color.cyan.darker());
            g2d.setStroke(new BasicStroke(stroke));
        
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
            int RadioA = state.s9;
            int RadioB = state.s3;
            Arc2D.Double arc_zero = new Arc2D.Double((double)(x_left + Length_A - 15*RadioA/100),(double)(y_fig + ind_term),
                    (double)state.s8,(double)state.s7,270,180,0);
            g2d.draw(arc_zero);
            
            Arc2D.Double arc_one = new Arc2D.Double((double)(x_left + Length_A - 75*RadioA/100),(double)(y_fig + ind_term + state.s6),
                    (double)RadioA,(double)RadioB,0,360,0);
            g2d.draw(arc_one);
            
            Arc2D.Double arc_two = new Arc2D.Double((double)(x_left + Length_A - 75*RadioA/100),(double)(y_fig + ind_term + state.s14),
                    (double)RadioA,(double)RadioB,0,360,0);
            g2d.draw(arc_two);
            
            Arc2D.Double arc_three = new Arc2D.Double((double)(x_left + Length_A - 75*RadioA/100),(double)(y_fig + ind_term + state.s22),
                    (double)RadioA,(double)RadioB,0,360,0);
            g2d.draw(arc_three);
            
            Arc2D.Double arc_four = new Arc2D.Double((double)(x_left + Length_A - 15*RadioA/100),(double)(y_fig + ind_term + state.s8),
                    (double)state.s8,(double)state.s7,270,180,0);
            g2d.draw(arc_four);
            
            Arc2D.Double arc_five = new Arc2D.Double((double)(x_left + Length_A - 15*RadioA/100),(double)(y_fig + ind_term + state.s16),
                    (double)state.s8,(double)state.s7,270,190,0);
            g2d.draw(arc_five);
            
            Arc2D.Double arc_six = new Arc2D.Double((double)(x_left + Length_A - 15*RadioA/100),(double)(y_fig + ind_term + state.s24),
                    (double)state.s8,(double)state.s7,260,180,0);
            g2d.draw(arc_six);
            
            g2d.setStroke(new BasicStroke(1));
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
        
        g.setColor(Color.black);
        MaestroG.fillCircle(x_left + Length_A,y_fig + ind_term, stroke+4, g);
        g.setColor(Color.black);
        MaestroG.fillCircle(x_left + Length_A,y_fig + height_A - ind_term, stroke+4, g);
            
        // Wire connections
        drawConnect(x_left + Length_A, y_fig, g);
        drawConnect(x_left + Length_A, y_fig + height_A, g);
        drawConnect(x_left + Length_A + Length_B + Length_C, y_fig, g);
        drawConnect(x_left + Length_A + Length_B + Length_C, y_fig + height_A, g);
        
        fillRectangleThick(g2d,(double)(loadx-load_wx), (double)(loady - load_wy),
                (double)(2.0 * load_wx),(double)(2.0 * load_wy), 2, Color.white);
        drawRectangleThick(g2d,(double)(loadx-load_wx), (double)(loady - load_wy),
                (double)(2.0 * load_wx),(double)(2.0 * load_wy), 1, Color.black);
        
        MaestroG.subscripter2("Z","0","",g,state.font12,x_left + 3*Length_A/35,loady+load_wy/4);
        MaestroG.subscripter2("Z","in","",g,state.font11,x_left + 16*Length_A/35,loady+load_wy/4);
        MaestroG.subscripter2("Z","0","",g,state.font12,x_left + Length_A + Length_B + 45*Length_C/100,loady+load_wy/4);
        MaestroG.subscripter2("Z","L","",g,state.font11,loadx-55*load_wx/100,loady+load_wy/4);
        MaestroG.subsubSerifBoldItalic("y","","(","","d","2",")",g, state.font12, (x_left + 101*Length_A/100),(y_fig + 155*height_A/100));
        
        MaestroG.SerifItalic("M",g,state.font12,x_left+Length_A-4*fmNormal.stringWidth("M")/10,y_fig-38*Radius/10);
        MaestroG.SerifItalic("M'",g,state.font12,x_left+Length_A-fmNormal.stringWidth("M")/2,y_fig+height_A+25*Radius/10);
        MaestroG.SerifItalic("A",g,state.font12,x_left+Length_A+Length_B+Length_C-4*fmNormal.stringWidth("A")/10,y_fig-38*Radius/10);
        MaestroG.SerifItalic("A'",g,state.font12,x_left+Length_A+Length_B+Length_C-fmNormal.stringWidth("A")/2,y_fig+height_A+25*Radius/10);
        
        g.setColor(Color.red);
        MaestroG.subSerifBoldItalic("d","2","",g,state.font12,x_left+Length_A+Length_B+Length_C/2,y_fig-31*Radius/10);
        MaestroG.subscripter4("Feedline","","",g,state.font10,x_left,y_fig-Radius);
        
        g.setColor(Color.red);
        drawArrowScaled(x_left+22*Length_A/35 + stem, loady, 7, state.sfactor, g);
        drawLineThick(g,(double)(x_left+22*Length_A/35),(double)loady,
                (double)(x_left + 22*Length_A/35 + stem + state.s1),(double)loady,state.s1,Color.red);
        
        g.setColor(Color.green.darker());
        drawArrowScaled(x_left+110*Length_A/100 + stem, y_fig + 80*height_A/100, 7, state.sfactor, g);
        drawLineThick(g,(double)(x_left+ 110*Length_A/100),(double)(y_fig + 80*height_A/100),
                (double)(x_left + 110*Length_A/100 + stem + state.s1),(double)(y_fig + 80*height_A/100),state.s1,Color.green.darker());
        drawLineThick(g,(double)(x_left+ 110*Length_A/100),(double)(y_fig + 80*height_A/100),
                (double)(x_left + 110*Length_A/100),(double)(y_fig + 135*height_A/100),state.s1,Color.green.darker());
        
        g.setColor(Color.black);
        g.drawLine(x_left+Length_A,y_fig-Radius,x_left+Length_A,y_fig-3*Radius);
        g.drawLine(x_left+Length_A+Length_B+Length_C,y_fig-Radius,x_left+Length_A+Length_B+Length_C,y_fig-3*Radius);
        
        g.drawLine(x_left+Length_A+Length_B,y_fig-2*Radius,x_left+Length_A+Length_B+Length_C,y_fig-2*Radius);
        
        drawArrowScaled(x_left+Length_A+Length_B+state.s8, y_fig-2*Radius, 4, state.sfactor, g);
        drawArrowScaled(x_left+Length_A+Length_B+Length_C-state.s8, y_fig-2*Radius, 3, state.sfactor, g);
        
        drawCopyRight(g);
        MaestroG.useBiggerFont = saveOldFlag;
    }
    
    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(normalfont14);
        g.setFont(state.ttfFont.deriveFont((float)state.font14));
        fm = g.getFontMetrics();
        
        g.drawString("Application Design: Umberto Ravaioli",
                     startingX+state.s15,startingY+deltaY);
        
        MaestroG.superscripter("Interactive Java","TM"," platform:  www.amanogawa.com",
                               g,state.font14,startingX+state.s15,startingY+2*deltaY);
        int lineLength = fm.stringWidth("Interactive JavaTM platform:  www.amanogawa.com");
        lineLength += state.s10;

        g.setFont(state.ttfFont.deriveFont((float)state.font14));
        g.drawString("All Rights Reserved",startingX+state.s15,startingY+3*deltaY);
        g.drawLine(startingX,startingY,
                   startingX+lineLength+state.s25,startingY);
        g.drawLine(startingX+lineLength+state.s25,startingY,
                   startingX+lineLength+state.s25,startingY+4*deltaY);
    }
    
    private void drawConnect(int x, int y, Graphics g){
        int tmp1, tmp2;
        tmp1 = state.s6;
        tmp2 = tmp1-state.s2;
        //drawRect(x,y,tmp1,tmp1,Color.white,g);
        //drawRect(x,y,tmp2,tmp2,Color.black,g);

        Graphics2D g2d = (Graphics2D)g;

        g2d.setStroke(new BasicStroke(2));

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

        g2d.setPaint(Color.white);
        g.fillOval(x-tmp1/2,y-tmp1/2,tmp1,tmp1);
        g2d.setPaint(Color.cyan.darker());
        //g.fillOval(x-tmp2/2,y-tmp2/2,tmp2,tmp2);

        Arc2D.Double arc_zero = new Arc2D.Double((double)(x-tmp1/2),(double)(y-tmp1/2),
                (double)tmp1,(double)tmp1,0,360,0);
        g2d.draw(arc_zero);


        g2d.setStroke(new BasicStroke(1));
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
    }

    public void drawLineThick(Graphics g, double x1, double y1, double x2, double y2, int thick, Color color){
	
        Graphics2D g2d = (Graphics2D)g;
        g2d.setPaint(color);
        g2d.setStroke(new BasicStroke(thick,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));
        
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
        Line2D.Double line = new Line2D.Double(x1,y1,x2,y2);
        g2d.draw(line);
  
        g2d.setStroke(new BasicStroke(1));
        //g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
    }
    
    public void drawRectangleThick(Graphics g, double x1, double y1, double x2, double y2, int thick, Color color){
	
        Graphics2D g2d = (Graphics2D)g;
        g2d.setPaint(color);
        g2d.setStroke(new BasicStroke(thick,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));
        
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
        Rectangle2D rect = new Rectangle2D.Double(x1,y1,x2,y2);
        g2d.draw(rect);
  
        g2d.setStroke(new BasicStroke(1));
        //g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
    }
    
    public void fillRectangleThick(Graphics g, double x1, double y1, double x2, double y2, int thick, Color color){
	
        Graphics2D g2d = (Graphics2D)g;
        g2d.setPaint(color);
        g2d.setStroke(new BasicStroke(thick,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));
        
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
        Rectangle2D rect = new Rectangle2D.Double(x1,y1,x2,y2);
        g2d.fill(rect);
  
        g2d.setStroke(new BasicStroke(1));
        //g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
    }
    
    public void drawArrowScaled(int x, int y, int tipo, double sfactor, Graphics g){
	Graphics2D g2d = (Graphics2D)g;
        double s;
        s = sfactor;
        
        switch (tipo){
	   
          case 1://ArrowUpSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                g.drawLine(x,y,x,y-(int)(s*8));
		//draw oblique arrow head
		Polygon pH = new Polygon();
		pH.addPoint(x-(int)(s*2), y-(int)(s*2));
		pH.addPoint(x+(int)(s*2), y-(int)(s*2));
		pH.addPoint(x,y-(int)(s*8));
		g.drawPolygon(pH);
		g.fillPolygon(pH);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
        
          break;
          
          case 2://ArrowDownSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                g.drawLine(x,y,x,y+(int)(s*8));
		//draw oblique arrow head
		Polygon pJ = new Polygon();
		pJ.addPoint(x-(int)(s*2), y+(int)(s*2));
		pJ.addPoint(x+(int)(s*2), y+(int)(s*2));
		pJ.addPoint(x,y+(int)(s*8));
		g.drawPolygon(pJ);
		g.fillPolygon(pJ);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
	   break;
           
           case 3://ArrowRightSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                g.drawLine(x,y,x+(int)(s*8),y);
		//draw oblique arrow head
		Polygon pK = new Polygon();
		pK.addPoint(x+(int)(s*2), y-(int)(s*2));
		pK.addPoint(x+(int)(s*2), y+(int)(s*2));
		pK.addPoint(x+(int)(s*8),y);
		g.drawPolygon(pK);
		g.fillPolygon(pK);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
	   
	   break;
           
           case 4://ArrowLeftSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                g.drawLine(x,y,x-(int)(s*8),y);
		//draw oblique arrow head
		Polygon pL = new Polygon();
		pL.addPoint(x-(int)(s*2), y-(int)(s*2));
		pL.addPoint(x-(int)(s*2), y+(int)(s*2));
		pL.addPoint(x-(int)(s*8),y);
		g.drawPolygon(pL);
		g.fillPolygon(pL);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
 
	   break;
           
           case 5://ArrowOblique 45 degrees NE
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
		//draw oblique arrow head
		Polygon pM = new Polygon();
                //draw oblique arrow head
                
                pM.addPoint(x+(int)(s*5),y-(int)(s*5));
		pM.addPoint(x-(int)(s*1),y-(int)(s*2));
		pM.addPoint(x+(int)(s*2),y+(int)(s*1));
		
                g.drawPolygon(pM);
		g.fillPolygon(pM);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
                 
           break;
           case 7://Larger ArrowRightSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                g.drawLine(x,y,x+(int)(s*10),y);
		//draw oblique arrow head
		Polygon pR = new Polygon();
		pR.addPoint(x+(int)(s*3), y-(int)(s*3));
		pR.addPoint(x+(int)(s*3), y+(int)(s*3));
		pR.addPoint(x+(int)(s*10),y);
		g.drawPolygon(pR);
		g.fillPolygon(pR);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
	   
	   break;
           
           case 8://Larger ArrowLeftSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                g.drawLine(x,y,x-(int)(s*10),y);
		//draw oblique arrow head
		Polygon pS = new Polygon();
		pS.addPoint(x-(int)(s*3), y-(int)(s*3));
		pS.addPoint(x-(int)(s*3), y+(int)(s*3));
		pS.addPoint(x-(int)(s*10),y);
		g.drawPolygon(pS);
		g.fillPolygon(pS);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
 
	   break;
           
	}		
    }  
    
//----------------------------------------------------------------------------------------    
}//End
    

