📄 mainwin.java
字号:
package com.jim.client;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import org.apache.log4j.Logger;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import com.jim.database.JIMUser;
import com.jim.net.JIMProtocol;
import com.jim.net.Message;
import com.jim.net.RequestObject;
import com.swtdesigner.SWTResourceManager;
public class MainWin {
private List friendsList;
private Menu rightMenu;
private static Display display ;
private static HashMap<Integer,Shell> winList = new HashMap<Integer,Shell> ();
protected static Client client = new Client();
protected static Queue<Message> messages = new LinkedList<Message>();
protected static boolean loggedIn;
private Thread msgTh;
private Logger log = Logger.getLogger(MainWin.class);
private volatile Thread blinker;
private Object lock = new Object();
private Shell winShell;
//protected static MainWin mainWin;
//private static HashMap<Integer,Integer> fdList = new HashMap<Integer,Integer>();
//private Menu menu;
/**
* Launch the application
* @param args
*/
public static void main(String args[]) {/*
try {
Display display = Display.getDefault();
Login loginWin = new Login(display, SWT.CLOSE | SWT.MIN);
loginWin.open();
loginWin.layout();
while (!loginWin.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
if(!loggedIn)
return;
MainWin shell = new MainWin(display, SWT.SHELL_TRIM);
shell.open();
shell.layout();
//shell.setVisible(false);
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
} catch (Exception e) {
e.printStackTrace();
}
*/}
/**
* Create the shell
* @param display
* @param style
*/
public MainWin() {
this.display = Display.getCurrent();
createContents();
}
/**
* Create contents of the window
*/
protected void createContents() {
winShell = new Shell(display, SWT.CLOSE | SWT.MIN | SWT.RESIZE);
winShell.setText("JIM - "+client.getUser().getJimno());
winShell.setSize(256, 535);
winShell.setImage(SWTResourceManager.getImage(MainWin.class, "resources/1.bmp"));
winShell.setLayout(new FillLayout());
final Composite composite = new Composite(winShell, SWT.NONE);
composite.setLayout(new FormLayout());
final Group group = new Group(composite, SWT.BORDER);
final FormData formData = new FormData();
formData.right = new FormAttachment(100, -5);
formData.bottom = new FormAttachment(100, -5);
formData.left = new FormAttachment(0, 5);
formData.top = new FormAttachment(0, 0);
group.setLayoutData(formData);
group.setLayout(new FillLayout());
group.setText("好友列表");
friendsList = new List(group, SWT.V_SCROLL | SWT.H_SCROLL);
friendsList.setLocation(0, 0);
friendsList.addMouseListener(new MouseAdapter() {
public void mouseUp(MouseEvent event) {
showOp(event);
}
public void mouseDoubleClick(MouseEvent event) {
chat(event);
}
});
Iterator<JIMUser> i = Client.getUser().getFriends().values().iterator();
while(i.hasNext()){
friendsList.add(i.next().toString());
}
friendsList.setSize(212, 452);
final Menu menu = new Menu(winShell, SWT.BAR);
winShell.setMenuBar(menu);
winShell.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent de) {
winDispose(de);
}
});
final MenuItem menuItem = new MenuItem(menu, SWT.CASCADE);
menuItem.setText("菜单");
final Menu menu_1 = new Menu(menuItem);
menuItem.setMenu(menu_1);
/*
final MenuItem menuItem_4 = new MenuItem(menu_1, SWT.NONE);
menuItem_4.setText("接收消息");
menuItem_4.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
createMsgTh();
menuItem_4.setEnabled(false);
log.debug("**************new thread started **********");
}
});
*/
final MenuItem menuItem_1 = new MenuItem(menu_1, SWT.NONE);
menuItem_1.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
findUsers();
}
});
menuItem_1.setText("查找好友");
/*final MenuItem menuItem_2 = new MenuItem(menu_1, SWT.NONE);
menuItem_2.setText("添加好友");*/
final MenuItem menuItem_5 = new MenuItem(menu_1, SWT.NONE);
menuItem_5.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
updateMyInfo();
}
});
menuItem_5.setText("更新个人信息");
final MenuItem menuItem_6 = new MenuItem(menu_1, SWT.NONE);
menuItem_6.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
updateFriends();
}
});
menuItem_6.setText("更新好友列表");
final MenuItem menuItem_7 = new MenuItem(menu_1, SWT.NONE);
menuItem_7.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
register();
}
});
menuItem_7.setText("注册新用户");
new MenuItem(menu_1, SWT.SEPARATOR);
final MenuItem menuItem_3 = new MenuItem(menu_1, SWT.NONE);
menuItem_3.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
winDispose(null);
}
});
menuItem_3.setText("注销");
rightMenu = new Menu(winShell);
MenuItem item1= new MenuItem(rightMenu,SWT.NONE);
item1.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent se) {
viewInfor(se);
}
});
item1.setText("查看好友信息");
MenuItem item2= new MenuItem(rightMenu,SWT.NONE);
item2.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
deleteFriend();
}
});
item2.setText("删除好友");
//
}
protected void deleteFriend() {
int selected = friendsList.getSelectionIndex();
if(selected < 0)
return;
Integer uid = retrieveNo(friendsList.getItem(selected));
client.deleteFriend(uid);
client.getUser().deleteFriend(uid);
friendsList.remove(selected);
MessageBox mb = new MessageBox(winShell,SWT.ICON_INFORMATION | SWT.OK);
mb.setMessage("删除好友成功");
mb.open();
}
protected void findUsers() {
ArrayList<JIMUser> added = null;
FindUsersDialog fud = new FindUsersDialog(winShell);
added = fud.open();
if(added.size() == 0)
return;
JIMUser self = client.getUser();
for(JIMUser u : added ){
self.addFriend(u);
friendsList.add(u.toString());
}
friendsList.redraw();
}
protected void updateFriends() {
if(client.getUser().getFriendshipsForMasterno().size() == 0){
MessageBox mb = new MessageBox(winShell,SWT.ICON_INFORMATION | SWT.OK);
mb.setMessage("好友列表为空");
mb.open();
}else{
RequestObject ret = client.updateFriends();
String status = (String)ret.getParameter("status");
JIMUser u =(JIMUser) ret.getParameter("user");
if(status.equals("OK")){
client.setUser(u);
friendsList.removeAll();
for(JIMUser user : u.getFriends().values()){
friendsList.add(user.toString());
}
friendsList.redraw();
MessageBox mb = new MessageBox(winShell,SWT.ICON_INFORMATION | SWT.OK);
mb.setMessage("好友列表更新成功");
mb.open();
return;
}
MessageBox mb = new MessageBox(winShell,SWT.ICON_INFORMATION | SWT.OK);
mb.setMessage(status);
mb.open();
}
}
protected void updateMyInfo() {
InforCardDialog icd = new InforCardDialog(winShell,InforCardDialog.UPDATE,true);
JIMUser u = client.getUser();
icd.numText.setText(""+u.getJimno());
icd.pwdText.setText(""+u.getPwd());
icd.nickText.setText(""+u.getNicknm());
icd.ageText.setText(""+u.getAge());
icd.nameText.setText(""+u.getName());
icd.cityText.setText(""+u.getCity());
icd.faceCombo.setText(icd.faceCombo.getItem(u.getPicindex()));
if(u.getGender().equals(JIMUser.MALE)){
icd.maleButton.setSelection(true);
}else{
icd.femaleButton.setSelection(true);
}
icd.emailText.setText(""+u.getEmail());
icd.inforText.setText(""+u.getInfor());
icd.open();
}
protected void register() {
InforCardDialog icd = new InforCardDialog(winShell,InforCardDialog.REGISTER,true);
icd.open();
}
public void open(){
winShell.open();
winShell.layout();
client.setMaiWin(this);
/*display.asyncExec(new Thread(){
public void run(){
Message msg = null;
Thread thisThread = Thread.currentThread();
blinker = thisThread;
while (blinker == thisThread) {
if (messages.isEmpty()) {
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
synchronized (messages) {
msg = messages.poll();
}
showMsg(msg);
}
}
});*/
while (!winShell.isDisposed()) {
if(!display.readAndDispatch()){
display.sleep();
}
}
}
protected void viewInfor(SelectionEvent se) {
// InforCard ic = null;
InforCardDialog ic = null;
int selected = friendsList.getSelectionIndex();
if( selected < 0)
return;
selected = retrieveNo(friendsList.getItem(selected));
/*if((ic = (InforCardDialog)getWin(-selected)) != null){
ic.setActive();
return;
}*/
ic = new InforCardDialog(winShell,InforCardDialog.UPDATE,false);
ic.setKey(-selected);
//putWin(ic.getKey(), ic);
JIMUser u = client.getUser().getFriends().get(selected);
ic.numText.setText(""+u.getJimno());
ic.pwdText.setText(""+u.getPwd());
ic.nickText.setText(""+u.getNicknm());
ic.ageText.setText(""+u.getAge());
ic.nameText.setText(""+u.getName());
ic.cityText.setText(""+u.getCity());
ic.faceCombo.setText(ic.faceCombo.getItem(u.getPicindex()));
if(u.getGender().equals(JIMUser.MALE)){
ic.maleButton.setSelection(true);
}else{
ic.femaleButton.setSelection(true);
}
ic.emailText.setText(""+u.getEmail());
ic.inforText.setText(""+u.getInfor());
ic.open();
/*while (!ic.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}*/
}
protected void winDispose(DisposeEvent de) {
blinker = null;
//msgTh.notify();
Iterator<Shell> i = winList.values().iterator();
while(i.hasNext()){
Shell sh = i.next();
if(sh != null && !sh.isDisposed())
sh.close();
}
client.logout();
winShell.close();
}
protected void chat(MouseEvent event) {
ChatWin win = null;
int selected = retrieveNo(friendsList.getItem(friendsList.getSelectionIndex()));
if((win =(ChatWin) getWin(selected)) != null){
win.setActive();
return;
}
//log.debug(selected);
if(selected >= 0){
JIMUser u = client.getUser().getFriends().get(selected);
win = new ChatWin(display,SWT.SHELL_TRIM);
win.setKey(selected);
win.setMyJimno(client.getUser().getJimno());
putWin(win.getKey(),win);
String title="";
if(u.getNicknm()==null ||u.getNicknm().equals(""))
title += u.getJimno();
else
title += u.getNicknm();
win.setText(win.getText()+" - "+title);
win.open();
win.layout();
/*while (!win.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}*/
}
}
protected void showOp(MouseEvent event) {
if (event.button == 3 && (friendsList.getSelectionIndex()>= 0)) {
rightMenu.setVisible(true);
}
}
protected static void removeWin(int key){
winList.remove(key);
}
protected static Shell getWin(int key){
return winList.get(key);
}
public static Integer retrieveNo(String s){
int sIx = s.indexOf('[');
int eIx = s.indexOf(']');
return Integer.parseInt(s.substring(sIx+1, eIx));
}
public static void putWin(int key, Shell win) {
winList.put(key,win);
}
public void processMsg(Message msg){
log.debug("process message");
/*synchronized (messages) {
messages.add(msg);
}
synchronized(lock)
{
lock.notify();
}*/
String fn = "";
JIMUser u = client.getUser().getFriend(msg.getFrom());
if(u == null){
fn = "陌生人";
}else if(u.getNicknm()==null || u.getNicknm().equals("")){
fn += u.getJimno();
}else{
fn += u.getNicknm();
}
log.info("\nGET A MESSAGE FROM " + fn+"["+msg.getFrom()+"]" + " "+msg.getSendTime().toLocaleString());
log.info(msg.getContent());
log.debug("process message out");
}
private void showMsg(Message msg){
log.debug("show messages");
if(msg == null)
return;
int from = msg.getFrom();
ChatWin win = null;
Shell sh = MainWin.getWin(from);
if(sh != null){
log.debug("show messages");
win =(ChatWin) sh;
win.appendMsg(msg);
win.setActive();
}else{
win = new ChatWin(display,SWT.SHELL_TRIM);
JIMUser u = client.getUser().getFriend(from);
String title="";
if(u == null){
title += from;
}else if(u.getNicknm()==null ||u.getNicknm().equals("")){
title += u.getJimno();
}else{
title += u.getNicknm();
}
win.setText(win.getText()+" - "+title);
win.setKey(from);
MainWin.putWin(win.getKey(),win);
win.open();
win.layout();
win.appendMsg(msg);
log.debug("show messages");
}
log.debug(msg.getContent());
}
protected Thread createMsgTh() {
msgTh = new Thread() {
public void run() {
Message msg = null;
Thread thisThread = Thread.currentThread();
blinker = thisThread;
while (blinker == thisThread) {
if (messages.isEmpty()) {
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
synchronized (messages) {
msg = messages.poll();
}
showMsg(msg);
}
}
};
msgTh.setName("process message");
//msgTh.run();
display.asyncExec(msgTh);
return msgTh;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -