import java.applet.Applet;
import java.awt.*;
//import OsmosisCanvas;
//import gjt.*;

/*
 *
 * Osmosis
 *
 */
public class OsmPressure1 extends Nernst
{
        int Particles[] = {0,2,5,10,20,30};
        OsmPressureReportPanel1 pReport;
        OsmPressureControlPanel1 pControl;
        //OsmCanvas CDiff;
        Panel p;
        GraphCanvas1 c;
        int PLOT_AV=0, PLOT_REAL=0, is=0, is1=0, xs[]=new int[300], ys[]= new int[300], zs[]=new int[300];

        public void init(){
                Panel pnl=new Panel();
           CDiff=new OsmPCanvas(this);
           //setLayout(new BorderLayout()); //
           //add("Center",CDiff);         //
                Panel pnl2=new Panel();
           tdbDisplay=new ThreeDBorder(pnl2,5);
           pnl2.setLayout(new BorderLayout());
           pnl2.add("Center",CDiff);
           pnl2.add("East", OutBar);

           //tdbDisplay=new ThreeDBorder(CDiff,5);
           tdbDisplay.inset();
           pReport=new OsmPressureReportPanel1(this);
           pControl=new OsmPressureControlPanel1(this);
           setLayout(new BorderLayout());
           add("Center",new ThreeDBorder(pnl));
           pnl.setLayout(new BorderLayout());
           Panel pnl3=new Panel();
           pnl3.setLayout(new BorderLayout());
           pnl3.add("North", pReport);
           pnl3.add("Center",tdbDisplay);
           pnl3.add("South", pControl);
           c = new GraphCanvas1(this);
           c.resize(300,300);
           pnl.add("Center", pnl3);
           pnl.add("East", c);

    }

        public boolean action(Event event, Object what){
                if(event.target==Start_Stop){
                        if (running){
                                CDiff.stop();
                                OutBar.stop();
                                running=false;
                                Start_Stop.setLabel("Start");
                        }else{
                                CDiff.start();
                                OutBar.start();
                                running=true;
                                Start_Stop.setLabel("Stop");
                        }
                }else if (event.target==Num_Particles){
                        int NewNum=Particles[Num_Particles.getSelectedIndex()];
                        if (running) CDiff.stop();
                        ((OsmPCanvas)CDiff).OutIon=NewNum;
                        ((OsmPCanvas)CDiff).OutWater=150-(((OsmPCanvas)CDiff).Hydration+1)*NewNum;
                        CDiff.init();
                        if (running) CDiff.start();
                }else if (event.target==Plot){
                        PLOT_AV=1;
                        c.repaint();
                }else if (event.target==Plot2){
                        PLOT_REAL=1;
                        c.repaint();
                }
                return true;

        }

}


class OsmPressureReportPanel1 extends Panel{
        OsmPressure1 app;

        public OsmPressureReportPanel1(Applet applet){
                app=(OsmPressure1)applet;
                Label l_Vol_i=new Label("vol.",Label.CENTER);
                Label l_Conc_i=new Label("conc.",Label.CENTER);
                Label l_Vol_o=new Label("vol.",Label.CENTER);
                Label l_Conc_o=new Label("conc.",Label.CENTER);
                Label l_Voltage=new Label("real",Label.CENTER);
                Label l_Average=new Label("aver.",Label.CENTER);

                Panel pIn=new Panel();
                Label inside=new Label("Inside",Label.CENTER);
                app.bInside= new RBox(pIn,inside);
                pIn.setLayout(new GridLayout(2,2,2,0));
                pIn.add(l_Vol_i);
                pIn.add(l_Conc_i);
                pIn.add(app.CDiff.R_in);
                pIn.add(app.CDiff.B_in);

                Panel pOut=new Panel();
                Label outside=new Label("Outside",Label.CENTER);
                app.bOutside= new RBox(pOut,outside);
                pOut.setLayout(new GridLayout(2,2,2,0));
                pOut.add(l_Vol_o);
                pOut.add(l_Conc_o);
                pOut.add(app.CDiff.R_out);
                pOut.add(app.CDiff.B_out); 

                Panel pVoltage=new Panel();
                Label Volt=new Label("Pressure",Label.CENTER);
                app.bVoltage= new RBox(pVoltage,Volt);
                pVoltage.setLayout(new GridLayout(2,2,2,0));
                pVoltage.add(l_Voltage);
                pVoltage.add(l_Average);
                pVoltage.add(app.CDiff.Voltage);
                pVoltage.add(app.CDiff.Average);

              
              //  app.bVoltage= new RBox(app.CDiff.Voltage,"Pressure");
              //  app.bAverage= new RBox(app.CDiff.Average,"Average");
               setLayout(new GridLayout(1,3,0,0));

                add(new ThreeDBorder(app.bInside));
                add(new ThreeDBorder(app.bVoltage));
                add(new ThreeDBorder(app.bOutside));
        }

