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.weatherapp.components;

import java.util.Vector;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;

public class Button
        extends Sprite {

    private boolean enabled = true;
    private boolean pressed = false;
    private Vector listeners = new Vector();
    private Image releasedImg;
    private Image pressedImg;

    public interface Listener {

        void clicked(Button button);

        void selected(Button button);

        void deselected(Button button);
    }

    public Button(Image released, Image pressed) {
        super(released);
        releasedImg = released;
        pressedImg = pressed;
    }

    /**
     * Handles the pressed event
     */
    public boolean touchDown(int x, int y) {
        if (isVisible() && enabled && contains(x, y)) {
            pressed = true;
            updateImage();
            return true;
        }
        return false;
    }

    /**
     * Handles the released event
     */
    public boolean touchUp(int x, int y) {
        if (pressed) {
            pressed = false;
            updateImage();
            if (isVisible() && enabled && contains(x, y)) {
                notifyClicked();
                return true;
            }
        }
        return false;
    }

    public boolean contains(int x, int y) {
        return x >= getX() && x <= getX() + getWidth()
                && y >= getY() && y <= getY() + getHeight();
    }

    public void disable() {
        enabled = false;
    }

    public void enable() {
        enabled = true;
    }

    public void addListener(Listener listener) {
        if (!listeners.contains(this)) {
            listeners.addElement(listener);
        }
    }

    public void setPressedImg(Image pressedImg) {
        this.pressedImg = pressedImg;
        updateImage();
    }

    public void setReleasedImg(Image releasedImg) {
        this.releasedImg = releasedImg;
        updateImage();
    }

    public boolean isSeleted() {
        return pressed;
    }

    public void select() {
        if (!pressed) {
            toggle();
        }
    }

    public void deselect() {
        if (pressed) {
            toggle();
        }
    }

    public void toggle() {
        pressed = !pressed;
        updateImage();
        if (pressed) {
            notifySelected();
        }
        else {
            notifyDeselected();
        }
    }

    public void notifyClicked() {
        int length = listeners.size();
        for (int i = 0; i < length; i++) {
            ((Listener) listeners.elementAt(i)).clicked(this);
        }
    }

    public void notifySelected() {
        int length = listeners.size();
        for (int i = 0; i < length; i++) {
            ((Listener) listeners.elementAt(i)).selected(this);
        }
    }

    public void notifyDeselected() {
        int length = listeners.size();
        for (int i = 0; i < length; i++) {
            ((Listener) listeners.elementAt(i)).deselected(this);
        }
    }

    private void updateImage() {
        if (pressed) {
            setImage(pressedImg, pressedImg.getWidth(), pressedImg.getHeight());
        }
        else {
            setImage(releasedImg, releasedImg.getWidth(), releasedImg.getHeight());
        }
    }
}