📄 infomanagerwindow.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;
import static edu.tsinghua.lumaqq.resource.Messages.*;
import java.lang.reflect.InvocationTargetException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import edu.tsinghua.lumaqq.models.Cluster;
import edu.tsinghua.lumaqq.models.ClusterType;
import edu.tsinghua.lumaqq.models.Group;
import edu.tsinghua.lumaqq.models.ModelRegistry;
import edu.tsinghua.lumaqq.models.User;
import edu.tsinghua.lumaqq.record.IKeyConstants;
import edu.tsinghua.lumaqq.record.RecordEntry;
import edu.tsinghua.lumaqq.record.RecordManager;
import edu.tsinghua.lumaqq.resource.Colors;
import edu.tsinghua.lumaqq.resource.Resources;
import edu.tsinghua.lumaqq.ui.listener.AroundBorderPaintListener;
import edu.tsinghua.lumaqq.widgets.rich.RichBox;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.custom.ViewForm;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.events.ShellListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Sash;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
/**
* 信息管理器
*
* @author luma
*/
public class InfoManagerWindow extends Window implements ShellListener {
private class TreeContentProvider implements ITreeContentProvider {
public Object[] getChildren(Object parentElement) {
if(parentElement instanceof Integer) {
Integer i = (Integer)parentElement;
switch(i) {
case 1:
return otherGroups.toArray();
case 2:
return clusters.toArray();
default:
return EMPTY;
}
} else if(parentElement instanceof Group) {
Group g = (Group)parentElement;
return g.users.toArray();
} else
return EMPTY;
}
public Object getParent(Object element) {
return null;
}
public boolean hasChildren(Object element) {
if(element instanceof Integer) {
Integer i = (Integer)element;
return i != 3;
} else if(element instanceof Cluster)
return false;
else if(element instanceof Group)
return true;
else
return false;
}
public Object[] getElements(Object inputElement) {
return root;
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
private class TreeLabelProvider extends LabelProvider {
@Override
public String getText(Object element) {
if(element instanceof Integer) {
Integer i = (Integer)element;
switch(i) {
case 1:
return info_groups;
case 2:
return info_cluster;
case 3:
return info_sys_msg;
default:
return "";
}
} else if(element instanceof Group) {
Group g = (Group)element;
return g.name + '(' + g.users.size() + ')';
} else if(element instanceof Cluster) {
Cluster c = (Cluster)element;
return "" + c.externalId + '(' + c.name + ')';
} else if(element instanceof User) {
User u = (User)element;
return "" + u.qq + '(' + u.displayName + ')';
} else
return "";
}
@Override
public Image getImage(Object element) {
if(element instanceof Integer) {
Integer i = (Integer)element;
switch(i) {
case 1:
return res.getSmallHead(main.getMyModel().headId);
case 2:
return res.getImage(Resources.icoFolder);
case 3:
return res.getImage(Resources.icoSysMsg);
default:
return null;
}
} else if(element instanceof Group)
return res.getImage(Resources.icoFolder);
else if(element instanceof Cluster)
return res.getSmallClusterHead(((Cluster)element).headId);
else if(element instanceof User)
return res.getSmallHead(((User)element).headId);
else
return null;
}
}
private class TreeSorter extends ViewerSorter {
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
if(e1 instanceof Integer && e2 instanceof Integer) {
Integer i1 = (Integer)e1;
Integer i2 = (Integer)e2;
return i1 - i2;
} else if(e1 instanceof Cluster && e2 instanceof Cluster) {
Cluster c1 = (Cluster)e1;
Cluster c2 = (Cluster)e2;
return c1.externalId - c2.externalId;
} else if(e1 instanceof User && e2 instanceof User) {
User u1 = (User)e1;
User u2 = (User)e2;
return u1.qq - u2.qq;
} else
return 0;
}
}
private class RecordContentProvider implements IStructuredContentProvider {
public Object[] getElements(Object inputElement) {
int pageSize = main.getRecordManager().getPageSize();
return records.subList(pageNum * pageSize, Math.min(pageNum * pageSize + pageSize, records.size())).toArray();
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
private class RecordLabelProvider extends LabelProvider implements ITableLabelProvider {
public Image getColumnImage(Object element, int columnIndex) {
RecordEntry entry = (RecordEntry)element;
if(columnIndex == 0) {
switch(entry.type) {
case IKeyConstants.SYSTEM:
return res.getImage(Resources.icoSysMsg);
case IKeyConstants.NORMAL:
case IKeyConstants.CLUSTER:
User u = ModelRegistry.getUser(entry.sender);
return (u == null) ? res.getSmallHead(Resources.QQ_2005_FACE_MAX_INDEX) : res.getSmallHead(u.headId);
default:
return null;
}
} else
return null;
}
public String getColumnText(Object element, int columnIndex) {
RecordEntry entry = (RecordEntry)element;
switch(columnIndex) {
case 0:
switch(entry.type) {
case IKeyConstants.SYSTEM:
return "10000";
case IKeyConstants.NORMAL:
case IKeyConstants.CLUSTER:
User u = ModelRegistry.getUser(entry.sender);
return (u == null) ? String.valueOf(entry.sender) : u.displayName;
default:
return "";
}
case 1:
date.setTime(entry.time);
return dateFormat.format(date);
case 2:
date.setTime(entry.time);
return timeFormat.format(date);
case 3:
return entry.message;
default:
return "";
}
}
}
private MainShell main;
private Resources res;
private boolean active;
private static final int SEARCH_RECORD = 0;
@SuppressWarnings("unused")
private static final int SEARCH_FRIEND = 1;
private static final int SCOPE_ALL = 0;
@SuppressWarnings("unused")
private int searchMode;
private int scope;
private int pageNum;
private int pageCount;
private String keyword;
private ViewForm vfRecord;
private List<RecordEntry> records;
private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
private static final DateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
private static final Date date = new Date();
private TableViewer recordViewer;
private List<Cluster> clusters;
private List<Group> otherGroups;
private List scopes;
private static final Integer[] root = new Integer[] {
1, 2, 3
};
private static final Object[] EMPTY = new Object[0];
private TreeViewer treeViewer;
private CCombo comboScope;
private RichBox box;
private Label lblPage;
private ToolItem tiExport;
private ToolItem tiDelete;
private Label lblDate;
private Label lblTime;
private Label lblSender;
private Label lblReceiver;
private ToolItem tiSearch;
private ToolItem tiFirst;
private ToolItem tiPrev;
private ToolItem tiNext;
private ToolItem tiLast;
public InfoManagerWindow(MainShell main) {
super(main.getShell());
this.main = main;
res = Resources.getInstance();
initializeVariables();
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(info_title);
newShell.setImage(res.getImage(Resources.icoMessageManage));
}
@Override
protected Control createContents(Composite parent) {
Composite control = (Composite)super.createContents(parent);
control.setLayout(new GridLayout());
control.setLayoutData(new GridData(GridData.FILL_BOTH));
// 工具条
final ToolBar tb = new ToolBar(control, SWT.FLAT | SWT.RIGHT);
tiExport = new ToolItem(tb, SWT.PUSH);
tiExport.setImage(res.getImage(Resources.icoExport));
tiExport.setText(button_export);
tiExport.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
onExport();
}
});
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -