Button.java

/**
* Copyright (c) 2012-2013 Nokia Corporation. All rights reserved.
* Nokia and Nokia Connecting People are registered trademarks of Nokia Corporation. 
* Oracle and Java are trademarks or registered trademarks of Oracle and/or its
* affiliates. Other product and company names mentioned herein may be trademarks
* or trade names of their respective owners. 
* See LICENSE.TXT for license information.
*/
package com.nokia.example.racer.views.components;

import com.nokia.example.racer.Main;
import com.nokia.example.racer.helpers.ImageLoader;
import java.io.IOException;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

/*
 * A clickable image item
 */
public abstract class Button
    extends Item {

    protected Image highlighted;  // image when clicked
    private boolean isHighlighted;

    public Button() {
    }

    /**
     * Initializes Button images.
     *
     * @param imgUrlUnpressed Image to be displayed when button is not pressed
     * @param imgUrlPressed Image to be displayed when button is pressed
     */
    public final void init(String imgUrlUnpressed, String imgUrlPressed) {
        ImageLoader loader = ImageLoader.getInstance();
        try {
            image = loader.loadImage(imgUrlUnpressed);
            highlighted = loader.loadImage(imgUrlPressed);
        }
        catch (IOException io) {
            // Nothing to do here.
        }
    }

    /**
     * Event when button is pressed
     */
    public abstract void onPress();

    /**
     * Event when button is released
     */
    public abstract void onRelease();

    /**
     * Renders the button image (highlight image if pressed).
     *
     * @param g Graphics object
     */
    public void render(Graphics g) {
        int anchor = Graphics.TOP | Graphics.LEFT;
        if (isHighlighted) {
            g.drawImage(highlighted, x, y, anchor);
        }
        else {
            g.drawImage(image, x, y, anchor);
        }
    }

    /**
     * Tells whether the given point is inside the button area.
     *
     * @param x x coordinate of the point
     * @param y y coordinate of the point
     * @return true if the given point is inside, false otherwise
     */
    public final boolean isInsideButton(int x, int y) {
        return getArea().isPointInside(x, y);
    }

    /**
     * When you add a button to canvas you must call this method from the
     * pointerPressed method in canvas class to make it work.
     * @see javax.microedition.lcdui.Canvas#pointerPressed(int x, int y)
     */
    public void pointerPressed(int x, int y) {
        if (isInsideButton(x, y)) {
            isHighlighted = true;
            onPress();
        }
        else {
            isHighlighted = false;
        }
    }

    /**
     * When you add a button to canvas you must call this method from the
     * pointerReleased method in canvas class to make it work.
     * @see javax.microedition.lcdui.Canvas#pointerReleased(int x, int y)
     */
    public void pointerReleased(int x, int y) {
        if (Main.gesturesSupported) {
            isHighlighted = false;
        }
        if (isInsideButton(x, y)) {
            onRelease();
        }
    }

    public void setActive() {
        isHighlighted = true;
    }

    public void setInactive() {
        isHighlighted = false;
    }

    public boolean isPressed() {
        return isHighlighted;
    }

    public Image getHighlighted() {
        return highlighted;
    }

    private final Rectangle getArea() {
        return new Rectangle(x, y, image.getWidth(), image.getHeight());
    }
}