import java.awt.*; import java.applet.*; import toolbox; import grobj; public class drawarea extends Panel { int n; toolbox tb; grobj_list glist = new grobj_list(); grobj_list clist = new grobj_list(); int old_x,old_y; int mode; int bx0,by0,bx1,by1; boolean bvis = false; int grid = 8; drawarea(toolbox t) { tb = t; setBackground(Color.white); t.parent = this; } public void paint(Graphics g) { Rectangle r = bounds(); if(grid>0) { g.setColor(new Color(224,224,224)); for(int i=grid;i0) { x = ((x+(grid/2))/grid)*grid; y = ((y+(grid/2))/grid)*grid; } mode = 0; if(tb.status==0) { grobj i; for(i = glist.ghead;i!=null;i=i.next) if(i.select!=0) i.select = 1; for(i = glist.gtail;i!=null;i=i.prev) if(i.select==1) if(i.selectpoint(x,y)) break; if(i==null) { for(i = glist.gtail;i!=null;i=i.prev) if(i.select==1) { if(i.selectobj(x,y)) break; } else { if(i.selectobj(x,y)) { if(!e.shiftDown()) for(grobj j = glist.ghead;j!=null;j=j.next) if(j!=i) j.select = 0; break; } } if(i==null) { if(!e.shiftDown()) for(grobj j = glist.ghead;j!=null;j=j.next) j.select = 0; bvis = true; bx0 = bx1 = xs; by0 = by1 = ys; } mode = 1; } } else { grobj g; grobj i; for(i = glist.ghead;i!=null;i=i.next) if(i.select!=0) break; if(i!=null && i.select!=0) i.addpoint(x,y); else if(tb.status==1) g = new grobj_line(x,y,tb.cstat,glist); else if(tb.status==2) g = new grobj_rect(x,y,tb.cstat,glist); else if(tb.status==3) g = new grobj_oval(x,y,tb.cstat,glist); else if(tb.status==4) g = new grobj_poly(x,y,tb.cstat,glist); } repaint(); old_x = x; old_y = y; return(true); } public boolean mouseDrag(Event e,int x,int y) { if(bvis) { int xmin = (bx1bx0) ? bx1 : bx0; int ymax = (by1>by0) ? by1 : by0; xmin = (xminx) ? xmax : x; ymax = (ymax>y) ? ymax : y; bx1 = x; by1 = y; repaint(xmin-2,ymin-2,xmax-xmin+4,ymax-ymin+4); } else { if(grid>0) { x = ((x+(grid/2))/grid)*grid; y = ((y+(grid/2))/grid)*grid; } int xmin = 10000; int ymin = 10000; int xmax = -10000; int ymax = -10000; for(grobj i = glist.ghead;i!=null;i=i.next) if(i.select>1 && mode==0 || i.select==1 && mode==1) { if(i.xminxmax) xmax = i.xmax; if(i.ymax>ymax) ymax = i.ymax; if(mode==0) i.movepoint(x-old_x,y-old_y); else i.moveobj(x-old_x,y-old_y); if(i.xminxmax) xmax = i.xmax; if(i.ymax>ymax) ymax = i.ymax; } if(xminbx0) ? bx1 : bx0; int ymax = (by1>by0) ? by1 : by0; for(grobj j = glist.ghead;j!=null;j=j.next) j.selectrect(xmin,ymin,xmax,ymax); bvis = false; repaint(); } else { if(grid>0) { x = ((x+(grid/2))/grid)*grid; y = ((y+(grid/2))/grid)*grid; } int xmin = 10000; int ymin = 10000; int xmax = -10000; int ymax = -10000; for(grobj i = glist.ghead;i!=null;i=i.next) if(i.select>1 && mode==0 || i.select==1 && mode==1) { if(i.xminxmax) xmax = i.xmax; if(i.ymax>ymax) ymax = i.ymax; if(mode==0) i.movepoint(x-old_x,y-old_y); else i.moveobj(x-old_x,y-old_y); if(i.xminxmax) xmax = i.xmax; if(i.ymax>ymax) ymax = i.ymax; if(tb.status!=0) if(i.done()) i.select = 0; } if(xmin