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

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

public class InputPanel extends Panel implements ActionListener, ItemListener, ChangeListener{
    private static final Color bgcolor = new Color(236,236,236);
    private Color colortext = Color.gray;
    
    Label tlab1, ulab1, ulab3;
    Label tlab2, ulab2_1, ulab2_2;
    Label tlab3, tlab4, clab, tracelab, flab, epslab;
    TextField tf1, tf2_1, tf2_2, tf4, tf_freq, tf_eps;
    Checkbox ch1, ch2, ch3, ch4, ch5, ch6;
    CheckboxGroup chgrpa, checkbox, checktrace;
    public Button b1;
    StateVars state;
    private Image im;
    private Graphics buf;
    public JSlider slider;
    public int SCROLLMIN=0, SCROLLMAX=1001;
    public int SleepTime = 101;
    final Font labfont, titlefont;
    
    InputPanel(StateVars state){
	super();
	this.state = state;
	setBackground(bgcolor);
	setLayout(null);
        
	labfont = new Font("Sanserif",Font.PLAIN,state.font12);
        titlefont = new Font("Sanserif",Font.BOLD,state.font14);
        
	tlab1 = new Label(" Characteristic Impedance = ",Label.LEFT);
	tlab2 = new Label(" Load Impedance = ",Label.LEFT);
	tlab3 = new Label(" Stub Configuration : ",Label.LEFT);
	flab = new Label(" Frequency = ",Label.LEFT);
	tlab4 = new Label(" Sleep Timestep = ",Label.LEFT);
	clab = new Label(" Display Line Impedance?",Label.LEFT);
	tracelab = new Label(" Persistent Trace on Chart?", Label.LEFT);
	epslab = new Label("  \u03b5   =", Label.LEFT);
	
	tlab1.setFont(labfont);
	tlab1.setBackground(bgcolor.brighter());
	tlab2.setFont(labfont);
	tlab2.setBackground(bgcolor.brighter());
	tlab3.setFont(labfont);
	tlab3.setBackground(bgcolor.brighter());
	
	flab.setFont(labfont);
	flab.setBackground(bgcolor.brighter());
	epslab.setFont(labfont);
	epslab.setBackground(bgcolor.brighter());
	
	tlab4.setFont(labfont);
	tlab4.setBackground(bgcolor.brighter());
	tlab4.setForeground(Color.blue);
	
	clab.setFont(labfont);
	clab.setBackground(bgcolor.brighter());
	clab.setForeground(Color.blue);
	
	tracelab.setFont(labfont);
	tracelab.setBackground(bgcolor.brighter());
	tracelab.setForeground(Color.red);
	
	ulab1 = new Label("\u03a9",Label.LEFT);
	ulab1.setFont(labfont);
	ulab3 = new Label("Hz",Label.LEFT);
	ulab3.setFont(labfont);
	
	tf1 = new TextField(""+MaestroA.rounder(state.getZ0(),2));
	tf2_1 = new TextField(""+MaestroA.rounder(state.getZL().Real(),2));
	tf2_2 = new TextField(""+MaestroA.rounder(state.getZL().Imaginary(),2));
	tf4 = new TextField(""+state.getSleep());
	tf_freq = new TextField(""+MaestroA.rounder(state.frequency,3));
	tf_eps = new TextField(""+MaestroA.rounder(state.epsilon_r,3));
	
        tf1.setFont(labfont);
        tf2_1.setFont(labfont);
        tf2_2.setFont(labfont);
        tf4.setFont(labfont);
        tf_freq.setFont(labfont);
        tf_eps.setFont(labfont);
        
	ulab2_1 = new Label(" + j ",Label.LEFT);
	ulab2_1.setFont(labfont);
	
	ulab2_2 = new Label("\u03a9",Label.LEFT);
	ulab2_2.setFont(labfont);
	
	chgrpa = new CheckboxGroup();
	
	ch1 = new Checkbox("Open",false,chgrpa);
	ch2 = new Checkbox("Short",true,chgrpa);
	ch1.setFont(labfont);
	ch2.setFont(labfont);
	ch1.setBackground(bgcolor);
	ch2.setBackground(bgcolor);
	ch1.setForeground(Color.black);
	ch2.setForeground(Color.black);
	
	checkbox = new CheckboxGroup();
	ch3 = new Checkbox("Yes",false,checkbox);
	ch4 = new Checkbox("No",true,checkbox);
	ch3.setFont(labfont);
	ch4.setFont(labfont);
	ch3.setBackground(bgcolor);
	ch4.setBackground(bgcolor);
	ch3.setForeground(Color.blue);
	ch4.setForeground(Color.blue);
	
	checktrace = new CheckboxGroup();
	
	ch5 = new Checkbox("Yes",true,checktrace);
	ch6 = new Checkbox("No",false,checktrace);
	ch5.setFont(labfont);
	ch6.setFont(labfont);
	ch5.setBackground(bgcolor);
	ch6.setBackground(bgcolor);
	ch5.setForeground(Color.red);
	ch6.setForeground(Color.red);
	
	b1 = new Button("Update");
	b1.setFont(labfont);
        b1.setBackground(Color.white);
	slider = new JSlider(SCROLLMIN,SCROLLMAX);
	slider.setValue(SCROLLMAX-SleepTime);
        //slider = new Scrollbar(Scrollbar.HORIZONTAL,SCROLLMAX-SleepTime,1,SCROLLMIN,SCROLLMAX);
        add(slider);
        slider.setBackground(bgcolor);
        slider.setForeground(Color.lightGray);
        
	add(ulab2_1);
	add(ulab3);
	
	add(tf1);
	add(tf2_1);
	add(tf2_2);
	add(tf4);
	add(tf_freq);
	add(tf_eps);
	
	add(ch1);
	add(ch2);
	add(ch3);
	add(ch4);
	add(ch5);
	add(ch6);

	add(b1);
	
        int x_shift = state.s30;
        
        //======================================================================
        
        tf1.setBounds(state.s125+x_shift,state.s12,state.s60,state.s18);
        Panel ptf1 = new Panel();
	    ptf1.setBackground(colortext);
	    add(ptf1);
	    ptf1.setBounds(state.s125+x_shift-1,state.s12-1,state.s60+2,state.s18+2);
	//ulab1.setBounds(state.s199+x_shift,state.s22,state.s25,state.s18);
	
        tf2_1.setBounds(state.s125+x_shift,state.s39,state.s60,state.s18);
        Panel ptf21 = new Panel();
	    ptf21.setBackground(colortext);
	    add(ptf21);
	    ptf21.setBounds(state.s125+x_shift-1,state.s39-1,state.s60+2,state.s18+2);
	ulab2_1.setBounds(state.s192+x_shift,state.s39,state.s35,state.s18);
        
	tf2_2.setBounds(state.s200+x_shift+state.s30,state.s39,state.s60,state.s18);
        Panel ptf22 = new Panel();
	    ptf22.setBackground(colortext);
	    add(ptf22);
	    ptf22.setBounds(state.s200+x_shift+state.s30-1,state.s39-1,state.s60+2,state.s18+2);
	//ulab2_2.setBounds(state.s200+x_shift+state.s75,state.s39,state.s20,state.s18);
	
	tf_freq.setBounds(state.s125+x_shift,state.s66,state.s60,state.s18);
        Panel ptfreq = new Panel();
	    ptfreq.setBackground(colortext);
	    add(ptfreq);
	    ptfreq.setBounds(state.s125+x_shift-1,state.s66-1,state.s60+2,state.s18+2);
	ulab3.setBounds(state.s192+x_shift,state.s66,state.s25,state.s18);
        
        tf_eps.setBounds(state.s125+x_shift,state.s93,state.s60,state.s18);
        Panel pteps = new Panel();
	    pteps.setBackground(colortext);
	    add(pteps);
	    pteps.setBounds(state.s125+x_shift-1,state.s93-1,state.s60+2,state.s18+2);

        
        
        //======================================================================
        /*
	tf1.setBounds(125,12,60,18);
        Panel ptf1 = new Panel();
	    ptf1.setBackground(colortext);
	    add(ptf1);
	    ptf1.setBounds(124,11,62,20);
        
	ulab1.setBounds(190,12,25,18);
	
	//tlab2.setBounds(10,55,110,18);
	tf2_1.setBounds(125,39,60,18);
        Panel ptf21 = new Panel();
	    ptf21.setBackground(colortext);
	    add(ptf21);
	    ptf21.setBounds(124,38,62,20);
            
	ulab2_1.setBounds(190,39,35,18);
	tf2_2.setBounds(230,39,60,18);
        Panel ptf22 = new Panel();
	    ptf22.setBackground(colortext);
	    add(ptf22);
	    ptf22.setBounds(229,38,62,20);
            
	ulab2_2.setBounds(297,39,20,18);
	
	//flab.setBounds(10,78,75,18);
	tf_freq.setBounds(125,66,60,18);
        Panel ptfreq = new Panel();
	    ptfreq.setBackground(colortext);
	    add(ptfreq);
	    ptfreq.setBounds(124,65,62,20);
            
	ulab3.setBounds(190,66,25,18);
	
	//epslab.setBounds(125,91,30,18);
	tf_eps.setBounds(125,93,60,18);
	Panel pteps = new Panel();
	    pteps.setBackground(colortext);
	    add(pteps);
	    pteps.setBounds(124,92,62,20);
        */
        
	//CHANGE ===============================================================
            ch1.setBounds(state.s200,state.s127,state.s70,state.s20);
            ch2.setBounds(state.s200+state.s80,state.s127,state.s70,state.s20);
	
            ch3.setBounds(state.s200,state.s152,state.s60,state.s20);
            ch4.setBounds(state.s200+state.s80,state.s152,state.s60,state.s20);
	
            ch5.setBounds(state.s200,state.s177,state.s60,state.s20);
            ch6.setBounds(state.s200+state.s80,state.s177,state.s60,state.s20);
        //======================================================================
        b1.setBounds(state.s200+state.s20,state.s200+state.s15,state.s100,state.s30);
        Panel pb1 = new Panel();
	    pb1.setBackground(Color.black);
	    add(pb1);
	    pb1.setBounds(state.s200+state.s20-1,state.s200+state.s15-1,state.s100+2,state.s30+2);
        
	slider.setBounds(state.s20,state.s200+state.s25,state.s150,state.s15);
	/*
        Panel pslider = new Panel();
	    pslider.setBackground(Color.black);
	    add(pslider);
	    pslider.setBounds(state.s20-1,state.s200+state.s25-1,state.s150+2,state.s15+2);
	*/
	//Listeners
	b1.addActionListener(this);
	ch1.addItemListener(this);
	ch2.addItemListener(this);
	ch3.addItemListener(this);
	ch4.addItemListener(this);
	ch5.addItemListener(this);
	ch6.addItemListener(this);
	slider.addChangeListener(this);
    }
    
