Button.java

/*
 * Copyright © 2011 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.sudokumaster;

import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;

public class Button extends View {
    public final static int BUTTON_NORMAL = 0;
    public final static int BUTTON_PRESSED = 1;

    private static final int TEXT_COLOR = 0x00CCCCCC;
    private static final int TEXT_PRESSED_COLOR = 0x00FFFFFF;
    private static final int BACKGROUND_COLOR = 0x004e2316;

    private String text = "";
    private volatile int state = BUTTON_NORMAL;

    private final Listener listener;

    public Button(String text, Listener listener) {
        super();
        this.text = text;
        this.listener = listener;
    }

    protected void paint(Graphics g) {
        g.setColor(BACKGROUND_COLOR);
        g.fillRoundRect(left, top, width, height, width/6, width/6);
        int c = TEXT_COLOR;
        switch (state) {
            case BUTTON_PRESSED:
                c = TEXT_PRESSED_COLOR;
                break;
        }
        g.setColor(c);
        final Font f = g.getFont();
        g.drawString(text, left + width/2, top + height/2 - f.getHeight()/2, Graphics.HCENTER | Graphics.TOP);
    }

    public void handlePointerEvent(int type, int x, int y) {
        if(!isVisible()) return;
        if(hits(x, y)) {
            changeState(type == View.POINTER_RELEASED ? BUTTON_NORMAL : BUTTON_PRESSED);
            if(type == View.POINTER_RELEASED) listener.onClick(this);
        } else if(type == View.POINTER_DRAGGED) {
            changeState(BUTTON_NORMAL);
        }
    }

    private void changeState(int newState) {
        if(state != newState) invalidate();
        state = newState;
    }

    public void keyEvent(int type) {
        if(type == KEY_RELEASED) {
            changeState(BUTTON_NORMAL);
            listener.onClick(this);
        } else {
            changeState(BUTTON_PRESSED);
        }
    }

    public static interface Listener {
        void onClick(Button b);
    }
}