// Squares applet baseclass // Draw two squares, then draw something interesting import java.applet.*; import java.awt.*; import java.lang.Math; import TransformableSquare; public abstract class SquaresApplet extends DoubleBufferApplet { Graphics g; TransformableSquare square1, square2, activeSquare; int oldX, oldY; public boolean keyDown(Event e, int key) { if (e.x > 0 && e.y > 0) { // hack around NS/Win bug if (square1.inside(e.x, e.y)) // doesn't set e.x,e.y activeSquare = square1; // on keyDown, bastards else if (square2.inside(e.x, e.y)) activeSquare = square2; else return true; // nothing to do } else { // just let activeSquare be set as before.. } switch (key) { case Event.LEFT: case 'j': activeSquare.rotate(2 * Math.PI * -9 / 360); break; case Event.RIGHT: case 'l': activeSquare.rotate(2 * Math.PI * 9 / 360); break; case Event.UP: case 'i': activeSquare.scale(1.1); break; case Event.DOWN: case 'k': activeSquare.scale(0.9); break; } redrawImage(); return true; } public boolean mouseDown(Event e, int mouseX, int mouseY) { if (square1.inside(mouseX, mouseY)) activeSquare = square1; else if (square2.inside(mouseX, mouseY)) activeSquare = square2; else activeSquare = null; oldX = mouseX; oldY = mouseY; Graphics g = this.getGraphics(); g.setXORMode(this.getBackground()); if (activeSquare != null) g.drawPolygon(activeSquare.getPolygon()); return true; } // move an XOR square around so the user can see what's going on public boolean mouseDrag(Event e, int mouseX, int mouseY) { Graphics g = this.getGraphics(); g.setXORMode(this.getBackground()); if (activeSquare != null && mouseX != oldX || mouseY != oldY) { g.drawPolygon(activeSquare.getPolygon()); activeSquare.translate(mouseX - oldX, mouseY - oldY); g.drawPolygon(activeSquare.getPolygon()); oldX = mouseX; oldY = mouseY; } return true; } public boolean mouseUp(Event e, int mouseX, int mouseY) { this.getGraphics().setPaintMode(); if (activeSquare != null) activeSquare.translate(mouseX - oldX, mouseY - oldY); redrawImage(); return true; } abstract public void redrawImage(); }