这几天趁热,集中整理一下前一段时间学习TreeViewer情况,形成笔记;正好也好久没有更新我的个人Blog了,发上来充充门面。
说明:以后将现在所做的Eclipse插件项目简称作“新平台”。
新平台中要求,要把文件版本管理(如CVS、SVN等)的功能放进来,研究了一下,应该就是把“包资源管理器”的右键菜单中小组(Team)菜单加过来,这样不管什么版本管理工具都可以以插件的形式集成进来了。
最初,总是认为像使用Action一样,把Action直接加到 MenuManager 里就行了,可是不知道要加哪个Action,于是我到 www.eclipseworld.org (Eclipse中国)论坛上去发帖询问,可是回帖的并不多,也没有有效的方法,这里还要多谢douya和 danielzhan 给我的提示,小组菜单是扩展“ org.eclipse.ui.popupMenus ”而来的,于是又研究了一下,原来 popupMenus 又分成“ viewerContribution ”和“ objectContribution ”这里简单的说明一下,具体的还要再整理一个笔记;
小组菜单扩展了 popupMenus 扩展点,并是objectContribution形式,它的 objectClass 对应 org.eclipse.core.resources.IResource 接口的,也就是说在TreeViewer中节点类型是继承或实现 IResource 接口的对象,在右键菜单中就会有小组菜单。
ViewPart 中 createPartControl 代码如下;
public void createPartControl(Composite parent) { treeViewer = new TreeViewer(parent, SWT.SINGLE); treeViewer.setLabelProvider(new PersonListLabelProvider()); treeViewer.setContentProvider(new PersonTreeContentProvider()); treeViewer.setInput(ResourcesPlugin.getWorkspace().getRoot()); ResourcesPlugin.getWorkspace().addResourceChangeListener(new IResourceChangeListener() { public void resourceChanged(IResourceChangeEvent event) { final Control ctrl= treeViewer.getControl(); if (ctrl != null && !ctrl.isDisposed()) { ctrl.getDisplay().asyncExec(new Runnable() { public void run() { if (!ctrl.isDisposed()) { treeViewer.refresh(); } } }); } } }); MenuManager mgr = new MenuManager(); mgr.setRemoveAllWhenShown(true); mgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); } }); Menu menu = mgr.createContextMenu(treeViewer.getControl()); treeViewer.getControl().setMenu(menu); getSite().registerContextMenu(mgr, treeViewer); }
程序的第6行,在这里setInput时参数是 ResourcesPlugin.getWorkspace().getRoot() ,也就是工作空间的根;程序的第7~20行,设置监听,当工作空间中资源发生变化时通知TreeViewer刷新。
实现 ITreeContentProvider 的类的代码:
public Object[] getElements(Object parent) { return getChildren(parent); } public Object[] getChildren(Object parentElement) { try { if (parentElement instanceof IWorkspaceRoot) { return ((IWorkspaceRoot) parentElement).getProjects(); } else if (parentElement instanceof IProject) { return ((IProject) parentElement).members(); } else if (parentElement instanceof IFolder) { return ((IFolder) parentElement).members(); } else if (parentElement instanceof IFile) { return null; } } catch (CoreException e) { e.printStackTrace(); } return null; } public Object getParent(Object element) { if (element instanceof IFile) { return ((IFile) element).getParent(); } else if (element instanceof IFolder) { return ((IFolder) element).getParent(); } else if (element instanceof IProject) { return ((IProject) element).getParent(); } return null; } public boolean hasChildren(Object element) { try { return (element instanceof IContainer) && (((IContainer) element).members().length > 0); } catch (CoreException e) { return false; } }
继承 LabelProvider 的类代码:
public Image getImage(Object element) { return null; } public String getText(Object element) { if (element instanceof IWorkspaceRoot) { return ((IWorkspaceRoot) element).getName(); } else if (element instanceof IProject) { return ((IProject) element).getName(); } else if (element instanceof IFolder) { return ((IFolder) element).getName(); } else if (element instanceof IFile) { return ((IFile) element).getName(); } return ""; }
运行效果: