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

📄 folderviewer.java

📁 mywork是rcp开发的很好的例子
💻 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 jp.gr.java_conf.roadster.net.pop.POP3Message;import net.sf.component.config.ConfigHelper;import net.sf.pim.mail.MailPlugin;import net.sf.pim.mail.MailUtil;import net.sf.util.StringUtil;import org.eclipse.jface.action.Action;import org.eclipse.jface.action.MenuManager;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.Menu;import org.eclipse.swt.widgets.Table;import org.eclipse.swt.widgets.TableColumn;import org.eclipse.swt.widgets.TableItem;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 MessageCount adapter;	//监听器		private static Set<String> readSet=new HashSet<String>();	//已读邮件的标记		private String COLOR_DARK_MAGENTA="color";		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) {			//优化邮件显示,以回避isbusy 20070922 levin			//且同一邮件未被clear时不刷新,用subject来判断;判断是否已读 20070926 levin			//条件为:同一邮件 且 未被clear 且 不需要清除未读			try {				POP3Message message = (POP3Message)messages[index];				TableItem item = viewer.getTable().getItem(index);				//收件箱判断hasRead,不需要清除未读 即 不是收件箱 或者 (已读且无颜色指示 或者 未读且有颜色指示)				boolean hasRead=getReadSet().contains(message.getInternalFileName());				boolean noColor=!COLOR_DARK_MAGENTA.equals(String.valueOf(item.getForeground(2))); 				if(message.equals(viewer.getElementAt(index)) && message.getSubject().equals(item.getText(2))						&& (! message.getFolder().getName().equals(MailPlugin.INBOX) || (hasRead && noColor) || (!hasRead && !noColor)))					return;			} catch (Exception e) {				e.printStackTrace();			}			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 MailUtil.getSubject(message);					case 3: //发送时间						return MailUtil.getSentTime(message).substring(4);					case 4: //帐号						return MailPlugin.getDefault().getStore().getSimpleMailAccount(message);					}				} 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) {		//将mailplugin的内容移过来,使mailplugin的激活轻量化 2008.1.9		MailPlugin.getDefault().loadStoreAndCache();		//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.getMapProperty(FolderViewer.class.getSimpleName().toLowerCase()+".headersize");        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();		}		//增加右键		hookRightMenu();		COLOR_DARK_MAGENTA=Display.getCurrent().getSystemColor(SWT.COLOR_DARK_MAGENTA).toString();	}		private void hookRightMenu() {        MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$        menuMgr.add(new Action(){			public String getText() {				return "标记为已读";			}			public boolean isEnabled() {				return folder.getName().equals(MailPlugin.INBOX);			}			public void run() {				if(viewer.getSelection().isEmpty())					return ;				POP3Message message=(POP3Message) ((StructuredSelection)viewer.getSelection()).getFirstElement();				String messageKey=message.getInternalFileName();				if(!FolderViewer.getReadSet().contains(messageKey)){					FolderViewer.getReadSet().add(messageKey);				}				viewer.refresh(message, true);			}        });        menuMgr.add(new Action(){			public String getText() {				return "标记为未读";			}			public boolean isEnabled() {				return folder.getName().equals(MailPlugin.INBOX);			}			public void run() {				if(viewer.getSelection().isEmpty())					return ;				POP3Message message=(POP3Message) ((StructuredSelection)viewer.getSelection()).getFirstElement();				String messageKey=message.getInternalFileName();				if(FolderViewer.getReadSet().contains(messageKey)){					FolderViewer.getReadSet().remove(messageKey);				}				viewer.refresh(message, true);			}        });        menuMgr.add(new Action(){			public String getText() {				return "标记附近10封邮件为已读";			}			public boolean isEnabled() {				return folder.getName().equals(MailPlugin.INBOX);			}			public void run() {				if(viewer.getSelection().isEmpty())					return ;				int selectIndex=viewer.getTable().getSelectionIndex();				for(int i=Math.max(0, selectIndex-10);i<Math.min(selectIndex+10, messages.length);i++){					POP3Message message=(POP3Message) messages[i];					String messageKey=message.getInternalFileName();					if(!FolderViewer.getReadSet().contains(messageKey)){						FolderViewer.getReadSet().add(messageKey);					}				}				viewer.refresh();			}        });                Menu menu = menuMgr.createContextMenu(viewer.getControl());        viewer.getControl().setMenu(menu);		}	//显示一个邮箱	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 MessageCount(this);		folder.addMessageCountListener(adapter);		refreshFolder(false);	}		//取所有邮件	private Object[] getMessages(Folder folder) {		try {			if (!folder.isOpen())				folder.open(Folder.READ_WRITE);			else{				folder.close(true);				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]));		}	}		//刷新邮箱	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 "";		//有可能字符串为<abc@def.com>,而不是 test<abc@def.com>,此时不能这么截取		if(from.indexOf('<') != -1 && from.charAt(0) != '<'){			from=from.substring(0,from.indexOf('<')).trim();		}		if( from.length() > 1 && from.charAt(0) == '<'){			from =from.substring(1);		}		if(from.indexOf('@') != -1){			from=from.substring(0,from.indexOf('@')).trim();		}		from = MailUtil.trimQuota(from);				return from;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -