import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;

public class ForcePanel extends Panel{
        PlaneWave_State state;
        
	protected static final Color bgcolor = new Color(246,246,246);
	protected TextField text1[];
	protected Label lab1[], lab2[];
	public Label titlelabel;
	public Button b1;
        public JSlider slider1;
        public Checkbox c1, c2, c3, c4, c5;
        public CheckboxGroup cgrid;
        
        public int SCROLLMIN=750, SCROLLMAX=1001;
        public int SCROLLMIN2=0, SCROLLMAX2=20001;
        public int SCROLLMIN3=0, SCROLLMAX3=2001;
        
        private int SleepTime = 50;
        
	protected String titulo="Unknown Title";
	protected static final Font labfont=new Font("SanSerif",Font.PLAIN,12);
	protected static final Font titlefont=new Font("SanSerif",Font.BOLD,16);
        
	public ForcePanel(PlaneWave_State state){
		super();
		setLayout(null);
                this.state = state;
                
		setBackground(bgcolor);
                
                cgrid = new CheckboxGroup();
                c1=new Checkbox("0.1 m",cgrid,true);
                c2=new Checkbox("1 m",cgrid,false);
                c3=new Checkbox("10 m",cgrid,false);
                c4=new Checkbox("100 m",cgrid,false);
                c5=new Checkbox("1 km",cgrid,false);
                
                add(c1);
		c1.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
		c1.setBackground(bgcolor);
		c1.setForeground(Color.magenta.darker());
                c1.setBounds(state.s360,state.s20,state.s80,state.s20);
                c1.setVisible(true);
                
                add(c2);
		c2.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
		c2.setBackground(bgcolor);
		c2.setForeground(Color.magenta.darker());
                c2.setBounds(state.s440,state.s20,state.s60,state.s20);
                c2.setVisible(true);
                
                add(c3);
		c3.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
		c3.setBackground(bgcolor);
		c3.setForeground(Color.magenta.darker());
                c3.setBounds(state.s500,state.s20,state.s80,state.s20);
                c3.setVisible(true);
                
                //add(c4);
		c4.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
		c4.setBackground(bgcolor);
		c4.setForeground(Color.magenta.darker());
                //c4.setBounds(480,20,60,20);
                c4.setVisible(true);
                
                //add(c5);
		c5.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
		c5.setBackground(bgcolor);
		c5.setForeground(Color.magenta.darker());
		//c5.setBounds(540,20,60,20);
                c5.setVisible(true);
             
                // Animation speed slider
		slider1 = new JSlider(SCROLLMIN,SCROLLMAX);
		slider1.setValue(SCROLLMAX-1-SleepTime);
                //slider1 = new Scrollbar(Scrollbar.HORIZONTAL,SCROLLMAX-1-SleepTime,1,SCROLLMIN,SCROLLMAX);
                slider1.setBounds(state.s12,state.s398,state.s150,state.s15);
                add(slider1);
		/*
                Panel p1 = new Panel();
                    p1.setBackground(Color.black);
                    add(p1);
                    p1.setBounds(state.s12-1,state.s398-1,state.s150+2,state.s15+2);
		*/
	}
	
	public void paint(Graphics g){
            
            Graphics2D g2d = (Graphics2D)g;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
            
	    g.clearRect(0,0,getSize().width-2,getSize().height);
	                
            g.setColor(Color.black);
            
            g.setColor(Color.black);
            g.drawLine(state.s302,state.s8,state.s425,state.s8);
            g.drawLine(state.s465,state.s8,state.s590,state.s8);
            drawArrowScaled(state.s310,state.s8,8,state.sfactor,g);
            drawArrowScaled(state.s585,state.s8,7,state.sfactor,g);
            g.setColor(Color.black);
            
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
            MaestroG.subscripter("W","","",g,state.font12,state.s440,state.s13);
            
            g.setColor(Color.red);
            double xx1 = (double)state.s10;
            double xx2 = (double)state.s60;
            double xx3 = (double)state.s48;
            double yy1 = (double)state.s10;
            double yy2 = (double)state.s30;
            double yy3 = (double)state.s14;
            double yy4 = (double)state.s6;
            double yy5 = (double)state.s34;
            double yy6 = (double)state.s26;
            
            
            MaestroG.drawLineThick(g,xx1,yy1,xx2,yy1,2,Color.red);
            MaestroG.drawLineThick(g,xx2,yy1,xx3,yy3,2,Color.red);
            MaestroG.drawLineThick(g,xx2,yy1,xx3,yy4,2,Color.red);
            
            MaestroG.drawLineThick(g,xx1,yy2,xx2,yy2,2,Color.blue);
            MaestroG.drawLineThick(g,xx2,yy2,xx3,yy5,2,Color.blue);
            MaestroG.drawLineThick(g,xx2,yy2,xx3,yy6,2,Color.blue);
            
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
            
            g.setColor(Color.red);
            MaestroG.subscripter("Electric Force","","",g,state.font12,state.s70,state.s15);
            g.setColor(Color.blue);
            MaestroG.subscripter("Magnetic Force","","",g,state.font12,state.s70,state.s35);
            
            g.setColor(Color.magenta.darker());
            MaestroG.subscripter("W  = ","","",g,state.font12,state.s325,state.s33);
            //------------------------------------------------------------------
	    slider1.requestFocusInWindow();
        }
        
        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;
           
           case 9://ArrowUpSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                //g.drawLine(x,y,x,y-(int)(s*10));
		
		Polygon pU = new Polygon();
		pU.addPoint(x-(int)(s*3), y);
		pU.addPoint(x+(int)(s*3), y);
		pU.addPoint(x,y-(int)(s*7));
		g.drawPolygon(pU);
		g.fillPolygon(pU);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
        
          break;
          
          case 10://ArrowDownSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                //g.drawLine(x,y,x,y-(int)(s*10));
		
                Polygon pD = new Polygon();
                pD.addPoint(x-(int)(s*3), y);
		pD.addPoint(x+(int)(s*3), y);
		pD.addPoint(x,y+(int)(s*7));
		g.drawPolygon(pD);
		g.fillPolygon(pD);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
	   break;
           
	}		
    }
}

