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


public class GraphCanvas extends ScaleCanvas implements MouseListener, MouseMotionListener {
    Manager M; 
    Path2D.Double[] TILE=new Path2D.Double[100];
    Color[] COLOR=new Color[100];
    int COUNT=0;
    ControlPanel FIT; 
    ListenSquare CONTROL;

     public GraphCanvas() {
	 addMouseListener(this);
	 addMouseMotionListener(this);
	 setScales(200,200,20);	
         CONTROL=new ListenSquare(0,0,50,60,null); CONTROL.on=1;
     }

   public void paint(Graphics g2) {
      Graphics2D g=(Graphics2D) g2;
      g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
      drawBG(g);
      drawGraphs(g);  
      displaySource(g);
      if(M.C.COLOR2.L[2].on==1) drawCursor(g);

   }

    public void drawCursor(Graphics2D g) {
	Path2D.Double gp=new Path2D.Double();
	float a=(float)(-.5);
	float b=(float)(.5);
	gp.moveTo(a,a);
	gp.lineTo(a,b);
	gp.lineTo(b,b);
	gp.lineTo(b,a);
	gp.closePath();
	  AffineTransform A=AffineTransform.getTranslateInstance(SOURCE.x,SOURCE.y);
	  gp.transform(A);
	  gp=transform(gp);
          g.setColor(M.C.COLOR2.M[2].C);
	  g.draw(gp);
    }

    public void displaySource(Graphics2D g) {
	drawSource(g);
	GraphicsHelper.cleanDouble(g,SOURCE.x,210,13);
	GraphicsHelper.cleanDouble(g,SOURCE.y,210,26);
    }

    public void drawBG(Graphics2D g) {
	g.setColor(M.C.COLOR2.M[0].C);
	g.fillRect(0,0,getWidth(),getHeight());
	g.setColor(Color.white);
	g.drawRect(0,0,getWidth()-1,getHeight()-5);
	Path2D.Double gp=new Path2D.Double();
	for(int j=-100;j<101;++j) {
	  gp.moveTo(-100,j);
	  gp.lineTo(100,j);
	  gp.moveTo(j,-100);
	  gp.lineTo(j,100);
	}
	gp=transform(gp);
	g.setColor(M.C.COLOR2.M[1].C);
	g.draw(gp);
    }

    public void drawGraphs(Graphics2D g) {
	Path2D.Double gp=new Path2D.Double();
	g.setStroke(new BasicStroke(2));
	for(int i=0;i<COUNT;++i) {
	    gp=new Path2D.Double(TILE[i]);
	    gp=transform(gp);
	    g.setColor(COLOR[i]);
	    g.draw(gp);
	}
 	g.setStroke(new BasicStroke(1));
    }

    public void setColor(Point X) {
    }

    public void mousePressed(MouseEvent e) { }
    public void mouseClicked(MouseEvent e) { 
	MouseData J=MouseData.process(e);
	    if(CONTROL.inside(J.X)==0) {
            if(J.mode==1)  scaleUp(J.X,0);
            if(J.mode==3)  scaleUp(J.X,1);
	    if(J.mode==2)  {
               SOURCE=unTransform(J.X);
	       SOURCE.x=Math.floor(SOURCE.x+.5);
	       SOURCE.y=Math.floor(SOURCE.y+.5);
	    }

	}
	if(CONTROL.inside(J.X)==1) {
	    FIT.switchMode(J.X);
	    setColor(J.X);
	}

	repaint();
    }
     public void mouseReleased(MouseEvent e) {	 
     }

     public void mouseEntered(MouseEvent e) {}
     public void mouseExited(MouseEvent e) {}   

     public void mouseMoved(MouseEvent e) {}   
     public void mouseDragged(MouseEvent e) {
     }

}

