📄 sendmessageshell.java
字号:
public Shell getShell() {
return shell;
}
/* (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_SEND_IM_SUCCESS:
processSendIMSuccess(e);
break;
case QQEvent.QQ_ACCEPT_SEND_FILE:
processAcceptSendFile(e);
break;
case QQEvent.QQ_REJECT_SEND_FILE:
processRejectSendFile(e);
break;
case QQEvent.QQ_CANCEL_SEND_FILE:
processCancelSendFile(e);
break;
case QQEvent.QQ_NOTIFY_FILE_TRANSFER_ARGS:
processNotifyFileTransferArgs(e);
break;
case QQEvent.QQ_REQUEST_ME_CONNECT:
processRequestMeConnect(e);
break;
case QQEvent.QQ_OPERATION_TIMEOUT:
if(e.operation == QQ.QQ_CMD_SEND_IM)
processSendIMFail(e);
break;
}
}
/**
* 处理0x003F,对方请求我首先连接他,这种情况发生在我处于内网,而对方处于外网时
* @param e
*/
private void processRequestMeConnect(QQEvent e) {
ReceiveIMPacket p = (ReceiveIMPacket)e.getSource();
FileWatcher watcher = (FileWatcher)watchers.get(new Integer(p.normalHeader.sequence));
if(watcher instanceof FileReceiver) {
FileReceiver receiver = (FileReceiver)watcher;
if(receiver.getCondition() == QQ.QQ_I_AM_BEHIND_FIREWALL)
receiver.notifyNATPort();
}
}
/**
* 处理0x003B,好像是通知实际IP的意思
* @param e
*/
private void processNotifyFileTransferArgs(QQEvent e) {
ReceiveIMPacket p = (ReceiveIMPacket)e.getSource();
FileReceiver receiver = (FileReceiver)watchers.get(new Integer(p.normalHeader.sequence));
if(receiver != null) {
receiver.setHisMinorPort(p.fileArgs.localPort);
receiver.setHisLocalIp(p.fileArgs.localIp);
receiver.startMinorPort();
receiver.start();
receiver.selectPort();
}
}
/**
* 处理文件传输取消事件
* @param e
*/
private void processCancelSendFile(QQEvent e) {
ReceiveIMPacket packet = (ReceiveIMPacket)e.getSource();
if(packet.normalHeader.sender == qq) {
final Integer sessionId = new Integer(packet.normalHeader.sequence);
final FileWatcher watcher = (FileWatcher)watchers.get(sessionId);
// 设置watcher状态
if(watcher != null) {
watcher.abort();
// 显示提示信息
main.display.syncExec(
new Runnable() {
public void run() {
removeFileSession(sessionId);
removeFileItem(sessionId);
setOutputMessage("\n\n");
setOutputMessage(LumaQQ.getResourceString("text.cancel.transfer.file", new Object[] { watcher.getFileName() }));
}
}
);
}
}
}
/**
* 处理拒绝接收文件事件
* @param e
*/
private void processRejectSendFile(QQEvent e) {
ReceiveIMPacket packet = (ReceiveIMPacket)e.getSource();
if(packet.normalHeader.sender == qq) {
final Integer sessionId = new Integer(packet.normalHeader.sequence);
final FileWatcher watcher = (FileWatcher)watchers.get(sessionId);
// 设置watcher状态
if(watcher != null) {
watcher.abort();
// 显示提示信息
main.display.syncExec(
new Runnable() {
public void run() {
removeFileSession(sessionId);
removeFileItem(sessionId);
setOutputMessage("\n\n");
setOutputMessage(LumaQQ.getResourceString("text.reject.send.file", new Object[] { watcher.getFileName() }));
}
}
);
}
}
}
/**
* 处理接受传送文件事件
* @param e
*/
private void processAcceptSendFile(QQEvent e) {
ReceiveIMPacket packet = (ReceiveIMPacket)e.getSource();
if(packet.normalHeader.sender == qq) {
FileWatcher watcher = (FileWatcher)watchers.get(new Integer(packet.normalHeader.sequence));
// 设置watcher状态
if(watcher != null && watcher instanceof FileSender) {
final FileSender sender = (FileSender)watcher;
// 显示提示信息
main.display.syncExec(
new Runnable() {
public void run() {
setOutputMessage("\n\n");
setOutputMessage(LumaQQ.getResourceString("text.accept.send.file", new Object[] { sender.getFileName() }));
}
}
);
// 设置守望者参数
sender.setHisInternetIp(packet.fileArgs.internetIp);
sender.setHisInternetPort(packet.fileArgs.internetPort);
sender.setHisMajorPort(packet.fileArgs.directPort);
sender.setHisFileSessionKey(packet.normalHeader.fileSessionKey);
// 通知端口信息
main.client.notifyFilePort(sender.getHisQQ(), sender.getMyMajorPort(), sender.getMyLocalIp(), sender.getMyMinorPort(), sender.getSessionSequence());
// 发送测试信息
sender.sendInitConnectionToDirect();
}
}
}
/**
* 处理发送消息超时事件
* @param e
*/
private void processSendIMFail(QQEvent e) {
SendIMPacket packet = (SendIMPacket)e.getSource();
if(packet.getReceiver() == qq) {
display.syncExec(
new Runnable() {
public void run() {
stopAnimate();
setMinimized(false);
setActive();
MessageBox box = new MessageBox(shell, SWT.ICON_ERROR | SWT.OK);
box.setText(LumaQQ.getResourceString("message.box.common.fail.title"));
box.setMessage(LumaQQ.getResourceString("message.box.send.message.timeout"));
box.open();
}
}
);
}
}
/**
* 处理消息发送成功事件,主要是查找出是哪个窗口发送的这个消息,关闭之
* @param e
*/
private void processSendIMSuccess(QQEvent e) {
SendIMPacket packet = (SendIMPacket)e.getSource();
if(packet.getReceiver() == qq && !talkMode) {
display.asyncExec(
new Runnable() {
public void run() {
stopAnimate();
close();
}
}
);
}
}
/**
* @param f The f to set.
*/
public void setFriendModel(FriendModel f) {
this.f = f;
this.face = f.getFaceId();
this.qq = f.getQQ();
setTalkMode(f.isTalkMode());
viewer.setQQ(qq);
viewer.setExporter(new FriendMessageExporter(main.myModel, f));
viewer.setFormatter(new FriendMessageFormatter(main.myModel, f));
lblNick.setText(LumaQQ.getResourceString("send.message.label.nick", new Object[] { f.getProperty("name") }));
shell.setText(LumaQQ.getResourceString("send.message.title", new Object[] { f.getProperty("name") }));
lblQQ.setText(LumaQQ.getResourceString("send.message.label.qq", new Object[] { String.valueOf(qq) }));
if("offline".equals(f.getProperty("status")) || "hidden".equals(f.getProperty("status")))
btnFriend.setImage(icons.getFace(face + 1));
else
btnFriend.setImage(icons.getFace(face));
generateAnimateFrames();
}
/**
* @return Returns the talkMode.
*/
public boolean isTalkMode() {
return talkMode;
}
/**
* @param packet The requestPacket to set.
*/
public void setRequestPacket(ReceiveIMPacket packet) {
// 创建一个新的文件接收守望者
FileReceiver receiver = new FileReceiver(main.client);
receiver.addFileListener(this);
// 设置提示信息
String fileSizeStr = getFileSizeString(packet.fileInfo.fileSize);
setOutputMessage("\n\n");
setOutputMessage(LumaQQ.getResourceString("text.receive.file", new Object[] { f.getProperty("name"), packet.fileInfo.fileName, fileSizeStr }));
// 设置参数
receiver.setHisQQ(qq);
receiver.setSessionSequence(packet.normalHeader.sequence);
receiver.setHisMajorPort(packet.fileArgs.directPort);
receiver.setHisInternetIp(packet.fileArgs.internetIp);
receiver.setHisInternetPort(packet.fileArgs.internetPort);
receiver.setHisFileSessionKey(packet.normalHeader.fileSessionKey);
receiver.setFileName(packet.fileInfo.fileName);
receiver.setFileTransferStatus(FileWatcher.FT_NEGOTIATING);
// 添加到哈希表中,并设置为当前file session
currentFileSessionId = new Integer(receiver.getSessionSequence());
watchers.put(currentFileSessionId, receiver);
addFileItem(false, receiver.getFileName(), fileSizeStr, currentFileSessionId);
setCurrentFileSession(currentFileSessionId);
// 设置工具条按钮状态
tiYes.setEnabled(true);
tiNo.setEnabled(true);
}
/**
* 开始闪烁图标
*/
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();
}
/**
* @return true表示当前有文件操作正在进行,协商阶段也算作是文件操作
*/
public boolean hasFileOperating() {
return !watchers.isEmpty();
}
/**
* @return true表示窗口已经disposed
*/
public boolean isDisposed() {
return shell.isDisposed();
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.qq.events.FileListener#fileAborted(edu.tsinghua.lumaqq.qq.events.FileEvent)
*/
public void fileAborted(FileEvent e) {
final FileWatcher watcher = (FileWatcher)e.getSource();
display.syncExec(new Runnable() {
public void run() {
removeFileSession(watcher.getSessionSequence());
removeFileItem(watcher.getSessionSequence());
setOutputMessage("\n\n");
setOutputMessage(LumaQQ.getResourceString("text.cancel.transfer.file", new Object[] { watcher.getFileName() }));
}
});
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.qq.events.FileListener#fileFinished(edu.tsinghua.lumaqq.qq.events.FileEvent)
*/
public void fileFinished(FileEvent e) {
final FileWatcher watcher = (FileWatcher)e.getSource();
if(watcher instanceof FileSender) {
display.syncExec(new Runnable() {
public void run() {
removeFileSession(watcher.getSessionSequence());
removeFileItem(watcher.getSessionSequence());
setOutputMessage("\n\n");
setOutputMessage(LumaQQ.getResourceString("text.send.file.finished", new Object[] { watcher.getFileName() }));
}
});
} else {
display.syncExec(new Runnable() {
public void run() {
removeFileSession(watcher.getSessionSequence());
removeFileItem(watcher.getSessionSequence());
boolean b = Utils.checkFileMD5(watcher.getLocalFileName(), watcher.getFileMD5());
setOutputMessage("\n\n");
setOutputMessage(LumaQQ.getResourceString(b ? "text.file.md5.correct" : "text.file.md5.incorrect"));
}
});
}
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.qq.events.FileListener#fileInProgress(edu.tsinghua.lumaqq.qq.events.FileEvent)
*/
public void fileInProgress(FileEvent e) {
final FileWatcher watcher = (FileWatcher)e.getSource();
SlideWindow window = watcher.getSlideWindow();
if(window.isFinished()) {
// 如果接收完毕,则显示一些提示信息,如果这个会话是当前显示的会话,还要更新其进度状态
display.syncExec(new Runnable() {
public void run() {
if(currentFileSessionId.intValue() == watcher.getSessionSequence()) {
lblStatus.setText(LumaQQ.getResourceString("send.message.label.finished"));
bar.setSelection(bar.getMaximum());
lblPercent.setText("100%");
}
}
});
} else {
// 如果还没有接收完,则只更新进度状态
if(currentFileSessionId.intValue() == watcher.getSessionSequence()) {
refreshRunnable.max = watcher.getFragments();
refreshRunnable.selection = window.getMaxPassed();
int percent = refreshRunnable.selection * 100 / refreshRunnable.max;
refreshRunnable.text = String.valueOf(percent) + '%';
display.syncExec(refreshRunnable);
}
}
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.qq.events.FileListener#fileConnected(edu.tsinghua.lumaqq.qq.events.FileEvent)
*/
public void fileConnected(FileEvent e) {
final FileWatcher watcher = (FileWatcher)e.getSource();
if(watcher.isUseUdp()) {
display.syncExec(new Runnable() {
public void run() {
setOutputMessage(LumaQQ.getResourceString("text.udp.connected"));
}
});
}
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.ControlListener#controlMoved(org.eclipse.swt.events.ControlEvent)
*/
public void controlMoved(ControlEvent e) {
// 保存自己的位置,以便下次打开窗口时在同样的位置
Point loc = shell.getLocation();
f.addProperty("locationX", new Integer(loc.x));
f.addProperty("locationY", new Integer(loc.y));
}
/* (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.AcceleratorListener#acceleratorPressed(org.eclipse.swt.events.KeyEvent)
*/
public void acceleratorPressed(KeyEvent e) {
// 按下了enter键
if(e.keyCode == SWT.CR) {
boolean b = talkMode?options.isUseEnterInTalkMode():options.isUseEnterInMessageMode();
if((e.stateMask & SWT.CTRL) != 0) { // ctrl也按下了
if(!b)
sendMessage(inputBox.getMessage());
} else {
if(b)
sendMessage(inputBox.getMessage());
}
} else if(e.stateMask == SWT.ALT) {
log.trace("Alt Accelerator");
if(e.character == 's' || e.character == 'S')
sendMessage(inputBox.getMessage());
else if(e.character == 'h' || e.character == 'H')
showRecord();
else if(e.character == 't' || e.character == 'T')
setTalkMode(!talkMode);
else if(e.character == 'c' || e.character == 'C')
close();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -