📄 memberpage.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.config.cluster;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import edu.tsinghua.lumaqq.Colors;
import edu.tsinghua.lumaqq.IconHolder;
import edu.tsinghua.lumaqq.LumaQQ;
import edu.tsinghua.lumaqq.events.FriendSelectionEvent;
import edu.tsinghua.lumaqq.events.IFriendSelectionListener;
import edu.tsinghua.lumaqq.models.ClusterModel;
import edu.tsinghua.lumaqq.models.FriendModel;
import edu.tsinghua.lumaqq.models.GroupModel;
import edu.tsinghua.lumaqq.qq.QQ;
import edu.tsinghua.lumaqq.ui.FriendSelectShell;
import edu.tsinghua.lumaqq.ui.MainShell;
import edu.tsinghua.lumaqq.ui.config.AbstractPage;
import edu.tsinghua.lumaqq.ui.config.user.UserInfoWindow;
import edu.tsinghua.lumaqq.ui.tool.AroundBorderPaintListener;
import edu.tsinghua.lumaqq.ui.tool.ListContentProvider;
import edu.tsinghua.lumaqq.ui.tool.FriendQQSorter;
import edu.tsinghua.lumaqq.ui.tool.UITool;
/**
* 成员列表页
*
* @author luma
*/
public class MemberPage extends AbstractPage implements IFriendSelectionListener {
private ClusterModel model;
private List members;
private TableViewer viewer;
private Button btnAdd;
private MainShell main;
private FriendSelectShell fss;
/**
* @param parent
*/
public MemberPage(Composite parent, MainShell main, ClusterModel model, int style) {
super(parent, style);
this.model = model;
this.main = main;
}
/**
* 创建好友选择窗口
*/
private void createFriendSelectShell() {
fss = new FriendSelectShell(parentShell, false);
fss.setModel(main.getModel());
// 把当前表中的成员在fss中设置为已选择状态
Iterator i = members.iterator();
while(i.hasNext()) {
FriendModel f = (FriendModel)i.next();
fss.select(f);
}
fss.setClusterModel(model);
fss.selectFromRoot(model);
fss.addFriendSelectionListener(this);
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.ui.config.AbstractPage#initialVariable()
*/
protected void initialVariable() {
members = new ArrayList();
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.ui.config.AbstractPage#createContent(org.eclipse.swt.widgets.Composite)
*/
protected Control createContent(Composite parent) {
Composite content = new Composite(parent, SWT.NONE);
content.setBackground(Colors.PAGE_BACKGROUND);
GridLayout layout = new GridLayout(2, false);
layout.marginHeight = layout.marginWidth = 10;
content.setLayout(layout);
content.addPaintListener(new AroundBorderPaintListener(new Class[] { Table.class }, Colors.PAGE_CONTROL_BORDER));
// 设置使用缺省背景色
UITool.setDefaultBackground(null);
viewer = new TableViewer(content, SWT.V_SCROLL | SWT.SINGLE | SWT.H_SCROLL | SWT.FULL_SELECTION);
viewer.setContentProvider(new ListContentProvider(members));
viewer.setLabelProvider(new FriendModelLabelProvider());
viewer.setUseHashlookup(true);
viewer.setSorter(new FriendQQSorter());
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection)viewer.getSelection();
FriendModel f = (FriendModel)selection.getFirstElement();
if(f == null)
btnAdd.setEnabled(false);
else {
if(f.getQQ() == main.getMyModel().getQQ())
btnAdd.setEnabled(false);
else
btnAdd.setEnabled(!main.getMVCHelper().isFriend(f));
}
}
});
Table t = viewer.getTable();
TableColumn tc = new TableColumn(t, SWT.LEFT);
tc.setText(LumaQQ.getString("cluster.info.members.qq"));
tc.setWidth(90);
tc = new TableColumn(t, SWT.LEFT);
tc.setText(LumaQQ.getString("cluster.info.members.nick"));
tc.setWidth(90);
tc = new TableColumn(t, SWT.LEFT);
tc.setText(LumaQQ.getString("cluster.info.members.gender"));
tc.setWidth(40);
tc = new TableColumn(t, SWT.LEFT);
tc.setText(LumaQQ.getString("cluster.info.members.age"));
tc.setWidth(40);
t.setHeaderVisible(true);
t.setLinesVisible(false);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.verticalSpan = 2;
t.setLayoutData(gd);
t.addSelectionListener(new SelectionAdapter() {
public void widgetDefaultSelected(SelectionEvent e) {
IStructuredSelection selection = (IStructuredSelection)viewer.getSelection();
FriendModel f = (FriendModel)selection.getFirstElement();
if(f != null) {
main.getShellLauncher().openUserInfoWindow(f, UserInfoWindow.READ_ONLY);
main.getClient().getUserInfo(f.getQQ());
}
}
});
viewer.setInput(this);
// 设置成员
Button btnModify = UITool.createButton(content, LumaQQ.getString("cluster.info.members.modify") + " >>", new GridData(GridData.HORIZONTAL_ALIGN_FILL));
if(style == ClusterInfoWindow.READ_ONLY)
btnModify.setEnabled(false);
btnModify.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
// 判断窗口是否dispose,因为linux下面这个窗口是有关闭按钮的
// 而windows下面没有,所以在linux下面这个窗口可能被dispose
if(fss == null || fss.isDisposed())
createFriendSelectShell();
if(fss.isVisible()) {
fss.setVisible(false);
((Button)e.getSource()).setText(LumaQQ.getString("cluster.info.members.modify") + " >>");
} else {
fss.setVisible(true);
((Button)e.getSource()).setText(LumaQQ.getString("cluster.info.members.modify") + " <<");
}
}
});
// 加为好友
btnAdd = UITool.createButton(content, LumaQQ.getString("cluster.info.members.add"), new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING));
btnAdd.setEnabled(false);
btnAdd.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
IStructuredSelection selection = (IStructuredSelection)viewer.getSelection();
FriendModel f = (FriendModel)selection.getFirstElement();
// 找到第一个好友组的model
GroupModel destModel = main.getMVCHelper().getFirstFriendlyGroupModel();
if(destModel != null) {
// 创建窗口
main.getShellLauncher().openAddReceiveSystemMessageShell(f);
main.getMVCHelper().addFriend(f.getQQ(), destModel);
}
}
});
return content;
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.ui.config.AbstractPage#saveDirtyProperty(int)
*/
protected void saveDirtyProperty(int propertyId) {
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.ui.config.AbstractPage#initializeValues()
*/
protected void initializeValues() {
members.clear();
members.addAll(model.getMemberList());
viewer.refresh();
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.ui.config.AbstractPage#getImage()
*/
protected Image getImage() {
return IconHolder.getInstance().getImage(IconHolder.icoViewPersonInfo24);
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.ui.config.AbstractPage#getTitle()
*/
protected String getTitle(int page) {
return LumaQQ.getString("cluster.info.page.members");
}
/**
* @return
* 要删除的成员model列表
*/
public List getMembersToBeRemoved() {
List ret = model.getMemberList();
Iterator i = members.iterator();
while(i.hasNext())
ret.remove(i.next());
return ret;
}
/**
* @return
* 要添加的成员model列表
*/
public List getMembersToBeAdded() {
List ret = new ArrayList(members);
Iterator i = model.getMembers().values().iterator();
while(i.hasNext())
ret.remove(i.next());
return ret;
}
/**
* 把一个FriendModel列表转换成int数组
*
* @param list
* List
* @return
* int数组
*/
private int[] toIntArray(List list) {
int[] ret = new int[list.size()];
for(int i = 0; i < ret.length; i++)
ret[i] = ((FriendModel)list.get(i)).getQQ();
return ret;
}
/**
* 发送删除群成员请求包
*
* @return
* 包序号
*/
public char doRemoveMember() {
List remove = getMembersToBeRemoved();
if(remove.isEmpty())
return 0;
if(model.isPermanent())
return main.getClient().modifyClusterMember(model.getClusterId(),
QQ.QQ_CLUSTER_MEMBER_REMOVE,
toIntArray(remove));
else
return main.getClient().modifyTempClusterMember(model.getType(),
model.getClusterId(),
model.getParentClusterId(),
QQ.QQ_CLUSTER_MEMBER_REMOVE,
toIntArray(remove));
}
/**
* 发送添加群成员请求包
*
* @return
* 包序号
*/
public char doAddMember() {
List add = getMembersToBeAdded();
if(add.isEmpty())
return 0;
if(model.isPermanent())
return main.getClient().modifyClusterMember(model.getClusterId(),
QQ.QQ_CLUSTER_MEMBER_ADD,
toIntArray(add));
else
return main.getClient().modifyTempClusterMember(model.getType(),
model.getClusterId(),
model.getParentClusterId(),
QQ.QQ_CLUSTER_MEMBER_ADD,
toIntArray(add));
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.events.FriendSelectionListener#friendSelected(edu.tsinghua.lumaqq.events.FriendSelectionEvent)
*/
public void friendSelected(FriendSelectionEvent e) {
Iterator i = ((List)e.getSource()).iterator();
while(i.hasNext())
members.add(i.next());
viewer.refresh();
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.events.FriendSelectionListener#friendDeselected(edu.tsinghua.lumaqq.events.FriendSelectionEvent)
*/
public void friendDeselected(FriendSelectionEvent e) {
Iterator i = ((List)e.getSource()).iterator();
while(i.hasNext())
members.remove(i.next());
viewer.refresh();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -