这几天趁热,集中整理一下前一段时间学习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 ”这里简单的说明一下,具体的还要再整理一个笔记;
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 "";
}
运行效果: