📄 mainshell.java
字号:
* @param newModel
*/
public void setMobileModel(ShutterModel newModel) {
// set model
mobileModel = newModel;
views[MOBILE_VIEW].setModel(mobileModel);
MobileMouseListener mml = new MobileMouseListener(this);
views[MOBILE_VIEW].addItemMouseListener(mml, 0);
views[MOBILE_VIEW].addContentMouseListener(mml, 0);
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
*/
public void widgetDisposed(DisposeEvent e) {
if(font != null) font.dispose();
if(defaultStyle != null)
if(defaultStyle.foreground != null)
defaultStyle.foreground.dispose();
if(groupColor != null) groupColor.dispose();
shutterBorderColor.dispose();
Colors.dispose();
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.ShellListener#shellIconified(org.eclipse.swt.events.ShellEvent)
*/
public void shellIconified(ShellEvent e) {
/* 如果使用AutoHideManager,则注释掉下面这段,但是目前自动隐藏还有问题 */
if(options.isAutoHide())
shell.setVisible(false);
if(!item.getVisible()) {
initTray();
uiHelper.setIconByStatus();
}
}
/**
* @param client The client to set.
*/
public void setClient(QQClient client) {
this.client = client;
int qqNum = client.getUser().getQQ();
myModel = new FriendModel(qqNum);
shell.setText(String.valueOf(qqNum));
// 初始化系统设置
configHelper.initSystemOptions();
// 初始化model
mvcHelper.initModel();
// 初始化备注信息
configHelper.initRemarks();
// 初始化手机好友
configHelper.initMobiles();
// 初始化快捷回复
configHelper.initReplies();
// 初始化代理列表
configHelper.initProxies();
// 初始化自定义表情
configHelper.initFaces();
// 初始化聊天记录管理器
initMessageManager(qqNum);
// 初始化QQ秀管理器
initQQShowManager(qqNum);
// 初始化手机好友视图
mvcHelper.initMobileModel();
// 设置声音精灵线程的使能性
soundDaemon.setEnable(options.isEnableSound());
// 设置其他Helper参数
menuHelper.setClient(client);
}
/**
* 初始化QQ秀管理器
* @param qq
*/
private void initQQShowManager(int qqNum) {
if(sm != null)
sm.removeQQShowListener(this);
sm = QQShowManager.getInstance(LumaQQ.INSTALL_DIR + "/" + String.valueOf(qqNum));
sm.addQQShowListener(this);
}
/**
* 初始化聊天记录管理器
*/
private void initMessageManager(int qqNum) {
mm = LumaQQMessageManager.getInstance(LumaQQ.INSTALL_DIR + "/" + String.valueOf(qqNum));
}
/**
* 创建字体
*/
public void createDefaultStyle() {
String fontName = options.getFontName();
if(fontName.equals(""))
fontName = LumaQQ.getString("default.font");
int style = SWT.NORMAL;
if(options.getBold()) style |= SWT.BOLD;
if(options.getItalic()) style |= SWT.ITALIC;
defaultStyle = new LineStyle(new Color(display, options.getRed(), options.getGreen(), options.getBlue()), null, fontName, style, options.getFontSize());
}
/**
* 上传分组
*/
private void uploadGroup() {
JobExecutor executor = new JobExecutor(this);
executor.addJob(new UploadGroupJob());
executor.run();
}
/**
* 检查分组是否修改过,根据系统设置判断是否上传
*/
public void checkGroupDirty() {
// 如果分组被修改了,检查系统设置
if(isGroupDirty() && client.getUser().isLoggedIn()) {
if(options.getAutoUploadGroup() == OptionUtil.PROMPT) {
if(MessageDialog.openQuestion(shell,
LumaQQ.getString("message.box.common.question.title"),
LumaQQ.getString("message.box.upload.group"))) {
uploadGroup();
}
} else if(options.getAutoUploadGroup() == OptionUtil.ALWAYS)
uploadGroup();
}
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.ShellListener#shellClosed(org.eclipse.swt.events.ShellEvent)
*/
public void shellClosed(ShellEvent e) {
// 上传分组
checkGroupDirty();
// 关闭Client
if(processor != null && client != null) client.removeQQListener(processor);
// 注销
if(client != null) client.logout();
// 保存好友分组信息
if(model != null) mvcHelper.saveModel();
// 释放Tray Icon
if(item != null) item.dispose();
// 停止声音线程
if(soundDaemon != null) soundDaemon.setStop(true);
// 保存当前设置
if(options.getOptionsModel() != null) {
// 保存窗口位置大小,自动隐藏相关的代码先注释掉
Rectangle bound = /* ahm.needHide() ? ahm.getHistoryBound() :*/ shell.getBounds();
options.setLocationX(bound.x);
options.setLocationY(bound.y);
options.setWidth(bound.width);
options.setHeight(bound.height);
// 保存字体信息
if(defaultStyle != null) {
options.setFontName(defaultStyle.fontName);
options.setFontSize(defaultStyle.fontSize);
options.setBold((defaultStyle.fontStyle & SWT.BOLD) != 0);
options.setItalic((defaultStyle.fontStyle & SWT.ITALIC) != 0);
}
// 保存字体颜色
if(defaultStyle.foreground != null) {
options.setRed(defaultStyle.foreground.getRed());
options.setGreen(defaultStyle.foreground.getGreen());
options.setBlue(defaultStyle.foreground.getBlue());
}
options.save();
}
// 保存手机好友列表
if(mobiles.getMobilesModel() != null)
mobiles.save();
// 关闭消息队列
if(mm != null) mm.close();
}
/* (non-Javadoc)
* @see edu.tsinghua.swt.events.PropertyListener#propertyAdded(edu.tsinghua.swt.events.PropertyEvent)
*/
public void propertyAdded(PropertyEvent e) {
// 没什么要做的
}
/* (non-Javadoc)
* @see edu.tsinghua.swt.events.PropertyListener#propertyRemoved(edu.tsinghua.swt.events.PropertyEvent)
*/
public void propertyRemoved(PropertyEvent e) {
// 没什么要做的
}
/* (non-Javadoc)
* @see edu.tsinghua.swt.events.PropertyListener#propertyModified(edu.tsinghua.swt.events.PropertyEvent)
*/
public void propertyModified(PropertyEvent e) {
// 没什么要做的
}
/* (non-Javadoc)
* @see edu.tsinghua.swt.events.ShutterModelListener#itemAdded(edu.tsinghua.swt.events.ShutterModelEvent)
*/
public void itemAdded(ShutterModelEvent e) {
// 没什么要做到
}
/* (non-Javadoc)
* @see edu.tsinghua.swt.events.ShutterModelListener#itemRemoved(edu.tsinghua.swt.events.ShutterModelEvent)
*/
public void itemRemoved(ShutterModelEvent e) {
// 没什么要做到
}
/* (non-Javadoc)
* @see edu.tsinghua.swt.events.ModelListener#modelAdded(edu.tsinghua.swt.events.ModelEvent)
*/
public void modelAdded(ModelEvent e) {
// 没什么要做到
}
/* (non-Javadoc)
* @see edu.tsinghua.swt.events.ModelListener#modelRemoved(edu.tsinghua.swt.events.ModelEvent)
*/
public void modelRemoved(ModelEvent e) {
// 没什么要做到
}
/**
* 删除一个成功或者失败的删除好友请求
*
* @param key
* 好友的QQ号
*/
public GroupModel removeDeleteToMap(Integer key) {
return (GroupModel)deleteToMap.remove(key);
}
/**
* 得到要删除的那个好友的qq号
*
* @param key
* 好友的QQ号,用作键值
* @return 要删除的好友的QQ号
*/
public int getDeletedFriend(Integer key) {
return ((Integer)deleteToMap.get(key)).intValue();
}
/**
* 关闭主shell
*/
public void close() {
shell.close();
}
/**
* 删除一个好友
*
* @param viewPart
* view part
* @param directly
* 表示是直接删除还是从服务器删除
* @param removeSelf
* 是否把自己从对方的好友列表中删除
*/
public void deleteFriend(CoolButton viewPart, boolean directly, boolean removeSelf) {
FriendModel f = (FriendModel)viewPart.getData();
int qqNum = f.getQQ();
int[] indices = null;
if(f.isOriginal())
indices = mvcHelper.getFriendCoordinate(qqNum);
else
indices = mvcHelper.getLatestCoordinate(qqNum);
if(directly && indices != null)
model.removeItem(indices[0], indices[1]);
else {
// 请求服务器删除该好友
deleteFriendFromServer(qqNum, true, removeSelf, null);
}
}
/**
* 从服务器上删除一个好友
*
* @param qqNum
* 要删除的QQ号,为0表示不执行删除动作
* @param doDelete
* 表示是否从向服务器发请求要求删除这个好友,如果这个QQ号不在我好友列表里面就不需要
* @param removeSelf
* 表示是否把自己也从这个好友的列表中删除
* @param g
* 表示这个好友删除后把它放置到哪个组,如果为null则忽略
*/
public void deleteFriendFromServer(int qqNum, boolean doDelete, boolean removeSelf, GroupModel g) {
// 如果删除请求包发送成功,则加入到删除请求哈希表中
if(doDelete) {
char seq = client.deleteFriend(qqNum);
if(seq != 0)
deleteToMap.put(new Integer(seq), new Integer(qqNum));
}
if(removeSelf)
client.removeSelfFrom(qqNum);
if(g != null)
deleteToMap.put(new Integer(qqNum), g);
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.ControlListener#controlMoved(org.eclipse.swt.events.ControlEvent)
*/
public void controlMoved(ControlEvent e) {
loc = shell.getLocation();
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.ControlListener#controlResized(org.eclipse.swt.events.ControlEvent)
*/
public void controlResized(ControlEvent e) {
// 没什么要做的
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.events.QQShowListener#qqShowDownloaded(edu.tsinghua.lumaqq.events.QQShowEvent)
*/
public void qqShowDownloaded(QQShowEvent e) {
final Integer key = (Integer)e.getSource();
if(shellRegistry.hasUserInfoWindow(key) && sm.isCached(key.intValue())) {
display.syncExec(
new Runnable() {
public void run() {
UserInfoWindow uis = shellRegistry.getUserInfoWindow(key);
if(uis != null)
uis.setQQShow(sm.getQQShowImage(key.intValue()));
}
}
);
}
}
/**
* 设置组的在线好友数属性
*
* @param tabIndex
* 组索引
* @param onlineNumber
* 在线好友数
*/
public void setGroupOnlineUser(int tabIndex, int onlineNumber) {
GroupModel g = (GroupModel)model.getTab(tabIndex);
g.setOnlineUser(onlineNumber);
}
/**
* 组在线好友数加1
*
* @param tabIndex
* 组索引
*/
public void increaseGroupOnlineUser(int tabIndex) {
GroupModel g = (GroupModel)model.getTab(tabIndex);
g.setOnlineUser(g.getOnlineUser() + 1);
}
/**
* 组在线好友数减1
*
* @param tabIndex
* 组索引
*/
public void decreaseGroupOnlineUser(int tabIndex) {
GroupModel g = (GroupModel)model.getTab(tabIndex);
g.setOnlineUser(g.getOnlineUser() - 1);
}
/**
* 组好友总数加1
*
* @param tabIndex
* 组索引
*/
public void increaseGroupUsers(int tabIndex) {
GroupModel g = (GroupModel)model.getTab(tabIndex);
g.setUsers(g.getUsers() + 1);
}
/**
* 组好友总数减1
*
* @param tabIndex
* 组索引
*/
public void decreaseGroupUser(int tabIndex) {
GroupModel g = (GroupModel)model.getTab(tabIndex);
g.setUsers(g.getUsers() - 1);
}
/**
* 设置窗口可见状态
*
* @param b
* true表示窗口可见
*/
public void setVisible(boolean b) {
shell.setVisible(b);
}
/**
* @return true表示窗口目前处于最小化状态
*/
public boolean isMinimized() {
return shell.getMinimized();
}
/**
* 设置好友的属性,这个方法会兼顾好友组和最近联系人组,以保持他们同步
*
* @param f
* FriendModel
* @param key
* 属性键
* @param value
* 属性值
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -