📄 faceutil.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.utils;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import edu.tsinghua.lumaqq.FaceEntry;
import edu.tsinghua.lumaqq.IconHolder;
import edu.tsinghua.lumaqq.qq.Util;
import edu.tsinghua.lumaqq.xml.faces.Face;
import edu.tsinghua.lumaqq.xml.faces.FaceGroup;
import edu.tsinghua.lumaqq.xml.faces.FaceGroupImpl;
import edu.tsinghua.lumaqq.xml.faces.FaceImpl;
import edu.tsinghua.lumaqq.xml.faces.Faces;
/**
* 管理自定义表情的工具类
*
* @author luma
*/
public class FaceUtil {
private Faces faces;
private String fileName;
// id号到md5的映射
private Map id2md5;
// md5到id的映射
private Map md52id;
// face到face group的映射
private Map face2group;
// md5到face的映射
private Map md52face;
// 组名到组的映射
private Map name2group;
// 接收到的表情映射
private Map recv_md52id;
private Map recv_id2md5;
private Map recv_md52filename;
// 接收到的自定义表情使用50000 - 65535之间的id范围,所以最多允许存放15536张表情
private static final int MIN_RECEIVED_FACE_ID = 50000;
private static final int MAX_RECEIVED_FACE_ID = 65535;
private int currentReceivedId;
// Log对象
private static Log log = LogFactory.getLog(FaceUtil.class);
// singleton模式
private static FaceUtil instance = new FaceUtil();
/**
* @return 单一实例
*/
public static FaceUtil getInstance() {
return instance;
}
/**
* @return
* 允许的最大接收表情数
*/
public int getMaxReceiveCount() {
return MAX_RECEIVED_FACE_ID - MIN_RECEIVED_FACE_ID + 1;
}
/**
* 构造函数
* @param options
*/
private FaceUtil() {
id2md5 = new HashMap();
md52id = new HashMap();
face2group = new HashMap();
md52face = new HashMap();
name2group = new HashMap();
recv_md52id = new HashMap();
recv_id2md5 = new HashMap();
recv_md52filename = new HashMap();
currentReceivedId = MIN_RECEIVED_FACE_ID;
}
/**
* 根据md5得到文件名
*
* @param md5
* @return
* 如果不存在返回null
*/
public String getFaceFileName(String md5) {
Face f = (Face)md52face.get(md5);
return (f == null) ? null : f.getFilename();
}
/**
* 添加一个接收到的表情md5
*
* @param md5
* 图片的md5
* @param filename
* 图片文件名
*/
public void addReceivedFace(String md5, String filename) {
Integer id = new Integer(currentReceivedId);
recv_id2md5.put(id, md5);
recv_md52id.put(md5, id);
recv_md52filename.put(md5, filename);
if(currentReceivedId == MAX_RECEIVED_FACE_ID)
currentReceivedId = MIN_RECEIVED_FACE_ID;
else
currentReceivedId++;
}
/**
* 得到接收到的表情的md5
*
* @param md5
* md5
* @return
* 接收到表情的id
*/
public int getReceivedFaceId(String md5) {
Integer id = (Integer)recv_md52id.get(md5);
return (id == null) ? 0 : id.intValue();
}
/**
* 根据接收到的表情id得到表情的文件名
*
* @param id
* 表情id
* @return
* 表情文件名
*/
public String getReceivedFaceFileNameById(int id) {
return (String)recv_md52filename.get(getReceiveFaceMd5(id));
}
/**
* 得到接收到的表情的md5
*
* @param id
* @return
*/
public String getReceiveFaceMd5(int id) {
return (String)recv_id2md5.get(new Integer(id));
}
/**
* 把group组的第index个图片上移一个位置
*
* @param group
* 组索引
* @param index
* 图片的组内索引
*/
public void upFace(int group, int index) {
FaceGroup g = getFaceGroup(group);
if(g == null)
return;
List faces = g.getFaceList();
if(index < 1 || index >= faces.size())
return;
Object obj = faces.remove(index);
faces.add(index - 1, obj);
}
/**
* 把group组的第index个图片下移一个位置
*
* @param group
* 组索引
* @param index
*
*/
public void downFace(int group, int index) {
FaceGroup g = getFaceGroup(group);
if(g == null)
return;
List faces = g.getFaceList();
if(index < 0 || index >= faces.size() - 1)
return;
Object obj = faces.remove(index);
faces.add(index + 1, obj);
}
/**
* 设置根元素对象
*
* @param faces
*/
public void setFacesModel(Faces faces) {
this.faces = faces;
// 建立映射
List groups = faces.getFaceGroupList();
Iterator i = groups.iterator();
while(i.hasNext()) {
FaceGroup g = (FaceGroup)i.next();
List f = g.getFaceList();
Iterator fIter = f.iterator();
while(fIter.hasNext()) {
Face face = (Face)fIter.next();
id2md5.put(face.getId(), face.getMd5());
md52id.put(face.getMd5(), face.getId());
md52face.put(face.getMd5(), face);
face2group.put(face, g);
}
}
}
/**
* @return
* 根元素对象
*/
public Faces getFacesModel() {
return faces;
}
/**
* 添加一个组
*
* @param name
* 组名
*/
public void addGroup(String name) {
if(faces == null)
return;
FaceGroup g = new FaceGroupImpl();
g.setName(name);
faces.addFaceGroup(g);
name2group.put(g.getName(), g);
}
/**
* 删除一个组
*
* @param name
* 组名
*/
public void removeGroup(String name) {
if(faces == null)
return;
FaceGroup g = getFaceGroup(name);
if(g == null)
return;
faces.getFaceGroupList().remove(g);
}
/**
* 删除一个组
*
* @param group
* 组序号
*/
public FaceGroup removeGroup(int group) {
if(faces == null)
return null;
if(group < 0 || group >= getGroupCount())
return null;
return (FaceGroup)faces.getFaceGroupList().remove(group);
}
/**
* 添加一个表情
*
* @param md5
* 图片的md5
* @param g
* 组元素对象
*/
public void addFace(FaceEntry entry, FaceGroup g) {
Face f = new FaceImpl();
f.setMd5(entry.md5);
f.setFilename(entry.filename);
f.setId(faces.getNextId());
g.addFace(f);
id2md5.put(f.getId(), f.getMd5());
md52id.put(f.getMd5(), f.getId());
md52face.put(f.getMd5(), f);
face2group.put(f, g);
increaseNextId();
}
/**
* 从id得到md5
*
* @param id
* id
* @return
* md5字符串
*/
public String getMd5ById(int id) {
return getMd5ById(String.valueOf(id));
}
/**
* 从id得到md5
*
* @param id
* id字符串
* @return
* md5字符串
*/
public String getMd5ById(String id) {
return (String)id2md5.get(id);
}
/**
* 得到自定义表情组的个数
*
* @return
* 组个数
*/
public int getGroupCount() {
if(faces == null)
return 0;
else
return faces.getFaceGroupList().size();
}
/**
* 得到某个组中自定义表情数目
*
* @param group
* @return
*/
public int getFaceCount(int group) {
FaceGroup g = getFaceGroup(group);
if(g == null)
return 0;
return g.getFaceList().size();
}
/**
* 删除一个自定义表情
*
* @param md5
*/
public void removeFace(String md5) {
if(faces == null)
return;
Face f = (Face)md52face.remove(md5);
if(f == null)
return;
md52id.remove(md5);
id2md5.remove(f.getId());
FaceGroup g = (FaceGroup)face2group.remove(f);
if(g == null)
return;
g.getFaceList().remove(f);
face2group.remove(md52face.remove(md5));
}
/**
* 设置组名称
*
* @param group
* @param name
*/
public void setGroupName(int group, String name) {
FaceGroup g = getFaceGroup(group);
if(g == null)
return;
g.setName(name);
}
/**
* 下一个可用的id号加1
*/
private void increaseNextId() {
int i = Util.getInt(faces.getNextId(), 0);
i++;
faces.setNextId(String.valueOf(i));
}
/**
* 移动一个表情到另外一个组
*
* @param face
* 表情文件元素对象
* @param destGroup
* 目的组索引
*/
public void moveFace(Face face, int destGroup) {
FaceGroup dest = getFaceGroup(destGroup);
if(dest == null)
return;
FaceGroup src = (FaceGroup)face2group.get(face);
src.getFaceList().remove(face);
dest.getFaceList().add(face);
face2group.put(face, dest);
}
/**
* 得到一个组
*
* @param name
* 组名
* @return
* 如果没有这个组,返回null
*/
public FaceGroup getFaceGroup(String name) {
return (FaceGroup)name2group.get(name);
}
/**
* 通过序号得到表情组
*
* @param index
* @return
*/
public FaceGroup getFaceGroup(int index) {
if(faces == null)
return null;
List list = faces.getFaceGroupList();
if(index < 0 || index >= list.size())
return null;
return (FaceGroup)faces.getFaceGroupList().get(index);
}
/**
* 通过序号得到表情
*
* @param group
* 组序号
* @param index
* 表情序号
* @return
* Face元素对象
*/
public Face getFace(int group, int index) {
FaceGroup g = getFaceGroup(group);
if(g == null)
return null;
List list = g.getFaceList();
if(index < 0 || index >= list.size())
return null;
return (Face)g.getFaceList().get(index);
}
/**
* 得到图片id
*
* @param md5
* @return
*/
public int getFaceId(String md5) {
return Util.getInt((String)md52id.get(md5), 0);
}
/**
* 根据表情id得到Face对象
*
* @param id
* id
* @return
* Face
*/
public Face getFace(int id) {
String md5 = getMd5ById(id);
return (Face)md52face.get(md5);
}
/**
* 检查是否存在这个face
*
* @param md5
* 图片的md5值
* @return
* true表示这个图片已经存在
*/
public boolean hasFace(String md5) {
return md52face.containsKey(md5);
}
/**
* 检查是否接收过的表情中有这个图片
*
* @param md5
* 图片的MD5
* @return
* true表示这个图片已经存在
*/
public boolean hasReceivedFace(String md5) {
return recv_md52id.containsKey(md5);
}
/**
* 保存设置
*/
public void save() {
File file = new File(fileName);
try {
faces.marshal(file);
} catch (IOException e) {
log.error("无法保存系统设置文件,所作的改变将丢弃");
}
}
/**
* 得到表情文件的长度
*
* @param md5
* 表情文件的md5
* @return
* 长度
*/
public int getFaceLength(String md5) {
String path = IconHolder.getInstance().getCustomFacePath(getFaceFileName(md5));
File file = new File(path);
if(file.exists())
return (int)file.length();
else
return 0;
}
/**
* @param string
*/
public void setFileName(String string) {
this.fileName = string;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -