代码之家  ›  专栏  ›  技术社区  ›  Marcel Stör

对IAdaptable与IActionFilters混淆

  •  0
  • Marcel Stör  · 技术社区  · 14 年前

    我对IAdaptable和相关类感到困惑。适配器、适配器和适配类型是什么类?

    [语境]

    我有一个用于表/树查看器条目的上下文菜单。根据查看器中各个对象的状态(即表查看器中某行的属性值),上下文菜单中的某些操作不得可见。

    我可以通过plugin.xml中的配置来实现这一点:

    <extension
             point="org.eclipse.ui.popupMenus">
          <objectContribution
                adaptable="false"
                id="<some_id>"
                objectClass="<object_class_of_viewer_entry>">
                <visibility>
                   <objectState name="buildable" value="true"/>
                 </visibility>
             <action
                   class="<my_action_class>"
    

    但是,这仅在对象类实现org.eclipse.ui.iactionfilter时有效。

    [问题]

    我的对象类无法实现IActionFilter,我不想更改它的接口。因此,我需要使用IAdaptable机制来解决这个问题。

    阅读Eclipse文档让我对术语(适配器、适配器、适应性类型)感到困惑,我仍然对如何解决我的问题感到困惑。

    对象类(在上述配置中由引用)必须保持不变。

    我的方法如下。

    <extension
             point="org.eclipse.core.runtime.adapters">
          <factory
                adaptableType="<object_class_of_viewer_entry>"
                class="MyFactory">
             <adapter
                   type="org.eclipse.ui.IActionFilter">
             </adapter>
          </factory>
       </extension>
    

    我的工厂是这样的:

    public class MyFactory implements IAdapterFactory {
      private static final Class[] types = {
        <object_class_of_viewer_entry>.class,
      };
    
      @Override
      public Object getAdapter(Object adaptableObject, Class adapterType) {
        return new <class_that_implements_IActionFilter>((<object_class_of_viewer_entry>) adaptableObject);
      }
    
      @Override
      public Class[] getAdapterList() {
        return types;
      }
    }
    

    怎么了?我错过什么了?

    1 回复  |  直到 14 年前
        1
  •  0
  •   Marcel Stör    14 年前

    结果一切都是正确的。我只是在plugin.xml中混合了接口和对象的实现。

    两篇有帮助的文章: http://www.eclipsezone.com/articles/what-is-iadaptable/ http://wiki.eclipse.org/FAQ_How_do_I_use_IAdaptable_and_IAdapterFactory%3F