📄 sendclustermessageshell.java
字号:
);
// 设置消息管理器、字符串格式化器,导出器
viewer.setMessageManager(main.mm);
// 添加表头
viewer.setTableColumn(new String[] { LumaQQ.getResourceString("send.cluster.message.table.header.nick"), LumaQQ.getResourceString("send.cluster.message.table.header.time"), LumaQQ.getResourceString("send.cluster.message.table.header.message") });
viewer.setTableColumnWidth(new String[] { "80", "120", "*" });
// tableitem双击事件监听器
viewer.addSelectionListener(
new SelectionAdapter() {
public void widgetDefaultSelected(SelectionEvent e) {
TableItem ti = viewer.getSelectedItem();
inputBox.setMessage(ti.getText(2));
}
}
);
}
/**
* 打开与某个成员的聊天窗口
* @return 打开的窗口对象,可能为ReceiveMessageShell, 也可能为SendMessageShell
*/
protected Object openMemberMessageShell() {
int index = memberTable.getSelectionIndex();
if(index != -1) {
TableItem ti = memberTable.getItem(index);
FriendModel f = (FriendModel)ti.getData();
// 在现在的好友中查找这个model
FriendModel f2 = main.getFriendModel(f.getQQ());
// 如果找到model为null,说明这个人不是我的好友了,为了界面上的一致
// 性,把这个人添加到陌生人再打开窗口。否则,这个人肯定已经在model中
// ,直接打开窗口
if(f2 == null) {
/* 否则这个人还不是我的好友, */
f2 = f;
int[] stranger = main.model.findTabIndex(main.strangerMatcher);
if(stranger != null && stranger.length > 0) {
main.model.addItem(stranger[0], f);
main.shutter.refreshTabView(stranger[0]);
}
}
return main.openNormalMessageShell(f2);
}
return null;
}
/**
* 关闭窗口
*/
protected void close() {
if(shell != null && !shell.isDisposed())
shell.close();
}
/**
* 发送群消息
* @param string
*/
protected void sendMessage(String message) {
// 检查消息是否为空
if(message.length() == 0) {
MessageBox box = new MessageBox(shell, SWT.ICON_WARNING | SWT.OK);
box.setText(LumaQQ.getResourceString("message.box.common.warning.title"));
box.setMessage(LumaQQ.getResourceString("message.box.cannot.send.empty.message"));
box.open();
return;
}
// 判断用户是否登录
if(main.client.getUser().isLoggedIn()) {
// 判断消息长度是否大于400,如果是,拆分发送
int len = message.length();
int j = 0;
for(int i = 0; j < len; i += QQ.MAX_SEND_IM_SIZE) {
j = i + QQ.MAX_SEND_IM_SIZE;
if(j > len) j = len;
String segment = message.substring(i, j);
main.client.sendClusterMessage(c.getClusterId(), segment);
// 如果是聊天模式,则把发送的消息显示到输出框中
date.setTime(System.currentTimeMillis());
setMessage((String)main.myModel.getProperty("name"), segment, date);
// 保存到聊天记录中
main.mm.saveMessage(c.getClusterId(), c.getClusterId(), main.myModel.getQQ(), segment, (int)(date.getTime() / 1000));
// 清空发送框
inputBox.clear();
}
} else {
MessageBox box = new MessageBox(shell, SWT.ICON_WARNING | SWT.OK);
box.setText(LumaQQ.getResourceString("message.box.common.warning.title"));
box.setMessage(LumaQQ.getResourceString("message.box.please.login.first"));
box.open();
}
}
/**
* 设置已经发送的消息,这个方法只用在聊天模式时
* @param name 发送消息的人的昵称
* @param msg 消息内容
* @param date 消息发送时间
*/
public void setMessage(String name, String msg, Date date) {
outputBox.appendMessage("(" + name + ") " + DateFormat.getTimeInstance(DateFormat.LONG).format(date));
outputBox.appendMessage("\n" + msg + "\n\n");
}
/**
* 设置已经发送的消息,这个方法只用在聊天模式时
* @param name 发送消息的人的昵称
* @param msg 消息内容
* @param time 消息发送时间
*/
public void setMessage(String name, String msg, long time) {
date.setTime(time);
setMessage(name, msg, date);
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
*/
public void widgetDisposed(DisposeEvent e) {
buttonColor.dispose();
toolbarBackground.dispose();
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.qq.events.QQListener#qqEvent(edu.tsinghua.lumaqq.qq.events.QQEvent)
*/
public void qqEvent(QQEvent e) {
switch(e.type) {
case QQEvent.QQ_GET_ONLINE_MEMBER_SUCCESS:
processClusterGetOnlineMemberSuccess(e);
break;
case QQEvent.QQ_GET_CLUSTER_INFO_FAIL:
case QQEvent.QQ_GET_MEMBER_INFO_FAIL:
case QQEvent.QQ_GET_ONLINE_MEMBER_FAIL:
case QQEvent.QQ_SEND_CLUSTER_IM_FAIL:
processClusterCommandFail(e);
break;
}
}
// 处理群命令失败事件
private void processClusterCommandFail(QQEvent e) {
final ClusterCommandReplyPacket packet = (ClusterCommandReplyPacket)e.getSource();
if(packet.clusterId == c.getClusterId()) {
main.display.asyncExec(
new Runnable() {
public void run() {
MessageBox box = new MessageBox(main.getShell(), SWT.ICON_ERROR | SWT.OK);
box.setText(LumaQQ.getResourceString("message.box.common.fail.title"));
box.setMessage(packet.errorMessage);
box.open();
if(packet.replyCode == QQ.QQ_CLUSTER_CMD_REPLY_NOT_MEMBER) {
main.removeCluster(c.getClusterId());
}
}
}
);
}
}
// 处理得到在线成员成功事件
private void processClusterGetOnlineMemberSuccess(QQEvent e) {
final ClusterCommandReplyPacket packet = (ClusterCommandReplyPacket)e.getSource();
// 如果群内部ID等于这个窗口的群内部ID,才需要处理
if(packet.clusterId == c.getClusterId()) {
main.display.syncExec(
new Runnable() {
public void run() {
if(c != null) {
Hashtable members = (Hashtable)c.getProperty("members");
// 把每个成员的状态置为下线
Iterator iter = members.values().iterator();
while(iter.hasNext())
((FriendModel)iter.next()).addProperty("status", "offline");
// 对每个在线的成员,设置他们的在线状态
iter = packet.onlineMembers.iterator();
while(iter.hasNext()) {
Integer key = (Integer)iter.next();
FriendModel f = (FriendModel)members.get(key);
if(f != null)
f.addProperty("status", "online");
}
// 得到所有成员的model列表
List models = new ArrayList();
models.addAll(members.values());
// 对这个数组排序
Collections.sort(models, new MemberComparator());
// 再次添加已经排序好了的item,对于原来的item并不删除,而是直接改变他们的值
// 这样快一些
int count = models.size();
int itemCount = memberTable.getItemCount();
for(int i = 0; i < count; i++) {
FriendModel f = (FriendModel)models.get(i);
TableItem ti = (i >= itemCount) ? new TableItem(memberTable, SWT.NONE) : memberTable.getItem(i);
ti.setText((String)f.getProperty("name"));
ti.setImage(main.getSmallFaceByStatus(f));
ti.setData(f);
}
// 清除旧项
if(itemCount > count)
memberTable.remove(count, itemCount - 1);
// 1分钟后再次刷新成员列表
display.timerExec(REFRESH_INTERVAL, refreshRunnable);
}
}
}
);
}
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.ShellListener#shellClosed(org.eclipse.swt.events.ShellEvent)
*/
public void shellClosed(ShellEvent e) {
main.client.removeQQListener(this);
main.removeMeFromSCMSMap(c);
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.ShellListener#shellActivated(org.eclipse.swt.events.ShellEvent)
*/
public void shellActivated(ShellEvent e) {
stopBlinkImage();
active = true;
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.ShellListener#shellDeactivated(org.eclipse.swt.events.ShellEvent)
*/
public void shellDeactivated(ShellEvent e) {
active = false;
}
/**
* 是当前窗口激活
*/
public void setActive() {
shell.setActive();
}
/**
* 代理方法,设置窗口的最小化状态
* @param b
*/
public void setMinimized(boolean b) {
shell.setMinimized(b);
}
/**
* 使chatbox获得焦点
*/
public void setFocus() {
inputBox.setFocus();
}
// 打开shell
public void open() {
// 刷新布局
shell.layout();
// 窗口居中
Rectangle dialogRect = shell.getBounds();
Rectangle displayRect = display.getBounds();
shell.setLocation((displayRect.width - dialogRect.width) / 2, (displayRect.height - dialogRect.height) / 2);
shell.open();
// 设置输入框获得焦点,设置输入框的字体和颜色
inputBox.setFocus();
if(main.font != null)
inputBox.setFont(main.font);
if(main.fontColor != null)
inputBox.setForeground(main.fontColor);
// add me as qq listener
main.client.addQQListener(this);
// 得到在线成员
if(main.client.getUser().isLoggedIn())
main.client.getClusterOnlineMember(c.getClusterId());
}
/**
* 设置群的model
* @param c
*/
public void setClusterModel(ClusterModel c) {
this.c = c;
blinkRunnable.setBlinkImage(c.getImage());
viewer.setQqNum(c.getClusterId());
viewer.setExporter(new ClusterMessageExporter(c));
viewer.setFormatter(new ClusterMessageFormatter(c));
lblId.setText(LumaQQ.getResourceString("send.cluster.message.label.id", new Object[] { String.valueOf(c.getExternalId()) } ));
lblName.setText(LumaQQ.getResourceString("send.cluster.message.label.name", new Object[] { c.getProperty("name") }));
btnCluster.setImage((Image)c.getProperty("image"));
shell.setImage((Image)c.getProperty("image"));
shell.setText(LumaQQ.getResourceString("send.cluster.message.title", new Object[] { c.getProperty("name") }));
Hashtable members = (Hashtable)c.getProperty("members");
Iterator iter = members.values().iterator();
while(iter.hasNext()) {
FriendModel f = (FriendModel)iter.next();
TableItem ti = new TableItem(memberTable, SWT.NONE);
ti.setText((String)f.getProperty("name"));
ti.setImage(main.getSmallFaceByStatus(f));
ti.setData(f);
}
display.timerExec(REFRESH_INTERVAL, refreshRunnable);
}
// 比较中文字符串,比较后的结果按照拼音方式排序
private int compareChineseString(String _n1, String _n2) {
String n1 = null, n2 = null;
try {
n1 = new String(_n1.getBytes("GBK"), "ISO-8859-1");
n2 = new String(_n2.getBytes("GBK"), "ISO-8859-1");
} catch (UnsupportedEncodingException e) {
n1 = _n1;
n2 = _n2;
}
return n1.compareTo(n2);
}
/**
* 设置群头像
* @param image
*/
public void setFace(Image image) {
if(image == null) return;
btnCluster.setImage(image);
shell.setImage(image);
}
/**
* 开始闪烁图标
*/
public void startBlinkImage() {
if(!blinkRunnable.isStop()) return;
blinkRunnable.setStop(false);
display.timerExec(0, blinkRunnable);
}
/**
* 停止闪烁
*/
public void stopBlinkImage() {
blinkRunnable.setStop(true);
}
/**
* @return true表示当前窗口为active
*/
public boolean isActive() {
return active;
}
/**
* @return true表示窗口处于最小化状态
*/
public boolean isMinimized() {
return shell.getMinimized();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -