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

public class SlidePanel extends Panel implements ItemListener, ActionListener, ChangeListener{
	Antenna ant;
        
	JSlider slider1, slider2, slider3, slider4, slider5;
	TextField text1, text2;
	TextField text3, text4;
	TextField text5, text6;
	Checkbox c1, c2;
	CheckboxGroup cgrid1;
        
        public int trace;
        public boolean warning;
	
        private static final Color bgcolor = new Color(236,236,221);
	private Image im;
        private Graphics buf;
        
	public Button button1, bdeg, brad;
        public Panel pdeg, prad;
        
        Rectangle r;
	final int ScrollMin=0;
	final int ScrollMax=3001;
	final int ScrollFaseMax=361;
	final int ScrollFaseMin=0;
	final int ScrollMax2 = 1001;
	final int ScrollDipoleMin = 1;
	final int ScrollDipoleMax = 51;
	double fase = 0.0;
	
        SlidePanel(Antenna ant){
		super();
		this.ant=ant;
		
                setLayout(null);
		setBackground(bgcolor);
		
                trace = 2;
                warning = false;
		cgrid1=new CheckboxGroup();
		c1 = new Checkbox("deg",cgrid1,true);
		c2 = new Checkbox("rad",cgrid1,false);

		c1.addItemListener(this);
		c2.addItemListener(this);
		c1.setBackground(bgcolor);
		c2.setBackground(bgcolor);
                add(c1);
		add(c2);
		
                /// TURN OFF RADIO BUTTONS
                //c1.setBounds(s3x + Lx/2, s3y - ant.s20, ant.s45, ant.s15);  //110,83,55,17);
		//c2.setBounds(s3x + Lx/2 +ant.s50, s3y - ant.s20, ant.s45, ant.s15);
		c1.setBackground(bgcolor);
		c2.setBackground(bgcolor);

		text1=new TextField("0.5",8);	
		text2=new TextField("5",8);
		text3=new TextField("0",8);
		text4=new TextField("0.5",8);
		text5=new TextField("1.0",8);
		//text6=new TextField("1.0",8);
                text1.setFont(new Font("SanSerif",Font.PLAIN,ant.font12));
                text2.setFont(new Font("SanSerif",Font.PLAIN,ant.font12));
                text3.setFont(new Font("SanSerif",Font.PLAIN,ant.font12));
                text4.setFont(new Font("SanSerif",Font.PLAIN,ant.font12));
                text5.setFont(new Font("SanSerif",Font.PLAIN,ant.font12));
                //text6.setFont(new Font("SanSerif",Font.PLAIN,ant.font12));
                add(text1);
		add(text2);
		add(text3);
		add(text4);
		add(text5);
		//add(text6);
                
                slider1 = new JSlider(ScrollMin,ScrollMax);
		slider1.setValue(500);
		slider2 = new JSlider(ScrollDipoleMin,ScrollDipoleMax);
		slider2.setValue(5);
		slider3 = new JSlider(ScrollFaseMin,ScrollFaseMax);
		slider3.setValue(180);
		slider4 = new JSlider(ScrollMin,ScrollMax2);
		slider4.setValue(500);
                slider5 = new JSlider(1,11);
		slider5.setValue(2);
                /*
                slider1=new Scrollbar(Scrollbar.HORIZONTAL,500,1,ScrollMin,ScrollMax);
		slider2=new Scrollbar(Scrollbar.HORIZONTAL,5,1,ScrollDipoleMin,ScrollDipoleMax);
		slider3=new Scrollbar(Scrollbar.HORIZONTAL,180,1,ScrollFaseMin,ScrollFaseMax);
		slider4=new Scrollbar(Scrollbar.HORIZONTAL,500,1,ScrollMin,ScrollMax2);
                slider5 = new Scrollbar(Scrollbar.HORIZONTAL,2,1,1,11);
                slider1.setBackground(new Color(255,255,255));
                slider2.setBackground(new Color(255,255,255));
                slider3.setBackground(new Color(255,255,255));
                slider4.setBackground(new Color(255,255,255));
                slider5.setBackground(new Color(255,255,255));
		*/
                
                button1=new Button("Update");
                button1.setBackground(Color.white);
                button1.setFont(new Font("Sanserif",Font.PLAIN,ant.font12));
		
		slider1.addChangeListener(this);
		slider2.addChangeListener(this);
		slider3.addChangeListener(this);
		slider4.addChangeListener(this);
                slider5.addChangeListener(this);
                                
                add(slider1);
		add(slider2);
		add(slider3);
		add(slider4);
		add(slider5);
                
		button1.addActionListener(this);
                button1.setBackground(Color.white);
		add(button1);
                        
		int Lx = ant.s190; // length of sliders 
                int Ly = ant.s15;
                int dtext = ant.s10;
                int text_w = ant.s50;
                int text_h = ant.s20;
                int bw = ant.s14; 
                int bh = ant.s15;
                
                // Slider Length A
                int s1x = ant.s25; int s1y = ant.s28;
                int b2b_x = s1x + Lx - ant.s14;
                int text1_x = s1x + Lx + dtext;
                
                if(ant.IsMac){
                    slider1.setBounds(s1x+ant.s14,s1y,Lx-ant.s28,Ly);
                }
                else{
                    slider1.setBounds(s1x,s1y,Lx,Ly);
                }
                
                text1.setBounds(text1_x,s1y-ant.s3,text_w,text_h);
                Panel ptext1 = new Panel();
		ptext1.setBackground(Color.black);
		add(ptext1);
		ptext1.setBounds(text1_x-1,s1y-ant.s3-1,text_w+2,text_h+2);
		/*
                Panel pslider1 = new Panel();
		pslider1.setBackground(Color.black);
		add(pslider1);
		pslider1.setBounds(s1x-1,s1y-1,Lx+2,Ly+2);
		*/
                //--------------------------------------------------------------
                // Slider Length B
                int s2x = ant.s25; int s2y = ant.s68;
                int b3b_x = s2x + Lx - ant.s14;
                int text2_x = s2x + Lx + dtext;
                
                if(ant.IsMac){
                    slider2.setBounds(s2x+ant.s14,s2y,Lx-ant.s28,Ly);
                }
                else{
                    slider2.setBounds(s2x,s2y,Lx,Ly);
                }
                
                text2.setBounds(text2_x,s2y-ant.s3,text_w,text_h); // 220,55,50,20);
                Panel ptext2 = new Panel();
		ptext2.setBackground(Color.black);
		add(ptext2);
		ptext2.setBounds(text2_x-1,s2y-ant.s3-1,text_w+2,text_h+2);
		/*
		Panel pslider2 = new Panel();
		pslider2.setBackground(Color.black);
		add(pslider2);
		pslider2.setBounds(s2x-1,s2y-1,Lx+2,Ly+2);
		*/
                //--------------------------------------------------------------
                // Slider phase between dipoles
                int s3x = ant.s550 + ant.s75; int s3y = ant.s50;
                int b4b_x = s3x + Lx - ant.s14;
                int text3_x = s3x + Lx + dtext;
                
                // TURN OFF RADIO BUTTONS
                //c1.setBounds(s3x + Lx/2, s3y - ant.s20, ant.s45, ant.s15);  //110,83,55,17);
		//c2.setBounds(s3x + Lx/2 +ant.s50, s3y - ant.s20, ant.s45, ant.s15);
		
                bdeg = new Button("deg");
                bdeg.setFont(new Font("SanSerif",Font.BOLD,ant.font12));
                bdeg.setBounds(s3x + Lx/2, s3y - ant.s21, ant.s42, ant.s15);
                bdeg.setForeground(Color.red);
                bdeg.setBackground(Color.white);
                add(bdeg);
                pdeg = new Panel();
                    pdeg.setBackground(Color.red);
                    pdeg.setBounds(s3x + Lx/2-2, s3y - ant.s21-2, ant.s42+4, ant.s15+4);
                    add(pdeg);
                    
                brad = new Button("rad");
                brad.setFont(new Font("SanSerif",Font.BOLD,ant.font12));
                brad.setBounds(s3x + Lx/2 +ant.s50, s3y - ant.s21, ant.s42, ant.s15);
                brad.setForeground(Color.gray.brighter());
                brad.setBackground(Color.white);
                add(brad);
                prad = new Panel();
                    prad.setBackground(Color.gray);
                    prad.setBounds(s3x + Lx/2 +ant.s50-2, s3y - ant.s21-2, ant.s42+4, ant.s15+4);
                    add(prad);
                
                bdeg.addActionListener(this);
                brad.addActionListener(this);
                    
		if(ant.IsMac){
                    slider3.setBounds(s3x+ant.s14,s3y,Lx-ant.s28,Ly); // 23,105,185,15);
                }
                else{
                    slider3.setBounds(s3x,s3y,Lx,Ly); // 23,105,185,15);
                }
                /*
                Panel pslider3 = new Panel();
		pslider3.setBackground(Color.black);
		add(pslider3);
		pslider3.setBounds(s3x-1,s3y-1,Lx+2,Ly+2);
		*/
		text3.setBounds(text3_x,s3y - ant.s3,text_w,text_h);
                Panel ptext3 = new Panel();
		ptext3.setBackground(Color.black);
		add(ptext3);
		ptext3.setBounds(text3_x-1,s3y - ant.s3-1,text_w+2,text_h+2);
		
                //--------------------------------------------------------------
                // Slider distance between dipoles
                
                int s4x = ant.s300 + ant.s25; int s4y = ant.s28; int s5y = ant.s68;
                int b5b_x = s4x + Lx - ant.s14;
                int text4_x = s4x + Lx + dtext;
                int text5_x = text4_x - ant.s80; //s4x + ant.s100; 
                int text6_x = text4_x; // text5_x + ant.s90;
                int text5_y = s2y-ant.s3;
                
                if(ant.IsMac){
                    slider4.setBounds(s4x+ant.s14,s4y,Lx-ant.s28,Ly);
                }
                else{
                    slider4.setBounds(s4x,s4y,Lx,Ly);
                }
		/*
                Panel pslider4 = new Panel();
		pslider4.setBackground(Color.black);
		add(pslider4);
		pslider4.setBounds(s4x-1,s4y-1,Lx+2,Ly+2);
		*/
                text4.setBounds(text4_x,s4y - ant.s3,text_w,text_h);
                Panel ptext4 = new Panel();
		ptext4.setBackground(Color.black);
		add(ptext4);
		ptext4.setBounds(text4_x-1,s4y - ant.s3-1,text_w+2,text_h+2);
		
                //text5.setBounds(text5_x,text5_y,text_w,text_h);
                //Panel ptext5 = new Panel();
		//ptext5.setBackground(Color.black);
		//add(ptext5);
		//ptext5.setBounds(text5_x-1,text5_y-1,text_w+2,text_h+2);
		
                text5.setBounds(text6_x,text5_y,text_w,text_h);
                Panel ptext5 = new Panel();
		ptext5.setBackground(Color.black);
		add(ptext5);
		ptext5.setBounds(text6_x-1,text5_y-1,text_w+2,text_h+2);
		
                slider5.setBounds(ant.s900 + ant.s10,ant.s50,ant.s70,Ly);
		/*
                Panel pslider5 = new Panel();
		pslider5.setBackground(Color.black);
		add(pslider5);
		pslider5.setBounds(ant.s900 + ant.s10-1,ant.s50-1,ant.s70+2,Ly+2);
                */
                //--------------------------------------------------------------
		button1.setBounds(ant.s1000+ant.s10,s1y+ant.s1,ant.s70,ant.s30);
		Panel pb1 = new Panel();
                pb1.setBackground(Color.black);
                add(pb1);
                pb1.setBounds(ant.s1000+ant.s10-1,s1y+ant.s1-1,ant.s70+2,ant.s30+2);	
	}
        
        @Override
        public void paint(Graphics g){
	    if(im == null){
		im = createImage(getSize().width,getSize().height);
		buf = im.getGraphics();
		drawCanvas(buf);
	    }
	    else{
		drawCanvas(buf);
	    }
	    g.drawImage(im,0,0,null);
	    slider1.requestFocusInWindow();
	    slider2.requestFocusInWindow();
	    slider3.requestFocusInWindow();
	    slider4.requestFocusInWindow();
	    slider5.requestFocusInWindow();
        }
    
        @Override
        public void update(Graphics g){
            paint(g);
        }
		
	public void drawCanvas(Graphics g){
		r=getBounds();
		
                g.setColor(bgcolor);
                g.fillRect(0,0,r.width-1,r.height-1);
                
                Graphics2D g2d = (Graphics2D)g;
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
		
		//g.draw3DRect(0,0,r.width-1,r.height-1,false);
		
		g.setFont(new Font("SanSerif",Font.BOLD,ant.font12));
		g.setColor(Color.blue);
		g.drawString("Dipole Length",ant.s10,ant.s20);
		g.drawString("Number of dipoles N",ant.s10,ant.s60);
		
                MaestroG.AttachSymbol3("Incremental Phase Delay  ","\u03b4" ,g,ant.font12,ant.font15,ant.s600+ant.s30,ant.s20);
                //g.drawString("Current Phase Difference",ant.s600+ant.s30,ant.s20);
		
                g.setFont(new Font("SanSerif",Font.BOLD,ant.font12));
		g.drawString("Dipole Spacing d",ant.s300+ant.s25,ant.s20);
		g.drawString("Maximum Dipole Current",ant.s300+ant.s25,ant.s80);
                //g.setFont(new Font("SanSerif",Font.BOLD,ant.font12));
                //g.drawString("(Amps)",ant.s300+ant.s45,ant.s85);
		g.setColor(Color.black);
		g.setFont(new Font("Serif",Font.BOLD,ant.font16));
		g.drawString(" \u03bb ",ant.s190+ant.s90,ant.s42);
		g.drawString(" \u03bb ",ant.s190+ant.s90,ant.s82);
		g.drawString(" \u03bb ",ant.s500+ant.s80,ant.s42); 
                g.setFont(new Font("SanSerif",Font.BOLD,ant.font12));
		g.drawString(" [A]",ant.s500+ant.s80,ant.s80);
		
		g.draw3DRect(0,0,r.width-1,r.height-1,false);
		
                if(ant.rcons.c1.getState() == true){
                    MaestroG.drawLineThick2(g, ant.s900 + ant.s10, ant.s40, ant.s900 + ant.s80, ant.s40, trace, Color.blue.darker());
                }
                else if(ant.rcons.c3.getState() == true){
                    MaestroG.drawLineThick2(g, ant.s900 + ant.s10, ant.s40, ant.s900 + ant.s80, ant.s40, trace, Color.magenta.darker());
                }
                
                // This is used if update is slow but it should no longer be an issue
                //if(warning){
                //    g.setFont(new Font("SanSerif",Font.BOLD,ant.font14));
                //    g.setColor(Color.red);
                //    g.drawString("Click Update",ant.s150,ant.s15);
                //    g.drawString("Click Update",ant.s900,ant.s15);
                //}
	}


