import java.awt.*;
import java.net.*;

public class oval extends Panel implements tool
{
 asciiJam aj;
 int ox;
 int oy;
 int plantx;
 int planty;
 int zoom;
 int fill = 2;
 boolean defCurs = false;
 Label lbl = null;
 charChooser chCh = null;

    public void show(){
		setFont(env.dialogFont);
		super.show();
	}
    public oval(asciiJam ajam){ 
		this.aj = ajam;
        this.resize(123,290);
        this.setLayout(null);
        this.setBackground(Color.black);
        Panel prefs = new Panel();
        prefs.setLayout(new GridLayout(5,1,0,0));
        prefs.setBackground(Color.lightGray);
        prefs.add(new Label(" Oval Prefs"));
        CheckboxGroup group1 = new CheckboxGroup();
        Checkbox tmp = null;
        prefs.add(new Checkbox("Fill",group1,false));
        prefs.add(new Checkbox("Outline",group1,false));
        prefs.add(new Checkbox("Thin Line",group1,true));
        prefs.add(lbl=new Label(" Fill letter:"));
        chCh = new charChooser(aj);
        chCh.reshape(0,0,123,170);
        Panel inner = new Panel();
        inner.resize(size().width-2,size().height-2);
        inner.move(1,1);
        inner.setLayout(new BorderLayout());
        inner.add(prefs,BorderLayout.NORTH);
        inner.add(chCh,BorderLayout.CENTER);
        add(inner);
        lbl.hide();
	}

    public boolean mouseDrag(int x, int y)
    {
		x -= aj.mapF.getX();
		y -= aj.mapF.getY();
        Graphics g = aj.ta.getGraphics();

        if(g!=null){
            g.setColor(Color.white);
            g.setXORMode(Color.black);
			if(oy!=planty||ox!=plantx){
			   int width = Math.max(ox,plantx)-Math.min(ox,plantx);
			   int height = Math.max(oy,planty)-Math.min(oy,planty);
			   int x0 = Math.min(ox,plantx);
			   int y0 = Math.min(oy,planty);
			   g.drawArc( x0,y0,width,height,0,360); 
			   g.drawRect( x0,y0,width,height); 
			}
			int width = Math.max(x,plantx)-Math.min(x,plantx);
			int height = Math.max(y,planty)-Math.min(y,planty);
			int x0 = Math.min(x,plantx);
			int y0 = Math.min(y,planty);
			g.drawRect( x0,y0,width,height); 
			g.drawArc( x0,y0,width,height,0,360); 
            g.dispose();
        }
        ox = x;
        oy = y;
        return true;
    }
    public boolean mouseDown(int x, int y, int z, asciiJam ajam){
		x -= aj.mapF.getX();
		y -= aj.mapF.getY();
        plantx = ox = x;
        planty = oy = y;
        zoom = z;
        aj = ajam;
		System.arraycopy(aj.ta.text,0,ajam.tmptxt,0,ajam.tmptxt.length);
		return true;
    }

