📄 cardeditor.java
字号:
import javax.microedition.pim.*;
import javax.microedition.lcdui.*;
import java.util.*;
/**
* CardEditor类是个名片编辑器,提供了名片的编辑视图,及相关的编辑命令。
*/
public class CardEditor extends MicroComponent implements CommandListener, ItemCommandListener {
//
private CardcaseMIDlet midlet;
private MicroComponent backScreen; //返回屏幕
private Cardcase cardcase; //名片盒
private Contact card; //名片
private Form cardView; //名片视图
private Hashtable fieldTable = new Hashtable(); //存储视图中的Item项与对应的字段
private Command cmdBack = new Command("返回", Command.BACK, 1);
private Command cmdAddField = new Command("添加字段", Command.SCREEN, 2);
private Command cmdSave = new Command("保存名片", Command.SCREEN, 3);
private Command cmdEditArray = new Command("编辑数组字段", Command.SCREEN, 4);
private Command cmdDelField = new Command("删除字段", Command.SCREEN, 5);
private Command cmdShowPhoto = new Command("显示照片", Command.SCREEN, 6);
//构造方法,创建一个名片编辑器
public CardEditor(Cardcase cardcase, Contact card, CardcaseMIDlet midlet, MicroComponent backScreen) {
this.cardcase = cardcase;
this.card = card;
this.midlet = midlet;
this.backScreen = backScreen;
cardView = new Form("名片——" + cardcase.getCardLabel(card));
cardView.addCommand(cmdBack);
cardView.addCommand(cmdSave);
cardView.setCommandListener(this);
}
//显示名片视图
public void show() {
updateView(); //更新视图
Display.getDisplay(midlet).setCurrent(cardView);
}
//更新名片视图
private void updateView() {
//清除
cardView.deleteAll();
fieldTable.clear();
//获取名片card使用的字段
int[] usedFields = cardcase.getUsedFields(card);
for(int i=0; i<usedFields.length; i++) { //构造新视图
if(usedFields[i]==Contact.CLASS) { //忽略CLASS字段
continue;
}
populateField(usedFields[i]); //在视图中添加被使用的字段
}
int[] supportedFields = cardcase.getSupportedFields(card);
if(usedFields.length < supportedFields.length) {
cardView.addCommand(cmdAddField);
}
else {
cardView.removeCommand(cmdAddField);
}
}
//向视图中添加一个表示field字段的Item组件,该方法在更新视图时调用。
private void populateField(int field) {
//获取字段field的标签和数据类型
String fieldLabel = cardcase.getFieldLabel(card, field);
int fieldType = cardcase.getFieldType(card, field);
Item fieldView = null; //字段视图
switch(fieldType) {
case Contact.BOOLEAN: { //处理boolean类型的字段
fieldView = new ChoiceGroup(fieldLabel, Choice.EXCLUSIVE);
((ChoiceGroup)fieldView).append("是", null);
((ChoiceGroup)fieldView).append("否", null);
boolean boo = card.getBoolean(field, 0);
if(boo) {
((ChoiceGroup)fieldView).setSelectedIndex(0, true);
}
else {
((ChoiceGroup)fieldView).setSelectedIndex(1, true);
}
break;
}
case Contact.INT: { //处理int类型字段
String intVal = String.valueOf(card.getInt(field, 0));
fieldView = new TextField(fieldLabel, intVal,
intVal.length()*2, TextField.NUMERIC);
break;
}
case Contact.DATE: { //处理日期类型的字段
long dt = card.getDate(field, 0);
if(field == Contact.REVISION) { //REVISION字段不可编辑
Calendar cale = Calendar.getInstance();
cale.setTime(new Date(dt));
StringBuffer sb = new StringBuffer();
sb.append(cale.get(Calendar.YEAR)); sb.append("年");
sb.append(cale.get(Calendar.MONTH) + 1); sb.append("月");
sb.append(cale.get(Calendar.DAY_OF_MONTH)); sb.append("日");
fieldView = new StringItem(fieldLabel, sb.toString());
}
else {
fieldView = new DateField(fieldLabel, DateField.DATE);
((DateField)fieldView).setDate(new Date(dt));
}
break;
}
case Contact.STRING: { //处理字符串类型的字段
String str = card.getString(field, 0);
if(field == Contact.UID) { //UID字段不可编辑
fieldView = new StringItem(fieldLabel, str);
}
else {
int constraints = TextField.ANY;
if(field == Contact.EMAIL) {
constraints = TextField.EMAILADDR;
}
else if(field == Contact.TEL) {
constraints = TextField.PHONENUMBER;
}
else if(field == Contact.URL || field == Contact.PHOTO_URL) {
constraints = TextField.URL;
}
fieldView = new TextField(fieldLabel, str, 160, constraints);
}
break;
}
case Contact.STRING_ARRAY: { //处理字符串数组类型的字段
String[] a = card.getStringArray(field, 0);
if(a != null) {
fieldView = new StringItem(fieldLabel, cardcase.joinStringArray(a),
Item.HYPERLINK);
fieldView.setDefaultCommand(cmdEditArray); //添加字段编辑命令
}
break;
}
case Contact.BINARY: { //处理二进制类型的字段
byte[] data = card.getBinary(field, 0);
if (data != null) {
fieldView = new StringItem(fieldLabel + " ",
data.length + " bytes", Item.HYPERLINK);
if(field == Contact.PHOTO) { //照片
fieldView.setDefaultCommand(cmdShowPhoto); //添加显示照片命令
}
}
break;
}
}
if(fieldView != null) {
cardView.append(fieldView);
fieldTable.put(fieldView, new Integer(field)); //记录Item组件和对应字段
fieldView.addCommand(cmdDelField); //为每个字段的Item组件添加删除命令
fieldView.setItemCommandListener(this);
}
}
//处理视图中的命令
public void commandAction(Command cmd, Displayable d) {
if(cmd == cmdBack) { //返回
backScreen.show();
}
else if(cmd == cmdSave) { //保存名片
try {
this.getViewData(); //获取视图数据
card.commit(); //提交
this.updateView(); //更新视图
}
catch(PIMException pime) {
midlet.showError("保存名片错误!原因:\n" + pime.toString());
}
}
else if(cmd == cmdAddField) { //添加字段
//创建字段选择对话框,并显示该对话框,提示用户选择要添加的字段。
SelectionDialog fsDialog = createFeildSelectionDialog();
fsDialog.show();
}
}
//处理字段Item上的命令
public void commandAction(Command cmd, Item item) {
int field = ((Integer) fieldTable.get(item)).intValue(); //获取的字段
if(cmd == cmdEditArray) { //编辑数组字段
//创建字段数组编辑器,然后显示编辑器
ArrayElementEditor arrElemEditor = new ArrayElementEditor(cardcase, card, field, midlet, this);
arrElemEditor.show();
}
else if(cmd == cmdShowPhoto) { //显示照片
/*-------------请读者完成该功能--------------------*/
}
else if(cmd == cmdDelField) { //删除字段
if(field == Contact.REVISION || field == Contact.UID) {
String fieldLabel = cardcase.getFieldLabel(card, field); //
midlet.showError("\"" + fieldLabel+"\"是只读字段,不能删除!");
}
else {
card.removeValue(field, 0);
updateView(); //更新视图
}
}
}
//把视图中的数据存储到名片card中,该方法在添加字段,提交名片数据时将被调用。
private void getViewData() {
int fieldCount = cardView.size(); //视图中的字段数
for (int i = 0; i < fieldCount; i++) {
Item viewItem = cardView.get(i); //字段视图
int field = ((Integer)fieldTable.get(viewItem)).intValue();
if (card.countValues(field) < 1) {
continue;
}
int fieldType = cardcase.getFieldType(card, field);
switch (fieldType) {
case PIMItem.STRING: {
if(field == Contact.UID) { //不可编辑
//
}
else {
String s = ((TextField)viewItem).getString();
card.setString(field, 0, PIMItem.ATTR_NONE, s);
}
break;
}
case PIMItem.DATE: {
if(field == Contact.REVISION) { //不可编辑
//
}
else {
long dt = ((DateField)viewItem).getDate().getTime();
card.setDate(field, 0, PIMItem.ATTR_NONE, dt);
}
break;
}
case PIMItem.INT: {
String s = ((TextField)viewItem).getString();
int j = Integer.parseInt(s);
card.setInt(field, 0, PIMItem.ATTR_NONE, j);
break;
}
case PIMItem.BOOLEAN: {
boolean boo = ((ChoiceGroup)viewItem).isSelected(0);
card.setBoolean(field, 0, PIMItem.ATTR_NONE, boo);
break;
}
}
}
}
//创建字段选择对话框
private SelectionDialog createFeildSelectionDialog() {
final SelectionDialog fsDialog = new SelectionDialog(Display.getDisplay(midlet),
"请选择添加的字段", Choice.MULTIPLE);
int[] unField = cardcase.getUnusedFields(card);
final Vector unusedFields = new Vector();
for(int i=0; i<unField.length; i++) {
if(unField[i] == Contact.CLASS ||
unField[i] == Contact.REVISION ||
unField[i] == Contact.UID) { //忽略CLASS,REVISION,UID字段
continue;
}
fsDialog.append(cardcase.getFieldLabel(card, unField[i]));
unusedFields.addElement(new Integer(unField[i]));
}
fsDialog.setSelectionDialogListener(new SelectionDialogListener() {
public void actionDialog(SelectionDialog sDialog) {
int handle = sDialog.getHandle(); //用户的操作
if(handle == SelectionDialog.OK) {
boolean[] flags = new boolean[unusedFields.size()];
fsDialog.getSelectedFlags(flags);
for(int i=0; i<flags.length; i++) {
if(flags[i]) { //选中字段
int fieldCode = ((Integer)unusedFields.elementAt(i)).intValue();
cardcase.addFieldToCard(card, fieldCode);//
}
}
getViewData();
CardEditor.this.show();
}
else if(handle == SelectionDialog.CANCEL) {
Display.getDisplay(midlet).setCurrent(cardView);
}
}
});
return fsDialog;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -