import java.awt.*;
import java.util.*;
import javax.swing.*;

public class MiniDrawModel extends JComponent  {
  private Vector<ModelListener> listenerList;
  private ModelListenerIterator listenerListIterator;
  
  // Define Model state variables here (private)
  
  protected boolean clearCanvas = false;
  protected Color penColor = Color.black;
  protected Image imageBuffer;
  protected Graphics imageBufferGraphics;
  protected int canvasWidth;
  protected int canvasHeight;
  
  //end of Model state variables
  
  public MiniDrawModel() {
    listenerList = new Vector<ModelListener>(5,1);
  }
  
  public void addModelListener (ModelListener listener) {
    listenerList.add(listener);
  }
  
  // public get, set, signal methods for Model State Variables go here
  //set methods must call notifyListeners();
  
  
  public void resizeCanvas(Image newimageBuffer, int width, int height) {
    
    imageBufferGraphics = newimageBuffer.getGraphics();
    if (imageBuffer != null) {
      imageBufferGraphics.drawImage(imageBuffer, 0, 0 ,this);
    }
    imageBuffer = newimageBuffer;
    imageBufferGraphics.setColor(penColor);
    canvasWidth = width;
    canvasHeight = height;
    notifyListeners();
  }
  
  public Image getimageBuffer() {
    return imageBuffer;
  }
  
  public void drawLineSegment(Point p1, Point p2) {
     imageBufferGraphics.drawLine(p1.x,p1.y,
                  	       p2.x, p2.y);
     notifyListeners();
  }
    
  public void setpenColor(Color c) {
    penColor = c;
    imageBufferGraphics.setColor(c);
    notifyListeners();
  }
  
  public Color getpenColor() {
      return penColor;
  }
  
  public void clearCanvas() {
    imageBufferGraphics.setColor(Color.white);
    imageBufferGraphics.fillRect(0, 0, canvasWidth, canvasHeight);
    imageBufferGraphics.setColor(penColor);
    notifyListeners();
  }
  
  // end of public get and set methods
  
  private void notifyListeners() {
    listenerListIterator=new ModelListenerIterator(listenerList);
    while(listenerListIterator.hasNext()) 
      listenerListIterator.next().ModelUpdated();
  }
  
}
    
  