    @Override
        public void paint(Graphics g){
            if(im == null){
                //im = createImage(getSize().width,getSize().height);
		im = createImage(getSize().width,getSize().height-state.s40);

		
                buf = im.getGraphics();
                drawCanvas(buf);
            }
            else{
                drawCanvas(buf);
            }
            g.drawImage(im,0,0,null);
	    slider.requestFocusInWindow();
        }
        
        //Addition to reduce flicker new routine
	public void update(Graphics g){		// added to avoid clearing
	    paint(g);
	}
    
    public void drawCanvas(Graphics g){
        Graphics2D g2d = (Graphics2D)g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        g.clearRect(0,0,getSize().width-2,getSize().height);
        
        Font symbolfont = new Font("Serif",Font.PLAIN,state.font12);;
        Font normalfont = new Font("Sanserif",Font.PLAIN,state.font12);;
        Font normalfontB = new Font("Sanserif",Font.BOLD,state.font11);;
        Font normalfont2 = new Font("Sanserif",Font.PLAIN,state.font12);
        Font smallfont = new Font("Sanserif",Font.PLAIN,state.font10);
        FontMetrics fm;
         
        int x_shift = state.s27;
              
        String alpha, Ohm, lambda, infinity, Gamma, epsilon;
         
        alpha="\u03b1";
        lambda="\u03bb";
        Ohm="\u03a9";
        infinity="\u221e";
        Gamma="\u0393";
        epsilon ="\u03b5";
            
	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);
	
	String titulo = "Input Panel";
	g.setColor(Color.red.darker());
	g.setFont(titlefont);
        fm = g.getFontMetrics();
        g.drawString(titulo,state.s200+state.s60,fm.getHeight());
        
        g.setColor(Color.black);
        MaestroG.subscripter("Z","0","",g,state.font12,state.s95+x_shift,state.s25);
        MaestroG.subscripter("Z","L","",g,state.font12,state.s95+x_shift,state.s52);
        MaestroG.subscripterSerIT("f","","",g,state.font14,state.s97+x_shift,state.s79);
        MaestroG.subscripterSymFirst2(""+epsilon,"r","",g,state.font14,state.s97+x_shift,state.s106);
        
        MaestroG.subscripterSymFirst(""+Ohm,"","",g,state.font12,state.s200+29,state.s25);
        MaestroG.subscripterSymFirst(""+Ohm,"","",g,state.font12,state.s300+state.s26,state.s52);
        
        g.setFont(normalfont);
        g.drawString("= ",state.s113+x_shift,state.s25);
        g.drawString("= ",state.s113+x_shift,state.s52);
        g.drawString("= ",state.s113+x_shift,state.s79);
        g.drawString("= ",state.s113+x_shift,state.s106);

        g.setFont(smallfont);
        g.setColor(Color.blue.darker());
        g.drawString("Characteristic",state.s15,state.s18);
        g.drawString("Impedance",state.s15,state.s29);

