📄 tempsessionimwindow.java
字号:
*/
public void startBlinkImage() {
if(!blinkRunnable.isStop()) return;
blinkRunnable.setStop(false);
main.getDisplay().timerExec(0, blinkRunnable);
}
/* (non-Javadoc)
* @see org.eclipse.jface.window.Window#getShellStyle()
*/
@Override
protected int getShellStyle() {
int onTop = main.getOptionHelper().isIMOnTop() ? SWT.ON_TOP : SWT.NONE;
if(LumaQQ.IS_GTK)
return SWT.NO_TRIM | SWT.NO_BACKGROUND | onTop;
else
return SWT.SHELL_TRIM | onTop;
}
/**
* 设置窗口激活
*/
public void setActive() {
getShell().setActive();
}
/**
* 设置最小化状态
*
* @param b
*/
public void setMinimized(boolean b) {
getShell().setMinimized(b);
}
/* (non-Javadoc)
* @see org.eclipse.jface.window.Window#open()
*/
@Override
public int open() {
int ret = super.open();
// 设置输入框获得焦点,设置输入框的字体和颜色
inputBox.setFocus();
if(main.getDefaultStyle() != null)
inputBox.setDefaultStyle(main.getDefaultStyle());
// 添加自己为QQ listener
main.getClient().addQQListener(this);
return ret;
}
/* (non-Javadoc)
* @see org.eclipse.jface.window.Window#constrainShellSize()
*/
@Override
protected void constrainShellSize() {
if(model.talkMode)
getShell().setSize(470, 430);
else
getShell().setSize(440, 340);
Point loc = new Point(50, 50);
int x = model.windowX;
int y = model.windowY;
if(x > 0) loc.x = x;
if(y > 0) loc.y = y;
getShell().setLocation(loc);
}
/* (non-Javadoc)
* @see org.eclipse.jface.window.Window#getInitialLocation(org.eclipse.swt.graphics.Point)
*/
@Override
protected Point getInitialLocation(Point initialSize) {
Point loc = new Point(50, 50);
int x = model.windowX;
int y = model.windowY;
if(x > 0) loc.x = x;
if(y > 0) loc.y = y;
return loc;
}
/**
* 追加消息到输出框
*
* @param f
* @param im
* @param header
*/
public void appendMessage(User f, TempSessionIM im) {
outputBox.appendText('(' + DefaultFace.escapeFaces(f.displayName) + ") " + DateTool.format(im.time), otherStyle);
LineStyle style = getLineStyle(im.fontStyle);
outputBox.appendText(im.message, style);
}
/**
* 往输出框追加消息
*
* @param entry
* RecordEntry
*/
private void appendMessage(RecordEntry entry) {
outputBox.appendText('(' + DefaultFace.escapeFaces(main.getMyModel().displayName) + ") " + DateTool.format(entry.time), myStyle);
outputBox.appendText(entry.message, getLineStyle(main.getDefaultStyle()));
}
/**
* 在输出框中添加提示信息
*
* @param hint
* @param style
*/
private void appendHint(String hint, LineStyle style) {
outputBox.appendText(hint, style);
}
/**
* @return
* true表示当前窗口是活动窗口
*/
public boolean isActive() {
return active;
}
/**
* 发送群消息
* @param string
*/
protected void sendMessage(String s) {
// 检查消息是否为空
if(s.length() == 0) {
MessageDialog.openWarning(getShell(), message_box_common_warning_title, message_box_cannot_send_empty_message);
return;
}
// 判断用户是否登录
if(main.getClient().getUser().isLoggedIn()) {
message = s;
// 保存到聊天记录中
RecordEntry key = new RecordEntry();
key.owner = model.qq;
key.sender = main.getMyModel().qq;
key.senderParent = 0;
key.receiver = model.qq;
key.time = System.currentTimeMillis();
key.type = IKeyConstants.NORMAL;
key.message = message;
main.getRecordManager().addRecord(key);
// 设置输入框暂时不可写
inputBox.setReadonly(true);
inputBox.setBackground(Colors.READONLY_BACKGROUND);
// 发送下一个分片
send();
// 把发送的消息显示到输出框中
appendMessage(key);
// 清空发送框
if(model.talkMode)
inputBox.clear();
} else {
MessageDialog.openWarning(getShell(), message_box_common_warning_title, message_box_please_login_first);
}
}
/**
* 发送下一个分片
*
* @return
* true表示发送成功,false表示已经没有更多分片需要发送
*/
private boolean send() {
// 发送
LineStyle style = main.getDefaultStyle();
main.getClient().sendTempSessionIM(
model.qq,
message,
main.getMyModel().displayName,
style.fontName,
(style.fontStyle & SWT.BOLD) != 0,
(style.fontStyle & SWT.ITALIC) != 0,
false,
style.fontSize,
style.foreground.getRed(),
style.foreground.getGreen(),
style.foreground.getBlue());
return true;
}
/**
* 显示记录控件
*/
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();
}
/* (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_SEND_TEMP_SESSOIN_IM_SUCCESS:
processSendTempSessionIMSuccess(e);
break;
case QQEvent.QQ_SEND_TEMP_SESSION_IM_FAIL:
processSendTempSessionIMFail(e);
break;
case QQEvent.QQ_OPERATION_TIMEOUT:
if(e.operation == QQ.QQ_CMD_TEMP_SESSION_OP)
processSendTempSessionIMTimeout(e);
break;
}
}
/**
* 处理发送临时会话消息失败事件
* @param e
*/
private void processSendTempSessionIMFail(QQEvent e) {
final TempSessionOpReplyPacket packet = (TempSessionOpReplyPacket)e.getSource();
if(packet.receiver == model.qq) {
main.getDisplay().asyncExec(new Runnable() {
public void run() {
enableControl(packet.replyMessage);
}
});
}
}
/**
* 处理发送临时会话消息超时事件
* @param e
*/
private void processSendTempSessionIMTimeout(QQEvent e) {
TempSessionOpPacket packet = (TempSessionOpPacket)e.getSource();
if(packet.getReceiver() == model.qq) {
main.getDisplay().syncExec(new Runnable() {
public void run() {
inputBox.setReadonly(false);
inputBox.setBackground(Colors.WHITE);
setMinimized(false);
setActive();
MessageDialog.openError(getShell(), message_box_common_fail_title, message_box_send_message_timeout);
}
});
}
}
/**
* 处理临时会话消息发送成功事件,主要是查找出是哪个窗口发送的这个消息,关闭之
* @param e
*/
private void processSendTempSessionIMSuccess(QQEvent e) {
final TempSessionOpReplyPacket packet = (TempSessionOpReplyPacket)e.getSource();
if(packet.receiver == model.qq) {
main.getDisplay().asyncExec(new Runnable() {
public void run() {
enableControl(packet.replyMessage);
}
});
}
}
/**
* 使能控件
*
* @param message
*/
protected void enableControl(String message) {
if(!inputBox.isReadonly())
return;
inputBox.setReadonly(false);
inputBox.setBackground(Colors.WHITE);
if(message != null && !message.equals(""))
appendHint(message, otherStyle);
}
/**
* 关闭窗口
*/
public void closeWindow() {
getShell().close();
}
/**
* 设置消息发送窗口为聊天模式或者消息模式
*
* @param b
* true表示为聊天模式
*/
public void setTalkMode(boolean b) {
if(b) {
model.talkMode = true;
if(main.getOptionHelper().isUseEnterInMessageMode() != main.getOptionHelper().isUseEnterInTalkMode())
reinstallSendKey(main.getOptionHelper().isUseEnterInTalkMode());
sash.setVisible(true);
outputForm.setLayoutData(new GridData(GridData.FILL_BOTH));
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.heightHint = 100;
inputForm.setLayoutData(gd);
gd = (GridData)sash.getLayoutData();
gd.heightHint = SWT.DEFAULT;
if(model.talkMode)
getShell().setSize(470, viewer.isVisible() ? 630 : 430);
else
getShell().setSize(440, viewer.isVisible() ? 540 : 340);
inputForm.getParent().layout();
} else {
outputBox.clear();
model.talkMode = false;
if(main.getOptionHelper().isUseEnterInMessageMode() != main.getOptionHelper().isUseEnterInTalkMode())
reinstallSendKey(main.getOptionHelper().isUseEnterInMessageMode());
sash.setVisible(false);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.heightHint = outputForm.getTopLeft().getSize().y + 2;
outputForm.setLayoutData(gd);
inputForm.setLayoutData(new GridData(GridData.FILL_BOTH));
gd = (GridData)sash.getLayoutData();
gd.heightHint = 0;
if(model.talkMode)
getShell().setSize(470, viewer.isVisible() ? 630 : 430);
else
getShell().setSize(440, viewer.isVisible() ? 540 : 340);
inputForm.getParent().layout();
}
}
/**
* 初始化当前文件传输任务菜单
*/
private void initFileMenu() {
fileMenu = new Menu(getShell(), SWT.POP_UP);
// 缺省,无任务进行中
MenuItem mi = new MenuItem(fileMenu, SWT.PUSH);
mi.setText(menu_file_none);
}
/**
* 设置焦点
*/
public void setFocus() {
getShell().setFocus();
}
/**
* @return
* true表示聊天模式
*/
public boolean isTalkMode() {
return model.talkMode;
}
/**
* 打开表情选择窗口
*/
private void openImageSelectionShell(Point loc) {
ImageSelector fss = new ImageSelector(getShell(), new FaceImageAdvisor(main));
fss.setListener(this);
fss.setLocation(loc);
fss.open();
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.events.IFaceSelectionListener#faceSelected(edu.tsinghua.lumaqq.ui.IImageProvider, int, int)
*/
public void faceSelected(IImageSelectorAdvisor provider, int group, int sequence) {
if(group == 0) {
int index = res.getFaceCode(sequence);
if(index != -1)
inputBox.insertImage(IRichContent.DEFAULT_FACE_TAG, index);
} else {
MessageDialog.openInformation(getShell(), message_box_common_info_title, message_box_face_to_user);
/*
* 暂时还不支持向单个用户发送自定义表情,注释掉这些代码
*/
// 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);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -