ColorBook

/*
   AUTHOR: JoAnn Render
   PROJECT: ColorBook
   FILE: ColorBook.java

   SUMMARY
      This is a coloring/drawing program for kids and adults. Different
      images (outline or normal) can be loaded and lines of varying color
      and thickness can be drawn on top. Another option is to choose a
      blank canvas for drawing. Text (the artist's name) can be added.

   INPUT
      The user selects a button for type of underlay, line color and line
      thickness. A name can be entered in a text box.

   OUTPUT
      The user draws to create a whole picture or colored areas on top of
      an underlay image. A name also can be added.

   CLASS HIERARCHY
      java.lang.Object
         java.awt.Component
            java.awt.Container
               java.awt.Panel
                  java.applet.Applet
                     ColorBook

   ASSUMPTIONS
      The user loads the applet into Netscape and chooses one type of
      underlay, one color and one line thickness for drawing.

*/



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


class NewCanvas extends Canvas
{
   public NewCanvas(int width, int height)
   {
      setSize(width, height);
   } // constructor
} // NewCanvas

public class ColorBook extends Applet implements ItemListener
{
   private NewCanvas colorCanvas;
   Color lcolor;
   Image scratchPad;
   int lwidth1 = 0;
   int lwidth2 = 0;
   int old_x, old_y, x, y;
   int i;
   Dimension spDimension;
   Graphics spGraphics;
   String signature;
   int numberOfImages = 3;
   Image[] myimg = new Image[3];



   public void init() 
   {
   
      CheckboxGroup myCheckboxGroup = new CheckboxGroup();
      Checkbox red = new Checkbox("Red", myCheckboxGroup, false);
      Checkbox green = new Checkbox("Green", myCheckboxGroup, false);
      Checkbox blue = new Checkbox("Blue", myCheckboxGroup, false);
      Checkbox orange = new Checkbox("Orange", myCheckboxGroup, false);
      Checkbox black = new Checkbox("Black", myCheckboxGroup, true);
      Button clearButton = new Button("Clear Lines");
      Button blankButton = new Button("Blank Page");
      Button thinButton = new Button("Thin Line");
      Choice newChoice = new Choice(); 
      Button mediumButton = new Button("Medium Line");
      Button thickButton = new Button("Thick Line");
      TextField myTextField = new TextField("Name");
      MediaTracker tracker;


      tracker = new MediaTracker(this);
      myimg[0] = getImage(getDocumentBase(), "sun.gif");
      tracker.addImage(myimg[0], 0);
      myimg[1] = getImage(getDocumentBase(), "wood2.jpg");
      tracker.addImage(myimg[1], 0);      
      myimg[2] = getImage(getDocumentBase(), "worm.gif");
      tracker.addImage(myimg[2], 0); // load images

      setLayout(new BorderLayout());
      TopPanel np = new TopPanel();
      add("North", np);
      MyPanel sp = new MyPanel();
      add("South", sp);
      EastPanel ep = new EastPanel();
      add("East", ep);
      WestPanel wp = new WestPanel();
      add("West", wp);
      ep.setLayout(new GridLayout(1,1));
      wp.setLayout(new GridLayout(1,1));
      sp.setLayout(new GridLayout(3,1));
      np.setLayout(new GridLayout(1,1)); // set up layout

      Dimension d = getSize();
      scratchPad = createImage(d.width, d.height);
      spGraphics = scratchPad.getGraphics(); // set up double buffer

      colorCanvas = new NewCanvas(5,10); 
      np.add(colorCanvas);
      colorCanvas.setBackground(Color.red);
      np.add(red);      
      colorCanvas = new NewCanvas(5,10);
      np.add(colorCanvas);
      colorCanvas.setBackground(Color.green);
      np.add(green);      
      colorCanvas = new NewCanvas(5,10);
      np.add(colorCanvas); 
      colorCanvas.setBackground(Color.blue);   
      np.add(blue);             
      colorCanvas = new NewCanvas(5,10);
      np.add(colorCanvas);
      colorCanvas.setBackground(Color.orange);
      np.add(orange);         
      colorCanvas = new NewCanvas(5,10);
      np.add(colorCanvas);
      colorCanvas.setBackground(Color.black);
      np.add(black); // radio buttons to control line color

      red.addItemListener(this);
      green.addItemListener(this);
      blue.addItemListener(this);
      orange.addItemListener(this);
      black.addItemListener(this); // listeners for color buttons


      sp.add(clearButton);   
      sp.add(newChoice);
      newChoice.addItem("sun");
      newChoice.addItem("wood");
      newChoice.addItem("worm");
      sp.add(blankButton); // buttons to control canvas/image
      
   
      clearButton.addActionListener(new ActionListener()
      {
         public void actionPerformed(ActionEvent e)
         {
            if(i < numberOfImages && i >= 0)
            { 
               spGraphics.drawImage(myimg[i], 100, 27, 550, 370, null);
            }           
            else
            {
               spGraphics.setColor(getBackground()); 
               spGraphics.fillRect(0, 0, getSize().width, getSize().height);
               spGraphics.setColor(Color.black);
               spGraphics.drawRect(100, 27, 549, 306);
               spGraphics.setColor(lcolor);
            }
            repaint();
   
               
         }
      }); // clearButton Listener 

  
      newChoice.addItemListener(new ItemListener()
      {
         public void itemStateChanged(ItemEvent e)
         { 
            Object whichstring = e.getItem();

            if (whichstring.equals("sun"))
            { 
               i = 0;
               spGraphics.drawImage(myimg[i], 100, 27, 550, 370, null); 
            }
            else if (whichstring.equals("wood"))
            { 
               i = 1;
               spGraphics.drawImage(myimg[i], 100, 27, 550, 370, null); 
            }
            else if (whichstring.equals("worm"))
            { 
               i = 2;
               spGraphics.drawImage(myimg[i], 100, 27, 550, 370, null);
            }
            repaint();
         }
      }); // newChoice Listener

  
      blankButton.addActionListener(new ActionListener()
      {
         public void actionPerformed(ActionEvent e)
         {
            if (i < numberOfImages && i >= 0 )
            {
               i = -1;
            }
            spGraphics.setColor(getBackground()); 
            spGraphics.fillRect(0, 0, getSize().width, getSize().height);
            spGraphics.setColor(Color.black);
            spGraphics.drawRect(100, 27, 549, 306);
            spGraphics.setColor(lcolor);           
            repaint();           
         }
      }); // blankButton Listener 


      sp.add(thinButton);
      sp.add(mediumButton);
      sp.add(thickButton); // buttons to control line thickness

      thinButton.addActionListener(new ActionListener ()
      {
         public void actionPerformed(ActionEvent e)
         {
            lwidth1 = 0;
            lwidth2 = 0;               
         }
      }); // thinButton Listener

      mediumButton.addActionListener(new ActionListener ()
      {
         public void actionPerformed(ActionEvent e)
         {
            lwidth1 = 1;
            lwidth2 = 0;               
        }
      }); // mediumButton Listener

      thickButton.addActionListener(new ActionListener ()
      {
         public void actionPerformed(ActionEvent e)
         {
            lwidth1 = 1;
            lwidth2 = 2;               
         }
      }); // thickButton Listener


      sp.add(myTextField); // add text field for name

      myTextField.addActionListener(new ActionListener()
      {
         public void actionPerformed(ActionEvent e)
         {
        signature = e.getActionCommand();
         spGraphics.setColor(lcolor);
         spGraphics.setFont(new Font("Serif", Font.ITALIC, 18));
         spGraphics.drawString(signature, 525, 320);
         repaint();
         }        
      }); // myTextField Listener 


      this.addMouseListener(new MouseAdapter()
      {
         public void mousePressed(MouseEvent e)
         {
            old_x = e.getX();
            old_y = e.getY();
         }
      }); // MouseListener

      
      this.addMouseMotionListener(new MouseMotionAdapter()
      {
         public void mouseDragged(MouseEvent e)
         {
            int x = e.getX(), y = e.getY();
            spGraphics.setColor(lcolor);
            spGraphics.drawLine(old_x, old_y + lwidth2, x, y + lwidth2);
            spGraphics.drawLine(old_x, old_y + lwidth1, x , y + lwidth1);
            spGraphics.drawLine(old_x, old_y, x, y);
            spGraphics.drawLine(old_x, old_y - lwidth1, x, y - lwidth1);
            spGraphics.drawLine(old_x, old_y - lwidth2, x, y - lwidth2);
            old_x = x;
            old_y = y;
            repaint();
         }
      }); // MouseMotionListener
  
   } // init

   

   
      
