import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Polarization_Controls extends Panel implements ChangeListener, ActionListener, ItemListener{   
	private static final Color bgcolor = new Color(236,236,236);
    private static final Color update_btn_color = new Color(250,250,250);
	
        JSlider slider1, slider2, slider3, slider4, slider_speed;
	TextField text1, text2, text3, text4;
	public Button b1, b_about;
	
	private Checkbox c1, c2, c3, c4;
	private Checkbox c5, c6;
	private Polarization_State state;
	CheckboxGroup  cgrid1, cgrid2, cgrid3;
	//final int ScrollPhaseMin=0;
	//final int ScrollPhaseMax=360;
	final int ScrollPhaseMin=-360;
	final int ScrollPhaseMax=360;
	final int ScrollAmpMin=0;
	final int ScrollAmpMax=1000;
        final int SpeedMax = 150;
        int ypos1, ypos2, ypos3, ypos4, ypos5, ypos6;
        
	public Polarization_Controls(Polarization_State state){
		super();
                this.state = state;
                
		setBackground(bgcolor);
		setLayout(null);
                ypos1 = state.s65;
                ypos2 = state.s115;
                ypos3 = state.s165;
                ypos4 = state.s200+state.s15;
                ypos5 = state.s200+state.s70; 
                ypos6 = state.s300+10;
                
		//state = new Polarization_State();
		
		text1=new TextField("1.0",8);	
		text1.setFont(new Font("SanSerif",Font.PLAIN,state.font11));
                text2=new TextField("0.0",8);
		text2.setFont(new Font("SanSerif",Font.PLAIN,state.font11));
                text3=new TextField("1.0",8);
                text3.setFont(new Font("SanSerif",Font.PLAIN,state.font11));
                text4=new TextField("0.0",8);
		text4.setFont(new Font("SanSerif",Font.PLAIN,state.font11));
                
                text1.setBackground(Color.white);
		text2.setBackground(Color.white);
		text3.setBackground(Color.white);
		text4.setBackground(Color.white);
		
		cgrid1=new CheckboxGroup();
		cgrid2=new CheckboxGroup();
		cgrid3=new CheckboxGroup();

		c1 = new Checkbox(" deg",cgrid1,true);
		c2 = new Checkbox(" rad",cgrid1,false);
                c1.setFont(new Font("SanSerif",Font.PLAIN,state.font11));
                c2.setFont(new Font("SanSerif",Font.PLAIN,state.font11));

		c3 = new Checkbox(" deg",cgrid2,true);
		c4 = new Checkbox(" rad",cgrid2,false);
                c3.setFont(new Font("SanSerif",Font.PLAIN,state.font11));
                c4.setFont(new Font("SanSerif",Font.PLAIN,state.font11));
                
		c5 = new Checkbox(" On",cgrid3,false);
		c6 = new Checkbox(" Off",cgrid3,true);
                c5.setFont(new Font("SanSerif",Font.PLAIN,state.font11));
                c6.setFont(new Font("SanSerif",Font.PLAIN,state.font11));
                
		add(c1);
		add(c2);
		add(c3);
		add(c4);
		add(c5);
		add(c6);
                
                c1.setBounds(state.s130,ypos2-state.s20,state.s55,state.s20);
		c2.setBounds(state.s185,ypos2-state.s20,state.s55,state.s20);
		c3.setBounds(state.s130,ypos4-state.s20,state.s55,state.s20);
		c4.setBounds(state.s185,ypos4-state.s20,state.s55,state.s20);
		c5.setBounds(state.s100,ypos6,state.s50,state.s20);
		c6.setBounds(state.s160,ypos6,state.s60,state.s20);
		c1.setBackground(bgcolor);
		c2.setBackground(bgcolor);
		c3.setBackground(bgcolor);
		c4.setBackground(bgcolor);
		c5.setBackground(bgcolor);
		c6.setBackground(bgcolor);

		slider1=new JSlider(ScrollAmpMin,ScrollAmpMax+1);
		slider1.setValue(ScrollAmpMax);
		slider2=new JSlider(ScrollPhaseMin,ScrollPhaseMax+1);
		slider2.setValue(0);
		slider3=new JSlider(ScrollAmpMin,ScrollAmpMax+1);
		slider3.setValue(ScrollAmpMax);
		slider4=new JSlider(ScrollPhaseMin,ScrollPhaseMax+1);
                slider4.setValue(0);
                slider_speed=new JSlider(0,SpeedMax);
		slider_speed.setValue(115);
		/*
		slider1=new Scrollbar(Scrollbar.HORIZONTAL,ScrollAmpMax,1,ScrollAmpMin,ScrollAmpMax+1);
		slider2=new Scrollbar(Scrollbar.HORIZONTAL,0,1,ScrollPhaseMin,ScrollPhaseMax+1);
		slider3=new Scrollbar(Scrollbar.HORIZONTAL,ScrollAmpMax,1,ScrollAmpMin,ScrollAmpMax+1);
		slider4=new Scrollbar(Scrollbar.HORIZONTAL,0,1,ScrollPhaseMin,ScrollPhaseMax+1);
                
                slider_speed=new Scrollbar(Scrollbar.HORIZONTAL,115,1,0,SpeedMax);
		*/
		//slider1.setBackground(bgcolor.darker());
		//slider2.setBackground(bgcolor.darker());
		//slider3.setBackground(bgcolor.darker());
		//slider4.setBackground(bgcolor.darker());
		slider1.setForeground(Color.black);
		slider2.setForeground(Color.black);
		slider3.setForeground(Color.black);
		slider4.setForeground(Color.black);
		slider1.setBackground(bgcolor);
		slider2.setBackground(bgcolor);
		slider3.setBackground(bgcolor);
		slider4.setBackground(bgcolor);
		
                slider_speed.setForeground(Color.black);
		slider_speed.setBackground(bgcolor);
                
		b1 = new Button("Update");
		b_about = new Button("Instructions");
                b1.setFont(new Font("SanSerif",Font.PLAIN,state.font11));
                b_about.setFont(new Font("SanSerif",Font.PLAIN,state.font11));
                
		add(text1);
		add(text2);
		add(text3);
		add(text4);
		add(slider1);
		add(slider2);
		add(slider3);
		add(slider4);
                add(slider_speed);
		add(b1);
                add(b_about);
		
		text1.setBounds(state.s180,ypos1+state.s1,state.s60,state.s20);
		text2.setBounds(state.s180,ypos2+state.s1,state.s60,state.s20);
		text3.setBounds(state.s180,ypos3+state.s1,state.s60,state.s20);
		text4.setBounds(state.s180,ypos4+state.s1,state.s60,state.s20);
		
                Panel ptext1 = new Panel();
		    ptext1.setBackground(Color.green);
		    add(ptext1);
		    ptext1.setBounds(state.s180-2,ypos1+state.s1-2,state.s60+4,state.s20+4);
                Panel ptext2 = new Panel();
		    ptext2.setBackground(Color.green);
		    add(ptext2);
		    ptext2.setBounds(state.s180-2,ypos2+state.s1-2,state.s60+4,state.s20+4);
                Panel ptext3 = new Panel();
		    ptext3.setBackground(Color.red);
		    add(ptext3);
		    ptext3.setBounds(state.s180-2,ypos3+state.s1-2,state.s60+4,state.s20+4);
                Panel ptext4 = new Panel();
		    ptext4.setBackground(Color.red);
		    add(ptext4);
		    ptext4.setBounds(state.s180-2,ypos4+state.s1-2,state.s60+4,state.s20+4);
                
		slider1.setBounds(state.s10,ypos1+state.s3,state.s160,state.s15);
		slider2.setBounds(state.s10,ypos2+state.s3,state.s160,state.s15);
		slider3.setBounds(state.s10,ypos3+state.s3,state.s160,state.s15);
		slider4.setBounds(state.s10,ypos4+state.s3,state.s160,state.s15);
                slider_speed.setBounds(state.s120,ypos5,state.s119,state.s15);

		/*
                Panel p_speed = new Panel();
		    p_speed.setBackground(Color.black);
		    add(p_speed);
		    p_speed.setBounds(state.s120-1,ypos5-1,state.s119+2,state.s15+2);
		*/
		b1.setBounds(state.s10,ypos5-state.s2,state.s100,state.s20);
		b1.setBackground(update_btn_color);
                
                //--------------------------------------------------------------
                int y_about = state.s10;
                b_about.setBounds(state.s53,y_about,state.s140,state.s20);
		b_about.setBackground(Color.white);
		
                Panel p_about = new Panel();
		    p_about.setBackground(Color.black);
		    add(p_about);
		    p_about.setBounds(state.s53-1,y_about-1,state.s140+2,state.s20+2);
                //--------------------------------------------------------------
		    /*
                Panel slidea = new Panel();
		    slidea.setBackground(Color.black);
		    add(slidea);
		    slidea.setBounds(state.s10-1,ypos1+state.s3-1,state.s160+2,state.s15+2);
		Panel slidea1 = new Panel();
		    slidea1.setBackground(Color.green);
		    add(slidea1);
		    slidea1.setBounds(state.s10-4,ypos1+state.s3-4,state.s160+8,state.s15+8);
                Panel slidea2 = new Panel();
		    slidea2.setBackground(Color.black);
		    add(slidea2);
		    slidea2.setBounds(state.s10-5,ypos1+state.s3-5,state.s160+10,state.s15+10);
                //--------------------------------------------------------------
                Panel slideb = new Panel();
		    slideb.setBackground(Color.black);
		    add(slideb);
		    slideb.setBounds(state.s10-1,ypos2+state.s3-1,state.s160+2,state.s15+2);
		Panel slideb1 = new Panel();
		    slideb1.setBackground(Color.green);
		    add(slideb1);
		    slideb1.setBounds(state.s10-4,ypos2+state.s3-4,state.s160+8,state.s15+8);
                Panel slideb2 = new Panel();
		    slideb2.setBackground(Color.black);
		    add(slideb2);
		    slideb2.setBounds(state.s10-5,ypos2+state.s3-5,state.s160+10,state.s15+10);
                //--------------------------------------------------------------
                Panel slidec = new Panel();
		    slidec.setBackground(Color.black);
		    add(slidec);
		    slidec.setBounds(state.s10-1,ypos3+state.s3-1,state.s160+2,state.s15+2);
		Panel slidec1 = new Panel();
		    slidec1.setBackground(Color.red);
		    add(slidec1);
		    slidec1.setBounds(state.s10-4,ypos3+state.s3-4,state.s160+8,state.s15+8);
                Panel slidec2 = new Panel();
		    slidec2.setBackground(Color.black);
		    add(slidec2);
		    slidec2.setBounds(state.s10-5,ypos3+state.s3-5,state.s160+10,state.s15+10);
                //--------------------------------------------------------------
                Panel slided = new Panel();
		    slided.setBackground(Color.black);
		    add(slided);
		    slided.setBounds(state.s10-1,ypos4+state.s3-1,state.s160+2,state.s15+2);
		Panel slided1 = new Panel();
		    slided1.setBackground(Color.red);
		    add(slided1);
		    slided1.setBounds(state.s10-4,ypos4+state.s3-4,state.s160+8,state.s15+8);
                Panel slided2 = new Panel();
		    slided2.setBackground(Color.black);
		    add(slided2);
		    slided2.setBounds(state.s10-5,ypos4+state.s3-5,state.s160+10,state.s15+10);
                //--------------------------------------------------------------
                */
		Panel updat1 = new Panel();
		    updat1.setBackground(Color.white);
		    add(updat1);
		    updat1.setBounds(state.s10-1,ypos5-state.s2-1,state.s100+2,state.s20+2);
		Panel updat2 = new Panel();
		    updat2.setBackground(Color.black);
		    add(updat2);
		    updat2.setBounds(state.s10-2,ypos5-state.s2-2,state.s100+4,state.s20+4);
				
		//Listeners
		slider1.addChangeListener(this);
		slider2.addChangeListener(this);
		slider3.addChangeListener(this);
		slider4.addChangeListener(this);
		c1.addItemListener(this);
		c2.addItemListener(this);
		c3.addItemListener(this);
		c4.addItemListener(this);
		c5.addItemListener(this);
		c6.addItemListener(this);
		b1.addActionListener(this);
	}
	
	public void paint(Graphics g){
            //g.draw3DRect(0,0,getSize().width-1,getSize().height-1,false);
            g.clearRect(0,0,getSize().width,getSize().height);

            g.drawLine(0,getSize().height-1,getSize().width-1,getSize().height-1);
            g.drawLine(getSize().width-1,0,getSize().width-1,getSize().height-1);
            g.setColor(Color.white);
            g.drawLine(0,0,getSize().width-1,0);
            g.drawLine(0,0,0,getSize().height-1);

            Graphics2D g2d = (Graphics2D)g;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

            g.setColor(Color.black);
            g.setFont(new Font("SanSerif",Font.BOLD,state.font12));
            //g.setColor(Color.green);
            g.drawString("Amplitude X",state.s60,ypos1-state.s5);
            g.drawString("Phase X",state.s60,ypos2-state.s5);
            //g.setColor(Color.red);
            g.drawString("Amplitude Y",state.s60,ypos3-state.s5);
            g.drawString("Phase Y",state.s60,ypos4-state.s5);
            g.setFont(new Font("SanSerif",Font.BOLD,state.font12));
            g.setColor(Color.blue.darker());
            g.drawString("Trace:",state.s55,ypos6+state.s12);

            g.setColor(Color.black);

            int sety = ypos5-state.s7;
            int sety2 = ypos5+state.s21;
            int setx = state.s120;
            int setx2 = state.s119;
            
            MaestroG.subscripterB("Animation speed","","",g,state.font10,setx+state.s18,sety);
            
            g.setColor(Color.blue.darker());
            drawArrowNew(setx+state.s10,sety2,2,g);
            drawArrowNew(setx+state.s17,sety2,2,g);

            g.setColor(Color.red.darker());
            drawArrowNew(setx+setx2-state.s17,sety2,1,g);
            drawArrowNew(setx+setx2-state.s10,sety2,1,g);
            //------------------------------------------------------------------
	    slider1.requestFocusInWindow();
	    slider2.requestFocusInWindow();
	    slider3.requestFocusInWindow();
	    slider4.requestFocusInWindow();
	    slider_speed.requestFocusInWindow();
	}
        
        public void drawArrowNew(int x, int y, int tipo, Graphics g){
	Graphics2D g2d = (Graphics2D)g;
	 
        switch (tipo){
	   case 1://ArrowRightSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
          	Polygon pK = new Polygon();
		pK.addPoint(x+state.s2, y-state.s2);
		pK.addPoint(x+state.s2, y+state.s2);
		pK.addPoint(x+state.s7,y);
		g.drawPolygon(pK);
		g.fillPolygon(pK);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
	   
	   break;
           
           case 2://ArrowLeftSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                Polygon pL = new Polygon();
		pL.addPoint(x-state.s2, y-state.s2);
		pL.addPoint(x-state.s2, y+state.s2);
		pL.addPoint(x-state.s7,y);
		g.drawPolygon(pL);
		g.fillPolygon(pL);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
 
	   break;
          
	}		
    }
	
	public void stateChanged(ChangeEvent evt){
		
		if(slider1.getValue()>(ScrollAmpMax-ScrollAmpMin)){
		    slider1.setValue(ScrollAmpMax-ScrollAmpMin);
		    state.ampA = 1.0;
		}
		else{
		    state.ampA = (double)slider1.getValue()/(ScrollAmpMax-ScrollAmpMin);    
		}
		if(slider3.getValue()>(ScrollAmpMax-ScrollAmpMin)){
		    slider3.setValue(ScrollAmpMax-ScrollAmpMin);
		    state.ampB = 1.0;
		}
		else{
		    state.ampB = (double)slider3.getValue()/(ScrollAmpMax-ScrollAmpMin);
		}
	   
	   if(slider2.getValue()>=360){
		slider2.setValue(360);
		state.phaseA = Math.PI;
		
		if(c2.getState()){
		    //radians
		    text2.setText(String.valueOf(MaestroA.rounder(Math.PI,4)));
		
		}
		else {
		    //degrees
		    text2.setText(String.valueOf(MaestroA.rounder(Math.PI*180/Math.PI,4)));
		}
	   }
	   else{
		state.phaseA = (double)slider2.getValue()*2*Math.PI/(ScrollPhaseMax-ScrollPhaseMin);
		if(c2.getState()){
		    //radians
		    text2.setText(String.valueOf(MaestroA.rounder(state.phaseA,4)));
		
		}
		else {
		    //degrees
		    text2.setText(String.valueOf(MaestroA.rounder(state.phaseA*180/Math.PI,4)));
		}
	   }
	   
	   if(slider4.getValue()>=(360)){
		slider4.setValue(360);
		state.phaseB = Math.PI;
		if(c4.getState()){
		    //radians
		    text4.setText(String.valueOf(MaestroA.rounder(Math.PI,4)));
		}
		else {
		    //degrees
		    text4.setText(String.valueOf(MaestroA.rounder(Math.PI*180/Math.PI,4)));
		}
	   }
	   else{
		state.phaseB = (double)slider4.getValue()*2*Math.PI/(ScrollPhaseMax-ScrollPhaseMin);
		if(c4.getState()){
		    //radians
		    text4.setText(String.valueOf(MaestroA.rounder(state.phaseB,4)));
		}
		else {
		    //degrees
		    text4.setText(String.valueOf(MaestroA.rounder(state.phaseB*180/Math.PI,4)));
		}
	   
	   }
	   
	    
	    
	    text1.setText(String.valueOf(MaestroA.rounder(state.ampA,3)));
	    text3.setText(String.valueOf(MaestroA.rounder(state.ampB,3)));
	    
	    state.reset();
	    
	    /*if(c2.getState()){
		//radians
		text2.setText(String.valueOf(MaestroA.rounder(state.phaseA,4)));
		
	    }
	    else {
		//degrees
		text2.setText(String.valueOf(MaestroA.rounder(state.phaseA*180/Math.PI,3)));
	    }
	    if(c4.getState()){
		//radians
		text4.setText(String.valueOf(MaestroA.rounder(state.phaseB,4)));
	    }
	    else {
		//degrees
		text4.setText(String.valueOf(MaestroA.rounder(state.phaseB*180/Math.PI,3)));
	    }*/
	}
	
	public void actionPerformed(ActionEvent evt){
	   state.reset();
	   int  DIGITS = 3;
	   synchronized(this){
	   if(evt.getSource() == b1){
		//Toolkit.getDefaultToolkit().beep();
		state.ampA = Double.valueOf(text1.getText()).doubleValue();
		if(state.ampA > 1.0) { 
		    state.ampA = 1.0;
		    text1.setText(String.valueOf(MaestroA.rounder(state.ampA,DIGITS)));
		}
		if(state.ampA < 0.0) {
		    state.ampA = 0.0;
		    text1.setText(String.valueOf(state.ampA));
		}
		state.ampB = Double.valueOf(text3.getText()).doubleValue();
		if(state.ampB > 1.0) { 
		    state.ampB = 1.0;
		    text3.setText(String.valueOf(MaestroA.rounder(state.ampB,DIGITS)));
		}
		if(state.ampB < 0.0) {
		    state.ampB = 0.0;
		    text3.setText(String.valueOf(MaestroA.rounder(state.ampB,DIGITS)));
		}
		if(c2.getState()){
		    state.phaseA=Double.valueOf(text2.getText()).doubleValue();
		    text2.setText(String.valueOf(state.phaseA));
		    if(state.phaseA > Math.PI){
	    		state.phaseA = Math.PI;
			text2.setText(String.valueOf(MaestroA.rounder(Math.PI,DIGITS+1)));
		    }
		    if(state.phaseA < (-Math.PI)){
			state.phaseA = -Math.PI;
			text2.setText(String.valueOf(-MaestroA.rounder(Math.PI,DIGITS+1)));
		    }
		}
		else{
		    state.phaseA=Double.valueOf(text2.getText()).doubleValue()*Math.PI/180;
		    text2.setText(String.valueOf(MaestroA.rounder(state.phaseA*180/Math.PI,4)));
		    if(state.phaseA > Math.PI){
			state.phaseA = Math.PI;
			text2.setText(String.valueOf(180.0));
		    }
		    if(state.phaseA < (-Math.PI)){
			state.phaseA = -Math.PI;
			text2.setText(String.valueOf(-180.0));
		    }	
	    	}
		if(c4.getState()){
		    state.phaseB=Double.valueOf(text4.getText()).doubleValue();
		    text4.setText(String.valueOf(MaestroA.rounder(state.phaseB,DIGITS+1)));
		    if(state.phaseB > Math.PI){
			state.phaseB = Math.PI;
			text4.setText(String.valueOf(MaestroA.rounder(Math.PI,DIGITS+1)));
		    }
		    if(state.phaseB < (-Math.PI)){
			state.phaseB = -Math.PI;
			text4.setText(String.valueOf(-MaestroA.rounder(Math.PI,DIGITS+1)));
		    }
		}
		else{
			state.phaseB=Double.valueOf(text4.getText()).doubleValue()*Math.PI/180;
			text4.setText(String.valueOf(MaestroA.rounder(state.phaseB*180/Math.PI,DIGITS+1)));
			if(state.phaseB > Math.PI){
				state.phaseB = Math.PI;
				text4.setText(String.valueOf(180.0));
			}
			if(state.phaseB < -Math.PI){
				state.phaseB = -Math.PI;
				text4.setText(String.valueOf(-180.0));
			}	
		}	
		
		slider1.setValue((int)((ScrollAmpMax-ScrollAmpMin)*state.ampA));
		slider2.setValue((int)((ScrollPhaseMax-ScrollPhaseMin)*state.phaseA/(2.0*Math.PI)));
		slider3.setValue((int)((ScrollAmpMax-ScrollAmpMin)*state.ampB));
		slider4.setValue((int)((ScrollPhaseMax-ScrollPhaseMin)*state.phaseB/(2.0*Math.PI)));
		//state.reset();
	      }
           }
	}
	
	public void itemStateChanged(ItemEvent evt){
	    int  DIGITS = 3;
	    if(evt.getSource() == c1 || evt.getSource() == c2){
		
		if(c2.getState()){
		    text2.setText(String.valueOf(MaestroA.rounder(state.phaseA,DIGITS+1)));
		}
		else{
		    text2.setText(String.valueOf(MaestroA.rounder(state.phaseA*180/Math.PI,DIGITS+1)));
		}
	    }
	    else if(evt.getSource() == c3 || evt.getSource() == c4){
		if(c4.getState()){
		    text4.setText(String.valueOf(MaestroA.rounder(state.phaseB,DIGITS+1)));
		}
		else{
		    text4.setText(String.valueOf(MaestroA.rounder(state.phaseB*180/Math.PI,DIGITS+1)));
		}
	    }
	    else if(evt.getSource() == c5 || evt.getSource() == c6){
		state.isTracerOn = c5.getState();
                state.reset();
                repaint();
	    }
	    //state.reset();
	}
	
	public synchronized void setState(Polarization_State state){
		this.state = state;
	}
	
}//End of Polarization_Controls.java
