//NewGuideInputPanel.java
/*
 * Panel with all input operations for microstrip
 * Using null layout - positions of elelments hard coded
 * authors: Umberto Ravaioli
 * version 1.0 - Copyright: Amanogawa.com - All Rights Reserved
 */

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

//public class NewGuideInputPanel extends Panel implements ActionListener, AdjustmentListener{
public class NewGuideInputPanel extends Panel implements ActionListener, ChangeListener{
    private NewGuide_State state;
    private static final Color bgcolor = new Color(236,236,236);
    
    private static Font labfont;
    private static Font normalfont;
    private static Font smallfont;
    private static Font smallerfont;

    public int ScrollMax = 10000;
    private Label titlelabel;
    private Label lab1, lab4, lab6;
    private Label ulab4;
    public TextField text1, text2, text3, text4, text6;
    //public Scrollbar slider1, slider2, slider3;
    public JSlider slider1, slider2, slider3;
    public  Button b1, b2, b3, b5;
    public  Button bupdate, binstr;
    DecimalFormat dec1 = new DecimalFormat("0.######");
    DecimalFormat dec2 = new DecimalFormat("0.######E0");
  
    public NewGuideInputPanel(NewGuide_State state){
	super();
	setLayout(null);
	setBackground(bgcolor);
	this.state = state;

        if (MaestroG.useBiggerFont) {
            labfont = state.sanSerifFont.deriveFont((float)state.font14);
            normalfont = state.sanSerifFont.deriveFont((float)state.font16);
            smallfont = state.sanSerifFont.deriveFont((float)state.font14);
            smallerfont = state.sanSerifFont.deriveFont((float)state.font13);
        } 
        else {
            labfont = state.sanSerifFont.deriveFont((float)state.font12);
            normalfont = state.sanSerifFont.deriveFont((float)state.font14);
            smallfont = state.sanSerifFont.deriveFont((float)state.font12);
            smallerfont = state.sanSerifFont.deriveFont((float)state.font11);
        }
        
        setFont(normalfont);

	titlelabel = new Label("Input",Label.CENTER);
        if (MaestroG.useBiggerFont) {
            titlelabel.setFont(state.sanSerifFont.deriveFont(Font.BOLD,(float)state.font18));
        } else {
            titlelabel.setFont(state.sanSerifFont.deriveFont(Font.BOLD,(float)state.font16));
        }
		
	lab1 = new Label("Substrate thickness  h  =  ",Label.RIGHT);
        lab1.setFont(smallfont);
	
        lab4 = new Label("Frequency   f  =  ",Label.RIGHT);
	lab4.setFont(labfont);
        
	lab6 = new Label("Strip width w  =  ",Label.RIGHT);
        lab6.setFont(labfont);
	
	text1 = new TextField(""+dec1.format(state.a),8);
	text2 = new TextField(""+dec1.format(state.epsilon_r0),8);
	text3 = new TextField(""+dec1.format(state.epsilon_r),8);
	text4 = new TextField(""+dec2.format(state.frequency),8);
        text6 = new TextField(""+dec1.format(state.w),8);
        text1.setFont(labfont);
        text2.setFont(labfont);
        text3.setFont(labfont);
        text4.setFont(labfont);
        text6.setFont(labfont);
	
        // unit labels
        ulab4 = new Label(" [ Hz ]",Label.LEFT);
        ulab4.setFont(labfont);

	slider1 = new JSlider(0,ScrollMax); //changes a
	slider2 = new JSlider(0,ScrollMax); //changes frequency
	slider3 = new JSlider(0,ScrollMax); //changes w
	/*
	slider1 = new Scrollbar(Scrollbar.HORIZONTAL,0,1,0,ScrollMax+1);//changes a
	slider2 = new Scrollbar(Scrollbar.HORIZONTAL,0,1,0,ScrollMax+1);//changes frequency
	slider3 = new Scrollbar(Scrollbar.HORIZONTAL,0,1,0,ScrollMax+1);//changes w
	*/
	
	slider1.setValue((int)(state.a*ScrollMax/(state.a_maximum-state.a_minimum)));
	slider2.setValue((int)(state.frequency*ScrollMax/(state.frequency_maximum-state.frequency_minimum)));
	slider3.setValue((int)(state.w*ScrollMax/(state.w_maximum-state.w_minimum)));
	
        FontMetrics fmSmall = getFontMetrics(smallfont);
        int buttonWidth = fmSmall.stringWidth(" Range ");
	b1 = new Button("Range");
        b1.setFont(smallerfont);
	b2 = new Button("Range");
        b2.setFont(smallerfont);
	b3 = new Button("Range");
        b3.setFont(smallerfont);
        
        System.out.println(MaestroG.useBiggerFont);
        
        b1.setBackground(Color.white);
        b2.setBackground(Color.white);
        b3.setBackground(Color.white);
        
	bupdate = new Button("Update");
	bupdate.setFont(smallfont);
        bupdate.setBackground(Color.white);
        
        // update button
	binstr = new Button("Instructions");
        binstr.setFont(smallfont);
        binstr.setBackground(Color.white);
	add(binstr);
        int buttonx = state.s175;
        int buttony = state.s10;
        int buttonwide = state.s100;
        int buttonheight = state.s22;
	 
        binstr.setBounds(buttonx,buttony,buttonwide,buttonheight);	
        Panel pin = new Panel();
	    pin.setBackground(Color.black);
	    add(pin);
	    pin.setBounds(buttonx-1,buttony-1,buttonwide+2,buttonheight+2);
        
        add(titlelabel);
	add(lab1);
	add(lab4);
	add(lab6);
	add(text1);
	add(text3);
	add(text4);
	add(text6);
	add(ulab4);
	add(slider1);
	add(slider2);
	add(slider3);
	add(b1);
	add(b2);
	add(b3);
	//add(b5);
	add(bupdate);
	titlelabel.setBounds(state.s20,state.s5,state.s50,state.s18);
	int vPosInit = state.s25, vPos, dvPos = state.s2, vHeight = state.s15; 
	vPos = vPosInit;
	
	// band II  ....... was band I
	int y_thick = state.s78; 
      
	int y_wide = state.s78; 
	lab6.setBounds(state.s20,y_wide-state.s23,state.s145,vHeight);
	text6.setBounds(state.s170,y_wide-state.s26,state.s80,vHeight+state.s3);
        Panel ptext6 = new Panel();
	    ptext6.setBackground(Color.black);
	    add(ptext6);
	    ptext6.setBounds(state.s170-1,y_wide-state.s26-1,state.s80+2,vHeight+state.s3+2);
	    
	slider3.setBounds(state.s80,y_wide,state.s196,vHeight);
	/*
        slider3.setBackground(Color.white);
	Panel ps1 = new Panel();
	    ps1.setBackground(Color.cyan);
	    add(ps1);
	    ps1.setBounds(state.s80-1,y_wide-1,state.s196+2,vHeight+2);
	    
	Panel ps2 = new Panel();
	    ps2.setBackground(Color.black);
	    add(ps2);
	    ps2.setBounds(state.s80-2,y_wide-2,state.s196+4,vHeight+4);
	*/
	
        b3.setBounds(state.s10,y_wide-state.s2,state.s60,state.s20);
        Panel p3 = new Panel();
	    p3.setBackground(Color.black);
	    add(p3);
	    p3.setBounds(state.s10-1,y_wide-state.s2-1,state.s60+2,state.s20+2);
		    
	// band III
	int y_sub = state.s124;   
	lab1.setBounds(state.s10,y_sub-state.s23,state.s155,vHeight);
	text1.setBounds(state.s170,y_sub-state.s26,state.s80,vHeight+state.s3);
	Panel ptext1 = new Panel();
	    ptext1.setBackground(Color.black);
	    add(ptext1);
	    ptext1.setBounds(state.s170-1,y_sub-state.s26-1,state.s80+2,vHeight+state.s3+2);
	  
	slider1.setBounds(state.s80,y_sub,state.s196,vHeight);
	/*
	slider1.setBackground(Color.white);
        Panel ps9 = new Panel();
	    ps9.setBackground(Color.cyan);
	    add(ps9);
	    ps9.setBounds(state.s80-1,y_sub-1,state.s196+2,vHeight+2);
	    
	Panel ps10 = new Panel();
	    ps10.setBackground(Color.black);
	    add(ps10);
	    ps10.setBounds(state.s80-2,y_sub-2,state.s196+4,vHeight+4);
	*/
	
        b1.setBounds(state.s10,y_sub-state.s2,state.s60,state.s20);
	Panel p1 = new Panel();
	    p1.setBackground(Color.black);
	    add(p1);
	    p1.setBounds(state.s10-1,y_sub-state.s2-1,state.s60+2,state.s20+2);
	
	// band IV
	int y_frequency = state.s170;
	lab4.setBounds(state.s20,y_frequency-state.s23,state.s145,vHeight);
	text4.setBounds(state.s170,y_frequency-state.s26,state.s80,vHeight+state.s3);
	Panel ptext4 = new Panel();
	    ptext4.setBackground(Color.black);
	    add(ptext4);
	    ptext4.setBounds(state.s170-1,y_frequency-state.s26-1,state.s80+2,vHeight+state.s3+2);
	
        ulab4.setBounds(state.s252,y_frequency-state.s23,state.s40,vHeight);   
	    
	slider2.setBounds(state.s80,y_frequency,state.s196,vHeight);
	/*
	slider2.setBackground(Color.white);
        Panel ps5 = new Panel();
	    ps5.setBackground(Color.cyan);
	    add(ps5);
	    ps5.setBounds(state.s80-1,y_frequency-1,state.s196+2,vHeight+2);
	    
	Panel ps6 = new Panel();
	    ps6.setBackground(Color.black);
	    add(ps6);
	    ps6.setBounds(state.s80-2,y_frequency-2,state.s196+4,vHeight+4);
	*/
	
        b2.setBounds(state.s10,y_frequency-state.s2,state.s60,state.s20); // range button
	Panel p2 = new Panel();
	    p2.setBackground(Color.black);
	    add(p2);
	    p2.setBounds(state.s10-1,y_frequency-state.s2-1,state.s60+2,state.s20+2);
	
        // band V
	int y_material = state.s207;
        text3.setBounds(state.s77,y_material,state.s70,vHeight+state.s5);
	Panel ptext3 = new Panel();
	    ptext3.setBackground(Color.black);
	    add(ptext3);
	    ptext3.setBounds(state.s77-1,y_material-1,state.s70+2,vHeight+state.s5+2);
		
        //  band VI
	int y_update = state.s240;
	bupdate.setBounds(state.s20,y_update,state.s260,state.s20);	
	Panel ps7 = new Panel();
	    ps7.setBackground(Color.cyan);
	    add(ps7);
	    ps7.setBounds(state.s20-1,y_update-1,state.s260+2,state.s20+2);
	    
	Panel ps8 = new Panel();
	    ps8.setBackground(Color.black);
	    add(ps8);
	    ps8.setBounds(state.s20-2,y_update-2,state.s260+4,state.s20+4);
	
        //Listeners
	bupdate.addActionListener(this);
	
	slider1.addChangeListener(this);
	slider2.addChangeListener(this);
	slider3.addChangeListener(this);
	/*
	slider1.addAdjustmentListener(this);
	slider2.addAdjustmentListener(this);
	slider3.addAdjustmentListener(this);
	*/
    }
    
