package javax.microedition.lcdui;
import java.util.ArrayList;
/**
*
* @author Andre Nijholt
*/
public class List extends Screen implements Choice {
/** Default command for implicit lists */
private final Command SELECT_COMMAND = new Command(0, Command.SCREEN, 0);
protected int listType;
protected ArrayList<ListItem> listItems;
// private int fitPolicy;
/** Scrolling administration */
private int scrollFirst = 0;
private int scrollCurr = 0;
private int scrollLast = 0;
private boolean scrollWrap = true;
public List(String title, int listType) {
if (listType == Choice.POPUP) {
// Type POPUP not allowed
throw new IllegalArgumentException();
}
this.title = title;
this.listType = listType;
listItems = new ArrayList<ListItem>();
}
public List(String title, int listType, String[] stringElements, Image[] imageElements) {
if (listType == Choice.POPUP) {
// Type POPUP not allowed
throw new IllegalArgumentException();
}
this.title = title;
this.listType = listType;
listItems = new ArrayList<ListItem>(stringElements.length);
for (int i = 0; i < stringElements.length; i++) {
listItems.add(new ListItem(stringElements[i], imageElements[i]));
scrollLast++;
}
}
public int append(String stringPart, Image imagePart) {
listItems.add(new ListItem(stringPart, imagePart));
scrollLast++;
return listItems.size();
}
public void delete(int elementNum) {
scrollLast--;
listItems.remove(elementNum);
}
public void deleteAll() {
scrollLast = 0;
listItems.clear();
}
// TODO: FitPolicy currently not supported: no wrapping allowed
// public int getFitPolicy() {
// return fitPolicy;
// }
//
// public void setFitPolicy(int fitPolicy) {
// this.fitPolicy = fitPolicy;
// }
// TODO: Multiple fonts currently not supported
// public Font getFont(int elementNum) {
// return ((ListItem) listItems.get(elementNum)).font;
// }
//
// public void setFont(int elementNum, Font font) {
// ((ListItem) listItems.get(elementNum)).font = font;
// }
public Image getImage(int elementNum) {
return (listItems.get(elementNum)).img;
}
public int getSelectedFlags(boolean[] selectedArray_return) {
selectedArray_return = new boolean[listItems.size()];
for (int i = 0; i < selectedArray_return.length; i++) {
selectedArray_return[i] = listItems.get(i).selected;
}
return selectedArray_return.length;
}
public int getSelectedIndex() {
for (int i = 0; i < listItems.size(); i++) {
if (listItems.get(i).selected) {
return i;
}
}
return -1;
}
public String getString(int elementNum) {
return listItems.get(elementNum).str;
}
public void insert(int elementNum, String stringPart, Image imagePart) {
listItems.add(elementNum, new ListItem(stringPart, imagePart));
}
public boolean isSelected(int elementNum) {
return listItems.get(elementNum).selected;
}
public void set(int elementNum, String stringPart, Image imagePart) {
listItems.set(elementNum, new ListItem(stringPart, imagePart));
}
public void setScrollWrap(boolean scrollWrap) {
this.scrollWrap = scrollWrap;
}
public void setSelectedFlags(boolean[] selectedArray) {
for (int i = 0; i < listItems.size(); i++) {
listItems.get(i).selected = selectedArray[i];
}
}
public void setSelectedIndex(int elementNum, boolean selected) {
if ((listType == Choice.MULTIPLE) || !selected) {
// Just set/clear selection
listItems.get(elementNum).selected = selected;
} else {
// Set single selection for these types
for (int i = 0; i < listItems.size(); i++) {
ListItem li = listItems.get(i);
li.selected = (i == elementNum);
}
}
}
public int size() {
return listItems.size();
}
protected void keyPressed(int keyCode) {
if (keyCode == KEY_RIGHT) {
if (scrollWrap) {
scrollCurr = (scrollCurr + 1) % listItems.size();
} else if (scrollCurr < (listItems.size() - 1)) {
scrollCurr++;
}
repaint();
} else if (keyCode == KEY_LEFT) {
if (scrollWrap) {
scrollCurr = (scrollCurr == 0)
? (listItems.size() - 1) : (scrollCurr - 1);
} else if (scrollCurr > 0) {
scrollCurr--;
}
repaint();
} else if (keyCode == KEY_BACK) {
callCommandListener();
} else if (keyCode == KEY_ENTER) {
ListItem li = listItems.get(scrollCurr);
if (listType == Choice.IMPLICIT)
setSelectedIndex(scrollCurr, false);
setSelectedIndex(scrollCurr, !li.selected);
// if ((listType == Choice.IMPLICIT) || (listType == Choice.EXCLUSIVE)) {
// // Set single selection for these types
// for (int i = 0; i < listItems.size(); i++) {
// if ((scrollCurr == i)) {
// // Toggle selection (discard current state when IMPLICIT)
// ListItem li = listItems.get(scrollCurr);
// setSelectedIndex(scrollCurr, (listType == Choice.IMPLICIT)
// ? true : !li.selected);
// } else {
// // Multiple items cannot be selected for this listType
// setSelectedIndex(i, false);
// }
// }
// } else {
// // Toggle selection
// ListItem li = listItems.get(scrollCurr);
// setSelectedIndex(scrollCurr, !li.selected);
// }
// Send selection command for implicit list only
if ((listType == Choice.IMPLICIT) && (cmdListener != null)) {
cmdListener.commandAction(SELECT_COMMAND, this);
}
repaint();
}
}
protected void paint(Graphics g) {
int lineIdx = 0;
int line = Display.CHAR_HEIGHT;
int ch = Display.CHAR_WIDTH;
if (ticker != null) {
lineIdx++;
}
if (title != null) {
g.drawString(title, 0, lineIdx++ * line);
}
// Update scrolling administration
int scrollLines = Display.SCREEN_CHAR_DEPTH - lineIdx;
if (scrollCurr == 0) {
scrollFirst = 0;
scrollLast = scrollLines;
} else if ((listItems.size() >= scrollLines)
&& (scrollCurr >= (listItems.size() - 1))) {
scrollFirst = listItems.size() - scrollLines;
scrollLast = listItems.size() - 1;
} else if (scrollCurr >= scrollLast) {
scrollFirst++;
scrollLast++;
} else if (scrollCurr < scrollFirst) {
scrollFirst--;
scrollLast--;
}
// Display list items with current highlighted
for (int i = scrollFirst; (i < listItems.size()) && (i <= scrollLast); i++) {
ListItem li = listItems.get(i);
g.drawString(li.str, 2*ch, lineIdx*line, (i == scrollCurr));
// Draw selection state
if ((listType == Choice.EXCLUSIVE) || (listType == Choice.MULTIPLE)) {
if (li.selected) {
g.fillArc(2, lineIdx * 8, 8, 8, 0, 360);
} else {
g.drawArc(2, lineIdx * 8, 8, 8, 0, 360);
}
}
lineIdx++;
}
}
private class ListItem {
String str;
Image img;
boolean selected;
// Font font;
ListItem(String stringPart, Image imagePart) {
this.str = stringPart;
this.img = imagePart;
this.selected = false;
// this.font = null;
}
}
}