	public boolean mouseUp(int x, int y){ 
	    x-= aj.mapF.getX();
	    y-= aj.mapF.getY();
        Graphics g = aj.ta.getGraphics();
        if(g!=null){
            int z3 = aj.ta.zoom<<3;
            int z4 = aj.ta.zoom<<4;
            g.setColor(Color.black);
            g.setXORMode(Color.white);
            int width = Math.max(ox,plantx)-Math.min(ox,plantx);
            int height = Math.max(oy,planty)-Math.min(oy,planty);
            int x0 = Math.min(ox,plantx);
            int y0 = Math.min(oy,planty);
            g.drawArc( x0,y0,width,height,0,360);
			g.dispose();
            g = aj.img.getGraphics();
			g.setFont(env.font[aj.ta.zoom]);
		  //outline fill==0
		  width = Math.max(x,plantx)-Math.min(x,plantx);
		  height = Math.max(y,planty)-Math.min(y,planty);
		  x0 = Math.min(x,plantx);
		  y0 = Math.min(y,planty);
          double ia, ib, diff;
		  if(width<100&&height<100) diff = (double)(1/(20D));
		  else if(width<200&&height<200) diff = (double)(1/(25D));
		  else if(width<300&&height<300) diff = (double)(1/(30D));
		  else if(width<400&&height<400) diff = (double)(1/(40D));
		  else if(width<500&&height<500) diff = (double)(1/(55D));
		  else diff = (double)(1/(70D));
          ia = (double)width/2D;
          ib = (double)height/2D;
		  if(fill==0){
            for(double angle=0.0;angle<Math.PI*2;angle+=diff){
                int X = (int)Math.round((width*Math.cos(angle)/2D + (double)x0 + ia));
                int Y = (int)Math.round((height*Math.sin(angle)/2D + (double)y0 + ib));
		    	aj.ta.setchar(aj.fillChar,(X/z3)*z3,(Y/z4)*z4,aj.curColorIndex,
						aj.curCol,g,false);
            }
			aj.ta.repaint();
		  }else if(fill==1){
			int X=0,Y=0;
            for(double angle=0.0;angle<Math.PI;angle+=diff){
                X = (int)Math.round((width*Math.cos(angle)/2D + (double)x0 + ia));
                Y = (int)Math.round((height*Math.sin(angle)/2D + (double)y0 + ib));
				for(int y1 = Y; y1>=y0+(y0+height-Y);y1-=z4){
		    	  aj.ta.setchar(aj.fillChar,(X/z3)*z3,(y1/z4)*z4,aj.curColorIndex,
						aj.curCol,g,false);
				}
            }
			aj.ta.repaint();
		  }else{
			System.out.println(width+" "+height);
			if(height==0){
			      for(int xoff=0;xoff<(width);xoff+=z3){
			        set('=',x0+xoff,y0,z3,z4,g);
			      }
			}else if(height==z4){
			   if(width<=z3){
			  	  set('0',x0,y0,z3,z4,g);
			   }else if(width==z3*2){
				  set('(',x0,y0,z3,z4,g);
				  set(')',x0+z3,y0,z3,z4,g);
			   }else if(width==z3*3){
				  set(',',x0,y0,z3,z4,g);
				  set('-',x0+z3,y0,z3,z4,g);
				  set('.',x0+2*z3,y0,z3,z4,g);
				  set('`',x0+z3,y0+z4,z3,z4,g);
			   }else{
			      set('(',x0,y0,z3,z4,g);
			      for(int xoff=z3;xoff<(width-z3);xoff+=z3){
			        set('_',x0+xoff,y0-z4,z3,z4,g);
			        set('_',x0+xoff,y0,z3,z4,g);
			      }
			      set(')',x0+width-z3,y0,z3,z4,g);
			   }
			}
		    else if(height==z4*2 && width>z3){
			   if(width==z3*2){
			 	  set('/',x0,y0,z3,z4,g);
			 	  set('\\',x0,y0+z4,z3,z4,g);
				  set('\\',x0+z3,y0,z3,z4,g);
				  set('/',x0+z3,y0+z4,z3,z4,g);
               }else{
				  set(',',x0,y0,z3,z4,g);
				  set('\\',x0,y0+z4,z3,z4,g);
			      for(int xoff=z3;xoff<(width-z3);xoff+=z3){
				    set('-',x0+xoff,y0,z3,z4,g);
				    set('_',x0+xoff,y0+z4,z3,z4,g);
			      }
				  set('.',x0+width-z3,y0,z3,z4,g);
				  set('/',x0+width-z3,y0+z4,z3,z4,g);
			  }
			}
		    else if(height==z4*3 && width>z3*2){
				  set('/',x0,y0,z3,z4,g);
				  set('|',x0,y0+z4,z3,z4,g);
			      for(int xoff=z3;xoff<(width-z3);xoff+=z3){
				     set('_',x0+xoff,y0-z4,z3,z4,g);
				     set('-',x0+xoff,y0+2*z4,z3,z4,g);
			      }
				  set('`',x0+z3,y0+z4*2,z3,z4,g);
				  set('\\',x0+width-z3,y0,z3,z4,g);
				  set('|',x0+width-z3,y0+z4,z3,z4,g);
				  set('\'',x0+width-z3*2,y0+z4*2,z3,z4,g);
			}
		    else if(height==z4*4 && width>z3*5){
				  set('/',x0+z3,y0,z3,z4,g);
				  set('|',x0,y0+z4,z3,z4,g);
				  set('\\',x0+z3,y0+2*z4,z3,z4,g);
				  //int mult = width/z3; 
				  int third = width/3;
			      for(int xoff=2*z3;xoff<(width-2*z3);xoff+=z3){
					 if(xoff>third && xoff<=(width-2*z3)-third){
				       set('-',x0+xoff,y0-z4,z3,z4,g);
				       set('_',x0+xoff,y0+3*z4,z3,z4,g);
					 }else{
				       set('_',x0+xoff,y0-z4,z3,z4,g);
				       set('-',x0+xoff,y0+3*z4,z3,z4,g);
					 }
			      }
				  set('`',x0+2*z3,y0+z4*3,z3,z4,g);
				  set('\\',x0+width-2*z3,y0,z3,z4,g);
				  set('|',x0+width-z3,y0+z4,z3,z4,g);
				  set('/',x0+width-z3*2,y0+z4*2,z3,z4,g);
				  set('`',x0+width-z3*3,y0+z4*3,z3,z4,g);
			}
			else if(width==0){
				  set('.',x0,y0,z3,z4,g);
			      for(int yoff=z4;yoff<(height-z4);yoff+=z4){
				     set('"',x0,y0+yoff,z3,z4,g);
				  }
				  set('\'',x0,y0+height-z4,z3,z4,g);
			}
			else if(width==z3){
				  set('\\',x0+z3,y0,z3,z4,g);
				  set('/',x0,y0,z3,z4,g);
			      for(int yoff=z4;yoff<(height-z4);yoff+=z4){
				     set('|',x0+z3,y0+yoff,z3,z4,g);
				     set('|',x0,y0+yoff,z3,z4,g);
				  }
				  set('/',x0+z3,y0+height-z4,z3,z4,g);
				  set('\\',x0,y0+height-z4,z3,z4,g);
			}
			else if(width==z3*2){
				  set('_',x0+z3,y0,z3,z4,g);
			      for(int yoff=z4;yoff<(height-z4);yoff+=z4){
				     set('|',x0+z3*2,y0+yoff,z3,z4,g);
				     set('|',x0,y0+yoff,z3,z4,g);
				  }
				  set('-',x0+z3,y0+height-z4,z3,z4,g);
			}
			else if(width==z3*3){
				  set('/',x0+z3,y0,z3,z4,g);
				  set('\\',x0+z3*2,y0,z3,z4,g);
			      for(int yoff=z4;yoff<(height-z4);yoff+=z4){
				     set('|',x0,y0+yoff,z3,z4,g);
				     set('|',x0+z3*3,y0+yoff,z3,z4,g);
				  }
				  set('\\',x0+z3,y0+height-z4,z3,z4,g);
				  set('/',x0+z3*2,y0+height-z4,z3,z4,g);
			}
			else if(width==z3*4){
				  set(',',x0+z3,y0,z3,z4,g);
				  set('-',x0+z3*2,y0,z3,z4,g);
				  set('.',x0+z3*3,y0,z3,z4,g);
			      for(int yoff=z4;yoff<(height-z4);yoff+=z4){
				     set('|',x0,y0+yoff,z3,z4,g);
				     set('|',x0+z3*4,y0+yoff,z3,z4,g);
				  }
				  set('`',x0+z3,y0+height-z4,z3,z4,g);
				  set('-',x0+z3*2,y0+height-z4,z3,z4,g);
				  set('`',x0+z3*3,y0+height-z4,z3,z4,g);
			}
			else if(width>=z3*5 && width<=z3*9){
				  int mult = width/z3;
				  set('.',x0+z3*(mult-1),y0,z3,z4,g);
				  set('\\',x0+z3*mult,y0+z4,z3,z4,g);
				  for(int i=2;i<mult-1;i++){
					//if(even && i==(mult/2))
					if(i==(mult/2)&&mult>5)
				     set('`',x0+z3*i,y0,z3,z4,g);
					else
				     set('-',x0+z3*i,y0,z3,z4,g);
				  }
				  set('/',x0,y0+z4,z3,z4,g);
				  set(',',x0+z3,y0,z3,z4,g);
			      for(int yoff=z4*2;yoff<(height-z4*2);yoff+=z4){
				     set('|',x0,y0+yoff,z3,z4,g);
				     set('|',x0+z3*mult,y0+yoff,z3,z4,g);
				  }
				  set('\\',x0,y0+height-2*z4,z3,z4,g);
				  set('`',x0+z3,y0+height-z4,z3,z4,g);
				  for(int i=2;i<mult-1;i++){
					//if(even && i==(mult/2))
					if(i==(mult/2)&&mult>5)
				     set('_',x0+z3*i,y0+height-z4,z3,z4,g);
					else
				     set('-',x0+z3*i,y0+height-z4,z3,z4,g);
				  }
				  set('`',x0+z3*(mult-1),y0+height-z4,z3,z4,g);
				  set('/',x0+z3*mult,y0+height-2*z4,z3,z4,g);
			}
			else if(width>=z3*10 && width<=z3*15){
				  int mult = width/z3;
				  for(int i=2;i<mult-1;i++){
					if(i==(mult/2)&&mult>5)
				     set('`',x0+z3*i,y0,z3,z4,g);
					else
				     set('-',x0+z3*i,y0,z3,z4,g);
				  }
				  set('/',x0,y0+2*z4,z3,z4,g);
				  set('/',x0+z3,y0+z4,z3,z4,g);
				  set(',',x0+2*z3,y0,z3,z4,g);
			      for(int yoff=z4*3;yoff<(height-z4*3);yoff+=z4){
				     set('|',x0,y0+yoff,z3,z4,g);
				     set('|',x0+z3*mult,y0+yoff,z3,z4,g);
				  }
				  set('.',x0+z3*(mult-2),y0,z3,z4,g);
				  set('\\',x0+z3*(mult-1),y0+z4,z3,z4,g);
				  set('\\',x0+z3*mult,y0+2*z4,z3,z4,g);
				  for(int i=3;i<mult-2;i++){
					if(i==(mult/2)&&mult>5)
				     set('_',x0+z3*i,y0+height-z4,z3,z4,g);
					else
				     set('-',x0+z3*i,y0+height-z4,z3,z4,g);
				  }
				  if(height/z4==5){
					 set('(',x0,y0+height-3*z4,z3,z4,g);
				     set(')',x0+z3*mult,y0+height-3*z4,z3,z4,g);
				  }
				  else{
					 set('\\',x0,y0+height-3*z4,z3,z4,g);
				     set('/',x0+z3*mult,y0+height-3*z4,z3,z4,g);
				  }
				  set('\\',x0+z3,y0+height-2*z4,z3,z4,g);
				  set('`',x0+2*z3,y0+height-z4,z3,z4,g);

				  set('`',x0+z3*(mult-2),y0+height-z4,z3,z4,g);
				  set('/',x0+z3*(mult-1),y0+height-2*z4,z3,z4,g);
			}
            else drawOval(x0,y0,x0+width,y0+height);
		    aj.ta.repaint();
		  }
          g.dispose();
        }
		return true; 
	}
	public void set(char c,int x, int y, int z3, int z4, Graphics g){
	   aj.ta.setchar(c,(x/z3)*z3,(y/z4)*z4,aj.curColorIndex, aj.curCol,g,false);
    }
	public void setchar(int c,int pos, int zoom, asciiJam aj){}
    public void add(int x, int y, int dir){}
    public void identify(int x, int y, int z, asciiJam ajam){}

    public boolean handleEvent(Event e){
	 if(e.target instanceof Button){
        if(e.id==1001)
            try{
            aj.getAppletContext().showDocument(new URL(env.helpFillURL),"_blank");
            }catch(Exception ex){}
		return true;
     }
     else if(e.target instanceof Checkbox){
        if(e.id==1001){
			 if( ((Checkbox)e.target).getLabel().equals("Outline") ){
                  fill = 0;
                  chCh.show();
                  lbl.show();
            }else if( ((Checkbox)e.target).getLabel().equals("Fill") ){
                  chCh.show();
                  lbl.show();
                  fill = 1;
            }else{
                  chCh.hide();
                  lbl.hide();
                  fill = 2;
            }
        }
		return true;
     }
     else if(e.id==Event.MOUSE_ENTER){
           env.setCursor(env.DEFAULT_CURSOR,aj);
     }
	 else if(e.id==Event.MOUSE_MOVE){
	 	  if(!defCurs){
		      env.setCursor(env.DEFAULT_CURSOR,aj);
		      defCurs = true;
		  }
	 }
     else if(e.id==Event.MOUSE_EXIT){
		 if(e.target instanceof oval){
           env.setCursor(aj.tool,aj);
		   defCurs = false;
		 }
         else{
		   env.setCursor(env.DEFAULT_CURSOR,aj);
		   defCurs = true;
		 }
     }
     else if(e.target instanceof Choice){
            aj.fillChar = ((Choice)e.target).getSelectedItem().charAt(0);
            return false;
     }
     return true;
  }



