TouristMapOverlays.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.attractions.map;

import com.nokia.example.attractions.Main;
import com.nokia.example.attractions.utils.KeyCodes;
import com.nokia.example.attractions.Visual;
import com.nokia.example.attractions.utils.ImageLoader;
import com.nokia.maps.map.EventListener;
import com.nokia.maps.map.MapComponent;
import com.nokia.maps.map.MapDisplay;
import java.io.IOException;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

/**
 * This class draws the back button on top of the map and listens for
 * when the user presses said button.
 */
public final class TouristMapOverlays
    implements MapComponent, EventListener {

    private MapDisplay mapDisplay;
    private int height, width;
    private Image back;
    private Image backFocus;
    private volatile boolean backHasFocus = false;

    /**
     * @see MapComponent#getId()
     */
    public final String getId() {
        return "overlays";
    }

    /**
     * @see MapComponent#getVersion()
     */
    public final String getVersion() {
        return "0.1";
    }

    /**
     * @see MapComponent#attach(com.nokia.maps.map.MapDisplay)
     */
    public final void attach(MapDisplay md) {
        mapDisplay = md;
        height = mapDisplay.getHeight();
        width = mapDisplay.getWidth();
        try {
            back = ImageLoader.getInstance().loadImage("/icons/back.png", null);
            backFocus = ImageLoader.getInstance().loadImage("/icons/back_focus.png", null);
        }
        catch (IOException e) {
        }
    }

    /**
     * @see MapComponent#detach(com.nokia.maps.map.MapDisplay)
     */
    public final void detach(MapDisplay md) {
        mapDisplay = null;
        back = null;
    }

    /**
     * @see MapComponent#paint(javax.microedition.lcdui.Graphics)
     */
    public final void paint(Graphics g) {
        if (back != null && backFocus != null) {
            g.drawImage(backHasFocus ? backFocus : back,
                width - Visual.SOFTKEY_MARGIN, height - Visual.SOFTKEY_MARGIN,
                Graphics.RIGHT | Graphics.BOTTOM);
        }
    }

    /**
     * @see MapComponent#mapUpdated(boolean)
     */
    public final void mapUpdated(boolean bln) {
    }

    /**
     * @see MapComponent#getEventListener()
     */
    public final EventListener getEventListener() {
        return this;
    }

    /**
     * @see EventListener#keyPressed(int, int)
     */
    public final boolean keyPressed(int keyCode, int i) {
        if (keyCode == KeyCodes.RIGHT_SOFTKEY) {
            backHasFocus = true;
            return true;
        }
        return false;
    }

    /**
     * @see EventListener#keyReleased(int, int)
     */
    public final boolean keyReleased(int keyCode, int i) {
        backHasFocus = false;
        if (keyCode == KeyCodes.RIGHT_SOFTKEY) {
            Main.getInstance().closeMap();
            return true;
        }
        return false;
    }

    /**
     * @see EventListener#keyRepeated(int, int, int)
     */
    public final boolean keyRepeated(int i, int i1, int i2) {
        return false;
    }

    /**
     * @see EventListener#pointerDragged(int, int)
     */
    public final boolean pointerDragged(int x, int y) {
        if (backHasFocus) {
            backHasFocus = hitsBackButton(x, y);
            return true;
        }
        return false;
    }

    /**
     * @see EventListener#pointerPressed(int, int)
     */
    public final boolean pointerPressed(int x, int y) {
        if (hitsBackButton(x, y)) {
            backHasFocus = true;
            return true;
        }
        return false;
    }

    /**
     * @see EventListener#pointerReleased(int, int)
     */
    public final boolean pointerReleased(int x, int y) {
        if (backHasFocus && hitsBackButton(x, y)) {
            backHasFocus = false;
            Main.getInstance().closeMap();
            return true;
        }
        return false;
    }

    private boolean hitsBackButton(int x, int y) {
        //Check the coordinates to see if the back button was hit
        final int buttonSize = Math.max(width, height) / 8;
        return x > (width - buttonSize) && y > (height - buttonSize);
    }
}