📄 blindhelper.java
字号:
/*
* LumaQQ - Java QQ Client
*
* Copyright (C) 2004 luma <stubma@163.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package edu.tsinghua.lumaqq.ui.helper;
import static edu.tsinghua.lumaqq.models.ClusterType.*;
import static edu.tsinghua.lumaqq.resource.Messages.*;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.DropTargetListener;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseTrackListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.MessageBox;
import edu.tsinghua.lumaqq.LumaQQ;
import edu.tsinghua.lumaqq.MessageQueue;
import edu.tsinghua.lumaqq.ecore.group.GroupFactory;
import edu.tsinghua.lumaqq.ecore.group.XCluster;
import edu.tsinghua.lumaqq.ecore.group.XGroup;
import edu.tsinghua.lumaqq.ecore.group.XGroups;
import edu.tsinghua.lumaqq.ecore.group.XOrganization;
import edu.tsinghua.lumaqq.ecore.group.XUser;
import edu.tsinghua.lumaqq.ecore.remark.Remark;
import edu.tsinghua.lumaqq.eutil.GroupUtil;
import edu.tsinghua.lumaqq.models.Cluster;
import edu.tsinghua.lumaqq.models.ClusterType;
import edu.tsinghua.lumaqq.models.Dummy;
import edu.tsinghua.lumaqq.models.DummyType;
import edu.tsinghua.lumaqq.models.Group;
import edu.tsinghua.lumaqq.models.GroupType;
import edu.tsinghua.lumaqq.models.Model;
import edu.tsinghua.lumaqq.models.ModelRegistry;
import edu.tsinghua.lumaqq.models.ModelUtils;
import edu.tsinghua.lumaqq.models.Organization;
import edu.tsinghua.lumaqq.models.Status;
import edu.tsinghua.lumaqq.models.User;
import edu.tsinghua.lumaqq.qq.beans.DownloadFriendEntry;
import edu.tsinghua.lumaqq.resource.Resources;
import edu.tsinghua.lumaqq.ui.MainShell;
import edu.tsinghua.lumaqq.ui.ReceiveSystemMessageShell;
import edu.tsinghua.lumaqq.ui.dialogs.SelectGroupDialog;
import edu.tsinghua.lumaqq.ui.listener.ClusterDragSourceListener;
import edu.tsinghua.lumaqq.ui.listener.ClusterDropTargetListener;
import edu.tsinghua.lumaqq.ui.listener.DefaultQTreeListener;
import edu.tsinghua.lumaqq.ui.listener.GroupDropTargetListener;
import edu.tsinghua.lumaqq.ui.listener.GroupNameChangedListener;
import edu.tsinghua.lumaqq.ui.listener.ItemDragSourceListener;
import edu.tsinghua.lumaqq.ui.listener.ItemMouseListener;
import edu.tsinghua.lumaqq.ui.listener.ItemMouseTrackListener;
import edu.tsinghua.lumaqq.ui.provider.FriendTreeModeContentProvider;
import edu.tsinghua.lumaqq.ui.provider.GroupContentProvider;
import edu.tsinghua.lumaqq.ui.provider.ModelLabelProvider;
import edu.tsinghua.lumaqq.ui.sorter.LatestSorter;
import edu.tsinghua.lumaqq.ui.sorter.ModelSorter;
import edu.tsinghua.lumaqq.widgets.qstyle.Animation;
import edu.tsinghua.lumaqq.widgets.qstyle.Blind;
import edu.tsinghua.lumaqq.widgets.qstyle.IFilter;
import edu.tsinghua.lumaqq.widgets.qstyle.IQTreeListener;
import edu.tsinghua.lumaqq.widgets.qstyle.ISlatLabelProvider;
import edu.tsinghua.lumaqq.widgets.qstyle.ISlatListener;
import edu.tsinghua.lumaqq.widgets.qstyle.ItemLayout;
import edu.tsinghua.lumaqq.widgets.qstyle.QTreeViewer;
import edu.tsinghua.lumaqq.widgets.qstyle.Slat;
/**
* 管理Blind控件的显示模式
*
* @author luma
*/
public class BlindHelper {
private MainShell main;
// 所有的缺省组和用户自定义组
private Group latestGroup;
private Group clusterGroup;
private Group myFriendGroup;
private Group strangerGroup;
private Group blacklistGroup;
private List<Group> normalGroups;
// QTreeViewer注册表
private Map<Group, QTreeViewer<Model>> viewers;
private IFilter<Model> onlineFilter;
private Map<Integer, Group> addTo;
public BlindHelper(MainShell main) {
this.main = main;
normalGroups = new ArrayList<Group>();
viewers = new HashMap<Group, QTreeViewer<Model>>();
onlineFilter = new OnlineFilter();
addTo = new HashMap<Integer, Group>();
}
/**
* @return
* 当前组对象,没有返回null
*/
public Group getCurrentGroup() {
Control control = main.getBlind().getCurrentSlatControl();
for(Group g : viewers.keySet()) {
if(viewers.get(g).getQTree() == control) {
if(isTreeMode()) {
// 如果是树形模式,且当前在好友组中,判断当前选择了哪个组
QTreeViewer<Model> viewer = viewers.get(myFriendGroup);
if(viewer.getQTree() == control)
return myFriendGroup;
else
return g;
} else
return g;
}
}
return null;
}
/**
* 设置视图背景颜色
*
* @param bg
* Color
*/
public void setBackground(Color bg) {
for(QTreeViewer<Model> viewer : viewers.values()) {
viewer.getQTree().setBackground(bg);
}
}
/**
* 设置是否使用小头像
*
* @param b
* true表示使用小头像
*/
public void setShowSmallHead(boolean b) {
ItemLayout layout = b ? ItemLayout.HORIZONTAL : ItemLayout.VERTICAL;
// 改变好友组
if(isTreeMode()) {
QTreeViewer<Model> viewer = viewers.get(myFriendGroup);
changeViewerLayout(viewer, 1, layout);
} else {
QTreeViewer<Model> viewer = viewers.get(myFriendGroup);
changeViewerLayout(viewer, 0, layout);
for(Group g : normalGroups) {
viewer = viewers.get(g);
changeViewerLayout(viewer, 0, layout);
}
changeViewerLayout(viewers.get(strangerGroup), 0, layout);
changeViewerLayout(viewers.get(blacklistGroup), 0, layout);
}
// 改变最近联系人组
changeViewerLayout(viewers.get(latestGroup), 0, layout);
}
/**
* 改变viewer的布局
*
* @param viewer
* @param level
* @param layout
*/
private void changeViewerLayout(QTreeViewer<Model> viewer, int level, ItemLayout layout) {
switch(layout) {
case HORIZONTAL:
viewer.getQTree().setLevelImageSize(level, 20);
viewer.getQTree().setLevelIndent(16);
viewer.getQTree().setLevelLayout(level, layout);
break;
case VERTICAL:
viewer.getQTree().setLevelImageSize(level, 40);
viewer.getQTree().setLevelIndent(0);
viewer.getQTree().setLevelLayout(level, layout);
break;
default:
SWT.error(SWT.ERROR_INVALID_RANGE);
break;
}
}
/**
* 得到model所在QTreeViewer对象
*
* @param model
* model对象
* @return
* 包含这个model的QTreeViewer
*/
public QTreeViewer<Model> getViewer(Model model) {
if(model == null)
return null;
switch(model.type) {
case USER:
return viewers.get(((User)model).group);
case CLUSTER:
case DUMMY:
return viewers.get(clusterGroup);
case GROUP:
return viewers.get((Group)model);
default:
SWT.error(SWT.ERROR_INVALID_RANGE);
return null;
}
}
/**
* @param model
* @return
* true表示这个item有一个动画在进行
*/
public boolean hasAnimation(Model model) {
QTreeViewer<Model> viewer = getViewer(model);
if(viewer == null)
return false;
return viewer.hasAnimation(model);
}
/**
* 闪烁文字
*
* @param m
*/
public void startBlinkText(Model m) {
QTreeViewer<Model> viewer = getViewer(m);
if(viewer == null)
return;
if(!viewer.hasAnimation(m))
viewer.startAnimation(m, Animation.TEXT_BLINK);
}
/**
* 停止文本闪烁
*
* @param m
*/
public void stopBlinkText(Model m) {
QTreeViewer<Model> viewer = getViewer(m);
if(viewer == null)
return;
if(viewer.hasAnimation(m))
viewer.stopAnimation(m);
}
/**
* 开始跳动一个图标
*
* @param model
*/
public void startBounceImage(Model model) {
QTreeViewer<Model> viewer = getViewer(model);
if(viewer == null)
return;
if(!viewer.hasAnimation(model))
viewer.startAnimation(model, Animation.ICON_BOUNCE);
}
/**
* 开始在一个组上闪烁图标
*
* @param g
* @param img
*/
public void startBlinkGroupImage(Group g, Image img) {
QTreeViewer<Model> viewer = viewers.get(g);
if(viewer == null)
return;
Blind blind = main.getBlind();
int index = blind.indexOf(viewer.getQTree());
if(!blind.getSlat(index).isBlinking())
blind.startBlink(index, img);
}
/**
* 停止在一个组上闪烁
*
* @param g
*/
public void stopBlinkGroupImage(Group g) {
QTreeViewer<Model> viewer = viewers.get(g);
if(viewer == null)
return;
Blind blind = main.getBlind();
int index = blind.indexOf(viewer.getQTree());
if(blind.getSlat(index).isBlinking())
blind.stopBlink(index);
}
/**
* 给定一个控件或者一个slat,得到对应的Group对象,如果当前处于树形模式,且
* 这个control正好是好友树,则返回我的好友组
*
* @param c
* Control或者slat
* @return
* Group对象,没有返回null
*/
public Group getSlatGroup(Control c) {
Blind blind = main.getBlind();
int index = blind.indexOf(c);
Control slatControl = blind.getSlatControl(index);
for(Map.Entry<Group, QTreeViewer<Model>> entry : viewers.entrySet()) {
if(entry.getValue().getQTree() == slatControl) {
if(isTreeMode()) {
if(viewers.get(myFriendGroup).getQTree() == slatControl)
return myFriendGroup;
else
return entry.getKey();
} else
return entry.getKey();
}
}
return null;
}
/**
* 刷新某个组
*
* @param g
*/
public void refreshGroup(Group g) {
QTreeViewer<Model> viewer = viewers.get(g);
if(viewer != null) {
viewer.refresh();
main.getBlind().refreshSlat(viewer.getQTree());
}
}
/**
* 初始化传统模式
*/
private void initTraditionalMode() {
Blind blind = main.getBlind();
blind.setLabelProvider(new ISlatLabelProvider() {
public String getText(Control slatControl) {
for(Group g : viewers.keySet()) {
QTreeViewer<Model> viewer = viewers.get(g);
if(viewer.getQTree() == slatControl)
return getGroupText(g);
}
return "";
}
});
MouseListener itemMouseListener = new ItemMouseListener(main);
MouseTrackListener itemMouseTrackListener = new ItemMouseTrackListener(main);
IQTreeListener qtreeListener = new DefaultQTreeListener(main);
DropTargetListener groupDropTargetListener = new GroupDropTargetListener(main);
DragSourceListener itemDragSourceListener = new ItemDragSourceListener();
Transfer[] dummyTransfer = new Transfer[] { TextTransfer.getInstance() };
ISlatListener slatListener = new GroupNameChangedListener(main);
// 我的好友组
QTreeViewer<Model> viewer = new QTreeViewer<Model>(blind);
viewer.setContentProvider(new GroupContentProvider(myFriendGroup));
viewer.setLabelProvider(ModelLabelProvider.INSTANCE);
viewer.setSorter(ModelSorter.INSTANCE);
viewer.setInput(this);
viewer.addDragSupport(DND.DROP_MOVE, dummyTransfer, itemDragSourceListener);
viewer.getQTree().addMouseListener(itemMouseListener);
viewer.getQTree().addMouseTrackListener(itemMouseTrackListener);
viewer.getQTree().addQTreeListener(qtreeListener);
viewers.put(myFriendGroup, viewer);
blind.addSlat(viewer.getQTree());
blind.addSlatDropSupport(viewer.getQTree(), DND.DROP_MOVE, dummyTransfer, groupDropTargetListener);
// 自定义组
for(Group g : normalGroups) {
viewer = new QTreeViewer<Model>(blind);
viewer.setContentProvider(new GroupContentProvider(g));
viewer.setLabelProvider(ModelLabelProvider.INSTANCE);
viewer.setSorter(ModelSorter.INSTANCE);
viewer.setInput(this);
viewer.addDragSupport(DND.DROP_MOVE, dummyTransfer, itemDragSourceListener);
viewer.getQTree().addMouseListener(itemMouseListener);
viewer.getQTree().addMouseTrackListener(itemMouseTrackListener);
viewer.getQTree().addQTreeListener(qtreeListener);
viewers.put(g, viewer);
blind.addSlat(viewer.getQTree()).addSlatListener(slatListener);
blind.addSlatDropSupport(viewer.getQTree(), DND.DROP_MOVE, dummyTransfer, groupDropTargetListener);
}
// 陌生人组
viewer = new QTreeViewer<Model>(blind);
viewer.setContentProvider(new GroupContentProvider(strangerGroup));
viewer.setLabelProvider(ModelLabelProvider.INSTANCE);
viewer.setSorter(ModelSorter.INSTANCE);
viewer.setInput(this);
viewer.addDragSupport(DND.DROP_MOVE, dummyTransfer, itemDragSourceListener);
viewer.getQTree().addMouseListener(itemMouseListener);
viewer.getQTree().addMouseTrackListener(itemMouseTrackListener);
viewer.getQTree().addQTreeListener(qtreeListener);
viewers.put(strangerGroup, viewer);
blind.addSlat(viewer.getQTree());
blind.addSlatDropSupport(viewer.getQTree(), DND.DROP_MOVE, dummyTransfer, groupDropTargetListener);
// 黑名单组
viewer = new QTreeViewer<Model>(blind);
viewer.setContentProvider(new GroupContentProvider(blacklistGroup));
viewer.setLabelProvider(ModelLabelProvider.INSTANCE);
viewer.setSorter(ModelSorter.INSTANCE);
viewer.setInput(this);
viewer.addDragSupport(DND.DROP_MOVE, dummyTransfer, itemDragSourceListener);
viewer.getQTree().addMouseListener(itemMouseListener);
viewer.getQTree().addMouseTrackListener(itemMouseTrackListener);
viewer.getQTree().addQTreeListener(qtreeListener);
viewers.put(blacklistGroup, viewer);
blind.addSlat(viewer.getQTree());
blind.addSlatDropSupport(viewer.getQTree(), DND.DROP_MOVE, dummyTransfer, groupDropTargetListener);
// 群组
viewer = new QTreeViewer<Model>(blind);
viewer.setContentProvider(new GroupContentProvider(clusterGroup));
viewer.setLabelProvider(ModelLabelProvider.INSTANCE);
viewer.setSorter(ModelSorter.INSTANCE);
viewer.setInput(this);
viewer.addDragSupport(DND.DROP_MOVE, dummyTransfer, new ClusterDragSourceListener());
viewer.addDropSupport(DND.DROP_MOVE, dummyTransfer, new ClusterDropTargetListener(main));
viewer.getQTree().addMouseListener(itemMouseListener);
viewer.getQTree().addMouseTrackListener(itemMouseTrackListener);
viewer.getQTree().addQTreeListener(qtreeListener);
viewers.put(clusterGroup, viewer);
blind.addSlat(viewer.getQTree());
// 最近联系人组
viewer = new QTreeViewer<Model>(blind);
viewer.setContentProvider(new GroupContentProvider(latestGroup));
viewer.setLabelProvider(ModelLabelProvider.INSTANCE);
viewer.setSorter(LatestSorter.INSTANCE);
viewer.setInput(this);
viewer.addDragSupport(DND.DROP_MOVE, dummyTransfer, itemDragSourceListener);
viewer.getQTree().addMouseListener(itemMouseListener);
viewer.getQTree().addMouseTrackListener(itemMouseTrackListener);
viewer.getQTree().addQTreeListener(qtreeListener);
viewers.put(latestGroup, viewer);
blind.addSlat(viewer.getQTree());
}
/**
* 得到一个组的显示文本,主要是要添加上一些统计数据
*
* @param g
* Group
* @return
* 显示文本
*/
private String getGroupText(Group g) {
switch(g.groupType) {
case CLUSTER_GROUP:
return g.name;
case LATEST_GROUP:
return g.name + ' ' + '(' + g.getOnlineUserCount() + '/' + (g.users.size() + g.clusters.size()) + ')';
default:
return g.name + ' ' + '(' + g.getOnlineUserCount() + '/' + g.users.size() + ')';
}
}
/**
* 初始化树形模式
*/
private void initTreeMode() {
Blind blind = main.getBlind();
blind.setLabelProvider(new ISlatLabelProvider() {
public String getText(Control slatControl) {
for(Group g : viewers.keySet()) {
QTreeViewer<Model> viewer = viewers.get(g);
if(viewer.getQTree() == slatControl) {
QTreeViewer<Model> temp = viewers.get(myFriendGroup);
if(temp == viewer)
return myFriendGroup.name;
else
return getGroupText(g);
}
}
return "";
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -