TreeViewer阶段性学习笔记2

阅读更多

 

    这几天趁热,集中整理一下前一段时间学习TreeViewer情况,形成笔记;正好也好久没有更新我的个人Blog了,发上来充充门面。

    说明:以后将现在所做的Eclipse插件项目简称作“新平台”。

给TreeViewer中添加popupMenus

    新平台中要求,要把文件版本管理(如CVS、SVN等)的功能放进来,研究了一下,应该就是把“包资源管理器”的右键菜单中小组(Team)菜单加过来,这样不管什么版本管理工具都可以以插件的形式集成进来了。

    最初,总是认为像使用Action一样,把Action直接加到 MenuManager 里就行了,可是不知道要加哪个Action,于是我到 www.eclipseworld.org (Eclipse中国)论坛上去发帖询问,可是回帖的并不多,也没有有效的方法,这里还要多谢douya和 danielzhan 给我的提示,小组菜单是扩展“ org.eclipse.ui.popupMenus 而来的,于是又研究了一下,原来 popupMenus 又分成“ viewerContribution 和“ objectContribution 这里简单的说明一下,具体的还要再整理一个笔记;

1、viewerContribution,也就是通过视图的id。这样只有视图id和给定的id一致的时候,它的弹出菜单才会增加我们定义的菜单项。
2、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 "";
	}	
 

   运行效果:

  • 大小: 8.4 KB
  • 查看图片附件

你可能感兴趣的:(Eclipse,SVN,CVS,项目管理,UI)