import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.Choice;
import javax.microedition.lcdui.ChoiceGroup;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Gauge;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.Item;
import javax.microedition.lcdui.ItemCommandListener;
import javax.microedition.lcdui.List;
import javax.microedition.lcdui.Spacer;
import javax.microedition.lcdui.TextBox;
import javax.microedition.lcdui.TextField;
import javax.microedition.lcdui.Ticker;
import lejos.util.Timer;
import lejos.util.TimerListener;
import lejos.nxt.LCD;
/**
*
* @author Andre Nijholt
*/
class Splasher extends Alert
{
Image img;
boolean startUp;
String text;
Splasher(Image img, String text, boolean start)
{
super("");
this.img = img;
this.text = text;
setStart(start);
}
public void setStart(boolean start)
{
startUp = start;
}
protected void showNotify() {
// Start painting alert screen
repaint();
}
public void paint(Graphics g)
{
int iw = img.getWidth();
int ih = img.getHeight();
int dx = (Display.SCREEN_WIDTH - iw)/2;
int dy = (Display.SCREEN_HEIGHT - ih)/2 - 5;
int tdx = g.getCenteredX(text);
int tdy = dy + ih + 5;
int tw = text.length()*Display.CHAR_WIDTH;
tdx = (Display.SCREEN_WIDTH - tw)/2;
int th = Display.CHAR_HEIGHT;
if (startUp)
{
for(int i = 32; i >=0; i--)
{
g.clear();
g.drawImage(img, 0, 0, dx + i, dy, iw, ih, 0xaaffaa00);
g.drawImage(img, 0, 0, dx - i, dy, iw, ih, 0x55ff5500);
g.refresh();
try{Thread.sleep(50);}catch(Exception e){}
}
int old = g.getColor();
g.setColor(Graphics.WHITE);
for(int i = (Display.SCREEN_HEIGHT - tdy); i >= 0; i--)
{
g.fillRect(tdx, tdy + i + th + 1, tw, th);
g.drawString(text, tdx, tdy + i, false);
g.refresh();
try{Thread.sleep(50);}catch(Exception e){}
}
g.setColor(old);
}
else
{
int old = g.getColor();
g.setColor(Graphics.WHITE);
g.drawImage(img, 0, 0, dx, dy, iw, ih, LCD.ROP_COPY);
for(int i = 0; i < (Display.SCREEN_HEIGHT - tdy); i++)
{
g.fillRect(tdx, tdy + i - 1, tw, th);
g.drawString(text, tdx, tdy + i, false);
g.refresh();
try{Thread.sleep(50);}catch(Exception e){}
}
g.setColor(old);
for(int i = 0; i <= iw/2; i++)
{
g.clear();
g.drawImage(img, i, i, dx + i, dy + i, iw - 2*i, ih - 2*i, LCD.ROP_COPY);
g.refresh();
try{Thread.sleep(50);}catch(Exception e){}
}
}
}
}
public class LCDUI implements CommandListener {
private static final int CMDID_BACK_TO_MAIN = 1;
private static final int CMDID_EXIT_APP = 2;
private static final Command BACK_COMMAND = new Command(CMDID_BACK_TO_MAIN, Command.BACK, 0);
private static final Command EXIT_COMMAND = new Command(CMDID_EXIT_APP, Command.STOP, 2);
private List menu = new List("Test Components", Choice.IMPLICIT);
private Ticker ticker = new Ticker("Test GUI Components");
// Main menu items
private TextBox input = new TextBox("Enter Some Text:", "", 16, TextField.ANY);
private List choose = new List("Choose Items", Choice.MULTIPLE);
private Alert soundAlert = new Alert("Sound Alert");
private Form form1 = new Form("Testing form");
private Form form2 = new Form("Form for Stuff");
private Alert exitAlert = new Alert("Exit");
// Gauge on soundAlert
private Gauge alertGauge = new Gauge(null, false, 20, 0);
private Timer gaugeTimer = new Timer(100, new TimerListener() {
public void timedOut() {
int curValue = alertGauge.getValue();
if (curValue >= alertGauge.getMaxValue()) {
gaugeTimer.stop();
alertGauge.setValue(0);
} else {
alertGauge.setValue(curValue + 1);
}
soundAlert.repaint();
}
});
// Items on form1
private ChoiceGroup choiceGroup1 = new ChoiceGroup("Popup 1", Choice.POPUP);
private ChoiceGroup choiceGroup2 = new ChoiceGroup("Popup 2", Choice.POPUP);
private ChoiceGroup radioButtons = new ChoiceGroup(null, Choice.EXCLUSIVE);
private Image img = new Image(32, 32, new byte[] {
(byte) 0xff, (byte) 0x03, (byte) 0x05, (byte) 0x09, (byte) 0x11, (byte) 0x21, (byte) 0x41, (byte) 0x81,
(byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01,
(byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01,
(byte) 0x81, (byte) 0x41, (byte) 0x21, (byte) 0x11, (byte) 0x09, (byte) 0x05, (byte) 0x03, (byte) 0xff,
(byte) 0xff, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x01, (byte) 0x02, (byte) 0x04, (byte) 0x08, (byte) 0x10, (byte) 0x20, (byte) 0x40, (byte) 0x80,
(byte) 0x80, (byte) 0x40, (byte) 0x20, (byte) 0x10, (byte) 0x08, (byte) 0x04, (byte) 0x02, (byte) 0x01,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xff,
(byte) 0xff, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x80, (byte) 0x40, (byte) 0x20, (byte) 0x10, (byte) 0x08, (byte) 0x04, (byte) 0x02, (byte) 0x01,
(byte) 0x01, (byte) 0x02, (byte) 0x04, (byte) 0x08, (byte) 0x10, (byte) 0x20, (byte) 0x40, (byte) 0x80,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xff,
(byte) 0xff, (byte) 0xc0, (byte) 0xa0, (byte) 0x90, (byte) 0x88, (byte) 0x84, (byte) 0x82, (byte) 0x81,
(byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0x80,
(byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0x80,
(byte) 0x81, (byte) 0x82, (byte) 0x84, (byte) 0x88, (byte) 0x90, (byte) 0xa0, (byte) 0xc0, (byte) 0xff
});
private Image splash = new Image(26, 32, new byte[] {
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x3F, (byte)0x3F, (byte)0x3F, (byte)0x3F, (byte)0x3F, (byte)0x3F, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFE, (byte)0xFC,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xA0, (byte)0x40, (byte)0xA0, (byte)0x40,
(byte)0xA0, (byte)0x40, (byte)0xA0, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
(byte)0xF0, (byte)0xF0, (byte)0xF0, (byte)0xF0, (byte)0xF0, (byte)0xF0, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x0A, (byte)0x05, (byte)0x0A, (byte)0x05,
(byte)0x0A, (byte)0x05, (byte)0x0A, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
(byte)0x0F, (byte)0x1F, (byte)0x3F, (byte)0x3F, (byte)0x7F, (byte)0x7F, (byte)0xFC, (byte)0xF8, (byte)0xF0, (byte)0xF0, (byte)0xF0, (byte)0xF0, (byte)0xF0,
(byte)0xF0, (byte)0xF0, (byte)0xF0, (byte)0xF0, (byte)0xF0, (byte)0xF8, (byte)0xFC, (byte)0x7F, (byte)0x7F, (byte)0x3F, (byte)0x3F, (byte)0x1F, (byte)0x0F,});
private Splasher startUp = new Splasher(splash, "LEJOS", true);
// Items on form2
private Gauge volGauge = new Gauge("Volume: ", true, 8, 6);
private Gauge gauge = new Gauge("Progress Bar", true, 20, 9);
TextField textfield = new TextField("TextField label", "abc", 16, TextField.ANY);
private Display display;
public LCDUI() {}
/**
* Start application
*
* @param polling Select method for button handling
*/
public void startApp(boolean polling) {
// Create main menu
menu = new List("Test Components", Choice.IMPLICIT);
menu.append("Test TextBox", null);
menu.append("Test List", null);
menu.append("Test Alert", null);
menu.append("Test Form 1", null);
menu.append("Test Form 2", null);
//menu.setSelectedIndex(0, true);
menu.addCommand(EXIT_COMMAND);
menu.setCommandListener(this);
menu.setTicker(ticker);
// Set textbox properties
// input.setTicker(new Ticker("Testing TextBox")); Very slow!
input.addCommand(BACK_COMMAND);
input.setCommandListener(this);
// Set list properties and fill list
// choose.setTicker(new Ticker("Testing List")); Very slow!
choose.addCommand(BACK_COMMAND);
choose.setCommandListener(this);
choose.append("Item 1", null);
choose.append("Item 2", null);
choose.append("Item 3", null);
choose.append("Item 4", null);
choose.append("Item 5", null);
choose.append("Item 6", null);
choose.append("Item 7", null);
choose.append("Item 8", null);
choose.append("Item 9", null);
choose.append("Item 10", null);
// Set alert properties
soundAlert.setType(Alert.ALERT_TYPE_ERROR);
soundAlert.setTimeout(5000);
soundAlert.setString("** ERROR **");
soundAlert.setIndicator(alertGauge);
// Create form1 and set command listener
form1.append(choiceGroup1);
form1.append(choiceGroup2);
form1.append("Left");
form1.append(img);
form1.append(new Spacer(8, 8));
form1.append("Right");
form1.append(radioButtons);
form1.addCommand(BACK_COMMAND);
form1.setCommandListener(this);
// Fill popup menus and radiobox
choiceGroup1.append("Menu 1", null);
choiceGroup1.append("Menu 2", null);
choiceGroup1.append("Menu 3", null);
choiceGroup1.append("Menu 4", null);
choiceGroup1.append("Menu 5", null);
choiceGroup1.append("Menu 6", null);
choiceGroup1.append("Menu 7", null);
choiceGroup1.append("Menu 8", null);
choiceGroup1.append("Menu 9", null);
choiceGroup1.append("Menu 10", null);
choiceGroup2.append("Select 1", null);
choiceGroup2.append("Select 2", null);
choiceGroup2.append("Select 3", null);
choiceGroup2.append("Select 4", null);
choiceGroup2.setScrollWrap(false);
choiceGroup2.setItemCommandListener(new ItemCommandListener() {
public void commandAction(Command c, Item d) {
radioButtons.setSelectedIndex(choiceGroup2.getSelectedIndex() % 2, true);
}
});
choiceGroup2.addCommand(new Command(1, Command.SCREEN, 0));
radioButtons.append("Selection 1", null);
radioButtons.append("Selection 2", null);
radioButtons.setSelectedIndex(0, true);
radioButtons.setPreferredSize(Display.SCREEN_WIDTH, 2 * Display.CHAR_HEIGHT);
// Create form2 and set command listener
form2.append(volGauge);
form2.append(gauge);
form2.append(textfield);
form2.addCommand(BACK_COMMAND);
form2.setCommandListener(this);
// Make the system active
display = Display.getDisplay();
display.setCurrent(menu);
// Show the splash screen
startUp.setTimeout(4000);
display.setCurrent(startUp);
display.show(polling);
}
/**
* Handle events.
*/
public void commandAction(Command c, Displayable d) {
if (c.getCommandId() == CMDID_BACK_TO_MAIN) {
// Display main menu again
display.setCurrent(menu);
} else if (c.getCommandId() == CMDID_EXIT_APP) {
// Request to exit application
exitAlert.setType(Alert.ALERT_TYPE_CONFIRMATION);
exitAlert.setString("Exit Lejos?");
exitAlert.setCommandListener(this);
display.setCurrent(exitAlert);
} else {
// Handle system commands
if (d == exitAlert) {
if (exitAlert.getConfirmation()) {
startUp.setStart(false);
display.setCurrent(startUp);
display.quit();
} else {
display.setCurrent(menu);
}
} else if (d == menu) {
List list = (List) display.getCurrent();
if (list.getSelectedIndex() == 0) {
display.setCurrent(input);
} else if (list.getSelectedIndex() == 1) {
display.setCurrent(choose);
} else if (list.getSelectedIndex() == 2) {
display.setCurrent(soundAlert);
alertGauge.setValue(0);
gaugeTimer.start();
} else if (list.getSelectedIndex() == 3) {
display.setCurrent(form1);
} else if (list.getSelectedIndex() == 4) {
display.setCurrent(form2);
}
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
new LCDUI().startApp(true);
}
}