import java.awt.*;
import java.util.*;

public class textArea extends Canvas {
int ox = 500;
int oy = 300;
int zoom = 1;
int pos = 0;
int[]  text = new int[env.MAXX*env.MAXY*2];
Color col = Color.white;
asciiJam aj = null;
public tool[] toolList = new tool[10];
String [] charStr = null;
//ajData dat = null; 
D dat = null; 
//boolean painted = false;


        public  textArea(asciiJam aj){
		    charStr = new String[255];
		    for(int i =0;i<charStr.length;i++){
                   charStr[i] = (new Character((char)i)).toString();
		    }
	        toolList[env.RECT_TOOL]    = (tool)aj.rect;
	        toolList[env.OVAL_TOOL]    = (tool)aj.oval;
			toolList[env.LINE_TOOL]    = (tool)aj.line;
			toolList[env.FILL_TOOL]    = (tool)aj.ff;
			toolList[env.PENCIL_TOOL]  = (tool)new thinLine(); 
			toolList[env.DROPPER_TOOL] = (tool)new eyeDropper(); 
			toolList[env.TEXT_TOOL]    = (tool)aj.kbd; 
			toolList[env.MOVE_TOOL]    = (tool)new move(); 
			toolList[env.SAVE_TOOL]    = (tool)new blank(); 
			toolList[env.ERASER_TOOL]  = (tool)aj.ersr; 
			for(int i=0;i<(env.MAXX*env.MAXY);i++){
				text[i]=(char)' ';
				text[i+env.colorOffset] = 0;
			}
			this.aj = aj;
			if(aj.img!=null) drawGrid(aj.img.getGraphics());
			//byte b[] = {};
			String b = "";
            //dat =  new ajData(env.SETCHAR,aj.curColorIndex,b,0);
            dat =  new D(env.SETCHAR,aj.curColorIndex,b,0);
	    }

        public void update(Graphics g){
                paint(g);
        }
 
        public void paint(Graphics g){
			  if(aj.img!=null){
                g.drawImage(aj.img,0,0,null);
				//painted = true;
			  }
        }          

        public void setcharRemote(String s,int index,int colIdx,Color col,Graphics g)
        {
	        //painted = false;
			int z3 = zoom<<3;
			int z4 = z3<<1;
            int x = index%128;
			int y = (index-x)>>7;
            int offx = ((move)toolList[env.MOVE_TOOL]).totalOffX;
            int offy = ((move)toolList[env.MOVE_TOOL]).totalOffY;
            if((x+offx)<128) x += offx;
            else             x += (offx-128);
            if((y+offy)<64)  y += offy;
            else             y += (offy-64);
            index = (y<<7) + x;
            if(index>-1&&index<8192){
				text[index]                 = (char)s.charAt(0);
                text[index+env.colorOffset] = (char)colIdx;
            }
			x*=z3;
			y*=z4;
			x -= aj.mapF.getX();
			y -= aj.mapF.getY();
			if(g!=null){
			  g.setFont(env.font[zoom]);
              g.setColor(Color.black);
              g.fillRect(x + 1, y + 1, z3, z4 - 1);
              g.setColor(col);
              g.drawString(s, x + zoom, y + 11 * zoom);
              g.setColor(Color.darkGray);
              g.drawRect(x, y, z3, z4);
            }
			repaint(x+1, y+1, z3-1, z4-1);
        }

        public void setchar(char key,int x,int y,int colIdx,Color col,Graphics g,boolean repaint)
        {
			int z3 = zoom<<3;
			int z4 = z3<<1;
			if(g!=null){
			  g.setFont(env.font[zoom]);
              g.setColor(Color.black);
              g.fillRect(x + 1, y + 1, z3, z4 - 1);
              g.setColor(col);
              g.drawString(charStr[key], x + zoom, y + 11 * zoom);
              g.setColor(Color.darkGray);
              g.drawRect(x, y, z3, z4);
              if(repaint) repaint(x+1, y+1, z3-1, z4-1);
            }
            int i = (x+aj.mapF.getX())/z3+(((y+aj.mapF.getY())/z4)<<7);
			//if(text[i]==(char)key && text[i+env.colorOffset]==(char)colIdx) return;
            text[i] = (char)key;
            text[i+env.colorOffset] = (char)colIdx;
			if(aj.connected){
				int offx = ((move)toolList[env.MOVE_TOOL]).totalOffX%128;
				if(offx<0) offx+=128;
				int offy = ((move)toolList[env.MOVE_TOOL]).totalOffY%64;
				if(offy<0) offy+=64;
                int X = i%128;
			    int Y = (i-X)>>7;
				if(X>=offx) X-=offx;
				else X+=(128-offx);
				if(Y>=offy) Y-=offy;
				else Y+=(64-offy);
                i = (Y<<7) + X;
				//dat.index = i;
				//dat.type = env.SETCHAR;
			    //dat.a = charStr[key];
			    //dat.color = colIdx; 
			    //synchronized(aj.sendBuffer){
				   //aj.sendBuffer.addElement((Object)dat);
				//byte[] b = {(byte)' '};
				//charStr[key].getBytes(0,1,b,0);
				//b[0] = (byte)key;
				//aj.sendBuffer.addElement(new ajData(env.SETCHAR,colIdx,charStr[key],i));
				//aj.sendBuffer.addElement(new ajData(env.SETCHAR,colIdx,b,i));
				//aj.sendBuffer.addElement(new D(env.SETCHAR,colIdx,b,i));
				aj.sendBuffer.addElement(new D(env.SETCHAR,colIdx,charStr[key],i));
				//}
                //aj.send(dat);
			}
      }

      public void drawGrid(Graphics g){
		   Graphics myg = null;
           if(g==null){
	            myg = aj.img.getGraphics();
		   }else{
				myg = g;
           }
           myg.setColor(Color.black);
           //myg.fillRect(0,0,this.size().width,this.size().height);
           myg.fillRect(0,0,env.width*zoom,env.height*zoom);
           if(zoom<3){
               myg.setColor(Color.darkGray);
				myg.fillRect(env.width*zoom+1,0,env.width*3,env.height*3);
				myg.fillRect(0,env.height*zoom+1,env.width*3,env.height*3);
		   }
           myg.setColor(Color.darkGray);
           for(int j=0;j<=env.height*zoom;j+=(zoom<<4)) 
				myg.drawLine(0,j,env.width*zoom,j);
           for(int i=0;i<=env.width*zoom;i+=(zoom<<3)) 
				myg.drawLine(i,0,i,env.height*zoom);
           myg.dispose();
		   repaint();
      }

      public void fillGrid(){
	    Color c = null;
		int z3 = zoom<<3;
		int z4 = zoom<<4;
		int oldIdx = -1;
		Graphics g=aj.img.getGraphics();
		if(g!=null){
			g.setFont(env.font[zoom]);
			g.translate(-aj.mapF.getX(),-aj.mapF.getY());
			int offSetY = 11*zoom;
		    int lx = 0;
			int startx=aj.mapF.getXIdx();
			int starty=aj.mapF.getYIdx();
			for(int x = 0;x<128; x++){
				  for(int y = starty;y<64; y++){
				    int idx = x+ (y<<7);
                    int curColIdx = text[idx + env.colorOffset];
					if(oldIdx!=curColIdx){
						c = aj.pal.palette[curColIdx];
						oldIdx = curColIdx;
					}
                    g.setColor(Color.black);
					int ly = y*z4;
                    g.fillRect(lx + 1, ly + 1, z3, z4 - 1);
                    g.setColor(c);
                    g.drawString(charStr[(int)text[idx]], 
						lx + zoom, ly + offSetY);
                    g.setColor(Color.darkGray);
                    g.drawRect(lx, ly, z3, z4);
				  }
				  lx += z3;
			}
			g.dispose();
		}else System.out.println("g err");	
		repaint();
	  }

	  public void clearGrid(){
		   for(int i=0;i<(env.MAXX*env.MAXY);i++){
			   text[i]=(char)' ';
			   text[i+env.colorOffset] = 0;
		   }
		   drawGrid(aj.img.getGraphics());
	  }

      public boolean handleEvent(Event e){
         if(e.id == Event.MOUSE_ENTER){
			env.setCursor(aj.tool,aj);
			return true;
         }
         else if(e.id == Event.MOUSE_UP){
	        int x, y;
            x = aj.mapF.getX()+(e.x/(zoom<<3))*(zoom<<3);
            y = aj.mapF.getY()+(e.y/(zoom<<4))*(zoom<<4);
			toolList[aj.tool].mouseUp(x,y);
			if(aj.tpane.hot==1) aj.mapF.repaint();
			env.setCursor(aj.tool,aj);
			return true;
		 }
         else if(e.id == Event.MOUSE_DOWN){
	        int x, y;
            x = aj.mapF.getX()+(e.x/(zoom<<3))*(zoom<<3);
            y = aj.mapF.getY()+(e.y/(zoom<<4))*(zoom<<4);
			toolList[aj.tool].mouseDown(x,y,zoom,aj);
			ox = x;
			oy = y;
	   }
	   else if(e.id==Event.KEY_PRESS||e.id==403)
	   {
			//if(e.key==27) System.exit(0);
		  	//System.out.println(Event.KEY_PRESS+" key press:"+ (int)e.key);
		    toolList[aj.tool].setchar((char)e.key,pos,zoom,aj);
			return true;
	   }
	   else if(e.id == Event.MOUSE_DRAG){
			  int z3 = zoom<<3;
			  int z4 = zoom<<4;
              int x = (e.x/(z3))*(z3);
              int y = (e.y/(z4))*(z4);
		  		if(x<0){ 
					x=0;
				}else if(x+aj.mapF.getX()>=env.width*zoom){
					x=ox;
		  		}
		  		if(y<0){ 
					y=0;
				}else if(y+aj.mapF.getY()>=env.height*zoom){
					y=oy;
          		}
          		if(oy==y&&ox==x) return true;
		  		else{
					toolList[aj.tool].mouseDrag(x+aj.mapF.getX(),y+aj.mapF.getY());
				}
		       	ox = x;
               	oy = y;
           }                         
	       return false;
       }

       public void setColor(Color c){
           Graphics g = aj.img.getGraphics();
		   g.setColor(c);
		   g.dispose();
       }

       public void zoom(int n){
		   zoom = n;
		   drawGrid(aj.img.getGraphics());
		   repaint();
		   if (aj.g!=null) aj.g.setFont(env.font[n]);
       }
}
