package com.lunivore.gameoflife.view.swing;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import com.lunivore.gameoflife.domain.GameObserver;
import com.lunivore.gameoflife.domain.Grid;
public class ImageRenderer extends JPanel implements GameObserver {
private static final long serialVersionUID = 1L;
private final int width;
private final int height;
private final int scale;
private Grid cells = Grid.NULL;
// This is here for testing purposes
private GameObserver piggyBack = GameObserver.NULL;
public ImageRenderer(int width, int height, int scale) {
this.width = width;
this.height = height;
this.setName("image.renderer");
Dimension size = new Dimension(width * scale, height * scale);
this.setPreferredSize(size);
this.setMaximumSize(size);
this.setMinimumSize(size);
this.scale = scale;
}
public void gridChanged(Grid grid) {
this.cells = grid;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ImageRenderer.this.repaint();
piggyBack.gridChanged(ImageRenderer.this.cells);
}});
}
@Override
public void paint(Graphics g) {
super.paint(g);
for (int row = 0; row < height; row++) {
for (int column = 0; column < width; column++) {
Color color = cells.hasLife(column, row) ? Color.BLACK : Color.WHITE;
g.setColor(color);
g.fillRect(column * scale, row * scale, scale, scale);
g.setColor(Color.GRAY);
g.drawRect(column * scale, row * scale, scale, scale);
}
}
}
public void setPiggybackListener(GameObserver piggyBack) {
this.piggyBack = piggyBack;
piggyBack.gridChanged(cells);
}
}