Pregunta

Estoy confundir sobre IAdaptable y clases relacionadas. ¿Qué clase es el adaptador, el adaptado, el tipo adaptable?

[Contexto]

Tengo un menú contextual para las entradas de un visor de tablas / árbol. Ciertas acciones en el menú de contexto no deben ser visibles, dependiendo del estado del objeto respectivo en el visor (es decir, valor de atributo de una fila en el visor de la tabla).

puedo lograr esto con una configuración de este tipo en 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>"

Sin embargo, esto sólo funciona si la clase de objeto implementa org.eclipse.ui.IActionFilter.

[Problema]

Mi clase de objeto no puede implementar IActionFilter, no quiero cambiar su interfaz. Por lo tanto, tengo que evitar que el uso del mecanismo de IAdaptable.

La lectura de la documentación de Eclipse me dejó desconcertado con todas términos (adaptador, el adaptado, el tipo adaptable) y todavía estoy confundido acerca de cómo ir sobre mi problema.

La clase de objeto (contempladas en el en la configuración anteriormente) debe permanecer intacta.

Mi enfoque era la siguiente.

<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>

MyFactory es la siguiente:

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;
  }
}

¿Qué hay de malo en esto? ¿Dónde he perdido algo?

¿Fue útil?

Solución

Resulta que todo, bueno, casi todo, era correcta. Había mezclado simplemente hasta interfaz y la implementación de object_class_of_viewer_entry en el plugin.xml.

Dos artículos que ayudaron: http://www.eclipsezone.com/articles / que-es-iadaptable / y http://wiki.eclipse.org/FAQ_How_do_I_use_IAdaptable_and_IAdapterFactory% 3F

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top