    	public void stateChanged(ChangeEvent evt){
	 	
	if(evt.getSource()==slider1 || evt.getSource()==slider2 || evt.getSource()==slider3 || evt.getSource()==slider4){
            warning = true;
            repaint();
            
	    double dipolelengthA, dipolelengthB;
	    double fase=ant.fase, distancia;
	    
	    if((double)ant.dipolelengthmaxA*slider1.getValue()/(double)(ScrollMax-1)>ant.dipolelengthmaxA){
		dipolelengthA=ant.dipolelengthmaxA;
		slider1.setValue(ScrollMax-1);
	    }
	    else{
		dipolelengthA=(double)ant.dipolelengthmaxA*slider1.getValue()/(double)(ScrollMax-1);
	    }
		
	    
	    {
		ant.number_dipoles=slider2.getValue();
	    }
		
	    	    
	    {
		distancia=(double)ant.distanciamax*slider4.getValue()/(double)(ScrollMax2-1);
	    }
	     text4.setText(String.valueOf(MaestroA.rounder(distancia,4)));
	    
	    if(dipolelengthA==0.0) dipolelengthA=1.0e-10;
		
	    text1.setText(String.valueOf(MaestroA.rounder(dipolelengthA,4)));
	    text2.setText(String.valueOf(ant.number_dipoles));
		
	    if(c2.getState()){
		
		
		    fase=(double)((slider3.getValue()-180)*2*Math.PI/(ScrollFaseMax-1));
		    text3.setText(String.valueOf(MaestroA.rounder(fase,4)));
		    ant.fase=(double)(Double.valueOf(text3.getText()).doubleValue());
	    }
	    else if(c1.getState()){
		//degree
		
		    fase=(double)(2*Math.PI*(slider3.getValue()-180)/(ScrollFaseMax-1));
		    text3.setText(String.valueOf(MaestroA.rounder(fase*180/Math.PI,2)));
		    ant.fase=(double)(Double.valueOf(text3.getText()).doubleValue()*Math.PI/180);
	    }
		   
		ant.dipolelengthA=Double.valueOf(text1.getText()).doubleValue();
		ant.dipolecurrentA=Double.valueOf(text5.getText()).doubleValue();		
		ant.distancia=Double.valueOf(text4.getText()).doubleValue();
		
		if(ant.dipolelengthA < 0.0){
		    ant.dipolelengthA=0.0;
		    text1.setText(String.valueOf(0.0));
		}
		if(ant.dipolelengthA > ant.dipolelengthmaxA){
		    ant.dipolelengthA=ant.dipolelengthmaxA;
		    text1.setText(String.valueOf(ant.dipolelengthmaxA));
		}
		
		if(ant.distancia < 0.0){
		    ant.distancia=0.0;
		    text4.setText(String.valueOf(ant.distancia));
		}
		if(ant.distancia>1.0){
		    ant.distancia=1.0;
		    text4.setText(String.valueOf(ant.distancia));
		}

		slider1.setValue((int)(ScrollMax*ant.dipolelengthA/ant.dipolelengthmaxA));
                slider2.setValue(ant.number_dipoles);
		
		slider3.setValue((int)(ScrollFaseMax*ant.fase*0.5/Math.PI)+180);
		slider4.setValue((int)(ScrollMax2*ant.distancia/ant.distanciamax));
		ant.dcan.redraw(); //draw the dipole
		ant.setThetaPlaneMaxima();
		ant.UpdateRadiation();
		ant.rcan1.redraw();//draw the radar canvas
		ant.rcan2.redraw();
		
		ant.outpanel.repaint();
		if(ant.dipolelengthA==0.0) ant.dipolelengthA=1.0e-10;   
	    
	    //=====================================	   
            }
        
            if(evt.getSource()==slider5){
                trace = slider5.getValue();
                ant.rcan1.thick_plot = trace;
                ant.rcan2.thick_plot = trace;

                ant.rcan1.redraw();//draw the radar canvas
                ant.rcan2.redraw();
                repaint();
            }
	}
	

