📄 smswindow.java
字号:
gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
gd.widthHint = 100;
textSender = UITool.createSingleText(bottom, gd);
textSender.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (Character.isISOControl(e.character))
return;
String text = textSender.getText();
byte[] b = Util.getBytes(text);
int addLen = Util.getBytes(Character.toString(e.character)).length;
if (b.length + addLen > QQ.QQ_MAX_SMS_SENDER_NAME)
e.doit = false;
}
});
textSender.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
maxFragmentLength = QQ.QQ_MAX_SMS_LENGTH - textSender.getText().length();
calculateFragmentCount();
refreshHint();
}
});
btnSend = new Slat(bottom);
btnSend.setText(button_send_accel);
btnSend.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
btnSend.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent e) {
Slat temp = (Slat) e.getSource();
if (e.x > temp.getSize().x || e.y > temp.getSize().y || e.x < 0 || e.y < 0) {
return;
}
sendAction.run();
}
});
// 聊天记录控件
if (singleMode) {
if (isUser)
viewer = new RecordViewer(container, new SMSRecordProvider(friend), main);
else
viewer = new RecordViewer(container, new SMSRecordProvider(mobile), main);
viewer.setFont(res.getDefaultFont());
viewer.setRecordManager(main.getRecordManager());
viewer.setBackground(Colors.LOGIN_BACKGROUND);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
gd.heightHint = 200;
gd.exclude = true;
viewer.setLayoutData(gd);
if (!isUser)
viewer.setFilter(new SMSFilter(mobile));
}
btnRecord.setVisible(singleMode);
initializeControl();
initializeKeyAction();
return control;
}
/**
* 显示记录控件
*/
private void showRecord() {
GridData gd = (GridData) viewer.getLayoutData();
Shell shell = getShell();
if (gd.exclude) {
gd.exclude = false;
viewer.refreshRecord();
} else {
gd.exclude = true;
}
if (!shell.getMaximized()) {
Point p = shell.getSize();
shell.setSize(p.x, p.y + (gd.exclude ? -205 : 205));
}
viewer.setVisible(!gd.exclude);
viewer.getParent().layout();
shell.layout();
}
protected void refreshHint() {
lblHint.setText(NLS.bind(sms_will_send, String.valueOf(fragmentCount)));
}
private void initializeKeyAction() {
// mod3 -> alt
inputBox.setUserKeyAction('S' | SWT.MOD3, sendAction);
if (singleMode)
inputBox.setUserKeyAction('H' | SWT.MOD3, recordAction);
}
private void initializeControl() {
textSender.setText(main.getMyModel().displayName);
if (receiver != null)
textReceiver.setText(receiver);
}
public void append(String text, LineStyle style) {
outputBox.appendText(text, style);
outputBox.appendText(CRLF, style);
}
/* (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_SMS_SENT:
processSMSSent(e);
break;
case QQEvent.QQ_OPERATION_TIMEOUT:
switch (e.operation) {
case QQ.QQ_CMD_SEND_SMS:
processSMSTimeout(e);
break;
}
break;
}
}
/**
* 处理发送超时事件
*
* @param e
*/
private void processSMSTimeout(QQEvent e) {
SendSMSPacket packet = (SendSMSPacket) e.getSource();
if (expected != packet.getSequence())
return;
main.getDisplay().syncExec(new Runnable() {
public void run() {
append(sms_timeout, otherStyle);
reset();
}
});
}
/**
* 推入一个短信包
*
* @param packet
*/
public void putSMS(ReceiveIMPacket packet) {
outputBox.appendText('(' + DefaultFace.escapeFaces(packet.sms.senderName) + ") " + DateTool.format(packet.sms.time), otherStyle);
outputBox.appendText(packet.sms.message, otherStyle);
if (receiver == null || receiver.trim().equals("")) {
if (packet.sms.sender == 10000)
setReceiver(packet.sms.senderName);
else
setReceiver(String.valueOf(packet.sms.sender));
}
}
/**
* 处理发送完毕事件
*
* @param e
*/
private void processSMSSent(QQEvent e) {
final SendSMSReplyPacket packet = (SendSMSReplyPacket) e.getSource();
if (expected != packet.getSequence())
return;
main.getDisplay().syncExec(new Runnable() {
public void run() {
// 显示回复信息,如果发送成功,则保存到聊天记录
for (SMSReply reply : packet.replies) {
switch (reply.replyCode) {
case QQ.QQ_REPLY_SMS_FAIL:
append(NLS.bind(sms_fail, reply.message, reply.isQQ ? String.valueOf(reply.qq) : reply.mobile), otherStyle);
stop = true;
break;
case QQ.QQ_REPLY_SMS_OK:
if (nextFragment == fragmentCount - 1)
saveMessage(reply);
append(NLS.bind(sms_success, reply.message, reply.isQQ ? String.valueOf(reply.qq) : reply.mobile), otherStyle);
break;
}
}
append(packet.message, otherStyle);
// 继续发送
if (stop)
reset();
else {
if (nextFragment < fragmentCount - 1) {
/*
* 还有分片没发完
*/
nextFragment++;
send(getNextFragment());
} else {
/*
* 检查是否还有其他接收者
*/
rebuildReceiverList(packet.replies);
if (isReceiverEmpty())
reset();
else {
nextFragment = 0;
send(getNextFragment());
}
}
}
}
});
}
protected void saveMessage(SMSReply reply) {
RecordEntry entry = new RecordEntry();
if (reply.isQQ)
entry.owner = reply.qq;
else
entry.owner = 9999;
entry.sender = main.getMyModel().qq;
entry.receiver = 0;
entry.senderParent = 0;
entry.type = IKeyConstants.NORMAL;
entry.time = System.currentTimeMillis();
if (reply.isQQ)
entry.message = textCache;
else
entry.message = reply.mobile + '|' + textCache;
main.getRecordManager().addRecord(entry);
}
protected void rebuildReceiverList(List<SMSReply> replies) {
mobiles.clear();
friends.clear();
for (SMSReply reply : replies) {
if (reply.replyCode == QQ.QQ_REPLY_SMS_QUEUED) {
if (reply.isQQ)
friends.add(reply.qq);
else
mobiles.add(reply.mobile);
}
}
}
protected boolean isReceiverEmpty() {
return mobiles.isEmpty() && friends.isEmpty();
}
protected void reset() {
btnSend.setText(button_send_accel);
btnSend.setEnabled(true);
stop = true;
sending = false;
nextFragment = 0;
expected = 0;
}
/**
* @return Returns the receiver.
*/
public String getReceiver() {
return receiver;
}
/**
* @param receiver The receiver to set.
*/
public void setReceiver(String receiver) {
this.receiver = receiver;
textReceiver.setText(receiver);
}
/**
* @param receiver
*/
private void rebuildReceiverList(String receiver) {
friends.clear();
mobiles.clear();
StringTokenizer st = new StringTokenizer(receiver, ",");
while (st.hasMoreTokens()) {
String rec = st.nextToken().trim();
int qq = Util.getInt(rec, 0);
if (qq != 0 && ModelRegistry.hasUser(qq) && !friends.contains(qq)) {
friends.add(qq);
} else if (!mobiles.contains(rec)) {
mobiles.add(rec);
}
}
}
@Override
public void shellActivated(ShellEvent e) {
super.shellActivated(e);
stopBlink();
}
public void shellClosed(ShellEvent e) {
super.shellClosed(e);
if (singleMode) {
if (isUser)
main.getShellRegistry().removeSMSWindow(friend);
else
main.getShellRegistry().removeSMSWindow(mobile);
} else
main.getShellRegistry().deregisterSMSWindow();
}
/**
* 计算分片数
*/
private void calculateFragmentCount() {
textCache = inputBox.getText();
int length = textCache.length();
if (length > maxFragmentLength) {
fragmentCount = length / (maxFragmentLength - 4) + 1;
} else
fragmentCount = 1;
}
/**
* 发送短消息
*/
protected void send() {
if (stop) {
calculateFragmentCount();
receiver = textReceiver.getText();
rebuildReceiverList(receiver);
if (textCache.length() == 0)
MessageDialog.openWarning(getShell(), message_box_common_warning_title, message_box_sms_empty);
else if (fragmentCount > 9)
MessageDialog.openWarning(getShell(), message_box_common_warning_title, message_box_too_long_sms);
else if (mobiles.isEmpty() && friends.isEmpty())
MessageDialog.openWarning(getShell(), message_box_common_warning_title, message_box_sms_no_receiver);
else {
btnSend.setText(button_stop);
send(getNextFragment());
stop = false;
}
} else {
btnSend.setText(button_send_accel);
stop = true;
if (sending)
btnSend.setEnabled(false);
}
}
/**
* 发送一个分片
*/
private void send(byte[] msg) {
append(NLS.bind(sms_sending, new Object[] { Util.getString(msg), String.valueOf(nextFragment + 1), String.valueOf(fragmentCount) }), myStyle);
expected = main.getClient().sendSMS(mobiles, friends, textSender.getText(), msg, (char) nextFragment);
sending = true;
}
/**
* @return
* 下一个分片的字节数组
*/
protected byte[] getNextFragment() {
if (nextFragment >= fragmentCount)
return null;
else if (fragmentCount == 1) {
fragmentCache = Util.getBytes(inputBox.getText());
return fragmentCache;
} else {
String text = inputBox.getText();
StringBuilder sb = new StringBuilder();
sb.append(nextFragment + 1);
sb.append('/');
sb.append(fragmentCount);
sb.append((char) 0x0A);
sb.append(text.substring(nextFragment * (maxFragmentLength - 4), Math.min((nextFragment + 1) * (maxFragmentLength - 4), text.length())));
fragmentCache = Util.getBytes(sb.toString());
return fragmentCache;
}
}
public void friendSelected(FriendSelectionEvent e) {
for (Model model : e.getModels()) {
if (model instanceof User) {
User f = (User) model;
friends.add(f.qq);
}
}
synchronizeList();
}
public void friendDeselected(FriendSelectionEvent e) {
for (Model model : e.getModels()) {
if (model instanceof User) {
User f = (User) model;
friends.remove(new Integer(f.qq));
}
}
synchronizeList();
}
private void synchronizeList() {
StringBuilder sb = new StringBuilder();
for (String mobile : mobiles)
sb.append(mobile).append(',');
for (Integer qq : friends)
sb.append(qq).append(',');
if (sb.length() > 0)
sb.deleteCharAt(sb.length() - 1);
receiver = sb.toString();
textReceiver.setText(receiver);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -