/** * 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.explonoid.menu; import com.nokia.example.explonoid.ImageHelper; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Image; import javax.microedition.lcdui.game.Sprite; /** * Base class for menus. */ public class Menu { public static final int POINTER_PRESSED = 0; public static final int POINTER_DRAGGED = 1; public static final int POINTER_RELEASED = 2; private final MenuItem[] items; private final Listener listener; /** * Constructor * @param capacity Amount of menu items * @param listener Listener for menu events */ protected Menu(int capacity, Listener listener) { items = new MenuItem[capacity]; this.listener = listener; } /** * Sets menu item to given index * @param i Index for the item * @param item Menu item */ protected final void setItem(int i, MenuItem item) { items[i] = item; } /** * Get a menu item * @param i Index of the wanted menu item * @return Menu item as a MenuItem object */ protected final MenuItem getItem(int i) { return items[i]; } /** * Render the menu items */ protected void paint(Graphics g) { for (int i = 0; i < items.length; i++) { items[i].paint(g); } } /** * Sets the a menu item in selected state * @param selected Index of the item to be set selected */ public void selectItem(int selected) { for (int i = 0; i < items.length; i++) { items[i].setSelected(i == selected); } } /** * Get the index of currently selected menu item. * @return Currently selected item or -1, if none is selected */ private int getSelected() { for (int i = 0; i < items.length; i++) { if (items[i].isSelected()) { return i; } } return -1; } /** * Select next menu item. Wraps to first item, if current item is the last one. */ public void selectNext() { selectItem((getSelected() + 1) % items.length); // Skip, if the item is hidden if(!getItem(getSelected()).isVisible()) { selectNext(); } } /** * Select previous menu item. Wraps to last item, if current item is the first one. */ public void selectPrev() { selectItem((Math.max(getSelected(), 0) - 1 + items.length) % items.length); // Skip, if the item is hidden if(!getItem(getSelected()).isVisible()) { selectPrev(); } } /** * Manually cause clicked event on the highlighted item */ public void clickSelected() { listener.itemClicked(getSelected()); } /** * Handle pointer events * @param type POINTER_PRESSED, POINTER_DRAGGED or POINTER_RELEASED * @param x * @param y */ public void pointerEvent(int type, int x, int y) { for (int i = 0; i < items.length; i++) { if (items[i].hits(x, y)) { if (type == POINTER_RELEASED) { listener.itemClicked(i); items[i].setSelected(false); } else { selectItem(i); } return; } } selectItem(-1); } /** * Loads a sprite * @param fileName * @param lines Amount of vertical frames * @param scaling Scaling factor * @return Loaded sprite */ protected Sprite loadSprite(String fileName, int lines, double scaling) { Image i = loadImage(fileName, lines, scaling); return new Sprite(i, i.getWidth(), i.getHeight() / lines); } /** * Load and scale image * @param fileName * @param lines Amount of vertical frames * @param scaling Scaling factor * @return Loaded and scaled image */ protected Image loadImage(String fileName, int lines, double scaling) { ImageHelper ih = ImageHelper.getInstance(); Image i = ih.loadImage(fileName); return ImageHelper.scaleImage(i, (int) (scaling * i.getWidth() + 0.5), (int) (scaling * i.getHeight() / lines + 0.5) * lines); } /** * Listener interface for menu events */ public interface Listener { void itemClicked(int item); } }