📄 sendclusterimwindow.java
字号:
protected int getShellStyle() {
return SWT.SHELL_TRIM;
}
/**
* 设置窗口激活
*/
public void setActive() {
getShell().setActive();
}
/**
* 设置最小化状态
*
* @param b
*/
public void setMinimized(boolean b) {
getShell().setMinimized(b);
}
/* (non-Javadoc)
* @see org.eclipse.jface.window.Window#open()
*/
public int open() {
int ret = super.open();
// 设置输入框获得焦点,设置输入框的字体和颜色
inputBox.setFocus();
if(main.getDefaultStyle() != null)
inputBox.setDefaultStyle(main.getDefaultStyle());
// 添加自己为QQ listener
main.getClient().addQQListener(this);
// 得到在线成员
if(model.isPermanent())
main.getClient().getClusterOnlineMember(model.getClusterId());
return ret;
}
/* (non-Javadoc)
* @see org.eclipse.jface.window.Window#getInitialSize()
*/
protected Point getInitialSize() {
return new Point(470, 430);
}
/* (non-Javadoc)
* @see org.eclipse.jface.window.Window#getInitialLocation(org.eclipse.swt.graphics.Point)
*/
protected Point getInitialLocation(Point initialSize) {
// 缺省实现是把窗口居中
Rectangle displayRect = main.getDisplay().getClientArea();
return new Point((displayRect.width - initialSize.x) / 2, (displayRect.height - initialSize.y) / 2);
}
/**
* @param c
* 群model
* @param im
* 群消息结构
* @param me
* true表示是我自己
*/
public void appendMessage(ClusterModel c, ClusterIM im, boolean me) {
date.setTime(im.sendTime);
FriendModel f = c.getMember(im.sender);
String name = (f == null) ? String.valueOf(im.sender) : f.getName();
outputBox.appendText('(' + name + ") " + df.format(date), me ? myStyle : otherStyle);
LineStyle style = getLineStyle(im);
outputBox.appendText(im.message, style);
}
/**
* 设置已经发送的消息,这个方法只用在聊天模式时
* @param name 发送消息的人的昵称
* @param msg 消息内容
* @param date 消息发送时间
* true表示是我自己
*/
private void appendMessage(String name, String msg, Date date) {
outputBox.appendText('(' + name + ") " + df.format(date), myStyle);
outputBox.appendText(msg, getLineStyle(main.getDefaultStyle()));
}
/**
* 在输出框中添加提示信息
*
* @param hint
* @param style
*/
private void appendHint(String hint, LineStyle style) {
outputBox.appendText(hint, style);
}
/**
* 刷新群头像和群名称
*
* @param image
*/
public void refreshClusterInfo() {
setClusterNameLabel();
listViewer.refresh();
Map members = model.getMembers();
int online = 0;
Iterator i = members.values().iterator();
while(i.hasNext()) {
FriendModel f = (FriendModel)i.next();
if(f.isOnline() || f.isAway())
online++;
}
setListLabel(members.size(), online);
}
/**
* @return
* true表示当前窗口是活动窗口
*/
public boolean isActive() {
return active;
}
/**
* 打开与某个成员的聊天窗口
*
* @return
* 打开的窗口对象,可能为ReceiveMessageShell, 也可能为SendMessageShell
*/
protected Object openMemberMessageShell() {
IStructuredSelection selection = (IStructuredSelection)listViewer.getSelection();
if(!selection.isEmpty()) {
FriendModel f = (FriendModel)selection.getFirstElement();
// 在现在的好友中查找这个model
FriendModel f2 = main.getMVCHelper().getFriendModel(f.getQQ());
// 如果找到model为null,说明这个人不是我的好友了,为了界面上的一致
// 性,把这个人添加到陌生人再打开窗口。否则,这个人肯定已经在model中
// ,直接打开窗口
if(f2 == null) {
/* 否则这个人还不是我的好友, */
f2 = f;
int[] stranger = main.getMVCHelper().listStrangerGroup();
if(stranger != null && stranger.length > 0) {
main.getModel().addItem(stranger[0], f);
main.getShutter().refreshTabView(stranger[0]);
}
}
return main.getShellLauncher().openNormalIMWindow(f2);
}
return null;
}
/**
* 发送群消息
* @param string
*/
protected void sendMessage(String s) {
// 检查消息是否为空
if(s.length() == 0) {
MessageDialog.openWarning(getShell(), LumaQQ.getString("message.box.common.warning.title"), LumaQQ.getString("message.box.cannot.send.empty.message"));
return;
}
// 判断用户是否登录
if(main.getClient().getUser().isLoggedIn()) {
workflow.setOriginalMessage(s);
workflow.start();
} else {
MessageDialog.openWarning(getShell(), LumaQQ.getString("message.box.common.warning.title"), LumaQQ.getString("message.box.please.login.first"));
}
}
/**
* 显示记录控件
*/
private void showRecord() {
GridData gd = (GridData)viewer.getLayoutData();
Shell shell = getShell();
if(gd.heightHint == 0) {
gd.heightHint = 200;
viewer.setVisible(true);
viewer.refreshRecord(false);
if(!shell.getMaximized()) {
Point p = shell.getSize();
shell.setSize(p.x, p.y + 200);
}
} else {
viewer.setVisible(false);
gd.heightHint = 0;
if(!shell.getMaximized()) {
Point p = shell.getSize();
shell.setSize(p.x, p.y - 200);
}
}
viewer.getParent().layout();
shell.layout();
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.qq.events.IQQListener#qqEvent(edu.tsinghua.lumaqq.qq.events.QQEvent)
*/
public void qqEvent(QQEvent e) {
switch(e.type) {
case QQEvent.QQ_GET_CLUSTER_INFO_FAIL:
case QQEvent.QQ_GET_MEMBER_INFO_FAIL:
case QQEvent.QQ_GET_ONLINE_MEMBER_FAIL:
case QQEvent.QQ_GET_TEMP_CLUSTER_INFO_FAIL:
processClusterCommandFail(e);
break;
default:
workflow.delegateQQEvent(e);
break;
}
}
/**
* <pre>
* 处理群命令失败事件:失败时,弹出一个对话框提示,如果错误类型表示自己已经不是这个群的
* 成员,则移除这个群
* </pre>
* @param e
*/
private void processClusterCommandFail(QQEvent e) {
final ClusterCommandReplyPacket packet = (ClusterCommandReplyPacket)e.getSource();
if(packet.clusterId == model.getClusterId()) {
main.getDisplay().asyncExec(new Runnable() {
public void run() {
MessageDialog.openError(main.getShell(), LumaQQ.getString("message.box.common.fail.title"), packet.errorMessage);
}
});
}
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.events.IFaceSelectionListener#faceSelected(edu.tsinghua.lumaqq.ui.IImageProvider, int, int)
*/
public void faceSelected(IImageProvider provider, int group, int sequence) {
if(group == 0) {
int index = icons.getFaceCode(sequence);
if(index != -1)
inputBox.insertImage(IRichContent.DEFAULT_FACE_TAG, index);
} else {
FaceUtil util = FaceUtil.getInstance();
Face face = util.getFace(group - 1, sequence);
if(face == null)
return;
int id = Util.getInt(face.getId(), -1);
if(id == -1)
return;
inputBox.insertImage(IRichContent.CUSTOM_FACE_TAG, id);
}
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.ui.IIMSender#send(java.lang.String)
*/
public void send(String msg) {
// 发送
LineStyle style = main.getDefaultStyle();
if(model.getExternalId() == 0)
main.getClient().sendTempClusterIM(
model.getType(),
model.getClusterId(),
model.getExternalId(),
msg,
workflow.getMessageId(),
workflow.getTotalFragments(),
workflow.getCurrentFragment(),
style.fontName,
(style.fontStyle & SWT.BOLD) != 0,
(style.fontStyle & SWT.ITALIC) != 0,
false,
style.fontSize,
style.foreground.getRed(),
style.foreground.getGreen(),
style.foreground.getBlue());
else
main.getClient().sendClusterIM(
model.getClusterId(),
msg,
workflow.getMessageId(),
workflow.getTotalFragments(),
workflow.getCurrentFragment(),
style.fontName,
(style.fontStyle & SWT.BOLD) != 0,
(style.fontStyle & SWT.ITALIC) != 0,
false,
style.fontSize,
style.foreground.getRed(),
style.foreground.getGreen(),
style.foreground.getBlue());
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.ui.IIMSender#notifyOver()
*/
public void notifyOver() {
main.getDisplay().syncExec(enableRunnable);
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.ui.IIMSender#notifyStart(java.lang.String)
*/
public void notifyStart(String toBeSent) {
// 设置输入框暂时不可写
inputBox.setReadonly(true);
inputBox.setBackground(Colors.READONLY_BACKGROUND);
// 保存到聊天记录中
date.setTime(System.currentTimeMillis());
main.getMessageManager().saveMessage(model.getClusterId(), model.getClusterId(), main.getMyModel().getQQ(), toBeSent, (int)(date.getTime() / 1000));
// 清空发送框
inputBox.clear();
// 把发送的消息显示到输出框中
appendMessage((String)main.getMyModel().getProperty(INode.NAME), toBeSent, date);
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.ui.IIMSender#notifyFail(java.lang.String)
*/
public void notifyFail(String msg) {
main.getDisplay().syncExec(enableRunnable);
appendRunnable.hint = msg;
main.getDisplay().syncExec(appendRunnable);
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.ui.IIMSender#notifyTimeout(java.lang.String)
*/
public void notifyTimeout(String failToSent) {
main.getDisplay().syncExec(enableRunnable);
appendRunnable.hint = LumaQQ.getString("cluster.im.hint.timemout", new Object[] { failToSent });
main.getDisplay().syncExec(appendRunnable);
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.ui.IIMSender#getSenderId()
*/
public int getSenderId() {
return model.getClusterId();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -