Computer Science 252
Problem Solving with Java

Spring 2014, The College of Saint Rose

DoNotEnter Demo

A working demo of DoNotEnter will appear below. Click inside the applet to interact with it.



DoNotEnter BlueJ Project

Click here to download a BlueJ project for DoNotEnter.


DoNotEnter Source Code

The Java source code for DoNotEnter is below. Click on a file name to download it.


DoNotEnter.java

import objectdraw.*;
import java.awt.*;

/*
 * Example DoNotEnter: manipulate some "Do Not Enter" signs
 *
 * Jim Teresco, The College of Saint Rose, CSC 252, Spring 2014
 *
 * $Id: DoNotEnter.java 2431 2014-09-19 02:14:45Z terescoj $
 */

public class DoNotEnter extends WindowController {

    private DoNotEnterSign sign1, sign2;
    private boolean draggingSign1, draggingSign2;
    private Location lastMouse;
    
    public void begin() {
    
        sign1 = new DoNotEnterSign(new Location(100, 100), canvas);
        sign2 = new DoNotEnterSign(new Location(300, 150), canvas);
    }
    
    public void onMousePress(Location point) {
        
        lastMouse = point;
        draggingSign1 = sign1.contains(point);
        draggingSign2 = sign2.contains(point);
    
    }
    
    public void onMouseRelease(Location point) {

        if (draggingSign1) {
            sign1.move(point.getX() - lastMouse.getX(),
                       point.getY() - lastMouse.getY());
        }
        if (draggingSign2) {
            sign2.move(point.getX() - lastMouse.getX(),
                       point.getY() - lastMouse.getY());
        }
    
    }
   
    public void onMouseMove(Location point) {
    
    }
    
    public void onMouseDrag(Location point) {
    
        if (draggingSign1) {
            sign1.move(point.getX() - lastMouse.getX(),
                       point.getY() - lastMouse.getY());
        }
        if (draggingSign2) {
            sign2.move(point.getX() - lastMouse.getX(),
                       point.getY() - lastMouse.getY());
        }
        lastMouse = point;
    }
    
    public void onMouseEnter(Location point) {
    
        sign1.showCircle();
        sign2.showCircle();
    }
    
    public void onMouseExit(Location point) {
    
        sign1.hideCircle();
        sign2.hideCircle();
    }
}

DoNotEnterSign.java


/**
 * A sign that can be "do not enter" (symbolic) or blank, also
 * supports operations needed for dragging.
 * 
 * @author Jim Teresco
 */

import objectdraw.*;
import java.awt.*;

public class DoNotEnterSign {
    
    // some named constants for dimensions
    private static final double SIGN_SIZE = 80;
    private static final double CIRCLE_INSET = 5;
    private static final double CIRCLE_SIZE = SIGN_SIZE - (CIRCLE_INSET * 2);
    private static final double BAR_INSET = 10;
    private static final double BAR_HEIGHT = 10;
    private static final double BAR_WIDTH = SIGN_SIZE - (BAR_INSET * 2);
    private static final double POST_HEIGHT = 120;
    private static final double POST_WIDTH = 5;
    
    // sign components
    private FilledRect background;
    private FramedRect border;
    private FilledOval redCircle;
    private FilledRect whiteBar;
    private FilledRect post;
    
    public DoNotEnterSign(Location signBase, DrawingCanvas c) {
        
        // signBase is the point at the base of the sign where the post meets,
        // so some extra work is needed to compute positions
        background = new FilledRect(signBase.getX() - SIGN_SIZE/2, signBase.getY() - SIGN_SIZE,
                                    SIGN_SIZE, SIGN_SIZE, c);
        background.setColor(Color.white);
        
        border = new FramedRect(signBase.getX() - SIGN_SIZE/2, signBase.getY() - SIGN_SIZE,
                                SIGN_SIZE, SIGN_SIZE, c);
                                
        redCircle = new FilledOval(signBase.getX() - SIGN_SIZE/2 + CIRCLE_INSET,
                                   signBase.getY() - SIGN_SIZE + CIRCLE_INSET,
                                   CIRCLE_SIZE, CIRCLE_SIZE, c);
        redCircle.setColor(Color.red);
        
        whiteBar = new FilledRect(signBase.getX() - SIGN_SIZE/2 + BAR_INSET,
                                  signBase.getY() - SIGN_SIZE/2 - BAR_HEIGHT/2,
                                  BAR_WIDTH, BAR_HEIGHT, c);
        whiteBar.setColor(Color.white);                          
        
        post = new FilledRect(signBase.getX() - POST_WIDTH/2, signBase.getY(),
                              POST_WIDTH, POST_HEIGHT, c);
        post.setColor(Color.gray);
        
        
    }
    
    // we need to be able to move
    public void move(double dx, double dy) {
        
        background.move(dx, dy);
        border.move(dx, dy);
        redCircle.move(dx, dy);
        whiteBar.move(dx, dy);
        post.move(dx, dy);
    }
    
    // we need to be able to answer the contains question
    public boolean contains(Location p) {
        
        return border.contains(p) || post.contains(p);
    }
    
    // show the (possibly hidden) circle part of the sign
    public void showCircle() {
        
        redCircle.show();
    }
    
    // hide the circle part of the sign
    public void hideCircle() {
        
        redCircle.hide();
    }
}