www.pudn.com > GMapViewer-src.zip > Dialog.java
package org.sreid.j2me.util;
import java.util.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
/** Convenience class for implementing dialogs. */
public class Dialog extends Form implements CommandListener {
private final int type;
private static final int TYPE_TEXT = 1;
private static final int TYPE_CHOICE_EXCLUSIVE = 2;
private static final int TYPE_CHOICE_MULTIPLE = 3;
private static final int TYPE_CONFIRMATION = 4;
private static final int TYPE_GAUGE = 5;
/** User response for confirmation dialog. */
public static final Object USER_CONFIRMED = new Object();
// only one of these will be set, depending on type
private TextField textField = null;
private ChoiceGroup choiceGroup = null;
private Gauge gauge = null;
private Runnable callback;
private Object userResponse;
private MIDlet midlet;
private Displayable nextDisplayable;
private Dialog(String title, int type, boolean addOkCancel) {
super(title);
this.type = type;
setCommandListener(this);
if (addOkCancel) {
addCommand(new Command("OK", Command.OK, 1));
addCommand(new Command("Cancel", Command.CANCEL, 2));
}
}
/** Constructs a Dialog with a text field. The resulting userResponse will be a String, or null. */
public static Dialog createTextDialog(String title, String label, String defaultText, int maxSize, int constraints) {
Dialog dlg = new Dialog(title, TYPE_TEXT, true);
dlg.textField = new TextField(label, defaultText, maxSize, constraints);
dlg.append(dlg.textField);
return dlg;
}
/** Constructs a Dialog with a text field. The resulting userResponse will be a String, or null. */
public static Dialog createTextDialog(String label, String defaultText) {
return createTextDialog(label, label, defaultText, 200, TextField.ANY);
}
/** Constructs a Dialog with several options for the user to choose from. The resulting userResponse will be a String, or null. */
public static Dialog createExclusiveChoiceDialog(String title, String label, String[] options) {
return createChoiceDialog(title, TYPE_CHOICE_EXCLUSIVE, label, options);
}
/** Constructs a Dialog with several options for the user to choose from. The resulting userResponse will be an array of Strings, or null. */
public static Dialog createMultipleChoiceDialog(String title, String label, String[] options) {
return createChoiceDialog(title, TYPE_CHOICE_MULTIPLE, label, options);
}
private static Dialog createChoiceDialog(String title, int type, String label, String[] options) {
Dialog dlg = new Dialog(title, type, true);
dlg.choiceGroup = new ChoiceGroup(label, (type == TYPE_CHOICE_EXCLUSIVE ? Choice.EXCLUSIVE : Choice.MULTIPLE), options, null);
dlg.append(dlg.choiceGroup);
return dlg;
}
/** Constructs a Dialog with exactly two choices. The resulting userResponse will be USER_CONFIRMED, or null. */
public static Dialog createConfirmationDialog(String title, String label, String okOption, String cancelOption) {
Dialog dlg = new Dialog(title, TYPE_CONFIRMATION, false);
dlg.append(new StringItem("", label));
dlg.addCommand(new Command(okOption, Command.OK, 1));
dlg.addCommand(new Command(cancelOption, Command.CANCEL, 2));
return dlg;
}
/** Constructs a Dialog with a slider. The resulting userResponse will be an Integer, or null. */
public static Dialog createGaugeDialog(String title, String label, int maxValue, int initialValue) {
Dialog dlg = new Dialog(title, TYPE_GAUGE, true);
dlg.gauge = new Gauge(label, true, maxValue, initialValue);
dlg.append(dlg.gauge);
return dlg;
}
/** Shows this dialog on the specified midlet, then returns to the current screen. */
public void showOn(MIDlet midlet) {
showOn(midlet, Display.getDisplay(midlet).getCurrent());
}
/** Shows this dialog on the specified midlet, then shows nextDisplayable when this dialog is dismissed. */
public void showOn(MIDlet midlet, Displayable nextDisplayable) {
if (midlet == null) throw new IllegalArgumentException("midlet argument needs to be non-null");
if (nextDisplayable == null) throw new IllegalArgumentException("nextDisplayble argument needs to be non-null");
this.midlet = midlet;
this.nextDisplayable = nextDisplayable;
Display.getDisplay(midlet).setCurrent(this);
}
/** Calls showOn, but enqueues the call using Display.showSerially. */
public void showSerially(final MIDlet midlet, final Displayable nextDisplayable) {
Display.getDisplay(midlet).callSerially(new Runnable() { public void run() {
showOn(midlet, nextDisplayable);
}});
}
/** Returns the user's response. */
public Object getUserResponse() {
return userResponse;
}
/** Sets the callback that will be called when the user has given their response, or cancelled the dialog. */
public void setCallback(Runnable callback) {
this.callback = callback;
}
public void commandAction(Command c, Displayable d) {
if (c.getCommandType() == Command.OK) {
switch (type) {
case TYPE_TEXT: {
userResponse = textField.getString();
break;
}
case TYPE_CHOICE_EXCLUSIVE: {
userResponse = choiceGroup.getString(choiceGroup.getSelectedIndex());
break;
}
case TYPE_CHOICE_MULTIPLE: {
int size = choiceGroup.size();
boolean[] flags = new boolean[size];
int selectionCount = choiceGroup.getSelectedFlags(flags);
String[] selections = new String[selectionCount];
int idx = 0;
for (int i = 0; i < size; i++) {
if (flags[i]) selections[idx++] = choiceGroup.getString(i);
}
userResponse = selections;
break;
}
case TYPE_GAUGE: {
userResponse = new Integer(gauge.getValue());
break;
}
case TYPE_CONFIRMATION: {
userResponse = USER_CONFIRMED;
break;
}
default: {
throw new IllegalStateException("Unknown type: " + type);
}
}
}
else if (c.getCommandType() == Command.CANCEL) {
userResponse = null;
}
else {
throw new IllegalStateException("Unrecognized command type: " + c);
}
if (callback != null) callback.run();
Display.getDisplay(midlet).setCurrent(nextDisplayable);
}
}