⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 blindhelper.java

📁 lumaQQ的源文件
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
/*
* 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 + -