这里两天一直在学习eclipse的RCP plugin开发的使用技巧,想用eclipe的插件来实现我之前利用ibator改造的dao生成工具。
看了两天先把 extension的 view看得有点感觉了,这里我先把jface的 treeViewer这个控件说明一下,如何在eclipse的view里面显示一个树状结构的目录树。
<extension point="org.eclipse.ui.views"> <category name="Sample Category" id="test3plugin"> </category> <view category="test3plugin" class="test3plugin.ViewPartTest" icon="icons/alias.gif" id="test3plugin.view1" name="test3plugin.ViewPartTest" restorable="true"> </view> </extension>
先在plugin.xml文件中声明一个org.eclipse.ui.views的扩展,这个很简单没有什么好说的了。
然后是创建 test3plugin.ViewPartTest类:
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.ITreeViewerListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeExpansionEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;
public class ViewPartTest extends ViewPart {
public ViewPartTest() {
}
@Override
public void createPartControl(Composite parent) {
TreeViewer viewer = new TreeViewer(parent);
// Provide members of a compilation unit or class file
ITreeContentProvider contentProvider = new StandardJavaElementContentProvider(
true);
viewer.setContentProvider(contentProvider);
// There are more flags defined in class JavaElementLabelProvider
ILabelProvider labelProvider = new JavaElementLabelProvider(
JavaElementLabelProvider.SHOW_DEFAULT
| JavaElementLabelProvider.SHOW_QUALIFIED
| JavaElementLabelProvider.SHOW_ROOT);
viewer.setLabelProvider(labelProvider);
// Using the Java model as the viewers input present Java projects on
// the first level.
viewer.setInput(JavaCore.create(ResourcesPlugin.getWorkspace()
.getRoot()));
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
System.out.println(event.getSource().toString());
}
});
viewer.addTreeListener(new ITreeViewerListener() {
@Override
public void treeCollapsed(TreeExpansionEvent event) {
System.out.println("treeCollapsed:"
+ event.getElement().toString());
}
@Override
public void treeExpanded(TreeExpansionEvent event) {
System.out.println("treeExpanded:"
+ event.getElement().toString());
}
});
}
@Override
public void setFocus() {
}
这里最关键的是三个方法:
- setContentProvider
- setLabelProvider
- setInput
经过查看源代码之后,明白了这个三个方法的意思是这样的:
- setContentProvider 提供页面上树节点内容的提供内容,设置IContentProvider类型的对象
- setLabelProvider 因为在每个树节点上要显示有图片和现实文字,所以设置IBaseLabelProvider类型的对象
- setInput 设置目录树的根节点, 注意这个方法设置的root对象在应用目录显示树上是不现实的。
另外还有两个事件监听接口:
- addSelectionChangedListener 当鼠标在树节点上焦点移动之后就会触发这个方法
- addTreeListener 这个回调接口的方法是在鼠标双击了树的枝或者叶之后,打开或者关闭节点触发的
值得一提的是以上这几个方法都是用了策略模式来隔离变化。这样可以通过这套代码实现各种复杂的业务需求