git @ Cat's Eye Technologies yoob / master src / PlayfieldDepiction.java
master

Tree @master (Download .tar.gz)

PlayfieldDepiction.java @masterraw · history · blame

/*
 * A PlayfieldDepiction is an AbstractDepiction that depicts a Playfield.
 * The source code in this file has been placed into the public domain.
 */
package tc.catseye.yoob;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Dimension;

public class PlayfieldDepiction extends AbstractDepiction {
    private Playfield p;
    private int minX, minY, maxX, maxY;
    private int displayMinX, displayMinY, displayMaxX, displayMaxY;
    private int sizeX, sizeY;
    private int width, height;
    private int displaySizeX, displaySizeY;
    private int displayWidth, displayHeight;
    private int displayOffsetX, displayOffsetY;

    public void setPlayfield(Playfield p) {
        this.p = p;
    }

    private void recomputeBounds() {
        displayMinX = minX = p.getMinX().intValue();
        displayMinY = minY = p.getMinY().intValue();
        displayMaxX = maxX = p.getMaxX().intValue();
        displayMaxY = maxY = p.getMaxY().intValue();
      
        for (int i = 0; i < p.numCursors(); i++) {
            Cursor c = p.getCursor(i);
            int cx = c.getX().intValue();
            int cy = c.getY().intValue();
            if (cx > displayMaxX) displayMaxX = cx;
            if (cx < displayMinX) displayMinX = cx;
            if (cy > displayMaxY) displayMaxY = cy;
            if (cy < displayMinY) displayMinY = cy;
        }

        sizeX = (maxX - minX) + 1;
        sizeY = (maxY - minY) + 1;
        width = cellWidth * sizeX;
        height = cellHeight * sizeY;

        displaySizeX = (displayMaxX - displayMinX) + 1;
        displaySizeY = (displayMaxY - displayMinY) + 1;
        displayWidth = cellWidth * displaySizeX;
        displayHeight = cellHeight * displaySizeY;

        displayOffsetX = (minX - displayMinX) * cellWidth;
        displayOffsetY = (minY - displayMinY) * cellHeight;
    }

    public void resize() {
        if (p == null) return;
        recomputeBounds();
        Dimension area = new Dimension(displayWidth + margin * 2, displayHeight + margin * 2);
        setPreferredSize(area);
        revalidate();
        repaint();
    }

    protected void depict(Graphics g) {
        if (p == null || v == null) return;

        g.setColor(Color.yellow); // view.getSurroundingColor()
        Rectangle r = g.getClipBounds();
        g.fillRect(r.x, r.y, r.width, r.height);

        recomputeBounds();

        int marginX = displayOffsetX + margin;
        int marginY = displayOffsetY + margin;
        g.setColor(Color.black); // view.getBorderColor()
        g.drawRect(marginX - 1, marginY - 1, width + 1, height + 1);

        for (int y = minY; y <= maxY; y++) {
            int paintY = (y - minY) * cellHeight;
            for (int x = minX; x <= maxX; x++) {
                Element e = p.get(new IntegerElement(x), new IntegerElement(y));
                int paintX = (x - minX) * cellWidth;
                v.renderBackground(g, e, marginX + paintX, marginY + paintY, cellWidth, cellHeight);
            }
        }

        if (gridLines) {
            g.setColor(Color.lightGray);
            int rightMarginX = marginX + (maxX - minX + 1) * cellWidth;
            int bottomMarginY = marginY + (maxY - minY + 1) * cellHeight;
            for (int y = minY + 1; y <= maxY; y++) {
                int paintY = marginY + (y - minY) * cellHeight;
                g.drawLine(marginX, paintY, rightMarginX, paintY);
            }
            for (int x = minX + 1; x <= maxX; x++) {
                int paintX = marginX + (x - minX) * cellWidth;
                g.drawLine(paintX, marginY, paintX, bottomMarginY);
            }
        }

        for (int y = minY; y <= maxY; y++) {
            int paintY = (y - minY) * cellHeight;
            for (int x = minX; x <= maxX; x++) {
                Element e = p.get(new IntegerElement(x), new IntegerElement(y));
                int paintX = (x - minX) * cellWidth;
                v.render(g, e, marginX + paintX, marginY + paintY, cellWidth, cellHeight);
            }
        }
        
        int numCursors = p.numCursors();
        for (int c = 0; c < numCursors; c++) {
            Cursor cursor = p.getCursor(c);
            int cx = cursor.getX().intValue();
            int cy = cursor.getY().intValue();
            int paintX = (cx - minX) * cellWidth;
            int paintY = (cy - minY) * cellHeight;
            v.render(g, cursor, marginX + paintX, marginY + paintY, cellWidth, cellHeight);
        }
    }
}