如果想在viewer里过滤掉一些不需要的元素,除了直接修改XXXItemProvider(因为程序的其他地方也会用到这个类,修改它可能会带来问题),另一个办法是通过覆盖XXXItemProviderAdapterFactory,以使用自己继承自XXXItemProvider的ItemProvider,下面的例子是只显示一种类型的child:
/** * Adapter factory that only have one kind of child displayed * @author zhanghao * */ class FeaturedItemProviderAdapterFactory extends BMItemProviderAdapterFactory{ EStructuralFeature feature; /** * @param feature */ public FeaturedItemProviderAdapterFactory(EStructuralFeature feature) { super(); this.feature = feature; } @Override public Adapter createBusinessModelAdapter() { if (businessModelItemProvider == null) { businessModelItemProvider = new FeaturedBusinessModelItemProvider(this, feature); } return businessModelItemProvider; } class FeaturedBusinessModelItemProvider extends BusinessModelItemProvider{ EStructuralFeature feature; /** * @param adapterFactory */ public FeaturedBusinessModelItemProvider(AdapterFactory adapterFactory, EStructuralFeature reference) { super(adapterFactory); this.feature=reference; } @Override public Collection getChildrenFeatures(Object object) { Collection collection = super.getChildrenFeatures(object); for (Iterator iterator = collection.iterator(); iterator.hasNext();) { EStructuralFeature feature = (EStructuralFeature) iterator.next(); if(this.feature != feature) iterator.remove(); } return childrenFeatures; } } }
使用的时候一般还是要用ComposedAdapterFactory:
List list = new ArrayList(); list.add(new ResourceItemProviderAdapterFactory()); list.add(new FeaturedItemProviderAdapterFactory(BMPackage.Literals.BUSINESS_MODEL__ENTITIES));//提供一个feature作为参数 list.add(new ReflectiveItemProviderAdapterFactory()); ComposedAdapterFactory factory=new ComposedAdapterFactory(list); entityViewer.setContentProvider(new AdapterFactoryContentProvider(factory));
注:另一个方法是:
viewer.setInput(new ItemProvider(model.getXXXChildren()));
但这样一些notification会得不到响应,例如新增一个XXX元素后,viewer没有得到刷新。
本文转自博客园八进制的博客,原文链接:FeaturedItemProviderAdapterFactory,如需转载请自行联系原博主。