SimpleDots.java
package npw;

import painter.SPainter;
import shapes.SCircle;

import javax.swing.*;
import java.awt.*;
import java.util.Scanner;

public class SimpleDots {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new SimpleDots();
            }
        });
    }

    public SimpleDots() {
        paintTheImage();
    }

    private void paintTheImage(){
        // Grab the input information
        int width = getNumber("width");
        int height = getNumber("height");
        int dotSpacing = getNumber("dot spacing");
        Color color = getColor("color (red, blue, or green)");
        // Establish the painter
        SPainter painter = new SPainter("Simple Dots", width, height);
        SCircle dot = new SCircle(5);

        // Move the painter to the upper left corner to get ready to paint the gradient
        painter.mfd(height/2);
        painter.tl(90);
        painter.mfd(width/2 - 10);
        painter.tl(90);
        painter.setColor(color);

        // Paint it!
        paintGradient(painter, dot, height, width, dotSpacing);
    }

    private static int getNumber(String prompt) {
        String nss = JOptionPane.showInputDialog(null,prompt+"?");
        Scanner scanner = new Scanner(nss);
        return scanner.nextInt();
    }

    private void paintGradient(SPainter painter, SCircle dot, int height, int width, int dotSpacing){
        int cols = 0;
        // Calcuate the number of columns. We want to fill the screen, but we don't want
        // any dots only half on the canvas, so we subtract some space.
        int nrOfCols = ( width / dotSpacing ) - 2;

        while (cols < nrOfCols){
            nextCol(painter, dotSpacing);
            paintColumn(painter, dot, height, dotSpacing);
            cols = cols + 1;
        }
    }

    private static Color getColor(String prompt) {
        String nss = JOptionPane.showInputDialog(null, prompt+"?");
        Scanner scanner = new Scanner(nss);
        String response = scanner.next();
        Color color = Color.black;
        if (response.equalsIgnoreCase("red"))
        {
            color = Color.RED;
        }
        else if (response.equalsIgnoreCase(("blue")))
        {
        color = Color.BLUE;
        }
        else if(response.equalsIgnoreCase("green"))
        {
        color = Color.GREEN;
        }

        return color;
    }

    private void paintOneDot(SPainter painter, SCircle dot) {
        painter.paint(dot);
    }


    // Dots are spaced tighter together near the bottom of the canvas.
    private void paintColumn(SPainter painter, SCircle dot, int height, int dotSpacing) {
        int travel = 0;
        int totalDistanceTraveled = 0;

        // Paint a row with decreasing distance between dots.
        while(totalDistanceTraveled < height - (dot.radius() * 3)) {
            travel = dotSpacing;
            totalDistanceTraveled = totalDistanceTraveled + travel;
            painter.mfd(travel);
            paintOneDot(painter, dot);
        }

        // Make the method invariant with respect to painter position.
        painter.mbk(totalDistanceTraveled);
    }

    // Moves the painter to the next column.
    private void nextCol(SPainter painter, int dotSpacing){
        painter.tl(90);
        painter.mfd(dotSpacing);
        painter.tr(90);
    }



}