import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
/**
* The "model" (vs. user interface) part of this program
*/
public class Model {
/** Model or application data */
private ArrayList<Square> squares = new ArrayList<Square> ();
private boolean drawX = false;
private Canvas canvas;
private Square current; //*2 Private = no other class can cause the bug
public Model (int n, Canvas canvas) {
// Stash ivar
this.canvas = canvas;
// Create the n objects
for (int i=0; i<n; i++) {
squares.add (new Square(canvas));
}
// Initialize to some arbitrary square so current is never null
Square current = squares.get(0); //*1 Initialize current
// assert => we expect this always to be true
assert current != null; //*4 Should always be true
}
public void draw (Graphics g) {
// The background X
if (drawX) {
Dimension size = canvas.getSize();
g.drawLine (0, 0, size.width, size.height);
g.drawLine (0, size.height, size.width, 0);
}
// Enumerate our list
for (Square s: squares) {
// N.B. (s==current) is a boolean expr,
// evaluates to true or false
s.draw (g, s==current);
}
assert current != null; //*4
}
public void setX (boolean newX) {
drawX = newX;
canvas.repaint();
assert current != null; //*4
}
Square getCurrent () { //*3 We provided read-only access to current
assert current != null; //*4
return current; //*3
}
public void doMouse (Point p) {
for (Square s: squares) {
if (s.isInside(p)) {
current = s;
break;
}
}
canvas.repaint();
assert current != null; //*4
}
}