// Purpose.?Rubber-band drawing demo (less-than-OO, brute force design)

import java.awt.*;
import java.awt.event.*;

public class RubberBandBrute extends牋?Canvas
牋牋牋牋牋牋牋牋牋牋牋牋牋牋 implements MouseListener, MouseMotionListener {
abstract class Element {牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋?//3
牋牋?protected int xo, yo;
牋牋?public abstract void draw( Graphics g );
}

class Line extends Element {
牋牋?private int xe, ye;
牋牋?public Line( int a, int b, int x, int y ) {
牋牋牋xo = a;yo = b;xe = x;ye = y;
牋牋?}
牋牋?public void draw( Graphics g ) {
牋牋牋牋 g.drawLine( xo, yo, xe, ye );
}? }

class Rectangle extends Element {
牋牋?protected int w, h;
牋牋?public Rectangle( int x, int y, int ww, int hh ) {
牋牋牋牋 xo = x;yo = y;w = ww;h = hh;
牋牋?}
牋牋?public void draw( Graphics g ) {
牋牋牋牋 g.drawRect( xo, yo, w, h );
}? }

class Circle extends Rectangle {
牋牋?public Circle( int x, int y, int ww, int hh )? {
牋牋牋牋 super( x, y, ww, hh );
牋牋?}
牋牋?public void draw( Graphics g ) {
牋牋牋牋 g.drawOval( xo, yo, w, h );
}? }

private int牋牋牋 x1, y1, x2, y2, total = 0;
private Element[] drawingList = new Element[30];牋牋牋牋牋牋牋牋牋牋? //2
private int牋牋牋 currentState;
private final int LINE = 1, RECT = 2, CIRC = 3;

public RubberBandBrute() {
牋牋?Frame f = new Frame( "RubberBandBrute" );
牋牋?f.add( this );? f.setSize( 300, 300 );? f.setVisible( true );
牋牋? addMouseListener( this );
牋牋? addMouseMotionListener( this );
}

public void mouseEntered( MouseEvent e ) { }
public void mouseExited(? MouseEvent e ) { }
public void mouseClicked( MouseEvent e ) { }
public void mousePressed( MouseEvent e ) {
牋牋?if ((e.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK)
牋牋牋牋 currentState = CIRC;牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋?//4
牋牋?else if ((e.getModifiers() & InputEvent.BUTTON3_MASK)
牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋?== InputEvent.BUTTON3_MASK)
牋牋牋牋 currentState = RECT;牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋? //4
牋牋?else
牋牋牋牋 currentState = LINE;牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋? //4
牋牋?x1 = x2 = e.getX();
牋牋?y1 = y2 = e.getY();
}
public void mouseReleased( MouseEvent e ) {
牋牋?if (currentState == LINE)牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋? //6
牋牋牋牋 drawingList[total++] = new Line( x1, y1, e.getX(), e.getY() );
牋牋?else if (currentState == RECT)
牋牋牋牋 drawingList[total++] =
牋牋牋牋牋?new Rectangle( Math.min(x1,e.getX()), Math.min(y1,e.getY()),
牋牋牋牋牋牋牋牋牋牋牋牋牋 Math.abs(e.getX()-x1), Math.abs(e.getY()-y1) );
牋牋? else
牋牋牋牋 drawingList[total++] =
牋牋牋牋牋? new Circle( Math.min(x1,e.getX()), Math.min(y1,e.getY()),
牋牋牋牋牋牋牋牋牋牋牋?Math.abs(e.getX()-x1), Math.abs(e.getY()-y1) );
}

public void mouseMoved(MouseEvent e) { } // MouseMotionListener: btn up
public void mouseDragged(MouseEvent e) { // MouseMotionListener: btn down
牋牋?Graphics g = getGraphics();
牋牋?g.setXORMode( getBackground() );牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋 //1
牋牋?if (currentState == LINE)牋牋牋牋牋?// undraw previous position//5
牋牋牋牋 g.drawLine( x1, y1, x2, y2 );
牋牋?else if (currentState == RECT)
牋牋牋牋 g.drawRect( Math.min(x1,x2), Math.min(y1,y2),
牋牋牋牋牋牋牋牋牋牋 Math.abs(x2-x1), Math.abs(y2-y1) );
牋牋?else
牋牋牋牋 g.drawOval( Math.min(x1,x2), Math.min(y1,y2),
牋牋牋牋牋牋牋牋牋牋 Math.abs(x2-x1), Math.abs(y2-y1) );
牋牋?x2 = e.getX();
牋牋?y2 = e.getY();
牋牋?if (currentState == LINE)牋牋牋牋 牋?/span>// draw current position
牋牋牋牋 g.drawLine( x1, y1, x2, y2 );
牋牋?else if (currentState == RECT)
牋牋牋牋 g.drawRect( Math.min(x1,x2), Math.min(y1,y2),
牋牋牋牋牋牋牋牋牋牋 Math.abs(x2-x1), Math.abs(y2-y1) );
牋牋?else
牋牋牋牋 g.drawOval( Math.min(x1,x2), Math.min(y1,y2),
牋牋牋牋牋牋牋牋牋牋 Math.abs(x2-x1), Math.abs(y2-y1) );
牋牋? g.dispose();
}

public void paint( Graphics g ) {
牋牋?for (int i=0; i < total; i++) drawingList[i].draw( g );
}
public static void main( String[] args ) {
牋牋?new RubberBandBrute();
}?}



// Purpose.?OO rubber-band design (no: case stmt, state attribute, protected)

import java.awt.*;
import java.awt.event.*;

public class RubberBandBetter extends牋?Canvas
牋牋牋牋牋牋牋牋牋牋牋牋牋牋?implements MouseListener, MouseMotionListener {
abstract class Element {
牋牋?private int xo, yo, xe, ye;牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋 //12
牋牋?public Element( int x, int y ) {
牋牋牋牋 xo = xe = x;yo = ye = y;
牋牋?}
牋牋?// move() is the TEMPLATE METHOD, drawDerived() is the placeholder
牋牋?public void move( int x, int y ) {牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋 //8
牋牋牋牋 Graphics g = getGraphics();
牋牋牋牋 g.setXORMode( getBackground() );
牋牋牋牋 drawDerived( g, xo, yo, xe, ye );// undraw previous artifact
牋牋牋牋 xe = x;?ye = y;
牋牋牋牋 drawDerived( g, xo, yo, xe, ye );// draw current artifact
牋牋牋牋 g.dispose();
牋牋?}
牋牋?public void draw( Graphics g ) {牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋?//11
牋牋牋牋 drawDerived( g, xo, yo, xe, ye );
牋牋?}
牋牋?public abstract void drawDerived( Graphics g, int a, int b, int x, int y);
}

class Line extends Element {
牋牋?public Line( int x, int y ) { super( x, y ); }
牋牋?public void drawDerived( Graphics g, int a, int b, int x, int y ) {
牋牋牋牋 g.drawLine( a, b, x, y );
}? }

class Rectangle extends Element {
牋牋?public Rectangle( int x, int y ) { super( x, y ); }
牋牋?public void drawDerived( Graphics g, int a, int b, int x, int y ) {
牋牋牋牋 g.drawRect( Math.min(a,x), Math.min(b,y),牋牋牋牋牋牋牋牋牋牋?//14
牋牋牋牋牋牋牋牋牋牋 Math.abs(x-a), Math.abs(y-b) );牋牋牋牋牋牋牋牋牋?//13
}? }

class Circle extends Element {
牋牋?public Circle( int x, int y ) { super( x, y ); }
牋牋?public void drawDerived( Graphics g, int a, int b, int x, int y ) {
牋牋牋牋 g.drawOval( Math.min(a,x), Math.min(b,y),牋牋牋牋牋牋牋牋牋牋?//14
牋牋牋牋牋牋牋牋牋牋 Math.abs(x-a), Math.abs(y-b) );牋牋牋牋牋牋牋牋牋?//13
}? }

// STATE design pattern - the last ele of drawingList is the current STATE
private Element[] drawingList = new Element[30];
private int牋牋牋 total = 0;

public RubberBandBetter() {
牋牋?Frame f = new Frame( "RubberBandBetter" );
牋牋? f.add( this );?f.setSize( 300, 300 );?f.setVisible( true );
牋牋?addMouseListener( this );
牋牋?addMouseMotionListener( this );
}

public void mouseEntered(? MouseEvent e ) { }
public void mouseExited(MouseEvent e ) { }
public void mouseClicked(?MouseEvent e ) { }

// STATE design pattern - case statement gone
public void mouseReleased( MouseEvent e ) { }牋牋牋牋牋牋牋牋牋牋牋? //10

public void mousePressed(?MouseEvent e ) {
牋牋?if ((e.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK)
牋牋牋牋 drawingList[total++] = new Circle( e.getX(), e.getY() );牋牋牋?//9
牋牋?else if ((e.getModifiers() & InputEvent.BUTTON3_MASK)
牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋?== InputEvent.BUTTON3_MASK)
牋牋牋牋 drawingList[total++] = new Rectangle( e.getX(), e.getY() );牋牋 //9
牋牋?else
牋牋牋牋 drawingList[total++] = new Line( e.getX(), e.getY() );牋牋牋牋?//9
}

public void mouseMoved(MouseEvent e) { } // MouseMotionListener: btn up

// STATE design pattern - case statement gone
public void mouseDragged(MouseEvent e) { // MouseMotionListener: btn down
牋牋? drawingList[total-1].move( e.getX(), e.getY() );牋牋牋牋牋牋牋牋牋 //7
}

public void paint( Graphics g ) {
牋牋?for (int i=0; i < total; i++) drawingList[i].draw( g );
}
public static void main( String[] args ) {
牋牋?new RubberBandBetter();
}?}