   public void paint(Graphics g)
   {  
      update(g);        
   } // paint


   public final void update (Graphics g)
   {
      g.drawImage(scratchPad, 0, 0, this);
   // g.drawRect(getLocation().x, getLocation().y, getSize().width, getSize().height);
   } // update


   public void itemStateChanged(ItemEvent e)
   {              
      String command = (String) e.getItem();
      if (command.equals("Red"))   
      {
         lcolor = Color.red;
         spGraphics.setColor(lcolor);
      }
      else if (command.equals("Green"))  
      {
         lcolor = Color.green;
         spGraphics.setColor(lcolor);
      }
      else if (command.equals("Blue"))   
      {
         lcolor = Color.blue;
         spGraphics.setColor(lcolor);
      }
      else if (command.equals("Orange")) 
      {
         lcolor = Color.orange;
         spGraphics.setColor(lcolor);
      }
      else if (command.equals("Black"))  
      {
         lcolor = Color.black;
         spGraphics.setColor(lcolor);
      }
      repaint();
   } // itemStateChanged


} // ColorBook


class MyPanel extends Panel {
   public Insets getInsets()
   {
      return new Insets(2, 150, 400, 150);
   }
} // MyPanel Insets

class TopPanel extends Panel {
   public Insets getInsets()
   {
      return new Insets(2, 65, 2, 65);
   }
} // TopPanel Insets

class EastPanel extends Panel {
   public Insets getInsets()
   {
      return new Insets(2, 50, 2, 50);
   }
} // EastPanel Insets

class WestPanel extends Panel {
   public Insets getInsets()
   {
      return new Insets(2, 50, 2, 50);
   }
} // WestPanel Insets