//SlidePanel.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class SlidePanel extends Panel implements ActionListener, ChangeListener{
	DipoleAnt ant;
	JSlider slider1, slider2, slider3;
	TextField text1, text2;
	Button button1;
	Rectangle r;
        
        private Image im;
	private Graphics buf;
        public int trace;
	
        private Font labfont;
	final int ScrollMin=0;
        int xshift;
        int x1; int x2; int x3; int x4; int x5;
        int y0; int y1; int y2; int y3; int y4;
        int yshift;
        int Lslider1;
        int Lslider2;
        int Lslider3;
        int Lheight;
        int Lheight2;
        int Ltext1;

    int mainWidth, mainHeight;
                
    
	//public int ScrollMax=20001;
	
        SlidePanel(DipoleAnt ant){
		super();
		this.ant=ant;
		Color bgcolor = new Color(236,236,221);
		setBackground(bgcolor);
		setLayout(null);
                labfont = labfont = new Font("SanSerif",Font.PLAIN,ant.font12);
                xshift = ant.s20;
                x1 = ant.s20;
                x3 = ant.s23;
                x2 = ant.s300;
                
                y0 = ant.s17;
                y1 = ant.s22;
                y2 = y0 + ant.s5;
                y3 = y2 + ant.s5;
                y4 = ant.s10;
                yshift = ant.s2;
                
                Lslider1 = ant.s150;
                Lslider2 = ant.s150;
                Lslider3 = ant.s70;
                
                Lheight = ant.s15;
                Lheight2 = ant.s19;
                Ltext1 = ant.s60;
                x3 = x2 + Lslider2 + Ltext1 + ant.s10;
                x4 = x3 + ant.s200;
                x5 = x3 + ant.s105;
		text1 = new TextField("0.5",8);	
		text2 = new TextField("1.0",8);
                text1.setFont(labfont);
                text2.setFont(labfont);

		mainWidth = getSize().width;
		mainHeight = getSize().height;  // - xxxxx;
                
                trace = 2;

		slider1 = new JSlider(ScrollMin,ant.ScrollMax);
		slider1.setValue(500);
		slider2 = new JSlider(1,21);
		slider2.setValue(10);
		slider3 = new JSlider(1,11);
		slider3.setValue(2);
		/*
		slider1 = new Scrollbar(Scrollbar.HORIZONTAL,500,1,ScrollMin,ant.ScrollMax);
		slider2 = new Scrollbar(Scrollbar.HORIZONTAL,10,1,1,21);
		slider3 = new Scrollbar(Scrollbar.HORIZONTAL,2,1,1,11);
		*/
		
                button1=new Button("Update");
                
		text1.setBounds(x1+Lslider1+xshift,y1-1,Ltext1,Lheight2);
                Panel pt1 = new Panel();
		    pt1.setBackground(Color.black);
		    pt1.setBounds(x1+Lslider1+xshift-1,y1-2,Ltext1+2,Lheight2+2);
		text2.setBounds(x3,y1-1,Ltext1,Lheight2);
                Panel pt2 = new Panel();
		    pt2.setBackground(Color.black);
		    pt2.setBounds(x3-1,y1-2,Ltext1+2,Lheight2+2);
		//==============================================================
                if(ant.IsMac){
                    slider1.setBounds(x1+ant.s5+ant.s14,y1+yshift,Lslider1-ant.s28,Lheight);
                }
                else{
                    slider1.setBounds(x1+ant.s5,y1+yshift,Lslider1,Lheight);
                }
		slider1.setBackground(bgcolor);
		/*
                Panel pslider1 = new Panel();
		    pslider1.setBackground(Color.cyan);
		    pslider1.setBounds(x1+ant.s5-1,y1 + yshift-1,Lslider1+2,Lheight+2);
		Panel pslider2 = new Panel();
		    pslider2.setBackground(Color.black);
		    pslider2.setBounds(x1+ant.s5-2,y1 + yshift-2,Lslider1+4,Lheight+4);
		*/
                slider2.setBounds(x2,y1 + yshift,Lslider2,Lheight);
		slider2.setBackground(bgcolor);
		/*
                Panel pslider3 = new Panel();
		    pslider3.setBackground(Color.cyan);
		    pslider3.setBounds(x2-1,y1 + yshift-1,Lslider2+2,Lheight+2);
		Panel pslider4 = new Panel();
		    pslider4.setBackground(Color.black);
		    pslider4.setBounds(x2-2,y1 + yshift-2,Lslider2+4,Lheight+4);
		*/
                slider3.setBounds(x5,y1 + yshift,Lslider3,Lheight);
		slider3.setBackground(bgcolor);
		/*
                Panel pslider5 = new Panel();
		    pslider5.setBackground(Color.cyan);
		    pslider5.setBounds(x5-1,y1 + yshift-1,Lslider3+2,Lheight+2);
		Panel pslider6 = new Panel();
		    pslider6.setBackground(Color.black);
		    pslider6.setBounds(x5-2,y1 + yshift-2,Lslider3+4,Lheight+4);
		*/
                //==============================================================
                button1.setBounds(x4,y4,ant.s70,ant.s30);
                button1.setBackground(Color.white);
                button1.setFont(labfont);
                Panel pbut = new Panel();
		    pbut.setBackground(Color.black);
		    pbut.setBounds(x4-1,y4-1,ant.s70+2,ant.s30+2);
                
		add(text1); add(pt1);
		add(text2); add(pt2);
		add(slider1);
                //add(pslider1);
                //add(pslider2);
		    
		add(slider2);
                //add(pslider3);
		//add(pslider4);
		
                add(slider3);
                //add(pslider5);
		//add(pslider6);
		
		add(button1);
                add(pbut);
		//==============================================================    
                button1.addActionListener(this);
                slider1.addChangeListener(this);
		slider2.addChangeListener(this);
                slider3.addChangeListener(this);
        }
        
        public void paint(Graphics g){
		
	    if(im == null){
		im = createImage(getSize().width,getSize().height);
		//im = createImage(mainWidth,mainHeight);
		buf = im.getGraphics();
		drawCanvas(buf);
	    }
	    else{
		drawCanvas(buf);
	    }
		
	    g.drawImage(im,0,0,null);
	    slider1.requestFocusInWindow();
	    slider2.requestFocusInWindow();
	    slider3.requestFocusInWindow();
	}
    
	//Addition to reduce flicker new routine
	public void update(Graphics g){		// added to avoid clearing
	    paint(g);
	}


	public void redraw(){
                repaint();
        }
	
	
	public void drawCanvas(Graphics g){
		r = getBounds();
		
                xshift = ant.s20;
                x1 = ant.s20;
                x2 = ant.s300;
                y0 = ant.s15;
                y1 = ant.s22;
                y2 = y0 + ant.s5;
                y3 = y2 + ant.s5;
                yshift = ant.s2;
                Lslider1 = ant.s150;
                Lslider2 = ant.s150;
                Lslider3 = ant.s70;
                Lheight = ant.s15;
                Lheight2 = ant.s19;
                Ltext1 = ant.s60;
                
                x3 = x2 + Lslider2 + Ltext1 + ant.s10;
                x4 = x3 + ant.s200;
                x5 = x3 + ant.s105;
                
                Graphics2D g2d = (Graphics2D)g;
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
                g.clearRect(0,0,getSize().width,getSize().height);
                
                g.setColor(Color.black);
		g.draw3DRect(0,0,r.width-1,r.height-1,false);
		
                g.setColor(Color.black);
                g.setFont(new Font("Serif",Font.BOLD + Font.ITALIC,ant.font20));
                g.drawString("l",ant.s9,ant.s38);
                
		g.setFont(new Font("Sanserif",Font.PLAIN,ant.font12));
		g.setColor(Color.red.darker());
		g.drawString("Dipole Length (wavelengths)",x1+ant.s5,y0);
                g.drawString("Maximum Length (wavelengths)",x2,y0);
                
		g.setColor(Color.red.darker());
                MaestroG.subscripter2("Max Current ","I","0","",g,ant.font12,x3-ant.s5,y0);
		//g.drawString("Maximum Current (Amps)",x3,y0);
		
                g.setColor(Color.black);
		g.setFont(new Font("Serif",Font.BOLD,ant.font17));
		g.drawString("\u03bb",x1+Lslider1+xshift+Ltext1+ant.s10,32*y1/20 + yshift);
                
                g.setColor(Color.black);
                g.setFont(new Font("Serif",Font.BOLD,ant.font17));
                g.drawString(slider2.getValue()+" \u03bb",x2+Lslider2+ant.s10,32*y1/20 + yshift);
                
                g.setColor(Color.black);
                g.setFont(new Font("Serif",Font.BOLD,ant.font17));
                g.drawString("A",x3+Ltext1+ant.s5,32*y1/20 + yshift);
                
                if(ant.rcons.c1){
                    MaestroG.drawLineThick2(g, x5, ant.s12, x5 + Lslider3, ant.s12, trace, Color.blue.darker());
                }
                else if(ant.rcons.c3){
                    MaestroG.drawLineThick2(g, x5, ant.s12, x5 + Lslider3, ant.s12, trace, Color.magenta.darker());
                }        
	}
	
	
	public void actionPerformed(ActionEvent evt){
	    if(evt.getSource()==button1)
            {
                ant.dipolelength=Float.valueOf(text1.getText()).floatValue();
		if(Float.valueOf(text2.getText()).floatValue() > 1.0e17){
		    ant.dipolecurrent = 1.0e17f;
		    text2.setText(String.valueOf(1.0E17));
		}
		else{
		    ant.dipolecurrent=Float.valueOf(text2.getText()).floatValue();
		}
		if(ant.dipolelength < 0.0f){
			 ant.dipolelength=0.0f;
		         text1.setText(String.valueOf(0.0));
		}
		if(ant.dipolelength > ant.dipolelengthmax){
			 ant.dipolelength=ant.dipolelengthmax;
		         text1.setText(String.valueOf(ant.dipolelengthmax));
		}
		slider1.setValue((int)(ant.ScrollMax*ant.dipolelength/ant.dipolelengthmax));
		ant.dcan.redraw(); //draw the dipole
		ant.UpdateRadiation();
		ant.rcan1.redraw();//draw the radar canvas
		ant.rcan2.redraw();
		
		ant.outpanel.repaint();
		//if(ant.dipolelength==0.0) ant.dipolelength=1.0e-10f;
            }
            
	}
	
	
	public void stateChanged(ChangeEvent evt){
	    //if((float)ant.dipolelengthmax*slider1.getValue()/(float)(ScrollMax-1)>ant.dipolelengthmax){
	    
            if(evt.getSource()==slider1){
                {
                    ant.dipolelength=(float)ant.dipolelengthmax*slider1.getValue()/(float)(ant.ScrollMax-1);
                }


                //if(ant.dipolelength==0.0) ant.dipolelength=1.0e-10f;
                    text1.setText(String.valueOf(ant.dipolelength));
                    ant.dcan.redraw();//draw the dipole
                    ant.UpdateRadiation();
                    ant.rcan1.redraw();//draw the radar canvas
                    ant.rcan2.redraw();

                    ant.outpanel.repaint();
            }
            if(evt.getSource()==slider2){
                ant.dipolelengthmax = slider2.getValue();
                ant.dipolelength = 0.5f;
                ant.ScrollMax = (slider2.getValue()*1000) + 1;
                slider1.setMaximum(ant.ScrollMax);
                //slider1.setValue((int)(ant.ScrollMax*ant.dipolelength/ant.dipolelengthmax));
                slider1.setValue(500);
                repaint();
                text1.setText(String.valueOf(ant.dipolelength));
                    ant.dcan.redraw();//draw the dipole
                    ant.UpdateRadiation();
                    ant.rcan1.redraw();//draw the radar canvas
                    ant.rcan2.redraw();

                    ant.outpanel.repaint();
            }
            if(evt.getSource()==slider3){
                trace = slider3.getValue();
                ant.rcan1.thick_plot = trace;
                ant.rcan2.thick_plot = trace;

                ant.rcan1.redraw();//draw the radar canvas
                ant.rcan2.redraw();
                repaint();
            }
	}
} //End of SlidePanel
