package mvc.mobile.util.ui;
import java.util.TimerTask;
import javax.microedition.lcdui.*;
import mvc.mobile.util.ui.timer.*;
import mvc.mobile.util.ui.setting.Platform;
import javax.microedition.rms.RecordEnumeration;
import javax.microedition.rms.RecordStore;
import mvc.mobile.test.Filter;
import mvc.mobile.test.Comparator;
import javax.microedition.rms.*;
import javax.microedition.rms.*;
import java.util.Vector;
import javax.microedition.io.HttpConnection;
import mvc.mobile.util.net.DataCanvas;
import mvc.mobile.util.net.HttpRequest;
import mvc.mobile.util.net.HttpWaitUI;
/**
*@(#)TextField.java
* 版权声明 , 版权所有 违者必究
* 版本号 1.0
* 功能描述:
* 实现TextBox的功能,具有输入网址时候根据历史匹配提示的功能
* 默认情况下,字符之间,横向间隔2px,纵向间隔1px
*修订记录:
*1)更改者:李培
* 时 间:2009-12-31
* 描 述:创建
*/
public class TextBox
extends Item implements Runnable, javax.microedition.lcdui.CommandListener {
private javax.microedition.lcdui.Command okCommand = new javax.microedition.
lcdui.Command("OK", javax.microedition.lcdui.Command.SCREEN, 1);
private int maxSize; //最多可见的字符数
private char[] textChars; //内容 in characters
private String[] iHistoryUrl;
private String text = null; // 内容 in String
private int numOfVisible;
boolean TextOrPassword = false; // false为文本,true为密码
private TimerTask task; //定时器用于实现闪动的光标
private TextBoxStub stub; //使用内部类实现多继承
// 针对本程序需要定义的URL变量
private String url = null;
public String getUrl() {
return url;
}
private boolean isflicker = false;
class TextBoxStub
extends javax.microedition.lcdui.TextBox {
public TextBoxStub(String title, String text, int maxSize, int constraints) {
super(title, text, maxSize, constraints);
addCommand(okCommand);
addCommand(cancelCommand);
}
}
public TextBox(String label, String text, int maxSize, boolean type , ItemCanvas canvas) {
super(0, 20, 0, 0);
this.canvas = canvas ;
this.maxSize = maxSize;
if (label == null)
this.label = "";
else
this.label = label;
setType(type);
setText(text);
stub = new TextBoxStub("请输入", text, maxSize,
type ? TextField.PASSWORD : TextField.ANY);
stub.setCommandListener(this);
try {
/**
* 打开RMS操作
*/
RecordStore sRecordStore = RecordStore.openRecordStore(
"myHistoryUrlStore", true);
/**
*把字符串类型数据写入RMS的操作
*/
String[] sOutputData = {"http://www.baidu.com","http://www.g.cn","http://www.uc.cn","http://www.sysu.com","http://www.bidu.com"};
for(int i = 0 ; i < sOutputData.length ; i++){
byte[] sByteOutputData = sOutputData[i].getBytes();
sRecordStore.addRecord(sByteOutputData,0,sByteOutputData.length);
}
/**
* 把字符串类型数据读入数组的操作
*/
Filter sfilter= new Filter("http://www."); //防止错误信息出现
Comparator sComparator = new Comparator();
RecordEnumeration sRecordEnumeration = sRecordStore.enumerateRecords(sfilter,
sComparator, false);
int i = 0;
iHistoryUrl = new String[sRecordEnumeration.numRecords()];
while (sRecordEnumeration.hasNextElement()) {
iHistoryUrl[i++] = new String(sRecordEnumeration.nextRecord());
}
sRecordEnumeration.destroy();
sRecordStore.closeRecordStore();
}
catch (RecordStoreException ex) {
Alert sAlert = new Alert("Error opening RMS", ex.toString(), null,
AlertType.WARNING);
sAlert.setTimeout(Alert.FOREVER);
display.setCurrent(sAlert);
}
loadHistory(text);
}
private Vector iShowHistory = new Vector() ; //下拉菜单显示的历史网址
/**
* 用输入的字符串寻找匹配的历史网址
* @param aUrl String
* @throws Exception
*/
private void loadHistory(String aUrl) {
boolean sFound = false;
iShowHistory.removeAllElements();
for(int i = 0 ; i< iHistoryUrl.length ;i++){
if( iHistoryUrl[i].startsWith(aUrl)){
iShowHistory.addElement(iHistoryUrl[i]);
sFound = true ;
}else{
if(sFound)
break;
}
}
}
public void setText(String text) {
if (text == null)
this.text = "";
this.text = text;
textChars = text.toCharArray();
if (textChars.length > maxSize)
numOfVisible = maxSize;
else
numOfVisible = textChars.length;
url = text;
position[HEIGHT] = font.getHeight();
}
public void setType(boolean type) {
TextOrPassword = type;
}
public void paint(Graphics graphics) {
/**
* 绘画过程分两个部分
* 1.画左侧标签
* 2.画输入框
*/
font = graphics.getFont();
graphics.setColor(fontColor);
paintLabel(graphics);
paintText(graphics);
}
/**
* paintText
*
* @param graphics Graphics
*/
private void paintText(Graphics graphics) {
int xPos = position[X] + font.stringWidth(label) + 2; //绘画text必须发生在绘画标签之后
int yPos = position[Y];
if (TextOrPassword) {
xPos = paintPassword(graphics, xPos, yPos);
}
else {
xPos = paintPlainText(graphics, xPos, yPos);
}
paintCursor(xPos + 2, yPos + 1, graphics);
}
/**
* paintCursor
*
* @param i int
* @param i1 int
* @param graphics Graphics
*/
private void paintCursor(int xPos, int yPos, Graphics graphics) {
activateTask();
graphics.setColor(0x3112323);
if (hasFocus && isflicker) {
graphics.drawChar('|', xPos, yPos, Graphics.TOP | Graphics.LEFT);
}
}
/**
* activateTask
*/
private void activateTask() {
if (hasFocus && null == task) {
task = TimerTaskManager.getInstance().add(this, 300);
}
else if (!hasFocus && task != null) {
task.cancel();
task = null;
}
}
//测试数据-- 测试通过,下一步从rms读入
//private String[] iHistoryUrl = {"www.baidu.com","www.g.cn","www.ucweb.cn","www.baidu.com","www.g.cn","www.ucweb.cn","www.baidu.com","www.g.cn","www.ucweb.cn","www.baidu.com","www.g.cn","www.ucweb.cn"};
private int iItemFocus = 0; //下拉菜单中选择的元素,需要高亮显示
private boolean iIsDragDown = false;
/**
* paintDragDown
* 画下拉框
* @param graphics Graphics
* @param charsWidth int
* @param charsHeight int
* @param startX int
*/
private void paintDragDown(Graphics graphics, int charsWidth, int charsHeight,
int startX) {
int yPos = charsHeight;
if (hasFocus) {
graphics.setColor(0x696969);
for (int i = 0; i < iShowHistory.size(); i++) {
if (i == iItemFocus) {
graphics.setColor(0x90EE90);
graphics.fillRect(startX, yPos, charsWidth, font.getHeight());
graphics.setColor(0x696969);
}
graphics.drawString(iShowHistory.elementAt(i).toString(), startX + 2, yPos + 1,
Graphics.TOP | Graphics.LEFT);
yPos = yPos + font.getHeight() + 2;
}
graphics.setColor(0x000000);
graphics.drawRect(startX, charsHeight, charsWidth, yPos);
}
}
/**
* paintRect
*画方框
* @param graphics Graphics
* @param xPos int
* @param yPos int
*/
private void paintRect(Graphics graphics, int charsWidth, int charsHeight,
int startX) {
//注意的是 当输入框获得焦点的时候 里面要有多一个方框
if (hasFocus) {
graphics.setColor(0x0A24C3);
graphics.drawRect(startX - 1, charsHeight - 1, charsWidth + 2,
font.getHeight() + 2);
}
else {
graphics.setColor(fontColor);
}
graphics.drawRect(startX - 1, charsHeight - 1, charsWidth + 2,
font.getHeight() + 2);
}
/**
* paintPassword
* 绘画密码
* @param graphics Graphics
* @param xPos int
* @param yPos int
* @return int
*/
private int paintPassword(Graphics graphics, int xPos, int yPos) {
int startX = xPos;
for (int i = 0; i < numOfVisible; i++) {
graphics.drawChar('*', xPos + 2, yPos + 1, Graphics.TOP | Graphics.LEFT);
xPos = xPos + font.charWidth(textChars[i]);
}
paintRect(graphics, xPos + 2, yPos + 1, startX);
return xPos;
}
/**
* 绘画文字plaintext
* @param graphics Graphics
*/
private int paintPlainText(Graphics graphics, int xPos, int yPos) {
int startX = xPos;
for (int i = 0; i < numOfVisible; i++) {
graphics.drawChar(textChars[i], xPos + 2, yPos + 1,
Graphics.TOP | Graphics.LEFT);
xPos = xPos + font.charWidth(textChars[i]);
}
paintRect(graphics, xPos + 2, yPos + 1, startX);
if (iIsDragDown)
paintDragDown(graphics, xPos + 2, yPos + font.getHeight() + 1, startX);
return xPos;
}
/**
* 画左侧标签
* @param graphics Graphics
*/
private void paintLabel(Graphics graphics) {
if ("".equals(label) || null == label)
return;
else {
graphics.drawString(label, position[X], position[Y] + 1,
Graphics.TOP | Graphics.LEFT);
}
}
public void onClick(int keyCode) {
if (!hasFocus) //如果当前画面的焦点不在输入框,则不处理键盘输入
return;
if (keyCode > 48 && keyCode < 58) {
addText(keyCode);
}
else if (keyCode == Platform.KEY_CLEAR) {
deleteText();
}
else if (keyCode == Platform.KEY_ENTER) {
changeDragDown();
}
else if (keyCode == Platform.KEY_DOWN) {
iItemFocus = (iItemFocus + 1) % (iShowHistory.size());
}
else if (keyCode == Platform.KEY_UP) {
iItemFocus = iItemFocus > 0 ? (--iItemFocus) : (iShowHistory.size()- 1);
}
else if (keyCode == Platform.KEY_STAR) {
//打开网络连接
HttpRequest curRequest = new HttpRequest(text,HttpConnection.GET,null,null);
HttpWaitUI wait = new HttpWaitUI(curRequest.getUrl(),new DataCanvas(((TextBoxCanvas)canvas).getMIDlet()),((TextBoxCanvas)canvas).getMIDlet());
((TextBoxCanvas)canvas).getMIDlet().getDisplay().setCurrent(wait);
}
}
/**
* 将这个方法使得下拉菜单展开或折叠
*/
private void changeDragDown() {
if (iIsDragDown) {
text = (String)iShowHistory.elementAt(iItemFocus);
setText(text);
}else{
loadHistory(text);
}
iIsDragDown = !iIsDragDown ;
getCanvas().setTextBoxDragDown(iIsDragDown);
}
/**
* openTextBox 将输入结果显示在TextBox
*
*/
private void openTextBox() {
stub.setString(text);
display.setCurrent(stub);
}
/**
* deleteText 监视text的一个字符
*/
private void deleteText() {
text = text.substring(0, text.length() > 0 ? text.length() - 1 : 0);
setText(text);
loadHistory(text);
}
/**
* addText 增加text的字符
* 09-12-31 修改支持英文输入
* 修改支持自动下拉菜单
*
* @param KeyCode int
*/
private void addText(int keyCode) {
// System.out.println("Text now is :" + text );
if (text.length() > maxSize)
return;
int k = keyCode - 48;
text += String.valueOf(k);
setText(text);
loadHistory(text);
}
public void commandAction(javax.microedition.lcdui.Command command,
Displayable displayable) {
if (command == okCommand) {
setText(stub.getString());
url = stub.getString();
}
display.setCurrent(canvas);
}
public void run() {
try {
flicker();
}
catch (Exception e) {
}
}
/**
* flicker 定时器用于闪动光标
*/
private void flicker() {
isflicker = !isflicker;
canvas.repaint();
}
/**
* 标题栏高度 + 方框高度
* @return int
*/
public int getHeight() {
return 20 + font.getHeight() + 2;
}
}