/*
 * @(#)DrawTest.java 1.6 98/07/07
 
 * modified to be WhiteBoard.java by J.A.W., 15 August 2001
 *
 * Copyright (c) 1997, 1998 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
 * modify and redistribute this software in source and binary code form,
 * provided that i) this copyright notice and license appear on all copies of
 * the software; and ii) Licensee does not utilize the software in a manner
 * which is disparaging to Sun.
 *
 * This software is provided "AS IS," without a warranty of any kind. ALL
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
 * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
 * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
 * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
 * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
 * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
 * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
 * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
 * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGES.
 *
 * This software is not designed or intended for use in on-line control of
 * aircraft, air traffic, aircraft navigation or aircraft communications; or in
 * the design, construction, operation or maintenance of any nuclear
 * facility. Licensee represents and warrants that it will not use or
 * redistribute the Software for such purposes.
 */

import java.awt.event.*;
import java.awt.*;
import java.applet.*;

import java.util.Vector;

public class WhiteBoard extends Applet{
    DrawPanel panel;
    DrawControls controls;

    public void init() {
   setLayout(new BorderLayout());
   panel = new DrawPanel();
        controls = new DrawControls(panel);
   add("Center", panel);
   add("South",controls);
    }

    public void destroy() {
        remove(panel);
        remove(controls);
    }

    public static void main(String args[]) {
   Frame f = new Frame("WhiteBoard");
   WhiteBoard whiteBoard = new WhiteBoard();
   whiteBoard.init();
   whiteBoard.start();

   f.add("Center", whiteBoard);
   f.setSize(500, 300);
   f.show();
    }
    public String getAppletInfo() {
        return "A simple white board simulation program.";
    }
}

class DrawPanel extends Panel implements MouseListener, MouseMotionListener {
    public static final int LINES = 0;
    public static final int POINTS = 1;
    int     mode = LINES;
    Vector lines = new Vector();
    Vector colors = new Vector();
    int x1,y1;
    int x2,y2;
    int xl, yl;

    public DrawPanel() {
   setBackground(Color.white);
   addMouseMotionListener(this);
   addMouseListener(this);
    }

    public void setDrawMode(int mode) {
   switch (mode) {
     case LINES:
     case POINTS:
       this.mode = mode;
       break;
     default:
       throw new IllegalArgumentException();
   }
    }


    public void mouseDragged(MouseEvent e) {
        e.consume();
        switch (mode) {
            case LINES:
                xl = x2;
                yl = y2;
                x2 = e.getX();
                y2 = e.getY();
                break;
            case POINTS:
            default:
                colors.addElement(getForeground());
                lines.addElement(new Rectangle(x1, y1, e.getX(), e.getY()));
                x1 = e.getX();
                y1 = e.getY();
                break;
        }
        repaint();
    }

    public void mouseMoved(MouseEvent e) {
    }

    public void mousePressed(MouseEvent e) {
        e.consume();
        switch (mode) {
            case LINES:
                x1 = e.getX();
                y1 = e.getY();
                x2 = -1;
                break;
            case POINTS:
            default:
                colors.addElement(getForeground());
                lines.addElement(new Rectangle(e.getX(), e.getY(), -1, -1));
                x1 = e.getX();
                y1 = e.getY();
                repaint();
                break;
        }
    }

    public void mouseReleased(MouseEvent e) {
        e.consume();
        switch (mode) {
            case LINES:
                colors.addElement(getForeground());
                lines.addElement(new Rectangle(x1, y1, e.getX(), e.getY()));
                x2 = xl = -1;
                break;
            case POINTS:
            default:
                break;
        }
        repaint();
    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }

    public void mouseClicked(MouseEvent e) {
    }

    public void paint(Graphics g) {
   int np = lines.size();

   /* draw the current lines */
   g.setColor(getForeground());
   g.setPaintMode();
   for (int i=0; i < np; i++) {
       Rectangle p = (Rectangle)lines.elementAt(i);
       g.setColor((Color)colors.elementAt(i));
       if (p.width != -1) {
      g.drawLine(p.x, p.y, p.width, p.height);
       } else {
      g.drawLine(p.x, p.y, p.x, p.y);
       }
   }
   if (mode == LINES) {
       g.setXORMode(getBackground());
       if (xl != -1) {
      /* erase the last line. */
      g.drawLine(x1, y1, xl, yl);
       }
       g.setColor(getForeground());
       g.setPaintMode();
       if (x2 != -1) {
      g.drawLine(x1, y1, x2, y2);
       }
   }
   }
}


class DrawControls extends Panel implements ItemListener {
    DrawPanel target;

   public DrawControls(DrawPanel target) {
   this.target = target;
   setLayout(new FlowLayout());
   setBackground(Color.lightGray);
   target.setForeground(Color.red);
   CheckboxGroup group = new CheckboxGroup();
   Checkbox b;
   add(b = new Checkbox(null, group, false));
   b.addItemListener(this);
   b.setForeground(Color.red);
   add(b = new Checkbox(null, group, false));
   b.addItemListener(this);
   b.setForeground(Color.green);
   add(b = new Checkbox(null, group, false));
   b.addItemListener(this);
   b.setForeground(Color.blue);
   add(b = new Checkbox(null, group, false));
   b.addItemListener(this);
   b.setForeground(Color.black);
   add(b = new Checkbox(null, group, false));
   b.addItemListener(this);
   b.setForeground(Color.white);
   target.setForeground(b.getForeground());
   Choice shapes = new Choice();
   shapes.addItemListener(this);
   shapes.addItem("Lines");
   shapes.addItem("Points");
   shapes.setBackground(Color.lightGray);
   add(shapes);
    }

    public void paint(Graphics g) {
   Rectangle r = getBounds();
   g.setColor(Color.lightGray);
   g.draw3DRect(0, 0, r.width, r.height, false);

        int n = getComponentCount();
        for(int i=0; i<n; i++) {
            Component comp = getComponent(i);
            if (comp instanceof Checkbox) {
                Point loc = comp.getLocation();
                Dimension d = comp.getSize();
                g.setColor(comp.getForeground());
                g.drawRect(loc.x-1, loc.y-1, d.width+1, d.height+1);
            }
        }
    }

  public void itemStateChanged(ItemEvent e) {
    if (e.getSource() instanceof Checkbox) {
      target.setForeground(((Component)e.getSource()).getForeground());
    } else if (e.getSource() instanceof Choice) {
      String choice = (String) e.getItem();
      if (choice.equals("Lines")) {
   target.setDrawMode(DrawPanel.LINES);
      } else if (choice.equals("Points")) {
   target.setDrawMode(DrawPanel.POINTS);
      }
    }
  }
}