    public void paint(Graphics g){
	Graphics2D g2d = (Graphics2D)g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        g.clearRect(0,0,getSize().width-1,getSize().height-1);

	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);
	
        g.setColor(Color.black);
        g.drawRect(0,0,getSize().width-1,getSize().height-1);
        
        int vPosInit = state.s30, vPos, dvPos = state.s2, vHeight = state.s20; 
	vPos = vPosInit+9*vHeight+8*dvPos;
	g.setColor(Color.red);    
	
	MaestroG.subscripter("  ","r"," = ",g,state.font14,state.s30,vPos-state.s5);	
	
	g.setFont(new Font("Serif",Font.PLAIN,state.font14));
	g.drawString("\u03b5",state.s30,vPos-state.s5);	
        
        g.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
	
	g.setColor(Color.black);    
        g.drawString("[mm]",state.s255,state.s67);
        g.drawString("[mm]",state.s255,state.s113);
	
	slider1.requestFocusInWindow();
	slider2.requestFocusInWindow();
	slider3.requestFocusInWindow();
    }
    

    public void actionPerformed(ActionEvent evt){// NEED HERE
     
	if(evt.getSource()==bupdate){
	
            if(!state.IsMilsOn){
                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(""+dec1.format(state.a_maximum));
                        slider1.setValue(ScrollMax);
                    }
                    else if(Double.valueOf(text1.getText()).doubleValue()<state.a_minimum){
                        state.a = state.a_minimum;
                        text1.setText(""+dec1.format(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(""+dec1.format(state.epsilon_r));
		}
	    }
	    catch(NumberFormatException e){
                state.epsilon_r = 1.0;
	    }  
	    try{if(Double.valueOf(text2.getText()).doubleValue()>=1.0){
		    state.epsilon_r0=Double.valueOf(text2.getText()).doubleValue();
		}
		else{
		    state.epsilon_r0=1.0;
		    text2.setText(""+dec1.format(state.epsilon_r0));
		}
	    }
	    catch(NumberFormatException e){
                state.epsilon_r0 = 1.0;
	    }
	                            
	    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(""+dec2.format(state.frequency_maximum));
		    slider2.setValue(ScrollMax);
		}
		else if(Double.valueOf(text4.getText()).doubleValue()<state.frequency_minimum){
		    state.frequency = state.frequency_minimum;
		    text4.setText(""+dec2.format(state.frequency_minimum));
		    slider2.setValue(0);
		}
	    }
	    catch(NumberFormatException e){
                state.frequency = 0.0; 
	    }
            if(!state.IsMilsOn){
                try{if(Double.valueOf(text6.getText()).doubleValue()<=state.w_maximum &&
                       Double.valueOf(text6.getText()).doubleValue()>=state.w_minimum){
                        state.w=Double.valueOf(text6.getText()).doubleValue();
                        slider3.setValue((int)(ScrollMax*(state.w-state.w_minimum)/
                                               (state.w_maximum-state.w_minimum)));
                    }
                    else if(Double.valueOf(text6.getText()).doubleValue()>state.w_maximum){
                        state.w = state.w_maximum;
                        text6.setText(""+dec1.format(state.w_maximum));
                        slider3.setValue(ScrollMax);
                    }
                    else if(Double.valueOf(text6.getText()).doubleValue()<state.w_minimum){
                        state.w = state.w_minimum;
                        text6.setText(""+dec1.format(state.w_minimum));
                        slider3.setValue(0);
                    }
                    
                }
                catch(NumberFormatException e){
                    state.w = 0.0;
                }
            }
	    state.ignition();
	}
    }//End of actionPerformed()
    

    public void stateChanged(ChangeEvent evt){//NEED HERE
	if(evt.getSource()==slider2){
	    if(slider2.getValue()>=ScrollMax){
		state.frequency=state.frequency_maximum;
		slider2.setValue((int)(ScrollMax*(state.frequency-state.frequency_minimum)
                                       /(state.frequency_maximum-state.frequency_minimum)));
	    }
	    else{
		state.frequency = state.frequency_minimum + 
		    (state.frequency_maximum-state.frequency_minimum)*slider2.getValue()/ScrollMax;
	    }
	    
	    text4.setText(""+dec2.format(state.frequency));
	    state.ignition();
	}
	else if(evt.getSource()==slider1){
            if(!state.IsMilsOn){
                if(slider1.getValue()>=ScrollMax){
		    state.a=state.a_maximum;
		    slider1.setValue((int)(ScrollMax*(state.a-state.a_minimum)
                                           /(state.a_maximum-state.a_minimum)));
                }
                else{
                    state.a  = state.a_minimum + 
                        (state.a_maximum-state.a_minimum)*slider1.getValue()/ScrollMax;
                }
                
                text1.setText(""+dec1.format(state.a));
                state.ignition();
            }
	}
	else if(evt.getSource()==slider3){
            if(!state.IsMilsOn){
                if(slider3.getValue()>=ScrollMax){
		    state.w=state.w_maximum;
		    slider3.setValue((int)(ScrollMax*(state.w-state.w_minimum)
                                           /(state.w_maximum-state.w_minimum)));
                }
                else{
                    state.w = state.w_minimum + 
                        (state.w_maximum-state.w_minimum)*slider3.getValue()/ScrollMax;
                }
                
                text6.setText(""+dec1.format(state.w));
                state.ignition();
            }
	}
    }
    
}
