import java.awt.*;
import java.awt.Graphics;
import java.awt.geom.GeneralPath;

import javax.swing.JComponent;

/**
 * @author Remi Forax
 *
 */
public class CoordinateView extends JComponent {

  public CoordinateView(final CoordinateModel model) {
    this.model=model;
    model.addCoordinateListener(new CoordinateListener() {
      public void pointChanged(CoordinateEvent event) {
        //paintImmediately(0,0,getWidth(),getHeight());
        
        int index=event.getIndex();
        int nextIndex=next(index,+1);
        int previousIndex=next(index,-1);
        
        Rectangle r=new Rectangle(event.getX(),event.getY());
        r.add(model.getPoint(index));
        r.add(model.getPoint(nextIndex));
        r.add(model.getPoint(previousIndex));
        
        r.width+=1;
        r.height+=1;
        paintImmediately(r);
      }
      
      private int next(int index,int increment) {
        int count=model.getPointsCount();
        index=index+increment;
        if (index<0)
          return count-1;
        else
          if (index>=count)
            return 0;
          else
            return index;
      }
      
      public void allPointsChanged(CoordinateEvent event) {
        paintImmediately(0,0,getWidth(),getHeight());
      }
    });
  }

  protected void paintComponent(Graphics graphics) {
    
    graphics.clearRect(0, 0, getWidth(), getHeight());
    
    super.paintComponent(graphics);
    
    Graphics2D g=(Graphics2D)graphics; 
    
    GeneralPath path=new GeneralPath();
    
    int count=model.getPointsCount();
    for(int i=0;i<count;i++) {
      Point point=model.getPoint(i);
      
      if (i==0)
        path.moveTo(point.x,point.y);
      else
        path.lineTo(point.x,point.y);
    }
    
    path.closePath();
    
    g.draw(path);
  }
  
  private final CoordinateModel model;
}

