import java.awt.*;

// The class which handles the basic controls
public class BaseControls extends Panel {
  // FRe fff; // Friction factor-Reynolds number graph
  PlotPanel pp; PlotSpecial ps;
  TextField mufield, rhofield, gfield, rpfield, ufield, drfield, mdfield;
  Label inplab, mulabel, rholabel, glabel, rplabel, ulabel;
  Label reslab, Relab, flab, dlab, mlab;
  Label curvlab, numlab, velab, velshow, drlab, mdlab;
  Choice liquid, curvenumber; Font bigfont;
  int currentCurve;

public BaseControls(PlotPanel fff, PlotSpecial sss) {
  pp=fff; ps=sss; currentCurve=1; setBackground(Color.lightGray);

  GridBagLayout gb = new GridBagLayout();
  setFont(new Font("Helvetica", Font.PLAIN, 12));
  bigfont=new Font("Helvetica", Font.BOLD, 14);
  setLayout(gb);

  GridBagConstraints c = new GridBagConstraints();

  inplab=new Label("Input Parameters (MKS units)", Label.CENTER);//Input params
  inplab.setFont(bigfont);
  c.gridx=0; c.gridy=0; c.gridwidth=2; c.gridheight=1;
  c.anchor=GridBagConstraints.CENTER; gb.setConstraints(inplab,c); add(inplab);
  c.anchor=GridBagConstraints.WEST; c.gridwidth=1;

  mulabel=new Label("Viscosity:", Label.LEFT);               // Viscosity input
  c.gridy++; gb.setConstraints(mulabel,c); add(mulabel);
  mufield=new TextField(Double.toString(pp.mu),7);
  c.gridx++; gb.setConstraints(mufield,c); add(mufield); c.gridx--;

  rholabel=new Label("Fluid density:", Label.LEFT);      // Fluid density input
  c.gridy++; gb.setConstraints(rholabel,c); add(rholabel);
  rhofield=new TextField(Double.toString(pp.rho),7);
  c.gridx++; gb.setConstraints(rhofield,c); add(rhofield); c.gridx--;

  glabel=new Label("Gravity acceleration:", Label.LEFT);       // Gravity input
  c.gridy++; gb.setConstraints(glabel,c); add(glabel);
  gfield=new TextField(Double.toString(pp.g),7);
  c.gridx++; gb.setConstraints(gfield,c); add(gfield); c.gridx--;

  rplabel=new Label("Particle density:", Label.LEFT); // Particle density input
  c.gridy++; gb.setConstraints(rplabel,c); add(rplabel);
  rpfield=new TextField(Double.toString(pp.rho_p),7);
  c.gridx++; gb.setConstraints(rpfield,c); add(rpfield); c.gridx--;

  ulabel=new Label("Velocity:", Label.LEFT);                  // Velocity input
  c.gridy++; gb.setConstraints(ulabel,c); add(ulabel);
  ufield=new TextField(Double.toString(pp.u),7);
  c.gridx++; gb.setConstraints(ufield,c); add(ufield); c.gridx--;

  reslab=new Label("Results at this point", Label.CENTER);      // The results!
  reslab.setFont(bigfont);
  c.gridx=2; c.gridy=0; c.anchor=GridBagConstraints.CENTER;
  c.gridwidth=2; gb.setConstraints(reslab,c); add(reslab);
  c.anchor=GridBagConstraints.WEST;

  double Re=pp.dc.rerat(pp.dc.free(pp.rho_p,pp.u));
  Relab=new Label("Reynolds number: ", Label.LEFT);
  c.gridy++; gb.setConstraints(Relab,c); add(Relab);

  flab=new Label("Friction factor: ", Label.LEFT);
  c.gridy++; gb.setConstraints(flab,c); add(flab);

  dlab=new Label("Particle diameter: ", Label.LEFT);
  c.gridy++; gb.setConstraints(dlab,c); add(dlab);

  mlab=new Label("Liquid:", Label.LEFT);
  c.gridy+=2; c.gridwidth=1; gb.setConstraints(mlab,c); add(mlab);
  liquid=new Choice(); liquid.addItem("Water"); liquid.addItem("Molten Ti");
  c.gridx++; gb.setConstraints(liquid,c); add(liquid); c.gridx--;

  curvlab=new Label("D-rho curve controls", Label.CENTER);   // Curve controls!
  curvlab.setFont(bigfont);
  c.gridx=4; c.gridy=0; c.anchor=GridBagConstraints.CENTER;
  c.gridwidth=2; gb.setConstraints(curvlab,c); add(curvlab);
  c.anchor=GridBagConstraints.WEST; c.gridwidth=1;

  numlab=new Label("Curve number:", Label.LEFT);
  c.gridy++; gb.setConstraints(numlab,c); add(numlab);
  curvenumber=new Choice(); curvenumber.addItem("1"); curvenumber.addItem("2");
  curvenumber.addItem("3"); curvenumber.addItem("4"); curvenumber.addItem("5");
  curvenumber.addItem("6"); curvenumber.addItem("7"); curvenumber.addItem("8");
  curvenumber.addItem("9");
  c.gridx++; gb.setConstraints(curvenumber,c); add(curvenumber); c.gridx--;

  velab=new Label("Velocity:", Label.LEFT);
  c.gridy++; gb.setConstraints(velab,c); add(velab);
  velshow=new Label(Double.toString(pp.u), Label.LEFT);
  c.gridx++; gb.setConstraints(velshow,c); add(velshow); c.gridx--;

  drlab=new Label("Delta rho:", Label.LEFT);
  c.gridy++; gb.setConstraints(drlab,c); add(drlab);
  drfield=new TextField(Double.toString(ps.deltarho),7);
  c.gridx++; gb.setConstraints(drfield,c); add(drfield); c.gridx--;

  mdlab=new Label("Maximum diameter:", Label.LEFT);
  c.gridy++; gb.setConstraints(mdlab,c); add(mdlab);
  mdfield=new TextField(Double.toString(ps.dmax),7);
  c.gridx++; gb.setConstraints(mdfield,c); add(mdfield); c.gridx--;

  validate(); recalc(); }

public void paint(Graphics g) {}

private void recalc() {
  double Re=pp.dc.rerat(pp.dc.free(pp.rho_p,pp.u));
  if(Re==0) throw new Error("Reynolds number > 10^5 not allowed");
  Relab.setText("Reynolds number: "+Double.toString(Re).substring(0,7));
  flab.setText("Friction factor: "+
	       Double.toString(pp.dc.f(Re)).substring(0,7));
  dlab.setText("Particle diameter: "+
	       Double.toString(Re*pp.mu/pp.rho/pp.u).substring(0,7));
  velshow.setText(Double.toString(pp.u)); }

public boolean action(Event e, Object arg) {
  if(e.target instanceof TextField) {
    Double temp; if(e.target==mufield) {
      double tMu=Double.valueOf(mufield.getText()).doubleValue();
      if(tMu<=0) {
	mufield.setText(Double.toString(pp.mu));
	throw new Error("Non-positive viscosity not allowed."); }
      pp.mu=tMu; pp.dc.newfluid(pp.mu,pp.rho,pp.g);
      recalc(); mufield.selectAll(); pp.drawLines(); ps.redoAllPlots(); }
    else if(e.target==rhofield) {
      double tRho=Double.valueOf(rhofield.getText()).doubleValue();
      if(tRho<=0) {
	rhofield.setText(Double.toString(pp.rho));
	throw new Error("Non-positive fluid density not allowed."); }
      if(tRho==pp.rho_p) {
	rhofield.setText(Double.toString(pp.rho));
	throw new Error("Don't use particle density as fluid density."); }
      pp.rho=tRho; pp.dc.newfluid(pp.mu,pp.rho,pp.g);
      recalc(); rhofield.selectAll(); pp.drawLines(); ps.redoAllPlots(); }
    else if(e.target==gfield) {
      double tg=Double.valueOf(gfield.getText()).doubleValue();
      if(tg==0) {
	gfield.setText(Double.toString(pp.g));
	throw new Error("Zero gravity is verboten."); }
      if(tg<0) gfield.setText(Double.toString(pp.g=-tg)); else pp.g=tg;
      pp.dc.newfluid(pp.mu,pp.rho,pp.g);
      recalc(); gfield.selectAll(); pp.drawLines(); ps.redoAllPlots(); }
    else if(e.target==rpfield) {
      double tRhop=Double.valueOf(rpfield.getText()).doubleValue();
      if(tRhop<=0) {
	rpfield.setText(Double.toString(pp.rho_p));
	throw new Error("Non-positive particle density not allowed."); }
      if(tRhop==pp.rho) {
	rpfield.setText(Double.toString(pp.rho_p));
	throw new Error("Don't use fluid density as particle density."); }
      pp.rho_p=tRhop; rpfield.selectAll(); recalc(); pp.drawLines(); }
    else if(e.target==ufield) {
      double tu=Double.valueOf(ufield.getText()).doubleValue();
      if(tu==0) {
	ufield.setText(Double.toString(pp.u));
	throw new Error("Zero velocity not allowed"); }
      if(tu<0) ufield.setText(Double.toString(pp.u=-tu)); else pp.u=tu;
      ufield.selectAll(); recalc();
      pp.drawLines(); ps.drawPlot(currentCurve,pp.u); }
    else if(e.target==drfield) {
      double ndRho=Double.valueOf(drfield.getText()).doubleValue();
      if(ndRho<=0) {
	drfield.setText(Double.toString(ps.deltarho));
	throw new Error("Non-positive density range not allowed."); }
      ps.changedRho(ndRho); drfield.selectAll(); }
    else if(e.target==mdfield) {
      double nDmax=Double.valueOf(mdfield.getText()).doubleValue();
      if(nDmax<=0) {
	mdfield.setText(Double.toString(ps.dmax));
	throw new Error("Non-positive diameter range not allowed."); }
      ps.changeDmax(nDmax); mdfield.selectAll(); }
    return true; }
  if(e.target instanceof Choice) {
    if(e.target==liquid) {
      int i=liquid.getSelectedIndex();
      if(i==0) { pp.mu=.001; pp.rho=1000; }
      else if(i==1) { pp.mu=.0052; pp.rho=4100; }
      mufield.setText(Double.toString(pp.mu));
      rhofield.setText(Double.toString(pp.rho));
      pp.dc.newfluid(pp.mu,pp.rho,pp.g);
      recalc(); pp.drawLines(); ps.redoAllPlots(); }
    if(e.target==curvenumber) {
      currentCurve=curvenumber.getSelectedIndex()+1;
      if(ps.curveExists[currentCurve]) {
	pp.u=ps.curvelocities[currentCurve]; recalc(); 
	ufield.setText(Double.toString(pp.u)); pp.drawLines(); }
      else {
	pp.drawLines(); ps.drawPlot(currentCurve,pp.u); }}
    return true; }
  return true; }}
