📄 sendimtabwindow.java
字号:
enterMenu.setLocation(btnSend.getParent().toDisplay(bound.x, bound.y + bound.height));
// 显示菜单
enterMenu.setVisible(true);
}
});
// 聊天记录面板
viewer = new RecordViewer(container, new FriendRecordProvider(null), main);
viewer.setFont(res.getDefaultFont());
viewer.setVisible(false);
viewer.setRecordManager(main.getRecordManager());
viewer.setBackground(container.getBackground());
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
gd.heightHint = 200;
gd.exclude = true;
viewer.setLayoutData(gd);
// tableitem双击事件监听器
viewer.addSelectionListener(
new SelectionAdapter() {
public void widgetDefaultSelected(SelectionEvent e) {
IIMContainer container = getActiveContainer();
if(container != null)
container.appendText(viewer.getSelectedText());
}
}
);
// 初始化
initEnterMenu();
return container;
}
/**
* 切换到下一个标签
*/
protected void nextTab() {
int index = folder.getSelectionIndex();
if(index == -1 || index >= folder.getItemCount() - 1) {
if(folder.getItemCount() > 0) {
folder.setSelection(0);
onTabSelection();
}
} else if(folder.getItemCount() > index + 1) {
folder.setSelection(index + 1);
onTabSelection();
}
}
/**
* 切换到上一标签
*/
protected void previousTab() {
int index = folder.getSelectionIndex();
if(index == -1 || index == 0) {
if(folder.getItemCount() > 0) {
folder.setSelection(folder.getItemCount() - 1);
onTabSelection();
}
} else if(index > 0) {
folder.setSelection(index - 1);
onTabSelection();
}
}
/**
* 切换到下一个有消息未读的tab,如果没有,则保持不变
*/
protected void nextUnreadTab() {
int count = folder.getItemCount();
int index = folder.getSelectionIndex();
if(index == -1 || index >= folder.getItemCount() - 1) {
for(int i = 0; i < count; i++) {
if(getContainer(i).getUnreadCount() > 0) {
folder.setSelection(i);
onTabSelection();
return;
}
}
} else if(count > index + 1) {
for(int i = index + 1; i < count; i++) {
if(getContainer(i).getUnreadCount() > 0) {
folder.setSelection(i);
onTabSelection();
return;
}
}
for(int i = 0; i < index; i++) {
if(getContainer(i).getUnreadCount() > 0) {
folder.setSelection(i);
onTabSelection();
return;
}
}
}
}
/**
* @return
* 活动消息容器
*/
protected IIMContainer getActiveContainer() {
CTabItem tab = folder.getSelection();
if(tab == null)
return null;
return (IIMContainer)tab.getControl();
}
/**
* 得到第index个container
*
* @param index
* @return
*/
private IIMContainer getContainer(int index) {
CTabItem tab = folder.getItem(index);
return (IIMContainer)tab.getControl();
}
/**
* 清空相关数据
*
* @param container
*/
protected void clearContainerRegistry(IIMContainer container) {
main.getClient().removeQQListener(container);
model2container.remove(container.getModel());
model2tab.remove(container.getModel());
id2model.remove(container.getId());
container.release();
}
/* (non-Javadoc)
* @see org.eclipse.jface.window.Window#getInitialSize()
*/
@Override
protected Point getInitialSize() {
return new Point(500, 470);
}
/* (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;
}
/* (non-Javadoc)
* @see org.eclipse.jface.window.Window#getInitialLocation(org.eclipse.swt.graphics.Point)
*/
protected Point getInitialLocation(Point initialSize) {
// 缺省实现是把窗口居中
Rectangle displayRect = main.getDisplay().getClientArea();
int y = (displayRect.height - initialSize.y) / 2 - 100;
if(y < 0)
y = 0;
return new Point((displayRect.width - initialSize.x) / 2, y);
}
/**
* 显示/隐藏聊天记录
*/
protected void showRecord() {
IIMContainer container = getActiveContainer();
if(container == null)
return;
GridData gd = (GridData)viewer.getLayoutData();
Shell shell = getShell();
if(gd.exclude) {
gd.exclude = false;
refreshRecord(container);
} 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();
}
/**
* 刷新聊天记录
*
* @param container
*/
private void refreshRecord(IIMContainer container) {
IRecordProvider provider = viewer.getProvider();
Model model = container.getModel();
if(model instanceof User && !(provider instanceof FriendRecordProvider))
viewer.setProvider(new FriendRecordProvider((User)model));
else if(model instanceof Cluster && !(provider instanceof ClusterRecordProvider))
viewer.setProvider(new ClusterRecordProvider((Cluster)model));
else
viewer.getProvider().setModel(model);
viewer.refreshRecord();
}
/**
* 设置窗口激活
*/
public void setActive() {
getShell().setActive();
}
public boolean isActive() {
return active;
}
/**
* 设置最小化状态
*
* @param b
*/
public void setMinimized(boolean b) {
getShell().setMinimized(b);
}
/**
* 设置焦点
*/
public void setFocus() {
getShell().setFocus();
}
/**
* 添加标签页
*/
public IIMContainer addTabIM(Model model) {
if(hasContainer(model))
return model2container.get(model);
CTabItem tab = new CTabItem(folder, SWT.CLOSE);
IIMContainer container = null;
if(model instanceof User)
container = new NormalIMContainer(folder);
else
container = new ClusterIMContainer(folder);
container.setModel(model);
container.setMainShell(main);
container.setKeyHandler(keyHandler);
tab.setControl(container.getComposite());
tab.setImage(container.getHead());
tab.setText(container.getDisplayedName());
model2tab.put(model, tab);
model2container.put(model, container);
id2model.put(container.getId(), model);
if(folder.getItemCount() == 1) {
folder.setSelection(tab);
onTabSelection();
}
if(viewer.getVisible())
refreshRecord(container);
container.setKeyboardFocus();
main.getClient().addQQListener(container);
container.init();
return container;
}
/**
* @param id
* Model的id
* @return
* true标明已经有了这个im容器
*/
protected boolean hasContainer(int id) {
return id2model.containsKey(id);
}
/**
* @param model
* Model
* @return
* true标明已经有了这个im容器
*/
public boolean hasContainer(Model model) {
return model2tab.containsKey(model);
}
/**
* 刷新tab显示
*
* @param model
*/
public void refreshTab(Model model) {
CTabItem tab = model2tab.get(model);
if(tab == null)
return;
IIMContainer container = model2container.get(model);
if(container == null)
return;
container.setModel(model);
tab.setImage(container.getHead());
tab.setText(container.getDisplayedName());
}
/**
* 激活一个容器
*
* @param model
* Model
*/
public void activeContainer(Model model) {
IIMContainer container = model2container.get(model);
if(container == null)
return;
CTabItem newActiveTab = model2tab.get(model);
if(newActiveTab == null)
return;
folder.setSelection(newActiveTab);
((IIMContainer)newActiveTab.getControl()).setKeyboardFocus();
}
/**
* 推入一个消息
*
* @param model
* Model
* @param packet
* 消息包对象
*/
public void putMessage(Model model, ReceiveIMPacket packet) {
IIMContainer container = model2container.get(model);
if(container == null)
container = addTabIM(model);
container.putMessage(packet);
if(!container.isActiveContainer())
refreshTabText(container);
}
@Override
protected Shell getParentShell() {
return null;
}
/**
* @param container
*/
private void refreshTabText(IIMContainer container) {
Model m = container.getModel();
CTabItem tab = model2tab.get(m);
if(tab != null) {
StringBuilder sb = new StringBuilder();
if(container.getUnreadCount() > 0) {
sb.append('(')
.append(container.getUnreadCount())
.append(')')
.append(' ');
};
sb.append(container.getDisplayedName());
tab.setText(sb.toString());
}
}
/**
* 当前tab改变后调用此方法
*/
private void onTabSelection() {
IIMContainer container = getActiveContainer();
if(activeContainer != null) {
activeContainer.setActive(false);
refreshTabText(activeContainer);
}
activeContainer = container;
if(activeContainer != null) {
activeContainer.setActive(true);
refreshTabText(activeContainer);
}
container.setKeyboardFocus();
if(viewer.getVisible()) {
if(container != null && container.getModel() != viewer.getProvider().getModel())
refreshRecord(container);
}
}
/**
* 停止闪烁图标
*/
protected void stopBlinkImage() {
blinkRunnable.setStop(true);
}
/**
* 开始闪烁图标
*/
public void startBlinkImage() {
if(!blinkRunnable.isStop()) return;
blinkRunnable.setStop(false);
main.getDisplay().timerExec(0, blinkRunnable);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -