zoukankan      html  css  js  c++  java
  • FeaturedItemProviderAdapterFactory

    如果想在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没有得到刷新。

  • 相关阅读:
    第一个JAVA程序
    python小项目(python实现鉴黄)源码
    整蛊小病毒,自己拿来快乐
    JavaScript(这里主要侧重于 JavaScript HTML DOM)杂项
    图片与文本基础(html和css)
    CSS的基础学习
    Javascript中this作用域以及bind方法的重写
    斐波那契数列算法求解及速度
    javascript中的描述对象(Descriptor)获取和定义随笔
    vue-cli3生产环境和开发环境路径的替换
  • 原文地址:https://www.cnblogs.com/bjzhanghao/p/706033.html
Copyright © 2011-2022 走看看