📄 msnmidlet.java
字号:
package vitular.msnclient;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import vitular.msnp.event.*;
import vitular.msnp.entity.*;
import vitular.msnp.*;
import vitular.msnp.msg.*;
import vitular.msnp.BuddyList;
import java.util.Hashtable;
import vitular.ui.*;
import java.util.Vector;
import java.util.TimerTask;
import java.util.Timer;
/**
* <p>Title: msn客户端</p>
* <p>Description: 应用程序</p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: 维度动力</p>
* @author JJ
* @version 1.0
*/
public class msnMIDlet extends MIDlet implements MsnListener, CommandListener{
static msnMIDlet instance;
static final boolean DEBUG = true;
private static final String[] login_menu_item = {"登陆MSN","设置默认用户","声音:开","帮 助","关 于","退 出"};
static final byte STATUS_SPLASH = 0; //闪屏
static final byte STATUS_MENU_LOGIN = 1; //登陆菜单
static final byte STATUS_MENU_MSN = 2; //MSN操作菜单
static final byte STATUS_MENU_GROUP = 3; //分组菜单
static final byte STATUS_MENU_FRIEND = 4; //分组内部好友名单
static final byte STATUS_TEXTBOARD = 5;//显示文本板
static final byte STATUS_FLASH = 6; //显示动画
static final byte STATUS_FORM_LOGIN = 7;//登陆姓名框
//static final byte STATUS_FORM_ASKNAME = 8; //询问姓名框
static final byte STATUS_FORM_ADDBUDDY = 9; //添加好友
static final byte STATUS_FORM_DELBUDDY = 10; //添加好友
static final byte STATUS_FORM_INPUT = 11; //输入消息框
static final byte STATUS_FORM_TEXT = 12; //显示消息框
static final byte STATUS_MENU_MSG = 13; //未读消息菜单
static final byte STATUS_MENU_OPERATION = 14; //操作菜单
static final byte STATUS_MENU_ALLBUDDY = 15; //显示所有联系人
static final byte STATUS_SAVE_MSG = 16; //存储消息
static final byte STATUS_MENU_OLDMSG = 17; //查看保存的信息
static final byte STATUS_DEL_MSG = 18; //删除消息状态
static final int MENU_STRING_MAX_WIDTH = 80;//菜单项文字的最大宽度
static final short MSG_MAX_COUNT = 20; //最多保存的记录数
private static final String STR_HELP = "就是说怎么用这个东西";
private static final String STR_ABOUT = "版本号啦";
private byte loginError; //记录登陆错误数
private byte status; //记录当前的状态
//private byte oldStatus; //记录原来的状态
private Image[] img_menu_img; //menuMsn的图片
private static final String[] img_menu_item = {"添加联系人", "删除联系人","查看在线联系人","查看未读信息","查看保存的信息","注销"};
private Vector msgUnreadVec; //未读信息列表
//private Vector friendUnreadVec; //纪录对应扇面列表的发消息的好友的名字
private ImgMenu menuMain; //主菜单
private ImgMenu menuUnreadMsg;//未读消息菜单
private ImgMenu menuFriendList; //好友列表菜单
private ImgMenu menuOperation; //对好友的操作菜单
private ImgMenu menuAllFriendList;//全部好友的列表
private ImgMenu menuOldMsg; //历史消息列表
private ImgMenu menuMsn;//msn菜单
private Vector buddyOnline; //在线好友
private Hashtable hashBuddyMsgCount; //用于记录好友发来的未读消息的数目
UIControl canvas;
MsgForm form;
TextBox textbox;
MSNMessenger msnMessenger;
MsgDB db;
String username = new String("ceze_dang@hotmail.com");
String password = new String("cezedang");//用户名,密码
private Image imgFlash;
private boolean bSoundOn = true;//声音开关的状态
private String flashStr;//播放动画的时候显示的文字
private String textboxStr; //textbox中的文字
private String leftCmdStr, rightCmdStr;//左右command显示的文字
private String textboardTitle, textboardContent; //文本板的标题和内容
private byte leftStatus, rightStatus;//左右的command被按下时应切换的状态
//private int[] groupOnlineNumList; //好友分组的在线人数
private int selOnlineFriend = -1; //当前选中的在线好友
public msnMIDlet() {
instance = this;
status = 0;
//初始化 canvas
canvas = new UIControl();
canvas.setCommandListener(this);
Display.getDisplay(this).setCurrent(canvas);
//初始化loginForm
form = new MsgForm("", MsgForm.T_LOGIN);
form.setCommandListener(this);
//初始化textBox
textbox = new TextBox("写信息", null, 100, TextField.ANY);
textbox.addCommand(new Command("确定", Command.ITEM, 1));
textbox.addCommand(new Command("取消", Command.ITEM, 1));
textbox.setCommandListener(this);
//初始化其他的内容
flashStr = "";
textboxStr = "";
leftCmdStr = rightCmdStr = "";
textboardTitle = textboardContent = "";
leftStatus = rightStatus = 0;
loginError = 0;
username = form.getItemString(MsgForm.ITEM_LOGINNAME);
password = form.getItemString(MsgForm.ITEM_PASSWORD);
msgUnreadVec = new Vector();
bSoundOn = true;
// Debug 信息
Debug.printOutput = true;
Debug.printInput = true;
// Debug.printMime = true;
//end
//图片
try{
imgFlash = Image.createImage("/res/flashmenu.png");
img_menu_img = new Image[6];
for (int i = 1; i <= 6; i++) {
String s = "/res/menu" + i + ".png";
Image img = Image.createImage("/res/menu" + i + ".png");
img_menu_img[i-1] = img;//Image.createImage("/res/menu" + i + ".png");
}
}
catch(Exception e){
System.out.println("msnMIDlet error:" + e.toString());
}
try{
//菜单
menuMain = new ImgMenu(canvas, false);
menuMain.setFlashImg(imgFlash);
for (int i = 0; i < 6; i++) {
menuMain.addItem(login_menu_item[i]);
}
menuUnreadMsg = new ImgMenu(canvas, false);
menuUnreadMsg.setAlignType(ImgMenu.ALIGN_LEFT);
menuFriendList = new ImgMenu(canvas, false);
menuFriendList.setFlashImg(imgFlash);
menuFriendList.setAlignType(ImgMenu.ALIGN_LEFT);
menuOperation = new ImgMenu(canvas, false);
menuOperation.addItem("送信息");
menuOperation.addItem("察看未读信息");
menuOperation.addItem("删除联系人");
menuAllFriendList = new ImgMenu(canvas, false);
menuAllFriendList.setAlignType(ImgMenu.ALIGN_LEFT);
menuOldMsg = new ImgMenu(canvas, false);
menuOldMsg.setAlignType(ImgMenu.ALIGN_LEFT);
menuMsn = new ImgMenu(canvas, true);
for (int i = 0; i < 6; i++){
menuMsn.addItem(img_menu_item[i], img_menu_img[i]);
}
canvas.resetImgMenu(menuMsn);
//在线好友
buddyOnline = new Vector();
//好友消息列表
hashBuddyMsgCount = new Hashtable();
//历史信息
db = new MsgDB("oldmsg2");
loadOldMsg();
}catch(Exception e){
System.out.println("MsnL...init error"+ e.toString());
}
}
public void startApp() {
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public static void quitApp() {
instance.destroyApp(true);
instance.notifyDestroyed();
instance = null;
}
// /**
// * 改变当前的显示状态
// * @param status byte
// */
// public void changeStatus(byte status){
// switch(status){
// case STATUS_FORM_LOGIN:
// form.changeFormType(MsgForm.T_LOGIN);
// Display.getDisplay(this).setCurrent(form);
// break;
// case STATUS_FORM_ASKNAME:
// form.changeFormType(MsgForm.T_ASKNAME);
// Display.getDisplay(this).setCurrent(form);
// break;
//
// }
// }
//监听MsnListener的消息
/**
* 登陆完成
* @param own MsnFriend
*/
public void loginComplete(MsnFriend own){
System.out.println("loginComplete");
canvas.stopFlash();
setStatus(STATUS_MENU_MSN);
freshMenuAllFriendList();
}
/**
* 登陆错误
* @param header String
*/
public void loginError(String header){
System.out.println(header);
if (loginError++ < 3){//重新尝试登陆
//msnMessenger.login();
}else{
canvas.stopFlash();
this.showTextBoard("登陆MSN失败!$请确认用户名及密码后再试", "错误", "确定", "",
STATUS_MENU_LOGIN, this.status);
}
}
/**
* ??
*/
public void listOnline(MsnFriend friend){
freshBuddyOnLineVec();
System.out.println(".....MsnL.....listOnline" + friend.getFriendlyName());
}
/**
* 好友上线,或状态发生改变
* @param friend MsnFriend
*/
public void userOnline(MsnFriend friend){
freshBuddyOnLineVec();
System.out.println(".....MsnL.....userOnline" +friend.getFriendlyName());
}
/**
* 好友下线
* @param loginName String
*/
public void userOffline(String loginName){
freshBuddyOnLineVec();
System.out.println("MsnL.....userOffline" + loginName);
}
/**
* 开始一个中转服务器session
* @param ss SwitchboardSession
*/
public void switchboardSessionStarted(SwitchboardSession ss){
}
/**
* 某好友加入到一个会话中
* @param ss SwitchboardSession 会话中转服务器session
* @param join MsnFriend 好友
*/
public void whoJoinSession(SwitchboardSession ss, MsnFriend join){
System.out.println("MsnL.....whoJoinSession" + join.getFriendlyName());
}
/**
* 好友离开ss此会话
* @param ss SwitchboardSession
* @param part MsnFriend
*/
public void whoPartSession(SwitchboardSession ss, MsnFriend part){
System.out.println("whoPartSession" + part.getFriendlyName());
}
/**
* 会话中转服务器结束
* @param ss SwitchboardSession
*/
public void switchboardSessionEnded(SwitchboardSession ss){
}
/**
* 放弃???
*/
public void switchboardSessionAbandon(SwitchboardSession ss,
String targetName){
}
/**
* 好友正在输入文字
* @param ss SwitchboardSession 中转服务器session
* @param friend MsnFriend
* @param typingUser String
*/
public void progressTyping(SwitchboardSession ss,
MsnFriend friend, String typingUser){
System.out.println("MsnL.....progressTyping" +typingUser);
}
/**
* 即时消息进入
* @param ss SwitchboardSession 中转服务器session
* @param friend MsnFriend
* @param mime MimeMessage
*/
public void instantMessageReceived(SwitchboardSession ss,
MsnFriend friend, MimeMessage mime){
// System.out.println("instantMessageReceived form "
// +friend.getFormattedFriendlyName() + ":"+ mime.getMessage());
Msg msg = new Msg(mime.getMessage(),
Util.getCurTime(),
friend.getLoginName());
//向未读消息列表中添加一项
msgUnreadVec.addElement(msg);
//向好友未读消息统计表中添加一项
Integer n = (Integer)hashBuddyMsgCount.get(friend.getLoginName());
if (n != null){//不为空,说明原来就有该好友的未读消息
hashBuddyMsgCount.put(friend.getLoginName(), new Integer(n.intValue()+1));
}else{
hashBuddyMsgCount.put(friend.getLoginName(), new Integer(1));
flashFriendMenu(friend.getLoginName(), true);
}
notifyCanvasNewMessage();
// try{
// msnMessenger.sendMessage(friend.getLoginName(), mime);
// }
// catch(Exception e){}
}
/**
* 告诉canvas受到了新消息
* canvas的信息做相应的改变
* 在instantMessageReceived中被调用
*/
private void notifyCanvasNewMessage(){
System.out.println("MsnL.....notifyCanvasNewMessage: unreadmsg "+ msgUnreadVec.size());
canvas.showMsg(true);
canvas.setMsg("有"+msgUnreadVec.size()+"条未读信息,按5查看");
canvas.playSound();
//String strList[] = new String[msgUnreadVec.size()];
//boolean bList[] = new boolean[msgUnreadVec.size()];
menuUnreadMsg.removeAllItem();
Font font = menuUnreadMsg.getFont();
for (int i = 0; i < msgUnreadVec.size(); i++){
//strList[i] = ((Msg)msgUnreadVec.elementAt(i)).getName().substring(0,5) + "...";
menuUnreadMsg.addItem(Util.getShowString(font, ((Msg)msgUnreadVec.elementAt(i)).getMsg(),
MENU_STRING_MAX_WIDTH, "..."));
//menuUnreadMsg.addItem(((Msg)msgUnreadVec.elementAt(i)).getName().substring(0,5) + "...");
//bList[i] = false;
}
//canvas.resetTextMenu(menuUnreadMsg);
//canvas.resetTextMenu(strList, bList);
}
/**
* 设置指定名字的菜单项的闪烁情况
* @param loginName String 好友的账号
* @param bFlash boolean 是否闪烁
*/
private void flashFriendMenu(String loginName, boolean bFlash){
System.out.println("MsnL.....flashFriendMenu:" + loginName + "bfalsh = " + bFlash);
for (int i = 0; i < buddyOnline.size(); i++){
if (((MsnFriend)buddyOnline.elementAt(i)).getLoginName().equals(loginName)){
this.menuFriendList.flashMenuItem(i, bFlash);
return;
}
}
}
/**
* 更新buddyOnline列表
*/
private void freshBuddyOnLineVec(){
BuddyList forwardList = msnMessenger.getBuddyGroup().getForwardList();
try{
menuFriendList.removeAllItem();
buddyOnline.removeAllElements();
Font font = menuFriendList.getFont();
for (int i = 0; i < forwardList.size(); i++) {
//只有当对方为空闲状态时才显示为在线联系人
System.out.println(forwardList.get(i).getLoginName() + "'s state = " + forwardList.get(i).getStatus());
if (!(forwardList.get(i).getStatus().equals("FLN") || forwardList.get(i).getStatus().equals("HDN"))){
buddyOnline.addElement(forwardList.get(i));
menuFriendList.addItem(Util.getShowString(font,
forwardList.get(i).getFriendlyName()
, MENU_STRING_MAX_WIDTH,
"..."));
// if (forwardList.get(i).getFriendlyName().length() > 8)
// menuFriendList.addItem(forwardList.get(i).getFriendlyName().substring(
// 0, 8)+"...");
// else
// menuFriendList.addItem(forwardList.get(i).getFriendlyName());
if (hashBuddyMsgCount.get(forwardList.get(i).getLoginName()) != null){
menuFriendList.flashMenuItem(i, true);
}
}
}
canvas.resetTextMenu(menuFriendList);
System.out.println("forwardList.size = " + forwardList.size());
}catch(Exception e){
System.out.println("showOnlineBuddy error: "+e.toString());
}
}
/**
* 从menuUnreadMsg中读取第index条信息
* @param index int
* @return String 信息内容
*/
private String readMsg(int index){
String myMsg = ((Msg) msgUnreadVec.elementAt(index)).toString();
String s = Util.getField(myMsg, 1, "$");
Integer n = (Integer) hashBuddyMsgCount.get(s);
if (n != null) {
if (n.intValue() == 1){
hashBuddyMsgCount.remove(Util.getField(myMsg, 1, "$"));
flashFriendMenu(Util.getField(myMsg, 1, "$"), false);
}else{
hashBuddyMsgCount.put(Util.getField(myMsg, 1, "$"), new Integer(n.intValue()-1));
}
}
msgUnreadVec.removeElementAt(index);
this.menuUnreadMsg.removeItemAt(index);
if (msgUnreadVec.size() == 0)
canvas.showMsg(false);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -