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


public class NewGuideInputPanel extends Panel implements ActionListener, ChangeListener {
    private NewGuide_State state;
    private static final Color bgcolor = new Color(236,236,221);
    
    private Font labfont;
    private Font labfont2;
    private Font normalfont;
    private Font labelfont;
    
    //public int ScrollMax = 10000;
    public int ScrollMax = 100;
    public int offset = 20;
    private Label titlelabel;
    private Label lab0, lab1, lab3, lab3b, lab3c, lab4, lab6a, lab6b, lab6c, lab2;
    private Label ulab2, ulab4, ulab3;
    public TextField text1, text2, text3, text4, text5, text6;
    //public Scrollbar slider1, slider2, slider3, slider5;
    public JSlider slider1, slider2, slider3;
   
    public  Button b1, b2, b3;
    public  Button bupdate;
    
    public Panel ps1, ps2;
    //Choice ch1, ch2;

    private Label updateNeeded;
  
    public NewGuideInputPanel(NewGuide_State state){
	super();
	setLayout(null);
	setBackground(bgcolor);
	this.state = state;
        
        offset = state.s20;
        labfont=new Font("SanSerif",Font.PLAIN,state.font12);
        labfont2=new Font("Serif",Font.PLAIN,state.font12);
        normalfont = new Font("SanSerif",Font.PLAIN,state.font14);
        labelfont = new Font("Serif",Font.PLAIN,state.font14);
    
	titlelabel = new Label("Set Antenna Parameters",Label.CENTER);
	titlelabel.setFont(new Font("SanSerif",Font.BOLD,state.font16));    
	
	lab0 = new Label("Plot:",Label.RIGHT);
	lab0.setFont(new Font("SanSerif",Font.BOLD,state.font12));
	
	lab1 = new Label("Dipole A - Length =  ",Label.RIGHT);
	lab1.setFont(labelfont);
	lab2 = new Label("Dipole B - Length =  ",Label.RIGHT);
	lab2.setFont(labelfont);
	lab3 = new Label("\u03b5",Label.RIGHT);
	lab3.setFont(labelfont);
	lab3b = new Label("r",Label.LEFT);
	lab3b.setFont(labelfont);
	lab3.setForeground(Color.black);
	lab3b.setForeground(Color.black);
	lab3c = new Label("=",Label.LEFT);
	lab3c.setFont(labelfont);
	lab3c.setForeground(Color.black);
	lab4 = new Label("Frequency =  ",Label.RIGHT);
	lab4.setFont(labelfont);	
	lab6a = new Label("Wire",Label.CENTER);
	lab6a.setFont(labfont2);
	lab6b = new Label("Radius",Label.CENTER);
	lab6b.setFont(labfont2);
	lab6c = new Label(" = ",Label.RIGHT);
	lab6c.setFont(labelfont);
			
	text1 = new TextField(""+state.a,8);
	text2 = new TextField(""+state.a2,8);
	text3 = new TextField(""+state.epsilon_r,8);
	text4 = new TextField(""+state.frequency,8);
	text5 = new TextField(""+state.distance,8);
	text6 = new TextField(""+state.wire_radius,8);
        text1.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
        text2.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
        text3.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
        text4.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
        text5.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
        text6.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
        
	ulab4 = new Label(" [Hz]",Label.LEFT);
	ulab2 = new Label(" \u03bb",Label.LEFT);
        ulab3 = new Label(" \u03bb",Label.LEFT);
	ulab4.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
        ulab2.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
        ulab3.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
        
        slider1 = new JSlider(0,ScrollMax);   //changes a
	slider2 = new JSlider(0,ScrollMax);  //changes frequency (below slider1 and slider3)
	slider3 = new JSlider(0,ScrollMax); //changes current
        
	slider1.setValue((int)((state.a-state.a_minimum)*ScrollMax/(state.a_maximum-state.a_minimum)));
	slider2.setValue((int)((state.frequency-state.frequency_minimum)*ScrollMax/(state.frequency_maximum-state.frequency_minimum)));
	slider3.setValue((int)((state.a2-state.a2_minimum)*ScrollMax/(state.a2_maximum-state.a2_minimum)));
	
        
	b1 = new Button("Range");
	b2 = new Button("Range");
	b3 = new Button("Range");
        b1.setBackground(Color.white);
	b2.setBackground(Color.white);
        b3.setBackground(Color.white);
        b1.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
        b2.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
        b3.setFont(new Font("SanSerif",Font.PLAIN,state.font12));

	updateNeeded = new Label("Click Update to recalculate values");
	updateNeeded.setFont(new Font("SanSerif",Font.BOLD,state.font12));
	updateNeeded.setVisible(false);
	updateNeeded.setForeground(Color.red);
        
	bupdate = new Button("Update");
        bupdate.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
        bupdate.setBackground(Color.white);
	add(titlelabel);
	
	add(lab1);
	add(lab2);
	add(lab3);
	add(lab3b);
	add(lab3c);
	add(lab4);
	add(lab6a);
	add(lab6b);
	add(lab6c);
	
	add(text1);
	add(text2);
	add(text3);
	add(text4);
	add(text6);
	
	add(ulab4);
	add(ulab2);
	add(ulab3);
        
        add(slider1);
	add(slider2);
	add(slider3);
		
	add(b1);
	add(b2);
	add(b3);
	add(bupdate);

	add(updateNeeded);

	updateNeeded.setBounds(state.s50,state.s50,state.s200+state.s80,state.s18);
	
	titlelabel.setBounds(state.s10,state.s10,state.s200+state.s80,state.s18);
	lab0.setBounds(state.s58,state.s42,state.s30,state.s20);
	//ch2.setBounds(state.s93,state.s42,state.s150,state.s20);
	int vPosInit = state.s50+offset, vPos, dvPos = state.s7, vHeight = state.s18, vSlider = state.s15; 
	vPos = vPosInit;
	
	lab1.setBounds(state.s20,vPos-state.s3,state.s147,vHeight);    
	text1.setBounds(state.s170,vPos-state.s3,state.s80,vHeight);
        Panel ptext1 = new Panel();
	    ptext1.setBackground(Color.black);
	    add(ptext1);
	    ptext1.setBounds(state.s170-1,vPos-state.s3-1,state.s80+2,vHeight+2);
	ulab3.setBounds(state.s250+state.s2,vPos-state.s3,state.s35,vHeight); 
        
	vPos += vHeight + state.s2;   

        if(state.IsMac){
            slider1.setBounds(state.s80+state.s14,vPos+state.s2,state.s196-state.s28,vSlider);
        }
        else{
            slider1.setBounds(state.s80,vPos+state.s2,state.s196,vSlider);
        }
	
	b1.setBounds(state.s15,vPos,state.s55,vHeight+state.s2);
	Panel prange1 = new Panel();
	    prange1.setBackground(Color.black);
	    add(prange1);
	    prange1.setBounds(state.s15-1,vPos-1,state.s55+2,vHeight+state.s2+2);
	
	vPos += vHeight + 2*dvPos;
    	lab2.setBounds(state.s20,vPos-state.s3,state.s147,vHeight);
	text2.setBounds(state.s170,vPos-state.s3,state.s80,vHeight);
        Panel ptext2 = new Panel();
	    ptext2.setBackground(Color.black);
	    add(ptext2);
	    ptext2.setBounds(state.s170-1,vPos-state.s3-1,state.s80+2,vHeight+2);
	ulab2.setBounds(state.s250+state.s2,vPos-state.s3,state.s35,vHeight);   
	
	vPos += vHeight + state.s2;
	//slider for current
        if(state.IsMac){
            slider3.setBounds(state.s80+state.s14,vPos+state.s2,state.s196-state.s28,vSlider);
        }
        else{
            slider3.setBounds(state.s80,vPos+state.s2,state.s196,vSlider);
        }
	
	b3.setBounds(state.s15,vPos,state.s55,vHeight+state.s2);
	Panel prange3 = new Panel();
	    prange3.setBackground(Color.black);
	    add(prange3);
	    prange3.setBounds(state.s15-1,vPos-1,state.s55+2,vHeight+state.s2+2);
	    
	vPos += vHeight + 2*dvPos;
    	lab4.setBounds(state.s20,vPos-state.s3,state.s147,vHeight);
	text4.setBounds(state.s170,vPos-state.s3,state.s80,vHeight);
        Panel ptext4 = new Panel();
	    ptext4.setBackground(Color.black);
	    add(ptext4);
	    ptext4.setBounds(state.s170-1,vPos-state.s3-1,state.s80+2,vHeight+2);
	ulab4.setBounds(state.s250+state.s2,vPos-state.s3,state.s40,vHeight);   
	
	vPos += vHeight + state.s2;
	
	//slider for frequency    
        if(state.IsMac){
            slider2.setBounds(state.s80+state.s14,vPos+state.s2,state.s196-state.s28,vSlider);
        }
        else{
            slider2.setBounds(state.s80,vPos+state.s2,state.s196,vSlider);
        }
	
	b2.setBounds(state.s15,vPos,state.s55,vHeight+state.s2);
        Panel prange2 = new Panel();
	    prange2.setBackground(Color.black);
	    add(prange2);
	    prange2.setBounds(state.s15-1,vPos-1,state.s55+2,vHeight+state.s2+2);
	
	vPos += vHeight + 2*dvPos;
	
	text3.setBounds(state.s80,vPos,state.s80,vHeight);
        Panel ptext3 = new Panel();
	    ptext3.setBackground(Color.black);
	    add(ptext3);
	    ptext3.setBounds(state.s80-1,vPos-1,state.s80+2,vHeight+2);
	lab3.setBounds(state.s25,vPos,state.s25,vHeight);
	lab3b.setBounds(state.s52,vPos+state.s6,state.s10,vHeight);
	lab3c.setBounds(state.s65,vPos,state.s10,vHeight);
	
	//vPos += vHeight + 2*dvPos-state.s2;
        vPos = state.s200+state.s60;
	// update
        // CHANGE ==============================================================
	bupdate.setBounds(state.s35,vPos+state.s4,state.s200+state.s25,vHeight+state.s4);
        bupdate.setFont(labfont);
        //======================================================================

    
	//Listeners
	bupdate.addActionListener(this);
	
	slider1.addChangeListener(this); 
	slider2.addChangeListener(this); 
	slider3.addChangeListener(this);
    }
    
    public void paint(Graphics g){

	System.out.println("PAINT CALLED");
	
	g.setColor(bgcolor.darker());
	g.fillRect(0,getSize().height-2,getSize().width,2);
	g.fillRect(getSize().width-2,0,2,getSize().height);
	g.setColor(bgcolor.brighter());
	g.fillRect(0,0,2,getSize().height-1);
	g.fillRect(0,0,getSize().width-2,2);
	
        int vPosInit = state.s30; 
        int vPos;
        int dvPos = state.s2;
        int vHeight = state.s20;
        
	vPos = vPosInit;
	g.setColor(Color.black);
	g.drawLine(state.s10,state.s35,getSize().width-state.s10,state.s35);

	/*
	g.setColor(Color.red);    
	g.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
	
	g.setColor(Color.black);
	g.setFont(new Font("SanSerif",Font.BOLD,state.font12));

	
        if(state.need_update){
            g.setColor(Color.red);    
            g.drawString("Click Update to recalculate values",state.s50,state.s50);
        }
	*/

	slider1.requestFocusInWindow();
	slider2.requestFocusInWindow();
	slider3.requestFocusInWindow();
    }

    
    public void actionPerformed(ActionEvent evt){
       
        //***********
        if(evt.getSource()==bupdate){
	//*********
	  state.need_update = false;
	  updateNeeded.setVisible(false);
	    try{ if(Double.valueOf(text1.getText()).doubleValue()<=state.a_maximum &&
		    Double.valueOf(text1.getText()).doubleValue()>=state.a_minimum){
		    state.a=Double.valueOf(text1.getText()).doubleValue();
		    slider1.setValue((int)(ScrollMax*(state.a-state.a_minimum)
						    /(state.a_maximum-state.a_minimum)));
		 }
		 else if(Double.valueOf(text1.getText()).doubleValue()>state.a_maximum){
		    state.a = state.a_maximum;
		    text1.setText(""+state.a_maximum);
		    slider1.setValue(ScrollMax);
		 }
		 else if(Double.valueOf(text1.getText()).doubleValue()<state.a_minimum){
		    state.a = state.a_minimum;
		    text1.setText(""+state.a_minimum);
		    slider1.setValue(0);
		 }
		 
	    }
	     catch(NumberFormatException e){
		  state.a =  0.0;
	    } 	    
	    
	    try{if(Double.valueOf(text3.getText()).doubleValue()>=1.0){
		    state.epsilon_r=Double.valueOf(text3.getText()).doubleValue();
		}
		else{
		    state.epsilon_r=1.0;
		    text3.setText(""+state.epsilon_r);
		}
	    }
	    catch(NumberFormatException e){
		  state.epsilon_r = 1.0;
	    }
	    
	     /* 
	    try{if(Double.valueOf(text6.getText()).doubleValue()>=0.0){
		  if(Double.valueOf(text6.getText()).doubleValue() <= state.DipoleLength_lambda/10.){
		    state.wire_radius=Double.valueOf(text6.getText()).doubleValue();
		  }
		  if(Double.valueOf(text6.getText()).doubleValue() > state.DipoleLength_lambda/10.){
		    state.wire_radius=state.DipoleLength_lambda/10.;
		  }
		}
		else{
		    state.wire_radius=1.0e-5;
		    text6.setText(""+state.wire_radius);
		}
		
	    }
	    catch(NumberFormatException e){
		  state.wire_radius = 1.0e-5;
	    } 
	    */
	     
	    try{if((Double.valueOf(text6.getText()).doubleValue())>=0.0 
		   //&&(Double.valueOf(text6.getText()).doubleValue())<=(state.DipoleLength_lambda/10.)
		   ){
	    
		      state.wire_radius=Double.valueOf(text6.getText()).doubleValue();
		}
		//else if(Double.valueOf(text6.getText()).doubleValue() > state.DipoleLength_lambda/10.){
		//    state.wire_radius=state.DipoleLength_lambda/10.;
		//    text6.setText(""+state.wire_radius);
		//}
		else if((Double.valueOf(text6.getText()).doubleValue())<0.0){
		    state.wire_radius=1.0e-5;
		    text6.setText(""+state.wire_radius);
		}
		
	    }
	    catch(NumberFormatException e){
		  state.wire_radius = 1.0e-5;
	    }   
	      
	    
	    try{if(Double.valueOf(text4.getText()).doubleValue()<=state.frequency_maximum &&
		    Double.valueOf(text4.getText()).doubleValue()>=state.frequency_minimum){
		    state.frequency=Double.valueOf(text4.getText()).doubleValue();
		    slider2.setValue((int)(ScrollMax*(state.frequency-state.frequency_minimum)/
					    (state.frequency_maximum-state.frequency_minimum)));
		}
		else if(Double.valueOf(text4.getText()).doubleValue()>state.frequency_maximum){
		    state.frequency = state.frequency_maximum;
		    text4.setText(""+state.frequency_maximum);
		    slider2.setValue(ScrollMax);
		}
		else if(Double.valueOf(text4.getText()).doubleValue()<state.frequency_minimum){
		    state.frequency = state.frequency_minimum;
		    text4.setText(""+state.frequency_minimum);
		    slider2.setValue(0);
		}
	    }
	    catch(NumberFormatException e){
		  state.frequency = 0.0; 
	    }
	    /*
	    try{if(Double.valueOf(text2.getText()).doubleValue()<=state.currentin_maximum &&
		    Double.valueOf(text2.getText()).doubleValue()>=state.currentin_minimum){
		    state.currentin=Double.valueOf(text2.getText()).doubleValue();
		    slider3.setValue((int)(ScrollMax*(state.currentin-state.currentin_minimum)/
					    (state.currentin_maximum-state.currentin_minimum)));
		}
		else if(Double.valueOf(text2.getText()).doubleValue()>state.currentin_maximum){
		    state.currentin = state.currentin_maximum;
		    text2.setText(""+state.currentin_maximum);
		    slider3.setValue(ScrollMax);
		}
		else if(Double.valueOf(text2.getText()).doubleValue()<state.currentin_minimum){
		    state.currentin = state.currentin_minimum;
		    text2.setText(""+state.currentin_minimum);
		    slider3.setValue(0);
		}
	    }
	    catch(NumberFormatException e){
		  state.currentin = 0.0; 
	    }
	    */
	    
	    try{if(Double.valueOf(text2.getText()).doubleValue()<=state.a2_maximum &&
		    Double.valueOf(text2.getText()).doubleValue()>=state.a2_minimum){
		    state.a2=Double.valueOf(text2.getText()).doubleValue();
		    slider3.setValue((int)(ScrollMax*(state.a2-state.a2_minimum)/
					    (state.a2_maximum-state.a2_minimum)));
		}
		else if(Double.valueOf(text2.getText()).doubleValue()>state.a2_maximum){
		    state.a2 = state.a2_maximum;
		    text2.setText(""+state.a2_maximum);
		    slider3.setValue(ScrollMax);
		}
		else if(Double.valueOf(text2.getText()).doubleValue()<state.a2_minimum){
		    state.a2 = state.a2_minimum;
		    text2.setText(""+state.a2_minimum);
		    slider3.setValue(0);
		}
	    }
	    catch(NumberFormatException e){
		  state.a2 = 0.0; 
	    }
	    
	    
	  }
	    state.ignition();
            //repaint();                // NOT NEEDED!!!!
    }//End of actionPerformed()


    
    public void stateChanged(ChangeEvent evt){
	if(evt.getSource()==slider2){
            state.need_update = true;
	    state.frequency = state.frequency_minimum + 
		(state.frequency_maximum-state.frequency_minimum)*slider2.getValue()/ScrollMax;
	    
	    text4.setText(""+state.frequency);
	    state.ignition();
	    updateNeeded.setVisible(true);
	}
	//-----------------------------------------
	else if(evt.getSource()==slider1){
            state.need_update = true;
	    state.a  = state.a_minimum + 
		(state.a_maximum-state.a_minimum)*slider1.getValue()/ScrollMax;
	    text1.setText(""+MaestroA.rounder(state.a,7));
	    state.ignition();
	    updateNeeded.setVisible(true);
	}
	
	//------------------------------------------
	else if(evt.getSource()==slider3){
            state.need_update = true;
	    state.a2  = state.a2_minimum + 
		(state.a2_maximum-state.a2_minimum)*slider3.getValue()/ScrollMax;
	    text2.setText(""+MaestroA.rounder(state.a2,7));
	    state.ignition();
	    updateNeeded.setVisible(true);
	}
	
    }
    
}


