//Mod1Input.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 Mod1Input extends Panel implements ChangeListener {
    private Mod1State state;
    private static final Color bgcolor = new Color(236,236,236);
    public int ScrollMax = 5000;
    public int ScrollMaxA = 3600;
    private Label titlelabel1,titlelabel2,titlelabel3;
    //private Label lab1, lab2, lab3;
    private Label lab1, lab2;
    private GreekLabel lab3;
    private Label ulab1, ulab2, ulab3;
    public TextField text1, text2, text3;
    public JSlider slider1, slider2, slider3;
  
    public Mod1Input(Mod1State state){
	super();
	setLayout(null);
	setBackground(bgcolor);
	this.state = state;
	//titlelabel = new Label("Input for blue wave",Label.CENTER);
	//titlelabel.setFont(TheFonts.bold14);

	//titlelabel = new Label("Input for blue wave",Label.LEFT);
	titlelabel1 = new Label("Input for",Label.LEFT);
	titlelabel2 = new Label("blue",Label.LEFT);
	titlelabel3 = new Label("wave",Label.LEFT);
	
        //titlelabel1.setFont(TheFonts.bold16);
        titlelabel1.setFont(new Font("SanSerif",Font.BOLD,state.font16));
	
        //titlelabel2.setFont(TheFonts.bold16);
        titlelabel2.setFont(new Font("SanSerif",Font.BOLD,state.font16));
	
        titlelabel2.setForeground(state.line2Color);
	//titlelabel3.setFont(TheFonts.bold16);
        titlelabel3.setFont(new Font("SanSerif",Font.BOLD,state.font16));
		
	lab1 = new Label("Amplitude A =  ",Label.RIGHT);
        
        lab1.setFont(TheFonts.sanSerif12);
        lab1.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
        
        //lab1.setForeground(state.line2Color);
	lab2 = new Label("Frequency  f =  ",Label.RIGHT);
        
        //lab2.setFont(TheFonts.sanSerif12);
        lab2.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
        
        //lab2.setForeground(state.line2Color);
	
	text1 = new TextField(""+state.amplitude,8);
        
        //text1.setFont(TheFonts.sanSerif12);
        text1.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
        
        //text1.setForeground(state.line2Color);
	
        text2 = new TextField(""+state.frequency,8);
        
        //text2.setFont(TheFonts.sanSerif12);
        text2.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
        
        //text2.setForeground(state.line2Color);
	
        text3 = new TextField(""+state.angle,8);
        
        //text3.setFont(TheFonts.sanSerif12);
        text3.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
        
        //text3.setForeground(state.line2Color);
	
	ulab1 = new Label(" [Volts]",Label.LEFT);
        
        //ulab1.setFont(TheFonts.sanSerif12);
        ulab1.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
        
        //ulab1.setForeground(state.line2Color);
	ulab2 = new Label(" [Hz]",Label.LEFT);
        
        ulab2.setFont(TheFonts.sanSerif12);
        ulab2.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
        
        //ulab2.setForeground(state.line2Color);
	ulab3 = new Label("\u00b0",Label.LEFT);
        
        ulab3.setFont(TheFonts.sanSerif12);
        ulab3.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
        
        //ulab3.setForeground(state.line2Color);

	slider1 = new JSlider(0,ScrollMax+1);  //ampl
	slider2 = new JSlider(0,ScrollMax+1);  //freq
	slider3 = new JSlider(0,ScrollMaxA+1);  //phi
	/*
	slider1 = new Scrollbar(Scrollbar.HORIZONTAL,0,1,0,ScrollMax+1);//ampl
	slider2 = new Scrollbar(Scrollbar.HORIZONTAL,0,1,0,ScrollMax+1);//freq
	slider3 = new Scrollbar(Scrollbar.HORIZONTAL,0,1,0,ScrollMaxA+1);//phi
	*/
	slider1.setValue((int)((state.amplitude-state.aMin)*
                               ScrollMax/(state.aMax-state.aMin)));
	slider2.setValue((int)((state.frequency-state.fMin)*
                               ScrollMax/(state.fMax-state.fMin)));
	slider3.setValue((int)((state.angle-state.phiMin)*
                               ScrollMaxA/(state.phiMax-state.phiMin)));
	
	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,50,18);
	//titlelabel.setBounds(20,5,150,18);
	//titlelabel.setBounds(20,5,200,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);  // 50 was 40
	
	    vPos += vHeight + dvPos; 
	    /*
        slider1.setBackground(Color.white);
        slider2.setBackground(Color.white);
        slider3.setBackground(Color.white);
	    */
	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(20,vPos,120,vHeight);    
	text3.setBounds(state.s140,vPos,state.s80,vHeight);
	ulab3.setBounds(state.s220,vPos,state.s40,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 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);

        
        
        String lab3Text = "Angle "+STR.PHIFONT+
            Character.toString((char)0x03d5)+
            STR.ENDPHIFONT+STR.SUB+"0"+STR.ENDSUB+" =  ";

        //g.setFont(TheFonts.sanSerif12);
        g.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
        
        g.setColor(Color.black);
        int endingX = STR.displayString(lab3Text,g,state.s75,state.s157);

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

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



    public void stateChanged(ChangeEvent evt){//NEED HERE
	if (evt.getSource()==slider1) {
	    if (slider1.getValue()>=ScrollMax) {
                state.amplitude=state.aMax;
                slider1.setValue((int)((state.amplitude-state.aMin)*
                                       ScrollMax/(state.aMax-state.aMin)));
	    } else {
                state.amplitude  = state.aMin + 
                    (state.aMax-state.aMin)*
                    slider1.getValue()/ScrollMax;
	    }
            
	    text1.setText(""+MaestroA.rounder(state.amplitude,7));
	    //state.ignition();
	} else if (evt.getSource()==slider2) {
	    if(slider2.getValue()>=ScrollMax) {
                
                state.frequency=state.fMax;
                slider2.setValue((int)((state.frequency-state.fMin)*
                                       ScrollMax/(state.fMax-state.fMin)));
	    } else {
		state.frequency = state.fMin + 
		    (state.fMax-state.fMin)*
                    slider2.getValue()/ScrollMax;
	    }
            
	    text2.setText(""+MaestroA.rounder(state.frequency,7));
	    //state.ignition();	    
        } else if (evt.getSource()==slider3) {
            if(slider3.getValue()>=ScrollMaxA){
                state.angle=state.phiMax;
                slider3.setValue((int)((state.angle-state.phiMin)*
                                       ScrollMaxA/(state.phiMax-state.phiMin)));
	    } else {
		state.angle = state.phiMin + 
		    (state.phiMax-state.phiMin)*
                    slider3.getValue()/ScrollMaxA;
                state.angle = MaestroA.rounder(state.angle,7);
	    }
            
	    text3.setText(""+MaestroA.rounder(state.angle,7));
	    //state.ignition();
        }
    }
    /*
    public static void main(String[] args) {
        
        Frame f = new Frame("Test 2 panels ... and choice");
        
        f.addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
	
        //f.add("Center",  new Module1_1());
        //f.setSize(new Dimension(700, 600));
        //f.setVisible(true);
        f.setLayout(new GridLayout(1,0));
        f.setSize(700, 600);
        f.setVisible(true);
        Mod1State state = new Mod1State();
        Mod1Input myApplet = new Mod1Input(state);
        f.add(myApplet);
        f.pack();
    }
    */   
}