        public Insets insets(){
                return new Insets(5,5,5,5);
        }

}

class OsmPressureControlPanel1 extends Panel{

       OsmPressure1 app;

        public OsmPressureControlPanel1(Applet applet){
              
                app=(OsmPressure1)applet;
                app.p=new Panel();
                app.Num_Particles= new Choice();
                app.Num_Particles.addItem("0 Particles");
                app.Num_Particles.addItem("2 Particles");
                app.Num_Particles.addItem("5 Particles");
                app.Num_Particles.addItem("10 Particles");
                app.Num_Particles.addItem("20 Particles");
                app.Num_Particles.addItem("30 Particles");
                app.Num_Particles.select(3);

                app.Start_Stop= new Button("Stop");
                app.Plot= new Button("Plot Average");
                app.Plot2 = new Button("Plot Real");
                setLayout(new GridLayout(1,4,0,0));

                add(new ThreeDBorder(app.Start_Stop));
                add(new ThreeDBorder(app.Num_Particles));
                add(new ThreeDBorder(app.Plot));
                add(new ThreeDBorder(app.Plot2));
             //   setLayout(new BorderLayout());
             //   add("North",new ThreeDBorder(app.p));
             //   app.c= new GraphCanvas(app);
             //   app.c.resize(300,300);
             //   add("South",new ThreeDBorder(app.c));
        }

        public Insets insets(){
                return new Insets(5,5,5,5);
        }

}

class GraphCanvas1 extends Canvas {

        OsmPressure1 app1;        

        static final int POSX = 15;
        static final int NEGX = 25;
        static final int POSY = 70;
        static final int NEGY = 90;
        
        int a,b;
        
        double xstep;
        double ystep;

        public GraphCanvas1 (Applet a){
                app1=(OsmPressure1)a;
        }
        
        public synchronized void paint (Graphics g) {
                Dimension dm=size();
                int x,y,i;
                xstep=(double)dm.width/(double)(POSX+NEGX);
                ystep=(double)dm.height/(double)(POSY+NEGY);
                int xax=(int)Math.round(ystep*POSY);
                int yax=(int)Math.round(xstep*NEGX);
                g.setColor(Color.blue);
                g.drawLine(yax,0,yax,dm.height);
                g.drawLine(0,xax,dm.width,xax);
                for(i=0;i<(NEGX+POSX+1);i++){
                        x=(int)Math.round(i*xstep);
                        g.drawLine(x,xax-2,x,xax+2);
                }
                for(i=0;i<(NEGY+POSY+1);i+=5){
                        y=(int)Math.round(xax+i*ystep);
                        g.drawLine(yax-2,y,yax+2,y);
                }         
                for(i=0;i<(POSY+1);i+=5){
                        y=(int)Math.round(xax-i*ystep);
                        g.drawLine(yax-2,y,yax+2,y);
                } 
                g.setColor(Color.black);
                Font f = new Font("TimesRoman",Font.PLAIN,11);
                g.setFont(f);
                g.drawString("5",yax+(int)Math.round(5*xstep)-2,xax+12);      
                g.drawString("8",yax+(int)Math.round(8*xstep)-2,xax+12);
                g.drawString("10",yax+(int)Math.round(10*xstep)-4,xax+12);
                g.drawString("-10",yax+(int)Math.round(-10*xstep)-9,xax+12);
                g.drawString("-20",yax+(int)Math.round(-20*xstep)-9,xax+12);
                for(i=50;i>(-NEGY);i-=20){
                        g.drawString(" "+i,yax-22,(int)Math.round((POSY-i)*ystep)+5);
                }
                if(app1.PLOT_AV == 1){                
                        a=10-app1.Particles[app1.Num_Particles.getSelectedIndex()];
                        b=(int)Math.round(app1.CDiff.total_sum/app1.CDiff.n_runs);
                        app1.xs[app1.is]=a;
                        app1.ys[app1.is]=b;
                        app1.zs[app1.is]=1;
                        app1.is++;
                        app1.PLOT_AV=0;
                }
                if(app1.PLOT_REAL == 1){
                        a=10-app1.Particles[app1.Num_Particles.getSelectedIndex()];
                        b=(int)Math.round(app1.CDiff.Rin-app1.CDiff.Rout);
                        app1.xs[app1.is]=a;
                        app1.ys[app1.is]=b;
                        app1.zs[app1.is]=2;
                        app1.is++;
                        app1.PLOT_REAL=0;
                }
                for(i=0;i<(app1.is);i++){
                        a=app1.xs[i];
                        b=app1.ys[i];
                        if(app1.zs[i] == 1){
                                g.setColor(Color.red);
                        }
                        if(app1.zs[i] == 2){ 
                                g.setColor(Color.green);
                        }
                        g.fillOval((int)Math.round((NEGX+a)*xstep)-2,(int)Math.round((POSY-b)*ystep)-1,4,4);
                }
         }

}




        
