📄 folderviewer.java
字号:
package net.sf.pim.mail.reader;import java.util.Arrays;import java.util.HashSet;import java.util.Map;import java.util.Set;import javax.mail.Folder;import javax.mail.Message;import javax.mail.MessagingException;import javax.mail.event.MessageCountEvent;import javax.mail.event.MessageCountListener;import jp.gr.java_conf.roadster.net.pop.POP3Message;import net.sf.pim.mail.MailPlugin;import net.sf.pim.mail.MailUtil;import net.sf.util.ConfigHelper;import net.sf.util.StringUtil;import org.eclipse.jface.viewers.IColorProvider;import org.eclipse.jface.viewers.ILazyContentProvider;import org.eclipse.jface.viewers.IStructuredContentProvider;import org.eclipse.jface.viewers.ITableLabelProvider;import org.eclipse.jface.viewers.LabelProvider;import org.eclipse.jface.viewers.StructuredSelection;import org.eclipse.jface.viewers.TableViewer;import org.eclipse.jface.viewers.Viewer;import org.eclipse.swt.SWT;import org.eclipse.swt.graphics.Color;import org.eclipse.swt.graphics.Image;import org.eclipse.swt.widgets.Composite;import org.eclipse.swt.widgets.Display;import org.eclipse.swt.widgets.Table;import org.eclipse.swt.widgets.TableColumn;import org.eclipse.ui.part.ViewPart;public class FolderViewer extends ViewPart { public static final String ID = "MyWork_mail.listview"; private TableViewer viewer; private Object[] messages; //邮箱内的邮件 private Folder folder; //邮箱 private MessageCountAdapter adapter; //监听器 private static Set<String> readSet=new HashSet<String>(); //已读邮件的标记 //邮件监听器 class MessageCountAdapter implements MessageCountListener { private MessageCountAdapter() { } public void messagesAdded(final MessageCountEvent arg0) { viewer.getTable().getDisplay().syncExec(new Runnable(){ public void run() { refreshFolder(false); }}); } public void messagesRemoved(MessageCountEvent arg0) { viewer.getTable().getDisplay().syncExec(new Runnable(){ public void run() { refreshFolder(true); }}); } } class ViewContentProvider implements ILazyContentProvider,IStructuredContentProvider { public void inputChanged(Viewer v, Object oldInput, Object newInput) { } public void dispose() { } public Object[] getElements(Object parent) { if (parent instanceof Message[]) { return (Message[])parent; } else return new Object[0]; } public void updateElement(int index) { viewer.replace(messages[index], index); } } class ViewLabelProvider extends LabelProvider implements ITableLabelProvider,IColorProvider { public String getColumnText(Object obj, int index) { if (obj instanceof Message) { try { Message message = (Message) obj; switch (index) { case 0: return ""; case 1: return getSimpleFrom(MailUtil.getAddress(message.getFrom())); case 2: return message.getSubject(); case 3: return MailUtil.getSentTime(message).substring(4); } } catch (MessagingException e) { e.printStackTrace(); } return ""; } else return ""; } public Image getColumnImage(Object obj, int index) { return getImage(obj); } public Color getBackground(Object element) { return null; } //只有收件箱显示未读 public Color getForeground(Object element) { if(element instanceof POP3Message){ POP3Message message = ((POP3Message)element); String key=message.getInternalFileName(); if(message.getFolder().getName().equals(MailPlugin.INBOX) && !readSet.contains(key)){ return Display.getCurrent().getSystemColor(SWT.COLOR_DARK_MAGENTA); } } return null; } } public void createPartControl(Composite parent) { //2007.2.9 改为lazyload viewer = new TableViewer(parent, SWT.SINGLE|SWT.FULL_SELECTION | SWT.H_SCROLL| SWT.V_SCROLL |SWT.VIRTUAL); //设置表头 Table table = viewer.getTable(); table.setHeaderVisible(true); table.setLinesVisible(true); String[] header=new String[]{"@","发件人","主题","接收时间"}; Map<String,String> headerSize=ConfigHelper.getHeaderSize(FolderViewer.class); for (int i = 0; i < header.length; i++) { TableColumn column = new TableColumn(table, SWT.NULL); column.setText(header[i]); column.setWidth(headerSize.get(header[i]) == null ? 60 : StringUtil.parseInt(headerSize.get(header[i]))); } viewer.setContentProvider(new ViewContentProvider()); viewer.setLabelProvider(new ViewLabelProvider()); try { showFolder(MailPlugin.getDefault().getStore().getFolder("INBOX")); this.getSite().setSelectionProvider(viewer); //初始不选中,等焦点 viewer.setSelection(new StructuredSelection()); } catch (Exception e) { e.printStackTrace(); } } //显示一个邮箱 public void showFolder(final Folder folder) { //清场,上一个邮箱 if(this.folder != null){ //相同邮箱不重复显示 if(this.folder.equals(folder)) return; try { this.folder.removeMessageCountListener(adapter); if(this.folder.isOpen()) this.folder.close(true); } catch (Exception e) { e.printStackTrace(); } } this.folder=folder; //收到新邮件时显示 adapter=new MessageCountAdapter(); folder.addMessageCountListener(adapter); refreshFolder(false); } //取所有邮件 private Object[] getMessages(Folder folder) { try { if (!folder.isOpen()) folder.open(Folder.READ_WRITE); Message[] messages = folder.getMessages(); return messages; } catch (MessagingException e) { e.printStackTrace(); } return new Object[0]; } /** * Passing the focus request to the viewer's control. */ public void setFocus() { viewer.getControl().setFocus(); //缺省选中(显示)第一封邮件 2007.01.16修订超过邮件1页时滚动置位的bug if(messages.length > 0 && viewer.getSelection().isEmpty()){ viewer.setSelection(new StructuredSelection(messages[0])); } } //刷新邮箱 private void refreshFolder(boolean delete) { //1.增加时选择项保持不变 //2.删除时选择索引保持不变 messages = getMessages(folder); //2007.01.21 缺省用时间倒序显示 Arrays.sort(messages,new MessageComparator("Date",false)); viewer.setItemCount(messages.length); viewer.getTable().clearAll(); if(delete){ int lastSelectIndex=viewer.getTable().getSelectionIndex(); if(lastSelectIndex == -1 && messages.length > 0 ) viewer.setSelection(new StructuredSelection(messages[messages.length-1])); else viewer.setSelection(viewer.getSelection()); }else{ if(messages.length >0) viewer.setSelection(new StructuredSelection(messages[0])); } //刷新标题 setPartName(MailPlugin.convertFolderName(folder.getName())+" 邮件"+messages.length+"封"); } //取当前显示的邮箱 public Folder getFolder() { return folder; } public TableViewer getViewer() { return viewer; } public static Set<String> getReadSet() { return readSet; } public static void setReadSet(Set<String> readSet) { FolderViewer.readSet = readSet; } //取发件人的简名,先取<,再截@,再判断首尾" private static String getSimpleFrom(String from){ if(StringUtil.isNull(from)) return ""; if(from.indexOf('<') != -1){ from=from.substring(0,from.indexOf('<')).trim(); } if(from.indexOf('@') != -1){ from=from.substring(0,from.indexOf('@')).trim(); } if(from.length() >0 && from.charAt(0) == '"') from=from.substring(1).trim(); if(from.length() >0 && from.charAt(from.length() -1) == '"') from=from.substring(0,from.length()-1).trim(); return from; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -