package howto;

import java.awt.*;

public class FigRect extends java.applet.Applet implements Figure
{
   private TextField tfx, tfy, tfw, tfh, tfaw, tfah;

   private TextField tfdrx, tfdry, tfdrw, tfdrh;
   private TextField tffrx, tffry, tffrw, tffrh;
   private TextField tfrrx, tfrry, tfrrw, tfrrh, tfrraw, tfrrah;
   private TextField tffrrx, tffrry, tffrrw, tffrrh, tffrraw, tffrrah;
   private TextField tf3rx, tf3ry, tf3rw, tf3rh;
   private TextField tff3rx, tff3ry, tff3rw, tff3rh;

   private Choice ch3r, chf3r, ch3;

   private Panel p;

   private CardLayout cl;

   private NewCanvas nc;

   private Choice ch;

   public void init()
   {
      setBackground(Color.white);

      setLayout(new BorderLayout());

      Panel p1;

      p = new Panel();

      p.setLayout(cl = new CardLayout());

      p.add("Rectangle", p1 = new Panel());

      p1.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));

      p1.add(new Label("drawRect ("));
      p1.add(tfdrx = new TextField(2));
      p1.add(new Label(","));
      p1.add(tfdry = new TextField(2));
      p1.add(new Label(","));
      p1.add(tfdrw = new TextField(2));
      p1.add(new Label(","));
      p1.add(tfdrh = new TextField(2));
      p1.add(new Label(")"));

      p.add("Filled Rectangle", p1 = new Panel());

      p1.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));

      p1.add(new Label("fillRect ("));
      p1.add(tffrx = new TextField(2));
      p1.add(new Label(","));
      p1.add(tffry = new TextField(2));
      p1.add(new Label(","));
      p1.add(tffrw = new TextField(2));
      p1.add(new Label(","));
      p1.add(tffrh = new TextField(2));
      p1.add(new Label(")"));

      p.add("Round Rectangle", p1 = new Panel());

      p1.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));

      p1.add(new Label("drawRoundRect ("));
      p1.add(tfrrx = new TextField(2));
      p1.add(new Label(","));
      p1.add(tfrry = new TextField(2));
      p1.add(new Label(","));
      p1.add(tfrrw = new TextField(2));
      p1.add(new Label(","));
      p1.add(tfrrh = new TextField(2));
      p1.add(new Label(","));
      p1.add(tfrraw = new TextField(2));
      p1.add(new Label(","));
      p1.add(tfrrah = new TextField(2));
      p1.add(new Label(")"));

      p.add("Filled Round Rectangle", p1 = new Panel());

      p1.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));

      p1.add(new Label("fillRoundRect ("));
      p1.add(tffrrx = new TextField(2));
      p1.add(new Label(","));
      p1.add(tffrry = new TextField(2));
      p1.add(new Label(","));
      p1.add(tffrrw = new TextField(2));
      p1.add(new Label(","));
      p1.add(tffrrh = new TextField(2));
      p1.add(new Label(","));
      p1.add(tffrraw = new TextField(2));
      p1.add(new Label(","));
      p1.add(tffrrah = new TextField(2));
      p1.add(new Label(")"));

      p.add("3D Rectangle", p1 = new Panel());

      p1.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));

      p1.add(new Label("draw3DRect ("));
      p1.add(tf3rx = new TextField(2));
      p1.add(new Label(","));
      p1.add(tf3ry = new TextField(2));
      p1.add(new Label(","));
      p1.add(tf3rw = new TextField(2));
      p1.add(new Label(","));
      p1.add(tf3rh = new TextField(2));
      p1.add(new Label(","));
      p1.add(ch3r = new Choice());
      ch3r.addItem("true");
      ch3r.addItem("false");
      p1.add(new Label(")"));

      p.add("Filled 3D Rectangle", p1 = new Panel());

      p1.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));

      p1.add(new Label("fill3DRect ("));
      p1.add(tff3rx = new TextField(2));
      p1.add(new Label(","));
      p1.add(tff3ry = new TextField(2));
      p1.add(new Label(","));
      p1.add(tff3rw = new TextField(2));
      p1.add(new Label(","));
      p1.add(tff3rh = new TextField(2));
      p1.add(new Label(","));
      p1.add(chf3r = new Choice());
      chf3r.addItem("true");
      chf3r.addItem("false");
      p1.add(new Label(")"));

      add("North", p);

      nc = new NewCanvas(this);

      add("Center", nc);

      p1 = new Panel();

      p1.add(new Button("Draw"));

      ch = new Choice();

      ch.addItem("Rectangle");
      ch.addItem("Filled Rectangle");
      ch.addItem("Round Rectangle");
      ch.addItem("Filled Round Rectangle");
      ch.addItem("3D Rectangle");
      ch.addItem("Filled 3D Rectangle");

      p1.add(ch);

      add("South", p1);

      tfx = tfdrx;
      tfy = tfdry;
      tfw = tfdrw;
      tfh = tfdrh;
      tfaw = tfrraw;
      tfah = tfrrah;

      ch3 = ch3r;

      tfx.setText("10");
      tfy.setText("10");
      tfw.setText("100");
      tfh.setText("100");
      tfaw.setText("10");
      tfah.setText("10");

      ch3.select("true");
   }

   private int parseTextField(TextField tf)
   {
      int n;

      try
      {
         n = Integer.parseInt(tf.getText());
      }
      catch (NumberFormatException nfe)
      {
         tf.setText("0");
         n = 0;
      }

      return n;
   }

   public void paintCallback(Graphics g)
   {
      int x = parseTextField(tfx);
      int y = parseTextField(tfy);
      int w = parseTextField(tfw);
      int h = parseTextField(tfh);
      int aw = parseTextField(tfaw);
      int ah = parseTextField(tfah);

      boolean b = ch3.getSelectedItem().equals("true");

      if (ch.getSelectedItem().equals("Rectangle"))
         g.drawRect(x, y, w, h);
      else if (ch.getSelectedItem().equals("Filled Rectangle"))
         g.fillRect(x, y, w, h);
      else if (ch.getSelectedItem().equals("Round Rectangle"))
         g.drawRoundRect(x, y, w, h, aw, ah);
      else if (ch.getSelectedItem().equals("Filled Round Rectangle"))
         g.fillRoundRect(x, y, w, h, aw, ah);
      else if (ch.getSelectedItem().equals("3D Rectangle"))
         g.draw3DRect(x, y, w, h, b);
      else if (ch.getSelectedItem().equals("Filled 3D Rectangle"))
         g.fill3DRect(x, y, w, h, b);
   }

   public boolean action(Event e, Object o)
   {
      if (o.equals("Draw"))
      {
         nc.repaint();

         return true;
      }
      else if (o.equals("Rectangle"))
      {
         tfdrx.setText(tfx.getText());
         tfdry.setText(tfy.getText());
         tfdrw.setText(tfw.getText());
         tfdrh.setText(tfh.getText());

         tfx = tfdrx;
         tfy = tfdry;
         tfw = tfdrw;
         tfh = tfdrh;

         cl.show(p, (String)o);

         nc.repaint();

         return true;
      }
      else if (o.equals("Filled Rectangle"))
      {
         tffrx.setText(tfx.getText());
         tffry.setText(tfy.getText());
         tffrw.setText(tfw.getText());
         tffrh.setText(tfh.getText());

         tfx = tffrx;
         tfy = tffry;
         tfw = tffrw;
         tfh = tffrh;

         cl.show(p, (String)o);

         nc.repaint();

         return true;
      }
      else if (o.equals("Round Rectangle"))
      {
         tfrrx.setText(tfx.getText());
         tfrry.setText(tfy.getText());
         tfrrw.setText(tfw.getText());
         tfrrh.setText(tfh.getText());
         tfrraw.setText(tfaw.getText());
         tfrrah.setText(tfah.getText());

         tfx = tfrrx;
         tfy = tfrry;
         tfw = tfrrw;
         tfh = tfrrh;
         tfaw = tfrraw;
         tfah = tfrrah;

         cl.show(p, (String)o);

         nc.repaint();

         return true;
      }
      else if (o.equals("Filled Round Rectangle"))
      {
         tffrrx.setText(tfx.getText());
         tffrry.setText(tfy.getText());
         tffrrw.setText(tfw.getText());
         tffrrh.setText(tfh.getText());
         tffrraw.setText(tfaw.getText());
         tffrrah.setText(tfah.getText());

         tfx = tffrrx;
         tfy = tffrry;
         tfw = tffrrw;
         tfh = tffrrh;
         tfaw = tffrraw;
         tfah = tffrrah;

         cl.show(p, (String)o);

         nc.repaint();

         return true;
      }
      else if (o.equals("3D Rectangle"))
      {
         tf3rx.setText(tfx.getText());
         tf3ry.setText(tfy.getText());
         tf3rw.setText(tfw.getText());
         tf3rh.setText(tfh.getText());

         ch3r.select(ch3.getSelectedItem());

         tfx = tf3rx;
         tfy = tf3ry;
         tfw = tf3rw;
         tfh = tf3rh;

         ch3 = ch3r;

         cl.show(p, (String)o);

         nc.repaint();

         return true;
      }
      else if (o.equals("Filled 3D Rectangle"))
      {
         tff3rx.setText(tfx.getText());
         tff3ry.setText(tfy.getText());
         tff3rw.setText(tfw.getText());
         tff3rh.setText(tfh.getText());

         chf3r.select(ch3.getSelectedItem());

         tfx = tff3rx;
         tfy = tff3ry;
         tfw = tff3rw;
         tfh = tff3rh;

         ch3 = chf3r;

         cl.show(p, (String)o);

         nc.repaint();

         return true;
      }

      return false;
   }

   public Dimension preferredSize()
   {
      return new Dimension(500, 200);
   }

   public static void main(String [] args)
   {
      Frame f = new Frame("Rectangle");

      FigRect fr = new FigRect();

      fr.init();

      f.add("Center", fr);

      f.pack();
      f.show();
   }
}
