package scribble3; 

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.util.*;
import java.io.*;
import java.awt.event.*;
import java.util.EventListener;
import javax.swing.*; 

public class ScribbleCanvas extends JPanel { 

  public ScribbleCanvas() { 
    // calling factory method 
    listener = makeCanvasListener(); 
    addMouseListener((MouseListener) listener); 
    addMouseMotionListener((MouseMotionListener) listener); 
  }

  public void setCurColor(Color curColor) { 
    this.curColor = curColor; 
  }

  public Color getCurColor() { 
    return curColor; 
  }

  public void addShape(Shape shape) {
    if (shape != null) { 
      shapes.add(shape); 
    }
  }

  public void paint(Graphics g) {
    Dimension dim = getSize(); 
    g.setColor(Color.white);
    g.fillRect(0, 0, dim.width, dim.height);    
    g.setColor(Color.black);
    if (shapes != null) { 
      Iterator iter = shapes.iterator(); 
      while (iter.hasNext()) { 
	Shape shape = (Shape) iter.next(); 
	if (shape != null) { 
	  shape.draw(g); 
	}
      }
    }
  }

  public void newFile() { 
    shapes.clear();
    repaint();
  }

  public void openFile(String filename) {
    try {
      ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename)); 
      shapes = (List) in.readObject(); 
      in.close(); 
      repaint();
    } catch (IOException e1) {
      System.out.println("Unable to open file: " + filename); 
    } catch (ClassNotFoundException e2) {
      System.out.println(e2); 
    }
  }

  public void saveFile(String filename) { 
    try {
      ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename)); 
      out.writeObject(shapes); 
      out.close(); 
      System.out.println("Save drawing to " + filename);
    } catch (IOException e) {
      System.out.println("Unable to write file: " + filename); 
    }  
  }

  // factory method 
  protected EventListener makeCanvasListener() {
    return new ScribbleCanvasListener(this); 
  }

  // The list of shapes of the drawing 
  // The elements are instances of Stroke
  protected List shapes = new ArrayList(); 

  protected Color curColor = Color.black; 

  protected EventListener listener;

  public boolean mouseButtonDown = false; 
  public int x, y;

}