	public void itemStateChanged(ItemEvent evt){
	    fase=(double)(2*Math.PI*slider3.getValue()/(ScrollFaseMax-1)-Math.PI);
	    if(evt.getSource()==c2){
		text3.setText(String.valueOf(MaestroA.rounder(fase,4)));
	    }	
	    else if(evt.getSource()==c1){
		text3.setText(String.valueOf(MaestroA.rounder(fase*180/Math.PI,2)));
	    }
            warning = true;
            repaint();
            
	}


        public void actionPerformed(ActionEvent evt){
            fase=(double)(2*Math.PI*(slider3.getValue()-180)/(ScrollFaseMax-1));
	    if(evt.getSource()== brad){
                c2.setState(true);
                c1.setState(false);
		text3.setText(String.valueOf(MaestroA.rounder(fase,3)));
	    }	
	    else if(evt.getSource() == bdeg){
		c1.setState(true);
                c2.setState(false);
		text3.setText(String.valueOf(MaestroA.rounder(fase*180/Math.PI,2)));
	    }
            
            if(evt.getSource() == bdeg){
                c1.setState(true);
                c2.setState(false);
                bdeg.setForeground(Color.red);
                brad.setForeground(Color.gray.brighter());
                pdeg.setBackground(Color.red);
                prad.setBackground(Color.gray.brighter());
                repaint();
		//ant.rcan1.repaint(1);
		//ant.rcan2.repaint(1);
                //ant.slidepanel.repaint();
	    }	
	    else if(evt.getSource() == brad){
		c2.setState(true);
                c1.setState(false);
                brad.setForeground(Color.red);
                bdeg.setForeground(Color.gray.brighter());
                pdeg.setBackground(Color.gray.brighter());
                prad.setBackground(Color.red);
                repaint();
		//ant.rcan1.repaint(3);
		//ant.rcan2.repaint(3);
                //ant.slidepanel.repaint();
	    }
            
            
            if(evt.getSource()==button1){
                warning = false;
                repaint();
            
		//update dipole lengths
		ant.dipolelengthA=Double.valueOf(text1.getText()).doubleValue();
		ant.dipolecurrentA=Double.valueOf(text5.getText()).doubleValue();
		
		// update number of dipoles
		if((int)(Double.valueOf(text2.getText()).doubleValue()) < 1){
		    ant.number_dipoles=1;
		}
		else{
		    ant.number_dipoles=(int)(Double.valueOf(text2.getText()).doubleValue());
		}
		
		text2.setText(""+ant.number_dipoles);
		
		if(c2.getState()){
		    //rad
		    ant.fase=(double)(Double.valueOf(text3.getText()).doubleValue());
		}
		else{ 
		    //degree
		    ant.fase=(double)(Double.valueOf(text3.getText()).doubleValue()*Math.PI/180);
		}
		
		ant.distancia=Double.valueOf(text4.getText()).doubleValue();
				
		if(ant.dipolelengthA < 0.0){
		    ant.dipolelengthA=0.0;
		    text1.setText(String.valueOf(0.0));
		}
		if(ant.dipolelengthA > ant.dipolelengthmaxA){
		    ant.dipolelengthA=ant.dipolelengthmaxA;
		    text1.setText(String.valueOf(ant.dipolelengthmaxA));
		}
		
		if(ant.distancia < 0.0){
		    ant.distancia=0.0;
		    text4.setText(String.valueOf(ant.distancia));
		}
		if(ant.distancia>1.0){
		    ant.distancia=1.0;
		    text4.setText(String.valueOf(ant.distancia));
		}

		slider1.setValue((int)(ScrollMax*ant.dipolelengthA/ant.dipolelengthmaxA));
		slider2.setValue(ant.number_dipoles);
		
		slider3.setValue((int)(ScrollFaseMax*ant.fase*0.5/Math.PI)+ 180);
		slider4.setValue((int)(ScrollMax2*ant.distancia/ant.distanciamax));
		ant.dcan.redraw(); //draw the dipole
		ant.setThetaPlaneMaxima();
		ant.UpdateRadiation();
		ant.rcan1.redraw();//draw the radar canvas
		ant.rcan2.redraw();
		
		ant.outpanel.repaint();
		if(ant.dipolelengthA==0.0) ant.dipolelengthA=1.0e-10;
		
	    }
	}

}//End of SlidePanel
