📄 sendsmsshell.java
字号:
// 发送期间,把发送按钮禁止
btnSend.setEnabled(false);
// 清空回复
reply.clear();
// 根据发送内容类型的不同调用不同的方法
if(contentType == QQ.QQ_SMS_CONTENT_NORMAL) {
createMessageBytes();
messageSequence = 0;
sendNextSplit(messageSequence);
} else {
if(sendToMobile) {
nextAck = main.getClient().sendSMS(
receiver,
textSenderName.getText(),
contentType,
contentId,
chkHandfree.getSelection() ? QQ.QQ_SMS_HAND_FREE : QQ.QQ_SMS_NORMAL);
} else {
// 得到接收者QQ号
int qq = Util.getInt(receiver, 0);
if(qq == 0)
return;
nextAck = main.getClient().sendSMS(
qq,
textSenderName.getText(),
contentType,
contentId,
chkHandfree.getSelection() ? QQ.QQ_SMS_HAND_FREE : QQ.QQ_SMS_NORMAL);
}
}
}
/**
* 根据用户输入的内容创建消息字节数组
* @return
*/
protected void createMessageBytes() {
// 对消息进行格式化
StringBuffer sb = new StringBuffer(textInput.getText());
StyleRange[] range = textInput.getStyleRanges();
for(int i = range.length - 1; i >= 0; i--) {
sb.insert(range[i].start, (char)BLINK);
sb.insert(range[i].start + range[i].length + 1, (char)BLINK);
}
// 检查是分片发送还是只发送一条
if(chkSplit.getSelection()) {
/* 如果是分片发送,还要再处理一下,加上一个头 */
// 首先得到每个分片的大小,因为消息和发送者名称合起来不能超过58,同时还要减去头部4个字符
int fragSize = 58 - textSenderName.getText().length() - 4;
// 得到分片总数
int frags = (sb.length() + 1) / fragSize;
// 插入头部
for(int i = (frags - 1) * fragSize, j = 0x30 + frags; i >= 0; i -= fragSize, j--) {
sb.insert(i, (char)0x0A)
.insert(i, (char)(0x30 + frags))
.insert(i, (char)0x2F)
.insert(i, (char)j);
}
// 得到每个分片的字节数组,注意fragSize加了4,因为头部已经填充了
fragSize += 4;
message = new byte[frags][];
for(int i = 0; i < frags; i++) {
if(i < frags - 1)
message[i] = Util.getBytes(sb.substring(i * fragSize, (i + 1) * fragSize));
else
message[i] = Util.getBytes(sb.substring(i * fragSize));
}
} else {
message = new byte[1][];
message[0] = Util.getBytes(sb.toString());
}
}
/**
* 初始化变量
*/
private void initVariable() {
buttonColor = new Color(display, 0xEF, 0xEF, 0xF7);
toolbarBackground = new Color(display, 0x5A, 0x82, 0xD6);
available = MAX_ONE;
contentType = QQ.QQ_SMS_CONTENT_NORMAL;
reply = new ArrayList();
sendToMobile = false;
nextAck = 0;
createFriendSelectShell();
}
/**
* 创建好友选择窗口
*/
private void createFriendSelectShell() {
fss = new FriendSelectShell(shell, true);
fss.setModel(main.getModel());
fss.setMobileModel(main.getMobileModel());
fss.addFriendSelectionListener(this);
}
/**
* 打开shell
*/
public void open() {
// 设置窗口位置
Rectangle rect = display.getClientArea();
Point size = shell.getSize();
shell.setLocation((rect.width - size.x) / 2, (rect.height - size.y) / 2);
// 打开shell
shell.layout();
shell.open();
font = new Font(display, display.getSystemFont().getFontData()[0].getName(), 12, SWT.NORMAL);
textInput.setFont(font);
textInput.setFocus();
// 添加自己为QQListener
main.getClient().addQQListener(this);
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
*/
public void widgetDisposed(DisposeEvent e) {
buttonColor.dispose();
toolbarBackground.dispose();
font.dispose();
}
/**
* 是当前窗口激活
*/
public void setActive() {
shell.setActive();
}
/**
* 代理方法,设置窗口的最小化状态
* @param b
*/
public void setMinimized(boolean b) {
shell.setMinimized(b);
}
/**
* 使chatbox获得焦点
*/
public void setFocus() {
textInput.setFocus();
}
/**
* 调整发送者名称的长度,因为发送者名称长度最大13个字节
*/
private void shortenName() {
byte[] b = textSenderName.getText().getBytes();
if(b.length > 13) {
String name = Util.getString(b, 0, 13, QQ.QQ_CHARSET_DEFAULT);
textSenderName.setText(name);
textSenderName.setSelection(name.length());
}
}
/**
* 调整消息长度
*/
private void shortenMessage() {
if(available < 0) {
String text = textInput.getText();
text = text.substring(0, text.length() + available / 2);
textInput.setText(text);
available = 0;
textInput.setSelection(text.length());
}
}
/**
* 设置提示信息
* @param remain
*/
private void setHint() {
lblHint.setText(LumaQQ.getString("send.sms.label.hint", new Object[] { String.valueOf(available) }));
}
/**
* 计算还能输入多少字符,我们要扣除发送者名称,要扣除闪烁效果,要扣除已经输入的消息
*/
private void calcAvailable() {
if(chkSplit.getSelection())
available = MAX_THREE - textSenderName.getText().length() * 6 - textInput.getText().length() * 2 - textInput.getStyleRanges().length * 4;
else
available = MAX_ONE - (textSenderName.getText().length() + textInput.getText().length()) * 2 - textInput.getStyleRanges().length * 4;
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.ShellAdapter#shellClosed(org.eclipse.swt.events.ShellEvent)
*/
public void shellClosed(ShellEvent e) {
main.getClient().removeQQListener(this);
}
/* (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_SMS_SUCCESS:
processSendSMSSuccess(e);
break;
case QQEvent.QQ_SEND_SMS_FAIL:
processSendSMSFail(e);
break;
case QQEvent.QQ_OPERATION_TIMEOUT:
if(e.operation == QQ.QQ_CMD_SEND_SMS)
processSendSMSTimeout(e);
break;
default:
break;
}
}
/**
* 发送下一个分片
* @param seq
* 分片号,从0开始
*/
private void sendNextSplit(char seq) {
if(sendToMobile) {
/* 发送到手机好友 */
nextAck = main.getClient().sendSMS(
receiver,
textSenderName.getText(),
message[seq],
seq,
chkHandfree.getSelection() ? QQ.QQ_SMS_HAND_FREE : QQ.QQ_SMS_NORMAL);
} else {
/* 发送到普通好友 */
// 得到接收者QQ号
int qq = Util.getInt(receiver, 0);
if(qq == 0)
return;
// 保存短信内容到聊天记录
main.getMessageManager().saveMessage(qq, qq, main.getMyModel().getQQ(), Util.getString(message[seq]), (int)(System.currentTimeMillis() / 1000));
// 发送
nextAck = main.getClient().sendSMS(
qq,
textSenderName.getText(),
message[seq],
seq,
chkHandfree.getSelection() ? QQ.QQ_SMS_HAND_FREE : QQ.QQ_SMS_NORMAL);
}
}
/**
* 处理发送短消息成功事件
*
* @param e
*/
private void processSendSMSSuccess(QQEvent e) {
SendSMSReplyPacket packet = (SendSMSReplyPacket)e.getSource();
reply.add(packet);
if(nextAck == packet.getSequence()) {
if(message.length - 1 > messageSequence) {
/* 如果还有消息没发完,则继续发 */
display.asyncExec(new Runnable() {
public void run() {
sendNextSplit(++messageSequence);
}
});
} else {
display.asyncExec(new Runnable() {
public void run() {
showResult();
}
});
}
}
}
/**
* 显示发送的结果
*/
private void showResult() {
/* 如果已经发完了,弹出状态报告 */
new SMSResultDialog(shell, reply).open();
btnSend.setEnabled(true);
}
/**
* 处理发送短消息失败事件
*
* @param e
*/
private void processSendSMSFail(QQEvent e) {
SendSMSReplyPacket packet = (SendSMSReplyPacket)e.getSource();
reply.add(packet);
if(nextAck == packet.getSequence()) {
if(message.length - 1 > messageSequence) {
/* 如果还有消息没发完,则继续发 */
display.asyncExec(new Runnable() {
public void run() {
sendNextSplit(++messageSequence);
}
});
} else {
display.asyncExec(new Runnable() {
public void run() {
showResult();
}
});
}
}
}
/**
* 处理发送短消息超时事件
*
* @param e
*/
private void processSendSMSTimeout(QQEvent e) {
SendSMSPacket packet = (SendSMSPacket)e.getSource();
if(nextAck == packet.getSequence()) {
display.asyncExec(new Runnable() {
public void run() {
btnSend.setEnabled(true);
MessageDialog.openError(shell, LumaQQ.getString("message.box.common.fail.title"), LumaQQ.getString("message.box.send.sms.timeout"));
}
});
}
}
/**
* 设置接收者
*
* @param f
*/
public void setReceiver(FriendModel f) {
model = f;
receiver = String.valueOf(f.getQQ());
textReceiver.setText(receiver);
setSendToMobile(false);
}
/**
* 设置接收者
*
* @param m
*/
public void setReceiver(MobileModel m) {
model = m;
receiver = m.getMobile();
textReceiver.setText(receiver);
setSendToMobile(true);
}
/**
* 设置接收者
*
* @param model
*/
public void setReceiver(Object model) {
if(model instanceof FriendModel)
setReceiver((FriendModel)model);
else if(model instanceof MobileModel)
setReceiver((MobileModel)model);
}
/**
* @return
* true表示接收者号码是个手机号码
*/
public boolean isSendToMobile() {
return sendToMobile;
}
/**
* 设置接收者号码类型
*
* @param sendToMobile
* true表示接收者号码是个手机号码
*/
public void setSendToMobile(boolean sendToMobile) {
this.sendToMobile = sendToMobile;
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.events.FriendSelectionListener#friendSelected(edu.tsinghua.lumaqq.events.FriendSelectionEvent)
*/
public void friendSelected(FriendSelectionEvent e) {
setReceiver(((List)e.getSource()).get(0));
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.events.FriendSelectionListener#friendDeselected(edu.tsinghua.lumaqq.events.FriendSelectionEvent)
*/
public void friendDeselected(FriendSelectionEvent e) {
model = null;
receiver = null;
textReceiver.setText("");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -