Button.java

/*
 * Copyright © 2012 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) {
        }
    }

    /*
     * 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.
     */
    public void pointerPressed(int x, int y) {
        if (isInsideButton(x, y)) {
            isHighlighted = true;
            onPress();
        }
        else {
            isHighlighted = false;
        }
    }

    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());
    }
}