IconButton.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.amaze.ui;

import java.io.IOException;

import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;

/**
 * Simple icon button.
 */
public class IconButton {
    // Constants
    // Button types
    public static final int EXIT = 0;
    public static final int INFO = 1;
    public static final int PAUSE = 2;
    public static final int VIEW_MODE = 3;
    
    // Icon filenames
    private static final String EXIT_NORMAL = "/graphics/exit-button-normal-30.png";
    private static final String EXIT_PRESSED = "/graphics/exit-button-pressed-30.png";
    private static final String INFO_NORMAL = "/graphics/info-button-normal-30.png";
    private static final String INFO_PRESSED = "/graphics/info-button-pressed-30.png";
    private static final String PAUSE_NORMAL = "/graphics/pause-button-normal-30.png";
    private static final String PAUSE_PRESSED = "/graphics/pause-button-pressed-30.png";
    private static final String VIEW_MODE_NORMAL = "/graphics/view-mode-button-normal-30.png";
    private static final String VIEW_MODE_PRESSED = "/graphics/view-mode-button-pressed-30.png";

    // Members
    private Image _normalImage = null;
    private Image _pressedImage = null;
    private final int _type;
    private boolean _pressed = false;

    /**
     * Constructor.
     * @param type The type of the image.
     */
    public IconButton(int type) {
        _type = type;
        
        // Load the images based on the type
        createImages(true);
    }

    /** 
     * @param pressed
     */
    public void setPressed(final boolean pressed) {
        _pressed = pressed;
    }

    /** 
     * @return True if the button is pressed, false otherwise.
     */
    public final boolean pressed() {
        return _pressed;
    }

    /**
     * Rotates the button image based on the orientation. 
     * @param isPortrait If false, will rotate the images 90 degrees.
     */
    public void setIsPortrait(final boolean isPortrait) {
        createImages(isPortrait);
    }

    /**
     * Paints the button.
     * @param graphics
     * @param x
     * @param y
     */
    public void paint(Graphics graphics, int x, int y) {
        if (_pressed && _pressedImage != null) {
            graphics.drawImage(_pressedImage, x,  y, Graphics.TOP | Graphics.LEFT);
        }
        else if (_normalImage != null) {
            graphics.drawImage(_normalImage, x,  y, Graphics.TOP | Graphics.LEFT);
        }
    }

    /**
     * Creates and returns a new image or null in case of failure.
     * @param source The image filename.
     * @param isPortrait If false, will rotate the image 90 degrees.
     * @return The newly created image or null in case of failure.
     */
    private Image createImage(final String source,
                              final boolean isPortrait)
    {
        Image image = null;
        
        try {
            image = Image.createImage(source);
            
            if (!isPortrait && image != null) {
                // Rotate the image
                image = Image.createImage(image, 0, 0,
                            image.getWidth(), image.getHeight(),
                            Sprite.TRANS_ROT90);
            }
        }
        catch (IOException e) {}
        
        return image;
    }

    /**
     * Loads the button images based on the type.
     * @param isPortrait
     */
    private final void createImages(final boolean isPortrait) {
        switch (_type) {
        case EXIT: {
            _normalImage = createImage(EXIT_NORMAL, isPortrait);
            _pressedImage = createImage(EXIT_PRESSED, isPortrait);
            break;
        }
        case INFO: {
            _normalImage = createImage(INFO_NORMAL, isPortrait);
            _pressedImage = createImage(INFO_PRESSED, isPortrait);
            break;
        }
        case PAUSE: {
            _normalImage = createImage(PAUSE_NORMAL, isPortrait);
            _pressedImage = createImage(PAUSE_PRESSED, isPortrait);
            break;
        }
        case VIEW_MODE: {
            _normalImage = createImage(VIEW_MODE_NORMAL, isPortrait);
            _pressedImage = createImage(VIEW_MODE_PRESSED, isPortrait);
            break;
        }
        }
    }
}