www.pudn.com > GMapViewer-src.zip > MapPinMenu.java



package org.sreid.j2me.gmapviewer;

import java.util.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import org.sreid.j2me.util.*;

// Handles permanent (non-search) map pins.
public class MapPinMenu extends List implements CommandListener {

	private final GMapViewer app;

	private static final String BACK = "Back";

	private static final String GO_TO_PIN = "Go to pin";
	private static final String EDIT_PIN = "Rename pin";
	private static final String DELETE_PIN = "Delete pin";

	private final Vector mapPins = new Vector();

	Displayable cameFrom;


	MapPinMenu(GMapViewer app) {
		super("Map pins", List.IMPLICIT);
		this.app = app;
		setCommandListener(this);
		addCommand(new Command(BACK, Command.BACK, 1));
		addCommand(new Command(GO_TO_PIN, Command.ITEM, 1));
		addCommand(new Command(EDIT_PIN, Command.ITEM, 2));
		addCommand(new Command(DELETE_PIN, Command.ITEM, 2));
		loadList();
	}

	public void commandAction(Command c, Displayable d) {
		final MapPin pin = (getSelectedIndex() < 0 || mapPins.size() == 0 ? null : (MapPin)mapPins.elementAt(getSelectedIndex()));
		String cmd = c.getLabel();
		if (cmd.equals(BACK)) {
			app.display.setCurrent(cameFrom);
		}
		else if (pin == null) {
			// all of the commands below require a map pin
		}
		else if (cmd.equals(GO_TO_PIN) || c == List.SELECT_COMMAND) {
			app.canvas.setXY(pin.x, pin.y);
			app.display.setCurrent(app.canvas);
		}
		else if (cmd.equals(EDIT_PIN)) {
			final Dialog dlg = Dialog.createTextDialog("Edit map pin", "Map pin text", pin.text, 40, TextField.ANY);
			dlg.setCallback(new Runnable() { public void run() {
				String userResponse = (String)dlg.getUserResponse();
				if (userResponse != null) {
					pin.text = (String)userResponse;
					app.mpm.keepPin(pin);
					loadList();
				}
			}});
			dlg.showOn(app);
		}
		else if (cmd.equals(DELETE_PIN)) {
			final Dialog dlg = Dialog.createConfirmationDialog("Delete map pin?", "Are you sure you want to delete this map pin: " + pin.text, "Yes, delete it.", "No, keep it.");
			dlg.setCallback(new Runnable() { public void run() {
				if (dlg.getUserResponse() == Dialog.USER_CONFIRMED) {
					app.mpm.deletePin(pin);
					loadList();
				}
			}});
			dlg.showOn(app);
		}
		else {
			throw new IllegalArgumentException("Unrecognized command: " + cmd);
		}
	}

	void loadList() {
		mapPins.removeAllElements();
		while (size() > 0) {
			delete(0);
		}
		for (Enumeration enum = app.mpm.enumeration() ; enum.hasMoreElements() ; ) {
			MapPin mp = (MapPin)enum.nextElement();
			if (mp.isPermanent) {
				append(mp.text, null);
				mapPins.addElement(mp);
			}
		}
		if (mapPins.size() == 0) {
			append("You currently have no permanent map pins.", null);
		}
	}

}