//Trans_MultiGraphPanelB.java
//This is for frequency plots
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Trans_MultiGraphPanelB extends Panel implements MouseListener, ItemListener, Runnable, ChangeListener{
    //private static final Color bgcolor = new Color(216,216,191);
    //private  static final Color bgcolor = new Color(161,220,220);
    private static final Color tinta = new Color(236,236,221);
    private static final Color tinta2 = new Color(236,236,221);
    private  static final Color bgcolor = new Color(255,255,255);
    
    private JSlider slider;  
    
    private Font titlefont;
    private Font labfont;
    private Label titlelabel, selectlabel;   
    private String titulo;
    public Choice c1;
    public Thread tron;
    private boolean IsTronRunning;
    public boolean ThreadStarted;
    public boolean  button_one_ON = true;
    private int SleepTime = 50;
    private Trans_State t_state;
    public TransGraphCanvas tgc1;
    public TransGraphCanvas2 tgc3;
    StartStopClock ssc;
    
    public int DynamicRunType = 1;
    public CheckboxGroup cbxgroup;
    public Checkbox cbx1, cbx2;
    private int SCROLLMIN=0, SCROLLMAX=251;
    Trans_State state;
   
    public Trans_MultiGraphPanelB(String titulo, Trans_State state){
	super();
	this.state = state;
        this.titulo=titulo;
	
        setLayout(null);
	setBackground(bgcolor);
        
        titlefont = new Font("SanSerif",Font.BOLD,state.font16);
        labfont = new Font("SanSerif",Font.PLAIN,state.font11);
    
	c1 = new Choice();
        c1.addItem(" Select a Plot");
	c1.addItem(" Time Dependent Voltage");
	c1.addItem(" Time Dependent Current");
	c1.addItem(" Time Dependent Power");
	
	c1.setBackground(bgcolor);
	c1.setFont(labfont);
	titlelabel = new Label(titulo,Label.LEFT);
	titlelabel.setFont(titlefont);
        titlelabel.setForeground(Color.black);
	
	selectlabel = new Label("click to select plot",Label.CENTER);
	selectlabel.setFont(labfont);
	selectlabel.setBackground(bgcolor);
	selectlabel.setForeground(Color.blue);
	
	//add(selectlabel);
	selectlabel.setBounds(state.s200,state.s30,state.s100,state.s25);
	
	tgc3 = new TransGraphCanvas2(state);
	ssc  = new StartStopClock(state);
        ssc.setVisible(false);
	
	//Checkboxes
	cbxgroup = new CheckboxGroup();
	cbx1 = new Checkbox("Trace On",cbxgroup,true);
	cbx2 = new Checkbox("Trace Off",cbxgroup,false);
	cbx1.setBackground(tinta);
	cbx2.setBackground(tinta);
        cbx1.setFont(labfont);
        cbx2.setFont(labfont);

	slider = new JSlider(SCROLLMIN,SCROLLMAX -1);
	slider.setValue(SCROLLMAX-SleepTime -1);
        //slider = new Scrollbar(Scrollbar.HORIZONTAL,SCROLLMAX-SleepTime,1,SCROLLMIN,SCROLLMAX);
        add(slider);
        slider.setBackground(Color.white);
        slider.setBounds(state.s536,state.s26,state.s125,state.s15);
	/*
        Panel ps = new Panel();
	    ps.setBackground(Color.black);
	    ps.setBounds(state.s536-1,state.s26-1,state.s125+2,state.s15+2);
            add(ps);
	*/
        add(titlelabel);
	add(c1);
	add(tgc3);
	add(ssc);
	add(cbx1);
	add(cbx2);
	titlelabel.setBounds(state.s5,state.s5,state.s200,state.s20);
	c1.setBounds(state.s5,state.s30,state.s195,state.s25);
	tgc3.setBounds(state.s5,state.s66,state.s795,state.s314);
	ssc.setBounds(state.s215,state.s4,state.s198,state.s58);
        
        // CHANGE #1 6/17/2017 =================================================
	//cbx1.setBounds(435,17,75,15);
	//cbx2.setBounds(435,33,75,15);
        cbx1.setBounds(state.s430,state.s12,state.s90,state.s20);
	cbx2.setBounds(state.s430,state.s33,state.s90,state.s20);
        //======================================================================
	
	Panel pgraph1 = new Panel();
	    pgraph1.setBackground(tinta2);
	    //pgraph1.setBackground(bgcolor);
	    add(pgraph1);
	    pgraph1.setBounds(state.s5,state.s66,state.s795,state.s314);
	
	Panel pgraph2 = new Panel();
	    pgraph2.setBackground(Color.black);
	    add(pgraph2);
	    pgraph2.setBounds(state.s5-1,state.s66-1,state.s795+2,state.s314+2);
	
	Panel pgraph4a = new Panel();
	    pgraph4a.setBackground(tinta);
	    add(pgraph4a);
            // CHANGE #2 6/17/2017 =============================================
	    //pgraph4a.setBounds(430,16,85,32);
            pgraph4a.setBounds(state.s425,state.s11,state.s95,state.s42);
            //==================================================================
	
	Panel pgraph4 = new Panel();
	    pgraph4.setBackground(Color.black);
	    add(pgraph4);
            // CHANGE #3 6/17/2017 =============================================
	    //pgraph4.setBounds(429,15,87,34);
            pgraph4.setBounds(state.s425-1,state.s11-1,state.s95+2,state.s42+2);
            //==================================================================
	
	IsTronRunning = false;
        ThreadStarted = false;
	
	//Listeners
	ssc.button1.addMouseListener(this);
	ssc.button2.addMouseListener(this);
	cbx1.addItemListener(this);
	cbx2.addItemListener(this);
        slider.addChangeListener(this);	
    }			
    
    public void paint(Graphics g){
	    
	    g.setFont(labfont);
            g.setColor(Color.blue);
            g.drawString("animation speed",state.s560,state.s22);
	    g.setColor(Color.blue.darker());
            MaestroG.drawArrowtip(state.s545,state.s47,4,g);
	    MaestroG.drawArrowtip(state.s553,state.s47,4,g);
	    
	    g.setColor(Color.red.darker());
	    MaestroG.drawArrowtip(state.s642,state.s47,3,g);
	    MaestroG.drawArrowtip(state.s650,state.s47,3,g);

	    slider.requestFocusInWindow();
	}
    
    public void mouseClicked(MouseEvent evt){mouseHandler(evt);}
    public void mouseEntered(MouseEvent evt){;}
    public void mouseExited(MouseEvent evt){;}
    public void mousePressed(MouseEvent evt){;}
    public void mouseReleased(MouseEvent evt){;}
    
    private synchronized void mouseHandler(MouseEvent evt){
	if(evt.getSource() == ssc.button1){
	    IsTronRunning = true;
	    
            if(!ThreadStarted){
                start();
                ThreadStarted = true;
                ssc.button1.setEnabled(false);
                ssc.button2.setEnabled(true);
                
            }
            else{
                ssc.button1.setEnabled(false);
                ssc.button2.setEnabled(true);
                
                notify();
            }
            //c1.setEnabled(false);
            button_one_ON = false;
	}
	if(evt.getSource() == ssc.button2){
	    IsTronRunning = false;
               
            ssc.button2.setEnabled(false);
            ssc.button1.setEnabled(true);
            button_one_ON = true;
	}
    }
    
    public void itemStateChanged(ItemEvent evt){
	if(evt.getSource() == cbx1){
	    tgc3.setTrace(true);
	}
	else if(evt.getSource() == cbx2){
	    tgc3.setTrace(false);
	}
    }
    
    public void stateChanged(ChangeEvent evt){
	  if(evt.getSource()==slider){
		SCROLLMAX = slider.getMaximum();
		SCROLLMIN = slider.getMinimum();
                SleepTime = (SCROLLMAX-SCROLLMIN)-slider.getValue()-1;  
	  }
	}
	
	
    public synchronized void plotTimeDependentVoltage(Trans_State state){
	//if(tron != null) tron.suspend();
	t_state = state;
	cbx2.setState(true);
	t_state.reset();
	ssc.clockcanvas.setStatus(0,state.NTime,state.dtime);
	ssc.clockcanvas.reset();
	DynamicRunType = 1;
	tgc3.reset();
	tgc3.setDynamics(false);
	t_state.ScanTimeDependentVoltage();
	String labella;
	/*
        if(!state.stub[0].isEnable() && !state.stub[1].isEnable() && !state.stub[2].isEnable()){
	    labella = "2 |V+|";
	}
	else{
	    labella = "3 |V+|";
	}
         */
	//add(labella);
	//labella.setBounds(250,5,50,25);
        
        //labella =""+state.PlotTimeScale+" |V+|";
        //if(state.PlotTimeScale==1){labella ="  |V+|";};
	labella ="";
        
        
	if (state.getYRangeMax(1)>=1.0 && state.getYRangeMax(1)<1.0E3 || state.getYRangeMax(1)==0.0){
	    tgc3.setTitle("   V(d,t) [ V ]                                       "+labella);    
	}
	else if(state.getYRangeMax(1)<1.0E6 && state.getYRangeMax(1)>=1.0E3  ){
	    tgc3.setTitle("   V(d,t) [ k V ]                                     "+labella); 
	   
	}
	else if(state.getYRangeMax(1)>=1.0E6  ){
	    tgc3.setTitle("   V(d,t) [ M V ]                                     "+labella); 
	   
	}
	else if(state.getYRangeMax(1)<1.0 && state.getYRangeMax(1)>=1.0E-3  ){
	    tgc3.setTitle("   V(d,t) [ m V ]                                     "+labella); 
	   
	}
	else if(state.getYRangeMax(1)<1.0E-3 && state.getYRangeMax(1)>=1.0E-6  ){
	    tgc3.setTitle("   V(d,t) [ \u00b5 V ]                                     "+labella); 
	    
	}
	else if(state.getYRangeMax(1)<1.0E-6 && state.getYRangeMax(1)>=1.0E-9  ){
	    tgc3.setTitle("   V(d,t) [ n V ]                                     "+labella); 
	    
	}
	else if(state.getYRangeMax(1)<1.0E-9 && state.getYRangeMax(1)>=1.0E-12  ){
	    tgc3.setTitle("   V(d,t) [ p V ]                                     "+labella); 
	    
	}
	else if(state.getYRangeMax(1)<1.0E-12 && state.getYRangeMax(1)>=1.0E-15 ){
	    tgc3.setTitle("   V(d,t) [ f V ]                                     "+labella); 
	   
	}
	else if(state.getYRangeMax(1)<1.0E-15 ){
	    tgc3.setTitle("   V(d,t) [ a V ]                                     "+labella); 
	   
	}
	//tgc3.setTitle("   V (d,t)  [ V ]                                          2 |V+|");
	tgc3.setYRangeMax(t_state.getYRangeMax(1));
	tgc3.setYRangeMin(-t_state.getYRangeMax(1));
	tgc3.plot(t_state.x, t_state.y1, t_state.yV1, t_state.yV2);
	tgc3.cleanUp();
    } 
    
    public synchronized void plotTimeDependentCurrent(Trans_State state){
	//if(tron != null) tron.suspend();
	t_state = state;
	cbx2.setState(true);
	t_state.reset();
	ssc.clockcanvas.setStatus(0,t_state.NTime,t_state.dtime);
	ssc.clockcanvas.reset();
	DynamicRunType = 2;
	tgc3.reset();
	tgc3.setDynamics(false);
	t_state.ScanTimeDependentCurrent();
	
	String labella;
	/*
        if(!state.stub[0].isEnable() && !state.stub[1].isEnable() && !state.stub[2].isEnable()){
	    labella = "2 |V+|/ Zo";
	}
	else{
	    labella = "3 |V+|/ Zo";
	}
        */
        //labella =""+state.PlotTimeScale+" |V+|/ Zo";
        //if(state.PlotTimeScale==1){labella ="  |V+|/ Zo";};
	labella ="";
        
	if (state.getYRangeMax(2)>=1.0 && state.getYRangeMax(2)<1.0E3 || state.getYRangeMax(2)==0.0){
	    tgc3.setTitle("   I (d,t) [ A ]                                   "+labella);    
	}
	else if(state.getYRangeMax(2)<1.0E6 && state.getYRangeMax(2)>=1.0E3  ){
	    tgc3.setTitle("   I (d,t) [ k A ]                                 "+labella); 
	   
	}
	else if(state.getYRangeMax(2)>=1.0E6 ){
	    tgc3.setTitle("   I (d,t) [ M A ]                                 "+labella); 
	   
	}
	else if(state.getYRangeMax(2)<1.0 && state.getYRangeMax(2)>=1.0E-3  ){
	    tgc3.setTitle("   I (d,t) [ m A ]                                 "+labella); 
	   
	}
	else if(state.getYRangeMax(2)<1.0E-3 && state.getYRangeMax(2)>=1.0E-6  ){
	    tgc3.setTitle("   I (d,t) [ \u00b5 A ]                                 "+labella); 
	    
	}
	else if(state.getYRangeMax(2)<1.0E-6 && state.getYRangeMax(2)>=1.0E-9  ){
	    tgc3.setTitle("   I (d,t) [ n A ]                                 "+labella); 
	    
	}
	else if(state.getYRangeMax(2)<1.0E-9 && state.getYRangeMax(2)>=1.0E-12  ){
	    tgc3.setTitle("   I (d,t) [ p A ]                                 "+labella); 
	    
	}
	else if(state.getYRangeMax(2)<1.0E-12 && state.getYRangeMax(2)>=1.0E-15  ){
	    tgc3.setTitle("   I (d,t) [ f A ]                                 "+labella); 
	   
	}
	else if(state.getYRangeMax(2)<1.0E-15  ){
	    tgc3.setTitle("   I (d,t) [ a A ]                                 "+labella); 
	   
	}
	//tgc3.setTitle("   I(d,t)  [ A ]                                        2 |V+| / Zo");
	tgc3.setYRangeMax(t_state.getYRangeMax(2));
	tgc3.setYRangeMin(-t_state.getYRangeMax(2));
	tgc3.plot(t_state.x,t_state.y1, t_state.yV1, t_state.yV2);
	tgc3.cleanUp();
    }	
    
    public synchronized void plotTimeDependentPower(Trans_State state){
	//if(tron != null) tron.suspend();
	t_state = state;
	cbx2.setState(true);
	t_state.reset();
	ssc.clockcanvas.setStatus(0,t_state.NTime,t_state.dtime);
	ssc.clockcanvas.reset();
	DynamicRunType = 3;
	tgc3.reset();
	tgc3.setDynamics(false);
	t_state.ScanTimeDependentPower();
	
	String labella;
	/*
        if(!state.stub[0].isEnable() && !state.stub[1].isEnable() && !state.stub[2].isEnable()){
	    labella = "2 |V+|\u00b2/ Zo";
	}
	else{
	    labella = "3 |V+|\u00b2/ Zo";
	}
	*/
        
        //labella =""+state.PlotTimeScale+" |V+|\u00b2/ Zo";
        //if(state.PlotTimeScale==1){labella ="  |V+|\u00b2/ Zo";};
        labella ="";
                
	if (state.getYRangeMax(3)>=1.0 && state.getYRangeMax(3)<1.0E3 || state.getYRangeMax(3)==0.0){
	    tgc3.setTitle("   P(d,t) [ W ]                                "+labella);    
	}
	else if(state.getYRangeMax(3)<1.0E6 && state.getYRangeMax(3)>=1.0E3  ){
	    tgc3.setTitle("   P(d,t) [ k W ]                                "+labella); 
	   
	}
	else if(state.getYRangeMax(3)>=1.0E6  ){
	    tgc3.setTitle("   P(d,t) [ M W ]                                "+labella); 
	   
	}
	else if(state.getYRangeMax(3)<1.0 && state.getYRangeMax(3)>=1.0E-3  ){
	    tgc3.setTitle("   P(d,t) [ m W ]                                "+labella); 
	   
	}
	else if(state.getYRangeMax(3)<1.0E-3 && state.getYRangeMax(3)>=1.0E-6  ){
	    tgc3.setTitle("   P(d,t) [ \u00b5 W ]                                "+labella); 
	    
	}
	else if(state.getYRangeMax(3)<1.0E-6 && state.getYRangeMax(3)>=1.0E-9  ){
	    tgc3.setTitle("   P(d,t) [ n W ]                                "+labella); 
	    
	}
	else if(state.getYRangeMax(3)<1.0E-9 && state.getYRangeMax(3)>=1.0E-12  ){
	    tgc3.setTitle("   P(d,t) [ p W ]                                "+labella); 
	    
	}
	else if(state.getYRangeMax(3)<1.0E-12 && state.getYRangeMax(3)>=1.0E-15){
	    tgc3.setTitle("   P(d,t) [ f W ]                                "+labella); 
	   
	}
	else if(state.getYRangeMax(3)<1.0E-15){
	    tgc3.setTitle("   P(d,t) [ a W ]                                "+labella); 
	   
	}
	//tgc3.setTitle("   P(d,t)  [ W ]                                     2 |V+|\u00b2/ Zo");
	tgc3.setYRangeMax(t_state.getYRangeMax(3));
	tgc3.setYRangeMin(-t_state.getYRangeMax(3));
	
	tgc3.plot(t_state.x,t_state.y1, t_state.yV1, t_state.yV2);
	tgc3.cleanUp();
    }
    
    public void start(){
	if(tron == null){
	    tron = new Thread(this);
	    tron.start();
	}
    }
    
    //public void stop(){
	//if(tron != null) {
	  //  tron.stop();
	  //  tron = null;
	//}
    //}
    
    public void run(){
	while(true){
	    if(IsTronRunning){
		plotDynamicRun();
		ssc.clockcanvas.increment();
		t_state.increment();
	    }
	    try{
		Thread.sleep(SleepTime);
	    }
	    catch(InterruptedException e){e.printStackTrace();}
	}
    }
    
    public synchronized void plotDynamicRun(){
	switch(DynamicRunType){
	    case 5:
		t_state.ScanRandom();
		tgc3.setTitle("Test");
		tgc3.reset();
		tgc3.setDynamics(true);
		tgc3.plot(t_state.x,t_state.y1, t_state.yV1, t_state.yV2);
	    break;
		
	    case 1:
		t_state.ScanTimeDependentVoltage();
		tgc3.plot(t_state.x,t_state.y1, t_state.yV1, t_state.yV2);
		tgc3.setDynamics(true);
	    break;
	    
	    case 2:
		t_state.ScanTimeDependentCurrent();
		tgc3.setDynamics(true);
		tgc3.plot(t_state.x,t_state.y1, t_state.yV1, t_state.yV2);
	    break;
	    
	    case 3:
		t_state.ScanTimeDependentPower();
		tgc3.setDynamics(true);
		tgc3.plot(t_state.x,t_state.y1, t_state.yV1, t_state.yV2);
	    break; 
	}
    }
}
