//Mod2Input.java
/*
 * Panel with all input operations for Module1.1
 * Using null layout - positions of elements hard-coded
 * authors: Umberto Ravaioli, Janice Richards
 * version 1.0 - Copyright: Amanogawa.com - All Rights Reserved
 */

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

public class Mod2Input extends Panel implements ChangeListener {
    private Mod2State state;
    private static final Color bgcolor = new Color(236,236,236);
    private Font labfont=new Font("SanSerif",Font.PLAIN,12);
    private Font symbolfont = new Font("Serif",Font.PLAIN,12);
    private Font titlefont = new Font("SanSerif",Font.BOLD,16);
    public int ScrollMax = 1000;
    public int ScrollMaxF = 2800; // to have better step
    public int ScrollMaxL = 4000; // to have better step
    private Label titlelabel1, titlelabel2, titlelabel3;
    private Label lab1, lab2, lab3;
    private Label ulab1, ulab2, ulab3;
    public TextField text1, text2, text3;
    public JSlider slider1, slider2, slider3;
    
    public Mod2Input(Mod2State state){
	super();
	setLayout(null);
        
        labfont=new Font("SanSerif",Font.PLAIN,state.font12);
        symbolfont = new Font("Serif",Font.PLAIN,state.font12);
        titlefont = new Font("SanSerif",Font.BOLD,state.font16);
        
	setBackground(bgcolor);
	this.state = state;
	//titlelabel = new Label("Input for green wave",Label.CENTER);
	//titlelabel = new Label("Input for green wave",Label.LEFT);
	//titlelabel.setFont(TheFonts.bold14);
	//titlelabel = new Label("Input for green wave",Label.LEFT);
	//titlelabel.setFont(TheFonts.bold16);
        
	titlelabel1 = new Label("Input for",Label.LEFT);
	titlelabel2 = new Label("blue",Label.LEFT);
	titlelabel3 = new Label("wave",Label.LEFT);
	//titlelabel1.setFont(TheFonts.bold16);
        //titlelabel2.setFont(TheFonts.bold16);
        titlelabel2.setForeground(state.greenWaveColor);
	//titlelabel3.setFont(TheFonts.bold16);
        titlelabel1.setFont(titlefont);
	titlelabel2.setFont(titlefont);
        titlelabel3.setFont(titlefont);
		
	lab1 = new Label("Frequency  f =  ",Label.RIGHT);
        lab1.setFont(TheFonts.sanSerif12);
        lab1.setFont(labfont);
        
        //lab1.setForeground(state.greenWaveColor);
	lab2 = new Label("Wavelength "+
                         Character.toString((char)0x03bb)+" =  ",Label.RIGHT);
        //lab2.setFont(TheFonts.sanSerif12);
        lab2.setFont(labfont);
        //lab2.setForeground(state.greenWaveColor);
	
        lab3 = new Label("Attenuation "+
                         Character.toString((char)0x03b1)+" =  ",Label.RIGHT);
        //lab3.setFont(TheFonts.sanSerif12);
        lab3.setFont(labfont);
        //lab3.setForeground(state.greenWaveColor);
		
	text1 = new TextField(""+state.frequency,8);
        //text1.setFont(TheFonts.sanSerif12);
        text1.setFont(labfont);
        //text1.setForeground(state.greenWaveColor);
	text2 = new TextField(""+state.lambda,8);
        //text2.setFont(TheFonts.sanSerif12);
        text2.setFont(labfont);
        //text2.setForeground(state.greenWaveColor);
	text3 = new TextField(""+state.alpha,8);
        //text3.setFont(TheFonts.sanSerif12);
        text3.setFont(labfont);
        //text3.setForeground(state.greenWaveColor);
	
	ulab1 = new Label(" [Hz]",Label.LEFT);
        //ulab1.setFont(TheFonts.sanSerif12);
        ulab1.setFont(labfont);
        //ulab1.setForeground(state.greenWaveColor);
	ulab2 = new Label(" [cm]",Label.LEFT);
        //ulab2.setFont(TheFonts.sanSerif12);
        ulab2.setFont(labfont);
        //ulab2.setForeground(state.greenWaveColor);
	ulab3 = new Label(" [Np/cm]",Label.LEFT);
        //ulab3.setFont(TheFonts.sanSerif12);
        ulab3.setFont(labfont);
        //ulab3.setForeground(state.greenWaveColor);

	slider1 = new JSlider(0,ScrollMaxF+1); //ampl
	slider2 = new JSlider(0,ScrollMaxL+1); //freq
	slider3 = new JSlider(0,ScrollMax+1); //phi
	/*
	slider1 = new Scrollbar(Scrollbar.HORIZONTAL,0,1,0,ScrollMaxF+1);//ampl
	slider2 = new Scrollbar(Scrollbar.HORIZONTAL,0,1,0,ScrollMaxL+1);//freq
	slider3 = new Scrollbar(Scrollbar.HORIZONTAL,0,1,0,ScrollMax+1);//phi
	*/
	slider1.setValue((int)((state.frequency-state.fMin)*
                               ScrollMaxF/(state.fMax-state.fMin)));
	slider2.setValue((int)((state.lambda-state.lambdaMin)*
                               ScrollMaxL/(state.lambdaMax-state.lambdaMin)));
	slider3.setValue((int)((state.alpha-state.alphaMin)*
                               ScrollMax/(state.alphaMax-state.alphaMin)));
        /*
        slider1.setBackground(Color.white);
        slider2.setBackground(Color.white);
        slider3.setBackground(Color.white);
	*/
		
	add(titlelabel1);
	add(titlelabel2);
	add(titlelabel3);
	add(lab1);
	add(lab2);
	add(lab3);
	add(text1);
	add(text2);
	add(text3);
	add(slider1);
	add(slider2);
	add(slider3);

	add(ulab1);
	add(ulab2);
	add(ulab3);

	//titlelabel.setBounds(20,5,200,18);
	//titlelabel1.setBounds(20,5,80,18);
	//titlelabel2.setBounds(100,5,40,18);
	//titlelabel3.setBounds(140,5,50,18);
        
        titlelabel1.setBounds(state.s20,state.s5,state.s85,state.s18);
	titlelabel2.setBounds(state.s110,state.s5,state.s40,state.s18);
	titlelabel3.setBounds(state.s155,state.s5,state.s50,state.s18);
	

	//int vPosInit = 25, vPos, dvPos = 2, vHeight = 18; 
	int vPosInit = state.s30, vPos, dvPos = state.s4, vHeight = state.s18; 
	vPos = vPosInit;
	
	lab1.setBounds(state.s20,vPos,state.s120,vHeight);
	text1.setBounds(state.s140,vPos,state.s80,vHeight);
	ulab1.setBounds(state.s220,vPos,state.s50,vHeight);
	
	    vPos += vHeight + dvPos; 
	   
	slider1.setBounds(state.s22,vPos+state.s2,state.s196,vHeight);
	/*
        Panel ps1 = new Panel();
            ps1.setBackground(Color.cyan);
            //ps1.setBackground(Mod1State.line2Color);
	    add(ps1);
	    ps1.setBounds(state.s22-1,vPos+state.s2-1,state.s196+2,vHeight+2);
	    
	Panel ps2 = new Panel();
	    ps2.setBackground(Color.black);
	    add(ps2);
	    ps2.setBounds(state.s22-2,vPos+state.s2-2,state.s196+4,vHeight+4);
	*/
	    vPos += vHeight + 4*dvPos; 
	    
	lab2.setBounds(state.s20,vPos,state.s120,vHeight);    
	text2.setBounds(state.s140,vPos,state.s80,vHeight);
	ulab2.setBounds(state.s220,vPos,state.s40,vHeight);
	  
	     vPos += vHeight + dvPos;
	     
	slider2.setBounds(state.s22,vPos+state.s2,state.s196,vHeight);
        /*
	Panel ps3 = new Panel();
            ps3.setBackground(Color.cyan);
            //ps3.setBackground(Mod1State.line2Color);
	    add(ps3);
	    ps3.setBounds(state.s22-1,vPos+state.s2-1,state.s196+2,vHeight+2);
	    
	Panel ps4 = new Panel();
	    ps4.setBackground(Color.black);
	    add(ps4);
	    ps4.setBounds(state.s22-2,vPos+state.s2-2,state.s196+4,vHeight+4);
	*/
	    vPos += vHeight + 4*dvPos;
	    
	//
	lab3.setBounds(state.s20,vPos,state.s120,vHeight);    
	text3.setBounds(state.s140,vPos,state.s80,vHeight);
	ulab3.setBounds(state.s220,vPos,state.s60,vHeight);  
	  
	     vPos += vHeight + dvPos;
	     
	slider3.setBounds(state.s22,vPos+state.s2,state.s196,vHeight);
	/*
	Panel ps9 = new Panel();
            ps9.setBackground(Color.cyan);
	    //ps9.setBackground(Mod1State.line2Color);
	    add(ps9);
	    ps9.setBounds(state.s22-1,vPos+state.s2-1,state.s196+2,vHeight+2);
	    
	Panel ps10 = new Panel();
	    ps10.setBackground(Color.black);
	    add(ps10);
	    ps10.setBounds(state.s22-2,vPos+state.s2-2,state.s196+4,vHeight+4);
	*/
	//Listeners
	slider1.addChangeListener(this);
	slider2.addChangeListener(this);
	slider3.addChangeListener(this);

    }


    
    public void reset() {
        state.frequency = 0.5;
        state.lambda = 2.0;
        state.alpha = 0.0;
	text1.setText(""+state.frequency);
	text2.setText(""+state.lambda);
	text3.setText(""+state.alpha);
        readTextUpdateSliders();
    }


    
    public void paint(Graphics g){
      Graphics2D g2d = (Graphics2D)g;
      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                           RenderingHints.VALUE_ANTIALIAS_ON);     
	
	//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);
      slider1.requestFocusInWindow();
      slider2.requestFocusInWindow();
      slider3.requestFocusInWindow();
    }
    

    
    public void readTextUpdateSliders() {
        
        try { if(Double.valueOf(text1.getText()).doubleValue()<=state.fMax &&
                 Double.valueOf(text1.getText()).doubleValue()>=state.fMin){
                state.frequency=Double.valueOf(text1.getText()).doubleValue();
                slider1.setValue((int)(ScrollMaxF*(state.frequency-state.fMin)
                                       /(state.fMax-state.fMin)));
            } else if(Double.valueOf(text1.getText()).doubleValue()>state.fMax){
                  state.frequency = state.fMax;
                  text1.setText(""+state.fMax);
                  slider1.setValue(ScrollMaxF);
              }
              else if(Double.valueOf(text1.getText()).doubleValue()<state.fMin){
                  state.frequency = state.fMin;
                  text1.setText(""+state.fMin);
                  slider1.setValue(0);
              }
        } catch(NumberFormatException e){
            state.frequency =  0.0;
        }

        try { if(Double.valueOf(text2.getText()).doubleValue()<=state.lambdaMax &&
                 Double.valueOf(text2.getText()).doubleValue()>=state.lambdaMin){
                state.lambda=Double.valueOf(text2.getText()).doubleValue();
                slider2.setValue((int)(ScrollMaxL*(state.lambda-state.lambdaMin)
                                       /(state.lambdaMax-state.lambdaMin)));
            } else if(Double.valueOf(text2.getText()).doubleValue()>state.lambdaMax){
                  state.lambda = state.lambdaMax;
                  text2.setText(""+state.lambdaMax);
                  slider2.setValue(ScrollMaxL);
            } else if(Double.valueOf(text2.getText()).doubleValue()<state.lambdaMin){
                  state.lambda = state.lambdaMin;
                  text2.setText(""+state.lambdaMin);
                  slider2.setValue(0);
            }
        } catch(NumberFormatException e){
            state.lambda =  0.0;
        }

        try { if(Double.valueOf(text3.getText()).doubleValue()<=state.alphaMax &&
                 Double.valueOf(text3.getText()).doubleValue()>=state.alphaMin){
                state.alpha=Double.valueOf(text3.getText()).doubleValue();
                slider3.setValue((int)(ScrollMax*(state.alpha-state.alphaMin)
                                       /(state.alphaMax-state.alphaMin)));
            } else if(Double.valueOf(text3.getText()).doubleValue()>state.alphaMax){
                  state.alpha = state.alphaMax;
                  text3.setText(""+state.alphaMax);
                  slider3.setValue(ScrollMax);
              }
              else if(Double.valueOf(text3.getText()).doubleValue()<state.alphaMin){
                  state.alpha = state.alphaMin;
                  text3.setText(""+state.alphaMin);
                  slider3.setValue(0);
              }
        } catch(NumberFormatException e){
            state.alpha =  0.0;
        }
        
        repaint();
    }


    
    public void stateChanged(ChangeEvent evt){//NEED HERE
	if (evt.getSource()==slider1) {
	    if (slider1.getValue()>=ScrollMaxF) {
                state.frequency=state.fMax;
                slider1.setValue((int)((state.frequency-state.fMin)*
                                       ScrollMaxF/(state.fMax-state.fMin)));
	    } else {
                state.frequency = state.fMin + 
                    (state.fMax-state.fMin)*
                    slider1.getValue()/ScrollMaxF;
	    }
            
	    text1.setText(""+MaestroA.rounder(state.frequency,7));
	} 
        else if (evt.getSource()==slider2) {
	    if(slider2.getValue()>=ScrollMaxL) {
                
                state.lambda=state.lambdaMax;
                slider2.setValue((int)((state.lambda-state.lambdaMin)*
                                       ScrollMaxL/(state.lambdaMax-state.lambdaMin)));
	    } else {
		state.lambda = state.lambdaMin + 
		    (state.lambdaMax-state.lambdaMin)*
                    slider2.getValue()/ScrollMaxL;
	    }
            
	    text2.setText(""+MaestroA.rounder(state.lambda,7));
        } 
        else if (evt.getSource()==slider3) {
            if(slider3.getValue()>=ScrollMax){
                state.alpha=state.alphaMax;
                slider3.setValue((int)((state.alpha-state.alphaMin)*
                                       ScrollMax/(state.alphaMax-state.alphaMin)));
	    } else {
		state.alpha = state.alphaMin + 
		    (state.alphaMax-state.alphaMin)*
                    slider3.getValue()/ScrollMax;
                state.alpha = MaestroA.rounder(state.alpha,7);
	    }
            
	    text3.setText(""+MaestroA.rounder(state.alpha,7));
        }
    }
    
}
