Eclipse的Properties视图可以显示和编辑对象的属性。在SelectionListener被触发后,Properties视图会自动检测工作台选中的对象是否支持IPropertySource接口,被选中的对象可以直接实现IPropertySource接口或者通过注册适配器工厂IAdapterFactory的方式返回一个IPropertySource对象。
以下案例就是以第二种方法实现的。
一,实现IPropertySource接口
1.1 创建Viewer所需的对象
public interface INode {
public void setFile(File file);
public INode getParent();
public void setParent(INode parent);
public List<INode> getChildren();
public File getFile();
public boolean addChild(INode child);
public boolean remove(INode child);
}
1.2 该对象实现IPropertySource接口
public class NodeModel implements INode, IPropertySource{
......
@Override
public Object getEditableValue() {
return this;
}
private static final String FILE_NAME_ID="FILE_NAME_ID";
private static final String FILE_PATH_ID="FILE_PATH_ID";
private static TextPropertyDescriptor fileNamePropertyDescriptor = new TextPropertyDescriptor(FILE_NAME_ID, "File Name");
private static TextPropertyDescriptor filePathPropertyDescriptor = new TextPropertyDescriptor(FILE_PATH_ID, "File Path");
private static IPropertyDescriptor[] descriptors = {fileNamePropertyDescriptor, filePathPropertyDescriptor};
@Override
public IPropertyDescriptor[] getPropertyDescriptors() {
return descriptors;
}
@Override
public Object getPropertyValue(Object id) {
if(id.equals(FILE_NAME_ID)) {
return this.getFile().getName();
} else if(id.equals(FILE_PATH_ID)){
return this.getFile().getPath();
}
return null;
}
@Override
public boolean isPropertySet(Object id) {
return false;
}
@Override
public void resetPropertyValue(Object id) {
}
@Override
public void setPropertyValue(Object id, Object value) {
}
}
二,创建适配器工厂
2.1 在plugin.xml中添加扩展点
<extension
point="org.eclipse.core.runtime.adapters">
<factory
adaptableType="*.model.INode"
class="*.model.ui.NodeAdapterFactory">
<adapter
type="org.eclipse.ui.views.properties.IPropertySource">
</adapter>
</factory>
</extension>
2.2 实现IAdapterFactory
public class NodeAdapterFactory implements IAdapterFactory {
@SuppressWarnings("unchecked")
@Override
public <T> T getAdapter(Object adaptableObject, Class<T> adapterType) {
if((IPropertySource.class.isAssignableFrom(adapterType) ) && (adaptableObject instanceof INode)) {
return (T) new NodeModel((INode)adaptableObject);
}
return null;
}
@Override
public Class<?>[] getAdapterList() {
return new Class[] {IPropertySource.class};
}
}
三,设置Viewer为工作台选择器提供者
getSite().setSelectionProvider(viewer);