 public void drawOval(int x0,int y0,int x1,int y1){
    int z3 = aj.ta.zoom<<3;
    int z4 = aj.ta.zoom<<4;
	Point p0 = getMid(x0,y0,x1,y0);
	Point p1 = getMid(x1,y0,x1,y1);
	Point p2 = getMid(x0,y1,x1,y1);
	Point p3 = getMid(x0,y0,x0,y1);
    Point p4 = getMid(p0.x,p0.y, p1.x,p1.y);
    Point p5 = getMid(p2.x,p2.y, p1.x,p1.y);
    Point p6 = getMid(p2.x,p2.y, p3.x,p3.y);
    Point p7 = getMid(p0.x,p0.y, p3.x,p3.y);
    Point p8  = getMid(p4.x,p4.y, x1,y0);
    Point p9  = getMid(p5.x,p5.y, x1,y1);
    Point p10  = getMid(p6.x,p6.y, x0,y1);
    Point p11  = getMid(p7.x,p7.y, x0,y0);
	Point p14 = getKnob(p0.x,p0.y,x0,y0, p0.x,p0.y,p11.x,p11.y);
	Point p15 = getKnob(p3.x,p3.y,x0,y0, p3.x,p3.y,p11.x,p11.y);
	Point p17 = getKnob(p1.x,p1.y,x1,y0, p1.x,p1.y,p8.x,p8.y);
	Point p16 = getKnob(p0.x,p0.y,x1,y0, p0.x,p0.y,p8.x,p8.y);
	Point p18 = getKnob(p2.x,p2.y,x1,y1, p2.x,p2.y,p9.x,p9.y);
	Point p19 = getKnob(p3.x,p3.y,x0,y1, p3.x,p3.y,p10.x,p10.y);
	Point p20 = getKnob(p1.x,p1.y,x1,y1, p1.x,p1.y,p9.x,p9.y);
	Point p21 = getKnob(p2.x,p2.y,x0,y1, p2.x,p2.y,p10.x,p10.y);
            aj.ta.toolList[env.PENCIL_TOOL].mouseDown(((p0.x+aj.mapF.getX())/z3)*z3,
					((p0.y+aj.mapF.getY())/z4)*z4,aj.ta.zoom,aj);
            aj.ta.toolList[env.PENCIL_TOOL].mouseDrag((((p14.x+aj.mapF.getX())/z3)*z3),
					(((p14.y+aj.mapF.getY())/z4)*z4));
            aj.ta.toolList[env.PENCIL_TOOL].mouseDrag((((p11.x+aj.mapF.getX())/z3)*z3),
					(((p11.y+aj.mapF.getY())/z4)*z4));
            aj.ta.toolList[env.PENCIL_TOOL].mouseDrag((((p15.x+aj.mapF.getX())/z3)*z3),
					(((p15.y+aj.mapF.getY())/z4)*z4));
            aj.ta.toolList[env.PENCIL_TOOL].mouseDrag((((p3.x+aj.mapF.getX())/z3)*z3),
					(((p3.y+aj.mapF.getY())/z4)*z4));
            aj.ta.toolList[env.PENCIL_TOOL].mouseDrag((((p19.x+aj.mapF.getX())/z3)*z3),
					(((p19.y+aj.mapF.getY())/z4)*z4));
            aj.ta.toolList[env.PENCIL_TOOL].mouseDrag((((p10.x+aj.mapF.getX())/z3)*z3),
					(((p10.y+aj.mapF.getY())/z4)*z4));
            aj.ta.toolList[env.PENCIL_TOOL].mouseDrag((((p21.x+aj.mapF.getX())/z3)*z3),
					(((p21.y+aj.mapF.getY())/z4)*z4));
            aj.ta.toolList[env.PENCIL_TOOL].mouseDrag((((p2.x+aj.mapF.getX())/z3)*z3),
					(((p2.y+aj.mapF.getY())/z4)*z4));
            aj.ta.toolList[env.PENCIL_TOOL].mouseDrag((((p18.x+aj.mapF.getX())/z3)*z3),
					(((p18.y+aj.mapF.getY())/z4)*z4));
            aj.ta.toolList[env.PENCIL_TOOL].mouseDrag((((p9.x+aj.mapF.getX())/z3)*z3),
					(((p9.y+aj.mapF.getY())/z4)*z4));
            aj.ta.toolList[env.PENCIL_TOOL].mouseDrag((((p20.x+aj.mapF.getX())/z3)*z3),
					(((p20.y+aj.mapF.getY())/z4)*z4));
            aj.ta.toolList[env.PENCIL_TOOL].mouseDrag((((p1.x+aj.mapF.getX())/z3)*z3),
					(((p1.y+aj.mapF.getY())/z4)*z4));
            aj.ta.toolList[env.PENCIL_TOOL].mouseDrag((((p17.x+aj.mapF.getX())/z3)*z3),
					(((p17.y+aj.mapF.getY())/z4)*z4));
            aj.ta.toolList[env.PENCIL_TOOL].mouseDrag((((p8.x+aj.mapF.getX())/z3)*z3),
					(((p8.y+aj.mapF.getY())/z4)*z4));
            aj.ta.toolList[env.PENCIL_TOOL].mouseDrag((((p16.x+aj.mapF.getX())/z3)*z3),
					(((p16.y+aj.mapF.getY())/z4)*z4));
            aj.ta.toolList[env.PENCIL_TOOL].mouseDrag((((p0.x+aj.mapF.getX())/z3)*z3),
					(((p0.y+aj.mapF.getY())/z4)*z4));
  }

  public Point getKnob(int p0x,int p0y,int x0,int y0, int p1x,int p1y,int p11x,int p11y){
	 Point p12 = getMid(p0x,p0y,x0,y0);
     Point p13 = getMid(p1x,p1y,p11x,p11y);
	 return getMid(p13.x,p13.y,p12.x,p12.y);
  }
   
  public Point getMid(int x0, int y0, int x1, int y1){
		return new Point((x0+x1)/2, (y0+y1)/2);
  }
}
