Softkey.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.spacemission;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

/**
 * Custom softkey implementation
 */
public class Softkey {

    public final static int SOFTKEY_HEIGHT = 32;
    public final static int PLAY = 0;
    public final static int PAUSE = 1;
    public final static int NEW_GAME = 2;
    public final static int EXIT = 3;
    private Image background;
    private Image backgroundPressed;
    private Image label;
    private Listener listener;
    private boolean pressed;
    private boolean visible = true;
    private final int type;
    private int x = 0;
    private int y = 0;
    private int width = 0;
    private int height = 0;

    /**
     * Interface for listening softkey events
     */
    public interface Listener {

        void clicked(int type);
    }

    public Softkey(String labelPath, int type, Canvas canvas, Listener listener) {
        this.type = type;
        this.listener = listener;
        try {
            label = Image.createImage(labelPath);

            int displayWidth = canvas.getWidth();
            int displayHeight = canvas.getHeight();

            Image pattern = Image.createImage("/framework/softkey_background.png");
            width = displayWidth / 2;
            height = SOFTKEY_HEIGHT;
            x = type == EXIT ? width : 0;
            y = displayHeight - height;

            background = fillImage(pattern, width);
            pattern = Image.createImage("/framework/softkey_background_pressed.png");
            backgroundPressed = fillImage(pattern, width);
        }
        catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
    }

    /**
     * Render the softkey
     * @param g Graphics object
     */
    public void paint(Graphics g) {
        if (visible) {
            Image bg = pressed ? backgroundPressed : background;
            int offsetY = pressed ? 1 : 0;
            g.drawImage(bg, x, y, Graphics.LEFT | Graphics.TOP);
            g.drawImage(label, x + width / 2, y + height / 2 + offsetY,
                        Graphics.HCENTER | Graphics.VCENTER);
        }
    }

    public void pointerPressed(int x, int y) {
        if (visible) {
            pressed = contains(x, y);
        }
    }

    public void pointerReleased(int x, int y) {
        if (!visible) {
            return;
        }
        if (pressed && contains(x, y)) {
            listener.clicked(type);
        }
        pressed = false;
    }

    /**
     * Check whether a point is inside the sofkey bounding box
     * @param x
     * @param y
     */
    public boolean contains(int x, int y) {
        return x > this.x && x < this.x + width && y > this.y && y < this.y + height;
    }

    /**
     * Repeats background image horizontally to fill the softkey area
     * @param pattern
     * @param width
     * @return Result background image
     */
    private Image fillImage(Image pattern, int width) {
        Image img = Image.createImage(width, pattern.getHeight());
        Graphics g = img.getGraphics();
        int markerX = 0;
        while (markerX < width) {
            g.drawImage(pattern, markerX, 0, Graphics.LEFT | Graphics.TOP);
            markerX += pattern.getWidth();
        }
        return img;
    }

    public boolean isVisible() {
        return visible;
    }

    public void setVisible(boolean visible) {
        this.visible = visible;
    }

    public void setPosition(int x, int y) {
        this.x = x;
        this.y = y;
    }
}