        g.setColor(Color.red.darker());
        g.drawString("Load",state.s15,state.s45);
        g.drawString("Impedance",state.s15,state.s56);

        g.setColor(Color.blue.darker());
        g.drawString("Frequency",state.s15,state.s79);

        g.setColor(Color.red.darker());
        g.drawString("Relative",state.s15,state.s99);
        g.drawString("Permittivity",state.s15,state.s110);

        g.setFont(normalfontB);
        g.setColor(Color.black);
        g.drawString("Stub Configuration",state.s15,state.s138);           
        g.drawString("Display Line Impedance?",state.s15,state.s163);
        g.drawString("Persistent Trace on Chart?",state.s15,state.s188);

        g.setColor(Color.red.darker());
        g.drawLine(state.s10,state.s123,getSize().width-state.s10,state.s123);
        g.drawLine(state.s10,state.s200,getSize().width-state.s10,state.s200);

        g.setColor(Color.blue.darker());
        MaestroG.drawArrowtip(state.s29,state.s200+state.s46,4,g);
        MaestroG.drawArrowtip(state.s37,state.s200+state.s46,4,g);

        g.setColor(Color.black);
        g.setFont(normalfont2);

        //g.drawString("Animation Speed ("+(slider.getValue())+")",35,230);
        g.drawString("Animation Speed",state.s50,state.s200+state.s20);
        g.setColor(Color.red.darker());

        MaestroG.drawArrowtip(state.s152,state.s200+state.s46,3,g);
        MaestroG.drawArrowtip(state.s160,state.s200+state.s46,3,g);

    }
    
    public void actionPerformed(ActionEvent evt){
	if(evt.getSource()==b1){
	    if(Double.valueOf(tf1.getText()).doubleValue() < 0.0){
		state.setZ0(50.0);
		tf1.setText("50.0");
	    }
	    else{
		state.setZ0(Double.valueOf(tf1.getText()).doubleValue());
	    }
	    if(Double.valueOf(tf2_1.getText()).doubleValue() < 0.0){
		state.setZL(100.0, Double.valueOf(tf2_2.getText()).doubleValue());
		tf2_1.setText("100.0");
	    }
	    else{
		state.setZL(Double.valueOf(tf2_1.getText()).doubleValue(),
			    Double.valueOf(tf2_2.getText()).doubleValue());
	    }
	    
	    if(Double.valueOf(tf_freq.getText()).doubleValue() < 0.0){
		state.frequency=0.0;
		tf_freq.setText("0.0");
	    }
	    else{
		state.frequency=(Double.valueOf(tf_freq.getText()).doubleValue());
	    }
	    
	    if(Double.valueOf(tf_eps.getText()).doubleValue() < 1.0){
		state.epsilon_r= 1.0;
		tf_eps.setText("1.0");
	    }
	    else{
		state.epsilon_r=(Double.valueOf(tf_eps.getText()).doubleValue());
	    }
	    
	    if(Integer.valueOf(tf4.getText()).intValue() < 0.0){
		state.setSleep(100);
		tf4.setText("100");
	    }
	    else{
		state.setSleep(Integer.valueOf(tf4.getText()).intValue());
	    }
            
            SleepTime = (SCROLLMAX-SCROLLMIN)-slider.getValue()-1; 
                state.sleeptime = SleepTime;
	}
    }
    
    public void stateChanged(ChangeEvent evt){
	  if(evt.getSource()==slider){
		SCROLLMAX = slider.getMaximum();
		SCROLLMIN = slider.getMinimum();
                SleepTime = (SCROLLMAX-SCROLLMIN)-slider.getValue()-1; 
                state.sleeptime = SleepTime;
	  }
    }

    
    public void itemStateChanged(ItemEvent evt){
	if(evt.getSource()==ch1){//Open
	    state.setOpen(true);
	}
	else if(evt.getSource()==ch2){//Short
	    state.setOpen(false);
	}
	if(evt.getSource()==ch3){//Display Impedance
	    state.setPaintZ(true);
	}
	else if(evt.getSource()==ch4){//No Display of Impedance
	    state.setPaintZ(false);
	}
	if(evt.getSource()==ch5){//Display Trace
	    state.setTrace(true);
	}
	else if(evt.getSource()==ch6){//No Display of Trace
	    state.setTrace(false);
	}
	
    }
}
