// we came in? // // Tikpaint.java v1.1 29101996 // // Copyright (c) 1996 Mikko Kortesluoma. All Rights Reserved. // // 1st assignment for Tik-111.300 Computer Graphics-course, fall-1996. // Mikko Kortesluoma, 44039U, Ti III // // Permission to use, copy, modify, and distribute this software // and its documentation for NON-COMMERCIAL purposes and without fee // is hereby granted. Anyone willing to licence this software for // COMMERCIAL use should contact the author directly - please refer // to the file http://www.hut.fi/~mkortesl/ for contact information. // // THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE // CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE // PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT // NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE // SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE // SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE // PHYSICAL OR ENVIRONMENTAL DAMAGE. // // Comments: Due to java cordinate system and implementation of // drawing primitives this programs has a quite lot of if{} clauses // and many features _could_ have been made as generic objects, but // this is a quick and dirty procedural-oriented implementation of // a simple drawing program to java. For example defining linewidth // would have required redefinition of all drawing primitives. And // since no points were given of the style.... import java.awt.*; import java.applet.*; import java.util.Vector; public class Tikpaint extends Applet { public void init() { setLayout(new BorderLayout()); TikPanel tp = new TikPanel(); add("Center", tp); add("South",new TikControls(tp)); } // Window killer routine, if used as a application, not // called if runned as a applet public boolean handleEvent(Event e) { switch (e.id) { case Event.WINDOW_DESTROY: System.exit(0); return true; default: return false; } } // Frame creation, if used as a application, not called // if runned as a applet public static void main(String args[]) { Frame f = new Frame("TikPaint"); Tikpaint tikPaint = new Tikpaint(); tikPaint.init(); tikPaint.start(); f.add("Center", tikPaint); f.resize(500, 300); f.show(); } } class TikPanel extends Panel { // State namings public static final int LINES = 0; public static final int ECLIPSE = 1; public static final int NORMAL = 2; public static final int BOLD = 3; public static final int CONT = 4; public static final int DISCONT = 5; public static final int LINES_NORMAL_CONT = 10; public static final int LINES_BOLD_CONT = 20; public static final int LINES_NORMAL_DISCONT = 30; public static final int LINES_BOLD_DISCONT = 40; public static final int ECLIPSE_NORMAL_CONT = 50; public static final int ECLIPSE_BOLD_CONT = 60; public static final int ECLIPSE_NORMAL_DISCONT = 70; public static final int ECLIPSE_BOLD_DISCONT = 80; public static final int NOT_TRACKING = 666; public static final int TRACKING = 777; // The beginning state - lines, normal width, continuous, pen not down int drawmode = LINES_NORMAL_CONT; int trackmode = NOT_TRACKING; // In these Vectors we save all that is drawed. // In this way, object removal, moving or resizing would be // fairly easy to implement. Vector lines = new Vector(); Vector eclipses = new Vector(); Vector arcs = new Vector(); int x1,y1; // The first point of a drawing primitive given by MOUSE_DOWN int x2,y2; // In these is stored the value given by // MOUSE_MOVE after repaint() is called so that next time // MOUSE_MOVE is called last point can be accessed. int xt,yt; // In these is stored the value given by // MOUSE_MOVE before repaint() is called. // temp values needed for discontinuous line calculations double k,kx,ky,x1d,y1d,y2d,x2d; int x1t,x2t,y1t,y2t,temp; // Valkoinen tausta public TikPanel() { setBackground(Color.white); } // Screen clearing routine that empties Vectors public void clearscreen() { lines.removeAllElements(); eclipses.removeAllElements(); arcs.removeAllElements(); repaint(); } // State transitions, yes, maeby this could have been // implemented in more elegant way, but I had no time to think... public void setDrawMode(int drawmode) { switch (drawmode) { case LINES: if(this.drawmode == LINES_NORMAL_CONT){ this.drawmode = LINES_NORMAL_CONT; } else if(this.drawmode == LINES_BOLD_CONT){ this.drawmode = LINES_BOLD_CONT; } else if(this.drawmode == LINES_NORMAL_DISCONT){ this.drawmode = LINES_NORMAL_DISCONT; } else if(this.drawmode == LINES_BOLD_DISCONT){ this.drawmode = LINES_BOLD_DISCONT; } else if(this.drawmode == ECLIPSE_NORMAL_CONT){ this.drawmode = LINES_NORMAL_CONT; } else if(this.drawmode == ECLIPSE_BOLD_CONT){ this.drawmode = LINES_BOLD_CONT; } else if(this.drawmode == ECLIPSE_NORMAL_DISCONT){ this.drawmode = LINES_NORMAL_DISCONT; } else if(this.drawmode == ECLIPSE_BOLD_DISCONT){ this.drawmode = LINES_BOLD_DISCONT; } break; case ECLIPSE: if(this.drawmode == LINES_NORMAL_CONT){ this.drawmode = ECLIPSE_NORMAL_CONT; } else if(this.drawmode == LINES_BOLD_CONT){ this.drawmode = ECLIPSE_BOLD_CONT; } else if(this.drawmode == LINES_NORMAL_DISCONT){ this.drawmode = ECLIPSE_NORMAL_DISCONT; } else if(this.drawmode == LINES_BOLD_DISCONT){ this.drawmode = ECLIPSE_BOLD_DISCONT; } else if(this.drawmode == ECLIPSE_NORMAL_CONT){ this.drawmode = ECLIPSE_NORMAL_CONT; } else if(this.drawmode == ECLIPSE_BOLD_CONT){ this.drawmode = ECLIPSE_BOLD_CONT; } else if(this.drawmode == ECLIPSE_NORMAL_DISCONT){ this.drawmode = ECLIPSE_NORMAL_DISCONT; } else if(this.drawmode == ECLIPSE_BOLD_DISCONT){ this.drawmode = ECLIPSE_BOLD_DISCONT; } break; case NORMAL: if(this.drawmode == LINES_NORMAL_CONT){ this.drawmode = LINES_NORMAL_CONT; } else if(this.drawmode == LINES_BOLD_CONT){ this.drawmode = LINES_NORMAL_CONT; } else if(this.drawmode == LINES_NORMAL_DISCONT){ this.drawmode = LINES_NORMAL_DISCONT; } else if(this.drawmode == LINES_BOLD_DISCONT){ this.drawmode = LINES_NORMAL_DISCONT; } else if(this.drawmode == ECLIPSE_NORMAL_CONT){ this.drawmode = ECLIPSE_NORMAL_CONT; } else if(this.drawmode == ECLIPSE_BOLD_CONT){ this.drawmode = ECLIPSE_NORMAL_CONT; } else if(this.drawmode == ECLIPSE_NORMAL_DISCONT){ this.drawmode = ECLIPSE_NORMAL_DISCONT; } else if(this.drawmode == ECLIPSE_BOLD_DISCONT){ this.drawmode = ECLIPSE_NORMAL_DISCONT; } break; case BOLD: if(this.drawmode == LINES_NORMAL_CONT){ this.drawmode = LINES_BOLD_CONT; } else if(this.drawmode == LINES_BOLD_CONT){ this.drawmode = LINES_BOLD_CONT; } else if(this.drawmode == LINES_NORMAL_DISCONT){ this.drawmode = LINES_BOLD_DISCONT; } else if(this.drawmode == LINES_BOLD_DISCONT){ this.drawmode = LINES_BOLD_DISCONT; } else if(this.drawmode == ECLIPSE_NORMAL_CONT){ this.drawmode = ECLIPSE_BOLD_CONT; } else if(this.drawmode == ECLIPSE_BOLD_CONT){ this.drawmode = ECLIPSE_BOLD_CONT; } else if(this.drawmode == ECLIPSE_NORMAL_DISCONT){ this.drawmode = ECLIPSE_BOLD_DISCONT; } else if(this.drawmode == ECLIPSE_BOLD_DISCONT){ this.drawmode = ECLIPSE_BOLD_DISCONT; } break; case CONT: if(this.drawmode == LINES_NORMAL_CONT){ this.drawmode = LINES_NORMAL_CONT; } else if(this.drawmode == LINES_BOLD_CONT){ this.drawmode = LINES_BOLD_CONT; } else if(this.drawmode == LINES_NORMAL_DISCONT){ this.drawmode = LINES_NORMAL_CONT; } else if(this.drawmode == LINES_BOLD_DISCONT){ this.drawmode = LINES_BOLD_CONT; } else if(this.drawmode == ECLIPSE_NORMAL_CONT){ this.drawmode = ECLIPSE_NORMAL_CONT; } else if(this.drawmode == ECLIPSE_BOLD_CONT){ this.drawmode = ECLIPSE_BOLD_CONT; } else if(this.drawmode == ECLIPSE_NORMAL_DISCONT){ this.drawmode = ECLIPSE_NORMAL_CONT; } else if(this.drawmode == ECLIPSE_BOLD_DISCONT){ this.drawmode = ECLIPSE_BOLD_CONT; } break; case DISCONT: if(this.drawmode == LINES_NORMAL_CONT){ this.drawmode = LINES_NORMAL_DISCONT; } else if(this.drawmode == LINES_BOLD_CONT){ this.drawmode = LINES_BOLD_DISCONT; } else if(this.drawmode == LINES_NORMAL_DISCONT){ this.drawmode = LINES_NORMAL_DISCONT; } else if(this.drawmode == LINES_BOLD_DISCONT){ this.drawmode = LINES_BOLD_DISCONT; } else if(this.drawmode == ECLIPSE_NORMAL_CONT){ this.drawmode = ECLIPSE_NORMAL_DISCONT; } else if(this.drawmode == ECLIPSE_BOLD_CONT){ this.drawmode = ECLIPSE_BOLD_DISCONT; } else if(this.drawmode == ECLIPSE_NORMAL_DISCONT){ this.drawmode = ECLIPSE_NORMAL_DISCONT; } else if(this.drawmode == ECLIPSE_BOLD_DISCONT){ this.drawmode = ECLIPSE_BOLD_DISCONT; } break; default: throw new IllegalArgumentException(); } } public boolean handleEvent(Event e) { switch (e.id) { // Called when pressed button is released case Event.MOUSE_UP: switch (trackmode) { // Pen is not yet down case NOT_TRACKING: trackmode = TRACKING; x1 = e.x; y1 = e.y; x2 = -1; break; // Pen is down case TRACKING: switch (drawmode) { case LINES_NORMAL_CONT: // If button is double-clicked the line is drawn // and pen is lifted up. Same result will be if // two buttons are pressed simultaneously if( x1 == e.x && y1 == e.y){ trackmode = NOT_TRACKING; x2 = x1 = -1; break; } // Else line is added to Vector and current point is // set as a starting point of the next line. else { lines.addElement(new Rectangle(x1, y1, e.x, e.y)); x1 = e.x; y1 = e.y; break; } case LINES_BOLD_CONT: if( x1 == e.x && y1 == e.y){ trackmode = NOT_TRACKING; x2 = x1 = -1; break; } else { // So this is not the most elegant way to implement // linewidth, but it works - 9 lines are added // the line Vector resulting a bold line lines.addElement(new Rectangle(x1, y1, e.x, e.y)); lines.addElement(new Rectangle(x1+1, y1, e.x, e.y)); lines.addElement(new Rectangle(x1, y1+1, e.x, e.y)); lines.addElement(new Rectangle(x1, y1, e.x+1, e.y)); lines.addElement(new Rectangle(x1, y1, e.x, e.y+1)); lines.addElement(new Rectangle(x1, y1-1, e.x, e.y-1)); lines.addElement(new Rectangle(x1-1, y1, e.x-1, e.y)); lines.addElement(new Rectangle(x1, y1+1, e.x, e.y+1)); lines.addElement(new Rectangle(x1+1, y1, e.x+1, e.y)); x1 = e.x; y1 = e.y; break; } case LINES_NORMAL_DISCONT: if( x1 == e.x && y1 == e.y ){ trackmode = NOT_TRACKING; x2 = x1 = -1; break; } else { if((e.x-x1)>0) { // Yes, maeby these could have been if((e.y-y1)>0) { // made in drawing routine, but this // surely is the fastest way and so // what is there are four times too // many lines in source code.... x1d = x1; x2d = xt; y1d = y1; y2d = yt; k = (((double)yt-(double)y1)/((double)xt-(double)x1)); kx = Math.sqrt((36)/(1+k*k)); // How many x-pixels per one line unit ky = k*kx; // How many y-pixels -"- // Draw until the end of the line... while((y2d-y1d)>0 && (x2d-x1d)>0 && ((y2d-y1d)*(y2d-y1d)+(x2d-x1d)*(x2d-x1d))>36) { x1t = (int)x1d; x2t = (int)(x1d+kx); y1t = (int)y1d; y2t = (int)(y1d+ky); // Add one unit to the Vector lines.addElement(new Rectangle(x1t,y1t,x2t,y2t)); x1d = x1d+2*kx; //...and fix the starting point of y1d = y1d+2*ky; // the next unit } // Draw the last unit if((y2d-y1d)>0 && (x2d-x1d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; lines.addElement(new Rectangle(x1t,y1t,x2t,y2t)); } } else { // If e.y - y1 < 0 x1d = x1; x2d = xt; y1d = y1; y2d = yt; k = (((double)y1-(double)yt)/((double)xt-(double)x1)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y1d-y2d)>0 && (x2d-x1d)>0 && ((y1d-y2d)*(y1d-y2d)+(x2d-x1d)*(x2d-x1d))>36) { x1t = (int)x1d; x2t = (int)(x1d+kx); y1t = (int)y1d; y2t = (int)(y1d-ky); lines.addElement(new Rectangle(x1t,y1t,x2t,y2t)); x1d = x1d+2*kx; y1d = y1d-2*ky; } if((y1d-y2d)>0 && (x2d-x1d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; lines.addElement(new Rectangle(x1t,y1t,x2t,y2t)); } } } else { // If e.x - x1 < 0 if((e.y-y1)>0) { x1d = x1; x2d = xt; y1d = y1; y2d = yt; k = (((double)yt-(double)y1)/((double)x1-(double)xt)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y2d-y1d)>0 && (x1d-x2d)>0 && ((y2d-y1d)*(y2d-y1d)+(x1d-x2d)*(x1d-x2d))>36) { x1t = (int)x1d; x2t = (int)(x1d-kx); y1t = (int)y1d; y2t = (int)(y1d+ky); lines.addElement(new Rectangle(x1t,y1t,x2t,y2t)); x1d = x1d-2*kx; y1d = y1d+2*ky; } if((y2d-y1d)>0 && (x1d-x2d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; lines.addElement(new Rectangle(x1t,y1t,x2t,y2t)); } } else { // If e.x - x1 && e.y - y1 < 0 x1d = x1; x2d = xt; y1d = y1; y2d = yt; k = (((double)y1-(double)yt)/((double)x1-(double)xt)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y1d-y2d)>0 && (x1d-x2d)>0 && ((y1d-y2d)*(y1d-y2d)+(x1d-x2d)*(x1d-x2d))>36) { x1t = (int)x1d; x2t = (int)(x1d-kx); y1t = (int)y1d; y2t = (int)(y1d-ky); lines.addElement(new Rectangle(x1t,y1t,x2t,y2t)); x1d = x1d-2*kx; y1d = y1d-2*ky; } if((y1d-y2d)>0 && (x1d-x2d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; lines.addElement(new Rectangle(x1t,y1t,x2t,y2t)); } } } x1 = e.x; y1 = e.y; } break; case LINES_BOLD_DISCONT: // The same as previous but // bold line consisting of 9 lines // is drawn if( x1 == e.x && y1 == e.y ){ trackmode = NOT_TRACKING; x2 = x1 = -1; break; } else { if((e.x-x1)>0) { if((e.y-y1)>0) { x1d = x1; x2d = xt; y1d = y1; y2d = yt; k = (((double)yt-(double)y1)/((double)xt-(double)x1)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y2d-y1d)>0 && (x2d-x1d)>0 && ((y2d-y1d)*(y2d-y1d)+(x2d-x1d)*(x2d-x1d))>36) { x1t = (int)x1d; x2t = (int)(x1d+kx); y1t = (int)y1d; y2t = (int)(y1d+ky); lines.addElement(new Rectangle(x1t,y1t,x2t,y2t)); lines.addElement(new Rectangle(x1t+1,y1t+1,x2t+1,y2t+1)); lines.addElement(new Rectangle(x1t+1,y1t-1,x2t+1,y2t-1)); lines.addElement(new Rectangle(x1t-1,y1t+1,x2t-1,y2t+1)); lines.addElement(new Rectangle(x1t-1,y1t-1,x2t-1,y2t-1)); lines.addElement(new Rectangle(x1t+1,y1t,x2t+1,y2t)); lines.addElement(new Rectangle(x1t,y1t+1,x2t,y2t+1)); lines.addElement(new Rectangle(x1t,y1t-1,x2t,y2t-1)); lines.addElement(new Rectangle(x1t-1,y1t,x2t-1,y2t)); x1d = x1d+2*kx; y1d = y1d+2*ky; } if((y2d-y1d)>0 && (x2d-x1d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; lines.addElement(new Rectangle(x1t,y1t,x2t,y2t)); lines.addElement(new Rectangle(x1t+1,y1t+1,x2t+1,y2t+1)); lines.addElement(new Rectangle(x1t+1,y1t-1,x2t+1,y2t-1)); lines.addElement(new Rectangle(x1t-1,y1t+1,x2t-1,y2t+1)); lines.addElement(new Rectangle(x1t-1,y1t-1,x2t-1,y2t-1)); lines.addElement(new Rectangle(x1t+1,y1t,x2t+1,y2t)); lines.addElement(new Rectangle(x1t,y1t+1,x2t,y2t+1)); lines.addElement(new Rectangle(x1t,y1t-1,x2t,y2t-1)); lines.addElement(new Rectangle(x1t-1,y1t,x2t-1,y2t)); } } else { x1d = x1; x2d = xt; y1d = y1; y2d = yt; k = (((double)y1-(double)yt)/((double)xt-(double)x1)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y1d-y2d)>0 && (x2d-x1d)>0 && ((y1d-y2d)*(y1d-y2d)+(x2d-x1d)*(x2d-x1d))>36) { x1t = (int)x1d; x2t = (int)(x1d+kx); y1t = (int)y1d; y2t = (int)(y1d-ky); lines.addElement(new Rectangle(x1t,y1t,x2t,y2t)); lines.addElement(new Rectangle(x1t+1,y1t+1,x2t+1,y2t+1)); lines.addElement(new Rectangle(x1t+1,y1t-1,x2t+1,y2t-1)); lines.addElement(new Rectangle(x1t-1,y1t+1,x2t-1,y2t+1)); lines.addElement(new Rectangle(x1t-1,y1t-1,x2t-1,y2t-1)); lines.addElement(new Rectangle(x1t+1,y1t,x2t+1,y2t)); lines.addElement(new Rectangle(x1t,y1t+1,x2t,y2t+1)); lines.addElement(new Rectangle(x1t,y1t-1,x2t,y2t-1)); lines.addElement(new Rectangle(x1t-1,y1t,x2t-1,y2t)); x1d = x1d+2*kx; y1d = y1d-2*ky; } if((y1d-y2d)>0 && (x2d-x1d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; lines.addElement(new Rectangle(x1t,y1t,x2t,y2t)); lines.addElement(new Rectangle(x1t+1,y1t+1,x2t+1,y2t+1)); lines.addElement(new Rectangle(x1t+1,y1t-1,x2t+1,y2t-1)); lines.addElement(new Rectangle(x1t-1,y1t+1,x2t-1,y2t+1)); lines.addElement(new Rectangle(x1t-1,y1t-1,x2t-1,y2t-1)); lines.addElement(new Rectangle(x1t+1,y1t,x2t+1,y2t)); lines.addElement(new Rectangle(x1t,y1t+1,x2t,y2t+1)); lines.addElement(new Rectangle(x1t,y1t-1,x2t,y2t-1)); lines.addElement(new Rectangle(x1t-1,y1t,x2t-1,y2t)); } } } else { if((e.y-y1)>0) { x1d = x1; x2d = xt; y1d = y1; y2d = yt; k = (((double)yt-(double)y1)/((double)x1-(double)xt)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y2d-y1d)>0 && (x1d-x2d)>0 && ((y2d-y1d)*(y2d-y1d)+(x1d-x2d)*(x1d-x2d))>36) { x1t = (int)x1d; x2t = (int)(x1d-kx); y1t = (int)y1d; y2t = (int)(y1d+ky); lines.addElement(new Rectangle(x1t,y1t,x2t,y2t)); lines.addElement(new Rectangle(x1t+1,y1t+1,x2t+1,y2t+1)); lines.addElement(new Rectangle(x1t+1,y1t-1,x2t+1,y2t-1)); lines.addElement(new Rectangle(x1t-1,y1t+1,x2t-1,y2t+1)); lines.addElement(new Rectangle(x1t-1,y1t-1,x2t-1,y2t-1)); lines.addElement(new Rectangle(x1t+1,y1t,x2t+1,y2t)); lines.addElement(new Rectangle(x1t,y1t+1,x2t,y2t+1)); lines.addElement(new Rectangle(x1t,y1t-1,x2t,y2t-1)); lines.addElement(new Rectangle(x1t-1,y1t,x2t-1,y2t)); x1d = x1d-2*kx; y1d = y1d+2*ky; } if((y2d-y1d)>0 && (x1d-x2d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; lines.addElement(new Rectangle(x1t,y1t,x2t,y2t)); lines.addElement(new Rectangle(x1t+1,y1t+1,x2t+1,y2t+1)); lines.addElement(new Rectangle(x1t+1,y1t-1,x2t+1,y2t-1)); lines.addElement(new Rectangle(x1t-1,y1t+1,x2t-1,y2t+1)); lines.addElement(new Rectangle(x1t-1,y1t-1,x2t-1,y2t-1)); lines.addElement(new Rectangle(x1t+1,y1t,x2t+1,y2t)); lines.addElement(new Rectangle(x1t,y1t+1,x2t,y2t+1)); lines.addElement(new Rectangle(x1t,y1t-1,x2t,y2t-1)); lines.addElement(new Rectangle(x1t-1,y1t,x2t-1,y2t)); } } else { x1d = x1; x2d = xt; y1d = y1; y2d = yt; k = (((double)y1-(double)yt)/((double)x1-(double)xt)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y1d-y2d)>0 && (x1d-x2d)>0 && ((y1d-y2d)*(y1d-y2d)+(x1d-x2d)*(x1d-x2d))>36) { x1t = (int)x1d; x2t = (int)(x1d-kx); y1t = (int)y1d; y2t = (int)(y1d-ky); lines.addElement(new Rectangle(x1t,y1t,x2t,y2t)); lines.addElement(new Rectangle(x1t+1,y1t+1,x2t+1,y2t+1)); lines.addElement(new Rectangle(x1t+1,y1t-1,x2t+1,y2t-1)); lines.addElement(new Rectangle(x1t-1,y1t+1,x2t-1,y2t+1)); lines.addElement(new Rectangle(x1t-1,y1t-1,x2t-1,y2t-1)); lines.addElement(new Rectangle(x1t+1,y1t,x2t+1,y2t)); lines.addElement(new Rectangle(x1t,y1t+1,x2t,y2t+1)); lines.addElement(new Rectangle(x1t,y1t-1,x2t,y2t-1)); lines.addElement(new Rectangle(x1t-1,y1t,x2t-1,y2t)); x1d = x1d-2*kx; y1d = y1d-2*ky; } if((y1d-y2d)>0 && (x1d-x2d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; lines.addElement(new Rectangle(x1t,y1t,x2t,y2t)); lines.addElement(new Rectangle(x1t+1,y1t+1,x2t+1,y2t+1)); lines.addElement(new Rectangle(x1t+1,y1t-1,x2t+1,y2t-1)); lines.addElement(new Rectangle(x1t-1,y1t+1,x2t-1,y2t+1)); lines.addElement(new Rectangle(x1t-1,y1t-1,x2t-1,y2t-1)); lines.addElement(new Rectangle(x1t+1,y1t,x2t+1,y2t)); lines.addElement(new Rectangle(x1t,y1t+1,x2t,y2t+1)); lines.addElement(new Rectangle(x1t,y1t-1,x2t,y2t-1)); lines.addElement(new Rectangle(x1t-1,y1t,x2t-1,y2t)); } } } x1 = e.x; y1 = e.y; } break; case ECLIPSE_NORMAL_CONT: // Well, ellipse actually, but who gives a... if( x1 == e.x && y1 == e.y ){ trackmode = NOT_TRACKING; x2 = x1 = -1; break; } else { // Four cases are needed for drawing an ellipse // conserning the signs of (x2-x1) ja (y2-y1). if((e.x-x1)>0) { if((e.y-y1)>0) { eclipses.addElement(new Rectangle(x1, y1, e.x-x1, e.y-y1)); } else { eclipses.addElement(new Rectangle(x1, e.y, e.x-x1, y1-e.y)); } } else { if((e.y-y1)>0) { eclipses.addElement(new Rectangle(e.x, y1, x1-e.x, e.y-y1)); } else { eclipses.addElement(new Rectangle(e.x, e.y, x1-e.x, y1-e.y)); } } x2 = x1 = -1; trackmode = NOT_TRACKING; } break; case ECLIPSE_BOLD_CONT: if( x1 == e.x && y1 == e.y ){ trackmode = NOT_TRACKING; x2 = x1 = -1; break; } // Another brute-force implementation of line-width... else { if((e.x-x1)>0) { if((e.y-y1)>0) { eclipses.addElement(new Rectangle(x1, y1, e.x-x1, e.y-y1)); eclipses.addElement(new Rectangle(x1+1, y1+1, e.x-x1, e.y-y1)); eclipses.addElement(new Rectangle(x1+1, y1, e.x-x1, e.y-y1)); eclipses.addElement(new Rectangle(x1+1, y1-1, e.x-x1, e.y-y1)); eclipses.addElement(new Rectangle(x1, y1-1, e.x-x1, e.y-y1)); eclipses.addElement(new Rectangle(x1-1, y1-1, e.x-x1, e.y-y1)); eclipses.addElement(new Rectangle(x1-1, y1, e.x-x1, e.y-y1)); eclipses.addElement(new Rectangle(x1-1, y1+1, e.x-x1, e.y-y1)); eclipses.addElement(new Rectangle(x1, y1+1, e.x-x1, e.y-y1)); } else { eclipses.addElement(new Rectangle(x1, e.y, e.x-x1, y1-e.y)); eclipses.addElement(new Rectangle(x1+1, e.y+1, e.x-x1, y1-e.y)); eclipses.addElement(new Rectangle(x1+1, e.y, e.x-x1, y1-e.y)); eclipses.addElement(new Rectangle(x1+1, e.y-1, e.x-x1, y1-e.y)); eclipses.addElement(new Rectangle(x1, e.y-1, e.x-x1, y1-e.y)); eclipses.addElement(new Rectangle(x1-1, e.y-1, e.x-x1, y1-e.y)); eclipses.addElement(new Rectangle(x1-1, e.y, e.x-x1, y1-e.y)); eclipses.addElement(new Rectangle(x1-1, e.y+1, e.x-x1, y1-e.y)); eclipses.addElement(new Rectangle(x1, e.y+1, e.x-x1, y1-e.y)); } } else { if((e.y-y1)>0) { eclipses.addElement(new Rectangle(e.x, y1, x1-e.x, e.y-y1)); eclipses.addElement(new Rectangle(e.x+1, y1+1, x1-e.x, e.y-y1)); eclipses.addElement(new Rectangle(e.x+1, y1, x1-e.x, e.y-y1)); eclipses.addElement(new Rectangle(e.x+1, y1-1, x1-e.x, e.y-y1)); eclipses.addElement(new Rectangle(e.x, y1-1, x1-e.x, e.y-y1)); eclipses.addElement(new Rectangle(e.x-1, y1-1, x1-e.x, e.y-y1)); eclipses.addElement(new Rectangle(e.x-1, y1, x1-e.x, e.y-y1)); eclipses.addElement(new Rectangle(e.x-1, y1+1, x1-e.x, e.y-y1)); eclipses.addElement(new Rectangle(e.x, y1+1, x1-e.x, e.y-y1)); } else { eclipses.addElement(new Rectangle(e.x, e.y, x1-e.x, y1-e.y)); eclipses.addElement(new Rectangle(e.x+1, e.y+1, x1-e.x, y1-e.y)); eclipses.addElement(new Rectangle(e.x+1, e.y, x1-e.x, y1-e.y)); eclipses.addElement(new Rectangle(e.x+1, e.y-1, x1-e.x, y1-e.y)); eclipses.addElement(new Rectangle(e.x, e.y-1, x1-e.x, y1-e.y)); eclipses.addElement(new Rectangle(e.x-1, e.y-1, x1-e.x, y1-e.y)); eclipses.addElement(new Rectangle(e.x-1, e.y, x1-e.x, y1-e.y)); eclipses.addElement(new Rectangle(e.x-1, e.y+1, x1-e.x, y1-e.y)); eclipses.addElement(new Rectangle(e.x, e.y+1, x1-e.x, y1-e.y)); } } x2 = x1 = -1; trackmode = NOT_TRACKING; } break; case ECLIPSE_NORMAL_DISCONT: // Discontinuous ellipse - made of arcs // 10 degrees wide and spaces 10 degrees wide // between arcs if( x1 == e.x && y1 == e.y ){ trackmode = NOT_TRACKING; x2 = x1 = -1; break; } else { if((xt-x1)>0) { if((yt-y1)>0) { arcs.addElement(new Rectangle(x1, y1, e.x-x1, e.y-y1)); } else { arcs.addElement(new Rectangle(x1, e.y, e.x-x1, y1-e.y)); } } else { if((yt-y1)>0) { arcs.addElement(new Rectangle(e.x, y1, x1-e.x, e.y-y1)); } else { arcs.addElement(new Rectangle(e.x, e.y, x1-e.x, y1-e.y)); } } x2 = x1 = -1; trackmode = NOT_TRACKING; } break; case ECLIPSE_BOLD_DISCONT: // The revenge of brute-force line-width if( x1 == e.x && y1 == e.y ){ trackmode = NOT_TRACKING; x2 = x1 = -1; break; } else { if((xt-x1)>0) { if((yt-y1)>0) { arcs.addElement(new Rectangle(x1, y1, e.x-x1, e.y-y1)); arcs.addElement(new Rectangle(x1+1, y1+1, e.x-x1, e.y-y1)); arcs.addElement(new Rectangle(x1+1, y1, e.x-x1, e.y-y1)); arcs.addElement(new Rectangle(x1+1, y1-1, e.x-x1, e.y-y1)); arcs.addElement(new Rectangle(x1, y1-1, e.x-x1, e.y-y1)); arcs.addElement(new Rectangle(x1-1, y1-1, e.x-x1, e.y-y1)); arcs.addElement(new Rectangle(x1-1, y1, e.x-x1, e.y-y1)); arcs.addElement(new Rectangle(x1-1, y1+1, e.x-x1, e.y-y1)); arcs.addElement(new Rectangle(x1, y1+1, e.x-x1, e.y-y1)); } else { arcs.addElement(new Rectangle(x1, e.y, e.x-x1, y1-e.y)); arcs.addElement(new Rectangle(x1+1, e.y+1, e.x-x1, y1-e.y)); arcs.addElement(new Rectangle(x1+1, e.y, e.x-x1, y1-e.y)); arcs.addElement(new Rectangle(x1+1, e.y-1, e.x-x1, y1-e.y)); arcs.addElement(new Rectangle(x1, e.y-1, e.x-x1, y1-e.y)); arcs.addElement(new Rectangle(x1-1, e.y-1, e.x-x1, y1-e.y)); arcs.addElement(new Rectangle(x1-1, e.y, e.x-x1, y1-e.y)); arcs.addElement(new Rectangle(x1-1, e.y+1, e.x-x1, y1-e.y)); arcs.addElement(new Rectangle(x1, e.y+1, e.x-x1, y1-e.y)); } } else { if((yt-y1)>0) { arcs.addElement(new Rectangle(e.x, y1, x1-e.x, e.y-y1)); arcs.addElement(new Rectangle(e.x+1, y1+1, x1-e.x, e.y-y1)); arcs.addElement(new Rectangle(e.x+1, y1, x1-e.x, e.y-y1)); arcs.addElement(new Rectangle(e.x+1, y1-1, x1-e.x, e.y-y1)); arcs.addElement(new Rectangle(e.x, y1-1, x1-e.x, e.y-y1)); arcs.addElement(new Rectangle(e.x-1, y1-1, x1-e.x, e.y-y1)); arcs.addElement(new Rectangle(e.x-1, y1, x1-e.x, e.y-y1)); arcs.addElement(new Rectangle(e.x-1, y1+1, x1-e.x, e.y-y1)); arcs.addElement(new Rectangle(e.x, y1+1, x1-e.x, e.y-y1)); } else { arcs.addElement(new Rectangle(e.x, e.y, x1-e.x, y1-e.y)); arcs.addElement(new Rectangle(e.x+1, e.y+1, x1-e.x, y1-e.y)); arcs.addElement(new Rectangle(e.x+1, e.y, x1-e.x, y1-e.y)); arcs.addElement(new Rectangle(e.x+1, e.y-1, x1-e.x, y1-e.y)); arcs.addElement(new Rectangle(e.x, e.y-1, x1-e.x, y1-e.y)); arcs.addElement(new Rectangle(e.x-1, e.y-1, x1-e.x, y1-e.y)); arcs.addElement(new Rectangle(e.x-1, e.y, x1-e.x, y1-e.y)); arcs.addElement(new Rectangle(e.x-1, e.y+1, x1-e.x, y1-e.y)); arcs.addElement(new Rectangle(e.x, e.y+1, x1-e.x, y1-e.y)); } } x2 = x1 = -1; trackmode = NOT_TRACKING; } break; default: break; } repaint(); } return true; case Event.MOUSE_MOVE: // Yes. they are all the same... // but removing the switch the first // time made this programs crash... // superstitious, who, me... if (trackmode == TRACKING) { switch (drawmode) { case LINES_NORMAL_CONT: xt = e.x; yt = e.y; repaint(); x2 = e.x; y2 = e.y; break; case LINES_BOLD_CONT: xt = e.x; yt = e.y; repaint(); x2 = e.x; y2 = e.y; break; case LINES_NORMAL_DISCONT: xt = e.x; yt = e.y; repaint(); x2 = e.x; y2 = e.y; break; case LINES_BOLD_DISCONT: xt = e.x; yt = e.y; repaint(); x2 = e.x; y2 = e.y; break; case ECLIPSE_NORMAL_CONT: xt = e.x; yt = e.y; repaint(); x2 = e.x; y2 = e.y; break; case ECLIPSE_BOLD_CONT: xt = e.x; yt = e.y; repaint(); x2 = e.x; y2 = e.y; break; case ECLIPSE_NORMAL_DISCONT: xt = e.x; yt = e.y; repaint(); x2 = e.x; y2 = e.y; break; case ECLIPSE_BOLD_DISCONT: xt = e.x; yt = e.y; repaint(); x2 = e.x; y2 = e.y; break; default: break; } } return true; // Window killer routine, die window, die case Event.WINDOW_DESTROY: System.exit(0); return true; default: return false; } } // This program, _had_ double buffering, but netscape didn't // like it, so it is commented out. IE30 worked quite fine // and didn't use more than 10 megs of ram and a 50 meg swap // file, but N30 swapped 'till to the bitter end resulting out // of memory... That automagic garbage collection didn't work so // fine, nor did disposing buffer... // To avoid screen flicker, we override update and call paint(g) //public void update(Graphics g) { // paint(g); //} public void paint(Graphics g) { // The vectors where primitives are stored... int np = lines.size(); int ep = eclipses.size(); int ap = arcs.size(); // An offscreen imagebuffer is created also to remove // screen flicker //Image buffered_image = createImage(500, 300); //Graphics bg = buffered_image.getGraphics(); // First we draw all the primitives we have drawn // to the offscreen buffer... g.setColor(getForeground()); g.setPaintMode(); // Here we draw all the lines stored to the screen for (int i=0; i < np; i++) { Rectangle p = (Rectangle)lines.elementAt(i); if (p.width != -1) { g.drawLine(p.x, p.y, p.width, p.height); } else { g.drawLine(p.x, p.y, p.x, p.y); } } // And all the ellipses for (int j=0; j < ep; j++) { Rectangle q = (Rectangle)eclipses.elementAt(j); if (q.width != -1) { g.drawOval(q.x, q.y, q.width, q.height); } } // And the arcs for (int k=0; k < ap; k++) { Rectangle r = (Rectangle)arcs.elementAt(k); for(int l=0;l<361;l=l+10) { g.drawArc(r.x,r.y,r.width,r.height,l,10); l=l+10; } } // double buffering code, should work, doesn't if you don't // have 32 megs of ram and a 60 meg swap space and ie30. //bg.finalize(); //g.drawImage(buffered_image, 0, 0, null); //bg.dispose(); if (trackmode == TRACKING) { switch(drawmode) { case LINES_NORMAL_CONT: g.setXORMode(getBackground()); if (x2 != -1) { // erase the last line. g.drawLine(x1, y1, x2, y2); } g.setColor(getForeground()); g.setPaintMode(); if (x1 != -1) { // Draw the current line g.drawLine(x1, y1, xt, yt); } break; case LINES_BOLD_CONT: g.setXORMode(getBackground()); if (x2 != -1) { // erase last lines g.drawLine(x1, y1, x2, y2); g.drawLine(x1+1, y1+1, x2+1, y2+1); g.drawLine(x1-1, y1+1, x2-1, y2+1); g.drawLine(x1+1, y1-1, x2+1, y2-1); g.drawLine(x1-1, y1-1, x2-1, y2-1); g.drawLine(x1+1, y1, x2+1, y2); g.drawLine(x1, y1+1, x2, y2+1); g.drawLine(x1-1, y1, x2-1, y2); g.drawLine(x1, y1-1, x2, y2-1); } g.setColor(getForeground()); g.setPaintMode(); if (x1 != -1) { // Draw the current bold line g.drawLine(x1, y1, xt, yt); g.drawLine(x1+1, y1+1, x2+1, y2+1); g.drawLine(x1-1, y1+1, x2-1, y2+1); g.drawLine(x1+1, y1-1, x2+1, y2-1); g.drawLine(x1-1, y1-1, x2-1, y2-1); g.drawLine(x1+1, y1, x2+1, y2); g.drawLine(x1, y1+1, x2, y2+1); g.drawLine(x1-1, y1, x2-1, y2); g.drawLine(x1, y1-1, x2, y2-1); } break; case LINES_NORMAL_DISCONT: g.setXORMode(getBackground()); if((x2-x1)>0) { if((y2-y1)>0) { if (x2 != -1) { x1d = x1; x2d = xt; y1d = y1; y2d = yt; k = (((double)yt-(double)y1)/((double)xt-(double)x1)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y2d-y1d)>0 && (x2d-x1d)>0 && ((y2d-y1d)*(y2d-y1d)+(x2d-x1d)*(x2d-x1d))>36) { x1t = (int)x1d; x2t = (int)(x1d+kx); y1t = (int)y1d; y2t = (int)(y1d+ky); g.drawLine(x1t,y1t,x2t,y2t); x1d = x1d+2*kx; y1d = y1d+2*ky; } if((y2d-y1d)>0 && (x2d-x1d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; g.drawLine(x1t,y1t,x2t,y2t); } } g.setColor(getForeground()); g.setPaintMode(); if (x1 != -1) { x1d = x1; x2d = x2; y1d = y1; y2d = y2; k = (((double)y2-(double)y1)/((double)x2-(double)x1)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y2d-y1d)>0 && (x2d-x1d)>0 && ((y2d-y1d)*(y2d-y1d)+(x2d-x1d)*(x2d-x1d))>36) { x1t = (int)x1d; x2t = (int)(x1d+kx); y1t = (int)y1d; y2t = (int)(y1d+ky); g.drawLine(x1t,y1t,x2t,y2t); x1d = x1d+2*kx; y1d = y1d+2*ky; } if((y2d-y1d)>0 && (x2d-x1d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; g.drawLine(x1t,y1t,x2t,y2t); } } } else { if (x2 != -1) { x1d = x1; x2d = xt; y1d = y1; y2d = yt; k = (((double)y1-(double)yt)/((double)xt-(double)x1)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y1d-y2d)>0 && (x2d-x1d)>0 && ((y1d-y2d)*(y1d-y2d)+(x2d-x1d)*(x2d-x1d))>36) { x1t = (int)x1d; x2t = (int)(x1d+kx); y1t = (int)y1d; y2t = (int)(y1d-ky); g.drawLine(x1t,y1t,x2t,y2t); x1d = x1d+2*kx; y1d = y1d-2*ky; } if((y1d-y2d)>0 && (x2d-x1d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; g.drawLine(x1t,y1t,x2t,y2t); } } g.setColor(getForeground()); g.setPaintMode(); if (x1 != -1) { x1d = x1; x2d = x2; y1d = y1; y2d = y2; k = (((double)y1-(double)y2)/((double)x2-(double)x1)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y1d-y2d)>0 && (x2d-x1d)>0 && ((y1d-y2d)*(y1d-y2d)+(x2d-x1d)*(x2d-x1d))>36) { x1t = (int)x1d; x2t = (int)(x1d+kx); y1t = (int)y1d; y2t = (int)(y1d-ky); g.drawLine(x1t,y1t,x2t,y2t); x1d = x1d+2*kx; y1d = y1d-2*ky; } if((y1d-y2d)>0 && (x2d-x1d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; g.drawLine(x1t,y1t,x2t,y2t); } } } } else { if((y2-y1)>0) { if (x2 != -1) { x1d = x1; x2d = xt; y1d = y1; y2d = yt; k = (((double)yt-(double)y1)/((double)x1-(double)xt)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y2d-y1d)>0 && (x1d-x2d)>0 && ((y2d-y1d)*(y2d-y1d)+(x1d-x2d)*(x1d-x2d))>36) { x1t = (int)x1d; x2t = (int)(x1d-kx); y1t = (int)y1d; y2t = (int)(y1d+ky); g.drawLine(x1t,y1t,x2t,y2t); x1d = x1d-2*kx; y1d = y1d+2*ky; } if((y2d-y1d)>0 && (x1d-x2d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; g.drawLine(x1t,y1t,x2t,y2t); } } g.setColor(getForeground()); g.setPaintMode(); if (x1 != -1) { x1d = x1; x2d = x2; y1d = y1; y2d = y2; k = (((double)y2-(double)y1)/((double)x1-(double)x2)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y2d-y1d)>0 && (x1d-x2d)>0 && ((y2d-y1d)*(y2d-y1d)+(x1d-x2d)*(x1d-x2d))>36) { x1t = (int)x1d; x2t = (int)(x1d-kx); y1t = (int)y1d; y2t = (int)(y1d+ky); g.drawLine(x1t,y1t,x2t,y2t); x1d = x1d-2*kx; y1d = y1d+2*ky; } if((y2d-y1d)>0 && (x1d-x2d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; g.drawLine(x1t,y1t,x2t,y2t); } } } else { if (x2 != -1) { x1d = x1; x2d = xt; y1d = y1; y2d = yt; k = (((double)y1-(double)yt)/((double)x1-(double)xt)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y1d-y2d)>0 && (x1d-x2d)>0 && ((y1d-y2d)*(y1d-y2d)+(x1d-x2d)*(x1d-x2d))>36) { x1t = (int)x1d; x2t = (int)(x1d-kx); y1t = (int)y1d; y2t = (int)(y1d-ky); g.drawLine(x1t,y1t,x2t,y2t); x1d = x1d-2*kx; y1d = y1d-2*ky; } if((y1d-y2d)>0 && (x1d-x2d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; g.drawLine(x1t,y1t,x2t,y2t); } } g.setColor(getForeground()); g.setPaintMode(); if (x1 != -1) { x1d = x1; x2d = x2; y1d = y1; y2d = y2; k = (((double)y1-(double)y2)/((double)x1-(double)x2)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y1d-y2d)>0 && (x1d-x2d)>0 && ((y1d-y2d)*(y1d-y2d)+(x1d-x2d)*(x1d-x2d))>36) { x1t = (int)x1d; x2t = (int)(x1d-kx); y1t = (int)y1d; y2t = (int)(y1d-ky); g.drawLine(x1t,y1t,x2t,y2t); x1d = x1d-2*kx; y1d = y1d-2*ky; } if((y1d-y2d)>0 && (x1d-x2d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; g.drawLine(x1t,y1t,x2t,y2t); } } } } break; case LINES_BOLD_DISCONT: g.setXORMode(getBackground()); if((x2-x1)>0) { if((y2-y1)>0) { if (x2 != -1) { x1d = x1; x2d = xt; y1d = y1; y2d = yt; k = (((double)yt-(double)y1)/((double)xt-(double)x1)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y2d-y1d)>0 && (x2d-x1d)>0 && ((y2d-y1d)*(y2d-y1d)+(x2d-x1d)*(x2d-x1d))>36) { x1t = (int)x1d; x2t = (int)(x1d+kx); y1t = (int)y1d; y2t = (int)(y1d+ky); g.drawLine(x1t,y1t,x2t,y2t); g.drawLine(x1t+1,y1t+1,x2t+1,y2t+1); g.drawLine(x1t+1,y1t-1,x2t+1,y2t-1); g.drawLine(x1t-1,y1t+1,x2t-1,y2t+1); g.drawLine(x1t-1,y1t-1,x2t-1,y2t-1); g.drawLine(x1t+1,y1t,x2t+1,y2t); g.drawLine(x1t,y1t+1,x2t,y2t+1); g.drawLine(x1t-1,y1t,x2t-1,y2t); g.drawLine(x1t,y1t-1,x2t,y2t-1); x1d = x1d+2*kx; y1d = y1d+2*ky; } if((y2d-y1d)>0 && (x2d-x1d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; g.drawLine(x1t,y1t,x2t,y2t); g.drawLine(x1t+1,y1t+1,x2t+1,y2t+1); g.drawLine(x1t+1,y1t-1,x2t+1,y2t-1); g.drawLine(x1t-1,y1t+1,x2t-1,y2t+1); g.drawLine(x1t-1,y1t-1,x2t-1,y2t-1); g.drawLine(x1t+1,y1t,x2t+1,y2t); g.drawLine(x1t,y1t+1,x2t,y2t+1); g.drawLine(x1t-1,y1t,x2t-1,y2t); g.drawLine(x1t,y1t-1,x2t,y2t-1); } } g.setColor(getForeground()); g.setPaintMode(); if (x1 != -1) { x1d = x1; x2d = x2; y1d = y1; y2d = y2; k = (((double)y2-(double)y1)/((double)x2-(double)x1)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y2d-y1d)>0 && (x2d-x1d)>0 && ((y2d-y1d)*(y2d-y1d)+(x2d-x1d)*(x2d-x1d))>36) { x1t = (int)x1d; x2t = (int)(x1d+kx); y1t = (int)y1d; y2t = (int)(y1d+ky); g.drawLine(x1t,y1t,x2t,y2t); g.drawLine(x1t+1,y1t+1,x2t+1,y2t+1); g.drawLine(x1t+1,y1t-1,x2t+1,y2t-1); g.drawLine(x1t-1,y1t+1,x2t-1,y2t+1); g.drawLine(x1t-1,y1t-1,x2t-1,y2t-1); g.drawLine(x1t+1,y1t,x2t+1,y2t); g.drawLine(x1t,y1t+1,x2t,y2t+1); g.drawLine(x1t-1,y1t,x2t-1,y2t); g.drawLine(x1t,y1t-1,x2t,y2t-1); x1d = x1d+2*kx; y1d = y1d+2*ky; } if((y2d-y1d)>0 && (x2d-x1d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; g.drawLine(x1t,y1t,x2t,y2t); g.drawLine(x1t+1,y1t+1,x2t+1,y2t+1); g.drawLine(x1t+1,y1t-1,x2t+1,y2t-1); g.drawLine(x1t-1,y1t+1,x2t-1,y2t+1); g.drawLine(x1t-1,y1t-1,x2t-1,y2t-1); g.drawLine(x1t+1,y1t,x2t+1,y2t); g.drawLine(x1t,y1t+1,x2t,y2t+1); g.drawLine(x1t-1,y1t,x2t-1,y2t); g.drawLine(x1t,y1t-1,x2t,y2t-1); } } } else { if (x2 != -1) { x1d = x1; x2d = xt; y1d = y1; y2d = yt; k = (((double)y1-(double)yt)/((double)xt-(double)x1)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y1d-y2d)>0 && (x2d-x1d)>0 && ((y1d-y2d)*(y1d-y2d)+(x2d-x1d)*(x2d-x1d))>36) { x1t = (int)x1d; x2t = (int)(x1d+kx); y1t = (int)y1d; y2t = (int)(y1d-ky); g.drawLine(x1t,y1t,x2t,y2t); g.drawLine(x1t+1,y1t+1,x2t+1,y2t+1); g.drawLine(x1t+1,y1t-1,x2t+1,y2t-1); g.drawLine(x1t-1,y1t+1,x2t-1,y2t+1); g.drawLine(x1t-1,y1t-1,x2t-1,y2t-1); g.drawLine(x1t+1,y1t,x2t+1,y2t); g.drawLine(x1t,y1t+1,x2t,y2t+1); g.drawLine(x1t-1,y1t,x2t-1,y2t); g.drawLine(x1t,y1t-1,x2t,y2t-1); x1d = x1d+2*kx; y1d = y1d-2*ky; } if((y1d-y2d)>0 && (x2d-x1d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; g.drawLine(x1t,y1t,x2t,y2t); g.drawLine(x1t+1,y1t+1,x2t+1,y2t+1); g.drawLine(x1t+1,y1t-1,x2t+1,y2t-1); g.drawLine(x1t-1,y1t+1,x2t-1,y2t+1); g.drawLine(x1t-1,y1t-1,x2t-1,y2t-1); g.drawLine(x1t+1,y1t,x2t+1,y2t); g.drawLine(x1t,y1t+1,x2t,y2t+1); g.drawLine(x1t-1,y1t,x2t-1,y2t); g.drawLine(x1t,y1t-1,x2t,y2t-1); } } g.setColor(getForeground()); g.setPaintMode(); if (x1 != -1) { x1d = x1; x2d = x2; y1d = y1; y2d = y2; k = (((double)y1-(double)y2)/((double)x2-(double)x1)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y1d-y2d)>0 && (x2d-x1d)>0 && ((y1d-y2d)*(y1d-y2d)+(x2d-x1d)*(x2d-x1d))>36) { x1t = (int)x1d; x2t = (int)(x1d+kx); y1t = (int)y1d; y2t = (int)(y1d-ky); g.drawLine(x1t,y1t,x2t,y2t); g.drawLine(x1t+1,y1t-1,x2t+1,y2t-1); g.drawLine(x1t-1,y1t+1,x2t-1,y2t+1); g.drawLine(x1t-1,y1t-1,x2t-1,y2t-1); g.drawLine(x1t+1,y1t,x2t+1,y2t); g.drawLine(x1t,y1t+1,x2t,y2t+1); g.drawLine(x1t-1,y1t,x2t-1,y2t); g.drawLine(x1t,y1t-1,x2t,y2t-1); x1d = x1d+2*kx; y1d = y1d-2*ky; } if((y1d-y2d)>0 && (x2d-x1d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; g.drawLine(x1t,y1t,x2t,y2t); g.drawLine(x1t+1,y1t-1,x2t+1,y2t-1); g.drawLine(x1t-1,y1t+1,x2t-1,y2t+1); g.drawLine(x1t-1,y1t-1,x2t-1,y2t-1); g.drawLine(x1t+1,y1t,x2t+1,y2t); g.drawLine(x1t,y1t+1,x2t,y2t+1); g.drawLine(x1t-1,y1t,x2t-1,y2t); g.drawLine(x1t,y1t-1,x2t,y2t-1); } } } } else { if((y2-y1)>0) { if (x2 != -1) { x1d = x1; x2d = xt; y1d = y1; y2d = yt; k = (((double)yt-(double)y1)/((double)x1-(double)xt)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y2d-y1d)>0 && (x1d-x2d)>0 && ((y2d-y1d)*(y2d-y1d)+(x1d-x2d)*(x1d-x2d))>36) { x1t = (int)x1d; x2t = (int)(x1d-kx); y1t = (int)y1d; y2t = (int)(y1d+ky); g.drawLine(x1t,y1t,x2t,y2t); g.drawLine(x1t+1,y1t-1,x2t+1,y2t-1); g.drawLine(x1t-1,y1t+1,x2t-1,y2t+1); g.drawLine(x1t-1,y1t-1,x2t-1,y2t-1); g.drawLine(x1t+1,y1t,x2t+1,y2t); g.drawLine(x1t,y1t+1,x2t,y2t+1); g.drawLine(x1t-1,y1t,x2t-1,y2t); g.drawLine(x1t,y1t-1,x2t,y2t-1); x1d = x1d-2*kx; y1d = y1d+2*ky; } if((y2d-y1d)>0 && (x1d-x2d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; g.drawLine(x1t,y1t,x2t,y2t); g.drawLine(x1t+1,y1t-1,x2t+1,y2t-1); g.drawLine(x1t-1,y1t+1,x2t-1,y2t+1); g.drawLine(x1t-1,y1t-1,x2t-1,y2t-1); g.drawLine(x1t+1,y1t,x2t+1,y2t); g.drawLine(x1t,y1t+1,x2t,y2t+1); g.drawLine(x1t-1,y1t,x2t-1,y2t); g.drawLine(x1t,y1t-1,x2t,y2t-1); } } g.setColor(getForeground()); g.setPaintMode(); if (x1 != -1) { x1d = x1; x2d = x2; y1d = y1; y2d = y2; k = (((double)y2-(double)y1)/((double)x1-(double)x2)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y2d-y1d)>0 && (x1d-x2d)>0 && ((y2d-y1d)*(y2d-y1d)+(x1d-x2d)*(x1d-x2d))>36) { x1t = (int)x1d; x2t = (int)(x1d-kx); y1t = (int)y1d; y2t = (int)(y1d+ky); g.drawLine(x1t,y1t,x2t,y2t); g.drawLine(x1t+1,y1t-1,x2t+1,y2t-1); g.drawLine(x1t-1,y1t+1,x2t-1,y2t+1); g.drawLine(x1t-1,y1t-1,x2t-1,y2t-1); g.drawLine(x1t+1,y1t,x2t+1,y2t); g.drawLine(x1t,y1t+1,x2t,y2t+1); g.drawLine(x1t-1,y1t,x2t-1,y2t); g.drawLine(x1t,y1t-1,x2t,y2t-1); x1d = x1d-2*kx; y1d = y1d+2*ky; } if((y2d-y1d)>0 && (x1d-x2d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; g.drawLine(x1t,y1t,x2t,y2t); g.drawLine(x1t+1,y1t-1,x2t+1,y2t-1); g.drawLine(x1t-1,y1t+1,x2t-1,y2t+1); g.drawLine(x1t-1,y1t-1,x2t-1,y2t-1); g.drawLine(x1t+1,y1t,x2t+1,y2t); g.drawLine(x1t,y1t+1,x2t,y2t+1); g.drawLine(x1t-1,y1t,x2t-1,y2t); g.drawLine(x1t,y1t-1,x2t,y2t-1); } } } else { if (x2 != -1) { x1d = x1; x2d = xt; y1d = y1; y2d = yt; k = (((double)y1-(double)yt)/((double)x1-(double)xt)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y1d-y2d)>0 && (x1d-x2d)>0 && ((y1d-y2d)*(y1d-y2d)+(x1d-x2d)*(x1d-x2d))>36) { x1t = (int)x1d; x2t = (int)(x1d-kx); y1t = (int)y1d; y2t = (int)(y1d-ky); g.drawLine(x1t,y1t,x2t,y2t); g.drawLine(x1t+1,y1t-1,x2t+1,y2t-1); g.drawLine(x1t-1,y1t+1,x2t-1,y2t+1); g.drawLine(x1t-1,y1t-1,x2t-1,y2t-1); g.drawLine(x1t+1,y1t,x2t+1,y2t); g.drawLine(x1t,y1t+1,x2t,y2t+1); g.drawLine(x1t-1,y1t,x2t-1,y2t); g.drawLine(x1t,y1t-1,x2t,y2t-1); x1d = x1d-2*kx; y1d = y1d-2*ky; } if((y1d-y2d)>0 && (x1d-x2d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; g.drawLine(x1t,y1t,x2t,y2t); g.drawLine(x1t+1,y1t-1,x2t+1,y2t-1); g.drawLine(x1t-1,y1t+1,x2t-1,y2t+1); g.drawLine(x1t-1,y1t-1,x2t-1,y2t-1); g.drawLine(x1t+1,y1t,x2t+1,y2t); g.drawLine(x1t,y1t+1,x2t,y2t+1); g.drawLine(x1t-1,y1t,x2t-1,y2t); g.drawLine(x1t,y1t-1,x2t,y2t-1); } } g.setColor(getForeground()); g.setPaintMode(); if (x1 != -1) { x1d = x1; x2d = x2; y1d = y1; y2d = y2; k = (((double)y1-(double)y2)/((double)x1-(double)x2)); kx = Math.sqrt((36)/(1+k*k)); ky = k*kx; while((y1d-y2d)>0 && (x1d-x2d)>0 && ((y1d-y2d)*(y1d-y2d)+(x1d-x2d)*(x1d-x2d))>36) { x1t = (int)x1d; x2t = (int)(x1d-kx); y1t = (int)y1d; y2t = (int)(y1d-ky); g.drawLine(x1t,y1t,x2t,y2t); g.drawLine(x1t+1,y1t-1,x2t+1,y2t-1); g.drawLine(x1t-1,y1t+1,x2t-1,y2t+1); g.drawLine(x1t-1,y1t-1,x2t-1,y2t-1); g.drawLine(x1t+1,y1t,x2t+1,y2t); g.drawLine(x1t,y1t+1,x2t,y2t+1); g.drawLine(x1t-1,y1t,x2t-1,y2t); g.drawLine(x1t,y1t-1,x2t,y2t-1); x1d = x1d-2*kx; y1d = y1d-2*ky; } if((y1d-y2d)>0 && (x1d-x2d)>0) { x1t = (int)x1d; x2t = (int)x2d; y1t = (int)y1d; y2t = (int)y2d; g.drawLine(x1t,y1t,x2t,y2t); g.drawLine(x1t+1,y1t-1,x2t+1,y2t-1); g.drawLine(x1t-1,y1t+1,x2t-1,y2t+1); g.drawLine(x1t-1,y1t-1,x2t-1,y2t-1); g.drawLine(x1t+1,y1t,x2t+1,y2t); g.drawLine(x1t,y1t+1,x2t,y2t+1); g.drawLine(x1t-1,y1t,x2t-1,y2t); g.drawLine(x1t,y1t-1,x2t,y2t-1); } } } } break; case ECLIPSE_NORMAL_CONT: g.setXORMode(getBackground()); if (x2 != -1) { if((x2-x1)>0) { if((y2-y1)>0) { g.drawOval(x1, y1, x2-x1, y2-y1); } else { g.drawOval(x1, y2, x2-x1, y1-y2); } } else { if((y2-y1)>0) { g.drawOval(x2, y1, x1-x2, y2-y1); } else { g.drawOval(x2, y2, x2-x1, y2-y1); } } } g.setColor(getForeground()); g.setPaintMode(); if (x1 != -1) { if((xt-x1)>0) { if((yt-y1)>0) { g.drawOval(x1, y1, xt-x1, yt-y1); } else { g.drawOval(x1, yt, xt-x1, y1-yt); } } else { if((yt-y1)>0) { g.drawOval(xt, y1, x1-xt, yt-y1); } else { g.drawOval(xt, yt, x1-xt, y1-yt); } } } break; case ECLIPSE_BOLD_CONT: g.setXORMode(getBackground()); if (x2 != -1) { if((x2-x1)>0) { if((y2-y1)>0) { g.drawOval(x1, y1, x2-x1, y2-y1); g.drawOval(x1+1, y1+1, x2-x1, y2-y1); g.drawOval(x1+1, y1 , x2-x1, y2-y1); g.drawOval(x1+1, y1-1, x2-x1, y2-y1); g.drawOval(x1, y1-1, x2-x1, y2-y1); g.drawOval(x1-1, y1-1, x2-x1, y2-y1); g.drawOval(x1-1, y1 , x2-x1, y2-y1); g.drawOval(x1-1, y1+1, x2-x1, y2-y1); g.drawOval(x1, y1+1, x2-x1, y2-y1); } else { g.drawOval(x1, y2, x2-x1, y1-y2); g.drawOval(x1+1, y2+1, x2-x1, y1-y2); g.drawOval(x1+1, y2, x2-x1, y1-y2); g.drawOval(x1+1, y2-1, x2-x1, y1-y2); g.drawOval(x1, y2-1, x2-x1, y1-y2); g.drawOval(x1-1, y2-1, x2-x1, y1-y2); g.drawOval(x1-1, y2, x2-x1, y1-y2); g.drawOval(x1-1, y2+1, x2-x1, y1-y2); g.drawOval(x1, y2+1, x2-x1, y1-y2); } } else { if((y2-y1)>0) { g.drawOval(x2, y1, x1-x2, y2-y1); g.drawOval(x2+1, y1+1, x1-x2, y2-y1); g.drawOval(x2+1, y1, x1-x2, y2-y1); g.drawOval(x2+1, y1-1, x1-x2, y2-y1); g.drawOval(x2, y1-1, x1-x2, y2-y1); g.drawOval(x2-1, y1-1, x1-x2, y2-y1); g.drawOval(x2-1, y1, x1-x2, y2-y1); g.drawOval(x2-1, y1+1, x1-x2, y2-y1); g.drawOval(x2, y1+1, x1-x2, y2-y1); } else { g.drawOval(x2, y2, x2-x1, y2-y1); g.drawOval(x2+1, y2+1, x2-x1, y2-y1); g.drawOval(x2+1, y2, x2-x1, y2-y1); g.drawOval(x2+1, y2-1, x2-x1, y2-y1); g.drawOval(x2, y2-1, x2-x1, y2-y1); g.drawOval(x2-1, y2-1, x2-x1, y2-y1); g.drawOval(x2-1, y2, x2-x1, y2-y1); g.drawOval(x2-1, y2+1, x2-x1, y2-y1); g.drawOval(x2, y2+1, x2-x1, y2-y1); } } } g.setColor(getForeground()); g.setPaintMode(); if (x1 != -1) { if((xt-x1)>0) { if((yt-y1)>0) { g.drawOval(x1, y1, xt-x1, yt-y1); g.drawOval(x1+1, y1+1, xt-x1, yt-y1); g.drawOval(x1+1, y1, xt-x1, yt-y1); g.drawOval(x1+1, y1-1, xt-x1, yt-y1); g.drawOval(x1, y1-1, xt-x1, yt-y1); g.drawOval(x1-1, y1-1, xt-x1, yt-y1); g.drawOval(x1-1, y1, xt-x1, yt-y1); g.drawOval(x1-1, y1+1, xt-x1, yt-y1); g.drawOval(x1, y1+1, xt-x1, yt-y1); } else { g.drawOval(x1, yt, xt-x1, y1-yt); g.drawOval(x1+1, yt+1, xt-x1, y1-yt); g.drawOval(x1+1, yt, xt-x1, y1-yt); g.drawOval(x1+1, yt-1, xt-x1, y1-yt); g.drawOval(x1, yt-1, xt-x1, y1-yt); g.drawOval(x1-1, yt-1, xt-x1, y1-yt); g.drawOval(x1-1, yt, xt-x1, y1-yt); g.drawOval(x1-1, yt+1, xt-x1, y1-yt); g.drawOval(x1, yt+1, xt-x1, y1-yt); } } else { if((yt-y1)>0) { g.drawOval(xt, y1, x1-xt, yt-y1); g.drawOval(xt+1, y1+1, x1-xt, yt-y1); g.drawOval(xt+1, y1, x1-xt, yt-y1); g.drawOval(xt+1, y1-1, x1-xt, yt-y1); g.drawOval(xt, y1-1, x1-xt, yt-y1); g.drawOval(xt-1, y1-1, x1-xt, yt-y1); g.drawOval(xt-1, y1, x1-xt, yt-y1); g.drawOval(xt-1, y1+1, x1-xt, yt-y1); g.drawOval(xt, y1+1, x1-xt, yt-y1); } else { g.drawOval(xt, yt, x1-xt, y1-yt); g.drawOval(xt+1, yt+1, x1-xt, y1-yt); g.drawOval(xt+1, yt, x1-xt, y1-yt); g.drawOval(xt+1, yt-1, x1-xt, y1-yt); g.drawOval(xt, yt-1, x1-xt, y1-yt); g.drawOval(xt-1, yt-1, x1-xt, y1-yt); g.drawOval(xt-1, yt, x1-xt, y1-yt); g.drawOval(xt-1, yt+1, x1-xt, y1-yt); g.drawOval(xt, yt+1, x1-xt, y1-yt); } } } break; case ECLIPSE_NORMAL_DISCONT: g.setXORMode(getBackground()); if (x2 != -1) { if((xt-x1)>0) { if((yt-y1)>0) { for(int i=0;i<360;i=i+10) { g.drawArc(x1, y1, (x2-x1),(y2-y1),i,10); i=i+10; } } else { for(int i=0;i<360;i=i+10) { g.drawArc(x1, y2, (x2-x1),(y1-y2),i,10); i=i+10; } } } else { if((yt-y1)>0) { for(int i=0;i<360;i=i+10) { g.drawArc(x2, y1, (x1-x2),(y2-y1),i,10); i=i+10; } } else { for(int i=0;i<360;i=i+10) { g.drawArc(x2, y2, (x1-x2),(y1-y2),i,10); i=i+10; } } } } g.setColor(getForeground()); g.setPaintMode(); if (x1 != -1) { if((xt-x1)>0) { if((yt-y1)>0) { for(int i=0;i<360;i=i+10) { g.drawArc(x1, y1, (xt-x1),(yt-y1),i,10); i=i+10; } } else { for(int i=0;i<360;i=i+10) { g.drawArc(x1, yt, (xt-x1),(y1-yt),i,10); i=i+10; } } } else { if((yt-y1)>0) { for(int i=0;i<360;i=i+10) { g.drawArc(xt, y1, (x1-xt),(yt-y1),i,10); i=i+10; } } else { for(int i=0;i<360;i=i+10) { g.drawArc(xt, yt, (x1-xt),(y1-yt),i,10); i=i+10; } } } } break; case ECLIPSE_BOLD_DISCONT: g.setXORMode(getBackground()); if (x2 != -1) { if((xt-x1)>0) { if((yt-y1)>0) { for(int i=0;i<360;i=i+10) { g.drawArc(x1, y1, (x2-x1),(y2-y1),i,10); g.drawArc(x1+1, y1+1, (x2-x1),(y2-y1),i,10); g.drawArc(x1+1, y1-1, (x2-x1),(y2-y1),i,10); i=i+10; } } else { for(int i=0;i<360;i=i+10) { g.drawArc(x1, y2, (x2-x1),(y1-y2),i,10); g.drawArc(x1+1, y2+1, (x2-x1),(y1-y2),i,10); g.drawArc(x1+1, y2-1, (x2-x1),(y1-y2),i,10); i=i+10; } } } else { if((yt-y1)>0) { for(int i=0;i<360;i=i+10) { g.drawArc(x2, y1, (x1-x2),(y2-y1),i,10); g.drawArc(x2+1, y1+1, (x1-x2),(y2-y1),i,10); g.drawArc(x2+1, y1-1, (x1-x2),(y2-y1),i,10); i=i+10; } } else { for(int i=0;i<360;i=i+10) { g.drawArc(x2, y2, (x1-x2),(y1-y2),i,10); g.drawArc(x2+1, y2+1, (x1-x2),(y1-y2),i,10); g.drawArc(x2+1, y2-1, (x1-x2),(y1-y2),i,10); i=i+10; } } } } g.setColor(getForeground()); g.setPaintMode(); if (x1 != -1) { if((xt-x1)>0) { if((yt-y1)>0) { for(int i=0;i<360;i=i+10) { g.drawArc(x1, y1, (xt-x1),(yt-y1),i,10); g.drawArc(x1+1, y1+1, (xt-x1),(yt-y1),i,10); g.drawArc(x1+1, y1-1, (xt-x1),(yt-y1),i,10); i=i+10; } } else { for(int i=0;i<360;i=i+10) { g.drawArc(x1, yt, (xt-x1),(y1-yt),i,10); g.drawArc(x1+1, yt+1, (xt-x1),(y1-yt),i,10); g.drawArc(x1+1, yt-1, (xt-x1),(y1-yt),i,10); i=i+10; } } } else { if((yt-y1)>0) { for(int i=0;i<360;i=i+10) { g.drawArc(xt, y1, (x1-xt),(yt-y1),i,10); g.drawArc(xt+1, y1+1, (x1-xt),(yt-y1),i,10); g.drawArc(xt+1, y1-1, (x1-xt),(yt-y1),i,10); i=i+10; } } else { for(int i=0;i<360;i=i+10) { g.drawArc(xt, yt, (x1-xt),(y1-yt),i,10); g.drawArc(xt+1, yt+1, (x1-xt),(y1-yt),i,10); g.drawArc(xt+1, yt-1, (x1-xt),(y1-yt),i,10); i=i+10; } } } } break; default: break; } } } } // Set the controls for the heart of the program... class TikControls extends Panel { TikPanel target; public TikControls(TikPanel target) { this.target = target; setLayout(new FlowLayout()); setBackground(Color.lightGray); // Drawing tools Choice shapes = new Choice(); shapes.addItem("Lines"); shapes.addItem("Eclipse"); shapes.setBackground(Color.lightGray); add(shapes); // Linewidths Choice linewidth = new Choice(); linewidth.addItem("Normal"); linewidth.addItem("Bold"); linewidth.setBackground(Color.lightGray); add(linewidth); // Linestyles Choice style = new Choice(); style.addItem("Continuous"); style.addItem("Discontinuous"); style.setBackground(Color.lightGray); add(style); // CLS button Button clear = new Button(); clear.setLabel("Clear"); add(clear); } public void paint(Graphics g) { Rectangle r = bounds(); g.setColor(Color.lightGray); g.draw3DRect(0, 0, r.width, r.height, false); } // State transition controls - calls setDrawMode // from TikPanel which sets the drawing mode public boolean action(Event e, Object arg) { if (e.target instanceof Button) { target.clearscreen(); } else if (e.target instanceof Choice) { String choice = (String)arg; if (choice.equals("Lines")) { target.setDrawMode(TikPanel.LINES); } else if (choice.equals("Eclipse")) { target.setDrawMode(TikPanel.ECLIPSE); } else if (choice.equals("Normal")) { target.setDrawMode(TikPanel.NORMAL); } else if (choice.equals("Bold")) { target.setDrawMode(TikPanel.BOLD); } else if (choice.equals("Continuous")) { target.setDrawMode(TikPanel.CONT); } else if (choice.equals("Discontinuous")) { target.setDrawMode(TikPanel.DISCONT); } } return true; } } // Is this where